Author: mattip <matti.pi...@gmail.com> 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 pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit