001package org.cpsolver.instructor.model;
002
003import org.cpsolver.ifs.assignment.Assignment;
004import org.cpsolver.ifs.criteria.Criterion;
005import org.cpsolver.ifs.model.Value;
006
007/**
008 * Teaching assignment. An assignment of an instructor to a teaching request (a set of sections of a course).
009 * A teaching assignment also contains the value of attribute, instructor, course, and time preferences. 
010 * 
011 * @version IFS 1.3 (Instructor Sectioning)<br>
012 *          Copyright (C) 2016 Tomáš Müller<br>
013 *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
014 *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
015 * <br>
016 *          This library is free software; you can redistribute it and/or modify
017 *          it under the terms of the GNU Lesser General Public License as
018 *          published by the Free Software Foundation; either version 3 of the
019 *          License, or (at your option) any later version. <br>
020 * <br>
021 *          This library is distributed in the hope that it will be useful, but
022 *          WITHOUT ANY WARRANTY; without even the implied warranty of
023 *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
024 *          Lesser General Public License for more details. <br>
025 * <br>
026 *          You should have received a copy of the GNU Lesser General Public
027 *          License along with this library; if not see
028 *          <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
029 */
030public class TeachingAssignment extends Value<TeachingRequest.Variable, TeachingAssignment> {
031    private Instructor iInstructor;
032    private int iHashCode;
033    private int iAttributePreference, iInstructorPreference, iCoursePreference, iTimePreference;
034
035    /**
036     * Constructor
037     * @param variable teaching request variable
038     * @param instructor instructor (it is expected that {@link Instructor#canTeach(TeachingRequest)} is true and that {@link TeachingRequest#getAttributePreference(Instructor)} is not prohibited)
039     * @param attributePreference attribute preference (value of {@link TeachingRequest#getAttributePreference(Instructor)})
040     */
041    public TeachingAssignment(TeachingRequest.Variable variable, Instructor instructor, int attributePreference) {
042        super(variable);
043        iInstructor = instructor;
044        iHashCode = variable.hashCode() ^ instructor.hashCode();
045        iTimePreference = instructor.getTimePreference(variable.getRequest()).getPreferenceInt();
046        iCoursePreference = instructor.getCoursePreference(variable.getCourse()).getPreference();
047        iInstructorPreference = variable.getRequest().getInstructorPreference(instructor).getPreference();
048        iAttributePreference = attributePreference;
049    }
050    
051    /**
052     * Constructor
053     * @param variable teaching request variable
054     * @param instructor instructor (it is expected that {@link Instructor#canTeach(TeachingRequest)} is true and that {@link TeachingRequest#getAttributePreference(Instructor)} is not prohibited)
055     */
056    public TeachingAssignment(TeachingRequest.Variable variable, Instructor instructor) {
057        this(variable, instructor, variable.getRequest().getAttributePreference(instructor).getPreferenceInt());
058    }
059
060    /**
061     * Assigned instructor
062     * @return assigned instructor
063     */
064    public Instructor getInstructor() {
065        return iInstructor;
066    }
067    
068    @Override
069    public double toDouble(Assignment<TeachingRequest.Variable, TeachingAssignment> assignment) {
070        double ret = 0.0;
071        for (Criterion<TeachingRequest.Variable, TeachingAssignment> criterion : variable().getModel().getCriteria())
072            ret += criterion.getWeightedValue(assignment, this, null);
073        return ret;
074    }
075
076    @Override
077    public boolean equals(Object o) {
078        if (o == null || !(o instanceof TeachingAssignment))
079            return false;
080        TeachingAssignment a = (TeachingAssignment) o;
081        return variable().equals(a.variable()) && getInstructor().equals(a.getInstructor());
082    }
083    
084    /**
085     * Attribute preference
086     * @return {@link TeachingRequest#getAttributePreference(Instructor)}
087     */
088    public int getAttributePreference() {
089        return iAttributePreference;
090    }
091    
092    /**
093     * Time preference
094     * @return {@link Instructor#getTimePreference(TeachingRequest)}
095     */
096    public int getTimePreference() {
097        return iTimePreference;
098    }
099    
100    /**
101     * Instructor preference
102     * @return {@link TeachingRequest#getInstructorPreference(Instructor) }
103     */
104    public int getInstructorPreference() {
105        return iInstructorPreference;
106    }
107    
108    /**
109     * Course preference
110     * @return {@link Instructor#getCoursePreference(Course)} for {@link TeachingRequest#getCourse()}
111     */
112    public int getCoursePreference() {
113        return iCoursePreference;
114    }
115
116    @Override
117    public int hashCode() {
118        return iHashCode;
119    }
120
121    @Override
122    public String toString() {
123        return variable().getName() + ": " + getInstructor().getName();
124    }
125
126    @Override
127    public String getName() {
128        return (getInstructor().hasName() ? getInstructor().getName() + (getInstructor().hasExternalId() ? " (" + getInstructor().getExternalId() + ")" : "") : getInstructor().getName());
129    }
130}