Author: Maciej Fijalkowski <[email protected]>
Branch: numpy-single-jitdriver
Changeset: r52037:6ae636ba7590
Date: 2012-02-02 19:20 +0200
http://bitbucket.org/pypy/pypy/changeset/6ae636ba7590/
Log: axis reduce driver -> trash
diff --git a/pypy/module/micronumpy/interp_numarray.py
b/pypy/module/micronumpy/interp_numarray.py
--- a/pypy/module/micronumpy/interp_numarray.py
+++ b/pypy/module/micronumpy/interp_numarray.py
@@ -872,7 +872,6 @@
frame.next(len(self.right.shape))
else:
frame.cur_value = self.identity.convert_to(self.calc_dtype)
-
def create_sig(self):
return signature.ReduceSignature(self.ufunc, self.name, self.res_dtype,
@@ -882,13 +881,20 @@
class AxisReduce(Call2):
_immutable_fields_ = ['left', 'right']
- def __init__(self, ufunc, name, shape, dtype, left, right, dim):
+ def __init__(self, ufunc, name, identity, shape, dtype, left, right, dim):
Call2.__init__(self, ufunc, name, shape, dtype, dtype,
left, right)
self.dim = dim
+ self.identity = identity
-# def create_sig(self):
-# return signature.AxisReduceSignature(self.ufunc
+ def compute_first_step(self, sig, frame):
+ frame.identity = self.identity.convert_to(self.calc_dtype)
+
+ def create_sig(self):
+ return signature.AxisReduceSignature(self.ufunc, self.name,
+ self.res_dtype,
+ signature.ScalarSignature(self.res_dtype),
+ self.right.create_sig())
class SliceArray(Call2):
def __init__(self, shape, dtype, left, right, no_broadcast=False):
diff --git a/pypy/module/micronumpy/interp_ufuncs.py
b/pypy/module/micronumpy/interp_ufuncs.py
--- a/pypy/module/micronumpy/interp_ufuncs.py
+++ b/pypy/module/micronumpy/interp_ufuncs.py
@@ -3,22 +3,9 @@
from pypy.interpreter.gateway import interp2app, unwrap_spec, NoneNotWrapped
from pypy.interpreter.typedef import TypeDef, GetSetProperty,
interp_attrproperty
from pypy.module.micronumpy import interp_boxes, interp_dtype, support
-from pypy.module.micronumpy.signature import (find_sig,
- new_printable_location, AxisReduceSignature, ScalarSignature)
-from pypy.rlib import jit
from pypy.rlib.rarithmetic import LONG_BIT
from pypy.tool.sourcetools import func_with_new_name
-
-axisreduce_driver = jit.JitDriver(
- greens=['shapelen', 'sig'],
- virtualizables=['frame'],
- reds=['self','arr', 'identity', 'frame'],
- name='numpy_axisreduce',
- get_printable_location=new_printable_location('axisreduce'),
-)
-
-
class W_Ufunc(Wrappable):
_attrs_ = ["name", "promote_to_float", "promote_bools", "identity"]
_immutable_fields_ = ["promote_to_float", "promote_bools", "name"]
@@ -165,53 +152,17 @@
def do_axis_reduce(self, obj, dtype, dim, keepdims):
from pypy.module.micronumpy.interp_numarray import AxisReduce,\
W_NDimArray
+ from pypy.module.micronumpy import loop
if keepdims:
shape = obj.shape[:dim] + [1] + obj.shape[dim + 1:]
else:
shape = obj.shape[:dim] + obj.shape[dim + 1:]
result = W_NDimArray(support.product(shape), shape, dtype)
- rightsig = obj.create_sig()
- # note - this is just a wrapper so signature can fetch
- # both left and right, nothing more, especially
- # this is not a true virtual array, because shapes
- # don't quite match
- arr = AxisReduce(self.func, self.name, obj.shape, dtype,
+ arr = AxisReduce(self.func, self.name, self.identity, obj.shape, dtype,
result, obj, dim)
- scalarsig = ScalarSignature(dtype)
- sig = find_sig(AxisReduceSignature(self.func, self.name, dtype,
- scalarsig, rightsig), arr)
- assert isinstance(sig, AxisReduceSignature)
- frame = sig.create_frame(arr)
- shapelen = len(obj.shape)
- if self.identity is not None:
- identity = self.identity.convert_to(dtype)
- else:
- identity = None
- self.reduce_axis_loop(frame, sig, shapelen, arr, identity)
- return result
-
- def reduce_axis_loop(self, frame, sig, shapelen, arr, identity):
- # note - we can be advanterous here, depending on the exact field
- # layout. For now let's say we iterate the original way and
- # simply follow the original iteration order
- while not frame.done():
- axisreduce_driver.jit_merge_point(frame=frame, self=self,
- sig=sig,
- identity=identity,
- shapelen=shapelen, arr=arr)
- iterator = frame.get_final_iter()
- v = sig.eval(frame, arr).convert_to(sig.calc_dtype)
- if iterator.first_line:
- if identity is not None:
- value = self.func(sig.calc_dtype, identity, v)
- else:
- value = v
- else:
- cur = arr.left.getitem(iterator.offset)
- value = self.func(sig.calc_dtype, cur, v)
- arr.left.setitem(iterator.offset, value)
- frame.next(shapelen)
+ loop.compute(arr)
+ return arr.left
class W_Ufunc1(W_Ufunc):
argcount = 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
@@ -12,7 +12,7 @@
'value', 'identity', 'cur_value']
@unroll_safe
- def __init__(self, iterators, arrays, identity=None):
+ def __init__(self, iterators, arrays):
self = hint(self, access_directly=True, fresh_virtualizable=True)
self.iterators = iterators[:]
self.arrays = arrays[:]
@@ -24,7 +24,7 @@
else:
self.final_iter = -1
self.cur_value = None
- self.identity = identity
+ self.identity = None
def done(self):
final_iter = promote(self.final_iter)
diff --git a/pypy/module/micronumpy/signature.py
b/pypy/module/micronumpy/signature.py
--- a/pypy/module/micronumpy/signature.py
+++ b/pypy/module/micronumpy/signature.py
@@ -96,16 +96,11 @@
def create_frame(self, arr):
from pypy.module.micronumpy.loop import NumpyEvalFrame
- from pypy.module.micronumpy.interp_numarray import ReduceArray
iterlist = []
arraylist = []
self._create_iter(iterlist, arraylist, arr, [])
- if isinstance(arr, ReduceArray):
- identity = arr.identity
- else:
- identity = None
- f = NumpyEvalFrame(iterlist, arraylist, identity)
+ f = NumpyEvalFrame(iterlist, arraylist)
# hook for cur_value being used by reduce
arr.compute_first_step(self, f)
return f
@@ -424,7 +419,17 @@
from pypy.module.micronumpy.interp_numarray import AxisReduce
assert isinstance(arr, AxisReduce)
- return self.right.eval(frame, arr.right).convert_to(self.calc_dtype)
+ iterator = frame.get_final_iter()
+ v = self.right.eval(frame, arr.right).convert_to(self.calc_dtype)
+ if iterator.first_line:
+ if frame.identity is not None:
+ value = self.binfunc(self.calc_dtype, frame.identity, v)
+ else:
+ value = v
+ else:
+ cur = arr.left.getitem(iterator.offset)
+ value = self.binfunc(self.calc_dtype, cur, v)
+ arr.left.setitem(iterator.offset, value)
def debug_repr(self):
return 'AxisReduceSig(%s, %s)' % (self.name, self.right.debug_repr())
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit