import java.util.*; import java.io.*; import static choco.Choco.*; import choco.cp.model.CPModel; import choco.cp.solver.CPSolver; import choco.kernel.model.Model; import choco.kernel.solver.Solver; import choco.kernel.model.variables.integer.IntegerVariable; public class Course { String name; ArrayList durations; int totalHours; ArrayList lectures; ArrayList years; // the years this course runs IntegerVariable semester; Model model; public Course(Model model, StringTokenizer st){ name = st.nextToken(); durations = new ArrayList(); totalHours = 0; this.model = model; lectures = new ArrayList(); years = new ArrayList(); semester = makeIntVar(name,0,1); int seqNo = 0; while (st.hasMoreTokens()){ int d = Integer.parseInt(st.nextToken()); if (d == -2){ // 2 lectures on same day Lecture lect1 = new Lecture(this,seqNo++); Lecture lect2 = new Lecture(this,seqNo++); lect1.sameDay(lect2); lectures.add(lect1); lectures.add(lect2); durations.add(-2); totalHours = totalHours + 2; lect2.newDay = true; } if (d == 1){ // 1 hour lecture Lecture lect = new Lecture(this,seqNo++); lectures.add(lect); durations.add(1); totalHours = totalHours + 1; lect.newDay = true; } if (d == 2){ // a 2 hour lecture Lecture lect1 = new Lecture(this,seqNo++); Lecture lect2 = new Lecture(this,seqNo++); lect1.meets(lect2); lectures.add(lect1); lectures.add(lect2); durations.add(2); totalHours = totalHours + 2; lect2.newDay = true; } if (d == 3){ // a 3 hour lecture Lecture lect1 = new Lecture(this,seqNo++); Lecture lect2 = new Lecture(this,seqNo++); Lecture lect3 = new Lecture(this,seqNo++); lect1.meets(lect2); lect2.meets(lect3); lectures.add(lect1); lectures.add(lect2); lectures.add(lect3); durations.add(3); totalHours = totalHours + 3; lect3.newDay = true; } if (d == 9){ // 3 lectures on same day Lecture lect1 = new Lecture(this,seqNo++); Lecture lect2 = new Lecture(this,seqNo++); Lecture lect3 = new Lecture(this,seqNo++); lect1.sameDay(lect2); lect1.sameDay(lect3); lect2.sameDay(lect3); lectures.add(lect1); lectures.add(lect2); lectures.add(lect3); durations.add(9); totalHours = totalHours + 3; lect3.newDay = true; } if (d == -20){ // 2 lectures, don't care lectures.add(new Lecture(this,seqNo++)); lectures.add(new Lecture(this,seqNo++)); durations.add(1); durations.add(1); totalHours = totalHours + 2; } if (d == -30){ // 3 lectures, don't care lectures.add(new Lecture(this,seqNo++)); lectures.add(new Lecture(this,seqNo++)); lectures.add(new Lecture(this,seqNo++)); durations.add(1); durations.add(1); durations.add(1); totalHours = totalHours + 3; } if (d == -40){ // 4 lectures, don't care lectures.add(new Lecture(this,seqNo++)); lectures.add(new Lecture(this,seqNo++)); lectures.add(new Lecture(this,seqNo++)); lectures.add(new Lecture(this,seqNo++)); durations.add(1); durations.add(1); durations.add(1); durations.add(1); totalHours = totalHours + 4; } } for (int i=0;i three lectures, all in same day // d = 2 <-> a 2 hour lecture, i.e. two one hour lectures that meet // d = 1 <-> normal 1 hour lecture, occurs on different days // // NOTE: a 2 hour lecture is modelled using 2 lectures that "meet" // that is, all lecture variables are 1 hour duration // void noConflicts(Course course){ for (Lecture lect1 : lectures) for (Lecture lect2 : course.lectures) lect1.notEqual(lect2); } // // this course and another course cannot have any lectures occuring at the same time // void prereq(Course course){ Lecture l1 = lectures.get(0); Lecture l2 = course.lectures.get(course.lectures.size()-1); l2.nextSemester(l1); } // // this is a prerequisite for course, // i.e. last lecture of this before first lecture in course // public String toString(){ return name +" "+ totalHours +" "+ durations +" number of lectures "+ lectures.size(); } void print(){ for (Lecture lect : lectures) System.out.println(lect.startTime); } public static void main(String[] args) throws IOException { Model model = new CPModel(); BufferedReader fin = new BufferedReader(new FileReader(args[0])); String b = fin.readLine(); boolean moreData = b != null; while (moreData){ StringTokenizer st = new StringTokenizer(b," "); Course course = new Course(model,st); System.out.println(course); moreData = (b = fin.readLine()) != null; } fin.close(); } }