    001    package ttsolver.model;
    002
    003    import ifs.model.Value;
    004    import edu.purdue.smas.timetable.data.Preferences;
    005    import edu.purdue.smas.timetable.data.pattern.EveningTimePattern;
    006    import edu.purdue.smas.timetable.data.pattern.GenericTimePattern;
    007    import edu.purdue.smas.timetable.data.pattern.SaturdayTimePattern;
    008
    009    /**
    010     * Placement (value).
    011     * <br><br>
    012     * It combines room and time location
    013     *
    014     * @author <a href="mailto:muller@ktiml.mff.cuni.cz">Tomáš Müller</a>
    015     * @version 1.0
    016     */
    017
    018    public class Placement extends Value {
    019        private TimeLocation iTimeLocation;
    020        private RoomLocation iRoomLocation;
    021        private boolean iIsInitial = false;
    022
    023        /** Constructor
    024         * @param lecture lecture
    025         * @param timeLocation time location
    026         * @param roomLocation room location
    027         */
    028        public Placement(Lecture lecture, TimeLocation timeLocation, RoomLocation roomLocation) {
    029            super(lecture);
    030            iTimeLocation = timeLocation;
    031            iRoomLocation = roomLocation;
    032        }
    033
    034        /** Time location */
    035        public TimeLocation getTimeLocation() { return iTimeLocation; }
    036        /** Room id */
    037        public String getRoomId() { return iRoomLocation.getId(); }
    038        /** Building id */
    039        public String getBuildingId() { return iRoomLocation.getBuildingId(); }
    040        /** Room location */
    041        public RoomLocation getRoomLocation() { return iRoomLocation; }
    042        /** Instructor id */
    043        public String getInstructorId() { return ((Lecture)variable()).getInstructorId(); }
    044        public String getName() { return getTimeLocation().getText()+" "+getRoomLocation().getName()+(((Lecture)variable()).getInstructorName()!=null?" "+((Lecture)variable()).getInstructorName():getInstructorId()==null?"":" "+getInstructorId()); }
    045
    046        /** Is initial placement */
    047        public boolean isInitial() { return iIsInitial; }
    048        /** Is initial placement */
    049        public void setInitial(boolean initial) { iIsInitial=initial; }
    050
    051        public boolean equals(Object object) {
    052            if (object==null || !(object instanceof Placement)) return false;
    053            Placement placement = (Placement)object;
    054            if (placement.getId()==getId()) return true; //quick check
    055    //        if (((Lecture)placement.variable()).getClassId()!=((Lecture)variable()).getClassId()) return false;
    056            Lecture lecture = (Lecture)placement.variable();
    057            Lecture thisLecture = (Lecture)variable();
    058            if (lecture!=null && thisLecture!=null && lecture.getClassId()!=thisLecture.getClassId()) return false;
    059            return (placement.getTimeLocation()==getTimeLocation() &&
    060                    placement.getRoomId().equals(getRoomId()) &&
    061                        (placement.getInstructorId()==getInstructorId() ||
    062                            (placement.getInstructorId()!=null &&
    063                                placement.getInstructorId().equals(getInstructorId())
    064                            )
    065                        )
    066                   );
    067        }
    068
    069        public String toString() {
    070            return variable().getName()+" "+getName();
    071            //return "Placement{lecture="+variable().getName()+", time="+getTimeLocation().getText()+", len="+getTimeLocation().getLength()+", instructor="+iInstructorId+", room="+iRoomLocation.getName()+", timePref="+iTimeLocation.getNormalizedPreference()+", roomPref="+iRoomLocation.getPreference()+"}";
    072        }
    073
    074
    075        public String getDescription() {
    076            return iTimeLocation.getNrMeetings()+"x"+(25*iTimeLocation.getNrHalfHoursPerMeeting())+
    077                   (iTimeLocation.getModel()==null?"":
    078                   (iTimeLocation.getModel() instanceof GenericTimePattern  ? " gen.":"") +
    079                   (iTimeLocation.getModel() instanceof SaturdayTimePattern ? " Sat.":"") +
    080                   (iTimeLocation.getModel() instanceof EveningTimePattern  ? " evn.":"")) +
    081                   (iTimeLocation.getPreference()!=0 || iTimeLocation.getNormalizedPreference()!=0.0?", "+Preferences.getPreference(String.valueOf(iTimeLocation.getPreference())).getName().toLowerCase()+" time ("+iTimeLocation.getNormalizedPreference()+")":"")+
    082                   (iRoomLocation.getPreference()!=0?(iRoomLocation.getPreference()>=-2 && iRoomLocation.getPreference()<=2?", "+Preferences.getPreference(String.valueOf(iRoomLocation.getPreference())).getName().toLowerCase()+" room":", "+iRoomLocation.getPreference()+" room"):"");
    083        }
    084
    085        /** Distance between two placements */
    086        public static double getDistance(Placement p1, Placement p2) {
    087            if (p1.getRoomId().equals(p2.getRoomId())) return 0.0;
    088            RoomLocation r1=p1.getRoomLocation();
    089            RoomLocation r2=p2.getRoomLocation();
    090            long x = r1.getPosX()-r2.getPosX();
    091            long y = r1.getPosY()-r2.getPosY();
    092            return Math.sqrt((x*x)+(y*y));
    093        }
    094        /** True if the two given placements are using at one same day*/
    095        public static boolean shareDays(Placement p1, Placement p2) {
    096            return ((p1.getTimeLocation().getDayCode() & p2.getTimeLocation().getDayCode())!=0);
    097        }
    098    }