[pypy-commit] pypy numpypy-complex2: Started work on complex-types for numpypy

jbs noreply at buildbot.pypy.org
Sat Jun 23 13:14:57 CEST 2012


Author: Jasper Schulz <jasper.schulz at student.hpi.uni-potsdam.de>
Branch: numpypy-complex2
Changeset: r55776:9b031aa06b64
Date: 2012-06-23 12:53 +0200
http://bitbucket.org/pypy/pypy/changeset/9b031aa06b64/

Log:	Started work on complex-types for numpypy

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
@@ -78,6 +78,8 @@
         'str_': 'interp_boxes.W_StringBox',
         'unicode_': 'interp_boxes.W_UnicodeBox',
         'void': 'interp_boxes.W_VoidBox',
+        'complexfloating': 'interp_boxes.W_ComplexFloatingBox',
+        'complex128': 'interp_boxes.W_Complex128Box'
     }
 
     # ufuncs
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
@@ -56,7 +56,8 @@
     w_slice = "slice"
     w_str = "str"
     w_unicode = "unicode"
-
+    w_complex = "complex"
+    
     def __init__(self):
         """NOT_RPYTHON"""
         self.fromcache = InternalSpaceCache(self).getorbuild
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
@@ -1,11 +1,12 @@
 from pypy.interpreter.baseobjspace import Wrappable
 from pypy.interpreter.error import operationerrfmt, OperationError
 from pypy.interpreter.gateway import interp2app, unwrap_spec
-from pypy.interpreter.typedef import TypeDef
+from pypy.interpreter.typedef import TypeDef, GetSetProperty
 from pypy.objspace.std.floattype import float_typedef
 from pypy.objspace.std.stringtype import str_typedef
 from pypy.objspace.std.unicodetype import unicode_typedef, unicode_from_object
 from pypy.objspace.std.inttype import int_typedef
+from pypy.objspace.std.complextype import complex_typedef
 from pypy.rlib.rarithmetic import LONG_BIT
 from pypy.tool.sourcetools import func_with_new_name
 
@@ -221,6 +222,7 @@
 def descr_index(space, self):
     return space.index(self.item(space))
 
+
 class W_VoidBox(W_FlexibleBox):
     @unwrap_spec(item=str)
     def descr_getitem(self, space, item):
@@ -268,6 +270,24 @@
         #    arr.storage[i] = arg[i]
         return W_UnicodeBox(arr, 0, arr.dtype)
 
+
+class W_ComplexFloatingBox(W_InexactBox):
+    _attrs_ = ()
+
+class W_Complex128Box(W_ComplexFloatingBox):
+    descr__new__, _get_dtype = new_dtype_getter("complex128")
+
+    def __init__(self, real, imag):
+        self.real = real
+        self.imag = imag
+
+    def descr_get_real(self, space):
+        return space.wrap(self.real)
+
+    def descr_get_imag(self, space):
+        return space.wrap(self.imag)
+
+
 W_GenericBox.typedef = TypeDef("generic",
     __module__ = "numpypy",
 
@@ -450,3 +470,13 @@
     __new__ = interp2app(W_UnicodeBox.descr__new__unicode_box.im_func),
 )
 
+W_ComplexFloatingBox.typedef = TypeDef("complexfloating", W_InexactBox.typedef,
+    __module__ = "numpypy",
+)
+
+W_Complex128Box.typedef = TypeDef("complex128", (W_ComplexFloatingBox.typedef, complex_typedef),
+    __module__ = "numpypy",
+    __new__ = interp2app(W_Complex128Box.descr__new__.im_func),
+    real = GetSetProperty(W_Complex128Box.descr_get_real),
+    imag = GetSetProperty(W_Complex128Box.descr_get_imag),
+)
\ No newline at end of file
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
@@ -387,6 +387,16 @@
             alternate_constructors=[space.w_float],
             aliases=["float"],
         )
+        self.w_complex128dtype = W_Dtype(
+            types.Complex128(),
+            num=15,
+            kind=FLOATINGLTR,
+            name="complex128",
+            char="c",
+            w_box_type = space.gettypefor(interp_boxes.W_Complex128Box),
+            alternate_constructors=[space.w_complex],
+            aliases=["complex"],
+        )
         self.w_stringdtype = W_Dtype(
             types.StringType(1),
             num=18,
@@ -420,8 +430,8 @@
             self.w_int16dtype, self.w_uint16dtype, self.w_int32dtype,
             self.w_uint32dtype, self.w_longdtype, self.w_ulongdtype,
             self.w_int64dtype, self.w_uint64dtype,
-            self.w_float32dtype,
-            self.w_float64dtype, self.w_stringdtype, self.w_unicodedtype,
+            self.w_float32dtype, self.w_float64dtype, self.w_complex128dtype,
+            self.w_stringdtype, self.w_unicodedtype,
             self.w_voiddtype,
         ]
         self.float_dtypes_by_num_bytes = sorted(
diff --git a/pypy/module/micronumpy/test/test_dtypes.py b/pypy/module/micronumpy/test/test_dtypes.py
--- a/pypy/module/micronumpy/test/test_dtypes.py
+++ b/pypy/module/micronumpy/test/test_dtypes.py
@@ -421,6 +421,29 @@
         assert numpy.float64('23.4') == numpy.float64(23.4)
         raises(ValueError, numpy.float64, '23.2df')
 
+    def test_complex_floating(self):
+        import _numpypy as numpy
+
+        assert numpy.complexfloating.__mro__ == (numpy.complexfloating,
+            numpy.inexact, numpy.number, numpy.generic, object)
+
+    def test_complex(self):
+        import _numpypy as numpy
+
+        assert numpy.complex128.__mro__ == (numpy.complex128,
+            numpy.complexfloating, numpy.inexact, numpy.number, numpy.generic,
+            complex, object)
+
+        c = numpy.complex128(complex(1, 2))
+        assert c.real == 1 
+        assert c.imag == 2
+        assert repr(c) == '(1+2j)'
+
+    def test_complex_dtype(self):
+        import _numpypy as numpy
+
+        assert numpy.dtype(complex) is numpy.dtype("complex")
+
     def test_subclass_type(self):
         import _numpypy as numpy
 
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
@@ -5,6 +5,7 @@
 from pypy.interpreter.error import OperationError
 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
 from pypy.rlib.objectmodel import specialize, we_are_translated
 from pypy.rlib.rarithmetic import widen, byteswap
@@ -918,6 +919,30 @@
     BoxType = interp_boxes.W_Float64Box
     format_code = "d"
 
+class Complex128(BaseType):
+    _attrs_ = ()
+
+    T = rffi.CHAR
+    BoxType = interp_boxes.W_Complex128Box
+
+    def get_element_size(self):
+        return 2 * rffi.sizeof(rffi.DOUBLE)
+
+    def coerce_subtype(self, space, w_subtype, w_item):
+        real, imag = space.unpackcomplex(w_item)
+        w_obj = space.allocate_instance(self.BoxType, w_subtype)
+        assert isinstance(w_obj, self.BoxType)
+        w_obj.__init__(real, imag)
+        return w_obj
+
+    def str_format(self, box):
+        real_str = str_format(box.real)
+        imag_str = str_format(box.imag)
+        return ''.join(['(', real_str, '+', imag_str, 'j', ')'])
+
+
+NonNativeComplex128 = Complex128
+
 class BaseStringType(object):
     _mixin_ = True
 


More information about the pypy-commit mailing list