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