<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Shocking &#8211; Forrester Produces Shody Work</title>
	<atom:link href="http://pathfindersoftware.com/2006/03/shocking_forres/feed/" rel="self" type="application/rss+xml" />
	<link>http://pathfindersoftware.com/2006/03/shocking_forres/</link>
	<description>The Fastest Way to Launch Successful Software</description>
	<lastBuildDate>Thu, 19 Jan 2012 16:36:03 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
	<item>
		<title>By: Adrian Walker</title>
		<link>http://pathfindersoftware.com/2006/03/shocking_forres/#comment-5064</link>
		<dc:creator>Adrian Walker</dc:creator>
		<pubDate>Sat, 22 Apr 2006 19:19:37 +0000</pubDate>
		<guid isPermaLink="false">http://www.pathf.com/blogs/2006/03/shocking_forres/#comment-5064</guid>
		<description>&lt;p&gt;Actually, there&#039;s an interesting wrinkle on hybrid rule engines.&lt;/p&gt;

&lt;p&gt;In the Internet Business Logic system, the engine switches automatically between back- and forward-chaining.  It typically does this several times to get a particular result.&lt;/p&gt;

&lt;p&gt;The outcome is that rules take on a more declarative meaning than if you wanted to read them as one-way only.&lt;/p&gt;

&lt;p&gt;The system that does this is online at reengineeringllc.com, and shared use is free.&lt;/p&gt;

&lt;p&gt;Thanks in advance for coments.&lt;/p&gt;</description>
		<content:encoded><![CDATA[<p>Actually, there&#8217;s an interesting wrinkle on hybrid rule engines.</p>
<p>In the Internet Business Logic system, the engine switches automatically between back- and forward-chaining.  It typically does this several times to get a particular result.</p>
<p>The outcome is that rules take on a more declarative meaning than if you wanted to read them as one-way only.</p>
<p>The system that does this is online at reengineeringllc.com, and shared use is free.</p>
<p>Thanks in advance for coments.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Peter Lin</title>
		<link>http://pathfindersoftware.com/2006/03/shocking_forres/#comment-5063</link>
		<dc:creator>Peter Lin</dc:creator>
		<pubDate>Fri, 31 Mar 2006 14:30:48 +0000</pubDate>
		<guid isPermaLink="false">http://www.pathf.com/blogs/2006/03/shocking_forres/#comment-5063</guid>
		<description>&lt;p&gt;I&#039;ve been thinking about your statement &quot;From my conversations with the InRule guys, it seems that InRule is a hybrid that started out as decision table based but has started to incorporate RETE&quot; the last few days and thought I&#039;d share some random rants.&lt;/p&gt;

&lt;p&gt;Before I jump into the details, I&#039;d like make a disclaimer. I have no clue about the design or implement of InRule engine, pretty much this comment is 100% guess work.&lt;/p&gt;

&lt;p&gt;Looking at the history of constraint engines, and rule engines, there&#039;s a couple of different ways to implement a decision table driven rule engine. The easiest technique is to compile the table into 1 rule per row and evaluate the rules sequentially. Doing that generally is rather slow and far from optimal. Many decision table driven engines I am aware of prioritize the rules by inspecting the conditions. Depending on the rules, a decision table engine might place the most restrictive rules at the front. Another approach is to sequence the rules based on &quot;specificity&quot; of the rules. For relatively static use cases, one can also use static analysis to flatten the evaluation and aggressively hash the conditions.&lt;/p&gt;

&lt;p&gt;The question I ask myself is this. &quot;if I have a decision table driven engine, how can I migrate over to RETE?&quot;&lt;/p&gt;

&lt;p&gt;The first step is to use RETE to compile the rules and identify common conditions and share them. In other words, if I have 2 rules&lt;br /&gt;
Rule1&lt;br /&gt;
if account == &quot;123&quot;&lt;br /&gt;
then give discount&lt;/p&gt;

&lt;p&gt;Rule2&lt;br /&gt;
if account == &quot;123&quot;&lt;br /&gt;
then restrict discount to 10%&lt;/p&gt;

&lt;p&gt;The first condition of both rules are common, so it doesn&#039;t make sense to re-evaluate it for multiple rules. Now, one can add a memory, such that the engine does something like &lt;br /&gt;
if object hasn&#039;t been evaluated&lt;br /&gt;
then evaluate&lt;br /&gt;
else go to next condition&lt;/p&gt;

&lt;p&gt;So in that sense, the engine is borrowing ideas from RETE, but using this approach, the engine will not scale like RETE or come close. As the dataset increases or ruleset grows to thousands or even tens of thousands, evaluation time will grow rapidly. I&#039;ve seen systems built this way and they run into scalability issues very quickly.&lt;/p&gt;

&lt;p&gt;Now say I&#039;m not satisfied with just adding memory to common conditions and decide that rather than iterating over the rules, I want to evaluate based on the objects. This is how RETE works. When an object enters the rule engine, it enters the objectTypeNode for that class and propogates through the network. At this point, the engine looks nothing like a sequential approach. It&#039;s actually quite simple to compile a decision table into RETE rules. Drools3 provides support for that. Not many people are aware of this, but back in the 90&#039;s some people embedded CLIPS inside MS Excel. I forget who did that, but it has been done several times over the last 15 years.&lt;/p&gt;

&lt;p&gt;Corticon likewise uses a excel approach and compiles the rules to backward chaining network. To call a rule engine &quot;hybrid&quot; should be used with caution. For example JRules powers their sequential evaluation approach using a hybrid approach. In the case of JRules, their engine provides the ability to run in forward chaining or sequential. I don&#039;t know the exact design of how they achieve this, but I have a decent guess on how it can be done easily. I blogged about it a few weeks back.&lt;/p&gt;</description>
		<content:encoded><![CDATA[<p>I&#8217;ve been thinking about your statement &#8220;From my conversations with the InRule guys, it seems that InRule is a hybrid that started out as decision table based but has started to incorporate RETE&#8221; the last few days and thought I&#8217;d share some random rants.</p>
<p>Before I jump into the details, I&#8217;d like make a disclaimer. I have no clue about the design or implement of InRule engine, pretty much this comment is 100% guess work.</p>
<p>Looking at the history of constraint engines, and rule engines, there&#8217;s a couple of different ways to implement a decision table driven rule engine. The easiest technique is to compile the table into 1 rule per row and evaluate the rules sequentially. Doing that generally is rather slow and far from optimal. Many decision table driven engines I am aware of prioritize the rules by inspecting the conditions. Depending on the rules, a decision table engine might place the most restrictive rules at the front. Another approach is to sequence the rules based on &#8220;specificity&#8221; of the rules. For relatively static use cases, one can also use static analysis to flatten the evaluation and aggressively hash the conditions.</p>
<p>The question I ask myself is this. &#8220;if I have a decision table driven engine, how can I migrate over to RETE?&#8221;</p>
<p>The first step is to use RETE to compile the rules and identify common conditions and share them. In other words, if I have 2 rules<br />
Rule1<br />
if account == &#8220;123&#8243;<br />
then give discount</p>
<p>Rule2<br />
if account == &#8220;123&#8243;<br />
then restrict discount to 10%</p>
<p>The first condition of both rules are common, so it doesn&#8217;t make sense to re-evaluate it for multiple rules. Now, one can add a memory, such that the engine does something like <br />
if object hasn&#8217;t been evaluated<br />
then evaluate<br />
else go to next condition</p>
<p>So in that sense, the engine is borrowing ideas from RETE, but using this approach, the engine will not scale like RETE or come close. As the dataset increases or ruleset grows to thousands or even tens of thousands, evaluation time will grow rapidly. I&#8217;ve seen systems built this way and they run into scalability issues very quickly.</p>
<p>Now say I&#8217;m not satisfied with just adding memory to common conditions and decide that rather than iterating over the rules, I want to evaluate based on the objects. This is how RETE works. When an object enters the rule engine, it enters the objectTypeNode for that class and propogates through the network. At this point, the engine looks nothing like a sequential approach. It&#8217;s actually quite simple to compile a decision table into RETE rules. Drools3 provides support for that. Not many people are aware of this, but back in the 90&#8242;s some people embedded CLIPS inside MS Excel. I forget who did that, but it has been done several times over the last 15 years.</p>
<p>Corticon likewise uses a excel approach and compiles the rules to backward chaining network. To call a rule engine &#8220;hybrid&#8221; should be used with caution. For example JRules powers their sequential evaluation approach using a hybrid approach. In the case of JRules, their engine provides the ability to run in forward chaining or sequential. I don&#8217;t know the exact design of how they achieve this, but I have a decent guess on how it can be done easily. I blogged about it a few weeks back.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Peter Lin</title>
		<link>http://pathfindersoftware.com/2006/03/shocking_forres/#comment-5062</link>
		<dc:creator>Peter Lin</dc:creator>
		<pubDate>Wed, 29 Mar 2006 22:19:09 +0000</pubDate>
		<guid isPermaLink="false">http://www.pathf.com/blogs/2006/03/shocking_forres/#comment-5062</guid>
		<description>&lt;p&gt;Thanks for posting a comment on my rant about Forrester. For worse case complexity, Manners benchmark with several hundred guests should give you a pretty good idea. There&#039;s a lot of debate about the value of manners benchmark, but it is still one of the best tests for measuring worse case performance.&lt;/p&gt;

&lt;p&gt;The RETE-UL paper by Doorenbos provides quite a bit of data for machine learning cases. There&#039;s also dozens of paper on ACM-Queue Portal on RETE, TREAT, and LEAPS.&lt;/p&gt;

&lt;p&gt;In practice, a rule powered application should avoid cross-product pattern and use it when the case clearly calls for it.&lt;/p&gt;

&lt;p&gt;In terms of &quot;adding RETE&quot; to a decision table/decision tree engine, it&#039;s not really feasible. One could add memory to a decision table engine, but that is far from being RETE. I have plenty of entries in my blog that explain at the lowest level what RETE means and different approaches for implementing the algorithm.&lt;/p&gt;

&lt;p&gt;The RETE-UL paper also provides detailed description and explanation of why RETE works so well and where it totally fails. The RETE-UL paper is very good and much better than my random rants.&lt;/p&gt;

&lt;p&gt;peter lin&lt;/p&gt;</description>
		<content:encoded><![CDATA[<p>Thanks for posting a comment on my rant about Forrester. For worse case complexity, Manners benchmark with several hundred guests should give you a pretty good idea. There&#8217;s a lot of debate about the value of manners benchmark, but it is still one of the best tests for measuring worse case performance.</p>
<p>The RETE-UL paper by Doorenbos provides quite a bit of data for machine learning cases. There&#8217;s also dozens of paper on ACM-Queue Portal on RETE, TREAT, and LEAPS.</p>
<p>In practice, a rule powered application should avoid cross-product pattern and use it when the case clearly calls for it.</p>
<p>In terms of &#8220;adding RETE&#8221; to a decision table/decision tree engine, it&#8217;s not really feasible. One could add memory to a decision table engine, but that is far from being RETE. I have plenty of entries in my blog that explain at the lowest level what RETE means and different approaches for implementing the algorithm.</p>
<p>The RETE-UL paper also provides detailed description and explanation of why RETE works so well and where it totally fails. The RETE-UL paper is very good and much better than my random rants.</p>
<p>peter lin</p>
]]></content:encoded>
	</item>
</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic (User agent is rejected)
Page Caching using memcached (User agent is rejected)

Served from: pathfindersoftware.com @ 2012-02-09 20:42:11 -->
