[pypy-svn] r25699 - in pypy/dist/pypy/objspace/constraint: . test

auc at codespeak.net auc at codespeak.net
Tue Apr 11 15:50:02 CEST 2006


Author: auc
Date: Tue Apr 11 15:49:59 2006
New Revision: 25699

Modified:
   pypy/dist/pypy/objspace/constraint/computationspace.py
   pypy/dist/pypy/objspace/constraint/distributor.py
   pypy/dist/pypy/objspace/constraint/domain.py
   pypy/dist/pypy/objspace/constraint/test/test_computationspace.py
Log:
cspace cloning


Modified: pypy/dist/pypy/objspace/constraint/computationspace.py
==============================================================================
--- pypy/dist/pypy/objspace/constraint/computationspace.py	(original)
+++ pypy/dist/pypy/objspace/constraint/computationspace.py	Tue Apr 11 15:49:59 2006
@@ -65,31 +65,43 @@
     def __init__(self, obj_space):
         self._space = obj_space
         # var -> dom
-        self.var_dom = self._space.newdict({})
+        self.var_dom = {}
         # constraint set
-        self.constraints = self._space.newdict({})
+        self.constraints = {}
         # var -> constraints
         self.var_const = {}
         # freshly added constraints (tell -> propagate)
         self.to_check = {}
 
+    def w_clone(self):
+        new = newspace(self._space)
+        for var, dom in self.var_dom.items():
+            new.var_dom[var] = dom.w_copy()
+        # !! be sure to not put state in constraints
+        new.constraints = self.constraints
+        for const in self.to_check:
+            new.to_check[const] = True
+        for var, const in self.var_const.items():
+            new.var_const[var] = const
+        return new
+
     def w_var(self, w_name, w_domain):
         assert isinstance(w_name, W_StringObject)
         assert isinstance(w_domain, W_AbstractDomain)
-        if w_name in self.var_dom.content:
+        if w_name in self.var_dom:
             raise OperationError(self._space.w_RuntimeError,
                                  self._space.wrap("Name already used"))
         var = W_Variable(self._space, w_name)
-        self.var_dom.content[var] = w_domain
+        self.var_dom[var] = w_domain
         return var
 
     def w_dom(self, w_variable):
         assert isinstance(w_variable, W_Variable)
-        return self.var_dom.content[w_variable]
+        return self.var_dom[w_variable]
 
     def w_tell(self, w_constraint):
         assert isinstance(w_constraint, W_Constraint)
-        self.constraints.content[w_constraint] = self._space.w_True
+        self.constraints[w_constraint] = self._space.w_True
         for var in w_constraint.affected_variables():
             self.var_const.setdefault(var, [])
             self.var_const[var].append(w_constraint)
@@ -104,8 +116,8 @@
         except KeyError:
             return []
 
-    def w_propagate(self):
-        return self.propagate()
+    def w_ask(self):
+        self.propagate()
 
     def propagate(self):
         const_q = [(const.estimate_cost_w(self), const)
@@ -138,18 +150,18 @@
                 # the set of satifiable constraints of the space
                 if const in affected_constraints:
                     affected_constraints.remove(const)
-
-
+        
 
 W_ComputationSpace.typedef = typedef.TypeDef(
     "W_ComputationSpace",
     var = interp2app(W_ComputationSpace.w_var),
     dom = interp2app(W_ComputationSpace.w_dom),
     tell = interp2app(W_ComputationSpace.w_tell),
-    propagate = interp2app(W_ComputationSpace.w_propagate),
+    ask = interp2app(W_ComputationSpace.w_ask),
+    clone = interp2app(W_ComputationSpace.w_clone),
     dependant_constraints = interp2app(W_ComputationSpace.w_dependant_constraints))
 
 
-def newspace(space):
-    return W_ComputationSpace(space)
+def newspace(object_space):
+    return W_ComputationSpace(object_space)
 app_newspace = gateway.interp2app(newspace)

Modified: pypy/dist/pypy/objspace/constraint/distributor.py
==============================================================================
--- pypy/dist/pypy/objspace/constraint/distributor.py	(original)
+++ pypy/dist/pypy/objspace/constraint/distributor.py	Tue Apr 11 15:49:59 2006
@@ -32,11 +32,11 @@
         """returns the variable having the smallest domain.
         (or one of such varibles if there is a tie)
         """
-        vars_ = [var for var, dom in w_cs.var_dom.content.items()
+        vars_ = [var for var, dom in w_cs.var_dom.items()
                  if dom.size() > 1]
         best = vars_[0]
         for var in vars_:
-            if w_cs.var_dom.content[var].size() < w_cs.var_dom.content[best].size():
+            if w_cs.var_dom[var].size() < w_cs.var_dom[best].size():
                 best = var
         return best
 

Modified: pypy/dist/pypy/objspace/constraint/domain.py
==============================================================================
--- pypy/dist/pypy/objspace/constraint/domain.py	(original)
+++ pypy/dist/pypy/objspace/constraint/domain.py	Tue Apr 11 15:49:59 2006
@@ -143,7 +143,8 @@
                          W_FiniteDomain, W_FiniteDomain)
 all_mms['intersection'] = intersection_mm
 
-W_FiniteDomain.typedef = typedef.TypeDef("W_FiniteDomain",
+W_FiniteDomain.typedef = typedef.TypeDef(
+    "W_FiniteDomain",
     W_AbstractDomain.typedef,
     remove_value = interp2app(W_FiniteDomain.w_remove_value),
     remove_values = interp2app(W_FiniteDomain.w_remove_values),

Modified: pypy/dist/pypy/objspace/constraint/test/test_computationspace.py
==============================================================================
--- pypy/dist/pypy/objspace/constraint/test/test_computationspace.py	(original)
+++ pypy/dist/pypy/objspace/constraint/test/test_computationspace.py	Tue Apr 11 15:49:59 2006
@@ -32,7 +32,7 @@
         for v in (v1, v2):
             assert cstr in csp.dependant_constraints(v)
 
-    def test_propagate(self):
+    def test_ask(self):
         csp = newspace()
         x = csp.var('x', FiniteDomain([1]))
         y = csp.var('y', FiniteDomain([1, 2]))
@@ -40,8 +40,25 @@
         csp.tell(make_expression([x, y], 'x<y'))
         csp.tell(make_expression([y, z], 'y<z'))
         csp.tell(make_expression([x, z], 'x<z'))
-        csp.propagate()
+        csp.ask()
         assert csp.dom(x) == FiniteDomain([1])
         assert csp.dom(y) == FiniteDomain([2])
         assert csp.dom(z) == FiniteDomain([3])
+
+    def test_clone(self):
+        csp = newspace()
+        x = csp.var('x', FiniteDomain([1]))
+        y = csp.var('y', FiniteDomain([1, 2]))
+        z = csp.var('z', FiniteDomain([1, 2, 3]))
+        csp.tell(make_expression([x, y], 'x<y'))
+        csp.tell(make_expression([y, z], 'y<z'))
+        csp.tell(make_expression([x, z], 'x<z'))
+        new = csp.clone()
+        new.ask()
+        assert new.dom(x) == FiniteDomain([1])
+        assert new.dom(y) == FiniteDomain([2])
+        assert new.dom(z) == FiniteDomain([3])
+        assert csp.dom(x) == FiniteDomain([1])
+        assert csp.dom(y) == FiniteDomain([1, 2])
+        assert csp.dom(z) == FiniteDomain([1, 2, 3])
         



More information about the Pypy-commit mailing list