[jboss-svn-commits] JBL Code SVN: r17413 - in labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main: resources/org/drools/solver/examples/itc2007/examination/solver and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Dec 27 11:30:06 EST 2007


Author: ge0ffrey
Date: 2007-12-27 11:30:06 -0500 (Thu, 27 Dec 2007)
New Revision: 17413

Added:
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/TopicConflict.java
Modified:
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Examination.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationScoreRules.drl
Log:
usage of topicconflict for faster score calculation

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Examination.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Examination.java	2007-12-27 15:55:22 UTC (rev 17412)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Examination.java	2007-12-27 16:30:06 UTC (rev 17413)
@@ -101,6 +101,24 @@
         facts.addAll(periodHardConstraintList);
         facts.addAll(roomHardConstraintList);
         facts.addAll(examList);
+        // A faster alternative to the insertLogicalTopicConflicts rule.
+        List<TopicConflict> topicConflictList = new ArrayList<TopicConflict>();
+        for (Topic leftTopic : topicList) {
+            for (Topic rightTopic : topicList) {
+                if (leftTopic.getId() < rightTopic.getId()) {
+                    int studentSize = 0;
+                    for (Student student : leftTopic.getStudentList()) {
+                        if (rightTopic.getStudentList().contains(student)) {
+                            studentSize++;
+                        }
+                    }
+                    if (studentSize > 0) {
+                        topicConflictList.add(new TopicConflict(leftTopic, rightTopic, studentSize));
+                    }
+                }
+            }
+        }
+        facts.addAll(topicConflictList);
         return facts;
     }
 

Added: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/TopicConflict.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/TopicConflict.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/TopicConflict.java	2007-12-27 16:30:06 UTC (rev 17413)
@@ -0,0 +1,88 @@
+package org.drools.solver.examples.itc2007.examination.domain;
+
+import java.io.Serializable;
+
+import org.apache.commons.lang.builder.CompareToBuilder;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class TopicConflict implements Serializable {
+
+    private Topic leftTopic;
+    private Topic rightTopic;
+    private int studentSize;
+
+    public TopicConflict(Topic leftTopic, Topic rightTopic) {
+        this.leftTopic = leftTopic;
+        this.rightTopic = rightTopic;
+    }
+
+    public TopicConflict(Topic leftTopic, Topic rightTopic, int studentSize) {
+        this.leftTopic = leftTopic;
+        this.rightTopic = rightTopic;
+        this.studentSize = studentSize;
+    }
+
+    public Topic getLeftTopic() {
+        return leftTopic;
+    }
+
+    public void setLeftTopic(Topic leftTopic) {
+        this.leftTopic = leftTopic;
+    }
+
+    public Topic getRightTopic() {
+        return rightTopic;
+    }
+
+    public void setRightTopic(Topic rightTopic) {
+        this.rightTopic = rightTopic;
+    }
+
+    public int getStudentSize() {
+        return studentSize;
+    }
+
+    public void setStudentSize(int studentSize) {
+        this.studentSize = studentSize;
+    }
+
+    // TODO decide to keep or remove this object logicallyAsserted
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        } else if (o instanceof TopicConflict) {
+            TopicConflict other = (TopicConflict) o;
+            return new EqualsBuilder()
+                    .append(leftTopic, other.leftTopic)
+                    .append(rightTopic, other.rightTopic)
+                    .isEquals();
+        } else {
+            return false;
+        }
+    }
+
+    // TODO decide to keep or remove this object logicallyAsserted
+    public int hashCode() {
+        return new HashCodeBuilder()
+                .append(leftTopic)
+                .append(rightTopic)
+                .toHashCode();
+    }
+
+    public int compareTo(TopicConflict other) {
+        return new CompareToBuilder()
+                .append(leftTopic, other.leftTopic)
+                .append(rightTopic, other.rightTopic)
+                .toComparison();
+    }
+
+    @Override
+    public String toString() {
+        return leftTopic + " & " + rightTopic + " = " + studentSize;
+    }
+
+}
\ No newline at end of file

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-12-27 15:55:22 UTC (rev 17412)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationScoreRules.drl	2007-12-27 16:30:06 UTC (rev 17413)
@@ -16,11 +16,35 @@
 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.examples.itc2007.examination.domain.TopicConflict;
 
 import java.util.HashSet;
 
 global HardAndSoftConstraintScoreCalculator scoreCalculator;
 
+// This rule has horrible performance, scalability and memory consumption
+// It proved to be much better to do with basic java in the Examination.getFacts() method.
+//rule "insertLogicalTopicConflicts"
+//    when
+//        $leftTopic : Topic($id : id, $leftStudentList : studentList);
+//        $rightTopic : Topic(id > $id, $rightStudentList : studentList);
+//        // collect based implementation:
+//        $studentSet : HashSet( size > 0 )
+//            from collect(
+//                Student( this memberOf $leftStudentList, this memberOf $rightStudentList)
+//            );
+//        // accumulate based implementation:
+//        //$studentSize : Number(intValue > 0) from accumulate(
+//        //    $student : Student(this memberOf $leftStudentList, this memberOf $rightStudentList),
+//        //    count($student)
+//        //);
+//    then
+//        // collect based implementation:
+//        insertLogical(new TopicConflict($leftTopic, $rightTopic, $studentSet.size()));
+//        // accumulate based implementation:
+//        // insertLogical(new TopicConflict($leftTopic, $rightTopic, $studentSize.intValue()));
+//end
+
 // ############################################################################
 // Hard constraints
 // ############################################################################
@@ -28,12 +52,9 @@
 // Two exams in the same period which share students.
 rule "conflictingExamsInSamePeriod"
     when
-        $leftExam : Exam($id : id, $period : period, $leftStudentList : topic.studentList);
-        $rightExam : Exam(period == $period, id > $id, $rightStudentList : topic.studentList);
-        $studentSet : HashSet( size > 0 )
-            from collect(
-                Student( this memberOf $leftStudentList, this memberOf $rightStudentList)
-            );
+        $topicConflict : TopicConflict($leftTopic : leftTopic, $rightTopic : rightTopic);
+        $leftExam : Exam(topic == $leftTopic, $period : period);
+        $rightExam : Exam(topic == $rightTopic, period == $period);
     then
         insertLogical(new IntConstraintOccurrence("conflictingExamsInSamePeriod", ConstraintType.NEGATIVE_HARD,
             $leftExam, $rightExam));




More information about the jboss-svn-commits mailing list