[pypy-svn] r22595 - pypy/dist/pypy/lib/logic
auc at codespeak.net
auc at codespeak.net
Tue Jan 24 15:22:06 CET 2006
Author: auc
Date: Tue Jan 24 15:22:00 2006
New Revision: 22595
Modified:
pypy/dist/pypy/lib/logic/constraint.py
pypy/dist/pypy/lib/logic/test_unification.py
pypy/dist/pypy/lib/logic/unification.py
Log:
(auc, ale)
* add satisfy method on (store, constraint) which updates the store (narrows domains)
* more tests
Modified: pypy/dist/pypy/lib/logic/constraint.py
==============================================================================
--- pypy/dist/pypy/lib/logic/constraint.py (original)
+++ pypy/dist/pypy/lib/logic/constraint.py Tue Jan 24 15:22:00 2006
@@ -111,7 +111,7 @@
def intersection(self, other):
if other is None: return self.get_values()
- return self.get_values() & other.get_values()
+ return self._values & other._values
#-- Constraints ------------------------------------------
Modified: pypy/dist/pypy/lib/logic/test_unification.py
==============================================================================
--- pypy/dist/pypy/lib/logic/test_unification.py (original)
+++ pypy/dist/pypy/lib/logic/test_unification.py Tue Jan 24 15:22:00 2006
@@ -277,7 +277,7 @@
assert y.dom == c.FiniteDomain([2, 3])
assert z.dom == c.FiniteDomain([3, 4])
- def test_satisfy_many_const_success(self):
+ def test_satisfiable_many_const_success(self):
x,y,z,w = (u.var('x'), u.var('y'),
u.var('z'), u.var('w'))
x.dom = c.FiniteDomain([1, 2, 5])
@@ -310,7 +310,7 @@
w:c.FiniteDomain([4, 5])}
- def test_satisfy_many_const_failure(self):
+ def test_satisfiable_many_const_failure(self):
x,y,z,w = (u.var('x'), u.var('y'),
u.var('z'), u.var('w'))
x.dom = c.FiniteDomain([1, 2, 5])
@@ -335,5 +335,42 @@
assert narrowed_doms == {}
narrowed_doms = u.get_satisfying_domains(k2)
assert narrowed_doms == {}
+
+ def test_satisfy_many_const_failure(self):
+ x,y,z,w = (u.var('x'), u.var('y'),
+ u.var('z'), u.var('w'))
+ x.dom = c.FiniteDomain([1, 2, 5])
+ y.dom = c.FiniteDomain([2, 3])
+ z.dom = c.FiniteDomain([3, 4])
+ w.dom = c.FiniteDomain([1])
+ k1 = c.Expression([x, y, z], 'x == y + z')
+ k2 = c.Expression([z, w], 'z < w')
+ u.add_constraint(k1)
+ u.add_constraint(k2)
+ raises(u.ConsistencyFailure, u.satisfy, k1)
+ assert x.dom == c.FiniteDomain([1, 2, 5])
+ assert y.dom == c.FiniteDomain([2, 3])
+ assert z.dom == c.FiniteDomain([3, 4])
+ assert w.dom == c.FiniteDomain([1])
+ raises(u.ConsistencyFailure, u.satisfy, k2)
+ assert x.dom == c.FiniteDomain([1, 2, 5])
+ assert y.dom == c.FiniteDomain([2, 3])
+ assert z.dom == c.FiniteDomain([3, 4])
+ assert w.dom == c.FiniteDomain([1])
-
+ def test_satisfy_many_const_success(self):
+ x,y,z,w = (u.var('x'), u.var('y'),
+ u.var('z'), u.var('w'))
+ x.dom = c.FiniteDomain([1, 2, 5])
+ y.dom = c.FiniteDomain([2, 3])
+ z.dom = c.FiniteDomain([3, 4])
+ w.dom = c.FiniteDomain([1, 4, 5])
+ k1 = c.Expression([x, y, z], 'x == y + z')
+ k2 = c.Expression([z, w], 'z < w')
+ u.add_constraint(k1)
+ u.add_constraint(k2)
+ u.satisfy(k2)
+ assert x.dom == c.FiniteDomain([5])
+ assert y.dom == c.FiniteDomain([2])
+ assert z.dom == c.FiniteDomain([3])
+ assert w.dom == c.FiniteDomain([4, 5])
Modified: pypy/dist/pypy/lib/logic/unification.py
==============================================================================
--- pypy/dist/pypy/lib/logic/unification.py (original)
+++ pypy/dist/pypy/lib/logic/unification.py Tue Jan 24 15:22:00 2006
@@ -249,9 +249,21 @@
restore_domains(old_domains)
return narrowed_domains
- def satisfy(constraint):
- pass
+ def satisfy(self, constraint):
+ assert constraint in self.constraints
+ varset = set()
+ constset = set()
+ compute_dependant_vars(constraint, varset, constset)
+ old_domains = collect_domains(varset)
+ for const in constset:
+ try:
+ const.narrow()
+ except ConsistencyFailure:
+ restore_domains(old_domains)
+ raise
+
+
#-- BIND -------------------------------------------
def bind(self, var, val):
@@ -512,6 +524,9 @@
def get_satisfying_domains(constraint):
return _store.get_satisfying_domains(constraint)
+def satisfy(constraint):
+ return _store.satisfy(constraint)
+
def bind(var, val):
return _store.bind(var, val)
More information about the Pypy-commit
mailing list