001package net.sf.cpsolver.ifs.example.jobshop;
002
003import net.sf.cpsolver.ifs.model.Value;
004
005/**
006 * Location of an operation. <br>
007 * <br>
008 * Each location has its start time.
009 * 
010 * @version IFS 1.2 (Iterative Forward Search)<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 */
029public class Location extends Value<Operation, Location> {
030    private int iStartTime = -1;
031
032    /**
033     * Constructor
034     * 
035     * @param op
036     *            parent operation
037     * @param startTime
038     *            start time
039     */
040    public Location(Operation op, int startTime) {
041        super(op);
042        iStartTime = startTime;
043    }
044
045    /**
046     * Get start time of the location
047     */
048    public int getStartTime() {
049        return iStartTime;
050    }
051
052    /**
053     * Get finishing time of the location (start time + operation processing
054     * time)
055     */
056    public int getFinishingTime() {
057        return iStartTime + (variable()).getProcessingTime() - 1;
058    }
059
060    /**
061     * Start time of the location
062     */
063    @Override
064    public double toDouble() {
065        return iStartTime;
066    }
067
068    /**
069     * String representation (operation name = start time)
070     */
071    @Override
072    public String toString() {
073        return variable().getName() + "=" + iStartTime;
074    }
075
076    /**
077     * Name -- start time
078     */
079    @Override
080    public String getName() {
081        return String.valueOf(iStartTime);
082    }
083
084    /**
085     * Returns true if overlap with the given location
086     */
087    public boolean overlap(Location anotherLocation) {
088        if (getStartTime() + variable().getProcessingTime() <= anotherLocation.getStartTime())
089            return false;
090        if (anotherLocation.getStartTime() + anotherLocation.variable().getProcessingTime() <= getStartTime())
091            return false;
092        return true;
093    }
094
095    /**
096     * Returnts true if before the given location
097     */
098    public boolean before(Location anotherLocation) {
099        if (getStartTime() + variable().getProcessingTime() <= anotherLocation.getStartTime())
100            return true;
101        return false;
102    }
103
104    /**
105     * Returnts true if after the given location
106     */
107    public boolean after(Location anotherLocation) {
108        return anotherLocation.before(this);
109    }
110}