    001package org.cpsolver.exam.model;
    002
    003/**
    004 * Representation of a room placement of an exam. It contains a room
    005 * {@link ExamRoom} and a penalty associated with a placement of an exam into
    006 * the given room. <br>
    007 * <br>
    008 *
    009 * @version ExamTT 1.3 (Examination Timetabling)<br>
    010 *          Copyright (C) 2008 - 2014 Tomáš Müller<br>
    011 *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
    012 *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
    013 * <br>
    014 *          This library is free software; you can redistribute it and/or modify
    015 *          it under the terms of the GNU Lesser General Public License as
    016 *          published by the Free Software Foundation; either version 3 of the
    017 *          License, or (at your option) any later version. <br>
    018 * <br>
    019 *          This library is distributed in the hope that it will be useful, but
    020 *          WITHOUT ANY WARRANTY; without even the implied warranty of
    021 *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    022 *          Lesser General Public License for more details. <br>
    023 * <br>
    024 *          You should have received a copy of the GNU Lesser General Public
    025 *          License along with this library; if not see
    026 *          <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
    027 */
    028public class ExamRoomPlacement implements Comparable<ExamRoomPlacement> {
    029    private ExamRoom iRoom;
    030    private int iPenalty = 0;
    031    private int iMaxPenalty = 100;
    032
    033    /**
    034     * Constructor
    035     *
    036     * @param room
    037     *            examination room
    038     */
    039    public ExamRoomPlacement(ExamRoom room) {
    040        iRoom = room;
    041    }
    042
    043    /**
    044     * Constructor
    045     *
    046     * @param room
    047     *            examination room
    048     * @param penalty
    049     *            penalty for using this room
    050     */
    051    public ExamRoomPlacement(ExamRoom room, int penalty) {
    052        this(room);
    053        iPenalty = penalty;
    054    }
    055
    056    /**
    057     * Constructor
    058     *
    059     * @param room
    060     *            examination room
    061     * @param penalty
    062     *            penalty for using this room
    063     * @param maxPenalty
    064     *            maximal penalty imposed of
    065     *            {@link ExamRoom#getPenalty(ExamPeriod)}, i.e., a placement
    066     *            with greater penalty is not allowed to be made
    067     */
    068    public ExamRoomPlacement(ExamRoom room, int penalty, int maxPenalty) {
    069        this(room, penalty);
    070        iMaxPenalty = maxPenalty;
    071    }
    072
    073    /** Examination room
    074     * @return examination room
    075     **/
    076    public ExamRoom getRoom() {
    077        return iRoom;
    078    }
    079
    080    /** Examination room id
    081     * @return examination room unique id
    082     **/
    083    public long getId() {
    084        return getRoom().getId();
    085    }
    086
    087    /** Examination room name
    088     * @return examination room name
    089     **/
    090    public String getName() {
    091        return getRoom().getName();
    092    }
    093
    094    /** Examination room availability
    095     * @param period given period
    096     * @return true if the given period is available in this room
    097     **/
    098    public boolean isAvailable(ExamPeriod period) {
    099        return iRoom.isAvailable(period) && iRoom.getPenalty(period) <= iMaxPenalty;
    100    }
    101
    102    /**
    103     * Penalty for assignment of an exam into this room
    104     * {@link Exam#getRoomPlacements()}
    105     * @return room assignment penalty
    106     */
    107    public int getPenalty() {
    108        return iPenalty;
    109    }
    110
    111    /**
    112     * Maximal penalty imposed of {@link ExamRoom#getPenalty(ExamPeriod)}, i.e.,
    113     * a placement with greater penalty is not allowed to be made
    114     * @return maximal penalty
    115     */
    116    public int getMaxPenalty() {
    117        return iMaxPenalty;
    118    }
    119
    120    /**
    121     * Penalty for assignment of an exam into this room
    122     * {@link Exam#getRoomPlacements()}
    123     * @param penalty room assignment penalty
    124     */
    125    public void setPenalty(int penalty) {
    126        iPenalty = penalty;
    127    }
    128
    129    /**
    130     * Maximal penalty imposed of {@link ExamRoom#getPenalty(ExamPeriod)}, i.e.,
    131     * a placement with greater penalty is not allowed to be made
    132     * @param maxPenalty maximal penalty
    133     */
    134    public void setMaxPenalty(int maxPenalty) {
    135        iMaxPenalty = maxPenalty;
    136    }
    137
    138    /**
    139     * Penalty for assignment of an exam into this room
    140     * {@link Exam#getRoomPlacements()} and the given examination period
    141
    142     * @param period given period
    143     * @return {@link ExamRoomPlacement#getPenalty()} +
    144     *         {@link ExamRoom#getPenalty(ExamPeriod)}
    145     */
    146    public int getPenalty(ExamPeriod period) {
    147        return 2 * iPenalty + iRoom.getPenalty(period);
    148        // return (iPenalty != 0 ? iPenalty : iRoom.getPenalty(period));
    149    }
    150
    151    /**
    152     * Room size
    153     *
    154     * @param altSeating
    155     *            examination seating (pass {@link Exam#hasAltSeating()})
    156     * @return room size or room alternative size, based on given seating
    157     */
    158    public int getSize(boolean altSeating) {
    159        return (altSeating ? getRoom().getAltSize() : getRoom().getSize());
    160    }
    161
    162    /**
    163     * Room distance
    164
    165     * @param other another placement
    166     * @return appropriate {@link ExamRoom#getDistanceInMeters(ExamRoom)}
    167     */
    168    public double getDistanceInMeters(ExamRoomPlacement other) {
    169        return getRoom().getDistanceInMeters(other.getRoom());
    170    }
    171
    172    /**
    173     * Hash code
    174     */
    175    @Override
    176    public int hashCode() {
    177        return getRoom().hashCode();
    178    }
    179
    180    @Override
    181    public String toString() {
    182        return getRoom().toString() + (getPenalty() == 0 ? "" : "/" + getPenalty());
    183    }
    184
    185    /** Compare two room placements for equality */
    186    @Override
    187    public boolean equals(Object o) {
    188        if (o == null)
    189            return false;
    190        if (o instanceof ExamRoomPlacement) {
    191            return getRoom().equals(((ExamRoomPlacement) o).getRoom());
    192        } else if (o instanceof ExamRoom) {
    193            return getRoom().equals(o);
    194        }
    195        return false;
    196    }
    197
    198    /** Compare two room placements */
    199    @Override
    200    public int compareTo(ExamRoomPlacement o) {
    201        return getRoom().compareTo(o.getRoom());
    202    }
    203}