[rules-users] Turning a non-statefull accumulate into a statefull insertLogical

Edson Tirelli tirelli at post.com
Mon Jan 21 05:59:29 EST 2008


   Ge0ffrey,

   Isn't the bellow rule causing an infinite loop for you?

rule "existExamSeating"
     when
         $period : Period();
         $room : Room();
         exists Exam(period == $period, room == $room);
         not ExamSeating(period == $period, room == $room);
     then
         insertLogical(new ExamSeating($period, $room));
end

   You see, the insertLogical in the consequence will cause the LHS
condition:

         not ExamSeating(period == $period, room == $room);

   To fail. When it fails, it automatically retreats the logical insert,
what causes the condition to be true again and fire the rule again. And you
have an infinite loop... don't you?

    []s
    Edson

2008/1/20, Geoffrey De Smet <ge0ffrey.spam at gmail.com>:
>
> Hi,
>
> In my statefull working memory on which I fireAllRules over a 1000 timse
> per second, I have rule which hurts performance because it gets
> backwards chained (which is bad in my use case):
>
>
> // More seating required during a period in a room than available
> // in that room.
> rule "roomCapacityTooSmall" // TODO improve performance, as it takes 50%
> of the performance
>      when
>          $period : Period();
>          $room : Room($capacity : capacity);
>          $totalStudentListSize : Number(intValue > $capacity)
>                  from accumulate(
>              Exam(period == $period, room == $room,
>                  $studentListSize : topicStudentListSize),
>              sum($studentListSize)
>          );
>      then
>          insertLogical(new IntConstraintOccurrence(
>                 "roomCapacityTooSmall", ConstraintType.NEGATIVE_HARD,
>              $period, $room));
> end
>
>
> In an effort to turn this into a statefull insertLogical,
> I 've tried this:
>
> // More seating required during a period in a room than available
> // in that room.
> rule "existExamSeating"
>      when
>          $period : Period();
>          $room : Room();
>          exists Exam(period == $period, room == $room);
>          not ExamSeating(period == $period, room == $room);
>      then
>          insertLogical(new ExamSeating($period, $room));
> end
> rule "addExamToExamSeating"
>      when
>          $exam : Exam($period : period, $room : room);
>          $examSeating : ExamSeating(period == $period, room == $room,
>                 examSet not contains $exam);
>      then
>          $examSeating.getExamSet().add($exam);
>          update($examSeating);
> end
> rule "removeExamFromExamSeatingPeriod"
>      when
>          $exam : Exam($period : period, $room : room);
>          $examSeating : ExamSeating(examSet contains $exam,
>                 period != $period);
>      then
>          $examSeating.getExamSet().remove($exam);
>          update($examSeating);
> end
> rule "removeExamFromExamSeatingRoom"
>      when
>          $exam : Exam($period : period, $room : room);
>          $examSeating : ExamSeating(examSet contains $exam,
>                 room != room);
>      then
>          $examSeating.getExamSet().remove($exam);
>          update($examSeating);
> end
> rule "roomCapacityTooSmall"
>      when
>          $examSeating : ExamSeating(studentSize > roomCapacity, $period
> : period, $room : room);
>      then
>          insertLogical(new IntConstraintOccurrence(
>                 "roomCapacityTooSmall", ConstraintType.NEGATIVE_HARD,
>              $period, $room));
> end
>
>
>
> However, this turns out to be so slow it's at least 100 times slower
> (and probably a lot more as I had no time to let the benchmark finish).
>
> What could explain this?
> Is "exists" or "contains" backwards chained?
> Am I missing something?
>
> Thanks for any and all help.
>
> --
> With kind regards,
> Geoffrey De Smet
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>



-- 
  Edson Tirelli
  JBoss Drools Core Development
  Office: +55 11 3529-6000
  Mobile: +55 11 9287-5646
  JBoss, a division of Red Hat @ www.jboss.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20080121/bdf6fc20/attachment.html 


More information about the rules-users mailing list