[pypy-svn] r23571 - pypy/dist/pypy/lib/logic/computation_space
auc at codespeak.net
auc at codespeak.net
Tue Feb 21 18:21:32 CET 2006
Author: auc
Date: Tue Feb 21 18:21:29 2006
New Revision: 23571
Modified:
pypy/dist/pypy/lib/logic/computation_space/computationspace.py
pypy/dist/pypy/lib/logic/computation_space/problems.py
pypy/dist/pypy/lib/logic/computation_space/test_computationspace.py
Log:
small refactoring (constraints/expressions)
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 Feb 21 18:21:29 2006
@@ -10,7 +10,8 @@
from variable import EqSet, Var, NoValue, Pair, \
VariableException, NotAVariable, AlreadyInStore
-from constraint import FiniteDomain, ConsistencyFailure
+from constraint import FiniteDomain, ConsistencyFailure, \
+ Expression
from distributor import DefaultDistributor
#FIXME: provide a NoDom token which has nothing
@@ -313,7 +314,14 @@
#-- Constraints -------------------------
- def add_constraint(self, constraint):
+ def add_expression(self, constraint):
+ self.constraints.add(constraint)
+ for var in constraint.affectedVariables():
+ self.var_const_map.setdefault(var, set())
+ self.var_const_map[var].add(constraint)
+
+ def add_constraint(self, vars, const):
+ constraint = Expression(self, vars, const)
self.constraints.add(constraint)
for var in constraint.affectedVariables():
self.var_const_map.setdefault(var, set())
Modified: pypy/dist/pypy/lib/logic/computation_space/problems.py
==============================================================================
--- pypy/dist/pypy/lib/logic/computation_space/problems.py (original)
+++ pypy/dist/pypy/lib/logic/computation_space/problems.py Tue Feb 21 18:21:29 2006
@@ -4,7 +4,7 @@
def dummy_problem(computation_space):
ret = computation_space.var('__dummy__')
- computation_space.set_dom(ret, c.FiniteDomain([1, 2]))
+ computation_space.set_dom(ret, c.FiniteDomain([]))
return (ret)
def satisfiable_problem(computation_space):
@@ -13,7 +13,7 @@
cs.set_dom(x, c.FiniteDomain([-4, -2, -1, 0, 1, 2, 4]))
cs.set_dom(y, c.FiniteDomain([0, 2, 3, 4, 5, 16]))
cs.set_dom(z, c.FiniteDomain([-2, -1, 0, 1, 2]))
- cs.add_constraint(c.Expression(cs, [x, y, z], 'y==x**2-z'))
+ cs.add_constraint([x, y, z], 'y==x**2-z')
# set up a distribution strategy
cs.set_distributor(di.DichotomyDistributor(cs))
return (x, y, z)
@@ -26,8 +26,8 @@
cs.set_dom(y, c.FiniteDomain([2, 3]))
cs.set_dom(z, c.FiniteDomain([4, 5]))
cs.set_dom(w, c.FiniteDomain([1, 4, 5]))
- cs.add_constraint(c.Expression(cs, [x, y, z], 'x == y + z'))
- cs.add_constraint(c.Expression(cs, [z, w], 'z < w'))
+ cs.add_constraint([x, y, z], 'x == y + z')
+ cs.add_constraint([z, w], 'z < w')
# set up a distribution strategy
cs.set_distributor(di.DichotomyDistributor(cs))
return (x, w, y)
@@ -41,8 +41,8 @@
cs.set_dom(y, c.FiniteDomain([2, 3]))
cs.set_dom(z, c.FiniteDomain([4, 5]))
cs.set_dom(w, c.FiniteDomain([1]))
- cs.add_constraint(c.Expression(cs, [x, y, z], 'x == y + z'))
- cs.add_constraint(c.Expression(cs, [z, w], 'z < w'))
+ cs.add_constraint([x, y, z], 'x == y + z')
+ cs.add_constraint([z, w], 'z < w')
# set up a distribution strategy
cs.set_distributor(di.DichotomyDistributor(cs))
return (x, w, y)
@@ -60,13 +60,14 @@
for v1 in variables:
for v2 in variables:
if v1 != v2:
- cs.add_constraint(c.Expression(cs, [v1, v2], '%s != %s' % (v1.name, v2.name)))
+ cs.add_constraint([v1, v2],
+ '%s != %s' % (v1.name, v2.name))
# use fd.NotEquals
- cs.add_constraint(c.Expression(cs, [s], 's != 0'))
- cs.add_constraint(c.Expression(cs, [m], 'm != 0'))
- cs.add_constraint(c.Expression(cs, [s, e, n, d, m, o, r, y],
- '1000*s+100*e+10*n+d+1000*m+100*o+10*r+e == 10000*m+1000*o+100*n+10*e+y'))
+ cs.add_constraint([s], 's != 0')
+ cs.add_constraint([m], 'm != 0')
+ cs.add_constraint([s, e, n, d, m, o, r, y],
+ '1000*s+100*e+10*n+d+1000*m+100*o+10*r+e == 10000*m+1000*o+100*n+10*e+y')
cs.set_distributor(di.DichotomyDistributor(cs))
print cs.constraints
return (s, e, n, d, m, o, r, y)
@@ -87,18 +88,15 @@
for conf in ('c03','c04','c05','c06'):
v = cs.get_var_by_name(conf)
- cs.add_constraint(c.Expression(cs, [v],
- "%s[0] == 'room C'" % v.name))
+ cs.add_constraint([v], "%s[0] == 'room C'" % v.name)
for conf in ('c01','c05','c10'):
v = cs.get_var_by_name(conf)
- cs.add_constraint(c.Expression(cs, [v],
- "%s[1].startswith('day 1')" % v.name))
+ cs.add_constraint([v], "%s[1].startswith('day 1')" % v.name)
for conf in ('c02','c03','c04','c09'):
v = cs.get_var_by_name(conf)
- cs.add_constraint(c.Expression(cs, [v],
- "%s[1].startswith('day 2')" % v.name))
+ cs.add_constraint([v], "%s[1].startswith('day 2')" % v.name)
groups = (('c01','c02','c03','c10'),
('c02','c06','c08','c09'),
@@ -110,13 +108,10 @@
for conf2 in g:
v1, v2 = cs.find_vars(conf1, conf2)
if conf2 > conf1:
- cs.add_constraint(c.Expression(cs, [v1,v2],
- '%s[1] != %s[1]'%\
- (v1.name,v2.name)))
+ cs.add_constraint([v1,v2], '%s[1] != %s[1]'% (v1.name,v2.name))
for conf1 in variables:
for conf2 in variables:
if conf2 > conf1:
- cs.add_constraint(c.Expression(cs, [conf1,conf2],
- '%s != %s'%(conf1.name,conf2.name)))
+ cs.add_constraint([conf1,conf2], '%s != %s'%(conf1.name,conf2.name))
return tuple(variables)
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 Feb 21 18:21:29 2006
@@ -290,7 +290,7 @@
assert z.val == 42
assert sp.dom(z) == c.FiniteDomain([41, 42, 43])
- def test_add_constraint(self):
+ def test_add_expression(self):
sp = newspace()
x,y,z = sp.var('x'), sp.var('y'), sp.var('z')
raises(c.DomainlessVariables,
@@ -299,7 +299,7 @@
sp.set_dom(y, c.FiniteDomain([2, 3]))
sp.set_dom(z, c.FiniteDomain([3, 4]))
k = c.Expression(sp, [x, y, z], 'x == y + z')
- sp.add_constraint(k)
+ sp.add_expression(k)
assert k in sp.constraints
def test_narrowing_domains_failure(self):
@@ -333,8 +333,8 @@
sp.set_dom(w, c.FiniteDomain([1, 4, 5]))
k1 = c.Expression(sp, [x, y, z], 'x == y + z')
k2 = c.Expression(sp, [z, w], 'z < w')
- sp.add_constraint(k1)
- sp.add_constraint(k2)
+ sp.add_expression(k1)
+ sp.add_expression(k2)
varset = set()
constset = set()
sp._compute_dependant_vars(k1, varset, constset)
@@ -348,7 +348,7 @@
sp.set_dom(y, c.FiniteDomain([2, 3]))
sp.set_dom(z, c.FiniteDomain([3, 4]))
k = c.Expression(sp, [x, y, z], 'x == y + z')
- sp.add_constraint(k)
+ sp.add_expression(k)
assert sp.satisfiable(k) == True
assert sp.dom(x) == c.FiniteDomain([1, 2, 5])
assert sp.dom(y) == c.FiniteDomain([2, 3])
@@ -361,7 +361,7 @@
sp.set_dom(y, c.FiniteDomain([2, 3]))
sp.set_dom(z, c.FiniteDomain([3, 4]))
k = c.Expression(sp, [x, y, z], 'x == y + z')
- sp.add_constraint(k)
+ sp.add_expression(k)
assert sp.satisfiable(k) == False
assert sp.dom(x) == c.FiniteDomain([1, 2])
assert sp.dom(y) == c.FiniteDomain([2, 3])
@@ -377,8 +377,8 @@
sp.set_dom(w, c.FiniteDomain([1, 4, 5]))
k1 = c.Expression(sp, [x, y, z], 'x == y + z')
k2 = c.Expression(sp, [z, w], 'z < w')
- sp.add_constraint(k1)
- sp.add_constraint(k2)
+ sp.add_expression(k1)
+ sp.add_expression(k2)
assert sp.satisfiable(k1) == True
assert sp.dom(x) == c.FiniteDomain([1, 2, 5])
assert sp.dom(y) == c.FiniteDomain([2, 3])
@@ -411,8 +411,8 @@
sp.set_dom(w, c.FiniteDomain([1]))
k1 = c.Expression(sp, [x, y, z], 'x == y + z')
k2 = c.Expression(sp, [z, w], 'z < w')
- sp.add_constraint(k1)
- sp.add_constraint(k2)
+ sp.add_expression(k1)
+ sp.add_expression(k2)
assert sp.satisfiable(k1) == False
assert sp.dom(x) == c.FiniteDomain([1, 2, 5])
assert sp.dom(y) == c.FiniteDomain([2, 3])
@@ -438,8 +438,8 @@
sp.set_dom(w, c.FiniteDomain([1]))
k1 = c.Expression(sp, [x, y, z], 'x == y + z')
k2 = c.Expression(sp, [z, w], 'z < w')
- sp.add_constraint(k1)
- sp.add_constraint(k2)
+ sp.add_expression(k1)
+ sp.add_expression(k2)
raises(space.ConsistencyFailure, sp.satisfy, k1)
assert sp.dom(x) == c.FiniteDomain([1, 2, 5])
assert sp.dom(y) == c.FiniteDomain([2, 3])
@@ -461,8 +461,8 @@
sp.set_dom(w, c.FiniteDomain([1, 4, 5]))
k1 = c.Expression(sp, [x, y, z], 'x == y + z')
k2 = c.Expression(sp, [z, w], 'z < w')
- sp.add_constraint(k1)
- sp.add_constraint(k2)
+ sp.add_expression(k1)
+ sp.add_expression(k2)
sp.satisfy(k2)
assert sp.dom(x) == c.FiniteDomain([5])
assert sp.dom(y) == c.FiniteDomain([2])
@@ -524,30 +524,20 @@
assert spc.ask() == space.Alternatives(2)
new_spc = spc.clone()
# following couple of ops superceeded by inject()
- x = new_spc.get_var_by_name('x')
- new_spc.add_constraint(c.Expression(new_spc, [x],
- 'x == 0'))
- z = new_spc.get_var_by_name('z')
- y = new_spc.get_var_by_name('y')
- new_spc.add_constraint(c.Expression(new_spc, [z, y],
- 'z == y'))
- new_spc.add_constraint(c.Expression(new_spc, [y],
- 'y < 2'))
+ x, y, z = new_spc.find_vars('x', 'y', 'z')
+ new_spc.add_constraint([x], 'x == 0')
+ new_spc.add_constraint([z, y], 'z == y')
+ new_spc.add_constraint([y], 'y < 2')
new_spc._process()
assert spc.ask() == space.Alternatives(2)
assert new_spc.ask() == space.Succeeded
def test_inject(self):
def more_constraints(space):
- x = new_spc.get_var_by_name('x')
- space.add_constraint(c.Expression(new_spc, [x],
- 'x == 0'))
- z = space.get_var_by_name('z')
- y = space.get_var_by_name('y')
- space.add_constraint(c.Expression(new_spc, [z, y],
- 'z == y'))
- space.add_constraint(c.Expression(new_spc, [y],
- 'y < 2'))
+ x, y, z = new_spc.find_vars('x', 'y', 'z')
+ space.add_constraint([x], 'x == 0')
+ space.add_constraint([z, y], 'z == y')
+ space.add_constraint([y], 'y < 2')
spc = newspace(problems.satisfiable_problem)
assert spc.ask() == space.Alternatives(2)
@@ -569,15 +559,10 @@
1, 2])
def more_constraints(space):
- x = space.get_var_by_name('x')
- space.add_constraint(c.Expression(space, [x],
- 'x == 0'))
- z = space.get_var_by_name('z')
- y = space.get_var_by_name('y')
- space.add_constraint(c.Expression(space, [z, y],
- 'z == y'))
- space.add_constraint(c.Expression(space, [y],
- 'y < 2'))
+ x, y, z = space.find_vars('x', 'y', 'z')
+ space.add_constraint([x], 'x == 0')
+ space.add_constraint([z, y], 'z == y')
+ space.add_constraint([y], 'y < 2')
nspc = spc.clone()
nspc.inject(more_constraints)
More information about the Pypy-commit
mailing list