[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