diff options
author | Jannis Harder <harder@informatik.uni-luebeck.de> | 2011-06-17 17:41:52 +0200 |
---|---|---|
committer | Jannis Harder <harder@informatik.uni-luebeck.de> | 2011-06-17 17:41:52 +0200 |
commit | e06ba8ea1346e5045a34508648ac93150aacb01a (patch) | |
tree | 5d214438109aef0c622c29c8b78ab608cb1fafd8 /src/jrummikub/ai/fdsolver/constraint | |
parent | 1b9c7c47783a0872ca3bedfad6fb120f611d354b (diff) | |
download | JRummikub-e06ba8ea1346e5045a34508648ac93150aacb01a.tar JRummikub-e06ba8ea1346e5045a34508648ac93150aacb01a.zip |
Reimplemented AI (old one was too slow)
git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@443 72836036-5685-4462-b002-a69064685172
Diffstat (limited to 'src/jrummikub/ai/fdsolver/constraint')
15 files changed, 0 insertions, 834 deletions
diff --git a/src/jrummikub/ai/fdsolver/constraint/ComparatorConstraint.java b/src/jrummikub/ai/fdsolver/constraint/ComparatorConstraint.java deleted file mode 100644 index 019de92..0000000 --- a/src/jrummikub/ai/fdsolver/constraint/ComparatorConstraint.java +++ /dev/null @@ -1,74 +0,0 @@ -package jrummikub.ai.fdsolver.constraint; - -import static jrummikub.ai.fdsolver.Satisfiability.*; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.NoSuchElementException; - -import jrummikub.ai.fdsolver.Constraint; -import jrummikub.ai.fdsolver.Propagator; -import jrummikub.ai.fdsolver.Satisfiability; -import jrummikub.ai.fdsolver.Var; - -public class ComparatorConstraint<T> extends Constraint { - Var<T> x, y; - Comparator<T> comparator, reverseComparator; - ComparatorPropagator<T> trueX, trueY, falseX, falseY; - boolean allowEqual; - - ComparatorConstraint(final Comparator<T> comparator, boolean allowEqual, - Var<T> x, Var<T> y) { - this.x = x; - this.y = y; - this.comparator = comparator; - this.allowEqual = allowEqual; - reverseComparator = new Comparator<T>() { - @Override - public int compare(T o1, T o2) { - return comparator.compare(o2, o1); - } - }; - trueX = new ComparatorPropagator<T>(comparator, allowEqual, x, y); - trueY = new ComparatorPropagator<T>(reverseComparator, allowEqual, y, x); - falseX = new ComparatorPropagator<T>(reverseComparator, !allowEqual, x, - y); - falseY = new ComparatorPropagator<T>(comparator, !allowEqual, y, x); - } - - @Override - public Collection<Var<?>> getWatchedVars() { - return Arrays.<Var<?>> asList(x, y); - } - - @Override - public Collection<Propagator> getPropagators(boolean negate) { - if (negate) { - return Arrays.<Propagator> asList(falseX, falseY); - } else { - return Arrays.<Propagator> asList(trueX, trueY); - } - } - - @Override - public Satisfiability getSatisfiability() { - try { - T maxX = Collections.max(x.getRange(), comparator); - T minY = Collections.min(y.getRange(), comparator); - if (comparator.compare(maxX, minY) < (allowEqual ? 1 : 0)) { - return TAUT; - } - T minX = Collections.min(x.getRange(), comparator); - T maxY = Collections.max(y.getRange(), comparator); - if (comparator.compare(maxY, minX) < (allowEqual ? 0 : 1)) { - return UNSAT; - } - return SAT; - } catch (NoSuchElementException e) { - return UNSAT; - } - } - -} diff --git a/src/jrummikub/ai/fdsolver/constraint/ComparatorPropagator.java b/src/jrummikub/ai/fdsolver/constraint/ComparatorPropagator.java deleted file mode 100644 index b3a3089..0000000 --- a/src/jrummikub/ai/fdsolver/constraint/ComparatorPropagator.java +++ /dev/null @@ -1,42 +0,0 @@ -package jrummikub.ai.fdsolver.constraint; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; - -import jrummikub.ai.fdsolver.Propagator; -import jrummikub.ai.fdsolver.Var; - -public class ComparatorPropagator<T> implements Propagator { - private Var<T> x, y; - private Comparator<T> comparator; - private boolean allowEqual; - public ComparatorPropagator(Comparator<T> comparator, boolean allowEqual, Var<T> x, Var<T> y) { - this.comparator = comparator; - this.allowEqual = allowEqual; - this.x = x; - this.y = y; - } - - @Override - public Collection<Var<?>> getWatchedVars() { - return Arrays.<Var<?>>asList(y); - } - - @Override - public void propagate() { - T maxY = Collections.max(y.getRange(), comparator); - - for(Iterator<T> i = x.iterator(); i.hasNext();) { - T value = i.next(); - int comparision = comparator.compare(value, maxY); - if (comparision > 0 || comparision == 0 && !allowEqual) { - i.remove(); - } - } - } -} diff --git a/src/jrummikub/ai/fdsolver/constraint/Filter.java b/src/jrummikub/ai/fdsolver/constraint/Filter.java deleted file mode 100644 index 59c880a..0000000 --- a/src/jrummikub/ai/fdsolver/constraint/Filter.java +++ /dev/null @@ -1,5 +0,0 @@ -package jrummikub.ai.fdsolver.constraint; - -public interface Filter<T> { - public boolean accept(T value); -} diff --git a/src/jrummikub/ai/fdsolver/constraint/FilterConstraint.java b/src/jrummikub/ai/fdsolver/constraint/FilterConstraint.java deleted file mode 100644 index d01a109..0000000 --- a/src/jrummikub/ai/fdsolver/constraint/FilterConstraint.java +++ /dev/null @@ -1,65 +0,0 @@ -package jrummikub.ai.fdsolver.constraint; - -import static jrummikub.ai.fdsolver.Satisfiability.SAT; -import static jrummikub.ai.fdsolver.Satisfiability.TAUT; -import static jrummikub.ai.fdsolver.Satisfiability.UNSAT; - -import java.util.Arrays; -import java.util.Collection; - -import jrummikub.ai.fdsolver.Constraint; -import jrummikub.ai.fdsolver.Propagator; -import jrummikub.ai.fdsolver.Satisfiability; -import jrummikub.ai.fdsolver.Var; - -public class FilterConstraint<T> extends Constraint { - private Var<T> var; - private Propagator trueProp, falseProp; - private Filter<T> filter; - - public FilterConstraint(final Filter<T> filter, Var<T> var) { - this.var = var; - this.filter = filter; - trueProp = new FilterPropagator<T>(filter, var); - falseProp = new FilterPropagator<T>(new Filter<T>() { - @Override - public boolean accept(T value) { - return !filter.accept(value); - } - }, var); - } - - @Override - public Collection<Var<?>> getWatchedVars() { - return Arrays.<Var<?>> asList(var); - } - - @Override - public Collection<Propagator> getPropagators(boolean negate) { - return Arrays.asList(negate ? falseProp : trueProp); - } - - @Override - public Satisfiability getSatisfiability() { - boolean any = false; - boolean all = true; - - for (T value : var.getRange()) { - boolean accepted = filter.accept(value); - if (accepted) { - any = true; - } else { - all = false; - } - } - - if (all && any) { - return TAUT; - } else if (any) { - return SAT; - } else { - return UNSAT; - } - } - -} diff --git a/src/jrummikub/ai/fdsolver/constraint/FilterPropagator.java b/src/jrummikub/ai/fdsolver/constraint/FilterPropagator.java deleted file mode 100644 index 80518c9..0000000 --- a/src/jrummikub/ai/fdsolver/constraint/FilterPropagator.java +++ /dev/null @@ -1,31 +0,0 @@ -package jrummikub.ai.fdsolver.constraint; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Iterator; - -import jrummikub.ai.fdsolver.Propagator; -import jrummikub.ai.fdsolver.Var; - -public class FilterPropagator<T> implements Propagator { - private Filter<T> filter; - private Var<T> var; - - public FilterPropagator(Filter<T> filter, Var<T> var) { - this.filter = filter; - this.var = var; - } - - @Override - public Collection<Var<?>> getWatchedVars() { - return Arrays.<Var<?>>asList(var); - } - - @Override - public void propagate() { - for(Iterator<T> i = var.iterator(); i.hasNext();) { - if(!filter.accept(i.next())) - i.remove(); - } - } -} diff --git a/src/jrummikub/ai/fdsolver/constraint/GreaterThan.java b/src/jrummikub/ai/fdsolver/constraint/GreaterThan.java deleted file mode 100644 index 9bdccd2..0000000 --- a/src/jrummikub/ai/fdsolver/constraint/GreaterThan.java +++ /dev/null @@ -1,18 +0,0 @@ -package jrummikub.ai.fdsolver.constraint; - -import java.util.Comparator; - -import jrummikub.ai.fdsolver.Var; - -public class GreaterThan<T extends Comparable<T>> extends - ComparatorConstraint<T> { - - public GreaterThan(boolean allowEqual, Var<T> x, Var<T> y) { - super(new Comparator<T>() { - @Override - public int compare(T o1, T o2) { - return o2.compareTo(o1); - } - }, allowEqual, x, y); - } -} diff --git a/src/jrummikub/ai/fdsolver/constraint/GreaterThanConst.java b/src/jrummikub/ai/fdsolver/constraint/GreaterThanConst.java deleted file mode 100644 index 6b00ee3..0000000 --- a/src/jrummikub/ai/fdsolver/constraint/GreaterThanConst.java +++ /dev/null @@ -1,15 +0,0 @@ -package jrummikub.ai.fdsolver.constraint; - -import jrummikub.ai.fdsolver.Var; - -public class GreaterThanConst<T extends Comparable<T>> extends - FilterConstraint<T> { - public GreaterThanConst(final boolean allowEqual, Var<T> x, final T y) { - super(new Filter<T>() { - @Override - public boolean accept(T value) { - return y.compareTo(value) < (allowEqual ? 1 : 0); - } - }, x); - } -} diff --git a/src/jrummikub/ai/fdsolver/constraint/IfConstraint.java b/src/jrummikub/ai/fdsolver/constraint/IfConstraint.java deleted file mode 100644 index fc1b484..0000000 --- a/src/jrummikub/ai/fdsolver/constraint/IfConstraint.java +++ /dev/null @@ -1,108 +0,0 @@ -package jrummikub.ai.fdsolver.constraint; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.concurrent.locks.Condition; - - -import jrummikub.ai.fdsolver.Constraint; -import jrummikub.ai.fdsolver.Propagator; -import jrummikub.ai.fdsolver.Satisfiability; -import jrummikub.ai.fdsolver.Var; - -public class IfConstraint extends Constraint { - Var<Boolean> condition; - Constraint child; - Collection<Var<?>> vars; - boolean negateCond; - - public IfConstraint(boolean negateCond, Var<Boolean> condition, Constraint child) { - this.condition = condition; - this.child = child; - this.negateCond = negateCond; - vars = new ArrayList<Var<?>>(); - vars.addAll(child.getWatchedVars()); - vars.add(condition); - } - - @Override - public Collection<Var<?>> getWatchedVars() { - return vars; - } - - private class IfPropagator implements Propagator { - Propagator child; - Collection<Var<?>> vars; - public IfPropagator(Propagator child) { - this.child = child; - vars = new ArrayList<Var<?>>(); - vars.addAll(child.getWatchedVars()); - vars.add(condition); - } - - @Override - public Collection<Var<?>> getWatchedVars() { - return vars; - } - - @Override - public void propagate() { - if(condition.getRange().contains(negateCond)) { - return; - } - child.propagate(); - } - } - - private class FailPropagator implements Propagator { - @Override - public Collection<Var<?>> getWatchedVars() { - return child.getWatchedVars(); - } - - @Override - public void propagate() { - if (!child.isSatisfiable()) { - condition.invalidate(!negateCond); - } - } - } - - @Override - public Collection<Propagator> getPropagators(boolean negate) { - List<Propagator> props = new ArrayList<Propagator>(); - if (negate) { - props.add(new FilterPropagator<Boolean>(new Filter<Boolean>() { - @Override - public boolean accept(Boolean value) { - return value ^ negateCond; - } - }, condition)); - props.addAll(child.getPropagators(true)); - } else { - for (Propagator p : child.getPropagators(false)) { - props.add(new IfPropagator(p)); - } - props.add(new FailPropagator()); - } - return props; - } - - @Override - public Satisfiability getSatisfiability() { - if (condition.getRange().contains(negateCond)) { - if (condition.getRange().size() == 1) { - return Satisfiability.TAUT; - } else { - if (child.getSatisfiability() == Satisfiability.TAUT) { - return Satisfiability.TAUT; - } else { - return Satisfiability.SAT; - } - } - } - return child.getSatisfiability(); - } - -} diff --git a/src/jrummikub/ai/fdsolver/constraint/IndexConstraint.java b/src/jrummikub/ai/fdsolver/constraint/IndexConstraint.java deleted file mode 100644 index 6698282..0000000 --- a/src/jrummikub/ai/fdsolver/constraint/IndexConstraint.java +++ /dev/null @@ -1,140 +0,0 @@ -package jrummikub.ai.fdsolver.constraint; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; - -import org.w3c.dom.ranges.Range; - -import jrummikub.ai.fdsolver.Constraint; -import jrummikub.ai.fdsolver.Propagator; -import jrummikub.ai.fdsolver.Satisfiability; -import jrummikub.ai.fdsolver.Var; - -public class IndexConstraint<T> extends Constraint { - Var<T> target; - Var<Integer> index; - List<Var<T>> list; - Collection<Var<?>> vars = new ArrayList<Var<?>>(); - Collection<Var<?>> varsNoTarget = new ArrayList<Var<?>>(); - Collection<Var<?>> varsNoIndex = new ArrayList<Var<?>>(); - - public IndexConstraint(Var<T> target, Var<Integer> index, List<Var<T>> list) { - this.target = target; - this.index = index; - this.list = list; - vars.addAll(list); - vars.add(index); - vars.add(target); - varsNoTarget.addAll(list); - varsNoTarget.add(index); - varsNoIndex.addAll(list); - varsNoIndex.add(target); - } - - @Override - public Collection<Var<?>> getWatchedVars() { - return vars; - } - - private class UnionProp implements Propagator { - @Override - public Collection<Var<?>> getWatchedVars() { - return varsNoTarget; - } - - @Override - public void propagate() { - HashSet<T> invUnion = new HashSet<T>(target.getRange()); - for (int i : index.getRange()) { - invUnion.removeAll(list.get(i).getRange()); - if (invUnion.isEmpty()) { - return; - } - } - for (T val : invUnion) { - target.invalidate(val); - } - }; - } - - private class IndexProp implements Propagator { - @Override - public Collection<Var<?>> getWatchedVars() { - return varsNoIndex; - } - - @Override - public void propagate() { - for (Iterator<Integer> i = index.iterator(); i.hasNext();) { - int id = i.next(); - Var<T> item = list.get(id); - if (Collections.disjoint(item.getRange(), target.getRange())) { - i.remove(); - } - } - } - } - - private class VarProp implements Propagator { - @Override - public Collection<Var<?>> getWatchedVars() { - return Arrays.asList(target, index); - } - - @Override - public void propagate() { - if (index.getRange().size() != 1) - return; - int id = index.getValue(); - Var<T> var = list.get(id); - for(Iterator<T> i = var.iterator(); i.hasNext();) { - if (!target.getRange().contains(i.next())) { - i.remove(); - } - } - } - - } - - @Override - public Collection<Propagator> getPropagators(boolean negate) { - if (negate) { - return Collections.emptyList(); - } - return Arrays.<Propagator> asList(new UnionProp(), new IndexProp(), new VarProp()); - } - - @Override - public boolean isSatisfiable() { - for (int i : index.getRange()) { - if(!Collections.disjoint(list.get(i).getRange(), target.getRange())) { - return true; - } - } - return false; - } - - @Override - public Satisfiability getSatisfiability() { - boolean sat = isSatisfiable(); - if (!sat) { - return Satisfiability.UNSAT; - } - if (target.getRange().size() > 1) - return Satisfiability.SAT; - for (int i : index.getRange()) { - Var<T> var = list.get(i); - if (var.getRange().size() > 1) - return Satisfiability.SAT; - if(var.getValue() != target.getValue()) { - return Satisfiability.SAT; - } - } - return Satisfiability.TAUT; - } -} diff --git a/src/jrummikub/ai/fdsolver/constraint/LessThan.java b/src/jrummikub/ai/fdsolver/constraint/LessThan.java deleted file mode 100644 index b79252c..0000000 --- a/src/jrummikub/ai/fdsolver/constraint/LessThan.java +++ /dev/null @@ -1,17 +0,0 @@ -package jrummikub.ai.fdsolver.constraint; - -import java.util.Comparator; - -import jrummikub.ai.fdsolver.Var; - -public class LessThan<T extends Comparable<T>> extends ComparatorConstraint<T> { - - public LessThan(boolean allowEqual, Var<T> x, Var<T> y) { - super(new Comparator<T>() { - @Override - public int compare(T o1, T o2) { - return o1.compareTo(o2); - } - }, allowEqual, x, y); - } -} diff --git a/src/jrummikub/ai/fdsolver/constraint/LessThanConst.java b/src/jrummikub/ai/fdsolver/constraint/LessThanConst.java deleted file mode 100644 index 18d8827..0000000 --- a/src/jrummikub/ai/fdsolver/constraint/LessThanConst.java +++ /dev/null @@ -1,18 +0,0 @@ -package jrummikub.ai.fdsolver.constraint; - -import java.util.Collection; - -import jrummikub.ai.fdsolver.Propagator; -import jrummikub.ai.fdsolver.Solver; -import jrummikub.ai.fdsolver.Var; - -public class LessThanConst<T extends Comparable<T>> extends FilterConstraint<T> { - public LessThanConst(final boolean allowEqual, Var<T> x, final T y) { - super(new Filter<T>() { - @Override - public boolean accept(T value) { - return value.compareTo(y) < (allowEqual ? 1 : 0); - } - }, x); - } -} diff --git a/src/jrummikub/ai/fdsolver/constraint/ListSumConstraint.java b/src/jrummikub/ai/fdsolver/constraint/ListSumConstraint.java deleted file mode 100644 index 22f480f..0000000 --- a/src/jrummikub/ai/fdsolver/constraint/ListSumConstraint.java +++ /dev/null @@ -1,91 +0,0 @@ -package jrummikub.ai.fdsolver.constraint; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -import jrummikub.ai.fdsolver.Constraint; -import jrummikub.ai.fdsolver.Propagator; -import jrummikub.ai.fdsolver.Satisfiability; -import jrummikub.ai.fdsolver.Var; - -public class ListSumConstraint extends Constraint { - Var<Integer> sum; - List<Var<Integer>> list; - List<Var<?>> vars = new ArrayList<Var<?>>(); - - public ListSumConstraint(Var<Integer> sum, List<Var<Integer>> list) { - this.sum = sum; - this.list = list; - vars.add(sum); - vars.addAll(list); - } - - @Override - public Collection<Var<?>> getWatchedVars() { - return vars; - } - - @Override - public Collection<Propagator> getPropagators(boolean negate) { - return Collections.emptyList(); - } - - @Override - public Satisfiability getSatisfiability() { - List<Integer> values = new ArrayList<Integer>(); - int valueSum = 0; - boolean isTaut = sum.getRange().size()==1; - for (Var<Integer> var : list) { - Iterator<Integer> it = var.getRange().iterator(); - int value = it.next(); - if (it.hasNext()) - isTaut = false; - values.add(value); - valueSum += value; - } - if (isTaut) { - if (valueSum == sum.getValue()) { - return Satisfiability.TAUT; - } else { - return Satisfiability.UNSAT; - } - } - - Set<Integer> reachableValues = new HashSet<Integer>(); - Set<Integer> newValues = new HashSet<Integer>(); - reachableValues.add(valueSum); - - if (sum.getRange().contains(valueSum)) { - return Satisfiability.SAT; - } - - for (int i = 0; i < values.size(); i++) { - Var<Integer> var = list.get(i); - int offset = values.get(i); - for (int x : var.getRange()) { - if (x == offset) - continue; - newValues.clear(); - for (int y : reachableValues) { - int newValue = x + y - offset; - if (!reachableValues.contains(newValue)) { - newValues.add(x + y - offset); - } - } - if (!Collections.disjoint(sum.getRange(), newValues)) { - return Satisfiability.SAT; - } - reachableValues.addAll(newValues); - } - } - - return Satisfiability.UNSAT; - } - -} diff --git a/src/jrummikub/ai/fdsolver/constraint/OffsetConstraint.java b/src/jrummikub/ai/fdsolver/constraint/OffsetConstraint.java deleted file mode 100644 index eb72df8..0000000 --- a/src/jrummikub/ai/fdsolver/constraint/OffsetConstraint.java +++ /dev/null @@ -1,90 +0,0 @@ -package jrummikub.ai.fdsolver.constraint; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.Iterator; - -import jrummikub.ai.fdsolver.Constraint; -import jrummikub.ai.fdsolver.Propagator; -import jrummikub.ai.fdsolver.Satisfiability; -import jrummikub.ai.fdsolver.Var; - -public class OffsetConstraint extends Constraint { - private Var<Integer> x, y; - int offset; - Propagator propX, propY; - - public OffsetConstraint(int offset, Var<Integer> x, Var<Integer> y) { - this.offset = offset; - this.x = x; - this.y = y; - propX = new OffsetProp(offset, x, y); - propY = new OffsetProp(-offset, y, x); - } - - @Override - public Collection<Var<?>> getWatchedVars() { - return Arrays.<Var<?>> asList(x, y); - } - - private class OffsetProp implements Propagator { - private Var<Integer> x, y; - private int offset; - public OffsetProp(int offset, Var<Integer> x, Var<Integer> y) { - this.offset = offset; - this.x = x; - this.y = y; - } - - @Override - public Collection<Var<?>> getWatchedVars() { - return Arrays.<Var<?>>asList(y); - } - - @Override - public void propagate() { - for(Iterator<Integer> i = x.iterator(); i.hasNext();) { - if(!y.getRange().contains(i.next() + offset)) { - i.remove(); - } - } - } - } - - - @Override - public Collection<Propagator> getPropagators(boolean negate) { - return Arrays.asList(propX, propY); - } - - @Override - public Satisfiability getSatisfiability() { - boolean disjoint = true; - if (x.getRange().size() < y.getRange().size()) { - for (int xv : x.getRange()) { - if (y.getRange().contains(xv + offset)) { - disjoint = false; - break; - } - } - } else { - for (int yv : y.getRange()) { - if (x.getRange().contains(yv - offset)) { - disjoint = false; - break; - } - } - } - - if (disjoint) { - return Satisfiability.UNSAT; - } else if (x.getRange().size() == 1 && y.getRange().size() == 1) { - return Satisfiability.TAUT; - } else { - return Satisfiability.SAT; - } - } - -} diff --git a/src/jrummikub/ai/fdsolver/constraint/SameConstraint.java b/src/jrummikub/ai/fdsolver/constraint/SameConstraint.java deleted file mode 100644 index 7fc0025..0000000 --- a/src/jrummikub/ai/fdsolver/constraint/SameConstraint.java +++ /dev/null @@ -1,69 +0,0 @@ -package jrummikub.ai.fdsolver.constraint; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.Iterator; - -import jrummikub.ai.fdsolver.Constraint; -import jrummikub.ai.fdsolver.Propagator; -import jrummikub.ai.fdsolver.Satisfiability; -import jrummikub.ai.fdsolver.Var; - -public class SameConstraint<T> extends Constraint { - private Var<T> x, y; - Propagator propX, propY; - - public SameConstraint(Var<T> x, Var<T> y) { - this.x = x; - this.y = y; - propX = new SameProp<T>(x, y); - propY = new SameProp<T>(y, x); - } - - @Override - public Collection<Var<?>> getWatchedVars() { - return Arrays.<Var<?>> asList(x, y); - } - - private class SameProp<T> implements Propagator { - private Var<T> x, y; - public SameProp(Var<T> x, Var<T> y) { - this.x = x; - this.y = y; - } - - @Override - public Collection<Var<?>> getWatchedVars() { - return Arrays.<Var<?>>asList(y); - } - - @Override - public void propagate() { - for(Iterator<T> i = x.iterator(); i.hasNext();) { - if(!y.getRange().contains(i.next())) { - i.remove(); - } - } - } - } - - - @Override - public Collection<Propagator> getPropagators(boolean negate) { - return Arrays.asList(propX, propY); - } - - @Override - public Satisfiability getSatisfiability() { - if (Collections.disjoint(x.getRange(), y.getRange())) { - return Satisfiability.UNSAT; - } else if (x.getRange().size() == 1 && y.getRange().size() == 1) { - return Satisfiability.TAUT; - } else { - return Satisfiability.SAT; - } - } - -} diff --git a/src/jrummikub/ai/fdsolver/constraint/SumConstraint.java b/src/jrummikub/ai/fdsolver/constraint/SumConstraint.java deleted file mode 100644 index c96a751..0000000 --- a/src/jrummikub/ai/fdsolver/constraint/SumConstraint.java +++ /dev/null @@ -1,51 +0,0 @@ -package jrummikub.ai.fdsolver.constraint; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; - -import jrummikub.ai.fdsolver.Constraint; -import jrummikub.ai.fdsolver.Propagator; -import jrummikub.ai.fdsolver.Satisfiability; -import jrummikub.ai.fdsolver.Var; - -public class SumConstraint extends Constraint { - Var<Integer> x, y, z; - - public SumConstraint(Var<Integer> x, Var<Integer> y, Var<Integer> z) { - this.x = x; - this.y = y; - this.z = z; - } - - @Override - public Collection<Var<?>> getWatchedVars() { - return Arrays.<Var<?>> asList(x, y, z); - } - - @Override - public Collection<Propagator> getPropagators(boolean negate) { - // TODO Auto-generated method stub - return Collections.emptyList(); - } - - @Override - public Satisfiability getSatisfiability() { - // HashSet<Integer> intersection = new HashSet<Integer>(); - for (int xv : x.getRange()) { - for (int yv : y.getRange()) { - if (z.getRange().contains(xv + yv)) { - if (z.getRange().size() == 1 && x.getRange().size() == 1 - && y.getRange().size() == 1) { - return Satisfiability.TAUT; - } else { - return Satisfiability.SAT; - } - - } - } - } - return Satisfiability.UNSAT; - } -} |