001package net.sf.cpsolver.coursett.model;
002
003import net.sf.cpsolver.coursett.constraint.RoomConstraint;
004import net.sf.cpsolver.ifs.util.DistanceMetric;
005
006/**
007 * Room part of placement. <br>
008 * <br>
009 * 
010 * @version CourseTT 1.2 (University Course Timetabling)<br>
011 *          Copyright (C) 2006 - 2010 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     */
058    public RoomLocation(Long id, String name, Long bldgId, int preference, int size, Double x, Double y,
059            boolean ignoreTooFar, RoomConstraint rc) {
060        iId = id;
061        iName = name;
062        iPreference = preference;
063        iRoomSize = size;
064        iPosX = x;
065        iPosY = y;
066        iBldgId = bldgId;
067        iRoomConstraint = rc;
068        iIgnoreTooFar = ignoreTooFar;
069    }
070
071    /** Room id */
072    public Long getId() {
073        return iId;
074    }
075
076    /** Building id */
077    public Long getBuildingId() {
078        return iBldgId;
079    }
080
081    /** Room name */
082    public String getName() {
083        return iName;
084    }
085
086    /** Room preference */
087    public int getPreference() {
088        return iPreference;
089    }
090
091    public void setPreference(int preference) {
092        iPreference = preference;
093    }
094
095    /** Room size */
096    public int getRoomSize() {
097        return iRoomSize;
098    }
099
100    /** Position of the building */
101    public void setCoordinates(Double x, Double y) {
102        iPosX = x;
103        iPosY = y;
104    }
105
106    /** X-position of the building */
107    public Double getPosX() {
108        return iPosX;
109    }
110
111    /** Y-position of the building */
112    public Double getPosY() {
113        return iPosY;
114    }
115
116    public boolean getIgnoreTooFar() {
117        return iIgnoreTooFar;
118    }
119
120    public RoomConstraint getRoomConstraint() {
121        return iRoomConstraint;
122    }
123
124    @Override
125    public String toString() {
126        return "Room{name=" + iName + ", pref=" + iPreference + "}";
127    }
128
129    @Override
130    public boolean equals(Object o) {
131        if (o == null || !(o instanceof RoomLocation))
132            return false;
133        return getId().equals(((RoomLocation) o).getId());
134    }
135
136    public double getDistanceInMeters(DistanceMetric m, RoomLocation roomLocation) {
137        if (getId().equals(roomLocation.getId()))
138            return 0.0;
139        if (getIgnoreTooFar() || roomLocation.getIgnoreTooFar())
140            return 0.0;
141        return m.getDistanceInMeters(getId(), getPosX(), getPosY(), roomLocation.getId(), roomLocation.getPosX(), roomLocation.getPosY());
142    }
143
144    public int getDistanceInMinutes(DistanceMetric m, RoomLocation roomLocation) {
145        if (getId().equals(roomLocation.getId()))
146            return 0;
147        if (getIgnoreTooFar() || roomLocation.getIgnoreTooFar())
148            return 0;
149        return  m.getDistanceInMinutes(getId(), getPosX(), getPosY(), roomLocation.getId(), roomLocation.getPosX(), roomLocation.getPosY());
150    }
151
152    @Override
153    public int compareTo(RoomLocation o) {
154        int cmp = -(new Long(getRoomSize())).compareTo(new Long(o.getRoomSize()));
155        if (cmp != 0)
156            return cmp;
157        return getName().compareTo((o).getName());
158    }
159
160    @Override
161    public int hashCode() {
162        return getName().hashCode();
163    }
164}