[jboss-svn-commits] JBL Code SVN: r27253 - in labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main: java/org/drools/solver/examples/patientadmissionschedule/domain/solver and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Jun 28 16:04:02 EDT 2009


Author: ge0ffrey
Date: 2009-06-28 16:04:01 -0400 (Sun, 28 Jun 2009)
New Revision: 27253

Added:
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/solver/AdmissionPartSpecialismMissingInRoom.java
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/Room.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/solver/AdmissionPartConflict.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/resources/org/drools/solver/examples/patientadmissionschedule/solver/patientAdmissionScheduleScoreRules.drl
Log:
pas: fix RoomSpecialism constraint

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 19:20:19 UTC (rev 27252)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/PatientAdmissionSchedule.java	2009-06-28 20:04:01 UTC (rev 27253)
@@ -12,6 +12,7 @@
 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;
+import org.drools.solver.examples.patientadmissionschedule.domain.solver.AdmissionPartSpecialismMissingInRoom;
 
 /**
  * @author Geoffrey De Smet
@@ -169,6 +170,7 @@
             facts.addAll(bedDesignationList);
         }
         facts.addAll(calculateAdmissionPartConflictList());
+        facts.addAll(calculateAdmissionPartSpecialismMissingInRoomList());
         return facts;
     }
 
@@ -188,6 +190,29 @@
         return admissionPartConflictList;
     }
 
+    private List<AdmissionPartSpecialismMissingInRoom> calculateAdmissionPartSpecialismMissingInRoomList() {
+        List<AdmissionPartSpecialismMissingInRoom> admissionPartSpecialismMissingInRoomList
+                = new ArrayList<AdmissionPartSpecialismMissingInRoom>();
+        for (AdmissionPart admissionPart : admissionPartList) {
+            if (admissionPart.getSpecialism() != null) {
+                for (Room room : roomList) {
+                    int mininumPriority = Integer.MAX_VALUE;
+                    for (RoomSpecialism roomSpecialism : room.getRoomSpecialismList()) {
+                        if (roomSpecialism.getSpecialism().equals(admissionPart.getSpecialism())) {
+                            mininumPriority = Math.min(mininumPriority, roomSpecialism.getPriority());
+                        }
+                    }
+                    int weight = (mininumPriority == Integer.MAX_VALUE) ? 2 : mininumPriority - 1;
+                    if (weight > 0) {
+                        admissionPartSpecialismMissingInRoomList.add(
+                                new AdmissionPartSpecialismMissingInRoom(admissionPart, room, mininumPriority));
+                    }
+                }
+            }
+        }
+        return admissionPartSpecialismMissingInRoomList;
+    }
+
     /**
      * Clone will only deep copy the bedDesignationList
      */

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/Room.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/Room.java	2009-06-28 19:20:19 UTC (rev 27252)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/Room.java	2009-06-28 20:04:01 UTC (rev 27253)
@@ -16,6 +16,7 @@
     private int capacity;
     private GenderLimitation genderLimitation;
 
+    private List<RoomSpecialism> roomSpecialismList;
     private List<RoomEquipment> roomEquipmentList;
 
     public String getName() {
@@ -50,6 +51,14 @@
         this.genderLimitation = genderLimitation;
     }
 
+    public List<RoomSpecialism> getRoomSpecialismList() {
+        return roomSpecialismList;
+    }
+
+    public void setRoomSpecialismList(List<RoomSpecialism> roomSpecialismList) {
+        this.roomSpecialismList = roomSpecialismList;
+    }
+
     public List<RoomEquipment> getRoomEquipmentList() {
         return roomEquipmentList;
     }

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/solver/AdmissionPartConflict.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/solver/AdmissionPartConflict.java	2009-06-28 19:20:19 UTC (rev 27252)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/solver/AdmissionPartConflict.java	2009-06-28 20:04:01 UTC (rev 27253)
@@ -47,27 +47,6 @@
         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)

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/solver/AdmissionPartSpecialismMissingInRoom.java (from rev 27236, labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/solver/AdmissionPartConflict.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/solver/AdmissionPartSpecialismMissingInRoom.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/domain/solver/AdmissionPartSpecialismMissingInRoom.java	2009-06-28 20:04:01 UTC (rev 27253)
@@ -0,0 +1,61 @@
+package org.drools.solver.examples.patientadmissionschedule.domain.solver;
+
+import java.io.Serializable;
+
+import org.apache.commons.lang.builder.CompareToBuilder;
+import org.drools.solver.examples.patientadmissionschedule.domain.AdmissionPart;
+import org.drools.solver.examples.patientadmissionschedule.domain.Room;
+
+/**
+ * Calculated during initialization, not modified during score calculation.
+ * @author Geoffrey De Smet
+ */
+public class AdmissionPartSpecialismMissingInRoom implements Serializable {
+
+    private AdmissionPart admissionPart;
+    private Room room;
+    private int weight;
+
+    public AdmissionPartSpecialismMissingInRoom(AdmissionPart admissionPart, Room room, int weight) {
+        this.admissionPart = admissionPart;
+        this.room = room;
+        this.weight = weight;
+    }
+
+    public AdmissionPart getAdmissionPart() {
+        return admissionPart;
+    }
+
+    public void setAdmissionPart(AdmissionPart admissionPart) {
+        this.admissionPart = admissionPart;
+    }
+
+    public Room getRoom() {
+        return room;
+    }
+
+    public void setRoom(Room room) {
+        this.room = room;
+    }
+
+    public int getWeight() {
+        return weight;
+    }
+
+    public void setWeight(int weight) {
+        this.weight = weight;
+    }
+
+    public int compareTo(AdmissionPartSpecialismMissingInRoom other) {
+        return new CompareToBuilder()
+                .append(admissionPart, other.admissionPart)
+                .append(room, other.room)
+                .toComparison();
+    }
+
+    @Override
+    public String toString() {
+        return admissionPart + " & " + room + " = " + weight;
+    }
+
+}
\ 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 19:20:19 UTC (rev 27252)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/patientadmissionschedule/persistence/PatientAdmissionScheduleInputConvertor.java	2009-06-28 20:04:01 UTC (rev 27253)
@@ -221,6 +221,7 @@
                             + ") is expected to contain even number of tokens (" + roomSpecialismTokens.length
                             + ") after 4th pipeline (|) seperated by a space ( ).");
                 }
+                List<RoomSpecialism> roomSpecialismListOfRoom = new ArrayList<RoomSpecialism>(roomSpecialismTokens.length / 2);
                 for (int j = 0; j < roomSpecialismTokens.length; j += 2) {
                     int priority = Integer.parseInt(roomSpecialismTokens[j]);
                     long specialismId = Long.parseLong(roomSpecialismTokens[j + 1]);
@@ -235,12 +236,14 @@
                         }
                         roomSpecialism.setSpecialism(specialism);
                         roomSpecialism.setPriority(priority);
+                        roomSpecialismListOfRoom.add(roomSpecialism);
                         roomSpecialismList.add(roomSpecialism);
                         roomSpecialismId++;
                     }
                 }
+                room.setRoomSpecialismList(roomSpecialismListOfRoom);
 
-                List<RoomEquipment> roomEquipmentOfRoomList = new ArrayList<RoomEquipment>(equipmentListSize);
+                List<RoomEquipment> roomEquipmentListOfRoom = new ArrayList<RoomEquipment>(equipmentListSize);
                 String[] roomEquipmentTokens = splitBySpace(lineTokens[5]);
                 if (roomEquipmentTokens.length != equipmentListSize) {
                     throw new IllegalArgumentException("Read line (" + line
@@ -254,7 +257,7 @@
                         roomEquipment.setId(roomEquipmentId);
                         roomEquipment.setRoom(room);
                         roomEquipment.setEquipment(indexToEquipmentMap.get(j));
-                        roomEquipmentOfRoomList.add(roomEquipment);
+                        roomEquipmentListOfRoom.add(roomEquipment);
                         roomEquipmentList.add(roomEquipment);
                         roomEquipmentId++;
                     } else if (hasEquipment != 0) {
@@ -262,7 +265,7 @@
                             + ") is expected to have 0 or 1 hasEquipment (" + hasEquipment + ").");
                     }
                 }
-                room.setRoomEquipmentList(roomEquipmentOfRoomList);
+                room.setRoomEquipmentList(roomEquipmentListOfRoom);
             }
             patientAdmissionSchedule.setRoomList(roomList);
             patientAdmissionSchedule.setRoomSpecialismList(roomSpecialismList);

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 19:20:19 UTC (rev 27252)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/patientadmissionschedule/solver/patientAdmissionScheduleScoreRules.drl	2009-06-28 20:04:01 UTC (rev 27253)
@@ -23,6 +23,7 @@
 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;
+import org.drools.solver.examples.patientadmissionschedule.domain.solver.AdmissionPartSpecialismMissingInRoom;
 
 // @author Geoffrey De Smet
 
@@ -43,7 +44,7 @@
         $rightBedDesignation : BedDesignation(admissionPart == $rightAdmissionPart, bed == $bed);
     then
         insertLogical(new IntConstraintOccurrence("sameBedInSameNight",
-                ConstraintType.NEGATIVE_HARD, $admissionPartConflict.getNightSize(),
+                ConstraintType.NEGATIVE_HARD, 100 * $admissionPartConflict.getNightSize(),
                 $leftBedDesignation, $rightBedDesignation));
 end
 
@@ -58,7 +59,7 @@
         $rightBedDesignation : BedDesignation(room == $room, admissionPart == $rightAdmissionPart);
     then
         insertLogical(new IntConstraintOccurrence("differentGenderInSameGenderRoomInSameNight",
-                ConstraintType.NEGATIVE_HARD, $admissionPartConflict.getNightSize(),
+                ConstraintType.NEGATIVE_HARD, 5 * $admissionPartConflict.getNightSize(),
                 $leftBedDesignation, $rightBedDesignation));
 end
 
@@ -111,15 +112,24 @@
 end
 
 // RoomSpecialism constraint
-rule "roomSpecialism"
+rule "roomSpecialismNotExists"
     when
-        $bedDesignation : BedDesignation($specialism : admissionPartSpecialism, $room : room);
+        $bedDesignation : BedDesignation(admissionPartSpecialism != null, $specialism : admissionPartSpecialism, $room : room);
         not RoomSpecialism(room == $room, specialism == $specialism);
     then
-        insertLogical(new IntConstraintOccurrence("roomSpecialism",
-                ConstraintType.NEGATIVE_SOFT, 10,
+        insertLogical(new IntConstraintOccurrence("roomSpecialismNotExists",
+                ConstraintType.NEGATIVE_SOFT, 20 * $bedDesignation.getAdmissionPart().getNightCount(),
                 $bedDesignation));
 end
+rule "roomSpecialismNotFirstPriority"
+    when
+        $bedDesignation : BedDesignation(admissionPartSpecialism != null, $specialism : admissionPartSpecialism, $room : room);
+        RoomSpecialism(priority > 1, room == $room, specialism == $specialism, $priority : priority);
+    then
+        insertLogical(new IntConstraintOccurrence("roomSpecialismNotFirstPriority",
+                ConstraintType.NEGATIVE_SOFT, 10 * ($priority - 1) * $bedDesignation.getAdmissionPart().getNightCount(),
+                $bedDesignation));
+end
 
 // PreferredPatientEquipment constraint
 rule "preferredPatientEquipment"




More information about the jboss-svn-commits mailing list