[pypy-commit] pypy ufunc-reduce: Clean up accumulate loops
rlamy
noreply at buildbot.pypy.org
Sun Aug 2 21:17:05 CEST 2015
Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: ufunc-reduce
Changeset: r78750:1eb5d76e3f7b
Date: 2015-08-02 20:17 +0100
http://bitbucket.org/pypy/pypy/changeset/1eb5d76e3f7b/
Log: Clean up accumulate loops
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
@@ -214,68 +214,68 @@
obj_state = obj_iter.next(obj_state)
return cur_value
-reduce_cum_driver = jit.JitDriver(
- name='numpy_reduce_cum_driver',
+accumulate_flat_driver = jit.JitDriver(
+ name='numpy_accumulate_flat',
greens=['shapelen', 'func', 'dtype', 'out_dtype'],
reds='auto')
-def compute_reduce_cumulative(space, obj, out, calc_dtype, func, identity):
- obj_iter, obj_state = obj.create_iter()
+def accumulate_flat(space, func, w_arr, calc_dtype, out, identity):
+ arr_iter, arr_state = w_arr.create_iter()
out_iter, out_state = out.create_iter()
out_iter.track_index = False
if identity is None:
- cur_value = obj_iter.getitem(obj_state).convert_to(space, calc_dtype)
+ cur_value = arr_iter.getitem(arr_state).convert_to(space, calc_dtype)
out_iter.setitem(out_state, cur_value)
out_state = out_iter.next(out_state)
- obj_state = obj_iter.next(obj_state)
+ arr_state = arr_iter.next(arr_state)
else:
cur_value = identity.convert_to(space, calc_dtype)
- shapelen = len(obj.get_shape())
+ shapelen = len(w_arr.get_shape())
out_dtype = out.get_dtype()
- while not obj_iter.done(obj_state):
- reduce_cum_driver.jit_merge_point(
- shapelen=shapelen, func=func,
- dtype=calc_dtype, out_dtype=out_dtype)
- rval = obj_iter.getitem(obj_state).convert_to(space, calc_dtype)
- cur_value = func(calc_dtype, cur_value, rval)
+ while not arr_iter.done(arr_state):
+ accumulate_flat_driver.jit_merge_point(
+ shapelen=shapelen, func=func, dtype=calc_dtype,
+ out_dtype=out_dtype)
+ w_item = arr_iter.getitem(arr_state).convert_to(space, calc_dtype)
+ cur_value = func(calc_dtype, cur_value, w_item)
out_iter.setitem(out_state, out_dtype.coerce(space, cur_value))
out_state = out_iter.next(out_state)
- obj_state = obj_iter.next(obj_state)
+ arr_state = arr_iter.next(arr_state)
-accumulate_driver = jit.JitDriver(name='numpy_accumulate_flat',
- greens=['shapelen', 'func', 'dtype'],
- reds='auto')
+accumulate_driver = jit.JitDriver(
+ name='numpy_accumulate',
+ greens=['shapelen', 'func', 'calc_dtype'], reds='auto')
-def do_accumulate(space, func, arr, dtype, axis, out, identity):
+def accumulate(space, func, w_arr, axis, calc_dtype, out, identity):
out_iter, out_state = out.create_iter()
- obj_shape = arr.get_shape()
- temp_shape = obj_shape[:axis] + obj_shape[axis + 1:]
- temp = W_NDimArray.from_shape(space, temp_shape, dtype, w_instance=arr)
- temp_iter = AxisIter(temp.implementation, arr.get_shape(), axis)
+ arr_shape = w_arr.get_shape()
+ temp_shape = arr_shape[:axis] + arr_shape[axis + 1:]
+ temp = W_NDimArray.from_shape(space, temp_shape, calc_dtype, w_instance=w_arr)
+ temp_iter = AxisIter(temp.implementation, w_arr.get_shape(), axis)
temp_state = temp_iter.reset()
- arr_iter, arr_state = arr.create_iter()
+ arr_iter, arr_state = w_arr.create_iter()
arr_iter.track_index = False
if identity is not None:
- identity = identity.convert_to(space, dtype)
- shapelen = len(obj_shape)
+ identity = identity.convert_to(space, calc_dtype)
+ shapelen = len(arr_shape)
while not out_iter.done(out_state):
accumulate_driver.jit_merge_point(shapelen=shapelen, func=func,
- dtype=dtype)
- w_val = arr_iter.getitem(arr_state).convert_to(space, dtype)
+ calc_dtype=calc_dtype)
+ w_item = arr_iter.getitem(arr_state).convert_to(space, calc_dtype)
arr_state = arr_iter.next(arr_state)
out_indices = out_iter.indices(out_state)
if out_indices[axis] == 0:
if identity is not None:
- w_val = func(dtype, identity, w_val)
+ w_item = func(calc_dtype, identity, w_item)
else:
- cur = temp_iter.getitem(temp_state)
- w_val = func(dtype, cur, w_val)
+ cur_value = temp_iter.getitem(temp_state)
+ w_item = func(calc_dtype, cur_value, w_item)
- out_iter.setitem(out_state, w_val)
+ out_iter.setitem(out_state, w_item)
out_state = out_iter.next(out_state)
- temp_iter.setitem(temp_state, w_val)
+ temp_iter.setitem(temp_state, w_item)
temp_state = temp_iter.next(temp_state)
return out
diff --git a/pypy/module/micronumpy/ufuncs.py b/pypy/module/micronumpy/ufuncs.py
--- a/pypy/module/micronumpy/ufuncs.py
+++ b/pypy/module/micronumpy/ufuncs.py
@@ -270,11 +270,11 @@
if self.identity is not None:
out.fill(space, self.identity.convert_to(space, dtype))
return out
- loop.do_accumulate(space, self.func, obj, dtype, axis,
- out, self.identity)
+ loop.accumulate(
+ space, self.func, obj, axis, dtype, out, self.identity)
else:
- loop.compute_reduce_cumulative(space, obj, out, dtype, self.func,
- self.identity)
+ loop.accumulate_flat(
+ space, self.func, obj, dtype, out, self.identity)
if call__array_wrap__:
out = space.call_method(obj, '__array_wrap__', out)
return out
More information about the pypy-commit
mailing list