[pypy-commit] pypy numpy-dtype-refactor: put a ton of ufuncs back, more methods on numpy.generic objs, a few more fixes

alex_gaynor noreply at buildbot.pypy.org
Fri Nov 11 17:02:17 CET 2011


Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch: numpy-dtype-refactor
Changeset: r49324:256fe9f5b6bb
Date: 2011-11-11 11:01 -0500
http://bitbucket.org/pypy/pypy/changeset/256fe9f5b6bb/

Log:	put a ton of ufuncs back, more methods on numpy.generic objs, a few
	more fixes

diff --git a/pypy/module/micronumpy/interp_boxes.py b/pypy/module/micronumpy/interp_boxes.py
--- a/pypy/module/micronumpy/interp_boxes.py
+++ b/pypy/module/micronumpy/interp_boxes.py
@@ -31,10 +31,29 @@
             return getattr(interp_ufuncs.get(space), ufunc_name).call(space, [self, w_other])
         return func_with_new_name(impl, "binop_%s_impl" % ufunc_name)
 
+    def _binop_right_impl(ufunc_name):
+        def impl(self, space, w_other):
+            from pypy.module.micronumpy import interp_ufuncs
+            return getattr(interp_ufuncs.get(space), ufunc_name).call(space, [w_other, self])
+        return func_with_new_name(impl, "binop_right_%s_impl" % ufunc_name)
+
+    def _unaryop_impl(ufunc_name):
+        def impl(self, space):
+            from pypy.module.micronumpy import interp_ufuncs
+            return getattr(interp_ufuncs.get(space), ufunc_name).call(space, [self])
+        return func_with_new_name(impl, "unaryop_%s_impl" % ufunc_name)
+
     descr_add = _binop_impl("add")
+    descr_sub = _binop_impl("subtract")
+    descr_mul = _binop_impl("multiply")
     descr_div = _binop_impl("divide")
     descr_eq = _binop_impl("equal")
 
+    descr_rmul = _binop_right_impl("multiply")
+
+    descr_neg = _unaryop_impl("negative")
+    descr_abs = _unaryop_impl("absolute")
+
 
 class W_BoolBox(W_GenericBox):
     def __init__(self, value):
@@ -111,9 +130,16 @@
     __float__ = interp2app(W_GenericBox.descr_float),
 
     __add__ = interp2app(W_GenericBox.descr_add),
+    __sub__ = interp2app(W_GenericBox.descr_sub),
+    __mul__ = interp2app(W_GenericBox.descr_mul),
     __div__ = interp2app(W_GenericBox.descr_div),
+
+    __rmul__ = interp2app(W_GenericBox.descr_rmul),
+
     __eq__ = interp2app(W_GenericBox.descr_eq),
 
+    __neg__ = interp2app(W_GenericBox.descr_neg),
+    __abs__ = interp2app(W_GenericBox.descr_abs),
 )
 
 W_BoolBox.typedef = TypeDef("bool_", W_GenericBox.typedef,
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
@@ -120,8 +120,8 @@
                                               self=self, dtype=dtype,
                                               size=size, i=i, result=result,
                                               cur_best=cur_best)
-                new_best = getattr(dtype, op_name)(cur_best, self.eval(i))
-                if dtype.ne(new_best, cur_best):
+                new_best = getattr(dtype.itemtype, op_name)(cur_best, self.eval(i))
+                if dtype.itemtype.ne(new_best, cur_best):
                     result = i
                     cur_best = new_best
                 i += 1
@@ -154,7 +154,7 @@
         i = 0
         while i < size:
             any_driver.jit_merge_point(signature=self.signature, self=self, size=size, dtype=dtype, i=i)
-            if dtype.bool(self.eval(i)):
+            if dtype.itemtype.bool(self.eval(i)):
                 return True
             i += 1
         return False
diff --git a/pypy/module/micronumpy/interp_support.py b/pypy/module/micronumpy/interp_support.py
--- a/pypy/module/micronumpy/interp_support.py
+++ b/pypy/module/micronumpy/interp_support.py
@@ -1,6 +1,6 @@
 from pypy.interpreter.error import OperationError
 from pypy.interpreter.gateway import unwrap_spec
-from pypy.module.micronumpy.interp_dtype import W_Float64Dtype
+from pypy.module.micronumpy.interp_dtype import get_dtype_cache
 from pypy.rlib.rstruct.runpack import runpack
 from pypy.rpython.lltypesystem import lltype, rffi
 
@@ -18,7 +18,7 @@
         raise OperationError(space.w_ValueError, space.wrap(
             "string length %d not divisable by %d" % (length, FLOAT_SIZE)))
 
-    dtype = space.fromcache(W_Float64Dtype)
+    dtype = get_dtype_cache(space).w_float64dtype
     a = SingleDimArray(number, dtype=dtype)
 
     start = 0
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
@@ -29,7 +29,7 @@
     def descr_get_identity(self, space):
         if self.identity is None:
             return space.w_None
-        return self.identity.wrap(space)
+        return self.identity
 
     def descr_call(self, space, __args__):
         if __args__.keywords or len(__args__.arguments_w) < self.argcount:
@@ -108,7 +108,7 @@
             promote_bools=self.promote_bools,
         )
         if isinstance(w_obj, Scalar):
-            return self.func(res_dtype, w_obj.value.convert_to(res_dtype)).wrap(space)
+            return self.func(res_dtype, w_obj.value.convert_to(res_dtype))
 
         new_sig = signature.Signature.find_sig([self.signature, w_obj.signature])
         w_res = Call1(new_sig, res_dtype, w_obj)
diff --git a/pypy/module/micronumpy/types.py b/pypy/module/micronumpy/types.py
--- a/pypy/module/micronumpy/types.py
+++ b/pypy/module/micronumpy/types.py
@@ -7,7 +7,12 @@
 from pypy.rpython.lltypesystem import lltype, rffi
 
 
-def simple_op(func):
+def simple_unary_op(func):
+    def dispatcher(self, v):
+        return self.box(func(self, self.unbox(v)))
+    return dispatcher
+
+def simple_binary_op(func):
     def dispatcher(self, v1, v2):
         return self.box(func(self, self.unbox(v1), self.unbox(v2)))
     return dispatcher
@@ -65,11 +70,36 @@
     def mul(self, v1, v2):
         return self.box(self.unbox(v1) * self.unbox(v2))
 
+    def pos(self, v):
+        return self.box(+self.unbox(v))
+
+    def neg(self, v):
+        return self.box(-self.unbox(v))
+
+    @simple_unary_op
+    def abs(self, v):
+        return abs(v)
+
     def eq(self, v1, v2):
         return self.unbox(v1) == self.unbox(v2)
 
+    def ne(self, v1, v2):
+        return self.unbox(v1) != self.unbox(v2)
+
+    def lt(self, v1, v2):
+        return self.unbox(v1) < self.unbox(v2)
+
+    def le(self, v1, v2):
+        return self.unbox(v1) <= self.unbox(v2)
+
+    def gt(self, v1, v2):
+        return self.unbox(v1) > self.unbox(v2)
+
+    def ge(self, v1, v2):
+        return self.unbox(v1) >= self.unbox(v2)
+
     def bool(self, v):
-        return bool(v)
+        return bool(self.unbox(v))
 
     def max(self, v1, v2):
         return self.box(max(self.unbox(v1), self.unbox(v2)))
@@ -106,12 +136,26 @@
         value = self.unbox(box)
         return str(value)
 
-    @simple_op
+    @simple_binary_op
     def div(self, v1, v2):
         if v2 == 0:
             return 0
         return v1 / v2
 
+    @simple_binary_op
+    def mod(self, v1, v2):
+        return v1 % v2
+
+    @simple_unary_op
+    def sign(self, v):
+        if v > 0:
+            return 1
+        elif v < 0:
+            return -1
+        else:
+            assert v == 0
+            return 0
+
 class Int8(Integer):
     T = rffi.SIGNEDCHAR
     BoxType = interp_boxes.W_Int8Box
@@ -160,7 +204,7 @@
         value = self.unbox(box)
         return float2string(value, "g", rfloat.DTSF_STR_PRECISION)
 
-    @simple_op
+    @simple_binary_op
     def div(self, v1, v2):
         try:
             return v1 / v2
@@ -169,10 +213,49 @@
                 return rfloat.NAN
             return rfloat.copysign(rfloat.INFINITY, v1 * v2)
 
-    @simple_op
+    @simple_binary_op
+    def mod(self, v1, v2):
+        return math.fmod(v1, v2)
+
+    @simple_binary_op
     def pow(self, v1, v2):
         return math.pow(v1, v2)
 
+    @simple_binary_op
+    def copysign(self, v1, v2):
+        return math.copysign(v1, v2)
+
+    @simple_unary_op
+    def sign(self, v):
+        if v == 0.0:
+            return 0.0
+        return rfloat.copysign(1.0, v)
+
+    @simple_unary_op
+    def fabs(self, v):
+        return math.fabs(v)
+
+    @simple_unary_op
+    def reciprocal(self, v):
+        if v == 0.0:
+            return rfloat.copysign(rfloat.INFINITY, v)
+        return 1.0 / v
+
+    @simple_unary_op
+    def floor(self, v):
+        return math.floor(v)
+
+    @simple_unary_op
+    def exp(self, v):
+        try:
+            return math.exp(v)
+        except OverflowError:
+            return rfloat.INFINITY
+
+    @simple_unary_op
+    def sin(self, v):
+        return math.sin(v)
+
 class Float32(Float):
     T = rffi.FLOAT
     BoxType = interp_boxes.W_Float32Box


More information about the pypy-commit mailing list