[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