001package org.cpsolver.coursett.sectioning;
002
003import java.util.ArrayList;
004import java.util.Collection;
005import java.util.List;
006
007import org.cpsolver.coursett.model.Lecture;
008
009/**
010 * A class wrapping an enrollment of a student into a course. Such an enrollment
011 * consists of a list of classes and a conflict weight. That is a weighted sum
012 * of the student conflicts (with other courses of the student) it creates.
013 * 
014 * @author  Tomáš Müller
015 * @version CourseTT 1.3 (University Course Timetabling)<br>
016 *          Copyright (C) 2017 Tomáš Müller<br>
017 *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
018 *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
019 * <br>
020 *          This library is free software; you can redistribute it and/or modify
021 *          it under the terms of the GNU Lesser General Public License as
022 *          published by the Free Software Foundation; either version 3 of the
023 *          License, or (at your option) any later version. <br>
024 * <br>
025 *          This library is distributed in the hope that it will be useful, but
026 *          WITHOUT ANY WARRANTY; without even the implied warranty of
027 *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
028 *          Lesser General Public License for more details. <br>
029 * <br>
030 *          You should have received a copy of the GNU Lesser General Public
031 *          License along with this library; if not see
032 *          <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
033 */
034public class SctEnrollment implements Comparable<SctEnrollment> {
035    private int iId;
036    private SctStudent iStudent;
037    private List<Lecture> iLectures;
038    private double iConflictWeight;
039    
040    /**
041     * @param id unique id
042     * @param student a student
043     * @param lectures list of classes
044     * @param conflictWeight conflict weight
045     */
046    public SctEnrollment(int id, SctStudent student, Collection<Lecture> lectures, double conflictWeight) {
047        iId = id;
048        iStudent = student;
049        iLectures = new ArrayList<Lecture>(lectures);
050        iConflictWeight = conflictWeight;
051    }
052    
053    /**
054     * @param id unique id
055     * @param student a student
056     * @param lectures list of classes
057     */
058    public SctEnrollment(int id, SctStudent student, Collection<Lecture> lectures) {
059        iId = id;
060        iStudent = student;
061        iLectures = new ArrayList<Lecture>(lectures);
062        iConflictWeight = 0;
063        for (Lecture lecture: lectures) {
064            for (Lecture other: student.getStudent().getLectures()) {
065                if (!lecture.getConfiguration().getOfferingId().equals(other.getConfiguration().getOfferingId()))
066                    iConflictWeight += student.getJenrConflictWeight(lecture, other);
067            }
068            for (Lecture other: lectures)
069                if (lecture.getClassId().compareTo(other.getClassId()) < 0)
070                    iConflictWeight += student.getJenrConflictWeight(lecture, other);
071        }
072    }
073    
074    /**
075     * Student
076     */
077    public SctStudent getStudent() { return iStudent; }
078    
079    /**
080     * List of classes of this enrollment
081     */
082    public List<Lecture> getLectures() { return iLectures; }
083    
084    /**
085     * Overall conflict weight
086     */
087    public double getConflictWeight() { return iConflictWeight; }
088
089    @Override
090    public int compareTo(SctEnrollment o) {
091        int cmp = Double.compare(getConflictWeight(), o.getConflictWeight());
092        if (cmp != 0) return cmp;
093        return Double.compare(iId, o.iId);
094    }
095    
096    public Integer getId() { return iId; }
097    
098    @Override
099    public String toString() {
100        return iConflictWeight + "/" + iLectures;
101    }
102}