001package org.cpsolver.coursett.model;
002
003import org.cpsolver.coursett.constraint.RoomConstraint;
004import org.cpsolver.ifs.util.DistanceMetric;
005
006/**
007 * Room part of placement. <br>
008 * <br>
009 * 
010 * @version CourseTT 1.3 (University Course Timetabling)<br>
011 *          Copyright (C) 2006 - 2014 Tomáš Müller<br>
012 *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
013 *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
014 * <br>
015 *          This library is free software; you can redistribute it and/or modify
016 *          it under the terms of the GNU Lesser General Public License as
017 *          published by the Free Software Foundation; either version 3 of the
018 *          License, or (at your option) any later version. <br>
019 * <br>
020 *          This library is distributed in the hope that it will be useful, but
021 *          WITHOUT ANY WARRANTY; without even the implied warranty of
022 *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
023 *          Lesser General Public License for more details. <br>
024 * <br>
025 *          You should have received a copy of the GNU Lesser General Public
026 *          License along with this library; if not see
027 *          <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
028 */
029
030public class RoomLocation implements Comparable<RoomLocation> {
031    private int iPreference;
032    private String iName;
033    private Long iId;
034    private Long iBldgId;
035    private int iRoomSize;
036    private Double iPosX = null, iPosY = null;
037    private RoomConstraint iRoomConstraint = null;
038    private boolean iIgnoreTooFar = false;
039
040    /**
041     * Constructor
042     * 
043     * @param id
044     *            room id
045     * @param name
046     *            room name
047     * @param bldgId
048     *            building id
049     * @param preference
050     *            soft preference
051     * @param size
052     *            room size
053     * @param x
054     *            x-position of the building
055     * @param y
056     *            y-position of the building
057     * @param ignoreTooFar true if distance conflicts are to be ignored
058     * @param rc related room constraint
059     */
060    public RoomLocation(Long id, String name, Long bldgId, int preference, int size, Double x, Double y,
061            boolean ignoreTooFar, RoomConstraint rc) {
062        iId = id;
063        iName = name;
064        iPreference = preference;
065        iRoomSize = size;
066        iPosX = x;
067        iPosY = y;
068        iBldgId = bldgId;
069        iRoomConstraint = rc;
070        iIgnoreTooFar = ignoreTooFar;
071    }
072
073    /** Room id 
074     * @return room unique id
075     **/
076    public Long getId() {
077        return iId;
078    }
079
080    /** Building id 
081     * @return building unique id
082     **/
083    public Long getBuildingId() {
084        return iBldgId;
085    }
086
087    /** Room name 
088     * @return room name
089     **/
090    public String getName() {
091        return iName;
092    }
093
094    /** Room preference 
095     * @return room preference
096     **/
097    public int getPreference() {
098        return iPreference;
099    }
100
101    /** 
102     * Set room preference
103     * @param preference room preferences
104     */
105    public void setPreference(int preference) {
106        iPreference = preference;
107    }
108
109    /** Room size 
110     * @return room size
111     **/
112    public int getRoomSize() {
113        return iRoomSize;
114    }
115
116    /** Position of the building
117     * @param x X-coordinate (latitude) 
118     * @param y Y-coordinate (longitude)
119     **/
120    public void setCoordinates(Double x, Double y) {
121        iPosX = x;
122        iPosY = y;
123    }
124
125    /** X-position of the building 
126     * @return X-coordinate (latitude)
127     **/
128    public Double getPosX() {
129        return iPosX;
130    }
131
132    /** Y-position of the building
133     * @return Y-coordinate (longitude)
134     **/
135    public Double getPosY() {
136        return iPosY;
137    }
138
139    public boolean getIgnoreTooFar() {
140        return iIgnoreTooFar;
141    }
142
143    public RoomConstraint getRoomConstraint() {
144        return iRoomConstraint;
145    }
146
147    @Override
148    public String toString() {
149        return "Room{name=" + iName + ", pref=" + iPreference + "}";
150    }
151
152    @Override
153    public boolean equals(Object o) {
154        if (o == null || !(o instanceof RoomLocation))
155            return false;
156        return getId().equals(((RoomLocation) o).getId());
157    }
158
159    public double getDistanceInMeters(DistanceMetric m, RoomLocation roomLocation) {
160        if (getId().equals(roomLocation.getId()))
161            return 0.0;
162        if (getIgnoreTooFar() || roomLocation.getIgnoreTooFar())
163            return 0.0;
164        return m.getDistanceInMeters(getId(), getPosX(), getPosY(), roomLocation.getId(), roomLocation.getPosX(), roomLocation.getPosY());
165    }
166
167    public int getDistanceInMinutes(DistanceMetric m, RoomLocation roomLocation) {
168        if (getId().equals(roomLocation.getId()))
169            return 0;
170        if (getIgnoreTooFar() || roomLocation.getIgnoreTooFar())
171            return 0;
172        return  m.getDistanceInMinutes(getId(), getPosX(), getPosY(), roomLocation.getId(), roomLocation.getPosX(), roomLocation.getPosY());
173    }
174
175    @Override
176    public int compareTo(RoomLocation o) {
177        int cmp = -(new Long(getRoomSize())).compareTo(new Long(o.getRoomSize()));
178        if (cmp != 0)
179            return cmp;
180        return getName().compareTo((o).getName());
181    }
182
183    @Override
184    public int hashCode() {
185        return getName().hashCode();
186    }
187}