[pypy-svn] r22593 - pypy/dist/pypy/lib/logic
auc at codespeak.net
auc at codespeak.net
Tue Jan 24 14:55:32 CET 2006
Author: auc
Date: Tue Jan 24 14:55:30 2006
New Revision: 22593
Modified:
pypy/dist/pypy/lib/logic/test_unification.py
pypy/dist/pypy/lib/logic/unification.py
Log:
(auc, ale)
* add satisfiability check returning narrowed domains
* more tests
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 14:55:30 2006
@@ -298,6 +298,17 @@
assert y.dom == c.FiniteDomain([2, 3])
assert z.dom == c.FiniteDomain([3, 4])
assert w.dom == c.FiniteDomain([1, 4, 5])
+ narrowed_doms = u.get_satisfying_domains(k1)
+ assert narrowed_doms == {x:c.FiniteDomain([5]),
+ y:c.FiniteDomain([2]),
+ z:c.FiniteDomain([3]),
+ w:c.FiniteDomain([4, 5])}
+ narrowed_doms = u.get_satisfying_domains(k2)
+ assert narrowed_doms == {x:c.FiniteDomain([5]),
+ y:c.FiniteDomain([2]),
+ z:c.FiniteDomain([3]),
+ w:c.FiniteDomain([4, 5])}
+
def test_satisfy_many_const_failure(self):
x,y,z,w = (u.var('x'), u.var('y'),
@@ -320,4 +331,9 @@
assert y.dom == c.FiniteDomain([2, 3])
assert z.dom == c.FiniteDomain([3, 4])
assert w.dom == c.FiniteDomain([1])
+ narrowed_doms = u.get_satisfying_domains(k1)
+ assert narrowed_doms == {}
+ narrowed_doms = u.get_satisfying_domains(k2)
+ assert narrowed_doms == {}
+
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 14:55:30 2006
@@ -220,14 +220,8 @@
varset = set()
constset = set()
compute_dependant_vars(constraint, varset, constset)
- old_domains = {}
- for var in varset:
- old_domains[var] = FiniteDomain(var.dom)
-
- def restore_domains(domains):
- for var, dom in domains.items():
- var.dom = dom
-
+ old_domains = collect_domains(varset)
+
for const in constset:
try:
const.narrow()
@@ -237,6 +231,27 @@
restore_domains(old_domains)
return True
+
+ def get_satisfying_domains(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)
+ return {}
+ narrowed_domains = collect_domains(varset)
+ restore_domains(old_domains)
+ return narrowed_domains
+
+ def satisfy(constraint):
+ pass
+
#-- BIND -------------------------------------------
def bind(self, var, val):
@@ -393,6 +408,25 @@
compute_dependant_vars(const, varset, constset)
+#-- collect / restore utilities for domains
+
+def collect_domains(varset):
+ """makes a copy of domains of a set of vars
+ into a var -> dom mapping
+ """
+ dom = {}
+ for var in varset:
+ dom[var] = FiniteDomain(var.dom)
+ return dom
+
+def restore_domains(domains):
+ """sets the domain of the vars in the domains mapping
+ to their (previous) value
+ """
+ for var, dom in domains.items():
+ var.dom = dom
+
+
#-- Unifiability checks---------------------------------------
#--
#-- quite costly & could be merged back in unify
@@ -475,6 +509,9 @@
def satisfiable(constraint):
return _store.satisfiable(constraint)
+def get_satisfying_domains(constraint):
+ return _store.get_satisfying_domains(constraint)
+
def bind(var, val):
return _store.bind(var, val)
More information about the Pypy-commit
mailing list