[pypy-commit] pypy default: Merged numpy-ufuncs into trunk.
alex_gaynor
noreply at buildbot.pypy.org
Thu Jul 21 09:44:39 CEST 2011
Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch:
Changeset: r45791:a3f9ed7d37a7
Date: 2011-07-21 00:44 -0700
http://bitbucket.org/pypy/pypy/changeset/a3f9ed7d37a7/
Log: Merged numpy-ufuncs into trunk.
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
@@ -15,14 +15,19 @@
# ufuncs
'abs': 'interp_ufuncs.absolute',
'absolute': 'interp_ufuncs.absolute',
+ 'add': 'interp_ufuncs.add',
'copysign': 'interp_ufuncs.copysign',
+ 'divide': 'interp_ufuncs.divide',
'exp': 'interp_ufuncs.exp',
+ 'fabs': 'interp_ufuncs.fabs',
'floor': 'interp_ufuncs.floor',
'maximum': 'interp_ufuncs.maximum',
'minimum': 'interp_ufuncs.minimum',
+ 'multiply': 'interp_ufuncs.multiply',
'negative': 'interp_ufuncs.negative',
'reciprocal': 'interp_ufuncs.reciprocal',
'sign': 'interp_ufuncs.sign',
+ 'subtract': 'interp_ufuncs.subtract',
'sin': 'interp_ufuncs.sin',
'cos': 'interp_ufuncs.cos',
'tan': 'interp_ufuncs.tan',
diff --git a/pypy/module/micronumpy/compile.py b/pypy/module/micronumpy/compile.py
--- a/pypy/module/micronumpy/compile.py
+++ b/pypy/module/micronumpy/compile.py
@@ -3,7 +3,7 @@
It should not be imported by the module itself
"""
-from pypy.module.micronumpy.interp_numarray import FloatWrapper, SingleDimArray
+from pypy.module.micronumpy.interp_numarray import FloatWrapper, SingleDimArray, BaseArray
class BogusBytecode(Exception):
pass
@@ -18,6 +18,14 @@
def wrap(self, x):
return x
+ def issequence_w(self, w_obj):
+ # Completley wrong in the general case, but good enough for this.
+ return isinstance(w_obj, BaseArray)
+
+ def float_w(self, w_obj):
+ assert isinstance(w_obj, float)
+ return w_obj
+
def numpy_compile(bytecode, array_size):
space = TrivialSpace()
stack = []
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
@@ -2,6 +2,8 @@
from pypy.interpreter.error import OperationError, operationerrfmt
from pypy.interpreter.gateway import interp2app, unwrap_spec
from pypy.interpreter.typedef import TypeDef, GetSetProperty
+from pypy.module.micronumpy.interp_support import Signature
+from pypy.module.micronumpy import interp_ufuncs
from pypy.objspace.std.floatobject import float2string as float2string_orig
from pypy.rlib import jit
from pypy.rlib.rfloat import DTSF_STR_PRECISION
@@ -24,16 +26,6 @@
all_driver = jit.JitDriver(greens=['signature'], reds=['i', 'size', 'self'])
any_driver = jit.JitDriver(greens=['signature'], reds=['i', 'size', 'self'])
-class Signature(object):
- def __init__(self):
- self.transitions = {}
-
- def transition(self, target):
- if target in self.transitions:
- return self.transitions[target]
- self.transitions[target] = new = Signature()
- return new
-
def pos(v):
return v
def neg(v):
@@ -42,16 +34,8 @@
return abs(v)
def add(v1, v2):
return v1 + v2
-def sub(v1, v2):
- return v1 - v2
def mul(v1, v2):
return v1 * v2
-def div(v1, v2):
- return v1 / v2
-def power(v1, v2):
- return math.pow(v1, v2)
-def mod(v1, v2):
- return math.fmod(v1, v2)
def maximum(v1, v2):
return max(v1, v2)
def minimum(v1, v2):
@@ -89,51 +73,30 @@
descr_neg = _unop_impl(neg)
descr_abs = _unop_impl(absolute)
- def _binop_impl(function):
- signature = Signature()
+ def _binop_impl(w_ufunc):
def impl(self, space, w_other):
- w_other = convert_to_array(space, w_other)
- new_sig = self.signature.transition(signature)
- res = Call2(
- function,
- self,
- w_other,
- new_sig.transition(w_other.signature)
- )
- w_other.invalidates.append(res)
- self.invalidates.append(res)
- return space.wrap(res)
- return func_with_new_name(impl, "binop_%s_impl" % function.__name__)
+ return w_ufunc(space, self, w_other)
+ return func_with_new_name(impl, "binop_%s_impl" % w_ufunc.__name__)
- descr_add = _binop_impl(add)
- descr_sub = _binop_impl(sub)
- descr_mul = _binop_impl(mul)
- descr_div = _binop_impl(div)
- descr_pow = _binop_impl(power)
- descr_mod = _binop_impl(mod)
+ descr_add = _binop_impl(interp_ufuncs.add)
+ descr_sub = _binop_impl(interp_ufuncs.subtract)
+ descr_mul = _binop_impl(interp_ufuncs.multiply)
+ descr_div = _binop_impl(interp_ufuncs.divide)
+ descr_pow = _binop_impl(interp_ufuncs.power)
+ descr_mod = _binop_impl(interp_ufuncs.mod)
- def _binop_right_impl(function):
- signature = Signature()
+ def _binop_right_impl(w_ufunc):
def impl(self, space, w_other):
- new_sig = self.signature.transition(signature)
w_other = FloatWrapper(space.float_w(w_other))
- res = Call2(
- function,
- w_other,
- self,
- new_sig.transition(w_other.signature)
- )
- self.invalidates.append(res)
- return space.wrap(res)
- return func_with_new_name(impl,
- "binop_right_%s_impl" % function.__name__)
+ return w_ufunc(space, w_other, self)
+ return func_with_new_name(impl, "binop_right_%s_impl" % w_ufunc.__name__)
- descr_radd = _binop_right_impl(add)
- descr_rsub = _binop_right_impl(sub)
- descr_rmul = _binop_right_impl(mul)
- descr_rdiv = _binop_right_impl(div)
- descr_rpow = _binop_right_impl(power)
- descr_rmod = _binop_right_impl(mod)
+ descr_radd = _binop_right_impl(interp_ufuncs.add)
+ descr_rsub = _binop_right_impl(interp_ufuncs.subtract)
+ descr_rmul = _binop_right_impl(interp_ufuncs.multiply)
+ descr_rdiv = _binop_right_impl(interp_ufuncs.divide)
+ descr_rpow = _binop_right_impl(interp_ufuncs.power)
+ descr_rmod = _binop_right_impl(interp_ufuncs.mod)
def _reduce_sum_prod_impl(function, init):
reduce_driver = jit.JitDriver(greens=['signature'],
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,14 +1,14 @@
-
from pypy.rlib.rstruct.runpack import runpack
from pypy.rpython.lltypesystem import lltype, rffi
+from pypy.interpreter.error import OperationError
from pypy.interpreter.gateway import unwrap_spec
-from pypy.interpreter.error import OperationError
-from pypy.module.micronumpy.interp_numarray import SingleDimArray
+
FLOAT_SIZE = rffi.sizeof(lltype.Float)
@unwrap_spec(s=str)
def fromstring(space, s):
+ from pypy.module.micronumpy.interp_numarray import SingleDimArray
length = len(s)
if length % FLOAT_SIZE == 0:
@@ -30,3 +30,13 @@
end += FLOAT_SIZE
return space.wrap(a)
+
+class Signature(object):
+ def __init__(self):
+ self.transitions = {}
+
+ def transition(self, target):
+ if target in self.transitions:
+ return self.transitions[target]
+ self.transitions[target] = new = Signature()
+ return new
\ No newline at end of file
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,13 +1,13 @@
import math
-from pypy.module.micronumpy.interp_numarray import (Call1, Call2, Signature,
- convert_to_array)
+from pypy.module.micronumpy.interp_support import Signature
from pypy.rlib import rfloat
from pypy.tool.sourcetools import func_with_new_name
def ufunc(func):
signature = Signature()
def impl(space, w_obj):
+ from pypy.module.micronumpy.interp_numarray import Call1, convert_to_array
if space.issequence_w(w_obj):
w_obj_arr = convert_to_array(space, w_obj)
w_res = Call1(func, w_obj_arr, w_obj_arr.signature.transition(signature))
@@ -20,6 +20,7 @@
def ufunc2(func):
signature = Signature()
def impl(space, w_lhs, w_rhs):
+ from pypy.module.micronumpy.interp_numarray import Call2, convert_to_array
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)
@@ -37,9 +38,17 @@
return abs(value)
@ufunc2
+def add(lvalue, rvalue):
+ return lvalue + rvalue
+
+ at ufunc2
def copysign(lvalue, rvalue):
return rfloat.copysign(lvalue, rvalue)
+ at ufunc2
+def divide(lvalue, rvalue):
+ return lvalue / rvalue
+
@ufunc
def exp(value):
try:
@@ -47,6 +56,10 @@
except OverflowError:
return rfloat.INFINITY
+ at ufunc
+def fabs(value):
+ return math.fabs(value)
+
@ufunc2
def maximum(lvalue, rvalue):
return max(lvalue, rvalue)
@@ -55,6 +68,10 @@
def minimum(lvalue, rvalue):
return min(lvalue, rvalue)
+ at ufunc2
+def multiply(lvalue, rvalue):
+ return lvalue * rvalue
+
@ufunc
def negative(value):
return -value
@@ -65,6 +82,10 @@
return rfloat.copysign(rfloat.INFINITY, value)
return 1.0 / value
+ at ufunc2
+def subtract(lvalue, rvalue):
+ return lvalue - rvalue
+
@ufunc
def floor(value):
return math.floor(value)
@@ -86,3 +107,11 @@
@ufunc
def tan(value):
return math.tan(value)
+
+ at ufunc2
+def power(lvalue, rvalue):
+ return math.pow(lvalue, rvalue)
+
+ at ufunc2
+def mod(lvalue, rvalue):
+ return math.fmod(lvalue, rvalue)
\ No newline at end of file
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
@@ -65,6 +65,33 @@
for i in range(3):
assert b[i] == abs(a[i])
+ def test_add(self):
+ from numpy import array, add
+
+ a = array([-5.0, -0.0, 1.0])
+ b = array([ 3.0, -2.0,-3.0])
+ c = add(a, b)
+ for i in range(3):
+ assert c[i] == a[i] + b[i]
+
+ def test_divide(self):
+ from numpy import array, divide
+
+ a = array([-5.0, -0.0, 1.0])
+ b = array([ 3.0, -2.0,-3.0])
+ c = divide(a, b)
+ for i in range(3):
+ assert c[i] == a[i] / b[i]
+
+ def test_fabs(self):
+ from numpy import array, fabs
+ from math import fabs as math_fabs
+
+ a = array([-5.0, -0.0, 1.0])
+ b = fabs(a)
+ for i in range(3):
+ assert b[i] == math_fabs(a[i])
+
def test_minimum(self):
from numpy import array, minimum
@@ -83,6 +110,15 @@
for i in range(3):
assert c[i] == max(a[i], b[i])
+ def test_multiply(self):
+ from numpy import array, multiply
+
+ a = array([-5.0, -0.0, 1.0])
+ b = array([ 3.0, -2.0,-3.0])
+ c = multiply(a, b)
+ for i in range(3):
+ assert c[i] == a[i] * b[i]
+
def test_sign(self):
from numpy import array, sign
@@ -101,6 +137,15 @@
for i in range(4):
assert b[i] == reference[i]
+ def test_subtract(self):
+ from numpy import array, subtract
+
+ a = array([-5.0, -0.0, 1.0])
+ b = array([ 3.0, -2.0,-3.0])
+ c = subtract(a, b)
+ for i in range(3):
+ assert c[i] == a[i] - b[i]
+
def test_floor(self):
from numpy import array, floor
More information about the pypy-commit
mailing list