Thanks.<br><br>Jai <br><br><div class="gmail_quote">On Feb 6, 2008 5:29 AM, Edson Tirelli <<a href="mailto:tirelli@post.com">tirelli@post.com</a>> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br> The answer is not simple. :)<br> All the alpha constraints are evaluated at fact assertion time, does not matter if they are early or late in the pattern order. Although, alpha constraints are usually quite cheap, since they are constraints that do not depend on other facts. Example:<br>
<br>Person( name == 'bob' )<br><br> "name == 'bob'" is a literal constraint and do not depend on any other pattern (so it is an alpha constraint) and will be evaluated at assert time, does not matter the order in which patterns are written down.<br>
Beta constraints are constraints that depend on previous patterns and will only be evaluated when previous patterns are matched. Example:<br><br>when<br> Person( $likes : likes ) <br> Cheese( type == $likes )<br>then<br>
end<br> <br> It is obvious in the previous example that "type == $likes" depends on the value of $likes that is a variable bound in a previous pattern (so it is a Beta constraint). It will only be evaluated if ALL previous patterns match.<br>
"from" CE is a special case of beta "node", that is only evaluated when all previous patterns match.<div><div></div><div class="Wj3C7c"><br><br> []s<br> Edson<br><div><span class="gmail_quote">2008/2/6, Anstis, Michael (M.) <<a href="mailto:manstis1@ford.com" target="_blank">manstis1@ford.com</a>>:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2">Great news!</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2"></font></span> </div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2">I</font></span><span><font color="#0000ff" face="Arial" size="2">s this specific to the use of "from" whereas
another rule like:-</font></span></div><span>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2"></font></span> </div><font color="#0000ff" face="Arial" size="2"></font>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">rule
"avoid expense"</font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"> <font color="#0000ff" size="2">when</font></font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"> <font color="#0000ff" size="2">ControlFact( phase == "do expensive call"
)</font></font></span></div></span>
<div dir="ltr" align="left"><span><font face="Courier New"> <font color="#0000ff" size="2">AnotherFact( <span>someExpensiveTimeConstantFunctionCall == someValue
</span>)</font></font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"> <font color="#0000ff" size="2">then</font></font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"> <font color="#0000ff" size="2">// Do something</font></font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"> <font color="#0000ff" size="2">end</font></font></span></div>
<div> </div>
<div><span></span><font face="Arial"><font color="#0000ff"><font size="2">C<span>ould not have the LHS
not evaluated or (to avoid a double negative), would always have the LHS fully
evaluated ;-)</span></font></font></font></div>
<blockquote style="margin-right: 0px;">
<div dir="ltr" align="left" lang="en-us">
<hr>
<font face="Tahoma" size="2"><b>From:</b> <a href="mailto:rules-users-bounces@lists.jboss.org" target="_blank">rules-users-bounces@lists.jboss.org</a>
[mailto:<a href="mailto:rules-users-bounces@lists.jboss.org" target="_blank">rules-users-bounces@lists.jboss.org</a>] <b>On Behalf Of </b>Edson
Tirelli<br><b>Sent:</b> 06 February 2008 12:29</font><div><span><font face="Tahoma" size="2"><br><b>To:</b> Rules Users
List<br><b>Subject:</b> Re: [rules-users] Grouping rules<br></font></span></div><br></div><div><span>
<div></div><font color="#0000ff" face="Arial" size="2"></font><font color="#0000ff" face="Arial" size="2"></font><br> Yes, it is possible to prevent
the evaluation of part of the LHS patterns by the use of previous constraints
and/or the introduction of control facts.<br><br> For
instance:<br><br>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">rule "avoid expense"</font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New">
<font color="#0000ff" size="2">when</font></font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"> <font color="#0000ff" size="2">ControlFact( phase == "do expensive call"
)</font></font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"> <font color="#0000ff" size="2">AnotherFact( ) from
someExpensiveServiceCall</font></font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New">
<font color="#0000ff" size="2">then</font></font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"> <font color="#0000ff" size="2">// Do something</font></font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New">
<font color="#0000ff" size="2">end</font></font></span></div><span></span><br> In
the above example, the "someExpensiveServiceCall" will only be executed when
the previous patterns are matched, i.e., when phase attribute of the
ControlFact has the value "do expensive call".<br><br>
[]s<br> Edson<br><br>
<div><span class="gmail_quote">2008/2/6, Anstis, Michael (M.) <<a href="mailto:manstis1@ford.com" target="_blank">manstis1@ford.com</a>>:</span>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2">I'm not
sure as LHS's are evaluated when facts are inserted not when fireAllRules
(or execute) is called.</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2"></font></span> </div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2">You can
prevent the RHS from activating by using (for lack of a better name)
"flag facts" (but this doesn't solve your problem); for
example:-</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2"></font></span> </div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">rule "avoid expense"</font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New">
<font color="#0000ff" size="2">when</font></font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"> <font color="#0000ff" size="2">not exists Flag()</font></font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"> <font color="#0000ff" size="2">AnotherFact( ) from
someExpensiveServiceCall</font></font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New">
<font color="#0000ff" size="2">then</font></font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"> <font color="#0000ff" size="2">// Do something</font></font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New">
<font color="#0000ff" size="2">end</font></font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2"></font></span> </div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2">Don't
forget though that if you share LHS patterns across multiple rules they will
share the same nodes in the RETE network, so although you might be aware
that the expensive calls are not required for some rules they might be
required for other rules and hence you'll need to perform the expensive call
when the facts are inserted in order for the other rules to activate.
Perhaps if you better describe your use-case there might be a better
solution.</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2"></font></span> </div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2">With
kind regards,</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2"></font></span> </div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2">Mike</font></span></div><br>
<blockquote style="margin-right: 0px;">
<div dir="ltr" align="left" lang="en-us">
<hr>
<font face="Tahoma" size="2"><span><b>From:</b> <a href="mailto:rules-users-bounces@lists.jboss.org" target="_blank">rules-users-bounces@lists.jboss.org</a> [mailto:<a href="mailto:rules-users-bounces@lists.jboss.org" target="_blank">rules-users-bounces@lists.jboss.org</a>] <b>On Behalf Of
</b>Jai Vasanth<br></span><b>Sent:</b> 05 February 2008 19:35</font>
<div><span><font face="Tahoma" size="2"><br><b>To:</b> Rules Users List<br><b>Subject:</b> Re:
[rules-users] Grouping rules<br></font></span></div><br></div>
<div><span>
<div></div>I had another question on these lines. Is there a way to preven
even the LHS from evaluating for certain cases ? A few of my LHS
computation involve some expensive service calls and I would like to avoid
unless and until it is asolutely necessary.<br><br>Thanks <br><br>Jai
<br><br>
<div class="gmail_quote">On Feb 1, 2008 8:35 AM, Jai Vasanth <<a href="mailto:jaivasanth@gmail.com" target="_blank">jaivasanth@gmail.com</a>> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Thanks.
That helped.
<div>
<div></div>
<div><br><br>
<div class="gmail_quote">On Feb 1, 2008 7:31 AM, Anstis, Michael (M.)
<<a href="mailto:manstis1@ford.com" target="_blank">manstis1@ford.com</a>>
wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2">Excuse me if you already understand but there is a difference
between rule patterns being evaluated and their consequence
running.</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2"></font></span> </div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2">Rules LHS are evaluated when objects are inserted into working
memory whereas the consequence fires when you call
fireAllRules();</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2"></font></span> </div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2">The rules whose activations are executed are those in the given
Agenda Group; thereafter those not in any agenda group execute. So if
all rules are in an Agenda Group you should be OK.</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2"></font></span> </div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2">Of
course they don't prevent all rule patterns from being checked as
objects are inserted into WM (which has a performance impact) but this
is what the RETE network was designed to
optimise. </font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2"></font></span> </div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2">You could try another configuration (but I think Agenda
Groups are probably the preference by design). This gives complete
isolation - but I haven't tried it so it might not even be possible
;-)</font></span></div>
<blockquote dir="ltr" style="margin-right: 0px;">
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">global WorkingMemory wm;</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">global RuleBase rbX;</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" size="2">
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">global RuleBase rbY;</font></span></div></font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2"></font></span> </div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">rule "Group X"</font></span></div>
<div>
<div dir="ltr" align="left"><span><font face="Courier New"> <font color="#0000ff" size="2">when</font></font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"> <font color="#0000ff" size="2">Fact( attribute == "condition1"
)</font></font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"> <font color="#0000ff" size="2">then</font></font></span></div></div>
<div dir="ltr" align="left"><span><font face="Courier New"> <font color="#0000ff" size="2">wm =
rbX.newStatefulSession();</font></font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"> <font color="#0000ff" size="2">wm.fireAllRules();</font></font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">end</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2"></font></span> </div>
<div dir="ltr" align="left"><span>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">rule "Group Y"</font></span></div>
<div>
<div dir="ltr" align="left"><span><font face="Courier New"> <font color="#0000ff" size="2">when</font></font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"> <font color="#0000ff" size="2">Fact( attribute == "condition2"
)</font></font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"> <font color="#0000ff" size="2">then</font></font></span></div></div>
<div dir="ltr" align="left"><span><font face="Courier New"> <font color="#0000ff" size="2">wm =
rbY.newStatefulSession();</font></font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"> <font color="#0000ff" size="2">wm.fireAllRules();</font></font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">end</font></span></div></span></div></blockquote>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2">Good luck.</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2"></font></span> </div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2">Mike</font></span></div><br>
<blockquote style="margin-right: 0px;">
<div dir="ltr" align="left" lang="en-us">
<hr>
<font face="Tahoma" size="2">
</font><div><font face="Tahoma" size="2"><b>From:</b> <a href="mailto:rules-users-bounces@lists.jboss.org" target="_blank">rules-users-bounces@lists.jboss.org</a> [mailto:<a href="mailto:rules-users-bounces@lists.jboss.org" target="_blank">rules-users-bounces@lists.jboss.org</a>] <b>On Behalf
Of </b>Jai Vasanth<br></font></div><font face="Tahoma" size="2"><b>Sent:</b> 01 February 2008
15:07<br><b>To:</b> Rules Users List<br><b>Subject:</b> Re:
[rules-users] Grouping rules<br></font><br></div>
<div>
<div></div>
<div>
<div></div><br>Thanks for responding <br>Yes, I did consider
agenda groups, but I thought agenda groups only ordered execution in
a particular fashion, so if Rule "pick group X" fires then it would
make sure that rules in Agenda Group X fire first before the
remaining but the remaining would fire eventually. Is my
understanding correct ?<br>I am looking for a solution for
completely isolating a rule set conditioned on an object
attribute.<br><br>
<div class="gmail_quote">On Feb 1, 2008 12:46 AM, Anstis, Michael (M.)
<<a href="mailto:manstis1@ford.com" target="_blank">manstis1@ford.com</a>> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2">What about Agenda Groups?</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2"></font></span> </div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">Rule "pick group X"</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">when</font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"><font size="2"> <font color="#0000ff">Fact( attribute =
"condition1" )</font></font></font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">then</font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"><font size="2"> <font color="#0000ff">drools.setFocus("Group
X")</font></font></font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">end</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2"></font></span> </div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">Rule "pick group Y"</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">when</font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"><font size="2"> <font color="#0000ff">Fact( attribute =
"condition2" )</font></font></font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">then</font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"><font size="2"> <font color="#0000ff">drools.setFocus("Group
Y")</font></font></font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">end</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2"></font></span> </div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">Rule "Group X1"</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">Agenda Group "Group X"</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">when</font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"><font size="2"> <font color="#0000ff">Smurf(
)</font></font></font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">then</font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"><font size="2"> <font color="#0000ff">// Do
something</font></font></font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">end</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2"></font></span> </div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">Rule "Group X2"</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">Agenda Group "Group X"</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">when</font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"><font size="2"> <font color="#0000ff">Smurfette(
)</font></font></font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">then</font></span></div>
<div dir="ltr" align="left"><span><font face="Courier New"><font size="2"> <font color="#0000ff">// Something
else</font></font></font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Courier New" size="2">end</font></span></div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2"></font></span> </div>
<div dir="ltr" align="left"><span><font color="#0000ff" face="Arial" size="2">etc</font></span></div><br>
<blockquote style="margin-right: 0px;">
<div dir="ltr" align="left" lang="en-us">
<hr>
<font face="Tahoma" size="2"><b>From:</b> <a href="mailto:rules-users-bounces@lists.jboss.org" target="_blank">rules-users-bounces@lists.jboss.org</a> [mailto:<a href="mailto:rules-users-bounces@lists.jboss.org" target="_blank">rules-users-bounces@lists.jboss.org</a>] <b>On
Behalf Of </b>Jai Vasanth<br><b>Sent:</b> 31 January 2008
19:45<br><b>To:</b> <a href="mailto:rules-users@lists.jboss.org" target="_blank">rules-users@lists.jboss.org</a><br><b>Subject:</b>
[rules-users] Grouping rules<br></font><br></div>
<div>
<div></div>
<div>
<div></div>Hi,<br><br><br> I am building a system where I
would need to fire different sets of rules based on some
attribute in the fact object. <br><br>Here are someways
which I thought of, I was wondering if there was something
better than that.<br><br>1) I could do this by creating
different sessions based on the data attrbute (different
sessions would have different rule packages based on the
attribute)<br><br>or <br><br>2) Have all the rules fire (all the
different sets of rules) irrespective of the attribute and have
them insert fact new objects into the working memory. In the
second round of rules, collect the (newly made) fact
objects based on the attribute and take that
action.<br><br><br><br>Thanks <br><br>Jai
<br><br><br><br><br></div></div></blockquote></div><br>_______________________________________________<br>rules-users
mailing list<br><a href="mailto:rules-users@lists.jboss.org" target="_blank">rules-users@lists.jboss.org</a><br><a href="https://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a><br>
<br></blockquote></div><br></div></div></blockquote></div><br>_______________________________________________<br>rules-users
mailing list<br><a href="mailto:rules-users@lists.jboss.org" target="_blank">rules-users@lists.jboss.org</a><br><a href="https://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a><br>
<br></blockquote></div><br></div></div></blockquote></div><br></span></div></blockquote></div><br>_______________________________________________<br>rules-users
mailing list<br><a href="mailto:rules-users@lists.jboss.org" target="_blank">rules-users@lists.jboss.org</a><br><a href="https://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a><br>
<br><br clear="all"></blockquote></div><br><br clear="all"><br>-- <br> Edson
Tirelli<br> JBoss Drools Core Development<br> Office:
+55 11 3529-6000<br> Mobile: +55 11 9287-5646<br> JBoss,
a division of Red Hat @ <a href="http://www.jboss.com" target="_blank">www.jboss.com</a>
</span></div></blockquote></div>
<br>_______________________________________________<br>rules-users mailing list<br><a href="mailto:rules-users@lists.jboss.org" target="_blank">rules-users@lists.jboss.org</a><br><a href="https://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a><br>
<br><br clear="all"></blockquote></div><br><br clear="all"><br>-- <br> Edson Tirelli<br> JBoss Drools Core Development<br> Office: +55 11 3529-6000<br> Mobile: +55 11 9287-5646<br> JBoss, a division of Red Hat @ <a href="http://www.jboss.com" target="_blank">www.jboss.com</a>
</div></div><br>_______________________________________________<br>rules-users mailing list<br><a href="mailto:rules-users@lists.jboss.org">rules-users@lists.jboss.org</a><br><a href="https://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a><br>
<br></blockquote></div><br>