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

auc at codespeak.net auc at codespeak.net
Tue Apr 11 13:03:00 CEST 2006


Author: auc
Date: Tue Apr 11 13:02:58 2006
New Revision: 25696

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
   pypy/dist/pypy/objspace/constraint/test/test_distributor.py
Log:
distribute with naive distributor


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 13:02:58 2006
@@ -52,9 +52,9 @@
 
 class W_Distributor(Wrappable):
 
-    def __init__(self, object_space, fanout):
+    def __init__(self, object_space, fanout_w):
         self._space = object_space
-        self.fanout = fanout
+        self.fanout = fanout_w
 
 W_Distributor.typedef = typedef.TypeDef("W_Distributor")
 
@@ -64,39 +64,45 @@
 class W_ComputationSpace(Wrappable):
     def __init__(self, obj_space):
         self._space = obj_space
-        # there, var -> dom
-        self.var_doms = self._space.newdict({})
+        # var -> dom
+        self.var_dom = self._space.newdict({})
         # constraint set
         self.constraints = self._space.newdict({})
         # var -> constraints
-        self.var_const_map = {}
+        self.var_const = {}
         # freshly added constraints (tell -> propagate)
         self.to_check = {}
 
     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_doms.content:
+        if w_name in self.var_dom.content:
             raise OperationError(self._space.w_RuntimeError,
                                  self._space.wrap("Name already used"))
         var = W_Variable(self._space, w_name)
-        self.var_doms.content[var] = w_domain
+        self.var_dom.content[var] = w_domain
         return var
 
     def w_dom(self, w_variable):
         assert isinstance(w_variable, W_Variable)
-        return self.var_doms.content[w_variable]
+        return self.var_dom.content[w_variable]
 
     def w_tell(self, w_constraint):
         assert isinstance(w_constraint, W_Constraint)
         self.constraints.content[w_constraint] = self._space.w_True
         for var in w_constraint.affected_variables():
-            self.var_const_map.setdefault(var, [])
-            self.var_const_map[var].append(w_constraint)
+            self.var_const.setdefault(var, [])
+            self.var_const[var].append(w_constraint)
         self.to_check[w_constraint] = True
 
+    def w_dependant_constraints(self, w_var):
+        return self._space.newlist(self.dependant_constraints(w_var))
+
     def dependant_constraints(self, var):
-        return self.var_const_map[var]
+        try:
+            return self.var_const[var]
+        except KeyError:
+            return []
 
     def w_propagate(self):
         return self.propagate()
@@ -140,7 +146,8 @@
     var = interp2app(W_ComputationSpace.w_var),
     dom = interp2app(W_ComputationSpace.w_dom),
     tell = interp2app(W_ComputationSpace.w_tell),
-    propagate = interp2app(W_ComputationSpace.w_propagate))
+    propagate = interp2app(W_ComputationSpace.w_propagate),
+    dependant_constraints = interp2app(W_ComputationSpace.w_dependant_constraints))
 
 
 def newspace(space):

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 13:02:58 2006
@@ -5,6 +5,8 @@
 from pypy.interpreter import baseobjspace, typedef, gateway
 from pypy.interpreter.gateway import interp2app
 
+from pypy.objspace.std.intobject import W_IntObject
+
 from pypy.objspace.constraint.computationspace import W_Distributor
 
 def arrange_domains(cs, variables):
@@ -26,32 +28,33 @@
         """return number of possible splits"""
         return self.fanout
 
-    def find_smallest_domain(self):
+    def _find_smallest_domain(self, w_cs):
         """returns the variable having the smallest domain.
         (or one of such varibles if there is a tie)
         """
-        vars_ = [var for var in self.cs.get_variables_with_a_domain()
-                 if self.cs.dom(var).size() > 1]
+        vars_ = [var for var, dom in w_cs.var_dom.content.items()
+                 if dom.size() > 1]
         
         best = vars_[0]
         for var in vars_:
-            if self.cs.dom(var).size() < self.cs.dom(best).size():
+            if w_cs.var_dom.content[var].size() < w_cs.var_dom.content[best].size():
                 best = var
         
         return best
 
     def w_distribute(self, w_cs, w_choice):
-        assert isintance(w_choice, W_IntegerObject)
+        assert isinstance(w_choice, W_IntObject)
         self.distribute(w_cs, self._space.int_w(w_choice))
 
     def distribute(self, w_cs, choice_w):
-        variable = self._find_distribution_variable()
-        self._do_distribute(self.cs.dom(variable), choice)
-        for const in self.cs.dependant_constraints(variable):
-            self.cs.event_set.add(const)
+        variable = self.find_distribution_variable(w_cs)
+        self._do_distribute(w_cs.var_dom.content[variable],
+                            choice_w)
+        for const in w_cs.dependant_constraints(variable):
+            w_cs.to_check[const] = True
 
-    def _find_distribution_variable(self):
-        return self.find_smallest_domain()
+    def find_distribution_variable(self, w_cs):
+        return self._find_smallest_domain(w_cs)
     
     def _do_distribute(self, domain, choice):
         """remove values from domain depending on choice"""
@@ -75,9 +78,9 @@
     def _do_distribute(self, domain, choice):
         values = domain.get_values()
         if choice == 0:
-            domain.remove_values(values[1:])
+            domain.w_remove_values(values[1:])
         else:
-            domain.remove_value(values[0])
+            domain.w_remove_value(values[0])
 
 W_NaiveDistributor.typedef = typedef.TypeDef(
     "W_NaiveDistributor",
@@ -133,5 +136,3 @@
     return make_split_distributor(object_space, 2)
 app_make_dichotomy_distributor = interp2app(make_dichotomy_distributor)
 
-
-#DefaultDistributor = W_NaiveDistributor

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 13:02:58 2006
@@ -91,7 +91,10 @@
     def w_get_values(self):
         """return all the values in the domain
            in an indexable sequence"""
-        return self._space.newlist([x for x in self._values])
+        return self._space.newlist(self.get_values())
+
+    def get_values(self):
+        return [x for x in self._values]
 
     def __iter__(self):
         return iter(self._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 13:02:58 2006
@@ -29,6 +29,8 @@
         v2 = csp.var('v2', FiniteDomain([1, 2]))
         cstr = AllDistinct([v1, v2])
         csp.tell(cstr)
+        for v in (v1, v2):
+            assert cstr in csp.dependant_constraints(v)
 
     def test_propagate(self):
         csp = newspace()

Modified: pypy/dist/pypy/objspace/constraint/test/test_distributor.py
==============================================================================
--- pypy/dist/pypy/objspace/constraint/test/test_distributor.py	(original)
+++ pypy/dist/pypy/objspace/constraint/test/test_distributor.py	Tue Apr 11 13:02:58 2006
@@ -10,5 +10,15 @@
         d1 = NaiveDistributor()
         d2 = SplitDistributor(4)
         d3 = DichotomyDistributor()
-
-        
+        assert d1.fanout() == 2
+        assert d2.fanout() == 4
+        assert d3.fanout() == 2
+    
+    def test_naive_distribute(self):
+        spc = newspace()
+        x = spc.var('x', FiniteDomain([1]))
+        y = spc.var('y', FiniteDomain([1, 2]))
+        z = spc.var('z', FiniteDomain([1, 2, 3]))
+        d = NaiveDistributor()
+        d.distribute(spc, 2)
+        assert spc.dom(y) == FiniteDomain([2])



More information about the Pypy-commit mailing list