[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