    001    package ifs.example.tt;
    002
    003    import ifs.model.*;
    004    import ifs.util.*;
    005    import java.util.*;
    006
    007    /**
    008     * Resource constraint
    009     *
    010     * @author <a href="mailto:muller@ktiml.mff.cuni.cz">Tomáš Müller</a>
    011     * @version 1.0
    012     */
    013    public class Resource extends Constraint {
    014        private String iName = null;
    015        private String iResourceId = null;
    016        private Activity[] iResource;
    017        private Set iProhibitedSlots = new HashSet();
    018        private Set iDiscouragedSlots = new HashSet();
    019        private int iType = TYPE_OTHER;
    020
    021        public static final int TYPE_ROOM = 0;
    022        public static final int TYPE_INSTRUCTOR = 1;
    023        public static final int TYPE_CLASS = 2;
    024        public static final int TYPE_OTHER = 3;
    025
    026        public Resource(String id, int type, String name) {
    027            super();
    028            iResourceId = id;
    029            iName = name;
    030            iType = type;
    031        }
    032
    033        public void setModel(Model model) {
    034            super.setModel(model);
    035            iResource = new Activity[((TimetableModel)model).getNrDays()*((TimetableModel)model).getNrHours()];
    036            for (int i=0;i<iResource.length;i++)
    037                    iResource[i] = null;
    038        }
    039
    040        public String getResourceId() { return iResourceId; }
    041        public String getName() { return iName; }
    042        public int getType() { return iType; }
    043        public Set getProhibitedSlots() { return iProhibitedSlots; }
    044        public Set getDiscouragedSlots() { return iDiscouragedSlots; }
    045        public void addProhibitedSlot(int day, int hour) {
    046            iProhibitedSlots.add(new Integer(((TimetableModel)getModel()).getNrHours()*day+hour));
    047        }
    048        public void addDiscouragedSlot(int day, int hour) {
    049            iDiscouragedSlots.add(new Integer(((TimetableModel)getModel()).getNrHours()*day+hour));
    050        }
    051        public boolean isProhibitedSlot(int day, int hour) {
    052            return iProhibitedSlots.contains(new Integer(((TimetableModel)getModel()).getNrHours()*day+hour));
    053        }
    054        public boolean isDiscouragedSlot(int day, int hour) {
    055            return iDiscouragedSlots.contains(new Integer(((TimetableModel)getModel()).getNrHours()*day+hour));
    056        }
    057        public void addProhibitedSlot(int slot) {
    058            iProhibitedSlots.add(new Integer(slot));
    059        }
    060        public void addDiscouragedSlot(int slot) {
    061            iDiscouragedSlots.add(new Integer(slot));
    062        }
    063        public boolean isProhibitedSlot(int slot) {
    064            return iProhibitedSlots.contains(new Integer(slot));
    065        }
    066        public boolean isDiscouragedSlot(int slot) {
    067            return iDiscouragedSlots.contains(new Integer(slot));
    068        }
    069        public boolean isProhibited(int day, int hour, int length) {
    070            int slot = ((TimetableModel)getModel()).getNrHours()*day+hour;
    071            for (int i=0;i<length;i++)
    072                if (iProhibitedSlots.contains(new Integer(slot+i))) return true;
    073            return false;
    074        }
    075
    076        public void computeConflicts(Value value, Set conflicts) {
    077            Activity activity = (Activity) value.variable();
    078            Location location = (Location) value;
    079            if (!location.containResource(this)) return;
    080            for (int i=location.getSlot(); i<location.getSlot()+activity.getLength(); i++) {
    081                Activity conf = iResource[i];
    082                if (conf!=null && !activity.equals(conf))
    083                    conflicts.add(conf.getAssignment());
    084            }
    085        }
    086
    087        public boolean inConflict(Value value) {
    088            Activity activity = (Activity) value.variable();
    089            Location location = (Location) value;
    090            if (!location.containResource(this)) return false;
    091            for (int i=location.getSlot(); i<location.getSlot()+activity.getLength(); i++) {
    092                if (iResource[i]!=null) return true;
    093            }
    094            return false;
    095        }
    096
    097        public boolean isConsistent(Value value1, Value value2) {
    098            Location l1 = (Location) value1;
    099            Location l2 = (Location) value2;
    100            return !l1.containResource(this) || !l2.containResource(this) || !l1.hasIntersection(l2);
    101        }
    102
    103        public void assigned(long iteration, Value value) {
    104            super.assigned(iteration, value);
    105            Activity activity = (Activity) value.variable();
    106            Location location = (Location) value;
    107            if (!location.containResource(this)) return;
    108            for (int i=location.getSlot(); i<location.getSlot()+activity.getLength(); i++) {
    109                iResource[i] = activity;
    110            }
    111        }
    112        public void unassigned(long iteration, Value value) {
    113            super.unassigned(iteration, value);
    114            Activity activity = (Activity) value.variable();
    115            Location location = (Location) value;
    116            if (!location.containResource(this)) return;
    117            for (int i=location.getSlot(); i<location.getSlot()+activity.getLength(); i++) {
    118                iResource[i] = null;
    119            }
    120        }
    121    }