[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