[pypy-svn] r25465 - in pypy/dist/pypy/objspace/constraint: . test
auc at codespeak.net
auc at codespeak.net
Thu Apr 6 23:17:37 CEST 2006
Author: auc
Date: Thu Apr 6 23:17:36 2006
New Revision: 25465
Added:
pypy/dist/pypy/objspace/constraint/expression_syntax_proposal.py
Modified:
pypy/dist/pypy/objspace/constraint/domain.py
pypy/dist/pypy/objspace/constraint/test/test_fd.py
Log:
ruminations about constraint exprs simplification
Modified: pypy/dist/pypy/objspace/constraint/domain.py
==============================================================================
--- pypy/dist/pypy/objspace/constraint/domain.py (original)
+++ pypy/dist/pypy/objspace/constraint/domain.py Thu Apr 6 23:17:36 2006
@@ -93,23 +93,34 @@
return W_FiniteDomain(self._space, self.w_get_values())
def __repr__(self):
- return '<FD %s>' % str(self.get_values())
+ return '<FD %s>' % str(self.w_get_values())
def __eq__(self, w_other):
- if w_other is NoDom: return False
- return self._values == w_other._values
+ if not isinstance(w_other, W_FiniteDomain):
+ return self._space.w_False
+ return self._space.newbool(self._space.eq_w(self._values, w_other._values))
def __ne__(self, w_other):
return not self == w_other
# function bolted into the space to serve as constructor
def make_fd(space, w_values):
- return W_FiniteDomain(space, w_values)
+ return space.wrap(W_FiniteDomain(space, w_values))
app_make_fd = gateway.interp2app(make_fd)
+def intersection(space, w_fd1, w_fd2):
+ assert isinstance(w_fd1, W_FiniteDomain)
+ assert isinstance(w_fd2, W_FiniteDomain)
+ return space.intersection(w_fd1, w_fd2)
+app_intersection = gateway.interp2app(intersection)
+
+
def intersection__FiniteDomain_FiniteDomain(space, w_fd1, w_fd2):
- return make_fd(w_fd1.w_get_values() + w_fd2.w_get_values())
+ w_v1 = w_fd1._values
+ w_res = [w_v for w_v in w_fd2.w_get_values().wrappeditems
+ if w_v in w_v1]
+ return make_fd(space, space.newlist(w_res))
intersection_mm = StdObjSpaceMultiMethod('intersection', 2)
intersection_mm.register(intersection__FiniteDomain_FiniteDomain,
@@ -122,5 +133,6 @@
remove_values = interp2app(W_FiniteDomain.w_remove_values),
get_values = interp2app(W_FiniteDomain.w_get_values),
copy = interp2app(W_FiniteDomain.w_copy),
- size = interp2app(W_FiniteDomain.w_size))
+ size = interp2app(W_FiniteDomain.w_size),
+ __eq__ = interp2app(W_FiniteDomain.__eq__))
Added: pypy/dist/pypy/objspace/constraint/expression_syntax_proposal.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/objspace/constraint/expression_syntax_proposal.py Thu Apr 6 23:17:36 2006
@@ -0,0 +1,47 @@
+
+
+#-- with a new expr construct (lambda on steroids)
+
+def queens_problem(n):
+ s = newspace()
+ queens = []
+ for i in range(n):
+ queens.append(s.var(FiniteDomain([(i,j)
+ for i in range(n)
+ for j in range(n)])))
+ for i in range(n):
+ for j in range(i,n):
+ s.add(expr queens[i], queens[j]: queens[i][0] != queen[j][0]) #-> s.add(make_expression([queen[i], queen[j]],
+ ## '%s[0] != %s[0]'%[q.name for q in [queen[i], queen[j]])
+ s.add(expr queens[i], queens[j]: queens[i][1] != queen[j][1])
+ s.add(AllDistinct(queens))
+ return s
+
+
+#-- redefining python operators
+
+class Variable:
+ def __getitem__(self, key):
+ return ViewVariable(self,
+ def __neq__(self, other):
+ return NotEqualConstraint(self, other)
+ def __add__(self, other):
+ pass
+ def __radd__(self, other):
+ pass
+
+
+class QueensProblem(ComputationSpace):
+ def __init__(self, n):
+ vars = [Variable(FiniteDomain([(i,j)
+ for i in range(n)
+ for j in range(n)])
+ )
+ for k in n]
+ constraints = []
+ for i in range(n):
+ for j in range(i,n):
+ constraint.append(vars[i][0] != vars[j][0])
+ ComputationSpace.__init__(self, vars, constraints)
+
+
Modified: pypy/dist/pypy/objspace/constraint/test/test_fd.py
==============================================================================
--- pypy/dist/pypy/objspace/constraint/test/test_fd.py (original)
+++ pypy/dist/pypy/objspace/constraint/test/test_fd.py Thu Apr 6 23:17:36 2006
@@ -54,11 +54,11 @@
assert fd.size() == 1
assert fd.has_changed()
- def notest_intersection(self):
+ def test_intersection(self):
"""not used for now"""
fd1 = FiniteDomain([1, 2, 3])
- fd2 = FiniteDomain([2,3,4])
- assert fd1.intersection(fd2) == set([2,3])
- assert fd2.intersection(fd1) == set([3,2])
+ fd2 = FiniteDomain([2, 3, 4])
+ assert intersection(fd1, fd2) == FiniteDomain([2, 3])
+ assert intersection(fd2, fd1) == FiniteDomain([3, 2])
More information about the Pypy-commit
mailing list