[rules-users] Re: Turning a non-statefull accumulate into a statefull insertLogical
Edson Tirelli
tirelli at post.com
Mon Jan 21 16:29:57 EST 2008
What is probably hurting you now is the number of updates you have in
your rules.... :) you can tweak that and you will probably end up being
faster than the accumulate.
[]s
Edson
2008/1/21, Geoffrey De Smet <ge0ffrey.spam at gmail.com>:
>
> Thanks Edson, it was indeed an infinite loop.
>
> I 've made it an normal insert and fixed the room != room (instead of
> room != $room) bug.
>
> Still, it turns out worse:
>
> Solved in 500 steps and 30297 time millis spend.
> While before I had:
> Solved in 500 steps and 13078 time millis spend.
>
> Looks the exists and/or contains might be hurting me a lot?
>
>
>
> // 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
> insert(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
>
>
> With kind regards,
> Geoffrey De Smet
>
>
> Edson Tirelli wrote:
> >
> > 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
> > <mailto: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 <mailto: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 <http://www.jboss.com>
> >
> >
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > rules-users mailing list
> > rules-users at lists.jboss.org
> > https://lists.jboss.org/mailman/listinfo/rules-users
>
> _______________________________________________
> 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/e75041fd/attachment.html
More information about the rules-users
mailing list