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