001    package ifs.extension;
002    
003    import ifs.model.*;
004    import ifs.util.*;
005    import java.util.*;
006    
007    /**
008     * This class describing a set of assignment (used by CBS).
009     *
010     * It also contains a counter, name, description and a constraint (for printing purposes).
011     *
012     * @author <a href="mailto:muller@ktiml.mff.cuni.cz">Tomáš Müller</a>
013     * @version 1.0
014     */
015    
016    public class AssignmentSet {
017        private Vector iSet = new FastVector();
018        private int iCounter = 1;
019        private String iName = null;
020        private String iDescription = null;
021        private Constraint iConstraint = null;
022        
023        public AssignmentSet() {}
024        public AssignmentSet(Assignment[] assignments) {
025            for (int i = 0; i < assignments.length; i++)
026                iSet.addElement(assignments[i]);
027        }
028        public AssignmentSet(Collection assignments) {
029            for (Iterator i = assignments.iterator(); i.hasNext();) {
030                iSet.addElement((Assignment)i.next());
031            }
032        }
033        
034        /** Create set of assignments from the list of Assignments, Values or (assigned) Variables */
035        public static AssignmentSet createAssignmentSet(long iteration, Collection assignments, double ageing) {
036            AssignmentSet set = new AssignmentSet();
037            for (Iterator i = assignments.iterator(); i.hasNext();) {
038                Object o = (Object)i.next();
039                if (o instanceof Assignment)
040                    set.addAssignment((Assignment)o);
041                if (o instanceof Value)
042                    set.addAssignment(new Assignment(iteration, ((Value)o), ageing));
043                if (o instanceof Variable && ((Variable)o).getAssignment() != null)
044                    set.addAssignment(new Assignment(iteration, ((Variable)o).getAssignment(), ageing));
045            }
046            return set;
047        }
048        
049        /** Increment counter*/
050        public void incCounter() {
051            iCounter++;
052        }
053        /** Returns counter */
054        public int getCounter() {
055            return iCounter;
056        }
057        /** Returns set of assignments */
058        public Vector getSet() {
059            return iSet;
060        }
061        /** Returns name */
062        public String getName() {
063            return iName;
064        }
065        /** Sets name */
066        public void setName(String name) {
067            iName = name;
068        }
069        /** Returns description */
070        public String getDescription() {
071            return iDescription;
072        }
073        /** Sets description */
074        public void setDescription(String description) {
075            iDescription = description;
076        }
077        /** Returns constraint */
078        public Constraint getConstraint() {
079            return iConstraint;
080        }
081        /** Sets constraint */
082        public void setConstraint(Constraint constraint) {
083            iConstraint = constraint;
084        }
085        /** Returns true if it contains the given assignment */
086        public boolean contains(Assignment assignment) {
087            return iSet.contains(assignment);
088        }
089        /* Returns true if it contains all of the given assignments */
090        public boolean contains(AssignmentSet assignmentSet) {
091            return iSet.containsAll(assignmentSet.getSet());
092        }
093        /** Returns true if it contains the given assignment */
094        public boolean contains(Value value) {
095            return iSet.contains(new Assignment(0l, value, 1.0));
096        }
097        /** Returns true if it contains the given assignment (assigned variable) */
098        public boolean contains(Variable variable) {
099            return (variable.getAssignment() == null ? false : iSet.contains(new Assignment(0l, variable.getAssignment(), 1.0)));
100        }
101        /* Returns true if it contains all of the given assignments */
102        public boolean contains(Collection assignments) {
103            for (Iterator i = assignments.iterator(); i.hasNext();) {
104                Object o = i.next();
105                if (o == null)
106                    return false;
107                if (o instanceof Assignment && !iSet.contains((Assignment)o))
108                    return false;
109                if (o instanceof Value || !iSet.contains(new Assignment(0l, ((Value)o), 1.0)))
110                    return false;
111                if (o instanceof Variable && (((Variable)o).getAssignment() == null || !iSet.contains(new Assignment(0l, ((Variable)o).getAssignment(), 1.0))))
112                    return false;
113            }
114            return true;
115        }
116        
117        /** Adds an assignment */
118        public void addAssignment(Assignment assignment) {
119            if (!contains(assignment))
120                iSet.addElement(assignment);
121        }
122        /** Adds an assignment */
123        public void addAssignment(long iteration, Value value, double ageing) {
124            addAssignment(new Assignment(iteration, value, ageing));
125        }
126        /** Returns assignment that corresponds to the given value (if it is present in the set) */
127        public Assignment getAssignment(Value value) {
128            for (Enumeration i = getSet().elements(); i.hasMoreElements();) {
129                Assignment a = (Assignment)i.nextElement();
130                if (a.getValue().getId() == value.getId())
131                    return a;
132            }
133            return null;
134        }
135        /** Returns number of assignments in the set*/    
136        public int size() {
137            return getSet().size();
138        }
139        /** Compares two assignment sets -- name, size and content (assignments) has to match. */
140        public boolean equals(Object o) {
141            if (o == null)
142                return false;
143            if (o instanceof AssignmentSet) {
144                AssignmentSet as = (AssignmentSet)o;
145                if (getName() == null && as.getName() != null)
146                    return false;
147                if (getName() != null && as.getName() == null)
148                    return false;
149                if (getName() != null && !getName().equals(as.getName()))
150                    return false;
151                if (as.getSet().size() != getSet().size())
152                    return false;
153                return contains(as);
154            }
155            if (o instanceof Collection) {
156                Collection c = (Collection)o;
157                if (c.size() != getSet().size())
158                    return false;
159                return contains(c);
160            }
161            return false;
162        }
163        
164        public static int xor(int a, int b) {
165            return (a | b) & (~a | ~b);
166        }
167        
168        public int hashCode() {
169            int ret = getSet().size();
170            for (Enumeration i = getSet().elements(); i.hasMoreElements();) {
171                Assignment a = (Assignment)i.nextElement();
172                ret = xor(ret, a.hashCode());
173            }
174            return ret;
175        }
176    }