001    package net.sf.cpsolver.ifs.example.jobshop;
002    
003    import 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 Tomas Muller<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    public 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    }