[pypy-commit] pypy numpy-refactor: a missing file and a start of things to take shape

fijal noreply at buildbot.pypy.org
Thu Aug 30 13:10:21 CEST 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: numpy-refactor
Changeset: r56930:80f9f1bd054e
Date: 2012-08-30 13:10 +0200
http://bitbucket.org/pypy/pypy/changeset/80f9f1bd054e/

Log:	a missing file and a start of things to take shape

diff --git a/pypy/module/micronumpy/arrayimpl/base.py b/pypy/module/micronumpy/arrayimpl/base.py
--- a/pypy/module/micronumpy/arrayimpl/base.py
+++ b/pypy/module/micronumpy/arrayimpl/base.py
@@ -1,6 +1,6 @@
 
 class BaseArrayImplementation(object):
-    pass
+    is_scalar = False
 
 class BaseArrayIterator(object):
     def next(self):
diff --git a/pypy/module/micronumpy/arrayimpl/concrete.py b/pypy/module/micronumpy/arrayimpl/concrete.py
--- a/pypy/module/micronumpy/arrayimpl/concrete.py
+++ b/pypy/module/micronumpy/arrayimpl/concrete.py
@@ -8,6 +8,7 @@
         self.offset = 0
         self.dtype = dtype
         self.element_size = dtype.get_size()
+        self.size = array.size
 
     def setitem(self, elem):
         self.dtype.setitem(self.array.storage, self.offset, elem)
@@ -15,6 +16,9 @@
     def next(self):
         self.offset += self.element_size
 
+    def done(self):
+        return self.offset >= self.size
+
 def calc_strides(shape, dtype, order):
     strides = []
     backstrides = []
diff --git a/pypy/module/micronumpy/arrayimpl/scalar.py b/pypy/module/micronumpy/arrayimpl/scalar.py
--- a/pypy/module/micronumpy/arrayimpl/scalar.py
+++ b/pypy/module/micronumpy/arrayimpl/scalar.py
@@ -2,6 +2,8 @@
 from pypy.module.micronumpy.arrayimpl import base
 
 class Scalar(base.BaseArrayImplementation):
+    is_scalar = True
+    
     def __init__(self, dtype):
         pass
 
diff --git a/pypy/module/micronumpy/interp_numarray.py b/pypy/module/micronumpy/interp_numarray.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/micronumpy/interp_numarray.py
@@ -0,0 +1,136 @@
+
+from pypy.interpreter.baseobjspace import Wrappable
+from pypy.interpreter.error import operationerrfmt
+from pypy.interpreter.typedef import TypeDef, GetSetProperty
+from pypy.interpreter.gateway import interp2app, unwrap_spec
+from pypy.module.micronumpy import interp_dtype, interp_ufuncs
+from pypy.module.micronumpy.arrayimpl import create_implementation
+from pypy.module.micronumpy.strides import find_shape_and_elems
+from pypy.tool.sourcetools import func_with_new_name
+from pypy.rlib import jit
+
+def _find_shape(space, w_size):
+    if space.isinstance_w(w_size, space.w_int):
+        return [space.int_w(w_size)]
+    shape = []
+    for w_item in space.fixedview(w_size):
+        shape.append(space.int_w(w_item))
+    return shape
+
+class W_NDimArray(Wrappable):
+    def __init__(self, shape, dtype, buffer=0, offset=0, strides=None,
+                 order='C'):
+        if strides is not None or offset != 0 or buffer != 0:
+            raise Exception("unsupported args")
+        self.implementation = create_implementation(shape, dtype, order)
+        self.dtype = dtype
+
+    @jit.unroll_safe
+    def descr_get_shape(self, space):
+        shape = self.get_shape()
+        return space.newtuple([space.wrap(i) for i in shape])
+
+    def get_shape(self):
+        return self.implementation.get_shape()
+
+    def descr_set_shape(self, space, w_new_shape):
+        self.implementation = self.implementation.set_shape(
+            _find_shape(space, w_new_shape))
+
+    def descr_get_dtype(self, space):
+        return self.dtype
+
+    def create_iter(self):
+        return self.implementation.create_iter(self.dtype)
+
+    def is_scalar(self):
+        return self.implementation.is_scalar
+
+    def _binop_impl(ufunc_name):
+        def impl(self, space, w_other, w_out=None):
+            return getattr(interp_ufuncs.get(space), ufunc_name).call(space,
+                                                        [self, w_other, w_out])
+        return func_with_new_name(impl, "binop_%s_impl" % ufunc_name)
+
+    descr_add = _binop_impl("add")
+
+ at unwrap_spec(offset=int)
+def descr_new_array(space, w_subtype, w_shape, w_dtype=None, w_buffer=None,
+                    offset=0, w_strides=None, w_order=None):
+    dtype = space.interp_w(interp_dtype.W_Dtype,
+          space.call_function(space.gettypefor(interp_dtype.W_Dtype), w_dtype))
+    shape = _find_shape(space, w_shape)
+    return W_NDimArray(shape, dtype)
+
+W_NDimArray.typedef = TypeDef(
+    "ndarray",
+    __new__ = interp2app(descr_new_array),
+
+    __add__ = interp2app(W_NDimArray.descr_add),
+
+    dtype = GetSetProperty(W_NDimArray.descr_get_dtype),
+    shape = GetSetProperty(W_NDimArray.descr_get_shape,
+                           W_NDimArray.descr_set_shape),
+)
+
+ at unwrap_spec(ndmin=int, copy=bool, subok=bool)
+def array(space, w_object, w_dtype=None, copy=True, w_order=None, subok=False,
+          ndmin=0):
+    if w_order is None or space.is_w(w_order, space.w_None):
+        order = 'C'
+    else:
+        order = space.str_w(w_order)
+        if order != 'C':  # or order != 'F':
+            raise operationerrfmt(space.w_ValueError, "Unknown order: %s",
+                                  order)
+    if isinstance(w_object, W_NDimArray):
+        if (not space.is_w(w_dtype, space.w_None) and
+            w_object.dtype is not w_dtype):
+            raise operationerrfmt(space.w_NotImplementedError,
+                                  "copying over different dtypes unsupported")
+        if copy:
+            return w_object.copy(space)
+        return w_object
+    if w_dtype is None or space.is_w(w_dtype, space.w_None):
+        dtype = None
+    else:
+        dtype = space.interp_w(interp_dtype.W_Dtype,
+           space.call_function(space.gettypefor(interp_dtype.W_Dtype), w_dtype))
+    shape, elems_w = find_shape_and_elems(space, w_object, dtype)
+    if dtype is None:
+        for w_elem in elems_w:
+            dtype = interp_ufuncs.find_dtype_for_scalar(space, w_elem,
+                                                        dtype)
+            if dtype is interp_dtype.get_dtype_cache(space).w_float64dtype:
+                break
+        if dtype is None:
+            dtype = interp_dtype.get_dtype_cache(space).w_float64dtype
+    if ndmin > len(shape):
+        shape = [1] * (ndmin - len(shape)) + shape
+    arr = W_NDimArray(shape, dtype, order=order)
+    arr_iter = arr.create_iter()
+    for w_elem in elems_w:
+        arr_iter.setitem(dtype.coerce(space, w_elem))
+        arr_iter.next()
+    return arr
+
+def zeros(space):
+    pass
+
+def ones(space):
+    pass
+
+def dot(space):
+    pass
+
+def isna(space):
+    pass
+
+def concatenate(space):
+    pass
+
+def repeat(space):
+    pass
+
+def count_reduce_items(space):
+    pass
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
@@ -7,6 +7,8 @@
 from pypy.rlib.rarithmetic import LONG_BIT
 from pypy.tool.sourcetools import func_with_new_name
 from pypy.module.micronumpy.interp_support import unwrap_axis_arg
+from pypy.module.micronumpy.strides import shape_agreement
+from pypy.module.micronumpy.support import convert_to_array
 
 class W_Ufunc(Wrappable):
     _attrs_ = ["name", "promote_to_float", "promote_bools", "identity"]
@@ -292,8 +294,8 @@
 
     @jit.unroll_safe
     def call(self, space, args_w):
-        from pypy.module.micronumpy.interp_numarray import (Call2,
-            convert_to_array, Scalar, shape_agreement, BaseArray)
+        from pypy.module.micronumpy.interp_numarray import W_NDimArray
+        
         if len(args_w) > 2:
             [w_lhs, w_rhs, w_out] = args_w
         else:
@@ -304,12 +306,12 @@
         if space.is_w(w_out, space.w_None) or w_out is None:
             out = None
             calc_dtype = find_binop_result_dtype(space,
-                w_lhs.find_dtype(), w_rhs.find_dtype(),
+                w_lhs.dtype, w_rhs.dtype,
                 int_only=self.int_only,
                 promote_to_float=self.promote_to_float,
                 promote_bools=self.promote_bools,
             )
-        elif not isinstance(w_out, BaseArray):
+        elif not isinstance(w_out, W_NDimArray):
             raise OperationError(space.w_TypeError, space.wrap(
                     'output must be an array'))
         else:
@@ -319,19 +321,20 @@
             res_dtype = interp_dtype.get_dtype_cache(space).w_booldtype
         else:
             res_dtype = calc_dtype
-        if isinstance(w_lhs, Scalar) and isinstance(w_rhs, Scalar):
+        if w_lhs.is_scalar() and w_rhs.is_scalar():
             arr = self.func(calc_dtype,
                 w_lhs.value.convert_to(calc_dtype),
                 w_rhs.value.convert_to(calc_dtype)
             )
-            if isinstance(out,Scalar):
-                out.value = arr
-            elif isinstance(out, BaseArray):
+            if out.is_scalar():
+                out.set_value(arr)
+            elif isinstance(out, W_NDimArray):
                 out.fill(space, arr)
             else:
                 out = arr
             return space.wrap(out)
-        new_shape = shape_agreement(space, w_lhs.shape, w_rhs.shape)
+        new_shape = shape_agreement(space, w_lhs.get_shape(),
+                                    w_rhs.get_shape())
         # Test correctness of out.shape
         if out and out.shape != shape_agreement(space, new_shape, out.shape):
             raise operationerrfmt(space.w_ValueError,
@@ -340,14 +343,11 @@
                 ",".join([str(x) for x in new_shape]),
                 ",".join([str(x) for x in out.shape]),
                 )
-        w_res = Call2(self.func, self.name,
-                      new_shape, calc_dtype,
-                      res_dtype, w_lhs, w_rhs, out)
-        w_lhs.add_invalidates(space, w_res)
-        w_rhs.add_invalidates(space, w_res)
-        if out:
-            w_res.get_concrete()
-        return w_res
+        if out is None:
+            out = W_NDimArray(new_shape, res_dtype)
+        return loop.call2(self.func, self.name,
+                          new_shape, calc_dtype,
+                          res_dtype, w_lhs, w_rhs, out)
 
 
 W_Ufunc.typedef = TypeDef("ufunc",
diff --git a/pypy/module/micronumpy/loop.py b/pypy/module/micronumpy/loop.py
--- a/pypy/module/micronumpy/loop.py
+++ b/pypy/module/micronumpy/loop.py
@@ -3,6 +3,16 @@
 signatures
 """
 
+def call2(func, name, shape, calc_dtype, res_dtype, w_lhs, w_rhs, out):
+    left_iter = w_lhs.create_iter()
+    right_iter = w_rhs.create_iter()
+    out_iter = out.create_iter()
+    while not out_iter.done():
+        #left_iter.getitem()
+        left_iter.next()
+        right_iter.next()
+        out_iter.next()
+
 from pypy.rlib.jit import JitDriver, hint, unroll_safe, promote
 from pypy.module.micronumpy.interp_iter import ConstantIterator
 
diff --git a/pypy/module/micronumpy/support.py b/pypy/module/micronumpy/support.py
--- a/pypy/module/micronumpy/support.py
+++ b/pypy/module/micronumpy/support.py
@@ -7,3 +7,16 @@
     for x in s:
         i *= x
     return i
+
+def convert_to_array(space, w_obj):
+    from pypy.module.micronumpy.interp_numarray import W_NDimArray, array
+    if isinstance(w_obj, W_NDimArray):
+        return w_obj
+    elif space.issequence_w(w_obj):
+        # Convert to array.
+        return array(space, w_obj, w_order=None)
+    else:
+        xxxx
+        # If it's a scalar
+        dtype = interp_ufuncs.find_dtype_for_scalar(space, w_obj)
+        return scalar_w(space, dtype, w_obj)


More information about the pypy-commit mailing list