[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