    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}