[pypy-svn] pypy numpy-exp: Initial fun
fijal
commits-noreply at bitbucket.org
Wed Feb 9 20:07:14 CET 2011
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: numpy-exp
Changeset: r41760:f715a1e1078a
Date: 2011-02-09 20:04 +0200
http://bitbucket.org/pypy/pypy/changeset/f715a1e1078a/
Log: Initial fun
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
@@ -6,8 +6,7 @@
applevel_name = 'numpy'
interpleveldefs = {
- 'zeros' : 'numarray.zeros',
- 'minimum' : 'ufunc.minimum',
- }
+ 'array': 'numarray.SingleDimArray',
+ }
appleveldefs = {}
diff --git a/pypy/module/micronumpy/numarray.py b/pypy/module/micronumpy/numarray.py
--- a/pypy/module/micronumpy/numarray.py
+++ b/pypy/module/micronumpy/numarray.py
@@ -1,127 +1,67 @@
from pypy.interpreter.baseobjspace import ObjSpace, W_Root, Wrappable
-from pypy.interpreter.error import OperationError
+from pypy.interpreter.error import OperationError, operationerrfmt
from pypy.interpreter.typedef import TypeDef
from pypy.interpreter.gateway import interp2app, NoneNotWrapped
-from pypy.rlib.debug import make_sure_not_resized
+from pypy.rpython.lltypesystem import lltype
-class BaseNumArray(Wrappable):
+TP = lltype.GcArray(lltype.Float)
+
+class BaseBytecode(Wrappable):
pass
-class NumArray(BaseNumArray):
- def __init__(self, space, dim, dtype):
- self.dim = dim
- self.space = space
- # ignore dtype for now
- self.storage = [0] * dim
- make_sure_not_resized(self.storage)
+class Add(BaseBytecode):
+ def __init__(self, left, right):
+ self.left = left
+ self.right = right
- def descr_getitem(self, index):
- space = self.space
- try:
- return space.wrap(self.storage[index])
- except IndexError:
- raise OperationError(space.w_IndexError,
- space.wrap("list index out of range"))
- descr_getitem.unwrap_spec = ['self', int]
+class SingleDimArray(Wrappable):
+ def __init__(self, size):
+ self.size = size
+ self.storage = lltype.malloc(TP, size, zero=True)
- def descr_setitem(self, index, value):
- space = self.space
- try:
- self.storage[index] = value
- except IndexError:
- raise OperationError(space.w_IndexError,
- space.wrap("list index out of range"))
- return space.w_None
- descr_setitem.unwrap_spec = ['self', int, int]
+ def descr_getitem(self, space, item):
+ if item < 0:
+ raise operationerrfmt(space.w_TypeError,
+ '%d below zero', item)
+ if item > self.size:
+ raise operationerrfmt(space.w_TypeError,
+ '%d above array size', item)
+ return space.wrap(self.storage[item])
+ descr_getitem.unwrap_spec = ['self', ObjSpace, int]
- def descr_len(self):
- return self.space.wrap(len(self.storage))
- descr_len.unwrap_spec = ['self']
+ def descr_setitem(self, space, item, value):
+ if item < 0:
+ raise operationerrfmt(space.w_TypeError,
+ '%d below zero', item)
+ if item > self.size:
+ raise operationerrfmt(space.w_TypeError,
+ '%d above array size', item)
+ self.storage[item] = value
+ descr_setitem.unwrap_spec = ['self', ObjSpace, int, float]
-NumArray.typedef = TypeDef(
- 'NumArray',
- __getitem__ = interp2app(NumArray.descr_getitem),
- __setitem__ = interp2app(NumArray.descr_setitem),
- __len__ = interp2app(NumArray.descr_len),
+ def descr_add(self, space, w_other):
+ return space.wrap(Add(self, w_other))
+ descr_add.unwrap_spec = ['self', ObjSpace, W_Root]
+
+def descr_new_numarray(space, w_type, w_size_or_iterable):
+ if space.isinstance_w(w_size_or_iterable, space.w_int):
+ arr = SingleDimArray(space.int_w(w_size_or_iterable))
+ else:
+ l = space.listview(w_size_or_iterable)
+ arr = SingleDimArray(len(l))
+ i = 0
+ for w_elem in l:
+ arr.storage[i] = space.float_w(space.float(w_elem))
+ i += 1
+ return space.wrap(arr)
+descr_new_numarray.unwrap_spec = [ObjSpace, W_Root, W_Root]
+
+SingleDimArray.typedef = TypeDef(
+ 'numarray',
+ __new__ = interp2app(descr_new_numarray),
+ __getitem__ = interp2app(SingleDimArray.descr_getitem),
+ __setitem__ = interp2app(SingleDimArray.descr_setitem),
+ __add__ = interp2app(SingleDimArray.descr_add),
)
-def compute_pos(space, indexes, dim):
- current = 1
- pos = 0
- for i in range(len(indexes)):
- index = indexes[i]
- d = dim[i]
- if index >= d or index <= -d - 1:
- raise OperationError(space.w_IndexError,
- space.wrap("invalid index"))
- if index < 0:
- index = d + index
- pos += index * current
- current *= d
- return pos
-
-class MultiDimArray(BaseNumArray):
- def __init__(self, space, dim, dtype):
- self.dim = dim
- self.space = space
- # ignore dtype for now
- size = 1
- for el in dim:
- size *= el
- self.storage = [0] * size
- make_sure_not_resized(self.storage)
-
- def _unpack_indexes(self, space, w_index):
- indexes = [space.int_w(w_i) for w_i in space.fixedview(w_index)]
- if len(indexes) != len(self.dim):
- raise OperationError(space.w_IndexError, space.wrap(
- 'Wrong index'))
- return indexes
-
- def descr_getitem(self, w_index):
- space = self.space
- indexes = self._unpack_indexes(space, w_index)
- pos = compute_pos(space, indexes, self.dim)
- return space.wrap(self.storage[pos])
- descr_getitem.unwrap_spec = ['self', W_Root]
-
- def descr_setitem(self, w_index, value):
- space = self.space
- indexes = self._unpack_indexes(space, w_index)
- pos = compute_pos(space, indexes, self.dim)
- self.storage[pos] = value
- return space.w_None
- descr_setitem.unwrap_spec = ['self', W_Root, int]
-
- def descr_len(self):
- return self.space.wrap(self.dim[0])
- descr_len.unwrap_spec = ['self']
-
-MultiDimArray.typedef = TypeDef(
- 'NumArray',
- __getitem__ = interp2app(MultiDimArray.descr_getitem),
- __setitem__ = interp2app(MultiDimArray.descr_setitem),
- __len__ = interp2app(MultiDimArray.descr_len),
-)
-
-def unpack_dim(space, w_dim):
- if space.is_true(space.isinstance(w_dim, space.w_int)):
- return [space.int_w(w_dim)]
- dim_w = space.fixedview(w_dim)
- return [space.int_w(w_i) for w_i in dim_w]
-
-def unpack_dtype(space, w_dtype):
- if space.is_w(w_dtype, space.w_int):
- return 'i'
- else:
- raise NotImplementedError
-
-def zeros(space, w_dim, w_dtype):
- dim = unpack_dim(space, w_dim)
- dtype = unpack_dtype(space, w_dtype)
- if len(dim) == 1:
- return space.wrap(NumArray(space, dim[0], dtype))
- else:
- return space.wrap(MultiDimArray(space, dim, dtype))
-zeros.unwrap_spec = [ObjSpace, W_Root, W_Root]
diff --git a/pypy/module/micronumpy/test/test_numpy.py b/pypy/module/micronumpy/test/test_numpy.py
--- a/pypy/module/micronumpy/test/test_numpy.py
+++ b/pypy/module/micronumpy/test/test_numpy.py
@@ -1,8 +1,26 @@
+import py
from pypy.conftest import gettestobjspace
+class AppTestNumpyLike(object):
+ def setup_class(cls):
+ cls.space = gettestobjspace(usemodules=('micronumpy',))
+
+ def test_init(self):
+ from numpy import array
+ a = array(15)
+ assert a[10] == 0.0
+ a[13] = 5.3
+ assert a[13] == 5.3
+
+ def test_iterator_init(self):
+ from numpy import array
+ a = array(range(5))
+ assert a[3] == 3
+
class AppTestNumpy(object):
def setup_class(cls):
+ py.test.skip("skip")
cls.space = gettestobjspace(usemodules=('micronumpy',))
def test_zeroes(self):
@@ -42,6 +60,7 @@
class AppTestMultiDim(object):
def setup_class(cls):
+ py.test.skip("skip")
cls.space = gettestobjspace(usemodules=('micronumpy',))
def test_multidim(self):
More information about the Pypy-commit
mailing list