Author: mattip <[email protected]>
Branch: ufuncapi
Changeset: r73951:3c03b3ec0172
Date: 2014-10-13 20:56 -0500
http://bitbucket.org/pypy/pypy/changeset/3c03b3ec0172/
Log: fix translation
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
@@ -550,16 +550,13 @@
raise oefmt(space.w_NotImplementedError, 'not implemented yet')
def call(self, space, args_w, sig, casting, extobj):
- inargs = [None]*self.nin
+ inargs = [None] * self.nin
if len(args_w) < self.nin:
raise oefmt(space.w_ValueError,
'%s called with too few input args, expected at least %d got
%d',
self.name, self.nin, len(args_w))
for i in range(self.nin):
inargs[i] = convert_to_array(space, args_w[i])
- inargs = tuple(inargs)
- for i in range(len(inargs)):
- assert isinstance(inargs[i], W_NDimArray)
outargs = [None] * min(self.nout, len(args_w)-self.nin)
for i in range(len(outargs)):
out = args_w[i+self.nin]
@@ -574,10 +571,11 @@
sig = space.wrap(self.signature)
index = self.type_resolver(space, inargs, outargs, sig)
outargs = self.alloc_outargs(space, index, inargs, outargs)
- outargs = tuple(outargs)
for i in range(len(outargs)):
assert isinstance(outargs[i], W_NDimArray)
- res_dtype = outargs[0].get_dtype()
+ outargs0 = outargs[0]
+ assert isinstance(outargs0, W_NDimArray)
+ res_dtype = outargs0.get_dtype()
func = self.funcs[index]
if not self.core_enabled:
# func is going to do all the work, it must accept W_NDimArray args
@@ -593,7 +591,9 @@
# dimensions
broadcast_ndim = 0
for i in range(len(inargs)):
- n = inargs[i].ndims() - self.core_num_dims[i]
+ curarg = inargs[i]
+ assert isinstance(curarg, W_NDimArray)
+ n = curarg.ndims() - self.core_num_dims[i]
broadcast_ndim = max(broadcast_ndim, n)
# Figure out the number of iterator creation dimensions,
# which is the broadcast dimensions + all the core dimensions of
@@ -610,32 +610,36 @@
inner_dimensions = [1] * (self.core_num_dim_ix + 1)
idim = 0
for i in range(self.nin):
+ curarg = inargs[i]
+ assert isinstance(curarg, W_NDimArray)
dim_offset = self.core_offsets[i]
num_dims = self.core_num_dims[i]
- core_start_dim = inargs[i].ndims() - num_dims
+ core_start_dim = curarg.ndims() - num_dims
if core_start_dim >=0:
idim = 0
else:
idim = -core_start_dim
while(idim < num_dims):
core_dim_index = self.core_dim_ixs[dim_offset + idim]
- op_dim_size = inargs[i].get_shape()[core_start_dim + idim]
+ op_dim_size = curarg.get_shape()[core_start_dim + idim]
if inner_dimensions[i + 1] == 1:
inner_dimensions[i + 1] = op_dim_size
elif op_dim_size != 1 and inner_dimensions[1 + core_dim_index]
!= op_dim_size:
- oefmt(space.ValueError, "%s: Operand %d has a mismatch in "
+ oefmt(space.w_ValueError, "%s: Operand %d has a mismatch
in "
" its core dimension %d, with gufunc signature %s "
"(size %d is different from %d)", self.name, i, idim,
self.signature, op_dim_size, inner_dimensions[1 +
core_dim_index])
idim += 1
for i in range(len(outargs)):
+ curarg = outargs[i]
+ assert isinstance(curarg, W_NDimArray)
dim_offset = self.core_offsets[i]
num_dims = self.core_num_dims[i]
- core_start_dim = outargs[i].ndims() - num_dims
+ core_start_dim = curarg.ndims() - num_dims
if core_start_dim < 0:
- oefmt(space.ValueError, "%s: Output operand %d does not"
+ oefmt(space.w_ValueError, "%s: Output operand %d does not"
"have enough dimensions (has %d, gufunc with signature "
- "%s requires %d)", self.name, i, outargs[i].ndims(),
+ "%s requires %d)", self.name, i, curarg.ndims(),
self.signature, num_dims)
if core_start_dim >=0:
idim = 0
@@ -643,11 +647,11 @@
idim = -core_start_dim
while(idim < num_dims):
core_dim_index = self.core_dim_ixs[dim_offset + idim]
- op_dim_size = inargs[i].get_shape()[core_start_dim + idim]
+ op_dim_size = curarg.get_shape()[core_start_dim + idim]
if inner_dimensions[i + 1] == 1:
inner_dimensions[i + 1] = op_dim_size
elif inner_dimensions[1 + core_dim_index] != op_dim_size:
- oefmt(space.ValueError, "%s: Operand %d has a mismatch in "
+ oefmt(space.w_ValueError, "%s: Operand %d has a mismatch
in "
" its core dimension %d, with gufunc signature %s "
"(size %d is different from %d)", self.name, i, idim,
self.signature, op_dim_size, inner_dimensions[1 +
core_dim_index])
@@ -655,29 +659,34 @@
iter_shape = [-1] * (broadcast_ndim + len(outargs))
j = broadcast_ndim
core_dim_ixs_size = 0
- op_axes_arrays = ([-1] * (self.nin + len(outargs))) * broadcast_ndim
- if broadcast_ndim < 2:
- op_axes_arrays = [op_axes_arrays]
+ firstdim = broadcast_ndim
+ for cnd in self.core_num_dims:
+ firstdim += cnd
+ op_axes_arrays = [[-1,] * (self.nin + len(outargs)),] * firstdim
for i in range(self.nin):
# Note that n may be negative if broadcasting
# extends into the core dimensions.
- n = inargs[i].ndims() - self.core_num_dims[i]
+ curarg = inargs[i]
+ assert isinstance(curarg, W_NDimArray)
+ n = curarg.ndims() - self.core_num_dims[i]
for idim in range(broadcast_ndim):
if idim >= broadcast_ndim -n:
- op_axes_arrays[i][idim] = idim - (broadcast_ndim -n)
+ op_axes_arrays[idim][i] = idim - (broadcast_ndim -n)
core_dim_ixs_size += self.core_num_dims[i];
for i in range(len(outargs)):
+ curarg = outargs[i]
+ assert isinstance(curarg, W_NDimArray)
iout = i + self.nin
- n = outargs[i].ndims() - self.core_num_dims[iout]
+ n = curarg.ndims() - self.core_num_dims[iout]
for idim in range(broadcast_ndim):
if idim >= broadcast_ndim -n:
- op_axes_arrays[iout][idim] = idim - (broadcast_ndim -n)
+ op_axes_arrays[idim][iout] = idim - (broadcast_ndim -n)
dim_offset = self.core_offsets[iout]
num_dims = self.core_num_dims[iout]
for idim in range(num_dims):
cdi = self.core_dim_ixs[dim_offset + idim]
iter_shape[j] = inner_dimensions[1 + cdi]
- op_axes_arrays[iout][j] = n + idim
+ op_axes_arrays[j][iout] = n + idim
j += 1
core_dim_ixs_size += self.core_num_dims[iout];
# TODO once we support obejct dtypes,
@@ -688,9 +697,11 @@
# TODO parse and handle subok
if isinstance(func, W_GenericUFuncCaller):
- import pdb;pdb.set_trace()
+ pass
# xxx rdo what needs to be done to inner-loop indexing
- new_shape = inargs[0].get_shape()
+ inargs0 = inargs[0]
+ assert isinstance(inargs0, W_NDimArray)
+ new_shape = inargs0.get_shape()
if len(outargs) < 2:
return loop.call_many_to_one(space, new_shape, func,
res_dtype, inargs, outargs[0])
@@ -1203,6 +1214,7 @@
CCHARP_SIZE = _get_bitsize('P') / 8
class W_GenericUFuncCaller(W_Root):
+ _attrs_ = ['func', 'data', 'dims', 'steps']
def __init__(self, func, data):
self.func = func
self.data = data
@@ -1238,8 +1250,10 @@
if self.dims is None or self.steps is None:
raise OperationError(space.w_RuntimeError,
space.wrap("call set_dims_and_steps first"))
- raw_storage_setitem(dataps, CCHARP_SIZE * i,
- rffi.cast(rffi.CCHARP, arg_i.storage))
+ for i in range(len(args_w)):
+ arg_i = args_w[i]
+ # raw_storage_setitem(dataps, CCHARP_SIZE * i,
+ # rffi.cast(rffi.CCHARP, arg_i.storage))
try:
arg1 = rffi.cast(rffi.CArrayPtr(rffi.CCHARP), dataps)
arg2 = rffi.cast(npy_intpp, self.dims)
@@ -1248,6 +1262,10 @@
finally:
free_raw_storage(dataps, track_allocation=False)
+W_GenericUFuncCaller.typedef = TypeDef("hiddenclass",
+ __call__ = interp2app(W_GenericUFuncCaller.descr_call),
+)
+
def set_dims_and_steps(obj, space, dims, steps):
if not isinstance(obj, W_GenericUFuncCaller):
raise OperationError(space.w_RuntimeError,
@@ -1268,9 +1286,5 @@
for d in steps:
raw_storage_setitem(self.steps, LONG_SIZE * i,
rffi.cast(rffi.LONG, d))
-W_GenericUFuncCaller.typedef = TypeDef("hiddenclass",
- __call__ = interp2app(W_GenericUFuncCaller.descr_call),
-)
-
GenericUfunc = lltype.FuncType([rffi.CArrayPtr(rffi.CCHARP), npy_intpp,
npy_intpp,
rffi.VOIDP], lltype.Void)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit