Author: Brian Kearns <[email protected]>
Branch: numpy-refactor
Changeset: r69510:b2e159740743
Date: 2014-02-27 03:09 -0500
http://bitbucket.org/pypy/pypy/changeset/b2e159740743/
Log: use the new iterator where possible
diff --git a/pypy/module/micronumpy/concrete.py
b/pypy/module/micronumpy/concrete.py
--- a/pypy/module/micronumpy/concrete.py
+++ b/pypy/module/micronumpy/concrete.py
@@ -274,6 +274,17 @@
backstrides)
return loop.setslice(space, self.get_shape(), impl, self)
+ def create_iter(self, shape=None, backward_broadcast=False):
+ if shape is not None and \
+ support.product(shape) > support.product(self.get_shape()):
+ r = calculate_broadcast_strides(self.get_strides(),
+ self.get_backstrides(),
+ self.get_shape(), shape,
+ backward_broadcast)
+ return iter.MultiDimViewIterator(self, self.start,
+ r[0], r[1], shape)
+ return iter.ArrayIterator(self)
+
def create_axis_iter(self, shape, dim, cum):
return iter.AxisIterator(self, shape, dim, cum)
@@ -333,26 +344,6 @@
self.backstrides = backstrides
self.storage = storage
- def create_iter(self, shape=None, backward_broadcast=False,
require_index=False):
- if shape is not None and \
- support.product(shape) > support.product(self.get_shape()):
- r = calculate_broadcast_strides(self.get_strides(),
- self.get_backstrides(),
- self.get_shape(), shape,
- backward_broadcast)
- return iter.MultiDimViewIterator(self, self.start,
- r[0], r[1], shape)
- if not require_index:
- return iter.ConcreteArrayIterator(self)
- if len(self.get_shape()) <= 1:
- return iter.OneDimViewIterator(self, self.start,
- self.get_strides(),
- self.get_shape())
- return iter.MultiDimViewIterator(self, self.start,
- self.get_strides(),
- self.get_backstrides(),
- self.get_shape())
-
def fill(self, space, box):
self.dtype.itemtype.fill(self.storage, self.dtype.elsize,
box, 0, self.size, 0)
@@ -438,24 +429,6 @@
def fill(self, space, box):
loop.fill(self, box.convert_to(space, self.dtype))
- def create_iter(self, shape=None, backward_broadcast=False,
require_index=False):
- if shape is not None and \
- support.product(shape) > support.product(self.get_shape()):
- r = calculate_broadcast_strides(self.get_strides(),
- self.get_backstrides(),
- self.get_shape(), shape,
- backward_broadcast)
- return iter.MultiDimViewIterator(self, self.start,
- r[0], r[1], shape)
- if len(self.get_shape()) <= 1:
- return iter.OneDimViewIterator(self, self.start,
- self.get_strides(),
- self.get_shape())
- return iter.MultiDimViewIterator(self, self.start,
- self.get_strides(),
- self.get_backstrides(),
- self.get_shape())
-
def set_shape(self, space, orig_array, new_shape):
if len(self.get_shape()) < 2 or self.size == 0:
# TODO: this code could be refactored into calc_strides
diff --git a/pypy/module/micronumpy/flatiter.py
b/pypy/module/micronumpy/flatiter.py
--- a/pypy/module/micronumpy/flatiter.py
+++ b/pypy/module/micronumpy/flatiter.py
@@ -19,7 +19,7 @@
def get_shape(self):
return self.shape
- def create_iter(self, shape=None, backward_broadcast=False,
require_index=False):
+ def create_iter(self, shape=None, backward_broadcast=False):
assert isinstance(self.base(), W_NDimArray)
return self.base().create_iter()
@@ -33,7 +33,6 @@
def reset(self):
self.iter = self.base.create_iter()
- self.index = 0
def descr_len(self, space):
return space.wrap(self.base.get_size())
@@ -43,14 +42,13 @@
raise OperationError(space.w_StopIteration, space.w_None)
w_res = self.iter.getitem()
self.iter.next()
- self.index += 1
return w_res
def descr_index(self, space):
- return space.wrap(self.index)
+ return space.wrap(self.iter.index)
def descr_coords(self, space):
- coords = self.base.to_coords(space, space.wrap(self.index))
+ coords = self.base.to_coords(space, space.wrap(self.iter.index))
return space.newtuple([space.wrap(c) for c in coords])
def descr_getitem(self, space, w_idx):
diff --git a/pypy/module/micronumpy/iter.py b/pypy/module/micronumpy/iter.py
--- a/pypy/module/micronumpy/iter.py
+++ b/pypy/module/micronumpy/iter.py
@@ -37,10 +37,9 @@
All the calculations happen in next()
next_skip_x(steps) tries to do the iteration for a number of steps at once,
-but then we cannot gaurentee that we only overflow one single shape
+but then we cannot guarantee that we only overflow one single shape
dimension, perhaps we could overflow times in one big step.
"""
-
from pypy.module.micronumpy.base import W_NDimArray
from pypy.module.micronumpy import support
from rpython.rlib import jit
@@ -107,6 +106,11 @@
self.indices[i] = 0
self.offset -= self.backstrides[i]
+ def next_skip_x(self, step):
+ # XXX implement
+ for _ in range(step):
+ self.next()
+
def done(self):
return self.index >= self.size
@@ -120,70 +124,7 @@
self.array.setitem(self.offset, elem)
-class ConcreteArrayIterator(ArrayIterator):
- _immutable_fields_ = ['array', 'skip', 'size']
-
- def __init__(self, array):
- self.array = array
- self.offset = 0
- self.skip = array.dtype.elsize
- self.size = array.size
-
- def setitem(self, elem):
- self.array.setitem(self.offset, elem)
-
- def getitem(self):
- return self.array.getitem(self.offset)
-
- def getitem_bool(self):
- return self.array.getitem_bool(self.offset)
-
- def next(self):
- self.offset += self.skip
-
- def next_skip_x(self, x):
- self.offset += self.skip * x
-
- def done(self):
- return self.offset >= self.size
-
- def reset(self):
- self.offset %= self.size
-
-
-class OneDimViewIterator(ConcreteArrayIterator):
- def __init__(self, array, start, strides, shape):
- self.array = array
- self.offset = start
- self.index = 0
- assert len(strides) == len(shape)
- if len(shape) == 0:
- self.skip = array.dtype.elsize
- self.size = 1
- else:
- assert len(shape) == 1
- self.skip = strides[0]
- self.size = shape[0]
-
- def next(self):
- self.offset += self.skip
- self.index += 1
-
- def next_skip_x(self, x):
- self.offset += self.skip * x
- self.index += x
-
- def done(self):
- return self.index >= self.size
-
- def reset(self):
- self.offset %= self.size
-
- def get_index(self, d):
- return self.index
-
-
-class MultiDimViewIterator(ConcreteArrayIterator):
+class MultiDimViewIterator(ArrayIterator):
def __init__(self, array, start, strides, backstrides, shape):
self.indexes = [0] * len(shape)
self.array = array
@@ -232,9 +173,6 @@
def reset(self):
self.offset %= self.size
- def get_index(self, d):
- return self.indexes[d]
-
class AxisIterator(ArrayIterator):
def __init__(self, array, shape, dim, cumulative):
@@ -258,12 +196,6 @@
self.dim = dim
self.array = array
- def setitem(self, elem):
- self.array.setitem(self.offset, elem)
-
- def getitem(self):
- return self.array.getitem(self.offset)
-
@jit.unroll_safe
def next(self):
for i in range(len(self.shape) - 1, -1, -1):
diff --git a/pypy/module/micronumpy/loop.py b/pypy/module/micronumpy/loop.py
--- a/pypy/module/micronumpy/loop.py
+++ b/pypy/module/micronumpy/loop.py
@@ -332,7 +332,7 @@
def nonzero(res, arr, box):
res_iter = res.create_iter()
- arr_iter = arr.create_iter(require_index=True)
+ arr_iter = arr.create_iter()
shapelen = len(arr.shape)
dtype = arr.dtype
dims = range(shapelen)
@@ -340,7 +340,7 @@
nonzero_driver.jit_merge_point(shapelen=shapelen, dims=dims,
dtype=dtype)
if arr_iter.getitem_bool():
for d in dims:
- res_iter.setitem(box(arr_iter.get_index(d)))
+ res_iter.setitem(box(arr_iter.indices[d]))
res_iter.next()
arr_iter.next()
return res
@@ -436,8 +436,6 @@
arr_iter.next_skip_x(step)
length -= 1
val_iter.next()
- # WTF numpy?
- val_iter.reset()
fromstring_driver = jit.JitDriver(name = 'numpy_fromstring',
greens = ['itemsize', 'dtype'],
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
@@ -280,11 +280,10 @@
s.append(suffix)
return s.build()
- def create_iter(self, shape=None, backward_broadcast=False,
require_index=False):
+ def create_iter(self, shape=None, backward_broadcast=False):
assert isinstance(self.implementation, BaseConcreteArray)
return self.implementation.create_iter(
- shape=shape, backward_broadcast=backward_broadcast,
- require_index=require_index)
+ shape=shape, backward_broadcast=backward_broadcast)
def create_axis_iter(self, shape, dim, cum):
return self.implementation.create_axis_iter(shape, dim, cum)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit