tim tim schreef:
I am convinced that:
2) Penalty's equals/hashcode uses both "cause" and "weight"?
then 3) happens: Keep Penalty(10), add Penalty(5)
is an issue in drools core and instead 2) should happen:
Remove Penalty(10), add Penalty(5)
because Penalty(10) is no longer true
I am going to make a testcase to isolate the problem and make it more
transparent that it is indeed an issue. And then try to convince Mark
and Edson that it's an issue :)
and i could not find how you solved this problem in the end.
which the HACK indeed that you quothed below:
the hack causes the rule to no longer apply (retracting the
ConstraintOccurrence), after which it then refires.
i solved the problem of improving constraints for the same causes that
differ in hashCode by retracting the old fact before inserting the new
one.
but it takes quite some overhead to be able to do so. i could post my
code if anyone is interested.
unfortunately i could not find in your samples how you handle such a scenario.
does the "HACK" part of this rule have something to do with it?
from curriculumCourseScoreRules.drl
// MinimumWorkingDays: The lectures of each course must be spread into
a minimum number of days.
// Each day below the minimum counts as 5 points of penalty.
rule "minimumWorkingDays"
when
$course : Course($minWorkingDaySize : minWorkingDaySize);
$dayCount : Number(intValue < $minWorkingDaySize) from accumulate(
$day : Day()
and exists Lecture(course == $course, day == $day),
count($day)
);
// HACK to fix wierd truth maintance behavior in drools
// because making weight part of the equals/hashcode doesn't cut it
not IntConstraintOccurrence(
ruleId == "minimumWorkingDays",
constraintType == ConstraintType.NEGATIVE_SOFT,
causes contains $course,
eval(weight != (($minWorkingDaySize - $dayCount.intValue()) * 5))
);
// An uninitialized schedule should have no constraints broken
exists Lecture(course == $course);
then
insertLogical(new
IntConstraintOccurrence("minimumWorkingDays",
ConstraintType.NEGATIVE_SOFT,
(($minWorkingDaySize - $dayCount.intValue()) * 5),
$course));
end
but the hack makes the rule not fire at all, when it had fired before.
even if the error has improved by now.
Feed back is always welcome :)
With kind regards,
Geoffrey De Smet