[jboss-svn-commits] JBL Code SVN: r19183 - in labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007: curriculumcourse/persistence and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Mar 21 14:27:00 EDT 2008


Author: ge0ffrey
Date: 2008-03-21 14:27:00 -0400 (Fri, 21 Mar 2008)
New Revision: 19183

Added:
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/curriculumcourse/persistence/CurriculumCourseScheduleInputConvertor.java
Modified:
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/curriculumcourse/domain/Teacher.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/persistence/ExaminationInputConvertor.java
Log:
curruculumcourse input converter

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/curriculumcourse/domain/Teacher.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/curriculumcourse/domain/Teacher.java	2008-03-21 18:10:45 UTC (rev 19182)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/curriculumcourse/domain/Teacher.java	2008-03-21 18:27:00 UTC (rev 19183)
@@ -9,10 +9,25 @@
  */
 public class Teacher extends AbstractPersistable implements Comparable<Teacher> {
 
+    private String code;
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
     public int compareTo(Teacher other) {
         return new CompareToBuilder()
-                .append(id, other.id)
+                .append(code, other.code)
                 .toComparison();
     }
 
+    @Override
+    public String toString() {
+        return code;
+    }
+
 }
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/curriculumcourse/persistence/CurriculumCourseScheduleInputConvertor.java (from rev 18895, labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/persistence/ExaminationInputConvertor.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/curriculumcourse/persistence/CurriculumCourseScheduleInputConvertor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/curriculumcourse/persistence/CurriculumCourseScheduleInputConvertor.java	2008-03-21 18:27:00 UTC (rev 19183)
@@ -0,0 +1,283 @@
+package org.drools.solver.examples.itc2007.curriculumcourse.persistence;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.io.IOUtils;
+import org.drools.solver.examples.common.app.LoggingMain;
+import org.drools.solver.examples.common.persistence.XstreamSolutionDaoImpl;
+import org.drools.solver.examples.itc2007.curriculumcourse.domain.Course;
+import org.drools.solver.examples.itc2007.curriculumcourse.domain.Curriculum;
+import org.drools.solver.examples.itc2007.curriculumcourse.domain.CurriculumCourseSchedule;
+import org.drools.solver.examples.itc2007.curriculumcourse.domain.Day;
+import org.drools.solver.examples.itc2007.curriculumcourse.domain.Period;
+import org.drools.solver.examples.itc2007.curriculumcourse.domain.Room;
+import org.drools.solver.examples.itc2007.curriculumcourse.domain.Teacher;
+import org.drools.solver.examples.itc2007.curriculumcourse.domain.Timeslot;
+import org.drools.solver.examples.itc2007.curriculumcourse.domain.UnavailablePeriodConstraint;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class CurriculumCourseScheduleInputConvertor extends LoggingMain {
+
+    private static final String INPUT_FILE_SUFFIX = ".ctt";
+    private static final String OUTPUT_FILE_SUFFIX = ".xml";
+    private static final String SPLIT_REGEX = "[\\ \\t]+";
+
+    public static void main(String[] args) {
+        new CurriculumCourseScheduleInputConvertor().convert();
+    }
+
+    private final File inputDir = new File("data/itc2007/curriculumcourse/input/");
+    private final File outputDir = new File("data/itc2007/curriculumcourse/unsolved/");
+
+    public void convert() {
+        XstreamSolutionDaoImpl solutionDao = new XstreamSolutionDaoImpl();
+        File[] inputFiles = inputDir.listFiles();
+        if (inputFiles == null) {
+            throw new IllegalArgumentException(
+                    "Your working dir should be drools-solver-examples and contain: " + inputDir);
+        }
+        for (File inputFile : inputFiles) {
+            String inputFileName = inputFile.getName();
+            if (inputFileName.endsWith(INPUT_FILE_SUFFIX)) {
+                CurriculumCourseSchedule curriculumCourseSchedule = readCurriculumCourseSchedule(inputFile);
+                String outputFileName = inputFileName.substring(0, inputFileName.length() - INPUT_FILE_SUFFIX.length())
+                        + OUTPUT_FILE_SUFFIX;
+                File outputFile = new File(outputDir, outputFileName);
+                solutionDao.writeSolution(curriculumCourseSchedule, outputFile);
+            }
+        }
+    }
+
+    public CurriculumCourseSchedule readCurriculumCourseSchedule(File inputFile) {
+        BufferedReader bufferedReader = null;
+        try {
+            bufferedReader = new BufferedReader(new FileReader(inputFile));
+            return readCurriculumCourseSchedule(bufferedReader);
+        } catch (IOException e) {
+            throw new IllegalArgumentException(e);
+        } finally {
+            IOUtils.closeQuietly(bufferedReader);
+        }
+    }
+
+    public CurriculumCourseSchedule readCurriculumCourseSchedule(BufferedReader bufferedReader) throws IOException {
+        CurriculumCourseSchedule schedule = new CurriculumCourseSchedule();
+        schedule.setId(0L);
+        // Name: ToyExample
+        schedule.setName(readParam(bufferedReader, "Name:"));
+        // Courses: 4
+        int courseListSize = Integer.parseInt(readParam(bufferedReader, "Courses:"));
+        // Rooms: 2
+        int roomListSize = Integer.parseInt(readParam(bufferedReader, "Rooms:"));
+        // Days: 5
+        int dayListSize = Integer.parseInt(readParam(bufferedReader, "Days:"));
+        // Periods_per_day: 4
+        int timeslotListSize = Integer.parseInt(readParam(bufferedReader, "Periods_per_day:"));
+        // Curricula: 2
+        int curriculumListSize = Integer.parseInt(readParam(bufferedReader, "Curricula:"));
+        // Constraints: 8
+        int unavailablePeriodConstraintListSize = Integer.parseInt(readParam(bufferedReader, "Constraints:"));
+
+        Map<String, Course> courseMap = readCourseListAndTeacherList(bufferedReader,
+                schedule, courseListSize);
+        readRoomList(bufferedReader,
+                schedule, roomListSize);
+        Map<Integer[], Period> periodMap = createPeriodListAndDayListAndTimeslotList(
+                schedule, dayListSize, timeslotListSize);
+        readCurriculumList(bufferedReader,
+                schedule, courseMap, curriculumListSize);
+        readUnavailablePeriodConstraintList(bufferedReader,
+                schedule, courseMap, periodMap, unavailablePeriodConstraintListSize);
+        readHeader(bufferedReader, "END.");
+
+        logger.info("CurriculumCourseSchedule with {} teachers, {} curricula, {} courses, {} periods, {} rooms" +
+                " and {} unavailable period constraints.",
+                new Object[]{schedule.getTeacherList().size(),
+                        schedule.getCurriculumList().size(),
+                        schedule.getCourseList().size(),
+                        schedule.getPeriodList().size(),
+                        schedule.getRoomList().size(),
+                        schedule.getUnavailablePeriodConstraintList().size()});
+
+        // Note: lectureList stays null, that's work for the StartingSolutionInitializer
+        return schedule;
+    }
+
+    private Map<String, Course> readCourseListAndTeacherList(BufferedReader bufferedReader,
+            CurriculumCourseSchedule schedule, int courseListSize) throws IOException {
+        Map<String, Course> courseMap = new HashMap<String, Course>(courseListSize);
+        Map<String, Teacher> teacherMap = new HashMap<String, Teacher>();
+        List<Course> courseList = new ArrayList<Course>(courseListSize);
+        readHeader(bufferedReader, "COURSES:");
+        for (int i = 0; i < courseListSize; i++) {
+            Course course = new Course();
+            course.setId((long) i);
+            // Courses: <CourseID> <Teacher> <# Lectures> <MinWorkingDays> <# Students>
+            String line = bufferedReader.readLine();
+            String[] lineTokens = line.split(SPLIT_REGEX);
+            if (lineTokens.length != 5) {
+                throw new IllegalArgumentException("Read line (" + line + ") is expected to contain 4 tokens.");
+            }
+            course.setCode(lineTokens[0]);
+            course.setTeacher(findOrCreateTeacher(teacherMap, lineTokens[1]));
+            course.setLectureSize(Integer.parseInt(lineTokens[2]));
+            course.setMinWorkingDaySize(Integer.parseInt(lineTokens[3]));
+            course.setStudentSize(Integer.parseInt(lineTokens[4]));
+            courseList.add(course);
+            courseMap.put(course.getCode(), course);
+        }
+        schedule.setCourseList(courseList);
+        List<Teacher> teacherList = new ArrayList<Teacher>(teacherMap.values());
+        schedule.setTeacherList(teacherList);
+        return courseMap;
+    }
+
+    private Teacher findOrCreateTeacher(Map<String, Teacher> teacherMap, String code) {
+        Teacher teacher = teacherMap.get(code);
+        if (teacher == null) {
+            teacher = new Teacher();
+            int id = teacherMap.size();
+            teacher.setId((long) id);
+            teacher.setCode(code);
+            teacherMap.put(code, teacher);
+        }
+        return teacher;
+    }
+
+    private void readRoomList(BufferedReader bufferedReader, CurriculumCourseSchedule schedule, int roomListSize)
+            throws IOException {
+        readHeader(bufferedReader, "ROOMS:");
+        List<Room> roomList = new ArrayList<Room>(roomListSize);
+        for (int i = 0; i < roomListSize; i++) {
+            Room room = new Room();
+            room.setId((long) i);
+            // Rooms: <RoomID> <Capacity>
+            String line = bufferedReader.readLine();
+            String[] lineTokens = line.split(SPLIT_REGEX);
+            if (lineTokens.length != 2) {
+                throw new IllegalArgumentException("Read line (" + line + ") is expected to contain 2 tokens.");
+            }
+            room.setCode(lineTokens[0]);
+            room.setCapacity(Integer.parseInt(lineTokens[1]));
+            roomList.add(room);
+        }
+        schedule.setRoomList(roomList);
+    }
+
+    private Map<Integer[], Period> createPeriodListAndDayListAndTimeslotList(
+            CurriculumCourseSchedule schedule, int dayListSize, int timeslotListSize) throws IOException {
+        int periodListSize = dayListSize * timeslotListSize;
+        Map<Integer[], Period> periodMap = new HashMap<Integer[], Period>(periodListSize);
+        List<Day> dayList = new ArrayList<Day>(dayListSize);
+        for (int i = 0; i < dayListSize; i++) {
+            Day day = new Day();
+            day.setId((long) i);
+            dayList.add(day);
+        }
+        schedule.setDayList(dayList);
+        List<Timeslot> timeslotList = new ArrayList<Timeslot>(timeslotListSize);
+        for (int i = 0; i < timeslotListSize; i++) {
+            Timeslot timeslot = new Timeslot();
+            timeslot.setId((long) i);
+            timeslotList.add(timeslot);
+        }
+        schedule.setTimeslotList(timeslotList);
+        List<Period> periodList = new ArrayList<Period>(periodListSize);
+        for (int i = 0; i < dayListSize; i++) {
+            for (int j = 0; j < timeslotListSize; j++) {
+                Period period = new Period();
+                period.setId((long) (i * timeslotListSize + j));
+                period.setDay(dayList.get(i));
+                period.setTimeslot(timeslotList.get(j));
+                periodList.add(period);
+                periodMap.put(new Integer[]{i, j}, period);
+            }
+        }
+        schedule.setPeriodList(periodList);
+        return periodMap;
+    }
+
+    private void readCurriculumList(BufferedReader bufferedReader, CurriculumCourseSchedule schedule,
+            Map<String, Course> courseMap, int curriculumListSize) throws IOException {
+        readHeader(bufferedReader, "CURRICULA:");
+        List<Curriculum> curriculumList = new ArrayList<Curriculum>(curriculumListSize);
+        for (int i = 0; i < curriculumListSize; i++) {
+            Curriculum curriculum = new Curriculum();
+            curriculum.setId((long) i);
+            // Curricula: <CurriculumID> <# Courses> <MemberID> ... <MemberID>
+            String line = bufferedReader.readLine();
+            String[] lineTokens = line.split(SPLIT_REGEX);
+            if (lineTokens.length < 2) {
+                throw new IllegalArgumentException("Read line (" + line
+                        + ") is expected to contain at least 2 tokens.");
+            }
+            curriculum.setCode(lineTokens[0]);
+            int coursesInCurriculum = Integer.parseInt(lineTokens[1]);
+            if (lineTokens.length != (coursesInCurriculum + 2)) {
+                throw new IllegalArgumentException("Read line (" + line + ") is expected to contain "
+                        + (coursesInCurriculum + 2) + " tokens.");
+            }
+            for (int j = 2; j < lineTokens.length; j++) {
+                Course course = courseMap.get(lineTokens[j]);
+                course.setCurriculum(curriculum);
+            }
+            curriculumList.add(curriculum);
+        }
+        schedule.setCurriculumList(curriculumList);
+    }
+
+    private void readUnavailablePeriodConstraintList(BufferedReader bufferedReader, CurriculumCourseSchedule schedule,
+            Map<String, Course> courseMap, Map<Integer[], Period> periodMap, int unavailablePeriodConstraintListSize)
+            throws IOException {
+        readHeader(bufferedReader, "UNAVAILABILITY_CONSTRAINTS:");
+        List<UnavailablePeriodConstraint> constraintList = new ArrayList<UnavailablePeriodConstraint>(
+                unavailablePeriodConstraintListSize);
+        for (int i = 0; i < unavailablePeriodConstraintListSize; i++) {
+            UnavailablePeriodConstraint constraint = new UnavailablePeriodConstraint();
+            constraint.setId((long) i);
+            // Unavailability_Constraints: <CourseID> <Day> <Day_Period>
+            String line = bufferedReader.readLine();
+            String[] lineTokens = line.split(SPLIT_REGEX);
+            if (lineTokens.length != 3) {
+                throw new IllegalArgumentException("Read line (" + line + ") is expected to contain 3 tokens.");
+            }
+            constraint.setCourse(courseMap.get(lineTokens[0]));
+            constraint.setPeriod(periodMap.get(new Integer[]{
+                    Integer.parseInt(lineTokens[1]), Integer.parseInt(lineTokens[2])}));
+            constraintList.add(constraint);
+        }
+        schedule.setUnavailablePeriodConstraintList(constraintList);
+    }
+
+    private String readParam(BufferedReader bufferedReader, String key) throws IOException {
+        String line = bufferedReader.readLine();
+        String[] lineTokens = line.split(SPLIT_REGEX);
+        if (lineTokens.length != 2 || !lineTokens[0].equals(key)) {
+            throw new IllegalArgumentException("Read line (" + line + ") is expected to contain 2 tokens"
+                    + " and start with \"" + key + "\".");
+        }
+        return lineTokens[1];
+    }
+
+    private void readHeader(BufferedReader bufferedReader, String header) throws IOException {
+        String line = bufferedReader.readLine();
+        if (line.length() != 0) {
+            throw new IllegalArgumentException("Read line (" + line + ") is expected to be empty"
+                    + " and be followed with a line \"" + header + "\".");
+        }
+        line = bufferedReader.readLine();
+        if (!line.equals(header)) {
+            throw new IllegalArgumentException("Read line (" + line + ") is expected to be \"" + header + "\".");
+        }
+    }
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/persistence/ExaminationInputConvertor.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/persistence/ExaminationInputConvertor.java	2008-03-21 18:10:45 UTC (rev 19182)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/persistence/ExaminationInputConvertor.java	2008-03-21 18:27:00 UTC (rev 19183)
@@ -127,10 +127,7 @@
             topicList.add(topic);
         }
         examination.setTopicList(topicList);
-        List<Student> studentList = new ArrayList<Student>(studentMap.size());
-        for (Student student : studentMap.values()) {
-            studentList.add(student);
-        }
+        List<Student> studentList = new ArrayList<Student>(studentMap.values());
         examination.setStudentList(studentList);
     }
 




More information about the jboss-svn-commits mailing list