Author: mattip <matti.pi...@gmail.com> Branch: nditer-buffered Changeset: r78604:f5d927f06929 Date: 2015-07-20 08:44 +0300 http://bitbucket.org/pypy/pypy/changeset/f5d927f06929/
Log: improve test by comparing to upstream, move things around until part of test passes diff --git a/pypy/module/micronumpy/ndarray.py b/pypy/module/micronumpy/ndarray.py --- a/pypy/module/micronumpy/ndarray.py +++ b/pypy/module/micronumpy/ndarray.py @@ -18,7 +18,7 @@ from pypy.module.micronumpy.converters import multi_axis_converter, \ order_converter, shape_converter, searchside_converter from pypy.module.micronumpy.flagsobj import W_FlagsObject -from pypy.module.micronumpy.strides import get_shape_from_iterable, \ +from pypy.module.micronumpy.strideops import get_shape_from_iterable, \ shape_agreement, shape_agreement_multiple, is_c_contiguous, is_f_contiguous from pypy.module.micronumpy.casting import can_cast_array diff --git a/pypy/module/micronumpy/nditer.py b/pypy/module/micronumpy/nditer.py --- a/pypy/module/micronumpy/nditer.py +++ b/pypy/module/micronumpy/nditer.py @@ -7,8 +7,7 @@ from pypy.module.micronumpy.base import W_NDimArray, convert_to_array, W_NumpyObject from pypy.module.micronumpy.descriptor import decode_w_dtype from pypy.module.micronumpy.iterators import ArrayIter -from pypy.module.micronumpy.strides import (calculate_broadcast_strides, - shape_agreement, shape_agreement_multiple) +from pypy.module.micronumpy import strideops from pypy.module.micronumpy.casting import find_binop_result_dtype @@ -213,6 +212,15 @@ def get_iter(space, order, arr, shape, dtype, op_flags, base): imp = arr.implementation backward = is_backward(imp, order) + if len(shape) == 1: + min_dim = 0 + min_stride = 0xefffffff + for i in range(len(imp.shape)): + if imp.strides[i] < min_stride: + min_dim = i + min_stride = imp.strides[i] + return ConcreteIter(imp, imp.get_size(), shape, [imp.strides[i]], + [imp.backstrides[i]], op_flags, base) if arr.is_scalar(): return ConcreteIter(imp, 1, [], [], [], op_flags, base) if (abs(imp.strides[0]) < abs(imp.strides[-1]) and not backward) or \ @@ -220,19 +228,20 @@ # flip the strides. Is this always true for multidimension? strides = imp.strides[:] backstrides = imp.backstrides[:] - shape = imp.shape[:] strides.reverse() backstrides.reverse() - shape.reverse() + _shape = imp.shape[:] + _shape.reverse() else: strides = imp.strides backstrides = imp.backstrides - r = calculate_broadcast_strides(strides, backstrides, imp.shape, + _shape = imp.shape + r = strideops.calculate_broadcast_strides(strides, backstrides, _shape, shape, backward) if len(shape) != len(r[0]): # shape can be shorter when using an external loop, just return a view - return ConcreteIter(imp, imp.get_size(), imp.shape, r[0], r[1], op_flags, base) - return ConcreteIter(imp, imp.get_size(), shape, r[0], r[1], op_flags, base) + return ConcreteIter(imp, imp.get_size(), _shape, r[0], r[1], op_flags, base) + return ConcreteIter(imp, imp.get_size(), _shape, r[0], r[1], op_flags, base) def calculate_ndim(op_in, oa_ndim): if oa_ndim >=0: @@ -413,15 +422,15 @@ outargs = [i for i in range(len(self.seq)) if self.seq[i] is None or self.op_flags[i].rw == 'w'] if len(outargs) > 0: - out_shape = shape_agreement_multiple(space, [self.seq[i] for i in outargs]) + out_shape = strideops.shape_agreement_multiple(space, [self.seq[i] for i in outargs]) else: out_shape = None if space.isinstance_w(w_itershape, space.w_tuple) or \ space.isinstance_w(w_itershape, space.w_list): self.shape = [space.int_w(i) for i in space.listview(w_itershape)] else: - self.shape = shape_agreement_multiple(space, self.seq, - shape=out_shape) + self.shape = strideops.shape_agreement_multiple(space, self.seq, + shape=out_shape) if len(outargs) > 0: # Make None operands writeonly and flagged for allocation if len(self.dtypes) > 0: @@ -443,7 +452,7 @@ else: if not self.op_flags[i].broadcast: # Raises if ooutput cannot be broadcast - shape_agreement(space, self.shape, self.seq[i], False) + strideops.shape_agreement(space, self.shape, self.seq[i], False) if self.tracked_index != "": if self.order == "K": @@ -453,7 +462,6 @@ else: backward = self.order != self.tracked_index self.index_iter = IndexIterator(self.shape, backward=backward) - # handle w_op_dtypes part 2: copy where needed if possible if len(self.dtypes) > 0: for i in range(len(self.seq)): @@ -553,7 +561,7 @@ res.append(self.getitem(it, st)) self.iters[i] = (it, it.next(st)) if len(res) < 2: - return res[0] + return res[0] return space.newtuple(res) def iternext(self): @@ -648,7 +656,9 @@ raise oefmt(space.w_NotImplementedError, "not implemented yet") def descr_get_shape(self, space): - raise oefmt(space.w_NotImplementedError, "not implemented yet") + if self.done: + raise oefmt(space.w_ValueError, "Iterator is past the end") + return space.newtuple([space.wrap(i) for i in self.shape]) def descr_get_value(self, space): raise oefmt(space.w_NotImplementedError, "not implemented yet") diff --git a/pypy/module/micronumpy/strides.py b/pypy/module/micronumpy/strideops.py rename from pypy/module/micronumpy/strides.py rename to pypy/module/micronumpy/strideops.py --- a/pypy/module/micronumpy/strides.py +++ b/pypy/module/micronumpy/strideops.py @@ -3,7 +3,6 @@ from pypy.module.micronumpy import support, constants as NPY from pypy.module.micronumpy.base import W_NDimArray - # structures to describe slicing class BaseChunk(object): diff --git a/pypy/module/micronumpy/support.py b/pypy/module/micronumpy/support.py --- a/pypy/module/micronumpy/support.py +++ b/pypy/module/micronumpy/support.py @@ -11,7 +11,6 @@ space.isinstance_w(w_obj, space.w_buffer) or isinstance(w_obj, W_NDimArray)) - def index_w(space, w_obj): try: return space.int_w(space.index(w_obj)) @@ -23,7 +22,6 @@ "ellipsis (`...`), numpy.newaxis (`None`) and integer or " "boolean arrays are valid indices") - @jit.unroll_safe def product(s): i = 1 @@ -31,7 +29,6 @@ i = ovfcheck(i * x) return i - def check_and_adjust_index(space, index, size, axis): if index < -size or index >= size: if axis >= 0: diff --git a/pypy/module/micronumpy/test/dummy_module.py b/pypy/module/micronumpy/test/dummy_module.py --- a/pypy/module/micronumpy/test/dummy_module.py +++ b/pypy/module/micronumpy/test/dummy_module.py @@ -38,3 +38,12 @@ a = zeros(*args, **kwargs) a.fill(1) return a + +def shape(a): + try: + result = a.shape + except AttributeError: + result = asarray(a).shape + return result + + diff --git a/pypy/module/micronumpy/test/test_nditer.py b/pypy/module/micronumpy/test/test_nditer.py --- a/pypy/module/micronumpy/test/test_nditer.py +++ b/pypy/module/micronumpy/test/test_nditer.py @@ -149,16 +149,26 @@ # assert str(exc.value).startswith("Iterator flag EXTERNAL_LOOP cannot") def test_buffered(self): - from numpy import arange, nditer, array - a = arange(6).reshape(2,3) - import sys + from numpy import arange, nditer, array, shape + a = arange(6).reshape(2, 3) r = [] - for x in nditer(a, flags=['external_loop', 'buffered'], order='F'): - r.append(x) - array_r = array(r) - assert len(array_r.shape) == 2 - assert array_r.shape == (1, 6) - assert (array_r == [0, 3, 1, 4, 2, 5]).all() + x = nditer(a, flags=['buffered'], order='F') + assert x.shape == a.shape # maybe a numpy bug, but be compatible + for i in x: + r.append(i) + assert x.shape == a.shape + assert r[0].shape == () + raises(ValueError, shape, x) + assert len(r) == 6 # buffered flattens the iterator + r = [] + assert a.shape == (2, 3) + x = nditer(a, flags=['external_loop', 'buffered'], order='F') + assert x.shape == a.shape # maybe a numpy bug, but be compatible + for i in x: + r.append(i) + assert len(r) == 1 # external_loop coalesces the flattened iterator + assert r[0].shape == (6,) + assert (r[0] == [0, 3, 1, 4, 2, 5]).all() #respect the order def test_op_dtype(self): from numpy import arange, nditer, sqrt, array @@ -186,7 +196,8 @@ import sys a = arange(6.) exc = raises(TypeError, nditer, a, flags=['buffered'], op_dtypes=['float32']) - assert str(exc.value).startswith("Iterator operand 0 dtype could not be cast") + errstr = str(exc.value) + assert errstr.startswith("Iterator operand 0 dtype could not be cast") r = [] for x in nditer(a, flags=['buffered'], op_dtypes=['float32'], casting='same_kind'): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit