    001package org.cpsolver.studentsct.weights;
    002
    003import java.util.Set;
    004
    005import org.cpsolver.ifs.assignment.Assignment;
    006import org.cpsolver.ifs.solution.SolutionComparator;
    007import org.cpsolver.studentsct.extension.DistanceConflict;
    008import org.cpsolver.studentsct.extension.StudentQuality;
    009import org.cpsolver.studentsct.extension.TimeOverlapsCounter;
    010import org.cpsolver.studentsct.model.Enrollment;
    011import org.cpsolver.studentsct.model.Request;
    012
    013
    014/**
    015 * Interface to model various student weightings
    016 *
    017 * @version StudentSct 1.3 (Student Sectioning)<br>
    018 *          Copyright (C) 2007 - 2014 Tomáš Müller<br>
    019 *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
    020 *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
    021 * <br>
    022 *          This library is free software; you can redistribute it and/or modify
    023 *          it under the terms of the GNU Lesser General Public License as
    024 *          published by the Free Software Foundation; either version 3 of the
    025 *          License, or (at your option) any later version. <br>
    026 * <br>
    027 *          This library is distributed in the hope that it will be useful, but
    028 *          WITHOUT ANY WARRANTY; without even the implied warranty of
    029 *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    030 *          Lesser General Public License for more details. <br>
    031 * <br>
    032 *          You should have received a copy of the GNU Lesser General Public
    033 *          License along with this library; if not see
    034 *          <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
    035 */
    036
    037public interface StudentWeights extends SolutionComparator<Request, Enrollment> {
    038    /**
    039     * Return lower bound for the given request
    040     * @param request given request
    041     * @return weight of the best value
    042     */
    043    public double getBound(Request request);
    044
    045    /**
    046     * Return base weight of the given enrollment
    047     * @param assignment current assignment
    048     * @param enrollment given enrollment
    049     * @return weight (higher weight means better value)
    050     */
    051    public double getWeight(Assignment<Request, Enrollment> assignment, Enrollment enrollment);
    052
    053    /**
    054     * Return weight of the given enrollment
    055     * @param assignment current assignment
    056     * @param enrollment given enrollment
    057     * @param distanceConflicts distance conflicts
    058     * @param timeOverlappingConflicts time overlapping conflicts
    059     * @return weight (higher weight means better value)
    060     */
    061    public double getWeight(Assignment<Request, Enrollment> assignment, Enrollment enrollment, Set<DistanceConflict.Conflict> distanceConflicts, Set<TimeOverlapsCounter.Conflict> timeOverlappingConflicts);
    062
    063    /**
    064     * Return weight of the given enrollment
    065     * @param assignment current assignment
    066     * @param enrollment given enrollment
    067     * @param qualityConflicts student quality conflicts
    068     * @return weight (higher weight means better value)
    069     */
    070    public double getWeight(Assignment<Request, Enrollment> assignment, Enrollment enrollment, Set<StudentQuality.Conflict> qualityConflicts);
    071
    072    /**
    073     * Return weight of a distance conflict
    074     * @param assignment current assignment
    075     * @param distanceConflict distance conflict
    076     * @return weight of the conflict
    077     */
    078    public double getDistanceConflictWeight(Assignment<Request, Enrollment> assignment, DistanceConflict.Conflict distanceConflict);
    079
    080    /**
    081     * Return weight of a time overlapping conflict
    082     * @param assignment current assignment
    083     * @param enrollment enrollment in question
    084     * @param timeOverlap time overlapping conflict
    085     * @return weight of the conflict
    086     */
    087    public double getTimeOverlapConflictWeight(Assignment<Request, Enrollment> assignment, Enrollment enrollment, TimeOverlapsCounter.Conflict timeOverlap);
    088
    089    /**
    090     * Return weight of a student quality conflict
    091     * @param assignment current assignment
    092     * @param enrollment enrollment in question
    093     * @param conflict student quality conflict
    094     * @return weight of the conflict
    095     */
    096    public double getStudentQualityConflictWeight(Assignment<Request, Enrollment> assignment, Enrollment enrollment, StudentQuality.Conflict conflict);
    097
    098    /**
    099     * Return true if free time requests allow overlaps
    100     * @return true if free time overlaps are allowed, but the overlapping time is minimized
    101     */
    102    public boolean isFreeTimeAllowOverlaps();
    103
    104    /**
    105     * Registered implementation
    106     */
    107    public static enum Implementation {
    108        Priority(PriorityStudentWeights.class),
    109        Equal(EqualStudentWeights.class),
    110        Legacy(OriginalStudentWeights.class);
    111
    112        private Class<? extends StudentWeights> iImplementation;
    113        Implementation(Class<? extends StudentWeights> implementation) {
    114            iImplementation = implementation;
    115        }
    116
    117        public Class<? extends StudentWeights> getImplementation() { return iImplementation; }
    118    }
    119}