[pypy-svn] r23571 - pypy/dist/pypy/lib/logic/computation_space

auc at codespeak.net auc at codespeak.net
Tue Feb 21 18:21:32 CET 2006


Author: auc
Date: Tue Feb 21 18:21:29 2006
New Revision: 23571

Modified:
   pypy/dist/pypy/lib/logic/computation_space/computationspace.py
   pypy/dist/pypy/lib/logic/computation_space/problems.py
   pypy/dist/pypy/lib/logic/computation_space/test_computationspace.py
Log:
small refactoring (constraints/expressions)


Modified: pypy/dist/pypy/lib/logic/computation_space/computationspace.py
==============================================================================
--- pypy/dist/pypy/lib/logic/computation_space/computationspace.py	(original)
+++ pypy/dist/pypy/lib/logic/computation_space/computationspace.py	Tue Feb 21 18:21:29 2006
@@ -10,7 +10,8 @@
 
 from variable import EqSet, Var, NoValue, Pair, \
      VariableException, NotAVariable, AlreadyInStore
-from constraint import FiniteDomain, ConsistencyFailure
+from constraint import FiniteDomain, ConsistencyFailure, \
+     Expression
 from distributor import DefaultDistributor
 
 #FIXME: provide a NoDom token which has nothing
@@ -313,7 +314,14 @@
     
     #-- Constraints -------------------------
 
-    def add_constraint(self, constraint):
+    def add_expression(self, constraint):
+        self.constraints.add(constraint)
+        for var in constraint.affectedVariables():
+            self.var_const_map.setdefault(var, set())
+            self.var_const_map[var].add(constraint)
+
+    def add_constraint(self, vars, const):
+        constraint = Expression(self, vars, const)
         self.constraints.add(constraint)
         for var in constraint.affectedVariables():
             self.var_const_map.setdefault(var, set())

Modified: pypy/dist/pypy/lib/logic/computation_space/problems.py
==============================================================================
--- pypy/dist/pypy/lib/logic/computation_space/problems.py	(original)
+++ pypy/dist/pypy/lib/logic/computation_space/problems.py	Tue Feb 21 18:21:29 2006
@@ -4,7 +4,7 @@
 
 def dummy_problem(computation_space):
     ret = computation_space.var('__dummy__')
-    computation_space.set_dom(ret, c.FiniteDomain([1, 2]))
+    computation_space.set_dom(ret, c.FiniteDomain([]))
     return (ret)
 
 def satisfiable_problem(computation_space):
@@ -13,7 +13,7 @@
     cs.set_dom(x, c.FiniteDomain([-4, -2, -1, 0, 1, 2, 4]))
     cs.set_dom(y, c.FiniteDomain([0, 2, 3, 4, 5, 16]))
     cs.set_dom(z, c.FiniteDomain([-2, -1, 0, 1, 2]))
-    cs.add_constraint(c.Expression(cs, [x, y, z], 'y==x**2-z'))
+    cs.add_constraint([x, y, z], 'y==x**2-z')
     # set up a distribution strategy
     cs.set_distributor(di.DichotomyDistributor(cs))
     return (x, y, z)
@@ -26,8 +26,8 @@
     cs.set_dom(y, c.FiniteDomain([2, 3]))
     cs.set_dom(z, c.FiniteDomain([4, 5]))
     cs.set_dom(w, c.FiniteDomain([1, 4, 5]))
-    cs.add_constraint(c.Expression(cs, [x, y, z], 'x == y + z'))
-    cs.add_constraint(c.Expression(cs, [z, w], 'z < w'))
+    cs.add_constraint([x, y, z], 'x == y + z')
+    cs.add_constraint([z, w], 'z < w')
     # set up a distribution strategy
     cs.set_distributor(di.DichotomyDistributor(cs))
     return (x, w, y)
@@ -41,8 +41,8 @@
     cs.set_dom(y, c.FiniteDomain([2, 3]))
     cs.set_dom(z, c.FiniteDomain([4, 5]))
     cs.set_dom(w, c.FiniteDomain([1]))
-    cs.add_constraint(c.Expression(cs, [x, y, z], 'x == y + z'))
-    cs.add_constraint(c.Expression(cs, [z, w], 'z < w'))
+    cs.add_constraint([x, y, z], 'x == y + z')
+    cs.add_constraint([z, w], 'z < w')
     # set up a distribution strategy
     cs.set_distributor(di.DichotomyDistributor(cs))
     return (x, w, y)
@@ -60,13 +60,14 @@
     for v1 in variables:
         for v2 in variables:
             if v1 != v2:
-                cs.add_constraint(c.Expression(cs, [v1, v2], '%s != %s' % (v1.name, v2.name)))
+                cs.add_constraint([v1, v2],
+                                  '%s != %s' % (v1.name, v2.name))
 
     # use fd.NotEquals
-    cs.add_constraint(c.Expression(cs, [s], 's != 0'))
-    cs.add_constraint(c.Expression(cs, [m], 'm != 0'))
-    cs.add_constraint(c.Expression(cs, [s, e, n, d, m, o, r, y],
-                                   '1000*s+100*e+10*n+d+1000*m+100*o+10*r+e == 10000*m+1000*o+100*n+10*e+y'))
+    cs.add_constraint([s], 's != 0')
+    cs.add_constraint([m], 'm != 0')
+    cs.add_constraint([s, e, n, d, m, o, r, y],
+                                   '1000*s+100*e+10*n+d+1000*m+100*o+10*r+e == 10000*m+1000*o+100*n+10*e+y')
     cs.set_distributor(di.DichotomyDistributor(cs))
     print cs.constraints
     return (s, e, n, d, m, o, r, y)
@@ -87,18 +88,15 @@
 
     for conf in ('c03','c04','c05','c06'):
         v = cs.get_var_by_name(conf)
-        cs.add_constraint(c.Expression(cs, [v],
-                                       "%s[0] == 'room C'" % v.name))
+        cs.add_constraint([v], "%s[0] == 'room C'" % v.name)
 
     for conf in ('c01','c05','c10'):
         v = cs.get_var_by_name(conf)
-        cs.add_constraint(c.Expression(cs, [v],
-                                       "%s[1].startswith('day 1')" % v.name))
+        cs.add_constraint([v], "%s[1].startswith('day 1')" % v.name)
 
     for conf in ('c02','c03','c04','c09'):
         v = cs.get_var_by_name(conf)
-        cs.add_constraint(c.Expression(cs, [v],
-                                       "%s[1].startswith('day 2')" % v.name))
+        cs.add_constraint([v], "%s[1].startswith('day 2')" % v.name)
 
     groups = (('c01','c02','c03','c10'),
               ('c02','c06','c08','c09'),
@@ -110,13 +108,10 @@
             for conf2 in g:
                 v1, v2 = cs.find_vars(conf1, conf2)
                 if conf2 > conf1:
-                    cs.add_constraint(c.Expression(cs, [v1,v2],
-                                                   '%s[1] != %s[1]'%\
-                                                   (v1.name,v2.name)))
+                    cs.add_constraint([v1,v2], '%s[1] != %s[1]'% (v1.name,v2.name))
 
     for conf1 in variables:
         for conf2 in variables:
             if conf2 > conf1:
-                cs.add_constraint(c.Expression(cs, [conf1,conf2],
-                                               '%s != %s'%(conf1.name,conf2.name)))
+                cs.add_constraint([conf1,conf2], '%s != %s'%(conf1.name,conf2.name))
     return tuple(variables)

Modified: pypy/dist/pypy/lib/logic/computation_space/test_computationspace.py
==============================================================================
--- pypy/dist/pypy/lib/logic/computation_space/test_computationspace.py	(original)
+++ pypy/dist/pypy/lib/logic/computation_space/test_computationspace.py	Tue Feb 21 18:21:29 2006
@@ -290,7 +290,7 @@
         assert z.val == 42
         assert sp.dom(z) == c.FiniteDomain([41, 42, 43])
 
-    def test_add_constraint(self):
+    def test_add_expression(self):
         sp = newspace()
         x,y,z = sp.var('x'), sp.var('y'), sp.var('z')
         raises(c.DomainlessVariables,
@@ -299,7 +299,7 @@
         sp.set_dom(y, c.FiniteDomain([2, 3]))
         sp.set_dom(z, c.FiniteDomain([3, 4]))
         k = c.Expression(sp, [x, y, z], 'x == y + z')
-        sp.add_constraint(k)
+        sp.add_expression(k)
         assert k in sp.constraints
 
     def test_narrowing_domains_failure(self):
@@ -333,8 +333,8 @@
         sp.set_dom(w, c.FiniteDomain([1, 4, 5]))
         k1 = c.Expression(sp, [x, y, z], 'x == y + z')
         k2 = c.Expression(sp, [z, w], 'z < w')
-        sp.add_constraint(k1)
-        sp.add_constraint(k2)
+        sp.add_expression(k1)
+        sp.add_expression(k2)
         varset = set()
         constset = set()
         sp._compute_dependant_vars(k1, varset, constset)
@@ -348,7 +348,7 @@
         sp.set_dom(y, c.FiniteDomain([2, 3]))
         sp.set_dom(z, c.FiniteDomain([3, 4]))
         k = c.Expression(sp, [x, y, z], 'x == y + z')
-        sp.add_constraint(k)
+        sp.add_expression(k)
         assert sp.satisfiable(k) == True
         assert sp.dom(x) == c.FiniteDomain([1, 2, 5])
         assert sp.dom(y) == c.FiniteDomain([2, 3])
@@ -361,7 +361,7 @@
         sp.set_dom(y, c.FiniteDomain([2, 3]))
         sp.set_dom(z, c.FiniteDomain([3, 4]))
         k = c.Expression(sp, [x, y, z], 'x == y + z')
-        sp.add_constraint(k)
+        sp.add_expression(k)
         assert sp.satisfiable(k) == False
         assert sp.dom(x) == c.FiniteDomain([1, 2])
         assert sp.dom(y) == c.FiniteDomain([2, 3])
@@ -377,8 +377,8 @@
         sp.set_dom(w, c.FiniteDomain([1, 4, 5]))
         k1 = c.Expression(sp, [x, y, z], 'x == y + z')
         k2 = c.Expression(sp, [z, w], 'z < w')
-        sp.add_constraint(k1)
-        sp.add_constraint(k2)
+        sp.add_expression(k1)
+        sp.add_expression(k2)
         assert sp.satisfiable(k1) == True
         assert sp.dom(x) == c.FiniteDomain([1, 2, 5])
         assert sp.dom(y) == c.FiniteDomain([2, 3])
@@ -411,8 +411,8 @@
         sp.set_dom(w, c.FiniteDomain([1]))
         k1 = c.Expression(sp, [x, y, z], 'x == y + z')
         k2 = c.Expression(sp, [z, w], 'z < w')
-        sp.add_constraint(k1)
-        sp.add_constraint(k2)
+        sp.add_expression(k1)
+        sp.add_expression(k2)
         assert sp.satisfiable(k1) == False
         assert sp.dom(x) == c.FiniteDomain([1, 2, 5])
         assert sp.dom(y) == c.FiniteDomain([2, 3])
@@ -438,8 +438,8 @@
         sp.set_dom(w, c.FiniteDomain([1]))
         k1 = c.Expression(sp, [x, y, z], 'x == y + z')
         k2 = c.Expression(sp, [z, w], 'z < w')
-        sp.add_constraint(k1)
-        sp.add_constraint(k2)
+        sp.add_expression(k1)
+        sp.add_expression(k2)
         raises(space.ConsistencyFailure, sp.satisfy, k1)
         assert sp.dom(x) == c.FiniteDomain([1, 2, 5])
         assert sp.dom(y) == c.FiniteDomain([2, 3])
@@ -461,8 +461,8 @@
         sp.set_dom(w, c.FiniteDomain([1, 4, 5]))
         k1 = c.Expression(sp, [x, y, z], 'x == y + z')
         k2 = c.Expression(sp, [z, w], 'z < w')
-        sp.add_constraint(k1)
-        sp.add_constraint(k2)
+        sp.add_expression(k1)
+        sp.add_expression(k2)
         sp.satisfy(k2)
         assert sp.dom(x) == c.FiniteDomain([5])
         assert sp.dom(y) == c.FiniteDomain([2])
@@ -524,30 +524,20 @@
         assert spc.ask() == space.Alternatives(2)
         new_spc = spc.clone()
         # following couple of ops superceeded by inject()
-        x = new_spc.get_var_by_name('x')
-        new_spc.add_constraint(c.Expression(new_spc, [x],
-                                            'x == 0'))
-        z = new_spc.get_var_by_name('z')
-        y = new_spc.get_var_by_name('y')
-        new_spc.add_constraint(c.Expression(new_spc, [z, y],
-                                            'z == y'))
-        new_spc.add_constraint(c.Expression(new_spc, [y],
-                                            'y < 2'))
+        x, y, z = new_spc.find_vars('x', 'y', 'z')
+        new_spc.add_constraint([x], 'x == 0')
+        new_spc.add_constraint([z, y], 'z == y')
+        new_spc.add_constraint([y], 'y < 2')
         new_spc._process()
         assert spc.ask() == space.Alternatives(2)
         assert new_spc.ask() == space.Succeeded
 
     def test_inject(self):
         def more_constraints(space):
-            x = new_spc.get_var_by_name('x')
-            space.add_constraint(c.Expression(new_spc, [x],
-                                                'x == 0'))
-            z = space.get_var_by_name('z')
-            y = space.get_var_by_name('y')
-            space.add_constraint(c.Expression(new_spc, [z, y],
-                                                'z == y'))
-            space.add_constraint(c.Expression(new_spc, [y],
-                                            'y < 2'))
+            x, y, z = new_spc.find_vars('x', 'y', 'z')
+            space.add_constraint([x], 'x == 0')
+            space.add_constraint([z, y], 'z == y')
+            space.add_constraint([y], 'y < 2')
 
         spc = newspace(problems.satisfiable_problem)
         assert spc.ask() == space.Alternatives(2)
@@ -569,15 +559,10 @@
                                              1, 2])
 
         def more_constraints(space):
-            x = space.get_var_by_name('x')
-            space.add_constraint(c.Expression(space, [x],
-                                                'x == 0'))
-            z = space.get_var_by_name('z')
-            y = space.get_var_by_name('y')
-            space.add_constraint(c.Expression(space, [z, y],
-                                                'z == y'))
-            space.add_constraint(c.Expression(space, [y],
-                                            'y < 2'))
+            x, y, z = space.find_vars('x', 'y', 'z')
+            space.add_constraint([x], 'x == 0')
+            space.add_constraint([z, y], 'z == y')
+            space.add_constraint([y], 'y < 2')
 
         nspc = spc.clone()
         nspc.inject(more_constraints)



More information about the Pypy-commit mailing list