001 package ifs.example.tt;
002
003 import ifs.model.*;
004
005 /**
006 * Binary dependence between two activities.
007 *
008 * @author <a href="mailto:muller@ktiml.mff.cuni.cz">Tomáš Müller</a>
009 * @version 1.0
010 */
011 public class Dependence extends BinaryConstraint {
012 public static final int TYPE_NO_DEPENDENCE = 0;
013 public static final int TYPE_BEFORE = 1;
014 public static final int TYPE_CLOSELY_BEFORE = 2;
015 public static final int TYPE_AFTER = 3;
016 public static final int TYPE_CLOSELY_AFTER = 4;
017 public static final int TYPE_CONCURRENCY = 5;
018 private int iType = TYPE_NO_DEPENDENCE;
019 private String iResourceId = null;
020
021 public Dependence(String id, int type) {
022 super();
023 iType = type;
024 iResourceId = id;
025 }
026 public int getType() { return iType; }
027 public String getResourceId() { return iResourceId; }
028
029 public void computeConflicts(Value value, java.util.Set conflicts) {
030 Activity activity = (Activity) value.variable();
031 Location location = (Location) value;
032 Activity another = (Activity)another(activity);
033 Location anotherLocation = (Location)another.getAssignment();
034 if (anotherLocation==null) return;
035 if (isFirst(activity)) {
036 if (!isConsistent(location.getSlot(), activity.getLength(), anotherLocation.getSlot(), another.getLength()))
037 conflicts.add(anotherLocation);
038 } else {
039 if (!isConsistent(anotherLocation.getSlot(), another.getLength(), location.getSlot(),activity.getLength()))
040 conflicts.add(anotherLocation);
041 }
042 }
043
044 public boolean isConsistent(int s1, int l1, int s2, int l2) {
045 switch (iType) {
046 case TYPE_BEFORE :
047 return s1+l1<=s2;
048 case TYPE_CLOSELY_BEFORE :
049 return s1+l1==s2;
050 case TYPE_AFTER :
051 return s2+l2<=s1;
052 case TYPE_CLOSELY_AFTER :
053 return s2+l2==s1;
054 case TYPE_CONCURRENCY :
055 return (s1<=s2 && s2+l2<=s1+l1) || (s2<=s1 && s1+l1<=s2+l2);
056 default :
057 return true;
058 }
059 }
060
061 public boolean inConflict(Value value) {
062 Activity activity = (Activity) value.variable();
063 Location location = (Location) value;
064 Activity another = (Activity)another(activity);
065 Location anotherLocation = (Location)another.getAssignment();
066 if (anotherLocation==null) return false;
067 if (isFirst(activity)) {
068 return !isConsistent(location.getSlot(), activity.getLength(), anotherLocation.getSlot(), another.getLength());
069 } else {
070 return !isConsistent(anotherLocation.getSlot(), another.getLength(), location.getSlot(),activity.getLength());
071 }
072 }
073
074 public boolean isConsistent(Value value1, Value value2) {
075 Activity a1 = (Activity) value1.variable();
076 Activity a2 = (Activity) value2.variable();
077 Location l1 = (Location) value1;
078 Location l2 = (Location) value2;
079 if (isFirst(a1)) {
080 return !isConsistent(l1.getSlot(), a1.getLength(), l2.getSlot(), a2.getLength());
081 } else {
082 return !isConsistent(l2.getSlot(), a2.getLength(), l1.getSlot(),a1.getLength());
083 }
084 }
085
086 public String getName() {
087 switch (iType) {
088 case TYPE_BEFORE :
089 return first().getName()+"<"+second().getName();
090 case TYPE_CLOSELY_BEFORE :
091 return first().getName()+"<|"+second().getName();
092 case TYPE_AFTER :
093 return first().getName()+">"+second().getName();
094 case TYPE_CLOSELY_AFTER :
095 return first().getName()+"|>"+second().getName();
096 case TYPE_CONCURRENCY :
097 return first().getName()+"||"+second().getName();
098 default :
099 return first().getName()+"?"+second().getName();
100 }
101 }
102
103 }