Author: Justin Peel <notmuchtot...@gmail.com> Branch: numpy-dtype Changeset: r46221:4145ce2b3d99 Date: 2011-08-02 18:17 -0600 http://bitbucket.org/pypy/pypy/changeset/4145ce2b3d99/
Log: got one type of int working. binary operations appear to work with mixed types. 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 @@ -3,6 +3,7 @@ from pypy.interpreter.gateway import interp2app from pypy.interpreter.typedef import TypeDef, GetSetProperty 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 @@ -50,11 +51,11 @@ # 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, convfunc, wrapfunc, num, kind): + def __init__(self, castfunc, unwrapfunc, num, kind): # doesn't handle align and copy parameters yet # only deals with simple strings e.g., 'uint32', and type objects - self.conv = convfunc - self.wrap = wrapfunc + self.cast = castfunc + self.unwrap = unwrapfunc self.num = num self.kind = kind @@ -64,27 +65,27 @@ def descr_kind(self, space): return space.wrap(self.kind) -def conv_float(space, val): - return space.float(val) +def cast_float(val): + return rffi.cast(lltype.Float, val) -def wrap_float(space, val): - return space.float_w(val) +def unwrap_float(space, val): + return space.float_w(space.float(val)) -def conv_long(space, val): - return r_int(val) +def cast_long(val): + return rffi.cast(rffi.INT, val) -def wrap_int(space, val): - return space.int_w(val) +def unwrap_int(space, val): + return space.int_w(space.int(val)) -def conv_ulong(space, val): - return r_uint(val) +def cast_ulong(val): + return rffi.cast(rffi.UINT, val) -Float64_dtype = Dtype(conv_float, wrap_float, Float64_num, +Float64_dtype = Dtype(cast_float, unwrap_float, Float64_num, FLOATINGLTR) -#Int32_dtype = Dtype(conv_int32, wrap_int, Int32_num, SIGNEDLTR) -#UInt32_dtype = Dtype(conv_uint32, wrap_int, UIn32_num, UNSIGNEDLTR) -Long_dtype = Dtype(conv_long, wrap_int, Long_num, SIGNEDLTR) -ULong_dtype = Dtype(conv_long, wrap_int, Long_num, UNSIGNEDLTR) +#Int32_dtype = Dtype(cast_int32, unwrap_int, Int32_num, SIGNEDLTR) +#UInt32_dtype = Dtype(cast_uint32, unwrap_int, UIn32_num, UNSIGNEDLTR) +Long_dtype = Dtype(cast_long, unwrap_int, Long_num, SIGNEDLTR) +ULong_dtype = Dtype(cast_ulong, unwrap_int, Long_num, UNSIGNEDLTR) _dtype_list = [None] * 14 _dtype_list[Float64_num] = Float64_dtype 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 @@ -19,7 +19,7 @@ None, # uint16 lltype.Array(rffi.INT, hints={'nolength': True}), #int32 lltype.Array(rffi.UINT, hints={'nolength': True}), # uint32 - None, # long + lltype.Array(rffi.LONG, hints={'nolength': True}), # long None, # ulong None, # longlong None, # ulonglong @@ -314,7 +314,7 @@ def wrap_scalar(space, scalar, dtype=None): if dtype is None: dtype = find_scalar_dtype(space, scalar) - return ScalarWrapper(dtype.wrap(space, scalar), dtype) + return ScalarWrapper(dtype.unwrap(space, scalar), dtype) class ScalarWrapper(BaseArray): """ @@ -422,12 +422,11 @@ self.right = right dtype = self.left.find_dtype() dtype2 = self.right.find_dtype() - if dtype.num >= dtype2.num: - self.dtype = dtype - elif dtype.num < dtype2.num: - self.dtype = dtype2 - else: - self.dtype = dtype + # this is more complicated than this. + # for instance int32 + uint32 = int64 + if dtype.num != dtype.num and dtype.num < dtype2.num: + dtype = dtype2 + self.dtype = dtype def _del_sources(self): self.left = None @@ -566,15 +565,17 @@ dtype = get_dtype(space, Dtype, dtype) arr = SingleDimArray(len(l), dtype) i = 0 - conv = dtype.conv - wrap = dtype.wrap + unwrap = dtype.unwrap + # the types seem to be casting on their own so I've omitted the cast for now + #cast = dtype.cast for w_elem in l: - arr.storage[i] = wrap(space, conv(space, w_elem)) + arr.storage[i] = unwrap(space, w_elem) i += 1 return arr def descr_new_numarray(space, w_type, __args__): # this isn't such a great check. We should improve it including exceptions. + # Also needs to be able to handle keywords iterable = __args__.arguments_w[0] if len(__args__.arguments_w) == 2: dtype = __args__.arguments_w[1] diff --git a/pypy/module/micronumpy/test/test_dtypes.py b/pypy/module/micronumpy/test/test_dtypes.py --- a/pypy/module/micronumpy/test/test_dtypes.py +++ b/pypy/module/micronumpy/test/test_dtypes.py @@ -8,3 +8,15 @@ d = dtype('l') assert d.num == 7 assert d.kind == 'i' + + def test_too_large_int(self): + from numpy import array + # only one 32-bit system for now.. will change to 'i' when we can + raises(OverflowError, "array([2147483648], 'l')") + + def test_int_array(self): + from numpy import array + a = array([1.5, 2.5, 3.5], 'l') + assert a[0] == 1 + assert a[1] == 2 + assert a[2] == 3 diff --git a/pypy/module/micronumpy/test/test_ufuncs.py b/pypy/module/micronumpy/test/test_ufuncs.py --- a/pypy/module/micronumpy/test/test_ufuncs.py +++ b/pypy/module/micronumpy/test/test_ufuncs.py @@ -74,6 +74,16 @@ for i in range(3): assert c[i] == a[i] + b[i] + def test_add_types(self): + from numpy import array, add + a = array([-5.0, -0.0, 1.0], 'l') + b = array([3, -2, 3], 'l') + c = add(a, b) + print c + assert c.dtype is a.dtype + for i in range(3): + assert c[i] == a[i] + b[i] + def test_divide(self): from numpy import array, divide _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit