001 package net.sf.cpsolver.studentsct.model; 002 003 import java.util.Enumeration; 004 import java.util.HashSet; 005 import java.util.Vector; 006 007 /** 008 * Representation of an instructional offering. An offering contains id, name, the list of course offerings, and the list of 009 * possible configurations. See {@link Config} and {@link Course}. 010 * 011 * <br><br> 012 * 013 * @version 014 * StudentSct 1.1 (Student Sectioning)<br> 015 * Copyright (C) 2007 Tomáš Müller<br> 016 * <a href="mailto:muller@unitime.org">muller@unitime.org</a><br> 017 * Lazenska 391, 76314 Zlin, Czech Republic<br> 018 * <br> 019 * This library is free software; you can redistribute it and/or 020 * modify it under the terms of the GNU Lesser General Public 021 * License as published by the Free Software Foundation; either 022 * version 2.1 of the License, or (at your option) any later version. 023 * <br><br> 024 * This library is distributed in the hope that it will be useful, 025 * but WITHOUT ANY WARRANTY; without even the implied warranty of 026 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 027 * Lesser General Public License for more details. 028 * <br><br> 029 * You should have received a copy of the GNU Lesser General Public 030 * License along with this library; if not, write to the Free Software 031 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 032 */ 033 public class Offering { 034 private long iId = -1; 035 private String iName = null; 036 private Vector iConfigs = new Vector(); 037 private Vector iCourses = new Vector(); 038 039 /** Constructor 040 * @param id instructional offering unique id 041 * @param name instructional offering name (this is usually the name of the controlling course) 042 */ 043 public Offering(long id, String name) { 044 iId = id; iName = name; 045 } 046 047 /** Offering id */ 048 public long getId() { 049 return iId; 050 } 051 052 /** Offering name */ 053 public String getName() { 054 return iName; 055 } 056 057 /** Possible configurations */ 058 public Vector getConfigs() { 059 return iConfigs; 060 } 061 062 /** List of courses. One instructional offering can contain multiple courses (names under which it is offered) */ 063 public Vector getCourses() { 064 return iCourses; 065 } 066 067 /** Return section of the given id, if it is part of one of this offering configurations. */ 068 public Section getSection(long sectionId) { 069 for (Enumeration e=getConfigs().elements();e.hasMoreElements();) { 070 Config config = (Config)e.nextElement(); 071 for (Enumeration f=config.getSubparts().elements();f.hasMoreElements();) { 072 Subpart subpart = (Subpart)f.nextElement(); 073 for (Enumeration g=subpart.getSections().elements();g.hasMoreElements();) { 074 Section section = (Section)g.nextElement(); 075 if (section.getId()==sectionId) 076 return section; 077 } 078 } 079 } 080 return null; 081 } 082 083 /** Return course, under which the given student enrolls into this offering. */ 084 public Course getCourse(Student student) { 085 if (getCourses().size()==0) 086 return null; 087 if (getCourses().size()==1) 088 return (Course)getCourses().firstElement(); 089 for (Enumeration e=student.getRequests().elements();e.hasMoreElements();) { 090 Request request = (Request)e.nextElement(); 091 if (request instanceof CourseRequest) { 092 for (Enumeration f=((CourseRequest)request).getCourses().elements();f.hasMoreElements();) { 093 Course course = (Course)f.nextElement(); 094 if (getCourses().contains(course)) return course; 095 } 096 } 097 } 098 return (Course)getCourses().firstElement(); 099 } 100 101 /** Return set of instructional types, union over all configurations. */ 102 public HashSet getInstructionalTypes() { 103 HashSet instructionalTypes = new HashSet(); 104 for (Enumeration e=getConfigs().elements();e.hasMoreElements();) { 105 Config config = (Config)e.nextElement(); 106 for (Enumeration f=config.getSubparts().elements();f.hasMoreElements();) { 107 Subpart subpart = (Subpart)f.nextElement(); 108 instructionalTypes.add(subpart.getInstructionalType()); 109 } 110 } 111 return instructionalTypes; 112 } 113 114 /** Return the list of all possible choices of the given instructional type for this offering. */ 115 public HashSet getChoices(String instructionalType) { 116 HashSet choices = new HashSet(); 117 for (Enumeration e=getConfigs().elements();e.hasMoreElements();) { 118 Config config = (Config)e.nextElement(); 119 for (Enumeration f=config.getSubparts().elements();f.hasMoreElements();) { 120 Subpart subpart = (Subpart)f.nextElement(); 121 if (!instructionalType.equals(subpart.getInstructionalType())) continue; 122 choices.addAll(subpart.getChoices()); 123 } 124 } 125 return choices; 126 } 127 128 /** Return list of all subparts of the given isntructional type for this offering. */ 129 public HashSet getSubparts(String instructionalType) { 130 HashSet subparts = new HashSet(); 131 for (Enumeration e=getConfigs().elements();e.hasMoreElements();) { 132 Config config = (Config)e.nextElement(); 133 for (Enumeration f=config.getSubparts().elements();f.hasMoreElements();) { 134 Subpart subpart = (Subpart)f.nextElement(); 135 if (instructionalType.equals(subpart.getInstructionalType())) 136 subparts.add(subpart); 137 } 138 } 139 return subparts; 140 } 141 142 /** Minimal penalty from {@link Config#getMinPenalty()} */ 143 public double getMinPenalty() { 144 double min = Double.MAX_VALUE; 145 for (Enumeration e=getConfigs().elements();e.hasMoreElements();) { 146 Config config = (Config)e.nextElement(); 147 min = Math.min(min, config.getMinPenalty()); 148 } 149 return (min==Double.MAX_VALUE?0.0:min); 150 } 151 152 /** Maximal penalty from {@link Config#getMaxPenalty()} */ 153 public double getMaxPenalty() { 154 double max = Double.MIN_VALUE; 155 for (Enumeration e=getConfigs().elements();e.hasMoreElements();) { 156 Config config = (Config)e.nextElement(); 157 max = Math.max(max, config.getMaxPenalty()); 158 } 159 return (max==Double.MIN_VALUE?0.0:max); 160 } 161 162 public String toString() { 163 return iName; 164 } 165 166 }