[pypy-svn] r32849 - pypy/dist/pypy/objspace/constraint/applevel

auc at codespeak.net auc at codespeak.net
Tue Oct 3 17:50:43 CEST 2006


Author: auc
Date: Tue Oct  3 17:50:42 2006
New Revision: 32849

Modified:
   pypy/dist/pypy/objspace/constraint/applevel/solver.py
Log:
recomputation might work now


Modified: pypy/dist/pypy/objspace/constraint/applevel/solver.py
==============================================================================
--- pypy/dist/pypy/objspace/constraint/applevel/solver.py	(original)
+++ pypy/dist/pypy/objspace/constraint/applevel/solver.py	Tue Oct  3 17:50:42 2006
@@ -44,60 +44,40 @@
 
 #-- dfs with recomputations
 
-class Chain(object):
-    def __init__(self, space=None, parent=None, distance=1):
-        self.space = space
-        self.parent = parent
-        self.distance = distance
-        self.child = None
-        self.last_branch = None
-    def set_branches(self, branches):
-        self.branches = range(branches)
-    def collect_space(self, space):
-        self.child = Chain(space, parent=self,
-                           distance=self.distance + 1)
-        return self.child
-    def clone_time(self):
-        return self.distance % recomputation_distance
-
-def dfs_with_recomputations(space, recomputation_distance=1):
-    assert recomputation_distance > 0
-
-    node = Chain(space)
-
-    def get_space():
-        # XXX: write me
-        pass
-        
-    while node:
-        space = get_space()
-        status = space.ask()
-        if status == 1:
-            yield space.merge()
-        elif status > 1:
-            if node.clone_time():
-                clone = space.clone()
-                if node.child is None:
-                    node.set_branges(status)
-                branch = node.branches.pop()
-                node.last_branch = branch # recomputation info
-                node = node.collect(clone)
-                clone.commit(branch)
-            else:
-                #find previous clone_time node
-                cur = node.parent
-                while not cur.clone_time():
-                    cur = cur.parent
-                # take a clone of the local space,
-                # replay all the branches
-                clone = cur.space.clone()
-                while cur.child:
-                    clone.commit(cur.last_branch)
-                    cur = cur.child
-                # now, do the new computation
-                # XXX: factor me out
-                assert cur is node
-                branch = node.branches.pop()
-                node.last_branch = branch
-                node = node.collect(None)
-                clone.commit(branch)
+
+def recompute(space, branches_list):
+    # branches_list contains the recomputation path,
+    # bottom-up
+    if branches_list == None:
+        return space.clone()
+    else:
+        head, tail = branches_list
+        C = recompute(space, tail)
+        return C.commit(head)
+
+def dfre(S, R, branches_list, distance, max_dist, solutions):
+    status = S.ask()
+    if status == 0:
+        return
+    elif status == 1:
+        solutions.append(S.merge())
+        return
+    else: # assert status == 2
+        if distance == max_dist:
+            C = S.clone()
+            S.commit(1)
+            dfre(S, C, (1, None), 1, max_dist, solutions)
+            C.commit(2)
+            dfre(C, C, None, max_dist, max_dist, solutions)
+        else:
+            S.commit(1)
+            dfre(S, R, (1, branches_list), distance+1, max_dist, solutions)
+            C = recompute(R, branches_list)
+            C.commit(2)
+            dfre(C, R, (2, branches_list), distance+1, max_dist, solutions)
+
+def solve_recomputing(space, recomputation_distance=5):
+    solutions = []
+    dfre(space, space, None, recomputation_distance, max_dist, solutions)
+    return solutions
+



More information about the Pypy-commit mailing list