[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