summaryrefslogtreecommitdiffstats
path: root/src/jrummikub/ai/fdsolver/constraint
diff options
context:
space:
mode:
Diffstat (limited to 'src/jrummikub/ai/fdsolver/constraint')
-rw-r--r--src/jrummikub/ai/fdsolver/constraint/ComparatorConstraint.java74
-rw-r--r--src/jrummikub/ai/fdsolver/constraint/ComparatorPropagator.java42
-rw-r--r--src/jrummikub/ai/fdsolver/constraint/Filter.java5
-rw-r--r--src/jrummikub/ai/fdsolver/constraint/FilterConstraint.java65
-rw-r--r--src/jrummikub/ai/fdsolver/constraint/FilterPropagator.java31
-rw-r--r--src/jrummikub/ai/fdsolver/constraint/GreaterThan.java18
-rw-r--r--src/jrummikub/ai/fdsolver/constraint/GreaterThanConst.java15
-rw-r--r--src/jrummikub/ai/fdsolver/constraint/IfConstraint.java108
-rw-r--r--src/jrummikub/ai/fdsolver/constraint/IndexConstraint.java140
-rw-r--r--src/jrummikub/ai/fdsolver/constraint/LessThan.java17
-rw-r--r--src/jrummikub/ai/fdsolver/constraint/LessThanConst.java18
-rw-r--r--src/jrummikub/ai/fdsolver/constraint/ListSumConstraint.java91
-rw-r--r--src/jrummikub/ai/fdsolver/constraint/OffsetConstraint.java90
-rw-r--r--src/jrummikub/ai/fdsolver/constraint/SameConstraint.java69
-rw-r--r--src/jrummikub/ai/fdsolver/constraint/SumConstraint.java51
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;
- }
-}