private Map<List<Integer>, Period> createPeriodListAndDayListAndTimeslotList(
     CurriculumCourseSchedule schedule, int dayListSize, int timeslotListSize)
     throws IOException {
   int periodListSize = dayListSize * timeslotListSize;
   Map<List<Integer>, Period> periodMap = new HashMap<List<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);
     day.setDayIndex(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);
     timeslot.setTimeslotIndex(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(Arrays.asList(i, j), period);
     }
   }
   schedule.setPeriodList(periodList);
   return periodMap;
 }
 private Map<String, Course> readCourseListAndTeacherList(
     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);
   readEmptyLine();
   readConstantLine("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 = splitBySpacesOrTabs(line, 5);
     course.setCode(lineTokens[0]);
     course.setTeacher(findOrCreateTeacher(teacherMap, lineTokens[1]));
     course.setLectureSize(Integer.parseInt(lineTokens[2]));
     course.setMinWorkingDaySize(Integer.parseInt(lineTokens[3]));
     course.setCurriculumList(new ArrayList<Curriculum>());
     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 void readUnavailablePeriodPenaltyList(
     CurriculumCourseSchedule schedule,
     Map<String, Course> courseMap,
     Map<List<Integer>, Period> periodMap,
     int unavailablePeriodPenaltyListSize)
     throws IOException {
   readEmptyLine();
   readConstantLine("UNAVAILABILITY_CONSTRAINTS:");
   List<UnavailablePeriodPenalty> penaltyList =
       new ArrayList<UnavailablePeriodPenalty>(unavailablePeriodPenaltyListSize);
   for (int i = 0; i < unavailablePeriodPenaltyListSize; i++) {
     UnavailablePeriodPenalty penalty = new UnavailablePeriodPenalty();
     penalty.setId((long) i);
     // Unavailability_Constraints: <CourseID> <Day> <Day_Period>
     String line = bufferedReader.readLine();
     String[] lineTokens = splitBySpacesOrTabs(line, 3);
     penalty.setCourse(courseMap.get(lineTokens[0]));
     int dayIndex = Integer.parseInt(lineTokens[1]);
     int timeslotIndex = Integer.parseInt(lineTokens[2]);
     Period period = periodMap.get(Arrays.asList(dayIndex, timeslotIndex));
     if (period == null) {
       throw new IllegalArgumentException(
           "Read line ("
               + line
               + ") uses an unexisting period("
               + dayIndex
               + " "
               + timeslotIndex
               + ").");
     }
     penalty.setPeriod(period);
     penaltyList.add(penalty);
   }
   schedule.setUnavailablePeriodPenaltyList(penaltyList);
 }
 private void createLectureList(CurriculumCourseSchedule schedule) {
   List<Course> courseList = schedule.getCourseList();
   List<Lecture> lectureList = new ArrayList<Lecture>(courseList.size());
   long id = 0L;
   for (Course course : courseList) {
     for (int i = 0; i < course.getLectureSize(); i++) {
       Lecture lecture = new Lecture();
       lecture.setId((long) id);
       id++;
       lecture.setCourse(course);
       lecture.setLectureIndexInCourse(i);
       // Notice that we leave the PlanningVariable properties on null
       lectureList.add(lecture);
     }
   }
   schedule.setLectureList(lectureList);
 }
 private void readRoomList(CurriculumCourseSchedule schedule, int roomListSize)
     throws IOException {
   readEmptyLine();
   readConstantLine("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 = splitBySpacesOrTabs(line, 2);
     room.setCode(lineTokens[0]);
     room.setCapacity(Integer.parseInt(lineTokens[1]));
     roomList.add(room);
   }
   schedule.setRoomList(roomList);
 }
 private void readCurriculumList(
     CurriculumCourseSchedule schedule, Map<String, Course> courseMap, int curriculumListSize)
     throws IOException {
   readEmptyLine();
   readConstantLine("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 = splitBySpacesOrTabs(line);
     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]);
       if (course == null) {
         throw new IllegalArgumentException(
             "Read line (" + line + ") uses an unexisting course(" + lineTokens[j] + ").");
       }
       course.getCurriculumList().add(curriculum);
     }
     curriculumList.add(curriculum);
   }
   schedule.setCurriculumList(curriculumList);
 }
    public Solution readSolution() throws IOException {
      CurriculumCourseSchedule schedule = new CurriculumCourseSchedule();
      schedule.setId(0L);
      // Name: ToyExample
      schedule.setName(readStringValue("Name:"));
      // Courses: 4
      int courseListSize = readIntegerValue("Courses:");
      // Rooms: 2
      int roomListSize = readIntegerValue("Rooms:");
      // Days: 5
      int dayListSize = readIntegerValue("Days:");
      // Periods_per_day: 4
      int timeslotListSize = readIntegerValue("Periods_per_day:");
      // Curricula: 2
      int curriculumListSize = readIntegerValue("Curricula:");
      // Constraints: 8
      int unavailablePeriodPenaltyListSize = readIntegerValue("Constraints:");

      Map<String, Course> courseMap = readCourseListAndTeacherList(schedule, courseListSize);
      readRoomList(schedule, roomListSize);
      Map<List<Integer>, Period> periodMap =
          createPeriodListAndDayListAndTimeslotList(schedule, dayListSize, timeslotListSize);
      readCurriculumList(schedule, courseMap, curriculumListSize);
      readUnavailablePeriodPenaltyList(
          schedule, courseMap, periodMap, unavailablePeriodPenaltyListSize);
      readEmptyLine();
      readConstantLine("END.");
      createLectureList(schedule);

      int possibleForOneLectureSize =
          schedule.getPeriodList().size() * schedule.getRoomList().size();
      BigInteger possibleSolutionSize =
          BigInteger.valueOf(possibleForOneLectureSize).pow(schedule.getLectureList().size());
      String flooredPossibleSolutionSize = "10^" + (possibleSolutionSize.toString().length() - 1);
      logger.info(
          "CurriculumCourseSchedule {} has {} teachers, {} curricula, {} courses, {} lectures,"
              + " {} periods, {} rooms and {} unavailable period constraints with a search space of {}.",
          getInputId(),
          schedule.getTeacherList().size(),
          schedule.getCurriculumList().size(),
          schedule.getCourseList().size(),
          schedule.getLectureList().size(),
          schedule.getPeriodList().size(),
          schedule.getRoomList().size(),
          schedule.getUnavailablePeriodPenaltyList().size(),
          flooredPossibleSolutionSize);
      return schedule;
    }