[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