Author: Alex Gaynor <alex.gay...@gmail.com> Branch: numpy-ufunc-object Changeset: r46912:c3db36472ab2 Date: 2011-08-30 00:23 -0400 http://bitbucket.org/pypy/pypy/changeset/c3db36472ab2/
Log: first pass. 0 progress made, doesn't work, broke everything. But it's a start! 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 @@ -8,6 +8,7 @@ interpleveldefs = { 'array': 'interp_numarray.SingleDimArray', 'dtype': 'interp_dtype.W_Dtype', + 'ufunc': 'interp_ufuncs.W_Ufunc', 'zeros': 'interp_numarray.zeros', 'empty': 'interp_numarray.zeros', 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 @@ -56,7 +56,7 @@ def _unaryop_impl(w_ufunc): def impl(self, space): return w_ufunc(space, self) - return func_with_new_name(impl, "unaryop_%s_impl" % w_ufunc.__name__) + return func_with_new_name(impl, "unaryop_%s_impl" % w_ufunc.name) descr_pos = _unaryop_impl(interp_ufuncs.positive) descr_neg = _unaryop_impl(interp_ufuncs.negative) @@ -65,7 +65,7 @@ def _binop_impl(w_ufunc): def impl(self, space, w_other): return w_ufunc(space, self, w_other) - return func_with_new_name(impl, "binop_%s_impl" % w_ufunc.__name__) + return func_with_new_name(impl, "binop_%s_impl" % w_ufunc.name) descr_add = _binop_impl(interp_ufuncs.add) descr_sub = _binop_impl(interp_ufuncs.subtract) @@ -81,7 +81,7 @@ w_other ) return w_ufunc(space, w_other, self) - return func_with_new_name(impl, "binop_right_%s_impl" % w_ufunc.__name__) + return func_with_new_name(impl, "binop_right_%s_impl" % w_ufunc.name) descr_radd = _binop_right_impl(interp_ufuncs.add) descr_rsub = _binop_right_impl(interp_ufuncs.subtract) 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 @@ -1,7 +1,41 @@ +from pypy.interpreter.baseobjspace import Wrappable +from pypy.interpreter.gateway import interp2app +from pypy.interpreter.typedef import TypeDef from pypy.module.micronumpy import interp_dtype, signature from pypy.tool.sourcetools import func_with_new_name +class W_Ufunc(Wrappable): + def __init__(self, name, promote_to_float, promote_bools, identity): + self.name = name + self.promote_to_float = promote_to_float + self.promote_bools = promote_bools + + self.identity = identity + + def descr_repr(self, space): + return space.wrap("<ufunc '%s'>" % self.name) + +class W_Ufunc1(W_Ufunc): + def __init__(self, func, name, promote_to_float=False, promote_bools=False, + identity=None): + + W_Ufunc.__init__(self, name, promote_to_float, promote_bools, identity) + self.func = func + +class W_Ufunc2(W_Ufunc): + def __init__(self, func, name, promote_to_float=False, promote_bools=False, + identity=None): + + W_Ufunc.__init__(self, name, promote_to_float, promote_bools, identity) + self.func = func + +W_Ufunc.typedef = TypeDef("ufunc", + __module__ = "numpy", + + __repr__ = interp2app(W_Ufunc.descr_repr), +) + def ufunc(func=None, promote_to_float=False, promote_bools=False): if func is None: return lambda func: ufunc(func, promote_to_float, promote_bools) @@ -74,7 +108,7 @@ assert False def find_unaryop_result_dtype(space, dt, promote_to_float=False, - promote_to_largest=False, promote_bools=False): + promote_bools=False, promote_to_largest=False): if promote_bools and (dt.kind == interp_dtype.BOOLLTR): return space.fromcache(interp_dtype.W_Int8Dtype) if promote_to_float: @@ -108,17 +142,15 @@ def ufunc_dtype_caller(ufunc_name, op_name, argcount, **kwargs): if argcount == 1: - @ufunc(**kwargs) def impl(res_dtype, value): return getattr(res_dtype, op_name)(value) elif argcount == 2: - @ufunc2(**kwargs) def impl(res_dtype, lvalue, rvalue): return getattr(res_dtype, op_name)(lvalue, rvalue) return func_with_new_name(impl, ufunc_name) for ufunc_def in [ - ("add", "add", 2), + ("add", "add", 2, {"identity": 0}), ("subtract", "sub", 2), ("multiply", "mul", 2), ("divide", "div", 2, {"promote_bools": True}), @@ -155,4 +187,9 @@ except IndexError: extra_kwargs = {} - globals()[ufunc_name] = ufunc_dtype_caller(ufunc_name, op_name, argcount, **extra_kwargs) + func = ufunc_dtype_caller(ufunc_name, op_name, argcount) + if argcount == 1: + ufunc = W_Ufunc1(func, ufunc_name, **extra_kwargs) + elif argcount == 2: + ufunc = W_Ufunc2(func, ufunc_name, **extra_kwargs) + globals()[ufunc_name] = ufunc 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 @@ -3,6 +3,24 @@ class AppTestUfuncs(BaseNumpyAppTest): + def test_ufunc_instance(self): + from numpy import add, ufunc + + assert isinstance(add, ufunc) + assert repr(add) == "<ufunc 'add'>" + assert repr(ufunc) == "<type 'numpy.ufunc'>" + + def test_ufunc_attrs(self): + from numpy import add, multiply, sin + + assert add.identity == 0 + assert multiply.identity == 1 + assert sin.identity is None + + assert add.nin == 2 + assert multiply.nin == 2 + assert sin.nin == 1 + def test_single_item(self): from numpy import negative, sign, minimum _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit