[pypy-commit] pypy numpy-dtype-alt: refactoring of ufuncs, probably went too far.

alex_gaynor noreply at buildbot.pypy.org
Mon Aug 15 05:57:05 CEST 2011


Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch: numpy-dtype-alt
Changeset: r46507:f6bba1e3b53d
Date: 2011-08-14 21:00 -0700
http://bitbucket.org/pypy/pypy/changeset/f6bba1e3b53d/

Log:	refactoring of ufuncs, probably went too far.

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
@@ -5,8 +5,8 @@
 from pypy.interpreter.gateway import interp2app
 from pypy.interpreter.typedef import TypeDef, interp_attrproperty
 from pypy.objspace.std.floatobject import float2string
+from pypy.rlib import rfloat
 from pypy.rlib.objectmodel import specialize
-from pypy.rlib.rfloat import DTSF_STR_PRECISION
 from pypy.rlib.unroll import unrolling_iterable
 from pypy.rpython.lltypesystem import lltype, llmemory, rffi
 
@@ -109,6 +109,15 @@
     @binop
     def pow(self, v1, v2):
         return math.pow(v1, v2)
+    @binop
+    def max(self, v1, v2):
+        return max(v1, v2)
+    @binop
+    def min(self, v1, v2):
+        return min(v1, v2)
+    @binop
+    def copysign(self, v1, v2):
+        return math.copysign(v1, v2)
     @unaryop
     def neg(self, v):
         return -v
@@ -118,12 +127,50 @@
     @unaryop
     def abs(self, v):
         return abs(v)
-    @binop
-    def max(self, v1, v2):
-        return max(v1, v2)
-    @binop
-    def min(self, v1, v2):
-        return min(v1, v2)
+    @unaryop
+    def sign(self, v):
+        if v == 0.0:
+            return 0.0
+        return rfloat.copysign(1.0, v)
+    @unaryop
+    def fabs(self, v):
+        return math.fabs(v)
+    @unaryop
+    def reciprocal(self, v):
+        if v == 0.0:
+            return rfloat.copysign(rfloat.INFINITY, v)
+        return 1.0 / v
+    @unaryop
+    def floor(self, v):
+        return math.floor(v)
+    @unaryop
+    def exp(self, v):
+        try:
+            return math.exp(v)
+        except OverflowError:
+            return rfloat.INFINITY
+    @unaryop
+    def sin(self, v):
+        return math.sin(v)
+    @unaryop
+    def cos(self, v):
+        return math.cos(v)
+    @unaryop
+    def tan(self, v):
+        return math.tan(v)
+    @unaryop
+    def arcsin(self, v):
+        if v < -1.0 or  v > 1.0:
+            return rfloat.NAN
+        return math.asin(v)
+    @unaryop
+    def arccos(self, v):
+        if v < -1.0 or v > 1.0:
+            return rfloat.NAN
+        return math.acos(v)
+    @unaryop
+    def arctan(self, v):
+        return math.atan(v)
 
     # Comparisons, they return unwraped results (for now)
     def ne(self, v1, v2):
@@ -212,7 +259,7 @@
         return space.float_w(space.float(w_item))
 
     def str_format(self, item):
-        return float2string(item.val, 'g', DTSF_STR_PRECISION)
+        return float2string(item.val, 'g', rfloat.DTSF_STR_PRECISION)
 
 
 ALL_DTYPES = [
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
@@ -16,13 +16,14 @@
             w_obj_arr.invalidates.append(w_res)
             return w_res
         else:
-            return func(scalar(interp_dtype.W_Float64_Dtype, w_obj)).wrap(space)
+            res_dtype = space.fromcache(interp_dtype.W_Float64Dtype)
+            return func(res_dtype, scalar(space, interp_dtype.W_Float64Dtype, w_obj)).wrap(space)
     return func_with_new_name(impl, "%s_dispatcher" % func.__name__)
 
 def ufunc2(func):
     signature = Signature()
     def impl(space, w_lhs, w_rhs):
-        from pypy.module.micronumpy.interp_numarray import Call2, convert_to_array
+        from pypy.module.micronumpy.interp_numarray import Call2, convert_to_array, scalar
         if space.issequence_w(w_lhs) or space.issequence_w(w_rhs):
             w_lhs_arr = convert_to_array(space, w_lhs)
             w_rhs_arr = convert_to_array(space, w_rhs)
@@ -32,7 +33,12 @@
             w_rhs_arr.invalidates.append(w_res)
             return w_res
         else:
-            return space.wrap(func(space.float_w(w_lhs), space.float_w(w_rhs)))
+            res_dtype = space.fromcache(interp_dtype.W_Float64Dtype)
+            return func(
+                res_dtype,
+                scalar(space, interp_dtype.W_Float64Dtype, w_lhs),
+                scalar(space, interp_dtype.W_Float64Dtype, w_rhs),
+            ).wrap(space)
     return func_with_new_name(impl, "%s_dispatcher" % func.__name__)
 
 def ufunc_dtype_caller(ufunc_name, op_name, argcount):
@@ -54,82 +60,26 @@
     ("divide", "div", 2),
     ("mod", "mod", 2),
     ("power", "pow", 2),
+
+    ("maximum", "max", 2),
+    ("minimum", "min", 2),
+
+    ("copysign", "copysign", 2),
+
     ("negative", "neg", 1),
     ("positive", "pos", 1),
     ("absolute", "abs", 1),
+    ("sign", "sign", 1),
+    ("fabs", "fabs", 1),
+    ("reciprocal", "reciprocal", 1),
+    ("floor", "floor", 1),
+
+    ("exp", "exp", 1),
+    ("sin", "sin", 1),
+    ("cos", "cos", 1),
+    ("tan", "tan", 1),
+    ("arcsin", "arcsin", 1),
+    ("arccos", "arccos", 1),
+    ("arctan", "arctan", 1),
 ]:
-    globals()[ufunc_name] = ufunc_dtype_caller(ufunc_name, op_name, argcount)
-
- at ufunc2
-def copysign(lvalue, rvalue):
-    return rfloat.copysign(lvalue, rvalue)
-
-
- at ufunc
-def exp(value):
-    try:
-        return math.exp(value)
-    except OverflowError:
-        return rfloat.INFINITY
-
- at ufunc
-def fabs(value):
-    return math.fabs(value)
-
- at ufunc2
-def maximum(lvalue, rvalue):
-    return max(lvalue, rvalue)
-
- at ufunc2
-def minimum(lvalue, rvalue):
-    return min(lvalue, rvalue)
-
-
-
-
-
- at ufunc
-def reciprocal(value):
-    if value == 0.0:
-        return rfloat.copysign(rfloat.INFINITY, value)
-    return 1.0 / value
-
- at ufunc
-def floor(value):
-    return math.floor(value)
-
- at ufunc
-def sign(value):
-    if value == 0.0:
-        return 0.0
-    return rfloat.copysign(1.0, value)
-
- at ufunc
-def sin(value):
-    return math.sin(value)
-
- at ufunc
-def cos(value):
-    return math.cos(value)
-
- at ufunc
-def tan(value):
-    return math.tan(value)
-
-
-
- at ufunc
-def arcsin(value):
-    if value < -1.0 or  value > 1.0:
-        return rfloat.NAN
-    return math.asin(value)
-
- at ufunc
-def arccos(value):
-    if value < -1.0 or  value > 1.0:
-        return rfloat.NAN
-    return math.acos(value)
-
- at ufunc
-def arctan(value):
-    return math.atan(value)
+    globals()[ufunc_name] = ufunc_dtype_caller(ufunc_name, op_name, argcount)
\ No newline at end of file
diff --git a/pypy/module/micronumpy/test/test_zjit.py b/pypy/module/micronumpy/test/test_zjit.py
--- a/pypy/module/micronumpy/test/test_zjit.py
+++ b/pypy/module/micronumpy/test/test_zjit.py
@@ -30,7 +30,7 @@
     def test_add(self):
         def f(i):
             ar = SingleDimArray(i, dtype=self.float64_dtype)
-            v = add(self.float64_dtype, ar, ar)
+            v = add(self.space, ar, ar)
             concrete = v.get_concrete()
             return concrete.dtype.getitem(concrete.storage, 3)
 


More information about the pypy-commit mailing list