001package net.sf.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.2 (Examination Timetabling)<br> 010 * Copyright (C) 2008 - 2010 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 public ExamRoom getRoom() { 075 return iRoom; 076 } 077 078 /** Examination room id */ 079 public long getId() { 080 return getRoom().getId(); 081 } 082 083 /** Examination room name */ 084 public String getName() { 085 return getRoom().getName(); 086 } 087 088 /** Examination room availability */ 089 public boolean isAvailable(ExamPeriod period) { 090 return iRoom.isAvailable(period) && iRoom.getPenalty(period) <= iMaxPenalty; 091 } 092 093 /** 094 * Penalty for assignment of an exam into this room 095 * {@link Exam#getRoomPlacements()} 096 */ 097 public int getPenalty() { 098 return iPenalty; 099 } 100 101 /** 102 * Maximal penalty imposed of {@link ExamRoom#getPenalty(ExamPeriod)}, i.e., 103 * a placement with greater penalty is not allowed to be made 104 */ 105 public int getMaxPenalty() { 106 return iMaxPenalty; 107 } 108 109 /** 110 * Penalty for assignment of an exam into this room 111 * {@link Exam#getRoomPlacements()} 112 */ 113 public void setPenalty(int penalty) { 114 iPenalty = penalty; 115 } 116 117 /** 118 * Maximal penalty imposed of {@link ExamRoom#getPenalty(ExamPeriod)}, i.e., 119 * a placement with greater penalty is not allowed to be made 120 */ 121 public void setMaxPenalty(int maxPenalty) { 122 iMaxPenalty = maxPenalty; 123 } 124 125 /** 126 * Penalty for assignment of an exam into this room 127 * {@link Exam#getRoomPlacements()} and the given examination period 128 * 129 * @return {@link ExamRoomPlacement#getPenalty()} + 130 * {@link ExamRoom#getPenalty(ExamPeriod)} 131 */ 132 public int getPenalty(ExamPeriod period) { 133 return 2 * iPenalty + iRoom.getPenalty(period); 134 // return (iPenalty != 0 ? iPenalty : iRoom.getPenalty(period)); 135 } 136 137 /** 138 * Room size 139 * 140 * @param altSeating 141 * examination seeting (pass {@link Exam#hasAltSeating()}) 142 * @return room size or room alternative size, based on given seating 143 */ 144 public int getSize(boolean altSeating) { 145 return (altSeating ? getRoom().getAltSize() : getRoom().getSize()); 146 } 147 148 /** 149 * Room distance 150 * 151 * @return appropriate {@link ExamRoom#getDistanceInMeters(ExamRoom)} 152 */ 153 public double getDistanceInMeters(ExamRoomPlacement other) { 154 return getRoom().getDistanceInMeters(other.getRoom()); 155 } 156 157 /** 158 * Hash code 159 */ 160 @Override 161 public int hashCode() { 162 return getRoom().hashCode(); 163 } 164 165 @Override 166 public String toString() { 167 return getRoom().toString() + (getPenalty() == 0 ? "" : "/" + getPenalty()); 168 } 169 170 /** Compare two room placements for equality */ 171 @Override 172 public boolean equals(Object o) { 173 if (o == null) 174 return false; 175 if (o instanceof ExamRoomPlacement) { 176 return getRoom().equals(((ExamRoomPlacement) o).getRoom()); 177 } else if (o instanceof ExamRoom) { 178 return getRoom().equals(o); 179 } 180 return false; 181 } 182 183 /** Compare two room placements */ 184 @Override 185 public int compareTo(ExamRoomPlacement o) { 186 return getRoom().compareTo(o.getRoom()); 187 } 188}