[pypy-commit] pypy numpy-multidim-shards: make more tests pass

fijal noreply at buildbot.pypy.org
Sun Nov 13 18:20:16 CET 2011


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: numpy-multidim-shards
Changeset: r49375:a90cb67cd9f9
Date: 2011-11-13 18:19 +0100
http://bitbucket.org/pypy/pypy/changeset/a90cb67cd9f9/

Log:	make more tests pass

diff --git a/py/_code/code.py b/py/_code/code.py
--- a/py/_code/code.py
+++ b/py/_code/code.py
@@ -307,7 +307,7 @@
                     self._striptext = 'AssertionError: '
         self._excinfo = tup
         self.type, self.value, tb = self._excinfo
-        self.typename = self.type.__name__
+        self.typename = getattr(self.type, "__name__", "???")
         self.traceback = py.code.Traceback(tb)
 
     def __repr__(self):
diff --git a/pypy/module/micronumpy/interp_numarray.py b/pypy/module/micronumpy/interp_numarray.py
--- a/pypy/module/micronumpy/interp_numarray.py
+++ b/pypy/module/micronumpy/interp_numarray.py
@@ -75,6 +75,9 @@
     def done(self):
         raise NotImplementedError
 
+    def get_offset(self):
+        raise NotImplementedError
+
 class ArrayIterator(BaseIterator):
     def __init__(self, size):
         self.offset = 0
@@ -86,6 +89,9 @@
     def done(self):
         return self.offset >= self.size
 
+    def get_offset(self):
+        return self.offset
+
 class ViewIterator(BaseIterator):
     def __init__(self, arr):
         self.indices = [0] * len(arr.shape)
@@ -109,6 +115,9 @@
     def done(self):
         return self._done
 
+    def get_offset(self):
+        return self.offset
+
 class Call2Iterator(BaseIterator):
     def __init__(self, left, right):
         self.left = left
@@ -121,6 +130,11 @@
     def done(self):
         return self.left.done() or self.right.done()
 
+    def get_offset(self):
+        if isinstance(self.left, ConstantIterator):
+            return self.right.get_offset()
+        return self.left.get_offset()
+
 class Call1Iterator(BaseIterator):
     def __init__(self, child):
         self.child = child
@@ -131,6 +145,9 @@
     def done(self):
         return self.child.done()
 
+    def get_offset(self):
+        return self.child.get_offset()
+
 class ConstantIterator(BaseIterator):
     def next(self):
         pass
@@ -138,6 +155,9 @@
     def done(self):
         return False
 
+    def get_offset(self):
+        return 0
+
 class BaseArray(Wrappable):
     _attrs_ = ["invalidates", "signature", "shape", "shards", "backshards",
                "start"]
@@ -231,24 +251,23 @@
 
     def _reduce_argmax_argmin_impl(op_name):
         reduce_driver = jit.JitDriver(greens=['signature'],
-                         reds = ['i', 'size', 'result', 'self', 'cur_best', 'dtype'])
-        def loop(self, size):
-            xxx
-            result = 0
-            cur_best = self.eval(self.start)
-            i = 1
+                         reds = ['i', 'result', 'self', 'cur_best', 'dtype'])
+        def loop(self):
+            i = self.start_iter()
+            result = i.get_offset()
+            cur_best = self.eval(i)
+            i.next()
             dtype = self.find_dtype()
-            while i < size:
+            while not i.done():
                 reduce_driver.jit_merge_point(signature=self.signature,
                                               self=self, dtype=dtype,
-                                              size=size, i=i, result=result,
+                                              i=i, result=result,
                                               cur_best=cur_best)
-                xxx
                 new_best = getattr(dtype, op_name)(cur_best, self.eval(i))
                 if dtype.ne(new_best, cur_best):
-                    result = i
+                    result = i.get_offset()
                     cur_best = new_best
-                i += 1
+                i.next()
             return result
         def impl(self, space):
             size = self.find_size()
@@ -256,7 +275,7 @@
                 raise OperationError(space.w_ValueError,
                     space.wrap("Can't call %s on zero-size arrays" \
                             % op_name))
-            return space.wrap(loop(self, size))
+            return self.compute_index(space, loop(self))
         return func_with_new_name(impl, "reduce_arg%s_impl" % op_name)
 
     def _all(self):
@@ -486,6 +505,17 @@
     def start_iter(self):
         raise NotImplementedError
 
+    def compute_index(self, space, offset):
+        offset -= self.start
+        if len(self.shape) == 1:
+            return space.wrap(offset // self.shards[0])
+        indices_w = []
+        for shard in self.shards:
+            r = offset // shard
+            indices_w.append(space.wrap(r))
+            offset -= shard * r
+        return space.newtuple(indices_w)
+
 def convert_to_array(space, w_obj):
     if isinstance(w_obj, BaseArray):
         return w_obj
diff --git a/pypy/module/micronumpy/interp_ufuncs.py b/pypy/module/micronumpy/interp_ufuncs.py
--- a/pypy/module/micronumpy/interp_ufuncs.py
+++ b/pypy/module/micronumpy/interp_ufuncs.py
@@ -10,7 +10,7 @@
 
 reduce_driver = jit.JitDriver(
     greens = ["signature"],
-    reds = ["i", "size", "self", "dtype", "value", "obj"]
+    reds = ["i", "self", "dtype", "value", "obj"]
 )
 
 class W_Ufunc(Wrappable):
@@ -56,28 +56,27 @@
             space, obj.find_dtype(),
             promote_to_largest=True
         )
-        start = 0
+        start = obj.start_iter()
         if self.identity is None:
             if size == 0:
                 raise operationerrfmt(space.w_ValueError, "zero-size array to "
                     "%s.reduce without identity", self.name)
-            value = obj.eval(0).convert_to(dtype)
-            start += 1
+            value = obj.eval(start).convert_to(dtype)
+            start.next()
         else:
             value = self.identity.convert_to(dtype)
         new_sig = signature.Signature.find_sig([
             self.reduce_signature, obj.signature
         ])
-        return self.reduce(new_sig, start, value, obj, dtype, size).wrap(space)
+        return self.reduce(new_sig, start, value, obj, dtype).wrap(space)
 
-    def reduce(self, signature, start, value, obj, dtype, size):
-        i = start
-        while i < size:
+    def reduce(self, signature, i, value, obj, dtype):
+        while not i.done():
             reduce_driver.jit_merge_point(signature=signature, self=self,
                                           value=value, obj=obj, i=i,
-                                          dtype=dtype, size=size)
+                                          dtype=dtype)
             value = self.func(dtype, value, obj.eval(i).convert_to(dtype))
-            i += 1
+            i.next()
         return value
 
 class W_Ufunc1(W_Ufunc):
diff --git a/pypy/module/micronumpy/test/test_numarray.py b/pypy/module/micronumpy/test/test_numarray.py
--- a/pypy/module/micronumpy/test/test_numarray.py
+++ b/pypy/module/micronumpy/test/test_numarray.py
@@ -560,14 +560,27 @@
         raises(ValueError, "b.min()")
 
     def test_argmax(self):
+        import sys
         from numpy import array
         a = array([-1.2, 3.4, 5.7, -3.0, 2.7])
-        assert a.argmax() == 2
+        r = a.argmax()
+        assert r == 2
         b = array([])
-        raises(ValueError, "b.argmax()")
+        try:
+            b.argmax()
+        except:
+            pass
+        else:
+            raise Exception("Did not raise")
 
         a = array(range(-5, 5))
-        assert a.argmax() == 9
+        r = a.argmax()
+        assert r == 9
+        b = a[::2]
+        r = b.argmax()
+        assert r == 4
+        r = (a + a).argmax()
+        assert r == 9
 
     def test_argmin(self):
         from numpy import array


More information about the pypy-commit mailing list