[pypy-commit] pypy numpypy-nditer: wip - finding shape for iterators including external_loop flag
mattip
noreply at buildbot.pypy.org
Fri May 24 17:10:42 CEST 2013
Author: Matti Picus <matti.picus at gmail.com>
Branch: numpypy-nditer
Changeset: r64538:3005bc67833e
Date: 2013-05-18 20:48 +0300
http://bitbucket.org/pypy/pypy/changeset/3005bc67833e/
Log: wip - finding shape for iterators including external_loop flag
diff --git a/pypy/module/micronumpy/interp_nditer.py b/pypy/module/micronumpy/interp_nditer.py
--- a/pypy/module/micronumpy/interp_nditer.py
+++ b/pypy/module/micronumpy/interp_nditer.py
@@ -3,7 +3,8 @@
from pypy.interpreter.gateway import interp2app, unwrap_spec, WrappedDefault
from pypy.interpreter.error import OperationError
from pypy.module.micronumpy.base import W_NDimArray, convert_to_array
-from pypy.module.micronumpy.strides import calculate_broadcast_strides
+from pypy.module.micronumpy.strides import (calculate_broadcast_strides,
+ shape_agreement_multiple)
from pypy.module.micronumpy.iter import MultiDimViewIterator
from pypy.module.micronumpy import support
from pypy.module.micronumpy.arrayimpl.concrete import SliceArray
@@ -141,7 +142,7 @@
'Iterator flag EXTERNAL_LOOP cannot be used if an index or '
'multi-index is being tracked'))
-def get_iter(space, order, imp, backward):
+def get_iter(space, order, imp, shape):
if order == 'K' or (order == 'C' and imp.order == 'C'):
backward = False
elif order =='F' and imp.order == 'C':
@@ -154,14 +155,12 @@
# flip the strides. Is this always true for multidimension?
strides = [s for s in imp.strides[::-1]]
backstrides = [s for s in imp.backstrides[::-1]]
- shape = [s for s in imp.shape[::-1]]
+ shape = [s for s in shape[::-1]]
else:
strides = imp.strides
backstrides = imp.backstrides
- shape = imp.shape
- shape1d = [support.product(imp.shape),]
- r = calculate_broadcast_strides(strides, backstrides, shape,
- shape1d, backward)
+ r = calculate_broadcast_strides(strides, backstrides, imp.shape,
+ shape, backward)
return MultiDimViewIterator(imp, imp.dtype, imp.start, r[0], r[1], shape)
@@ -190,10 +189,13 @@
self.op_flags = parse_op_arg(space, 'op_flags', w_op_flags,
len(self.seq), parse_op_flag)
self.iters=[]
+ self.shape = iter_shape = shape_agreement_multiple(space, self.seq)
+ if self.external_loop:
+ xxx find longest contiguous shape
+ iter_shape = iter_shape[1:]
for i in range(len(self.seq)):
- # XXX the shape of the iter depends on all the seq.shapes together
self.iters.append(get_iter(space, self.order,
- self.seq[i].implementation, self.op_flags[i]))
+ self.seq[i].implementation, iter_shape))
def descr_iter(self, space):
return space.wrap(self)
More information about the pypy-commit
mailing list