[jboss-svn-commits] JBL Code SVN: r27226 - in labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main: java/org/drools/solver/examples/itc2007/examination/domain and 9 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Jun 28 06:09:54 EDT 2009


Author: ge0ffrey
Date: 2009-06-28 06:09:54 -0400 (Sun, 28 Jun 2009)
New Revision: 27226

Added:
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/solver/AdmissionPartConflict.java
Modified:
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/curriculumcourse/domain/CurriculumCourseSchedule.java
   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/solver/TopicConflict.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/domain/LessonSchedule.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/manners2009/domain/Manners2009.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/domain/NQueens.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/PatientAdmissionSchedule.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/persistence/PatientAdmissionScheduleInputConvertor.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/domain/TravelingTournament.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/solver/patientAdmissionScheduleScoreRules.drl
Log:
pas: HB4 same bed conflict

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/curriculumcourse/domain/CurriculumCourseSchedule.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/curriculumcourse/domain/CurriculumCourseSchedule.java	2009-06-28 10:08:44 UTC (rev 27225)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/curriculumcourse/domain/CurriculumCourseSchedule.java	2009-06-28 10:09:54 UTC (rev 27226)
@@ -130,7 +130,7 @@
     }
 
     /**
-     * Clone will only deep copy the lectures
+     * Clone will only deep copy the lectureList
      */
     public CurriculumCourseSchedule cloneSolution() {
         CurriculumCourseSchedule clone = new CurriculumCourseSchedule();

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	2009-06-28 10:08:44 UTC (rev 27225)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/Examination.java	2009-06-28 10:09:54 UTC (rev 27226)
@@ -110,7 +110,7 @@
         if (isInitialized()) {
             facts.addAll(examList);
         }
-        // A faster alternative to the insertLogicalTopicConflicts rule.
+        // A faster alternative to a insertLogicalTopicConflicts rule.
         facts.addAll(calculateTopicConflictList());
         return facts;
     }
@@ -137,7 +137,7 @@
     }
 
     /**
-     * Clone will only deep copy the exams
+     * Clone will only deep copy the examList
      */
     public Examination cloneSolution() {
         Examination clone = new Examination();

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/solver/TopicConflict.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/solver/TopicConflict.java	2009-06-28 10:08:44 UTC (rev 27225)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/solver/TopicConflict.java	2009-06-28 10:09:54 UTC (rev 27226)
@@ -17,11 +17,6 @@
     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;
@@ -52,7 +47,6 @@
         this.studentSize = studentSize;
     }
 
-    // TODO decide to keep or remove this object logicallyAsserted
     public boolean equals(Object o) {
         if (this == o) {
             return true;
@@ -67,7 +61,6 @@
         }
     }
 
-    // TODO decide to keep or remove this object logicallyAsserted
     public int hashCode() {
         return new HashCodeBuilder()
                 .append(leftTopic)

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/domain/LessonSchedule.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/domain/LessonSchedule.java	2009-06-28 10:08:44 UTC (rev 27225)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/lessonschedule/domain/LessonSchedule.java	2009-06-28 10:09:54 UTC (rev 27226)
@@ -61,7 +61,7 @@
     }
 
     /**
-     * Clone will only deep copy the lessons
+     * Clone will only deep copy the lessonList
      */
     public LessonSchedule cloneSolution() {
         LessonSchedule clone = new LessonSchedule();

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/manners2009/domain/Manners2009.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/manners2009/domain/Manners2009.java	2009-06-28 10:08:44 UTC (rev 27225)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/manners2009/domain/Manners2009.java	2009-06-28 10:09:54 UTC (rev 27226)
@@ -92,7 +92,7 @@
     }
 
     /**
-     * Clone will only deep copy the matches
+     * Clone will only deep copy the seatDesignationList
      */
     public Manners2009 cloneSolution() {
         Manners2009 clone = new Manners2009();

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/domain/NQueens.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/domain/NQueens.java	2009-06-28 10:08:44 UTC (rev 27225)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/nqueens/domain/NQueens.java	2009-06-28 10:09:54 UTC (rev 27226)
@@ -44,7 +44,7 @@
     }
 
     /**
-     * Clone will only deep copy the queens
+     * Clone will only deep copy the queenList
      */
     public NQueens cloneSolution() {
         NQueens clone = new NQueens();

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/PatientAdmissionSchedule.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/PatientAdmissionSchedule.java	2009-06-28 10:08:44 UTC (rev 27225)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/PatientAdmissionSchedule.java	2009-06-28 10:09:54 UTC (rev 27226)
@@ -8,6 +8,10 @@
 import org.apache.commons.lang.builder.HashCodeBuilder;
 import org.drools.solver.core.solution.Solution;
 import org.drools.solver.examples.common.domain.AbstractPersistable;
+import org.drools.solver.examples.itc2007.examination.domain.solver.TopicConflict;
+import org.drools.solver.examples.itc2007.examination.domain.Topic;
+import org.drools.solver.examples.itc2007.examination.domain.Student;
+import org.drools.solver.examples.patientadmissionschedule.domain.solver.AdmissionPartConflict;
 
 /**
  * @author Geoffrey De Smet
@@ -164,11 +168,31 @@
         if (isInitialized()) {
             facts.addAll(bedDesignationList);
         }
+        facts.addAll(calculateAdmissionPartConflictList());
         return facts;
     }
 
+    private List<AdmissionPartConflict> calculateAdmissionPartConflictList() {
+        List<AdmissionPartConflict> admissionPartConflictList = new ArrayList<AdmissionPartConflict>();
+        for (AdmissionPart leftAdmissionPart : admissionPartList) {
+            for (AdmissionPart rightAdmissionPart : admissionPartList) {
+                if (leftAdmissionPart.getId() < rightAdmissionPart.getId()) {
+                    int firstNightIndex = Math.max(leftAdmissionPart.getFirstNight().getIndex(),
+                            rightAdmissionPart.getFirstNight().getIndex());
+                    int lastNightIndex = Math.min(leftAdmissionPart.getLastNight().getIndex(),
+                            rightAdmissionPart.getLastNight().getIndex());
+                    if (firstNightIndex <= lastNightIndex) {
+                        admissionPartConflictList.add(new AdmissionPartConflict(
+                                leftAdmissionPart, rightAdmissionPart, lastNightIndex - firstNightIndex + 1));
+                    }
+                }
+            }
+        }
+        return admissionPartConflictList;
+    }
+
     /**
-     * Clone will only deep copy the exams
+     * Clone will only deep copy the bedDesignationList
      */
     public PatientAdmissionSchedule cloneSolution() {
         PatientAdmissionSchedule clone = new PatientAdmissionSchedule();

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/solver/AdmissionPartConflict.java (from rev 27222, labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/domain/solver/TopicConflict.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/solver/AdmissionPartConflict.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/solver/AdmissionPartConflict.java	2009-06-28 10:09:54 UTC (rev 27226)
@@ -0,0 +1,83 @@
+package org.drools.solver.examples.patientadmissionschedule.domain.solver;
+
+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;
+import org.drools.solver.examples.patientadmissionschedule.domain.AdmissionPart;
+
+/**
+ * Calculated during initialization, not modified during score calculation.
+ * @author Geoffrey De Smet
+ */
+public class AdmissionPartConflict implements Serializable {
+
+    private AdmissionPart leftAdmissionPart;
+    private AdmissionPart rightAdmissionPart;
+    private int nightSize;
+
+    public AdmissionPartConflict(AdmissionPart leftAdmissionPart, AdmissionPart rightAdmissionPart, int nightSize) {
+        this.leftAdmissionPart = leftAdmissionPart;
+        this.rightAdmissionPart = rightAdmissionPart;
+        this.nightSize = nightSize;
+    }
+
+    public AdmissionPart getLeftAdmissionPart() {
+        return leftAdmissionPart;
+    }
+
+    public void setLeftAdmissionPart(AdmissionPart leftAdmissionPart) {
+        this.leftAdmissionPart = leftAdmissionPart;
+    }
+
+    public AdmissionPart getRightAdmissionPart() {
+        return rightAdmissionPart;
+    }
+
+    public void setRightAdmissionPart(AdmissionPart rightAdmissionPart) {
+        this.rightAdmissionPart = rightAdmissionPart;
+    }
+
+    public int getNightSize() {
+        return nightSize;
+    }
+
+    public void setNightSize(int nightSize) {
+        this.nightSize = nightSize;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        } else if (o instanceof AdmissionPartConflict) {
+            AdmissionPartConflict other = (AdmissionPartConflict) o;
+            return new EqualsBuilder()
+                    .append(leftAdmissionPart, other.leftAdmissionPart)
+                    .append(rightAdmissionPart, other.rightAdmissionPart)
+                    .isEquals();
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder()
+                .append(leftAdmissionPart)
+                .append(rightAdmissionPart)
+                .toHashCode();
+    }
+
+    public int compareTo(AdmissionPartConflict other) {
+        return new CompareToBuilder()
+                .append(leftAdmissionPart, other.leftAdmissionPart)
+                .append(rightAdmissionPart, other.rightAdmissionPart)
+                .toComparison();
+    }
+
+    @Override
+    public String toString() {
+        return leftAdmissionPart + " & " + rightAdmissionPart + " = " + nightSize;
+    }
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/persistence/PatientAdmissionScheduleInputConvertor.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/persistence/PatientAdmissionScheduleInputConvertor.java	2009-06-28 10:08:44 UTC (rev 27225)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/persistence/PatientAdmissionScheduleInputConvertor.java	2009-06-28 10:09:54 UTC (rev 27226)
@@ -2,31 +2,32 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.HashMap;
 
+import org.drools.solver.core.solution.Solution;
 import org.drools.solver.examples.common.persistence.AbstractInputConvertor;
-import org.drools.solver.examples.patientadmissionschedule.domain.PatientAdmissionSchedule;
-import org.drools.solver.examples.patientadmissionschedule.domain.Specialism;
+import org.drools.solver.examples.patientadmissionschedule.domain.AdmissionPart;
+import org.drools.solver.examples.patientadmissionschedule.domain.Bed;
 import org.drools.solver.examples.patientadmissionschedule.domain.Department;
 import org.drools.solver.examples.patientadmissionschedule.domain.DepartmentSpecialism;
 import org.drools.solver.examples.patientadmissionschedule.domain.Equipment;
-import org.drools.solver.examples.patientadmissionschedule.domain.Room;
-import org.drools.solver.examples.patientadmissionschedule.domain.RoomSpecialism;
+import org.drools.solver.examples.patientadmissionschedule.domain.Gender;
 import org.drools.solver.examples.patientadmissionschedule.domain.GenderLimitation;
-import org.drools.solver.examples.patientadmissionschedule.domain.RoomEquipment;
-import org.drools.solver.examples.patientadmissionschedule.domain.Bed;
 import org.drools.solver.examples.patientadmissionschedule.domain.Night;
 import org.drools.solver.examples.patientadmissionschedule.domain.Patient;
-import org.drools.solver.examples.patientadmissionschedule.domain.AdmissionPart;
+import org.drools.solver.examples.patientadmissionschedule.domain.PatientAdmissionSchedule;
+import org.drools.solver.examples.patientadmissionschedule.domain.PreferredPatientEquipment;
 import org.drools.solver.examples.patientadmissionschedule.domain.RequiredPatientEquipment;
-import org.drools.solver.examples.patientadmissionschedule.domain.PreferredPatientEquipment;
-import org.drools.solver.examples.patientadmissionschedule.domain.Gender;
-import org.drools.solver.core.solution.Solution;
+import org.drools.solver.examples.patientadmissionschedule.domain.Room;
+import org.drools.solver.examples.patientadmissionschedule.domain.RoomEquipment;
+import org.drools.solver.examples.patientadmissionschedule.domain.RoomSpecialism;
+import org.drools.solver.examples.patientadmissionschedule.domain.Specialism;
 
 /**
  * @author Geoffrey De Smet
+ * @author Wim Vancroonenburg
  */
 public class PatientAdmissionScheduleInputConvertor extends AbstractInputConvertor {
 
@@ -321,35 +322,37 @@
                 ensureEnoughNights(lastNightIndex);
                 Night endNight = indexToNightMap.get(lastNightIndex);
                 int patientNightListSize = endNight.getIndex() - firstNight.getIndex();
-
-                String[] admissionPartTokens = splitBySpace(lineTokens[2]);
-                if (admissionPartTokens.length % 2 != 1) {
+                // A patient with no nights doesn't have a admissionPart
+                if (patientNightListSize != 0) {
+                    String[] admissionPartTokens = splitBySpace(lineTokens[2]);
+                    if (admissionPartTokens.length % 2 != 1) {
+                    }
+                    int patientAdmissionPartListSize = Integer.parseInt(admissionPartTokens[0]);
+                    if (admissionPartTokens.length != ((patientAdmissionPartListSize * 2) + 1)) {
+                        throw new IllegalArgumentException("Read line (" + line
+                                + ") is expected to contain " + ((patientAdmissionPartListSize * 2) + 1)
+                                + " number of tokens after 2th pipeline (|).");
+                    }
+                    int nextFirstNightIndex = firstNight.getIndex();
+                    for (int j = 1; j < admissionPartTokens.length; j += 2) {
+                        long specialismId = Long.parseLong(admissionPartTokens[j]);
+                        int admissionPartNightListSize = Integer.parseInt(admissionPartTokens[j + 1]);
+                        AdmissionPart admissionPart = new AdmissionPart();
+                        admissionPart.setId(admissionPartId);
+                        admissionPart.setPatient(patient);
+                        admissionPart.setSpecialism(idToSpecialismMap.get(specialismId));
+                        admissionPart.setFirstNight(indexToNightMap.get(nextFirstNightIndex));
+                        admissionPart.setLastNight(indexToNightMap.get(nextFirstNightIndex + admissionPartNightListSize - 1));
+                        admissionPartList.add(admissionPart);
+                        admissionPartId++;
+                        nextFirstNightIndex += admissionPartNightListSize;
+                    }
+                    if (nextFirstNightIndex != nextFirstNightIndex) {
+                        throw new IllegalArgumentException("Read line (" + line
+                                + ") has patientNightListSize (" + patientNightListSize
+                                + ") different from the sum of admissionPartNightListSize (" + nextFirstNightIndex + ")");
+                    }
                 }
-                int patientAdmissionPartListSize = Integer.parseInt(admissionPartTokens[0]);
-                if (admissionPartTokens.length != ((patientAdmissionPartListSize * 2) + 1)) {
-                    throw new IllegalArgumentException("Read line (" + line
-                            + ") is expected to contain " + ((patientAdmissionPartListSize * 2) + 1)
-                            + " number of tokens after 2th pipeline (|).");
-                }
-                int nextFirstNightIndex = firstNight.getIndex();
-                for (int j = 1; j < admissionPartTokens.length; j += 2) {
-                    long specialismId = Long.parseLong(admissionPartTokens[j]);
-                    int admissionPartNightListSize = Integer.parseInt(admissionPartTokens[j + 1]);
-                    AdmissionPart admissionPart = new AdmissionPart();
-                    admissionPart.setId(admissionPartId);
-                    admissionPart.setPatient(patient);
-                    admissionPart.setSpecialism(idToSpecialismMap.get(specialismId));
-                    admissionPart.setFirstNight(indexToNightMap.get(nextFirstNightIndex));
-                    admissionPart.setLastNight(indexToNightMap.get(nextFirstNightIndex + admissionPartNightListSize - 1));
-                    admissionPartList.add(admissionPart);
-                    admissionPartId++;
-                    nextFirstNightIndex += admissionPartNightListSize;
-                }
-                if (nextFirstNightIndex != nextFirstNightIndex) {
-                    throw new IllegalArgumentException("Read line (" + line
-                            + ") has patientNightListSize (" + patientNightListSize
-                            + ") different from the sum of admissionPartNightListSize (" + nextFirstNightIndex + ")");
-                }
 
                 List<RequiredPatientEquipment> requiredPatientEquipmentOfPatientList = new ArrayList<RequiredPatientEquipment>(equipmentListSize);
                 String[] requiredPatientEquipmentTokens = splitBySpace(lineTokens[4]);

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/domain/TravelingTournament.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/domain/TravelingTournament.java	2009-06-28 10:08:44 UTC (rev 27225)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/travelingtournament/domain/TravelingTournament.java	2009-06-28 10:09:54 UTC (rev 27226)
@@ -57,7 +57,7 @@
     }
 
     /**
-     * Clone will only deep copy the matches
+     * Clone will only deep copy the matchList
      */
     public TravelingTournament cloneSolution() {
         TravelingTournament clone = new TravelingTournament();

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/solver/patientAdmissionScheduleScoreRules.drl
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/solver/patientAdmissionScheduleScoreRules.drl	2009-06-28 10:08:44 UTC (rev 27225)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/solver/patientAdmissionScheduleScoreRules.drl	2009-06-28 10:09:54 UTC (rev 27226)
@@ -5,18 +5,24 @@
 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;
-import org.drools.solver.examples.itc2007.examination.domain.InstitutionalWeighting;
-import org.drools.solver.examples.itc2007.examination.domain.Period;
-import org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraint;
-import org.drools.solver.examples.itc2007.examination.domain.PeriodHardConstraintType;
-import org.drools.solver.examples.itc2007.examination.domain.Room;
-import org.drools.solver.examples.itc2007.examination.domain.RoomHardConstraint;
-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 org.drools.solver.examples.patientadmissionschedule.domain.AdmissionPart;
+import org.drools.solver.examples.patientadmissionschedule.domain.Bed;
+import org.drools.solver.examples.patientadmissionschedule.domain.BedDesignation;
+import org.drools.solver.examples.patientadmissionschedule.domain.Department;
+import org.drools.solver.examples.patientadmissionschedule.domain.DepartmentSpecialism;
+import org.drools.solver.examples.patientadmissionschedule.domain.Equipment;
+import org.drools.solver.examples.patientadmissionschedule.domain.Gender;
+import org.drools.solver.examples.patientadmissionschedule.domain.GenderLimitation;
+import org.drools.solver.examples.patientadmissionschedule.domain.Night;
+import org.drools.solver.examples.patientadmissionschedule.domain.Patient;
+import org.drools.solver.examples.patientadmissionschedule.domain.PatientAdmissionSchedule;
+import org.drools.solver.examples.patientadmissionschedule.domain.PreferredPatientEquipment;
+import org.drools.solver.examples.patientadmissionschedule.domain.RequiredPatientEquipment;
+import org.drools.solver.examples.patientadmissionschedule.domain.Room;
+import org.drools.solver.examples.patientadmissionschedule.domain.RoomEquipment;
+import org.drools.solver.examples.patientadmissionschedule.domain.RoomSpecialism;
+import org.drools.solver.examples.patientadmissionschedule.domain.Specialism;
+import org.drools.solver.examples.patientadmissionschedule.domain.solver.AdmissionPartConflict;
 
 global HardAndSoftConstraintScoreCalculator scoreCalculator;
 
@@ -24,113 +30,18 @@
 // Hard constraints
 // ############################################################################
 
-// Two exams in the same period which share students.
-rule "conflictingExamsInSamePeriod"
+// Two admissionParts in the same bed for a number of nights.
+rule "conflictingBedDesignationInSameNight"
     when
-        $topicConflict : TopicConflict($leftTopic : leftTopic, $rightTopic : rightTopic);
-        $leftExam : Exam(topic == $leftTopic, $period : period);
-        $rightExam : Exam(topic == $rightTopic, period == $period);
+        $admissionPartConflict : AdmissionPartConflict($leftAdmissionPart : leftAdmissionPart, $rightAdmissionPart : rightAdmissionPart);
+        $leftBedDesignation : BedDesignation(admissionPart == $leftAdmissionPart, $bed : bed);
+        $rightBedDesignation : BedDesignation(admissionPart == $rightAdmissionPart, bed == $bed);
     then
-        insertLogical(new IntConstraintOccurrence("conflictingExamsInSamePeriod", ConstraintType.NEGATIVE_HARD,
-                $topicConflict.getStudentSize(),
-                $leftExam, $rightExam));
+        insertLogical(new IntConstraintOccurrence("conflictingBedDesignationInSameNight", ConstraintType.NEGATIVE_HARD,
+                $admissionPartConflict.getNightSize(),
+                $leftBedDesignation, $rightBedDesignation));
 end
 
-// More time required during a period than available in that period.
-rule "periodDurationTooShort"
-    when
-        $exam : Exam(eval(topicDuration > periodDuration));
-    then
-        insertLogical(new IntConstraintOccurrence("periodDurationTooShort", ConstraintType.NEGATIVE_HARD,
-                $exam.getTopicStudentSize(),
-                $exam));
-end
-
-// More seating required during a period in a room than available in that room.
-rule "roomCapacityTooSmall" // TODO improve performance, as it takes 50% of the performance
-    when
-        $period : Period();
-        $room : Room($capacity : capacity);
-        $totalStudentSize : Number(intValue > $capacity) from accumulate(
-            Exam(period == $period, room == $room, $studentSize : topicStudentSize),
-            sum($studentSize) // Vote for http://jira.jboss.com/jira/browse/JBRULES-1075
-        );
-        // HACK to fix wierd truth maintance behavior in drools
-        // because making weight part of the equals/hashcode doesn't cut it
-        not IntConstraintOccurrence(
-            ruleId == "roomCapacityTooSmall",
-            constraintType == ConstraintType.NEGATIVE_HARD,
-            causes contains $period, causes contains $room,
-            eval(weight != ($totalStudentSize.intValue() - $capacity))
-        );
-    then
-        insertLogical(new IntConstraintOccurrence("roomCapacityTooSmall", ConstraintType.NEGATIVE_HARD,
-                ($totalStudentSize.intValue() - $capacity),
-                $period, $room));
-end
-
-// Period hard constraints
-rule "periodHardConstraintExamCoincidence"
-    when
-        $periodHardConstraint : PeriodHardConstraint(
-            periodHardConstraintType == PeriodHardConstraintType.EXAM_COINCIDENCE,
-            $leftSideTopic : leftSideTopic,
-            $rightSideTopic : rightSideTopic
-        );
-        $leftExam : Exam(topic == $leftSideTopic, $leftSidePeriod : period);
-        $rightExam : Exam(topic == $rightSideTopic, period != $leftSidePeriod);
-        // LeftSide and rightSide don't share a student because those are filtered out in the InputConvertor
-    then
-        insertLogical(new IntConstraintOccurrence("periodHardConstraintExamCoincidence", ConstraintType.NEGATIVE_HARD,
-                ($leftSideTopic.getStudentSize() + $rightSideTopic.getStudentSize()),
-                $leftExam, $rightExam));
-end
-rule "periodHardConstraintExclusion"
-    when
-        $periodHardConstraint : PeriodHardConstraint(
-            periodHardConstraintType == PeriodHardConstraintType.EXCLUSION,
-            $leftSideTopic : leftSideTopic,
-            $rightSideTopic : rightSideTopic
-        );
-        $leftExam : Exam(topic == $leftSideTopic, $leftSidePeriod : period);
-        $rightExam : Exam(topic == $rightSideTopic, period == $leftSidePeriod);
-    then
-        insertLogical(new IntConstraintOccurrence("periodHardConstraintExclusion", ConstraintType.NEGATIVE_HARD,
-                ($leftSideTopic.getStudentSize() + $rightSideTopic.getStudentSize()),
-                $leftExam, $rightExam));
-end
-rule "periodHardConstraintAfter"
-    when
-        $periodHardConstraint : PeriodHardConstraint(
-            periodHardConstraintType == PeriodHardConstraintType.AFTER,
-            $leftSideTopic : leftSideTopic,
-            $rightSideTopic : rightSideTopic
-        );
-        $leftExam : Exam(topic == $leftSideTopic, $afterSidePeriod : period);
-        $rightExam : Exam(topic == $rightSideTopic, eval($afterSidePeriod.getPeriodIndex() <= period.getPeriodIndex()),
-            $beforeSidePeriod : period
-        );
-    then
-        insertLogical(new IntConstraintOccurrence("periodHardConstraintAfter", ConstraintType.NEGATIVE_HARD,
-                ($leftSideTopic.getStudentSize() + $rightSideTopic.getStudentSize()),
-                $leftExam, $rightExam));
-end
-
-// Room hard constraints
-rule "roomHardConstraintExclusive"
-    when
-        $roomHardConstraint : RoomHardConstraint(
-            roomHardConstraintType == RoomHardConstraintType.ROOM_EXCLUSIVE,
-            $topic : topic
-        );
-        $leftExam : Exam(topic == $topic, $room : room);
-        $rightExam : Exam(room == $room, topic != $topic, $otherTopic : topic);
-    then
-        insertLogical(new IntConstraintOccurrence("roomHardConstraintExclusive", ConstraintType.NEGATIVE_HARD,
-                ($topic.getStudentSize() + $otherTopic.getStudentSize()),
-                $leftExam, $rightExam));
-end
-
 // Accumulate hard constraints
 rule "hardConstraintsBroken"
         salience -1 // Finish the other rules first (optional, for performance)
@@ -147,110 +58,6 @@
 // Soft constraints
 // ############################################################################
 
-// Two exams in a row which share students
-rule "twoExamsInARow"
-    when
-        $institutionalWeighting : InstitutionalWeighting(twoInARowPenality != 0);
-        $topicConflict : TopicConflict($leftTopic : leftTopic, $rightTopic : rightTopic);
-        $leftExam : Exam(topic == $leftTopic, $leftPeriod : period);
-        $rightExam : Exam(topic == $rightTopic, $rightPeriod : period);
-        eval($leftPeriod.getDayIndex() == $rightPeriod.getDayIndex());
-        eval(Math.abs($leftPeriod.getPeriodIndex() - $rightPeriod.getPeriodIndex()) == 1);
-    then
-        insertLogical(new IntConstraintOccurrence("twoExamsInARow", ConstraintType.NEGATIVE_SOFT,
-                $topicConflict.getStudentSize() * $institutionalWeighting.getTwoInARowPenality(),
-                $leftExam, $rightExam));
-end
-
-// TODO check if merging twoExamsInARow and twoExamsInADay can be a noticable performance boost
-// Two exams in a day which share students
-rule "twoExamsInADay"
-    when
-        $institutionalWeighting : InstitutionalWeighting(twoInADayPenality != 0);
-        $topicConflict : TopicConflict($leftTopic : leftTopic, $rightTopic : rightTopic);
-        $leftExam : Exam(topic == $leftTopic, $leftPeriod : period);
-        $rightExam : Exam(topic == $rightTopic, $rightPeriod : period);
-        eval($leftPeriod.getDayIndex() == $rightPeriod.getDayIndex());
-        eval(Math.abs($leftPeriod.getPeriodIndex() - $rightPeriod.getPeriodIndex()) > 1);
-    then
-        insertLogical(new IntConstraintOccurrence("twoExamsInADay", ConstraintType.NEGATIVE_SOFT,
-                $topicConflict.getStudentSize() * $institutionalWeighting.getTwoInADayPenality(),
-                $leftExam, $rightExam));
-end
-
-// Exams which share students have to few periods between them
-rule "periodSpread"
-    when
-        $institutionalWeighting : InstitutionalWeighting(periodSpreadPenality != 0);
-        $topicConflict : TopicConflict($leftTopic : leftTopic, $rightTopic : rightTopic);
-        $leftExam : Exam(topic == $leftTopic, $leftPeriod : period);
-        $rightExam : Exam(topic == $rightTopic, $rightPeriod : period);
-        eval(Math.abs($leftPeriod.getPeriodIndex() - $rightPeriod.getPeriodIndex())
-            < ($institutionalWeighting.getPeriodSpreadLength() + 1));
-    then
-        insertLogical(new IntConstraintOccurrence("periodSpread", ConstraintType.NEGATIVE_SOFT,
-                $topicConflict.getStudentSize() * $institutionalWeighting.getPeriodSpreadPenality(),
-                $leftExam, $rightExam));
-end
-
-// Several exams in the same room and period have different durations
-rule "mixedDurations"
-    when
-        $institutionalWeighting : InstitutionalWeighting(mixedDurationPenality != 0);
-        $leftExam : Exam($leftId : id, $period : period, room != null, $room : room, $leftTopic : topic);
-        // 4 mixed durations of 100, 150, 200 and 200 should only result in 2 penalty's (for 100&150 and 100&200)
-        // leftExam has lowest id of the period+room combo
-        not Exam(period == $period, room == $room, id < $leftId);
-        // rightExam has a different duration
-        $rightExam : Exam(period == $period, room == $room, id > $leftId,
-            eval(topic.getDuration() != $leftTopic.getDuration()),
-            $rightId : id, $rightTopic : topic
-        );
-        // rightExam has the lowest id of the period+room+rightDuration combo
-        not Exam(period == $period, room == $room, id < $rightId,
-            eval(topic.getDuration() == $rightTopic.getDuration())
-        );
-    then
-        insertLogical(new IntConstraintOccurrence("mixedDurations", ConstraintType.NEGATIVE_SOFT,
-                $institutionalWeighting.getMixedDurationPenality(),
-                $leftExam, $rightExam));
-end
-
-// Larger Exams towards the beginning of the examination session
-rule "frontLoad"
-    when
-        $institutionalWeighting : InstitutionalWeighting(frontLoadPenality != 0);
-        $topic : Topic(frontLoadLarge == true);
-        $period : Period(frontLoadLast == true);
-        $exam : Exam(topic == $topic, period == $period);
-    then
-        insertLogical(new IntConstraintOccurrence("frontLoad", ConstraintType.NEGATIVE_SOFT,
-                $institutionalWeighting.getFrontLoadPenality(),
-                $exam));
-end
-
-// Period Penalty
-rule "periodPenalty"
-    when
-        $period : Period(penalty != 0);
-        $exam: Exam(period == $period);
-    then
-        insertLogical(new IntConstraintOccurrence("periodPenalty", ConstraintType.NEGATIVE_SOFT,
-                $period.getPenalty(),
-                $exam));
-end
-
-// Room Penalty
-rule "roomPenalty"
-    when
-        $room : Room(penalty != 0);
-        $exam: Exam(room == $room);
-    then
-        insertLogical(new IntConstraintOccurrence("roomPenalty", ConstraintType.NEGATIVE_SOFT,
-                $room.getPenalty(),
-                $exam));
-end
-
 // Accumulate soft constraints
 rule "softConstraintsBroken"
         salience -1 // Finish the other rules first (optional, for performance)




More information about the jboss-svn-commits mailing list