[rules-users] Re: Drools solver performance question

Greg Barton greg_barton at yahoo.com
Mon Feb 16 13:44:04 EST 2009


Ah, well that's my point of ignorance, then.  I was thinking in stateless mode. :)  And to do what I suggest in a stateful manner would require a "modifyLogical" type functionality in place of the insertLogical.  i.e.

modifyLogical (object) {
  //do this when the condition obtains
} else {
  //do this when the condition no longer obtains
}

Could be an interesting functionality to have, though.  

--- On Mon, 2/16/09, Geoffrey De Smet <ge0ffrey.spam at gmail.com> wrote:

> From: Geoffrey De Smet <ge0ffrey.spam at gmail.com>
> Subject: [rules-users] Re: Drools solver performance question
> To: rules-users at lists.jboss.org
> Date: Monday, February 16, 2009, 10:25 AM
> Unfortunately, when a constraint rule no longer applies, the
> score wouldn't decrement.
> 
> So this would work in a stateless working memory, where the
> entire score is recalculated for every move of every step.
> But drools-solver works in a statefull working memory,
> where only the part of the score that is dirty is
> recalculated (="score delta") for every move of
> every step.
> Now I haven't experimented with the first option yet,
> though I am pretty sure it's exponentially slower.
> If anyone wants to try it out, it would be nice to confirm
> or break my theory :)
> 
> PS: please keep this discussion on the mailing list, so
> others can benefit from it too.
> 
> With kind regards,
> Geoffrey De Smet
> 
> 
> 
> Greg Barton schreef:
> > What I'm talking about isn't like what
> you've got in that commented out code.  Basically, it
> would use the same rules, matching on an accumulator object
> instead of inserting new Constraint objects, and the last
> rule would match the accumulator and set the score.
> > 
> > rule "multipleQueensHorizontal"
> >     when         $a : Accumulator();
> >         $q1 : Queen($id : id, $y : y);
> >         $q2 : Queen(id > $id, y == $y);
> >     then                                      
> $a.increment();
> > end                                                   
>                                                             
>                                                             
>                                                             
>                                           //
> multipleQueensVertical is obsolete because it is always 0   
>                                                             
>                                                             
>                                                             
>                                                             
>                                                            
> rule "multipleQueensAscendingDiagonal"            
>                                                             
>                                                             
>                when         $a : Accumulator();             
>                           $q1 : Queen($id : id, $ascendingD
> : ascendingD);                 $q2 : Queen(id > $id,
> ascendingD == $ascendingD);
> >     then         $a.increment();
> > end                                                   
>                                                             
>                                                             
>        
> > rule "multipleQueensDescendingDiagonal"
> >     when                 $a Accumulator();            
>                    $q1 : Queen($id : id, $descendingD :
> descendingD);
> >         $q2 : Queen(id > $id, descendingD ==
> $descendingD);
> >     then                                              
>             $a.increment();
> > end
> > 
> > rule "hardConstraintsBroken"
> >     salience -10
> >     when
> >         $a : Accumulator();      then
> >         scoreCalculator.setScore(- $a.intValue());
> > end
> > 
> > 
> > --- On Fri, 2/13/09, Geoffrey De Smet
> <ge0ffrey.spam at gmail.com> wrote:
> > 
> >   
> >> From: Geoffrey De Smet
> <ge0ffrey.spam at gmail.com>
> >> Subject: Re: Drools solver performance question
> >> To: Cc: greg_barton at yahoo.com
> >> Date: Friday, February 13, 2009, 8:42 AM
> >> Hi Greg,
> >> 
> >> Yes, I expected that too, but my experiments
> proved me
> >> wrong (for now).
> >> The current implementation of accumulate backwards
> chains I
> >> believe.
> >> Backward chaining doesn't do score delta
> calculation,
> >> so it's very bad for scalability.
> >> 
> >> Try it yourself with the nqueens example.
> >> Uncomment the code in nqueensScoreRules.drl and
> see what
> >> happens if you go from n=8 to n=16 and more.
> >> 
> >> With kind regards,
> >> Geoffrey De Smet
> >> 
> >> 
> >> 
> >> Greg Barton schreef:
> >>     
> >>> I answered a performance question a user had
> about
> >>> drools-solver, but I'm afraid I answered
> with a
> >>>       
> >> touch of
> >>     
> >>> ignorance about the way drools-solver is set
> up.  His
> >>>       
> >> rules
> >>     
> >>> had a new object being inserted into the
> working
> >>>       
> >> memory each
> >>     
> >>> time a constraint rule was matched.  The
> constraint
> >>>       
> >> objects
> >>     
> >>> were then accumulated by a low priority rule
> at the
> >>>       
> >> end. After looking at the drools-solver examples
> it looks
> >> like
> >>     
> >>> they're all that way.  It strikes me that
> having a
> >>> single accumulator object, and not creating
> and
> >>>       
> >> inserting a
> >>     
> >>> new object in each constraint rule, would be
> more
> >>>       
> >> efficient.
> >>     
> >>>  Is it possible to set this up in a solver
> ruleset? Thanks,
> >>> GreG
> >>> 
> >>> 
> >>>       
> >>>       
> > 
> > 
> >       
> >   
> 
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users


      



More information about the rules-users mailing list