001package org.cpsolver.exam.model;
002
003import java.util.HashMap;
004import java.util.HashSet;
005import java.util.Map;
006import java.util.Set;
007
008import org.cpsolver.ifs.assignment.Assignment;
009import org.cpsolver.ifs.assignment.context.AssignmentConstraintContext;
010
011
012public class ExamContext implements AssignmentConstraintContext<Exam, ExamPlacement> {
013    private Map<ExamStudent, Set<Exam>>[] iStudentTable;
014    private Map<ExamStudent, Set<Exam>>[] iStudentDayTable;
015    private Map<ExamInstructor, Set<Exam>>[] iInstructorTable;
016    private Map<ExamInstructor, Set<Exam>>[] iInstructorDayTable;
017    
018    @SuppressWarnings("unchecked")
019    public ExamContext(ExamModel model, Assignment<Exam, ExamPlacement> assignment) {
020        iStudentTable = new Map[model.getNrPeriods()];
021        for (int i = 0; i < iStudentTable.length; i++)
022            iStudentTable[i] = new HashMap<ExamStudent, Set<Exam>>();
023        iStudentDayTable = new Map[model.getNrDays()];
024        for (int i = 0; i < iStudentDayTable.length; i++)
025            iStudentDayTable[i] = new HashMap<ExamStudent, Set<Exam>>();
026        iInstructorTable = new Map[model.getNrPeriods()];
027        for (int i = 0; i < iInstructorTable.length; i++)
028            iInstructorTable[i] = new HashMap<ExamInstructor, Set<Exam>>();
029        iInstructorDayTable = new Map[model.getNrDays()];
030        for (int i = 0; i < iInstructorDayTable.length; i++)
031            iInstructorDayTable[i] = new HashMap<ExamInstructor, Set<Exam>>();
032        for (Exam exam: model.variables()) {
033            ExamPlacement placement = assignment.getValue(exam);
034            if (placement != null)
035                assigned(assignment, placement);
036        }
037    }
038
039    @Override
040    public void assigned(Assignment<Exam, ExamPlacement> assignment, ExamPlacement placement) {
041        int period = placement.getPeriod().getIndex();
042        int day = placement.getPeriod().getDay();
043        for (ExamStudent student: placement.variable().getStudents()) {
044            Set<Exam> examsThisPeriod = iStudentTable[period].get(student);
045            if (examsThisPeriod == null) {
046                examsThisPeriod = new HashSet<Exam>();
047                iStudentTable[period].put(student, examsThisPeriod);
048            }
049            examsThisPeriod.add(placement.variable());
050            Set<Exam> examsThisDay = iStudentDayTable[day].get(student);
051            if (examsThisDay == null) {
052                examsThisDay = new HashSet<Exam>();
053                iStudentDayTable[day].put(student, examsThisDay);
054            }
055            examsThisDay.add(placement.variable());
056        }
057        for (ExamInstructor instructor: placement.variable().getInstructors()) {
058            Set<Exam> examsThisPeriod = iInstructorTable[period].get(instructor);
059            if (examsThisPeriod == null) {
060                examsThisPeriod = new HashSet<Exam>();
061                iInstructorTable[period].put(instructor, examsThisPeriod);
062            }
063            examsThisPeriod.add(placement.variable());
064            Set<Exam> examsThisDay = iInstructorDayTable[day].get(instructor);
065            if (examsThisDay == null) {
066                examsThisDay = new HashSet<Exam>();
067                iInstructorDayTable[day].put(instructor, examsThisDay);
068            }
069            examsThisDay.add(placement.variable());
070        }
071    }
072    
073    @Override
074    public void unassigned(Assignment<Exam, ExamPlacement> assignment, ExamPlacement placement) {
075        int period = placement.getPeriod().getIndex();
076        int day = placement.getPeriod().getDay();
077        for (ExamStudent student: placement.variable().getStudents()) {
078            Set<Exam> examsThisPeriod = iStudentTable[period].get(student);
079            examsThisPeriod.remove(placement.variable());
080            if (examsThisPeriod.isEmpty())
081                iStudentTable[period].remove(student);
082            Set<Exam> examsThisDay = iStudentDayTable[day].get(student);
083            examsThisDay.remove(placement.variable());
084            if (examsThisDay.isEmpty())
085                iStudentDayTable[day].remove(student);
086        }for (ExamInstructor instructor: placement.variable().getInstructors()) {
087            Set<Exam> examsThisPeriod = iInstructorTable[period].get(instructor);
088            examsThisPeriod.remove(placement.variable());
089            if (examsThisPeriod.isEmpty())
090                iInstructorTable[period].remove(instructor);
091            Set<Exam> examsThisDay = iInstructorDayTable[day].get(instructor);
092            examsThisDay.remove(placement.variable());
093            if (examsThisDay.isEmpty())
094                iInstructorDayTable[day].remove(instructor);
095        }
096    }
097    
098    public Map<ExamStudent, Set<Exam>> getStudentsOfPeriod(int period) { return iStudentTable[period]; }
099    
100    public Map<ExamStudent, Set<Exam>> getStudentsOfDay(int day) { return iStudentDayTable[day]; }
101    
102    public Map<ExamInstructor, Set<Exam>> getInstructorsOfPeriod(int period) { return iInstructorTable[period]; }
103    
104    public Map<ExamInstructor, Set<Exam>> getInstructorsOfDay(int day) { return iInstructorDayTable[day]; }
105}