[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