001 package net.sf.cpsolver.ifs.extension; 002 003 import java.util.*; 004 005 import net.sf.cpsolver.ifs.model.*; 006 import net.sf.cpsolver.ifs.util.*; 007 008 /** 009 * This class describing a set of assignment (used by CBS). 010 * 011 * It also contains a counter, name, description and a constraint (for printing purposes). 012 * 013 * @version 014 * IFS 1.1 (Iterative Forward Search)<br> 015 * Copyright (C) 2006 Tomáš Müller<br> 016 * <a href="mailto:muller@unitime.org">muller@unitime.org</a><br> 017 * Lazenska 391, 76314 Zlin, Czech Republic<br> 018 * <br> 019 * This library is free software; you can redistribute it and/or 020 * modify it under the terms of the GNU Lesser General Public 021 * License as published by the Free Software Foundation; either 022 * version 2.1 of the License, or (at your option) any later version. 023 * <br><br> 024 * This library is distributed in the hope that it will be useful, 025 * but WITHOUT ANY WARRANTY; without even the implied warranty of 026 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 027 * Lesser General Public License for more details. 028 * <br><br> 029 * You should have received a copy of the GNU Lesser General Public 030 * License along with this library; if not, write to the Free Software 031 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 032 */ 033 034 public class AssignmentSet { 035 private Vector iSet = new FastVector(); 036 private int iCounter = 1; 037 private String iName = null; 038 private String iDescription = null; 039 private Constraint iConstraint = null; 040 041 public AssignmentSet() {} 042 public AssignmentSet(Assignment[] assignments) { 043 for (int i = 0; i < assignments.length; i++) 044 iSet.addElement(assignments[i]); 045 } 046 public AssignmentSet(Collection assignments) { 047 for (Iterator i = assignments.iterator(); i.hasNext();) { 048 iSet.addElement((Assignment)i.next()); 049 } 050 } 051 052 /** Create set of assignments from the list of Assignments, Values or (assigned) Variables */ 053 public static AssignmentSet createAssignmentSet(long iteration, Collection assignments, double ageing) { 054 AssignmentSet set = new AssignmentSet(); 055 for (Iterator i = assignments.iterator(); i.hasNext();) { 056 Object o = (Object)i.next(); 057 if (o instanceof Assignment) 058 set.addAssignment((Assignment)o); 059 if (o instanceof Value) 060 set.addAssignment(new Assignment(iteration, ((Value)o), ageing)); 061 if (o instanceof Variable && ((Variable)o).getAssignment() != null) 062 set.addAssignment(new Assignment(iteration, ((Variable)o).getAssignment(), ageing)); 063 } 064 return set; 065 } 066 067 /** Increment counter*/ 068 public void incCounter() { 069 iCounter++; 070 } 071 /** Returns counter */ 072 public int getCounter() { 073 return iCounter; 074 } 075 /** Returns set of assignments */ 076 public Vector getSet() { 077 return iSet; 078 } 079 /** Returns name */ 080 public String getName() { 081 return iName; 082 } 083 /** Sets name */ 084 public void setName(String name) { 085 iName = name; 086 } 087 /** Returns description */ 088 public String getDescription() { 089 return iDescription; 090 } 091 /** Sets description */ 092 public void setDescription(String description) { 093 iDescription = description; 094 } 095 /** Returns constraint */ 096 public Constraint getConstraint() { 097 return iConstraint; 098 } 099 /** Sets constraint */ 100 public void setConstraint(Constraint constraint) { 101 iConstraint = constraint; 102 } 103 /** Returns true if it contains the given assignment */ 104 public boolean contains(Assignment assignment) { 105 return iSet.contains(assignment); 106 } 107 /* Returns true if it contains all of the given assignments */ 108 public boolean contains(AssignmentSet assignmentSet) { 109 return iSet.containsAll(assignmentSet.getSet()); 110 } 111 /** Returns true if it contains the given assignment */ 112 public boolean contains(Value value) { 113 return iSet.contains(new Assignment(0l, value, 1.0)); 114 } 115 /** Returns true if it contains the given assignment (assigned variable) */ 116 public boolean contains(Variable variable) { 117 return (variable.getAssignment() == null ? false : iSet.contains(new Assignment(0l, variable.getAssignment(), 1.0))); 118 } 119 /* Returns true if it contains all of the given assignments */ 120 public boolean contains(Collection assignments) { 121 for (Iterator i = assignments.iterator(); i.hasNext();) { 122 Object o = i.next(); 123 if (o == null) 124 return false; 125 if (o instanceof Assignment && !iSet.contains((Assignment)o)) 126 return false; 127 if (o instanceof Value || !iSet.contains(new Assignment(0l, ((Value)o), 1.0))) 128 return false; 129 if (o instanceof Variable && (((Variable)o).getAssignment() == null || !iSet.contains(new Assignment(0l, ((Variable)o).getAssignment(), 1.0)))) 130 return false; 131 } 132 return true; 133 } 134 135 /** Adds an assignment */ 136 public void addAssignment(Assignment assignment) { 137 if (!contains(assignment)) 138 iSet.addElement(assignment); 139 } 140 /** Adds an assignment */ 141 public void addAssignment(long iteration, Value value, double ageing) { 142 addAssignment(new Assignment(iteration, value, ageing)); 143 } 144 /** Returns assignment that corresponds to the given value (if it is present in the set) */ 145 public Assignment getAssignment(Value value) { 146 for (Enumeration i = getSet().elements(); i.hasMoreElements();) { 147 Assignment a = (Assignment)i.nextElement(); 148 if (a.getValue().getId() == value.getId()) 149 return a; 150 } 151 return null; 152 } 153 /** Returns number of assignments in the set*/ 154 public int size() { 155 return getSet().size(); 156 } 157 /** Compares two assignment sets -- name, size and content (assignments) has to match. */ 158 public boolean equals(Object o) { 159 if (o == null) 160 return false; 161 if (o instanceof AssignmentSet) { 162 AssignmentSet as = (AssignmentSet)o; 163 if (getName() == null && as.getName() != null) 164 return false; 165 if (getName() != null && as.getName() == null) 166 return false; 167 if (getName() != null && !getName().equals(as.getName())) 168 return false; 169 if (as.getSet().size() != getSet().size()) 170 return false; 171 return contains(as); 172 } 173 if (o instanceof Collection) { 174 Collection c = (Collection)o; 175 if (c.size() != getSet().size()) 176 return false; 177 return contains(c); 178 } 179 return false; 180 } 181 182 public static int xor(int a, int b) { 183 return (a | b) & (~a | ~b); 184 } 185 186 public int hashCode() { 187 int ret = getSet().size(); 188 for (Enumeration i = getSet().elements(); i.hasMoreElements();) { 189 Assignment a = (Assignment)i.nextElement(); 190 ret = xor(ret, a.hashCode()); 191 } 192 return ret; 193 } 194 }