001    package net.sf.cpsolver.ifs.example.tt;
002    
003    import java.util.*;
004    
005    import net.sf.cpsolver.ifs.model.*;
006    import net.sf.cpsolver.ifs.util.*;
007    
008    /**
009     * Activity (variable).
010     * It encodes a name, length 
011     * 
012     * @version
013     * IFS 1.1 (Iterative Forward Search)<br>
014     * Copyright (C) 2006 Tomáš Müller<br>
015     * <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
016     * Lazenska 391, 76314 Zlin, Czech Republic<br>
017     * <br>
018     * This library is free software; you can redistribute it and/or
019     * modify it under the terms of the GNU Lesser General Public
020     * License as published by the Free Software Foundation; either
021     * version 2.1 of the License, or (at your option) any later version.
022     * <br><br>
023     * This library is distributed in the hope that it will be useful,
024     * but WITHOUT ANY WARRANTY; without even the implied warranty of
025     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
026     * Lesser General Public License for more details.
027     * <br><br>
028     * You should have received a copy of the GNU Lesser General Public
029     * License along with this library; if not, write to the Free Software
030     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
031     */
032    public class Activity extends Variable {
033        private int iLength = 1;
034        private String iActivityId = null;
035        private String iName = null;
036        private Vector iResorces = new FastVector();
037        private Set iProhibitedSlots = new HashSet();
038        private Set iDiscouragedSlots = new HashSet();
039        
040        public Activity(int length, String id, String name) {
041            super(null);
042            iLength = length;
043            iActivityId = id;
044            iName = name;
045        }
046        
047        public String getName() { return iName; }
048        public String getActivityId() { return iActivityId; }
049        
050        public int getLength() { return iLength; }
051        
052        public void addResourceGroup(Vector resources) {
053            for (Enumeration e=resources.elements();e.hasMoreElements();) {
054                ((Resource)e.nextElement()).addVariable(this);
055            }
056            iResorces.add(resources);
057        }
058        public void addResourceGroup(Resource[] resources) {
059            Vector rg = new FastVector(resources.length);
060            for (int i=0;i<resources.length;i++) {
061                rg.addElement(resources[i]);
062                resources[i].addVariable(this);
063            }
064            iResorces.add(rg);
065        }
066        public void addResourceGroup(Resource resource) {
067            Vector rg = new FastVector(1);
068            rg.addElement(resource);
069            iResorces.add(rg);
070            resource.addVariable(this);
071        }
072        public Vector getResourceGroup(int idx) {
073            return (Vector)iResorces.elementAt(idx);
074        }
075        public Vector getResourceGroups() {
076            return iResorces;
077        }
078        public Set getProhibitedSlots() { return iProhibitedSlots; }
079        public Set getDiscouragedSlots() { return iDiscouragedSlots; }
080        public void addProhibitedSlot(int day, int hour) {
081            iProhibitedSlots.add(new Integer(((TimetableModel)getModel()).getNrHours()*day+hour));
082        }
083        public void addDiscouragedSlot(int day, int hour) {
084            iDiscouragedSlots.add(new Integer(((TimetableModel)getModel()).getNrHours()*day+hour));
085        }
086        public boolean isProhibitedSlot(int day, int hour) {
087            return iProhibitedSlots.contains(new Integer(((TimetableModel)getModel()).getNrHours()*day+hour));
088        }
089        public boolean isDiscouragedSlot(int day, int hour) {
090            return iDiscouragedSlots.contains(new Integer(((TimetableModel)getModel()).getNrHours()*day+hour));
091        }
092        public void addProhibitedSlot(int slot) {
093            iProhibitedSlots.add(new Integer(slot));
094        }
095        public void addDiscouragedSlot(int slot) {
096            iDiscouragedSlots.add(new Integer(slot));
097        }
098        public boolean isProhibitedSlot(int slot) {
099            return iProhibitedSlots.contains(new Integer(slot));
100        }
101        public boolean isDiscouragedSlot(int slot) {
102            return iDiscouragedSlots.contains(new Integer(slot));
103        }
104        public boolean isProhibited(int day, int hour, int length) {
105            int slot = ((TimetableModel)getModel()).getNrHours()*day+hour;
106            for (int i=0;i<length;i++)
107                if (iProhibitedSlots.contains(new Integer(slot+i))) return true;
108            return false;
109        }
110        public void init() {
111            setValues(computeValues());
112        }
113        
114        private void addValues(Vector values, int day, int hour, int level, Resource[] resources) {
115            if (level==getResourceGroups().size()) {
116                values.addElement(new Location(this, day, hour, (Resource[])resources.clone()));
117                return;
118            }
119            Vector rg = (Vector)getResourceGroups().elementAt(level);
120            for (Enumeration f=rg.elements();f.hasMoreElements();) {
121                Resource r = (Resource)f.nextElement();
122                if (r.isProhibited(day, hour, getLength())) continue;
123                resources[level]=r;
124                addValues(values, day, hour, level+1, resources);
125            }
126        }
127        
128        public Vector computeValues() {
129            TimetableModel m = (TimetableModel)getModel();
130            Vector values = new FastVector();
131            Resource[] res = new Resource[getResourceGroups().size()];
132            for (int day=0;day<m.getNrDays();day++)
133                for (int hour=0;hour<=m.getNrHours()-getLength();hour++) {
134                    if (isProhibited(day,hour,getLength())) continue;
135                    addValues(values, day, hour, 0, res);
136                }
137            return values;
138        }
139    }