[pypy-commit] pypy numpypy-nditer: parse func level flags, improve external_loop test
mattip
noreply at buildbot.pypy.org
Tue May 14 14:43:51 CEST 2013
Author: Matti Picus <matti.picus at gmail.com>
Branch: numpypy-nditer
Changeset: r64070:a5fd211f5b3b
Date: 2013-05-14 15:42 +0300
http://bitbucket.org/pypy/pypy/changeset/a5fd211f5b3b/
Log: parse func level flags, improve external_loop test
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
@@ -94,6 +94,53 @@
op_flag.get_it_item = get_readwrite_item
return op_flag
+def parse_func_flags(space, nditer, w_flags):
+ if space.is_w(w_flags, space.w_None):
+ return
+ elif not space.isinstance_w(w_flags, space.w_tuple) and not \
+ space.isinstance_w(w_flags, space.w_list):
+ raise OperationError(space.w_ValueError, space.wrap(
+ 'Iter global flags must be a list or tuple of strings'))
+ lst = space.listview(w_flags)
+ for w_item in lst:
+ if not space.isinstance_w(w_item, space.w_str) and not \
+ space.isinstance_w(w_item, space.w_unicode):
+ typename = space.type(w_item).getname(space)
+ raise OperationError(space.w_TypeError, space.wrap(
+ 'expected string or Unicode object, %s found' % typename))
+ item = space.str_w(w_item)
+ if item == 'external_loop':
+ nditer.external_loop = True
+ elif item == 'buffered':
+ nditer.buffered = True
+ elif item == 'c_index':
+ nditer.tracked_index = 'C'
+ elif item == 'f_index':
+ nditer.tracked_index = 'F'
+ elif item == 'multi_index':
+ nditer.tracked_index = 'multi'
+ elif item == 'common_dtype':
+ nditer.common_dtype = True
+ elif item == 'delay_bufalloc':
+ nditer.delay_bufalloc = True
+ elif item == 'grow_inner':
+ nditer.grow_inner = True
+ elif item == 'ranged':
+ nditer.ranged = True
+ elif item == 'refs_ok':
+ nditer.refs_ok = True
+ elif item == 'reduce_ok':
+ nditer.reduce_ok = True
+ elif item == 'zerosize_ok':
+ nditer.zerosize_ok = True
+ else:
+ raise OperationError(space.w_ValueError, space.wrap(
+ 'Unexpected iterator global flag "%s"', item))
+ if nditer.tracked_index and nditer.external_loop:
+ raise OperationError(space.w_ValueError, space.wrap(
+ 'Iterator flag EXTERNAL_LOOP cannot be used if an index or '
+ 'multi-index is being tracked'))
+
def get_iter(space, order, imp, backward):
if order == 'K' or (order == 'C' and imp.order == 'C'):
backward = False
@@ -123,16 +170,28 @@
def __init__(self, space, w_seq, w_flags, w_op_flags, w_op_dtypes, w_casting,
w_op_axes, w_itershape, w_buffersize, order):
self.order = order
+ self.external_loop = False
+ self.buffered = False
+ self.tracked_index = ''
+ self.common_dtype = False
+ self.delay_bufalloc = False
+ self.grow_inner = False
+ self.ranged = False
+ self.refs_ok = False
+ self.reduce_ok = False
+ self.zerosize_ok = False
if space.isinstance_w(w_seq, space.w_tuple) or \
space.isinstance_w(w_seq, space.w_list):
w_seq_as_list = space.listview(w_seq)
self.seq = [convert_to_array(space, w_elem) for w_elem in w_seq_as_list]
else:
self.seq =[convert_to_array(space, w_seq)]
+ parse_func_flags(space, self, w_flags)
self.op_flags = parse_op_arg(space, 'op_flags', w_op_flags,
len(self.seq), parse_op_flag)
self.iters=[]
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]))
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
@@ -46,13 +46,18 @@
from numpypy import arange, nditer, array
a = arange(6).reshape(2,3)
r = []
+ n = 0
for x in nditer(a, flags=['external_loop']):
r.append(x)
+ n += 1
+ assert n == 1
assert (array(r) == [0, 1, 2, 3, 4, 5]).all()
r = []
+ n = 0
for x in nditer(a, flags=['external_loop'], order='F'):
r.append(x)
- print r
+ n += 1
+ assert n == 3
assert (array(r) == [[0, 3], [1, 4], [2, 5]]).all()
def test_interface(self):
More information about the pypy-commit
mailing list