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

auc at codespeak.net auc at codespeak.net
Tue Jan 31 18:05:23 CET 2006


Author: auc
Date: Tue Jan 31 18:05:22 2006
New Revision: 22903

Modified:
   pypy/dist/pypy/lib/logic/computation_space/computationspace.py
   pypy/dist/pypy/lib/logic/computation_space/distributor.py
   pypy/dist/pypy/lib/logic/computation_space/test_computationspace.py
Log:
* add inject (to further constrain a space)
* fix space/distributor relationship
* remove dead code


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 Jan 31 18:05:22 2006
@@ -160,23 +160,6 @@
 ## then it returns alternatives(N), where N is the number of
 ## alternatives.
 
-## An example specifying how to use a computation space :
-
-## def my_problem(store):
-##     #declare variables, their domain
-##     x, y, z = var('x'), var('y'), var('z')
-##     #declare constraints
-##     set_domain(x, FiniteDomain([1, 2]))
-##     set_domain(y, FiniteDomain([2, 3]))
-##     set_domain(z, FiniteDomain([42, 43]))
-##     add_constraint(c.Expression([x, y, z], 'x == y + z'))
-##     add_constraint(c.Expression([z, w], 'z < w'))
-##     #set up a distribution strategy
-##     ????
-##     return (x, y, z) 
-
-## space = ComputationSpace(fun=my_problem)
-
 from threading import Thread, Condition, RLock, local
 
 from state import Succeeded, Distributable, Failed, Merged
@@ -249,9 +232,10 @@
        * variables bound to a number, record or procedure
          (also called determined variables)."""
 
+    # we have to enforce only one distributor
+    # thread running in one space at the same time
     _nb_choices = 0
 
-    
     def __init__(self, problem, parent=None):
         # consistency-preserving stuff
         self.in_transaction = False
@@ -644,15 +628,15 @@
         spc = ComputationSpace(NoProblem, parent=self)
         for var in spc.vars:
             var.cs_set_dom(spc, var.cs_get_dom(self).copy())
-        # check satisfiability of the space
-        spc._process()
+        spc.distributor.set_space(spc)
         if spc.status == Distributable:
             spc.distributor.start()
         return spc
 
     def inject(self, restricting_problem):
-        """add additional stuff into a space"""
-        pass
+        """add additional entities into a space"""
+        restricting_problem(self)
+        self._process()
 
     def commit(self, choice):
         """if self is distributable, causes the Choose call in the
@@ -682,39 +666,6 @@
         ComputationSpace._nb_choices += 1
         return self.var('__choice__'+str(self._nb_choices))
 
-    def make_children(self):
-        for dommap in self.distributor.distribute():
-            cs = ComputationSpace(lambda cs : True,
-                                  parent=self)
-            self.children.add(cs)
-            for var, dom in dommap.items():
-                var.cs_set_dom(cs, dom)
-
-    def solve_all(self):
-        """recursively solves the problem
-        """
-        if self.status == Unprocessed:
-            self.process()
-            if self.status == Succeeded: return self.root
-            if self.status == Failed: raise Failed
-            self.make_children()
-            results = set() # to be merged/committed ?
-            for cs in self.children:
-                try:
-                    results.add(cs.solve_all())
-                except Failed:
-                    pass
-            for result in results:
-                # Q: do we (a) merge our children results right now
-                #    or (b) do we pass results up the call chain ?
-                # (b) makes sense for a SolveAll kind of method on cs's
-                # (a) might be more Oz-ish, maybe allowing some very fancy
-                #     stuff with distribution or whatever
-                self.do_something_with(result)
-
-
-
-
 #-- Unifiability checks---------------------------------------
 #--
 #-- quite costly & could be merged back in unify
@@ -778,36 +729,3 @@
 def _both_are_bound(v1, v2):
     return v1._is_bound() and v2._is_bound()
 
-
-
-#--
-#-- the global store
-#from problems import dummy_problem
-#_cs = ComputationSpace(dummy_problem)
-
-#-- global accessor functions
-## def var(name):
-##     v = Var(name, _cs)
-##     _cs.add_unbound(v)
-##     return v
-
-## def set_domain(var, dom):
-##     return _cs.set_domain(var, dom)
-
-## def add_constraint(constraint):
-##     return _cs.add_constraint(constraint)
-
-## def satisfiable(constraint):
-##     return _cs.satisfiable(constraint)
-
-## def get_satisfying_domains(constraint):
-##     return _cs.get_satisfying_domains(constraint)
-
-## def satisfy(constraint):
-##     return _cs.satisfy(constraint)
-
-## def bind(var, val):
-##     return _cs.bind(var, val)
-
-## def unify(var1, var2):
-##     return _cs.unify(var1, var2)

Modified: pypy/dist/pypy/lib/logic/computation_space/distributor.py
==============================================================================
--- pypy/dist/pypy/lib/logic/computation_space/distributor.py	(original)
+++ pypy/dist/pypy/lib/logic/computation_space/distributor.py	Tue Jan 31 18:05:22 2006
@@ -18,6 +18,9 @@
         self.nb_subspaces = nb_subspaces
         self.cs = c_space
         self.verbose = 0
+
+    def set_space(self, space):
+        self.cs = space
             
     def findSmallestDomain(self):
         """returns the variable having the smallest domain.
@@ -132,8 +135,6 @@
     def run(self):
         while self.cs.status == Distributable:
             choice = self.cs.choose(self.nb_subdomains())
-            if self.cs.status == Failed:
-                return
             self.new_distribute(choice)
             self.cs._process()
 

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 Jan 31 18:05:22 2006
@@ -489,7 +489,7 @@
         spc = space.ComputationSpace(problems.satisfiable_problem)
         assert spc.ask() == space.Alternatives(2)
 
-    def test_distribute(self):
+    def test_old_distribute(self):
         spc = space.ComputationSpace(problems.satisfiable_problem)
         new_domains = [tuple(d.items()) for d in
                        spc.distributor.distribute()]
@@ -512,13 +512,8 @@
             for (e1, e2) in zip(d1, d2):
                 print e1, '=?', e2
                 assert e1 == e2
-        # the following assertion fails for mysterious reasons
-        # have we discovered a bug in CPython ?
-        #print hash(new_domains[0]), hash(new_domains[1])
-        #print hash(expected_domains[0]), hash(expected_domains[1])
-        #assert set(new_domains) == set(expected_domains)
 
-    def test_clone(self):
+    def test_clone_and_distribute(self):
         spc = space.ComputationSpace(problems.satisfiable_problem)
         w = spc.get_var_by_name('w')
         assert spc.ask() == space.Alternatives(2)
@@ -529,5 +524,17 @@
         assert new_spc.ask() == space.Succeeded
         assert w.cs_get_dom(spc) == c.FiniteDomain([5, 6, 7])
         assert w.cs_get_dom(new_spc) == c.FiniteDomain([5])
-        spc.commit(0)
-        new_spc.commit(0)
+
+    def test_inject(self):
+        def more_constraints(space):
+            space.add_constraint(c.Expression(space, [w], 'w == 5'))
+        spc = space.ComputationSpace(problems.satisfiable_problem)
+        w = spc.get_var_by_name('w')
+        assert spc.ask() == space.Alternatives(2)
+        new_spc = spc.clone()
+        new_spc.inject(more_constraints)
+        assert spc.ask() == space.Alternatives(2)
+        assert new_spc.ask() == space.Succeeded
+        assert w.cs_get_dom(spc) == c.FiniteDomain([5, 6, 7])
+        assert w.cs_get_dom(new_spc) == c.FiniteDomain([5])
+        



More information about the Pypy-commit mailing list