[pypy-commit] pypy numpypy-complex2: Backed out changeset: 91fd1795c5bd
mattip
noreply at buildbot.pypy.org
Mon Aug 27 23:56:07 CEST 2012
Author: mattip <matti.picus at gmail.com>
Branch: numpypy-complex2
Changeset: r56896:d0c1ca50197c
Date: 2012-08-28 00:55 +0300
http://bitbucket.org/pypy/pypy/changeset/d0c1ca50197c/
Log: Backed out changeset: 91fd1795c5bd rcomplex is indeed the correct
way to proceed, tests can be refactored from cmath/test/test_cmath
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
@@ -6,7 +6,7 @@
from pypy.module.micronumpy import interp_boxes
from pypy.objspace.std.floatobject import float2string
from pypy.objspace.std.complexobject import W_ComplexObject, str_format
-from pypy.rlib import rfloat, libffi, clibffi #, rcomplex
+from pypy.rlib import rfloat, libffi, clibffi, rcomplex
from pypy.rlib.rawstorage import (alloc_raw_storage, raw_storage_setitem,
raw_storage_getitem)
from pypy.rlib.objectmodel import specialize, we_are_translated
@@ -35,8 +35,7 @@
)
return dispatcher
-complex_unary_op = simple_unary_op
-def _complex_unary_op(func):
+def complex_unary_op(func):
specialize.argtype(1)(func)
@functools.wraps(func)
def dispatcher(self, v):
@@ -922,15 +921,20 @@
BoxType = interp_boxes.W_Float64Box
format_code = "d"
-class ComplexFloating(Primitive):
- #_mixin_ = True
- #_attrs_ = ()
+class ComplexFloating(object):
+ _mixin_ = True
+ _attrs_ = ()
def _coerce(self, space, w_item):
w_item = space.call_function(space.w_complex, w_item)
real, imag = space.unpackcomplex(w_item)
return self.box_complex(real, imag)
+ def coerce(self, space, dtype, w_item):
+ if isinstance(w_item, self.BoxType):
+ return w_item
+ return self.coerce_subtype(space, space.gettypefor(self.BoxType), w_item)
+
def coerce_subtype(self, space, w_subtype, w_item):
w_tmpobj = self._coerce(space, w_item)
w_obj = space.allocate_instance(self.BoxType, w_subtype)
@@ -939,8 +943,7 @@
return w_obj
def str_format(self, box):
- cval = self.for_computation(self.unbox(box))
- real, imag =cval.real, cval.imag
+ real, imag = self.for_computation(self.unbox(box))
imag_str = str_format(imag) + 'j'
# (0+2j) => 2j
@@ -952,17 +955,13 @@
return ''.join(['(', real_str, op, imag_str, ')'])
def for_computation(self, v):
- return complex(v[0], v[1])
+ return float(v[0]), float(v[1])
def get_element_size(self):
return 2 * rffi.sizeof(self._COMPONENTS_T)
@specialize.argtype(1)
def box(self, value):
- if isinstance(value, complex):
- return self.BoxType(
- rffi.cast(self._COMPONENTS_T, value.real),
- rffi.cast(self._COMPONENTS_T, value.imag))
return self.BoxType(
rffi.cast(self._COMPONENTS_T, value),
rffi.cast(self._COMPONENTS_T, 0.0))
@@ -995,66 +994,67 @@
real, imag = self._read(arr.storage, i, offset)
return self.box_complex(real, imag)
- #@complex_binary_op
- #def add(self, v1, v2):
- # return rcomplex.c_add(v1, v2)
+ @complex_binary_op
+ def add(self, v1, v2):
+ return rcomplex.c_add(v1, v2)
- #@complex_binary_op
- #def sub(self, v1, v2):
- # return rcomplex.c_sub(v1, v2)
+ @complex_binary_op
+ def sub(self, v1, v2):
+ return rcomplex.c_sub(v1, v2)
- #@complex_binary_op
- #def mul(self, v1, v2):
- # return rcomplex.c_mul(v1, v2)
+ @complex_binary_op
+ def mul(self, v1, v2):
+ return rcomplex.c_mul(v1, v2)
- #@complex_binary_op
- @simple_binary_op
+ @complex_binary_op
def div(self, v1, v2):
try:
- return v1 / v2
+ return rcomplex.c_div(v1, v2)
except ZeroDivisionError:
- return complex(rfloat.NAN, rfloat.NAN)
+ return rfloat.NAN, rfloat.NAN
- #@complex_unary_op
- #def pos(self, v):
- # return v
- #@complex_unary_op
- #def neg(self, v):
- # return complex(-v.real, -v.imag)
- #@complex_unary_op
- #def conj(self, v):
- # return complex(v.real, -v.imag)
+ @complex_unary_op
+ def pos(self, v):
+ return v
+
+ @complex_unary_op
+ def neg(self, v):
+ return -v[0], -v[1]
+
+ @complex_unary_op
+ def conj(self, v):
+ return v[0], -v[1]
@raw_unary_op
def abs(self, v):
- return abs(v)
+ return rcomplex.c_abs(v[0], v[1])
- #@raw_unary_op
- #def isnan(self, v):
- # '''a complex number is nan if one of the parts is nan'''
- # return rfloat.isnan(v[0]) or rfloat.isnan(v[1])
+ @raw_unary_op
+ def isnan(self, v):
+ '''a complex number is nan if one of the parts is nan'''
+ return rfloat.isnan(v[0]) or rfloat.isnan(v[1])
- #@raw_unary_op
- #def isinf(self, v):
- # '''a complex number is inf if one of the parts is inf'''
- # return rfloat.isinf(v[0]) or rfloat.isinf(v[1])
+ @raw_unary_op
+ def isinf(self, v):
+ '''a complex number is inf if one of the parts is inf'''
+ return rfloat.isinf(v[0]) or rfloat.isinf(v[1])
- #def _eq(self, v1, v2):
- # return v1[0] == v2[0] and v1[1] == v2[1]
+ def _eq(self, v1, v2):
+ return v1[0] == v2[0] and v1[1] == v2[1]
- #@raw_binary_op
- #def eq(self, v1, v2):
- # #compare the parts, so nan == nan is False
- # return self._eq(v1, v2)
+ @raw_binary_op
+ def eq(self, v1, v2):
+ #compare the parts, so nan == nan is False
+ return self._eq(v1, v2)
- #@raw_binary_op
- #def ne(self, v1, v2):
- # return not self._eq(v1, v2)
+ @raw_binary_op
+ def ne(self, v1, v2):
+ return not self._eq(v1, v2)
def _lt(self, v1, v2):
- (r1, i1), (r2, i2) = (v1.real, v1.imag), (v2.real, v2.imag)
+ (r1, i1), (r2, i2) = v1, v2
if r1 < r2:
return True
elif not r1 <= r2:
@@ -1067,7 +1067,7 @@
@raw_binary_op
def le(self, v1, v2):
- return self._lt(v1, v2) or v1 == v2
+ return self._lt(v1, v2) or self._eq(v1, v2)
@raw_binary_op
def gt(self, v1, v2):
@@ -1075,8 +1075,8 @@
@raw_binary_op
def ge(self, v1, v2):
- return self._lt(v2, v1) or v2 == v1
-'''
+ return self._lt(v2, v1) or self._eq(v2, v1)
+
@raw_binary_op
def logical_and(self, v1, v2):
return bool(v1) and bool(v2)
@@ -1113,10 +1113,10 @@
except ZeroDivisionError:
return rfloat.NAN, 0
- complex mod does not exist
- @simple_binary_op
- def mod(self, v1, v2):
- return math.fmod(v1, v2)
+ #complex mod does not exist
+ #@simple_binary_op
+ #def mod(self, v1, v2):
+ # return math.fmod(v1, v2)
@simple_binary_op
def pow(self, v1, v2):
@@ -1379,8 +1379,6 @@
return v2 + self.npy_log2_1p(math.pow(2, tmp))
else:
return v1 + v2
-'''
-
class Complex64(ComplexFloating, BaseType):
_attrs_ = ()
More information about the pypy-commit
mailing list