[jboss-svn-commits] JBL Code SVN: r16545 - in labs/jbossrules/trunk/drools-solver: drools-solver-examples/src/main/java/org/drools/solver/examples/common/solver and 6 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Nov 12 16:02:37 EST 2007


Author: ge0ffrey
Date: 2007-11-12 16:02:37 -0500 (Mon, 12 Nov 2007)
New Revision: 16545

Added:
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/constraint/ConstraintOccurrence.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/constraint/ConstraintType.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/constraint/DoubleConstraintOccurrence.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/constraint/IntConstraintOccurrence.java
Removed:
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/constraint/ConstraintOccurrence.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/common/solver/ListComparator.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/common/solver/domain/
Modified:
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/common/app/log4j.xml
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationScoreRules.drl
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/lessonschedule/solver/lessonScheduleScoreRules.drl
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/nqueens/solver/nQueensScoreRules.drl
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/solver/simple/simpleTravelingTournamentScoreRules.drl
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/solver/smart/smartTravelingTournamentScoreRules.drl
Log:
drl format + usage of ConstraintType

Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/constraint/ConstraintOccurrence.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/constraint/ConstraintOccurrence.java	2007-11-12 20:25:15 UTC (rev 16544)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/constraint/ConstraintOccurrence.java	2007-11-12 21:02:37 UTC (rev 16545)
@@ -1,40 +0,0 @@
-package org.drools.solver.core.score.constraint;
-
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.apache.commons.lang.builder.HashCodeBuilder;
-
-/**
- * @author Geoffrey De Smet
- */
-public class ConstraintOccurrence {
-
-    private String ruleId;
-    private Object[] objects;
-
-    public ConstraintOccurrence(String ruleId, Object ... objects) {
-        this.ruleId = ruleId;
-        this.objects = objects;
-    }
-
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        } else if (o instanceof ConstraintOccurrence) {
-            ConstraintOccurrence other = (ConstraintOccurrence) o;
-            return new EqualsBuilder()
-                    .append(ruleId, other.ruleId)
-                    .append(objects, other.objects)
-                    .isEquals();
-        } else {
-            return false;
-        }
-    }
-
-    public int hashCode() {
-        return new HashCodeBuilder()
-                .append(ruleId)
-                .append(objects)
-                .toHashCode();
-    }
-
-}

Added: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/constraint/ConstraintOccurrence.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/constraint/ConstraintOccurrence.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/constraint/ConstraintOccurrence.java	2007-11-12 21:02:37 UTC (rev 16545)
@@ -0,0 +1,60 @@
+package org.drools.solver.core.score.constraint;
+
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class ConstraintOccurrence {
+
+    protected String ruleId;
+    protected ConstraintType constraintType;
+    protected Object[] causes;
+
+    public ConstraintOccurrence(String ruleId, Object... causes) {
+        this(ruleId, ConstraintType.NEGATIVE_HARD, causes);
+    }
+
+    public ConstraintOccurrence(String ruleId, ConstraintType constraintType, Object... causes) {
+        this.ruleId = ruleId;
+        this.constraintType = constraintType;
+        this.causes = causes;
+    }
+
+    public String getRuleId() {
+        return ruleId;
+    }
+
+    public ConstraintType getConstraintType() {
+        return constraintType;
+    }
+
+    public Object[] getCauses() {
+        return causes;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        } else if (o instanceof ConstraintOccurrence) {
+            ConstraintOccurrence other = (ConstraintOccurrence) o;
+            return new EqualsBuilder()
+                    .append(ruleId, other.ruleId)
+                    .append(constraintType, other.constraintType)
+                    .append(causes, other.causes)
+                    .isEquals();
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+                .append(ruleId)
+                .append(constraintType)
+                .append(causes)
+                .toHashCode();
+    }
+
+}

Added: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/constraint/ConstraintType.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/constraint/ConstraintType.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/constraint/ConstraintType.java	2007-11-12 21:02:37 UTC (rev 16545)
@@ -0,0 +1,10 @@
+package org.drools.solver.core.score.constraint;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public enum ConstraintType {
+    NEGATIVE_HARD,
+    NEGATIVE_SOFT,
+    POSITIVE
+}

Added: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/constraint/DoubleConstraintOccurrence.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/constraint/DoubleConstraintOccurrence.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/constraint/DoubleConstraintOccurrence.java	2007-11-12 21:02:37 UTC (rev 16545)
@@ -0,0 +1,31 @@
+package org.drools.solver.core.score.constraint;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class DoubleConstraintOccurrence extends ConstraintOccurrence {
+
+    protected double weight;
+
+    public DoubleConstraintOccurrence(String ruleId, Object... causes) {
+        this(ruleId, ConstraintType.NEGATIVE_HARD, causes);
+    }
+
+    public DoubleConstraintOccurrence(String ruleId, ConstraintType constraintType, Object... causes) {
+        this(ruleId, constraintType, 1.0, causes);
+    }
+
+    public DoubleConstraintOccurrence(String ruleId, double weight, Object... causes) {
+        this(ruleId, ConstraintType.NEGATIVE_HARD, weight, causes);
+    }
+
+    public DoubleConstraintOccurrence(String ruleId, ConstraintType constraintType, double weight, Object... causes) {
+        super(ruleId, constraintType, causes);
+        this.weight = weight;
+    }
+
+    public double getWeight() {
+        return weight;
+    }
+
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/constraint/IntConstraintOccurrence.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/constraint/IntConstraintOccurrence.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/constraint/IntConstraintOccurrence.java	2007-11-12 21:02:37 UTC (rev 16545)
@@ -0,0 +1,31 @@
+package org.drools.solver.core.score.constraint;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class IntConstraintOccurrence extends ConstraintOccurrence {
+
+    protected int weight;
+
+    public IntConstraintOccurrence(String ruleId, Object... causes) {
+        this(ruleId, ConstraintType.NEGATIVE_HARD, causes);
+    }
+
+    public IntConstraintOccurrence(String ruleId, ConstraintType constraintType, Object... causes) {
+        this(ruleId, constraintType, 1, causes);
+    }
+
+    public IntConstraintOccurrence(String ruleId, int weight, Object... causes) {
+        this(ruleId, ConstraintType.NEGATIVE_HARD, weight, causes);
+    }
+
+    public IntConstraintOccurrence(String ruleId, ConstraintType constraintType, int weight, Object... causes) {
+        super(ruleId, constraintType, causes);
+        this.weight = weight;
+    }
+
+    public int getWeight() {
+        return weight;
+    }
+
+}

Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/common/solver/ListComparator.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/common/solver/ListComparator.java	2007-11-12 20:25:15 UTC (rev 16544)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/common/solver/ListComparator.java	2007-11-12 21:02:37 UTC (rev 16545)
@@ -1,31 +0,0 @@
-package org.drools.solver.examples.common.solver;
-
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * @author Geoffrey De Smet
-*/
-public class ListComparator implements Comparator<List<? extends Comparable>> {
-
-    public int compare(List<? extends Comparable> a, List<? extends Comparable> b) {
-        if (a == b) {
-            return 0;
-        } else if (a.size() < b.size()) {
-            return -1;
-        } else if (a.size() > b.size()) {
-            return 1;
-        } else {
-            Iterator<? extends Comparable> aIt = a.iterator();
-            Iterator<? extends Comparable> bIt = b.iterator();
-            while (aIt.hasNext()) {
-                int compared = aIt.next().compareTo(bIt.next());
-                if (compared != 0) {
-                    return compared;
-                }
-            }
-            return 0;
-        }
-    }
-}

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/common/app/log4j.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/common/app/log4j.xml	2007-11-12 20:25:15 UTC (rev 16544)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/common/app/log4j.xml	2007-11-12 21:02:37 UTC (rev 16545)
@@ -11,7 +11,7 @@
     </appender>
 
     <category name="org.drools.solver">
-        <priority value="debug" />
+        <priority value="info" />
     </category>
 
     <root>

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationScoreRules.drl
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationScoreRules.drl	2007-11-12 20:25:15 UTC (rev 16544)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationScoreRules.drl	2007-11-12 21:02:37 UTC (rev 16545)
@@ -2,6 +2,8 @@
     dialect "java"
 
 import org.drools.solver.core.score.calculator.HardAndSoftConstraintScoreCalculator;
+import org.drools.solver.core.score.constraint.IntConstraintOccurrence;
+import org.drools.solver.core.score.constraint.ConstraintType;
 
 import org.drools.solver.examples.itc2007.examination.domain.Exam;
 import org.drools.solver.examples.itc2007.examination.domain.Examination;
@@ -14,110 +16,122 @@
 import org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraintType;
 import org.drools.solver.examples.itc2007.examination.domain.Student;
 import org.drools.solver.examples.itc2007.examination.domain.Topic;
-import org.drools.solver.core.score.constraint.ConstraintOccurrence;
 
 global HardAndSoftConstraintScoreCalculator scoreCalculator;
 
+// ############################################################################
+// Hard constraints
+// ############################################################################
+
 // Two exams in the same period which share students.
 rule "conflictingExamsInSamePeriod"
-  when
-    $student : Student();
-    $exam : Exam($id : id, topic.studentList contains $student, $period : period);
-    Exam(period == $period, id > $id, topic.studentList contains $student);
-  then
-    insertLogical(new ConstraintOccurrence("conflictingExamsInSamePeriod", $exam));
+    when
+        $student : Student();
+        $exam : Exam($id : id, topic.studentList contains $student, $period : period);
+        Exam(period == $period, id > $id, topic.studentList contains $student);
+    then
+        insertLogical(new IntConstraintOccurrence("conflictingExamsInSamePeriod", ConstraintType.NEGATIVE_HARD,
+            $exam));
 end
 
 // More time required during a period than available in that period.
 rule "periodDurationTooShort"
-  when
-    $exam : Exam($periodDuration : period.durationInMinutes, topic.duration > $periodDuration);
-  then
-    insertLogical(new ConstraintOccurrence("periodDurationTooShort", $exam));
+    when
+        $exam : Exam($periodDuration : period.durationInMinutes, topic.duration > $periodDuration);
+    then
+        insertLogical(new IntConstraintOccurrence("periodDurationTooShort", ConstraintType.NEGATIVE_HARD,
+            $exam));
 end
 
 // More seating required during a period in a room than available in that room.
 rule "roomCapacityTooSmall"
-  when
-    $period : Period();
-    $room : Room($capacity : capacity);
-    $totalStudentListSize : Number() from accumulate(
-      Exam(period == $period, room == $room, $studentListSize : topic.studentListSize),
-      // sumInteger($studentListSize) // Vote for http://jira.jboss.com/jira/browse/JBRULES-1075
-      sum($studentListSize)
-    );
-    eval($totalStudentListSize.intValue() > $capacity);
-  then
-    insertLogical(new ConstraintOccurrence("roomCapacityTooSmall", $period, $room));
+    when
+        $period : Period();
+        $room : Room($capacity : capacity);
+        $totalStudentListSize : Number() from accumulate(
+            Exam(period == $period, room == $room, $studentListSize : topic.studentListSize),
+            // sumInteger($studentListSize) // Vote for http://jira.jboss.com/jira/browse/JBRULES-1075
+            sum($studentListSize)
+        );
+        eval($totalStudentListSize.intValue() > $capacity);
+    then
+        insertLogical(new IntConstraintOccurrence("roomCapacityTooSmall", ConstraintType.NEGATIVE_HARD,
+            $period, $room));
 end
 
 // Period hard constraints
 rule "periodHardConstraintExamCoincidence"
-  when
-    $periodHardConstraint : PeriodHardConstraint(
-      periodHardConstraintType == PeriodHardConstraintType.EXAM_COINCIDENCE,
-      $leftSideTopic : leftSideTopic,
-      $rightSideTopic : rightSideTopic
-    )
-    Exam(topic == $leftSideTopic, $leftSidePeriod : period);
-    Exam(topic == $rightSideTopic, period != $leftSidePeriod);
-    // TODO make sure that leftSide and rightSide don't share a student
-  then
-    insertLogical(new ConstraintOccurrence("periodHardConstraintExamCoincidence", $periodHardConstraint));
+    when
+        $periodHardConstraint : PeriodHardConstraint(
+            periodHardConstraintType == PeriodHardConstraintType.EXAM_COINCIDENCE,
+            $leftSideTopic : leftSideTopic,
+            $rightSideTopic : rightSideTopic
+        )
+        Exam(topic == $leftSideTopic, $leftSidePeriod : period);
+        Exam(topic == $rightSideTopic, period != $leftSidePeriod);
+        // TODO make sure that leftSide and rightSide don't share a student
+    then
+        insertLogical(new IntConstraintOccurrence("periodHardConstraintExamCoincidence", ConstraintType.NEGATIVE_HARD,
+            $periodHardConstraint));
 end
 rule "periodHardConstraintExclusion"
-  when
-    $periodHardConstraint : PeriodHardConstraint(
-      periodHardConstraintType == PeriodHardConstraintType.EXCLUSION,
-      $leftSideTopic : leftSideTopic,
-      $rightSideTopic : rightSideTopic
-    )
-    Exam(topic == $leftSideTopic, $leftSidePeriod : period);
-    Exam(topic == $rightSideTopic, period == $leftSidePeriod);
-  then
-    insertLogical(new ConstraintOccurrence("periodHardConstraintExclusion", $periodHardConstraint));
+    when
+        $periodHardConstraint : PeriodHardConstraint(
+            periodHardConstraintType == PeriodHardConstraintType.EXCLUSION,
+            $leftSideTopic : leftSideTopic,
+            $rightSideTopic : rightSideTopic
+        )
+        Exam(topic == $leftSideTopic, $leftSidePeriod : period);
+        Exam(topic == $rightSideTopic, period == $leftSidePeriod);
+    then
+        insertLogical(new IntConstraintOccurrence("periodHardConstraintExclusion", ConstraintType.NEGATIVE_HARD,
+            $periodHardConstraint));
 end
 rule "periodHardConstraintAfter"
-  when
-    $periodHardConstraint : PeriodHardConstraint(
-      periodHardConstraintType == PeriodHardConstraintType.AFTER,
-      $leftSideTopic : leftSideTopic,
-      $rightSideTopic : rightSideTopic
-    )
-    Exam(topic == $leftSideTopic, $leftSidePeriod : period);
-    Exam(topic == $rightSideTopic, (period.dateInDays < $leftSidePeriod.dateInDays)
-        || (period.dateInDays == $leftSidePeriod.dateInDays
-        && period.startTimeInMinutes <= $leftSidePeriod.startTimeInMinutes));
-  then
-    insertLogical(new ConstraintOccurrence("periodHardConstraintAfter", $periodHardConstraint));
+    when
+        $periodHardConstraint : PeriodHardConstraint(
+            periodHardConstraintType == PeriodHardConstraintType.AFTER,
+            $leftSideTopic : leftSideTopic,
+            $rightSideTopic : rightSideTopic
+        )
+        Exam(topic == $leftSideTopic, $leftSidePeriod : period);
+        Exam(topic == $rightSideTopic, (period.dateInDays < $leftSidePeriod.dateInDays)
+                || (period.dateInDays == $leftSidePeriod.dateInDays
+                && period.startTimeInMinutes <= $leftSidePeriod.startTimeInMinutes));
+    then
+        insertLogical(new IntConstraintOccurrence("periodHardConstraintAfter", ConstraintType.NEGATIVE_HARD,
+            $periodHardConstraint));
 end
 
-
 // Room hard constraints
 rule "roomHardConstraintExclusive"
-  when
-    $roomHardConstraint : RoomHardConstraint(
-      roomHardConstraintType == RoomHardConstraintType.ROOM_EXCLUSIVE,
-      $topic : topic
-    )
-    Exam(topic == $topic, $room : room);
-    Exam(topic != $topic, room == $room);
-  then
-    insertLogical(new ConstraintOccurrence("roomHardConstraintExclusive", $roomHardConstraint));
+    when
+        $roomHardConstraint : RoomHardConstraint(
+            roomHardConstraintType == RoomHardConstraintType.ROOM_EXCLUSIVE,
+            $topic : topic
+        )
+        Exam(topic == $topic, $room : room);
+        Exam(topic != $topic, room == $room);
+    then
+        insertLogical(new IntConstraintOccurrence("roomHardConstraintExclusive", ConstraintType.NEGATIVE_HARD,
+            $roomHardConstraint));
 end
 
-
 rule "hardConstraintsBroken"
-    salience -1 // Finish the other rules first (optional, for performance)
-  when
-    $hardCount : Number() from accumulate(
-       $w : ConstraintOccurrence(),
-       // countInteger($w) // Vote for http://jira.jboss.com/jira/browse/JBRULES-1075
-       count($w) // Vote for http://jira.jboss.com/jira/browse/JBRULES-1075
-    );
-  then
-    scoreCalculator.setHardConstraintsBroken($hardCount.intValue());
+        salience -1 // Finish the other rules first (optional, for performance)
+    when
+        $hardCount : Number() from accumulate(
+            $constraintOccurrence : IntConstraintOccurrence(constraintType == ConstraintType.NEGATIVE_HARD),
+            count($constraintOccurrence) // Vote for http://jira.jboss.com/jira/browse/JBRULES-1075
+        );
+    then
+        scoreCalculator.setHardConstraintsBroken($hardCount.intValue());
 end
+
+// ############################################################################
+// Soft constraints
+// ############################################################################
+
 // TODO implement me
 //Two Exams in a Row
 //

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/lessonschedule/solver/lessonScheduleScoreRules.drl
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/lessonschedule/solver/lessonScheduleScoreRules.drl	2007-11-12 20:25:15 UTC (rev 16544)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/lessonschedule/solver/lessonScheduleScoreRules.drl	2007-11-12 21:02:37 UTC (rev 16545)
@@ -1,48 +1,43 @@
 package rg.drools.solver.examples.lessonschedule.solver;
 
 import org.drools.solver.core.score.calculator.HardAndSoftConstraintScoreCalculator;
+import org.drools.solver.core.score.constraint.ConstraintOccurrence;
+import org.drools.solver.core.score.constraint.ConstraintType;
 
 import org.drools.solver.examples.lessonschedule.domain.LessonSchedule;
 import org.drools.solver.examples.lessonschedule.domain.Timeslot;
 import org.drools.solver.examples.lessonschedule.domain.Teacher;
 import org.drools.solver.examples.lessonschedule.domain.Group;
 import org.drools.solver.examples.lessonschedule.domain.Lesson;
-import org.drools.solver.core.score.constraint.ConstraintOccurrence;
 
 global HardAndSoftConstraintScoreCalculator scoreCalculator;
 
-//query "multipleLessonsPerTeacherPerTimeslot"
-//    $lesson : Lesson($id : id, $teacher : teacher, $timeslot : timeslot);
-//    exists Lesson(id > $id, teacher == $teacher, timeslot == $timeslot);
-//end
-//
-//query "multipleLessonsPerGroupPerTimeslot"
-//    $lesson : Lesson($id : id, $group : group, $timeslot : timeslot);
-//    exists Lesson(id > $id, group == $group, timeslot == $timeslot);
-//end
+// ############################################################################
+// Hard constraints
+// ############################################################################
 
 rule "multipleLessonsPerTeacherPerTimeslot"
-  when
-    $lesson : Lesson($id : id, $teacher : teacher, $timeslot : timeslot);
-    exists Lesson(id > $id, teacher == $teacher, timeslot == $timeslot);
-  then
-    insertLogical(new ConstraintOccurrence("multipleLessonsPerTeacherPerTimeslot", $lesson));
+    when
+        $lesson : Lesson($id : id, $teacher : teacher, $timeslot : timeslot);
+        exists Lesson(id > $id, teacher == $teacher, timeslot == $timeslot);
+    then
+        insertLogical(new ConstraintOccurrence("multipleLessonsPerTeacherPerTimeslot", $lesson));
 end
 
 rule "multipleLessonsPerGroupPerTimeslot"
-  when
-    $lesson : Lesson($id : id, $group : group, $timeslot : timeslot);
-    exists Lesson(id > $id, group == $group, timeslot == $timeslot);
-  then
-    insertLogical(new ConstraintOccurrence("multipleLessonsPerGroupPerTimeslot", $lesson));
+    when
+        $lesson : Lesson($id : id, $group : group, $timeslot : timeslot);
+        exists Lesson(id > $id, group == $group, timeslot == $timeslot);
+    then
+        insertLogical(new ConstraintOccurrence("multipleLessonsPerGroupPerTimeslot", $lesson));
 end
 
 rule "hardConstraintsBroken"
-  when
-    $hardCount : Long() from accumulate(
-       $w : ConstraintOccurrence(),
-       count($w)
-    );
-  then
-    scoreCalculator.setHardConstraintsBroken($hardCount.intValue());
+    when
+        $hardCount : Number() from accumulate(
+            $constraintOccurrence : ConstraintOccurrence(),
+            count($constraintOccurrence)
+        );
+    then
+        scoreCalculator.setHardConstraintsBroken($hardCount.intValue());
 end
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/nqueens/solver/nQueensScoreRules.drl
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/nqueens/solver/nQueensScoreRules.drl	2007-11-12 20:25:15 UTC (rev 16544)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/nqueens/solver/nQueensScoreRules.drl	2007-11-12 21:02:37 UTC (rev 16545)
@@ -1,86 +1,49 @@
 package org.drools.solver.examples.nqueens.solver;
 
 import org.drools.solver.core.score.calculator.SimpleScoreCalculator;
+import org.drools.solver.core.score.constraint.ConstraintOccurrence;
+import org.drools.solver.core.score.constraint.ConstraintType;
 
 import org.drools.solver.examples.nqueens.domain.Queen;
-import org.drools.solver.core.score.constraint.ConstraintOccurrence;
 
 global SimpleScoreCalculator scoreCalculator;
 
-//query "multipleQueensHorizontal"
-//    Queen($id : id, $y : y);
-//    Queen(id > $id, y == $y);
-//end
-//
-//// multipleQueensVertical is obsolete because it is always 0
-//
-//query "multipleQueensAscendingDiagonal"
-//    Queen($id : id, $ascendingD : ascendingD);
-//    Queen(id > $id, ascendingD == $ascendingD);
-//end
-//
-//query "multipleQueensDescendingDiagonal"
-//    Queen($id : id, $descendingD : descendingD);
-//    Queen(id > $id, descendingD == $descendingD);
-//end
+// ############################################################################
+// Hard constraints
+// ############################################################################
 
 rule "multipleQueensHorizontal"
-  when
-    $q1 : Queen($id : id, $y : y);
-    $q2 : Queen(id > $id, y == $y);
-  then
-    insertLogical(new ConstraintOccurrence("multipleQueensHorizontal", $q1, $q2));
+    when
+        $q1 : Queen($id : id, $y : y);
+        $q2 : Queen(id > $id, y == $y);
+    then
+        insertLogical(new ConstraintOccurrence("multipleQueensHorizontal", $q1, $q2));
 end
 
 // multipleQueensVertical is obsolete because it is always 0
 
 rule "multipleQueensAscendingDiagonal"
-  when
-    $q1 : Queen($id : id, $ascendingD : ascendingD);
-    $q2 : Queen(id > $id, ascendingD == $ascendingD);
-  then
-    insertLogical(new ConstraintOccurrence("multipleQueensAscendingDiagonal", $q1, $q2));
+    when
+        $q1 : Queen($id : id, $ascendingD : ascendingD);
+        $q2 : Queen(id > $id, ascendingD == $ascendingD);
+    then
+        insertLogical(new ConstraintOccurrence("multipleQueensAscendingDiagonal", $q1, $q2));
 end
 
 rule "multipleQueensDescendingDiagonal"
-  when
-    $q1 : Queen($id : id, $descendingD : descendingD);
-    $q2 : Queen(id > $id, descendingD == $descendingD);
-  then
-    insertLogical(new ConstraintOccurrence("multipleQueensDescendingDiagonal", $q1, $q2));
+    when
+        $q1 : Queen($id : id, $descendingD : descendingD);
+        $q2 : Queen(id > $id, descendingD == $descendingD);
+    then
+        insertLogical(new ConstraintOccurrence("multipleQueensDescendingDiagonal", $q1, $q2));
 end
 
 rule "constraintsBroken"
-  when
-    $hardConstraintCount : Long() from accumulate(
-       $w : ConstraintOccurrence(),
-       count($w)
-    );
-  then
-    scoreCalculator.setScore(- $hardConstraintCount.intValue());
+    when
+        $hardConstraintCount : Number() from accumulate(
+            $constraintOccurrence : ConstraintOccurrence(),
+            count($constraintOccurrence)
+        );
+    then
+        scoreCalculator.setScore(- $hardConstraintCount.intValue());
 end
-
-// Warning: This currently triggers backwards chaining instead of forward chaining and seriously hurts performance and scalability.
-//rule "constraintsBroken"
-//  when
-//    $multipleQueensHorizontal : Long()
-//    from accumulate(
-//        $q1 : Queen($id : id, $y : y)
-//        and Queen(id > $id, y == $y),
-//       count($q1)
-//    );
-//    $multipleQueensAscendingDiagonal : Long()
-//    from accumulate(
-//        $q2 : Queen($id : id, $ascendingD : ascendingD)
-//        and Queen(id > $id, ascendingD == $ascendingD),
-//       count($q2)
-//    );
-//    $multipleQueensDescendingDiagonal : Long()
-//    from accumulate(
-//        $q3 : Queen($id : id, $descendingD : descendingD)
-//        and Queen(id > $id, descendingD == $descendingD),
-//       count($q3)
-//    );
-//  then
-//    scoreCalculator.setScore(- $multipleQueensHorizontal - $multipleQueensAscendingDiagonal - $multipleQueensDescendingDiagonal);
-//end

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/solver/simple/simpleTravelingTournamentScoreRules.drl
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/solver/simple/simpleTravelingTournamentScoreRules.drl	2007-11-12 20:25:15 UTC (rev 16544)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/solver/simple/simpleTravelingTournamentScoreRules.drl	2007-11-12 21:02:37 UTC (rev 16545)
@@ -2,137 +2,118 @@
     dialect "java"
 
 import org.drools.solver.core.score.calculator.HardAndSoftConstraintScoreCalculator;
+import org.drools.solver.core.score.constraint.ConstraintOccurrence;
+import org.drools.solver.core.score.constraint.ConstraintType;
 
 import org.drools.solver.examples.travelingtournament.domain.Match;
 import org.drools.solver.examples.travelingtournament.domain.Day;
 import org.drools.solver.examples.travelingtournament.domain.Team;
 import org.drools.solver.examples.travelingtournament.domain.TravelingTournament;
 import org.drools.solver.examples.travelingtournament.solver.domain.Hop;
-import org.drools.solver.core.score.constraint.ConstraintOccurrence;
 
 global HardAndSoftConstraintScoreCalculator scoreCalculator;
 
-//query "multipleMatchesPerTeamPerDay"
-//    $team : Team();
-//    Match( $id : id, homeTeam == $team, $day : day )
-//        || Match( $id : id, awayTeam == $team, $day : day );
-//    exists Match( id > $id, homeTeam == $team, day == $day )
-//        || exists Match(id > $id, awayTeam == $team, day == $day );
-//end
-//
-//query "fourConsecutiveHomeMatches"
-//    Match($homeTeam : homeTeam, $day1 : day);
-//    Match(homeTeam == $homeTeam, eval(day.getIndex() == == $day1.getIndex() + 1));
-//    Match(homeTeam == $homeTeam, eval(day.getIndex() == == $day1.getIndex() + 2));
-//    Match(homeTeam == $homeTeam, eval(day.getIndex() == == $day1.getIndex() + 3));
-//end
-//
-//query "fourConsecutiveAwayMatches"
-//    Match($awayTeam : awayTeam, $day1 : day);
-//    Match(awayTeam == $awayTeam, $day2 : day -> ($day2.getIndex() == $day1.getIndex() + 1));
-//    Match(awayTeam == $awayTeam, $day3 : day -> ($day3.getIndex() == $day1.getIndex() + 2));
-//    Match(awayTeam == $awayTeam, $day4 : day -> ($day4.getIndex() == $day1.getIndex() + 3));
-//end
-//
-//query "matchRepeater"
-//    Match($homeTeam : homeTeam, $awayTeam : awayTeam, $day1 : day);
-//    Match(homeTeam == $awayTeam, awayTeam == $homeTeam, $day2 : day -> ($day2.getIndex() == $day1.getIndex() + 1));
-//end
+// ############################################################################
+// Hard constraints
+// ############################################################################
 
 rule "multipleMatchesPerTeamPerDay"
-  when
-    $team : Team();
-    $m : Match( $id : id, homeTeam == $team, $day : day )
-        || $m : Match( $id : id, awayTeam == $team, $day : day );
-    exists Match( id > $id, homeTeam == $team, day == $day )
-        || exists Match(id > $id, awayTeam == $team, day == $day );
-  then
-    insertLogical(new ConstraintOccurrence("multipleMatchesPerTeamPerDay", $m));
+    when
+        $team : Team();
+        $m : Match( $id : id, homeTeam == $team, $day : day )
+                || $m : Match( $id : id, awayTeam == $team, $day : day );
+        exists Match( id > $id, homeTeam == $team, day == $day )
+                || exists Match(id > $id, awayTeam == $team, day == $day );
+    then
+        insertLogical(new ConstraintOccurrence("multipleMatchesPerTeamPerDay", $m));
 end
 
 rule "fourConsecutiveHomeMatches"
-  when
-    $m : Match($homeTeam : homeTeam, $day1 : day);
-    Match(homeTeam == $homeTeam, eval(day.getIndex() == $day1.getIndex() + 1));
-    Match(homeTeam == $homeTeam, eval(day.getIndex() == $day1.getIndex() + 2));
-    Match(homeTeam == $homeTeam, eval(day.getIndex() == $day1.getIndex() + 3));
-  then
-    insertLogical(new ConstraintOccurrence("fourConsecutiveHomeMatches", $m));
+    when
+        $m : Match($homeTeam : homeTeam, $day1 : day);
+        Match(homeTeam == $homeTeam, eval(day.getIndex() == $day1.getIndex() + 1));
+        Match(homeTeam == $homeTeam, eval(day.getIndex() == $day1.getIndex() + 2));
+        Match(homeTeam == $homeTeam, eval(day.getIndex() == $day1.getIndex() + 3));
+    then
+        insertLogical(new ConstraintOccurrence("fourConsecutiveHomeMatches", $m));
 end
 
 rule "fourConsecutiveAwayMatches"
-  when
-    $m : Match($awayTeam : awayTeam, $day1 : day);
-    Match(awayTeam == $awayTeam, eval(day.getIndex() == $day1.getIndex() + 1));
-    Match(awayTeam == $awayTeam, eval(day.getIndex() == $day1.getIndex() + 2));
-    Match(awayTeam == $awayTeam, eval(day.getIndex() == $day1.getIndex() + 3));
-  then
-    insertLogical(new ConstraintOccurrence("fourConsecutiveAwayMatches", $m));
+    when
+        $m : Match($awayTeam : awayTeam, $day1 : day);
+        Match(awayTeam == $awayTeam, eval(day.getIndex() == $day1.getIndex() + 1));
+        Match(awayTeam == $awayTeam, eval(day.getIndex() == $day1.getIndex() + 2));
+        Match(awayTeam == $awayTeam, eval(day.getIndex() == $day1.getIndex() + 3));
+    then
+        insertLogical(new ConstraintOccurrence("fourConsecutiveAwayMatches", $m));
 end
 
 rule "matchRepeater"
-  when
-    $m : Match($homeTeam : homeTeam, $awayTeam : awayTeam, $day1 : day);
-    Match(homeTeam == $awayTeam, awayTeam == $homeTeam, eval(day.getIndex() == $day1.getIndex() + 1));
-  then
-    insertLogical(new ConstraintOccurrence("matchRepeater", $m));
+    when
+        $m : Match($homeTeam : homeTeam, $awayTeam : awayTeam, $day1 : day);
+        Match(homeTeam == $awayTeam, awayTeam == $homeTeam, eval(day.getIndex() == $day1.getIndex() + 1));
+    then
+        insertLogical(new ConstraintOccurrence("matchRepeater", $m));
 end
 
 rule "hardConstraintsBroken"
-    salience -1 // Finish the other rules first (optional, for performance)
-  when
-    $hardCount : Long() from accumulate(
-       $w : ConstraintOccurrence(),
-       count($w)
-    );
-  then
-    scoreCalculator.setHardConstraintsBroken($hardCount.intValue());
+        salience -1 // Finish the other rules first (optional, for performance)
+    when
+        $hardCount : Number() from accumulate(
+            $constraintOccurrence : ConstraintOccurrence(),
+            count($constraintOccurrence)
+        );
+    then
+        scoreCalculator.setHardConstraintsBroken($hardCount.intValue());
 end
 
+// ############################################################################
+// Soft constraints
+// ############################################################################
 
 rule "startToAwayHop"
-  when
-    Match($toTeam : homeTeam, $team : awayTeam, $day : day);
-    not Day(eval(index == $day.getIndex() - 1));
-  then
-    insertLogical(new Hop($team, $team, $toTeam));
+    when
+        Match($toTeam : homeTeam, $team : awayTeam, $day : day);
+        not Day(eval(index == $day.getIndex() - 1));
+    then
+        insertLogical(new Hop($team, $team, $toTeam));
 end
 rule "homeToAwayHop"
-  when
-    Match($team : homeTeam, $day1 : day);
-    Match($toTeam : homeTeam, awayTeam == $team, eval(day.getIndex() == $day1.getIndex() + 1));
-  then
-    insertLogical(new Hop($team, $team, $toTeam));
+    when
+        Match($team : homeTeam, $day1 : day);
+        Match($toTeam : homeTeam, awayTeam == $team, eval(day.getIndex() == $day1.getIndex() + 1));
+    then
+        insertLogical(new Hop($team, $team, $toTeam));
 end
 rule "awayToAwayHop"
-  when
-    Match($fromTeam : homeTeam, $team : awayTeam, $day1 : day);
-    Match($toTeam : homeTeam, awayTeam == $team, eval(day.getIndex() == $day1.getIndex() + 1));
-  then
-    insertLogical(new Hop($team, $fromTeam, $toTeam));
+    when
+        Match($fromTeam : homeTeam, $team : awayTeam, $day1 : day);
+        Match($toTeam : homeTeam, awayTeam == $team, eval(day.getIndex() == $day1.getIndex() + 1));
+    then
+        insertLogical(new Hop($team, $fromTeam, $toTeam));
 end
 rule "awayToHomeHop"
-  when
-    Match($fromTeam : homeTeam, $team : awayTeam, $day1 : day);
-    Match(homeTeam == $team, eval(day.getIndex() == $day1.getIndex() + 1));
-  then
-    insertLogical(new Hop($team, $fromTeam, $team));
+    when
+        Match($fromTeam : homeTeam, $team : awayTeam, $day1 : day);
+        Match(homeTeam == $team, eval(day.getIndex() == $day1.getIndex() + 1));
+    then
+        insertLogical(new Hop($team, $fromTeam, $team));
 end
 rule "awayToEndHop"
-  when
-    Match($fromTeam : homeTeam, $team : awayTeam, $day : day);
-    not Day(eval(index == $day.getIndex() + 1));
-  then
-    insertLogical(new Hop($team, $fromTeam, $team));
+    when
+        Match($fromTeam : homeTeam, $team : awayTeam, $day : day);
+        not Day(eval(index == $day.getIndex() + 1));
+    then
+        insertLogical(new Hop($team, $fromTeam, $team));
 end
 
 rule "softConstraintsBroken"
-    salience -1 // Finish the other rules first (optional, for performance)
-  when
-    $totalDistance : Double() from accumulate(
-       Hop($distance : distance),
-       sum($distance)
-    );
-  then
-    scoreCalculator.setSoftConstraintsBroken($totalDistance.intValue());
-end
\ No newline at end of file
+        salience -1 // Finish the other rules first (optional, for performance)
+    when
+        $totalDistance : Double() from accumulate(
+            Hop($distance : distance),
+            sum($distance)
+        );
+    then
+        scoreCalculator.setSoftConstraintsBroken($totalDistance.intValue());
+end

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/solver/smart/smartTravelingTournamentScoreRules.drl
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/solver/smart/smartTravelingTournamentScoreRules.drl	2007-11-12 20:25:15 UTC (rev 16544)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/solver/smart/smartTravelingTournamentScoreRules.drl	2007-11-12 21:02:37 UTC (rev 16545)
@@ -2,37 +2,23 @@
     dialect "java"
 
 import org.drools.solver.core.score.calculator.HardAndSoftConstraintScoreCalculator;
+import org.drools.solver.core.score.constraint.ConstraintOccurrence;
+import org.drools.solver.core.score.constraint.ConstraintType;
 
 import org.drools.solver.examples.travelingtournament.domain.Match;
 import org.drools.solver.examples.travelingtournament.domain.Day;
 import org.drools.solver.examples.travelingtournament.domain.Team;
 import org.drools.solver.examples.travelingtournament.domain.TravelingTournament;
 import org.drools.solver.examples.travelingtournament.solver.domain.Hop;
-import org.drools.solver.core.score.constraint.ConstraintOccurrence;
 
 global HardAndSoftConstraintScoreCalculator scoreCalculator;
 
+// ############################################################################
+// Hard constraints
+// ############################################################################
+
 // multipleMatchesPerTeamPerDay is obsolete because it is always 0
 
-//query "fourConsecutiveHomeMatches"
-//    Match($homeTeam : homeTeam, $day1 : day);
-//    Match(homeTeam == $homeTeam, eval(day.getIndex() == $day1.getIndex() + 1));
-//    Match(homeTeam == $homeTeam, eval(day.getIndex() == $day1.getIndex() + 2));
-//    Match(homeTeam == $homeTeam, eval(day.getIndex() == $day1.getIndex() + 3));
-//end
-//
-//query "fourConsecutiveAwayMatches"
-//    Match($awayTeam : awayTeam, $day1 : day);
-//    Match(awayTeam == $awayTeam, eval(day.getIndex() == $day1.getIndex() + 1));
-//    Match(awayTeam == $awayTeam, eval(day.getIndex() == $day1.getIndex() + 2));
-//    Match(awayTeam == $awayTeam, eval(day.getIndex() == $day1.getIndex() + 3));
-//end
-//
-//query "matchRepeater"
-//    Match($homeTeam : homeTeam, $awayTeam : awayTeam, $day1 : day);
-//    Match(homeTeam == $awayTeam, awayTeam == $homeTeam, eval(day.getIndex() == $day1.getIndex() + 1));
-//end
-
 rule "fourConsecutiveHomeMatches"
   when
     $m : Match($homeTeam : homeTeam, $day1 : day);
@@ -62,61 +48,64 @@
 end
 
 rule "hardConstraintsBroken"
-    salience -1 // Finish the other rules first (optional, for performance)
-  when
-    $hardCount : Number() from accumulate(
-       $w : ConstraintOccurrence(),
-       // countInteger($w) // Vote for http://jira.jboss.com/jira/browse/JBRULES-1075
-       count($w) // Vote for http://jira.jboss.com/jira/browse/JBRULES-1075
-    );
-  then
-    scoreCalculator.setHardConstraintsBroken($hardCount.intValue());
+        salience -1 // Finish the other rules first (optional, for performance)
+    when
+        $hardCount : Number() from accumulate(
+            $constraintOccurrence : ConstraintOccurrence(),
+            count($constraintOccurrence)
+        );
+    then
+        scoreCalculator.setHardConstraintsBroken($hardCount.intValue());
 end
 
+// ############################################################################
+// Soft constraints
+// ############################################################################
+
 rule "startToAwayHop"
-  when
-    Match($toTeam : homeTeam, $team : awayTeam, $day : day);
-    not Day(eval(index == $day.getIndex() - 1));
-  then
-    insertLogical(new Hop($team, $team, $toTeam));
+    when
+        Match($toTeam : homeTeam, $team : awayTeam, $day : day);
+        not Day(eval(index == $day.getIndex() - 1));
+    then
+        insertLogical(new Hop($team, $team, $toTeam));
 end
 rule "homeToAwayHop"
-  when
-    Match($team : homeTeam, $day1 : day);
-    Match($toTeam : homeTeam, awayTeam == $team, eval(day.getIndex() == $day1.getIndex() + 1));
-  then
-    insertLogical(new Hop($team, $team, $toTeam));
+    when
+        Match($team : homeTeam, $day1 : day);
+        Match($toTeam : homeTeam, awayTeam == $team, eval(day.getIndex() == $day1.getIndex() + 1));
+    then
+        insertLogical(new Hop($team, $team, $toTeam));
 end
 rule "awayToAwayHop"
-  when
-    Match($fromTeam : homeTeam, $team : awayTeam, $day1 : day);
-    Match($toTeam : homeTeam, awayTeam == $team, eval(day.getIndex() == $day1.getIndex() + 1));
-  then
-    insertLogical(new Hop($team, $fromTeam, $toTeam));
+    when
+        Match($fromTeam : homeTeam, $team : awayTeam, $day1 : day);
+        Match($toTeam : homeTeam, awayTeam == $team, eval(day.getIndex() == $day1.getIndex() + 1));
+    then
+        insertLogical(new Hop($team, $fromTeam, $toTeam));
 end
 rule "awayToHomeHop"
-  when
-    Match($fromTeam : homeTeam, $team : awayTeam, $day1 : day);
-    Match(homeTeam == $team, eval(day.getIndex() == $day1.getIndex() + 1));
-  then
-    insertLogical(new Hop($team, $fromTeam, $team));
+    when
+        Match($fromTeam : homeTeam, $team : awayTeam, $day1 : day);
+        Match(homeTeam == $team, eval(day.getIndex() == $day1.getIndex() + 1));
+    then
+        insertLogical(new Hop($team, $fromTeam, $team));
 end
 rule "awayToEndHop"
-  when
-    Match($fromTeam : homeTeam, $team : awayTeam, $day : day);
-    not Day(eval(index == $day.getIndex() + 1));
-  then
-    insertLogical(new Hop($team, $fromTeam, $team));
+    when
+        Match($fromTeam : homeTeam, $team : awayTeam, $day : day);
+        not Day(eval(index == $day.getIndex() + 1));
+    then
+        insertLogical(new Hop($team, $fromTeam, $team));
 end
 
 rule "softConstraintsBroken"
-    salience -1 // Finish the other rules first (optional, for performance)
-  when
-    $totalDistance : Number() from accumulate(
-      Hop($distance : distance),
-      // sumInteger($distance) // Vote for http://jira.jboss.com/jira/browse/JBRULES-1075
-      sum($distance) // Vote for http://jira.jboss.com/jira/browse/JBRULES-1075
-    );
-  then
-    scoreCalculator.setSoftConstraintsBroken($totalDistance.intValue());
+        salience -1 // Finish the other rules first (optional, for performance)
+    when
+        $totalDistance : Double() from accumulate(
+            Hop($distance : distance),
+            sum($distance)
+        );
+    then
+        scoreCalculator.setSoftConstraintsBroken($totalDistance.intValue());
 end
+




More information about the jboss-svn-commits mailing list