[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