001package net.sf.cpsolver.exam.model; 002 003/** 004 * Representation of an examination period. Examination timetabling model 005 * contains a list of non-overlapping examination periods. Each period has a 006 * day, starting time and a length (in minutes) defined. Each exam is to be 007 * assigned to one period that is available for the exam and that is of the same 008 * of greater length than the exam. <br> 009 * <br> 010 * A penalty weight ({@link ExamPeriod#getPenalty()}) can be assigned to each 011 * period. It is used to penalize unpopular examination times (e.g., evening or 012 * last-day). <br> 013 * <br> 014 * A list of periods is to be defined using 015 * {@link ExamModel#addPeriod(Long, String, String, int, int)}, inserting 016 * periods in the order of increasing days and times. <br> 017 * <br> 018 * 019 * @version ExamTT 1.2 (Examination Timetabling)<br> 020 * Copyright (C) 2007 - 2010 Tomáš Müller<br> 021 * <a href="mailto:muller@unitime.org">muller@unitime.org</a><br> 022 * <a href="http://muller.unitime.org">http://muller.unitime.org</a><br> 023 * <br> 024 * This library is free software; you can redistribute it and/or modify 025 * it under the terms of the GNU Lesser General Public License as 026 * published by the Free Software Foundation; either version 3 of the 027 * License, or (at your option) any later version. <br> 028 * <br> 029 * This library is distributed in the hope that it will be useful, but 030 * WITHOUT ANY WARRANTY; without even the implied warranty of 031 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 032 * Lesser General Public License for more details. <br> 033 * <br> 034 * You should have received a copy of the GNU Lesser General Public 035 * License along with this library; if not see 036 * <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>. 037 */ 038public class ExamPeriod implements Comparable<ExamPeriod> { 039 private int iIndex = -1; 040 private Long iId = null; 041 private String iTimeStr; 042 private String iDayStr; 043 private int iLength; 044 private int iDay, iTime; 045 private int iPenalty; 046 private ExamPeriod iPrev, iNext; 047 048 /** 049 * Constructor 050 * 051 * @param id 052 * period unique identifier 053 * @param day 054 * day (e.g., 07/12/10) 055 * @param time 056 * (e.g., 8:00am-10:00am) 057 * @param length 058 * length of period in minutes 059 * @param penalty 060 * penalization of using this period 061 */ 062 public ExamPeriod(Long id, String day, String time, int length, int penalty) { 063 iId = id; 064 iDayStr = day; 065 iTimeStr = time; 066 iLength = length; 067 iPenalty = penalty; 068 } 069 070 /** Period unique identifier */ 071 public Long getId() { 072 return iId; 073 } 074 075 /** Period unique identifier */ 076 public void setId(Long id) { 077 iId = id; 078 } 079 080 /** 081 * Day string, e.g., 07/12/10 082 */ 083 public String getDayStr() { 084 return iDayStr; 085 } 086 087 /** 088 * Day index 089 * 090 * @return index of the day within all days that are used for examination 091 */ 092 public int getDay() { 093 return iDay; 094 } 095 096 /** 097 * Time string, e.g., 8:00am-10:00am 098 */ 099 public String getTimeStr() { 100 return iTimeStr; 101 } 102 103 /** 104 * Time index 105 * 106 * @return index of the time within all time that are used for examination 107 * on the same day 108 */ 109 public int getTime() { 110 return iTime; 111 } 112 113 /** 114 * Length of period in minutes 115 * 116 * @return period length 117 */ 118 public int getLength() { 119 return iLength; 120 } 121 122 /** 123 * Period index 124 * 125 * @return index of the period within all examination periods 126 */ 127 public int getIndex() { 128 return iIndex; 129 } 130 131 /** 132 * Period weight to be used to penalize unpopular periods 133 * 134 * @return period weight 135 */ 136 public int getPenalty() { 137 return iPenalty; 138 } 139 140 /** 141 * Previous period 142 * 143 * @return period with index equal to index-1, null if this is the first 144 * period 145 */ 146 public ExamPeriod prev() { 147 return iPrev; 148 } 149 150 /** 151 * Next period 152 * 153 * @return period with index equal to index+1, null if this is the last 154 * period 155 */ 156 public ExamPeriod next() { 157 return iNext; 158 } 159 160 /** 161 * Set priod indexes (only to be used by 162 * {@link ExamModel#addPeriod(Long, String, String, int, int)}) 163 * 164 * @param index 165 * period index 166 * @param day 167 * day index 168 * @param time 169 * time index 170 */ 171 public void setIndex(int index, int day, int time) { 172 iIndex = index; 173 iDay = day; 174 iTime = time; 175 } 176 177 /** 178 * Set previous period (only to be used by 179 * {@link ExamModel#addPeriod(Long, String, String, int, int)}) 180 * 181 * @param prev 182 * previous period 183 */ 184 public void setPrev(ExamPeriod prev) { 185 iPrev = prev; 186 } 187 188 /** 189 * Set next period (only to be used by 190 * {@link ExamModel#addPeriod(Long, String, String, int, int)}) 191 * 192 * @param next 193 * next period 194 */ 195 public void setNext(ExamPeriod next) { 196 iNext = next; 197 } 198 199 /** 200 * String representation 201 * 202 * @return day string time string 203 */ 204 @Override 205 public String toString() { 206 return getDayStr() + " " + getTimeStr(); 207 } 208 209 /** 210 * String representation for debuging purposes 211 * 212 * @return day string time string (idx: index, day: day index, time: time 213 * index, weight: period penalty, prev: previous period, next: next 214 * period) 215 */ 216 public String toDebugString() { 217 return getDayStr() + " " + getTimeStr() + " (idx:" + getIndex() + ", day:" + getDay() + ", time:" + getTime() 218 + ", penalty:" + getPenalty() 219 + (prev() == null ? "" : ", prev:" + prev().getDayStr() + " " + prev().getTimeStr() + ")") 220 + (next() == null ? "" : ", next:" + next().getDayStr() + " " + next().getTimeStr() + ")"); 221 } 222 223 @Override 224 public int hashCode() { 225 return iIndex; 226 } 227 228 @Override 229 public boolean equals(Object o) { 230 if (o == null || !(o instanceof ExamPeriod)) 231 return false; 232 return getIndex() == ((ExamPeriod) o).getIndex(); 233 } 234 235 @Override 236 public int compareTo(ExamPeriod p) { 237 return Double.compare(getIndex(), p.getIndex()); 238 } 239}