[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