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