[pypy-commit] pypy numpy-dtype: works with annotator, but had to disable most functionality for now. Basically can create arrays and get/setitem with them. Float32/96 aren't liked by the annotator so they are actually Float64 right now.
justinpeel
noreply at buildbot.pypy.org
Tue Aug 16 06:53:44 CEST 2011
Author: Justin Peel <notmuchtotell at gmail.com>
Branch: numpy-dtype
Changeset: r46529:bea325b046d9
Date: 2011-08-15 22:56 -0600
http://bitbucket.org/pypy/pypy/changeset/bea325b046d9/
Log: works with annotator, but had to disable most functionality for now.
Basically can create arrays and get/setitem with them. Float32/96
aren't liked by the annotator so they are actually Float64 right
now.
diff --git a/pypy/module/micronumpy/__init__.py b/pypy/module/micronumpy/__init__.py
--- a/pypy/module/micronumpy/__init__.py
+++ b/pypy/module/micronumpy/__init__.py
@@ -9,31 +9,31 @@
'array': 'interp_numarray.BaseArray',
'zeros': 'interp_numarray.zeros',
'empty': 'interp_numarray.zeros',
- 'ones': 'interp_numarray.ones',
- 'fromstring': 'interp_support.fromstring',
+ #'ones': 'interp_numarray.ones',
+ #'fromstring': 'interp_support.fromstring',
# ufuncs
- 'abs': 'interp_ufuncs.absolute',
- 'absolute': 'interp_ufuncs.absolute',
- 'add': 'interp_ufuncs.add',
- 'copysign': 'interp_ufuncs.copysign',
- 'divide': 'interp_ufuncs.divide',
- 'exp': 'interp_ufuncs.exp',
- 'fabs': 'interp_ufuncs.fabs',
- 'floor': 'interp_ufuncs.floor',
- 'maximum': 'interp_ufuncs.maximum',
- 'minimum': 'interp_ufuncs.minimum',
- 'multiply': 'interp_ufuncs.multiply',
- 'negative': 'interp_ufuncs.negative',
- 'reciprocal': 'interp_ufuncs.reciprocal',
- 'sign': 'interp_ufuncs.sign',
- 'subtract': 'interp_ufuncs.subtract',
- 'sin': 'interp_ufuncs.sin',
- 'cos': 'interp_ufuncs.cos',
- 'tan': 'interp_ufuncs.tan',
- 'arcsin': 'interp_ufuncs.arcsin',
- 'arccos': 'interp_ufuncs.arccos',
- 'arctan': 'interp_ufuncs.arctan',
+ #'abs': 'interp_ufuncs.absolute',
+ #'absolute': 'interp_ufuncs.absolute',
+ #'add': 'interp_ufuncs.add',
+ #'copysign': 'interp_ufuncs.copysign',
+ #'divide': 'interp_ufuncs.divide',
+ #'exp': 'interp_ufuncs.exp',
+ #'fabs': 'interp_ufuncs.fabs',
+ #'floor': 'interp_ufuncs.floor',
+ #'maximum': 'interp_ufuncs.maximum',
+ #'minimum': 'interp_ufuncs.minimum',
+ #'multiply': 'interp_ufuncs.multiply',
+ #'negative': 'interp_ufuncs.negative',
+ #'reciprocal': 'interp_ufuncs.reciprocal',
+ #'sign': 'interp_ufuncs.sign',
+ #'subtract': 'interp_ufuncs.subtract',
+ #'sin': 'interp_ufuncs.sin',
+ #'cos': 'interp_ufuncs.cos',
+ #'tan': 'interp_ufuncs.tan',
+ #'arcsin': 'interp_ufuncs.arcsin',
+ #'arccos': 'interp_ufuncs.arccos',
+ #'arctan': 'interp_ufuncs.arctan',
# dtype
'dtype': 'interp_dtype.Dtype',
diff --git a/pypy/module/micronumpy/interp_dtype.py b/pypy/module/micronumpy/interp_dtype.py
--- a/pypy/module/micronumpy/interp_dtype.py
+++ b/pypy/module/micronumpy/interp_dtype.py
@@ -9,7 +9,7 @@
from pypy.rlib.rarithmetic import r_int, r_uint, LONG_BIT, LONGLONG_BIT
from pypy.rpython.lltypesystem import lltype, rffi
-_letters_to_nums = [-1]*128
+_letters_to_nums = [-1]*256
_letters_to_nums[ord('?')] = 0 # bool
_letters_to_nums[ord('b')] = 1 # int8
@@ -67,11 +67,9 @@
# fields, names, f?, metadata. I'll just implement the base minimum for
# now. This will include type, kind, typeobj?, byteorder, type_num, elsize,
#
- def __init__(self, name, castfunc, unwrapfunc, num, kind):
+ def __init__(self, name, num, kind):
# doesn't handle align and copy parameters yet
# only deals with simple strings e.g., 'uint32', and type objects
- self.cast = castfunc
- self.unwrap = unwrapfunc
self.num = num
self.kind = kind
self.name = name
@@ -90,12 +88,30 @@
descr_str = descr_name
+
+def make_dtype(TP, name, convfunc, castfunc, unwrapfunc, num, kind):
+ class A_Dtype(Dtype):
+ def __init__(self):
+ Dtype.__init__(self, name, num, kind)
+ self.TP = TP
+ self.conv = convfunc
+ self.cast = castfunc
+ self.unwrap = unwrapfunc
+ A_Dtype.__name__ = "Dtype_" + name
+ return A_Dtype()
+
def unwrap_float(space, val):
return space.float_w(space.float(val))
def unwrap_int(space, val):
return space.int_w(space.int(val))
+def unwrap_bigint(space, val):
+ return space.r_longlong_w(space.long(val))
+
+def unwrap_ubigint(space, val):
+ return space.r_ulonglong_w(space.long(val))
+
def unwrap_bool(space, val):
return space.is_true(val)
@@ -141,24 +157,56 @@
def cast_float96(val):
return rffi.cast(lltype.LongFloat, val)
-Bool_dtype = Dtype('bool', cast_bool, unwrap_bool, Bool_num, BOOLLTR)
-Int8_dtype = Dtype('int8', cast_int8, unwrap_int, Int8_num, SIGNEDLTR)
-UInt8_dtype = Dtype('uint8', cast_uint8, unwrap_int, UInt8_num, UNSIGNEDLTR)
-Int16_dtype = Dtype('int16', cast_int16, unwrap_int, Int16_num, SIGNEDLTR)
-UInt16_dtype = Dtype('uint16', cast_uint16, unwrap_int, UInt16_num, UNSIGNEDLTR)
-Int32_dtype = Dtype('int32', cast_int32, unwrap_int, Int32_num, SIGNEDLTR)
-UInt32_dtype = Dtype('uint32', cast_uint32, unwrap_int, UInt32_num, UNSIGNEDLTR)
-Long_dtype = Dtype('int32' if LONG_BIT == 32 else 'int64',
- cast_long, unwrap_int, Long_num, SIGNEDLTR)
-ULong_dtype = Dtype('uint32' if LONG_BIT == 32 else 'uint64',
- cast_ulong, unwrap_int, ULong_num, UNSIGNEDLTR)
-Int64_dtype = Dtype('int64', cast_int64, unwrap_int, Int64_num, SIGNEDLTR)
-UInt64_dtype = Dtype('uint64', cast_uint64, unwrap_int, UInt64_num, UNSIGNEDLTR)
-Float32_dtype = Dtype('float32', cast_float32, unwrap_float, Float32_num, FLOATINGLTR)
-Float64_dtype = Dtype('float64', cast_float64, unwrap_float, Float64_num, FLOATINGLTR)
-Float96_dtype = Dtype('float96', cast_float96, unwrap_float, Float96_num, FLOATINGLTR)
+def conv_bool(space, val):
+ return bool(val)
+# return space.bool(val)
-_dtype_list = (Bool_dtype,
+def conv_int(space, val):
+ return int(val)
+# return space.int(val)
+
+def conv_float(space, val):
+ return float(val)
+# return space.float(val)
+
+Bool_dtype = make_dtype(lltype.Array(lltype.Bool, hints={'nolength': True}),
+ 'bool', conv_bool, cast_bool, unwrap_bool, Bool_num, BOOLLTR)
+Int8_dtype = make_dtype(lltype.Array(rffi.SIGNEDCHAR, hints={'nolength': True}),
+ 'int8', conv_int, cast_int8, unwrap_int, Int8_num, SIGNEDLTR)
+UInt8_dtype = make_dtype(lltype.Array(rffi.UCHAR, hints={'nolength': True}),
+ 'uint8', conv_int, cast_uint8, unwrap_int, UInt8_num, UNSIGNEDLTR)
+Int16_dtype = make_dtype(lltype.Array(rffi.SHORT, hints={'nolength': True}),
+ 'int16', conv_int, cast_int16, unwrap_int, Int16_num, SIGNEDLTR)
+UInt16_dtype = make_dtype(lltype.Array(rffi.USHORT, hints={'nolength': True}),
+ 'uint16', conv_int, cast_uint16, unwrap_int, UInt16_num, UNSIGNEDLTR)
+Int32_dtype = make_dtype(lltype.Array(rffi.INT, hints={'nolength': True}),
+ 'int32', conv_int, cast_int32, unwrap_int, Int32_num, SIGNEDLTR)
+UInt32_dtype = make_dtype(lltype.Array(rffi.UINT, hints={'nolength': True}),
+ 'uint32', conv_int, cast_uint32, unwrap_int, UInt32_num, UNSIGNEDLTR)
+Long_dtype = make_dtype(lltype.Array(rffi.LONG, hints={'nolength': True}),
+ 'int32' if LONG_BIT == 32 else 'int64',
+ conv_int, cast_long, unwrap_int, Long_num, SIGNEDLTR)
+ULong_dtype = make_dtype(lltype.Array(rffi.ULONG, hints={'nolength': True}),
+ 'uint32' if LONG_BIT == 32 else 'uint64',
+ conv_int, cast_ulong,
+ unwrap_ubigint if LONG_BIT == 32 else unwrap_int,
+ ULong_num, UNSIGNEDLTR)
+
+Int64_dtype = make_dtype(lltype.Array(rffi.LONGLONG, hints={'nolength': True}),
+ 'int64', conv_int, cast_int64,
+ unwrap_bigint if LONG_BIT == 32 else unwrap_bigint, Int64_num, SIGNEDLTR)
+UInt64_dtype = make_dtype(lltype.Array(rffi.ULONGLONG, hints={'nolength': True}),
+ 'uint64', conv_int, cast_uint64, unwrap_ubigint, UInt64_num, UNSIGNEDLTR)
+#Float32_dtype = make_dtype('float32', conv_float, cast_float32, unwrap_float, Float32_num, FLOATINGLTR)
+Float64_dtype = make_dtype(lltype.Array(lltype.Float, hints={'nolength': True}),
+ 'float64', conv_float, cast_float64, unwrap_float, Float64_num, FLOATINGLTR)
+#Float96_dtype = make_dtype('float96', conv_float, cast_float96, unwrap_float, Float96_num, FLOATINGLTR)
+# This is until we get ShortFloat and LongFloat implemented in the annotator and what not
+Float32_dtype = Float64_dtype
+Float96_dtype = Float64_dtype
+
+
+_dtype_list = [Bool_dtype,
Int8_dtype,
UInt8_dtype,
Int16_dtype,
@@ -172,13 +220,15 @@
Float32_dtype,
Float64_dtype,
Float96_dtype,
-)
+]
def find_scalar_dtype(space, scalar):
if space.is_true(space.isinstance(scalar, space.w_int)):
return Long_dtype
if space.is_true(space.isinstance(scalar, space.w_float)):
return Float64_dtype
+ if space.is_true(space.isinstance(scalar, space.w_bool)):
+ return Bool_dtype
def find_result_dtype(d1, d2):
# this function is for determining the result dtype of bin ops, etc.
@@ -223,10 +273,11 @@
if space.is_true(space.isinstance(str_or_type, space.w_str)):
s = space.str_w(str_or_type)
if len(s) == 1:
- typenum = _letters_to_nums[ord(s)]
- dtype = _dtype_list[typenum]
- if typenum != -1 and dtype is not None:
- return _dtype_list[typenum]
+ typenum = _letters_to_nums[ord(s[0])]
+ if typenum != -1:
+ dtype = _dtype_list[typenum]
+ if dtype is not None:
+ return _dtype_list[typenum]
# XXX: can improve this part. will need to for endianness
if s in num_dict:
return _dtype_list[num_dict[s]]
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
@@ -2,32 +2,21 @@
from pypy.interpreter.error import OperationError, operationerrfmt
from pypy.interpreter.gateway import interp2app, unwrap_spec
from pypy.interpreter.typedef import TypeDef, GetSetProperty
+from pypy.module.cpyext.api import cpython_api, PyObject
+from pypy.module.cpyext.longobject import PyLong_FromLongLong, PyLong_FromUnsignedLongLong
from pypy.module.micronumpy.interp_dtype import Dtype, Float64_num, Int32_num, Float64_dtype, get_dtype, find_scalar_dtype, find_result_dtype, _dtype_list
from pypy.module.micronumpy.interp_support import Signature
from pypy.module.micronumpy import interp_ufuncs
from pypy.objspace.std.floatobject import float2string as float2string_orig
+from pypy.objspace.std.objspace import newlong
from pypy.rlib import jit
+from pypy.rlib import rbigint
+from pypy.rlib.rarithmetic import LONG_BIT
from pypy.rlib.rfloat import DTSF_STR_PRECISION
from pypy.rpython.lltypesystem import lltype, rffi
from pypy.tool.sourcetools import func_with_new_name
import math
-TPs = (lltype.Array(lltype.Bool, hints={'nolength': True}), # bool
- lltype.Array(rffi.SIGNEDCHAR, hints={'nolength': True}), # int8
- lltype.Array(rffi.UCHAR, hints={'nolength': True}), # uint8
- lltype.Array(rffi.SHORT, hints={'nolength': True}), # int16
- lltype.Array(rffi.USHORT, hints={'nolength': True}), # uint16
- lltype.Array(rffi.INT, hints={'nolength': True}), #int32
- lltype.Array(rffi.UINT, hints={'nolength': True}), # uint32
- lltype.Array(rffi.LONG, hints={'nolength': True}), # long
- lltype.Array(rffi.ULONG, hints={'nolength': True}), # ulong
- lltype.Array(rffi.LONGLONG, hints={'nolength': True}), # int64
- lltype.Array(rffi.ULONGLONG, hints={'nolength': True}), # uint64
- lltype.Array(lltype.SingleFloat, hints={'nolength': True}), # float32
- lltype.Array(lltype.Float, hints={'nolength': True}), # float64
- lltype.Array(lltype.LongFloat, hints={'nolength': True}), # float96
-)
-
numpy_driver = jit.JitDriver(greens = ['signature'],
reds = ['result_size', 'i', 'self', 'result'])
all_driver = jit.JitDriver(greens=['signature'], reds=['i', 'size', 'self'])
@@ -184,12 +173,12 @@
def descr_any(self, space):
return space.wrap(self._any())
-# descr_sum = _reduce_sum_prod_impl(add, 0.0)
-# descr_prod = _reduce_sum_prod_impl(mul, 1.0)
-# descr_max = _reduce_max_min_impl(maximum)
-# descr_min = _reduce_max_min_impl(minimum)
-# descr_argmax = _reduce_argmax_argmin_impl(maximum)
-# descr_argmin = _reduce_argmax_argmin_impl(minimum)
+ descr_sum = _reduce_sum_prod_impl(add, 0.0)
+ descr_prod = _reduce_sum_prod_impl(mul, 1.0)
+ descr_max = _reduce_max_min_impl(maximum)
+ descr_min = _reduce_max_min_impl(minimum)
+ descr_argmax = _reduce_argmax_argmin_impl(maximum)
+ descr_argmin = _reduce_argmax_argmin_impl(minimum)
def descr_dot(self, space, w_other):
if isinstance(w_other, BaseArray):
@@ -253,7 +242,7 @@
start, stop, step, slice_length = space.decode_index4(w_idx, self.find_size())
if step == 0:
# Single index
- return space.wrap(self.get_concrete().eval(start))
+ return self.get_concrete().getitem(space, start)
else:
# Slice
res = SingleDimSlice(start, stop, step, slice_length, self, self.signature.transition(SingleDimSlice.static_signature))
@@ -266,19 +255,20 @@
self.find_size())
if step == 0:
# Single index
- self.get_concrete().setitem(start, self.dtype.cast(self.dtype.unwrap(w_value)))
+ self.get_concrete().setitem_wrap(space, start, w_value)
else:
- concrete = self.get_concrete()
- if isinstance(w_value, BaseArray):
+ raise OperationError(space.w_ValueError, space.wrap("No slices"))
+ #concrete = self.get_concrete()
+ #if isinstance(w_value, BaseArray):
# for now we just copy if setting part of an array from
# part of itself. can be improved.
- if (concrete.get_root_storage() ==
- w_value.get_concrete().get_root_storage()):
- w_value = new_numarray(space, w_value, self.dtype)
- else:
- w_value = convert_to_array(space, w_value)
- concrete.setslice(space, start, stop, step,
- slice_length, w_value)
+ # if (concrete.get_root_storage() ==
+ # w_value.get_concrete().get_root_storage()):
+ # w_value = new_numarray(space, w_value, self.dtype)
+ #else:
+ # w_value = convert_to_array(space, w_value)
+ #concrete.setslice(space, start, stop, step,
+ # slice_length, w_value)
def descr_mean(self, space):
return space.wrap(space.float_w(self.descr_sum(space))/self.find_size())
@@ -286,24 +276,22 @@
def _sliceloop1(self, start, stop, step, source, dest):
i = start
j = 0
- storage = dest.get_root_storage()
while i < stop:
slice_driver1.jit_merge_point(signature=source.signature,
step=step, stop=stop, i=i, j=j, source=source,
dest=dest)
- storage[i] = source.eval(j)
+ dest.setitem(i, source.eval(j))
j += 1
i += step
def _sliceloop2(self, start, stop, step, source, dest):
i = start
j = 0
- storage = dest.get_root_storage()
while i > stop:
slice_driver2.jit_merge_point(signature=source.signature,
step=step, stop=stop, i=i, j=j, source=source,
dest=dest)
- storage[i] = source.eval(j)
+ dest.setitem(i, source.eval(j))
j += 1
i += step
@@ -367,12 +355,12 @@
signature = self.signature
result_size = self.find_size()
result = create_sdarray(result_size, self.dtype)
- storage = result.get_root_storage()
+ #storage = result.get_root_storage()
while i < result_size:
numpy_driver.jit_merge_point(signature=signature,
result_size=result_size, i=i,
self=self, result=result)
- storage[i] = self.eval(i)
+ result.setitem(i, self.eval(i))
i += 1
return result
@@ -486,6 +474,9 @@
def setitem(self, item, value):
return self.parent.setitem(self.calc_index(item), value)
+ def getitem(self, space, value):
+ return self.parent.getitem(space, self.calc_index(value))
+
def descr_len(self, space):
return space.wrap(self.find_size())
@@ -553,14 +544,26 @@
else:
self._sliceloop2(start, stop, step, arr, self)
-def make_class(num):
- TP = TPs[num]
+def fromlong(val):
+ if val >= 0:
+ if val == 0:
+ digits = [rbigint.NULLDIGIT]
+ sign = 0
+ else:
+ digits = rbigint.digits_from_nonneg_long(val)
+ sign = 1
+ else:
+ digits = rbigint.digits_from_nonneg_long(-val)
+ sign = -1
+ return rbigint.rbigint(digits, sign)
+
+def make_class(_dtype):
class TypedSingleDimArray(SingleDimArray):
- def __init__(self, size, dtype):
+ dtype = _dtype
+ def __init__(self, size):
SingleDimArray.__init__(self)
self.size = size
- self.dtype = dtype
- self.storage = lltype.malloc(TP, size, zero=True,
+ self.storage = lltype.malloc(_dtype.TP, size, zero=True,
flavor='raw', track_allocation=False,
add_memory_pressure=True)
# XXX find out why test_zjit explodes with trackign of allocations
@@ -570,34 +573,51 @@
def eval(self, i):
return self.storage[i]
+
+ if _dtype.kind == 'b':
+ def getitem(self, space, i):
+ return space.wrap(bool(self.storage[i]))
+ elif _dtype.kind == 'f':
+ def getitem(self, space, i):
+ return space.wrap(float(self.storage[i]))
+ elif _dtype.num < 8 or (LONG_BIT == 64 and _dtype.num == 9):
+ def getitem(self, space, i):
+ return space.wrap(rffi.cast(lltype.Signed, self.storage[i]))
+ elif LONG_BIT == 64 or _dtype.num == 8:
+ def getitem(self, space, i):
+ return space.wrap(self.storage[i])
+ else: # unsigned longlong and signed longlong for 32-bit
+ def getitem(self, space, i):
+ return newlong(space, fromlong(self.storage[i]))
def setitem(self, item, value):
- self.invalidated()
self.storage[item] = value
+ def setitem_wrap(self, space, item, value):
+ self.storage[item] = rffi.cast(_dtype.TP.OF, _dtype.unwrap(space, value))
+
def find_dtype(self):
return self.dtype
def __del__(self):
lltype.free(self.storage, flavor='raw', track_allocation=False)
- TypedSingleDimArray.__name__ = 'SingleDimArray' + str(num)
+ TypedSingleDimArray.__name__ = 'SingleDimArray_' + _dtype.name
return TypedSingleDimArray
-_array_classes = tuple(make_class(i) for i in xrange(14))
+_array_classes = [make_class(d) for d in _dtype_list]
def create_sdarray(L, dtype):
- return _array_classes[dtype.num](L, dtype)
+ arr_type = _array_classes[dtype.num]
+ return arr_type(L)
def new_numarray(space, iterable, dtype):
l = space.listview(iterable)
dtype = get_dtype(space, dtype)
arr = create_sdarray(len(l), dtype)
i = 0
- unwrap = dtype.unwrap
- cast = dtype.cast
for w_elem in l:
- arr.storage[i] = cast(unwrap(space, w_elem))
+ arr.setitem_wrap(space, i, w_elem)
i += 1
return arr
@@ -627,7 +647,7 @@
def ones(space, size):
arr = create_sdarray(size, Float64_dtype)
for i in xrange(size):
- arr.storage[i] = 1.0
+ arr.setitem(space, i, 1.0)
return space.wrap(arr)
BaseArray.typedef = TypeDef(
@@ -642,32 +662,32 @@
__getitem__ = interp2app(BaseArray.descr_getitem),
__setitem__ = interp2app(BaseArray.descr_setitem),
- __pos__ = interp2app(BaseArray.descr_pos),
- __neg__ = interp2app(BaseArray.descr_neg),
- __abs__ = interp2app(BaseArray.descr_abs),
- __add__ = interp2app(BaseArray.descr_add),
- __sub__ = interp2app(BaseArray.descr_sub),
- __mul__ = interp2app(BaseArray.descr_mul),
- __div__ = interp2app(BaseArray.descr_div),
- __pow__ = interp2app(BaseArray.descr_pow),
- __mod__ = interp2app(BaseArray.descr_mod),
- __radd__ = interp2app(BaseArray.descr_radd),
- __rsub__ = interp2app(BaseArray.descr_rsub),
- __rmul__ = interp2app(BaseArray.descr_rmul),
- __rdiv__ = interp2app(BaseArray.descr_rdiv),
- __rpow__ = interp2app(BaseArray.descr_rpow),
- __rmod__ = interp2app(BaseArray.descr_rmod),
- __repr__ = interp2app(BaseArray.descr_repr),
- __str__ = interp2app(BaseArray.descr_str),
+ #__pos__ = interp2app(BaseArray.descr_pos),
+ #__neg__ = interp2app(BaseArray.descr_neg),
+ #__abs__ = interp2app(BaseArray.descr_abs),
+ #__add__ = interp2app(BaseArray.descr_add),
+ #__sub__ = interp2app(BaseArray.descr_sub),
+ #__mul__ = interp2app(BaseArray.descr_mul),
+ #__div__ = interp2app(BaseArray.descr_div),
+ #__pow__ = interp2app(BaseArray.descr_pow),
+ #__mod__ = interp2app(BaseArray.descr_mod),
+ #__radd__ = interp2app(BaseArray.descr_radd),
+ #__rsub__ = interp2app(BaseArray.descr_rsub),
+ #__rmul__ = interp2app(BaseArray.descr_rmul),
+ #__rdiv__ = interp2app(BaseArray.descr_rdiv),
+ #__rpow__ = interp2app(BaseArray.descr_rpow),
+ #__rmod__ = interp2app(BaseArray.descr_rmod),
+ #__repr__ = interp2app(BaseArray.descr_repr),
+ #__str__ = interp2app(BaseArray.descr_str),
-# mean = interp2app(BaseArray.descr_mean),
-# sum = interp2app(BaseArray.descr_sum),
-# prod = interp2app(BaseArray.descr_prod),
-# max = interp2app(BaseArray.descr_max),
-# min = interp2app(BaseArray.descr_min),
-# argmax = interp2app(BaseArray.descr_argmax),
-# argmin = interp2app(BaseArray.descr_argmin),
-# all = interp2app(BaseArray.descr_all),
-# any = interp2app(BaseArray.descr_any),
-# dot = interp2app(BaseArray.descr_dot),
+ #mean = interp2app(BaseArray.descr_mean),
+ #sum = interp2app(BaseArray.descr_sum),
+ #prod = interp2app(BaseArray.descr_prod),
+ #max = interp2app(BaseArray.descr_max),
+ #min = interp2app(BaseArray.descr_min),
+ #argmax = interp2app(BaseArray.descr_argmax),
+ #argmin = interp2app(BaseArray.descr_argmin),
+ #all = interp2app(BaseArray.descr_all),
+ #any = interp2app(BaseArray.descr_any),
+ #dot = interp2app(BaseArray.descr_dot),
)
More information about the pypy-commit
mailing list