[pypy-commit] pypy numpy NDimArray: start

mattip noreply at buildbot.pypy.org
Sun Oct 16 23:26:47 CEST 2011


Author: mattip
Branch: numpy NDimArray
Changeset: r48098:9d6ec72a5681
Date: 2011-10-16 08:36 +0200
http://bitbucket.org/pypy/pypy/changeset/9d6ec72a5681/

Log:	start

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
@@ -163,8 +163,10 @@
         return v1 * v2
     @binop
     def div(self, v1, v2):
-        return v1 / v2
-
+        try:
+            return v1 / v2
+        except ZeroDivisionError:
+            return (1 if v1>=0 else -1) *(1 if v2>=0 else -1)*float('inf')
     @unaryop
     def pos(self, v):
         return +v
diff --git a/pypy/module/micronumpy/interp_numarray.py b/pypy/module/micronumpy/interp_numarray.py
--- a/pypy/module/micronumpy/interp_numarray.py
+++ b/pypy/module/micronumpy/interp_numarray.py
@@ -32,8 +32,50 @@
     def add_invalidates(self, other):
         self.invalidates.append(other)
 
+    def find_dtype(space,w_iterable_or_scalar, w_dtype):
+        if w_dtype is space.fromcache(interp_dtype.W_Float64Dtype):
+            return w_dtype
+        if space.issequence_w(w_iterable_or_scalar):
+            w_iterator = space.iter(w_iterable_or_scalar)
+            while True:
+                try:
+                    w_item = space.next(w_iterator)
+                except OperationError, e:
+                    if not e.match(space, space.w_StopIteration):
+                        raise
+                    return w_dtype
+                w_dtype = BaseArray.find_dtype.im_func(space,w_item, w_dtype)
+        else:
+            w_dtype = interp_ufuncs.find_dtype_for_scalar(space,w_iterable_or_scalar, w_dtype)
+        return w_dtype
+                  
     def descr__new__(space, w_subtype, w_size_or_iterable, w_dtype=None):
         l = space.listview(w_size_or_iterable)
+        w_elem = space.getitem(w_size_or_iterable, space.wrap(0))
+        if space.issequence_w(w_elem):
+            shape = [len(l)]
+            while space.issequence_w(w_elem):
+                shape.append(space.len_w(w_elem))
+                w_elem = space.getitem(w_elem, space.wrap(0))
+            if space.is_w(w_dtype, space.w_None):
+                w_dtype = None
+                w_dtype = BaseArray.find_dtype.im_func(space, w_size_or_iterable, w_dtype)
+                if w_dtype is None:
+                    w_dtype = space.w_None
+
+            dtype = space.interp_w(interp_dtype.W_Dtype,
+                space.call_function(space.gettypefor(interp_dtype.W_Dtype), w_dtype)
+            )
+            arr = NDimArray(shape, dtype=dtype)
+            #Assign all the values
+            assigner = []
+            for s in shape[1:]:
+                assigner.append(':')
+            i = 0
+            for w_elem in l:
+                dtype.setitem_w(space, arr.storage, [i]+assigner, w_elem)
+                i += 1
+            return arr
         if space.is_w(w_dtype, space.w_None):
             w_dtype = None
             for w_item in l:
@@ -199,7 +241,8 @@
         return space.wrap(self.find_dtype())
 
     def descr_get_shape(self, space):
-        return space.newtuple([self.descr_len(space)])
+        #return space.newtuple([self.descr_len(space)])
+        return self.get_concrete().descr_shape(space)
 
     def descr_copy(self, space):
         return space.call_function(space.gettypefor(BaseArray), self, self.find_dtype())
@@ -499,6 +542,9 @@
     def find_dtype(self):
         return self.parent.find_dtype()
 
+    def descr_shape(self,space):
+        return space.newtuple([space.wrap(self.size)])
+
     def setslice(self, space, start, stop, step, slice_length, arr):
         start = self.calc_index(start)
         if stop != -1:
@@ -533,6 +579,55 @@
     def eval(self, i):
         return self.dtype.getitem(self.storage, i)
 
+    def descr_shape(self, space):
+        return space.newtuple([space.wrap(self.size)])
+
+    def descr_len(self, space):
+        return space.wrap(self.size)
+
+    def setitem_w(self, space, item, w_value):
+        self.invalidated()
+        self.dtype.setitem_w(space, self.storage, item, w_value)
+
+    def setitem(self, item, value):
+        self.invalidated()
+        self.dtype.setitem(self.storage, item, value)
+
+    def setslice(self, space, start, stop, step, slice_length, arr):
+        self._sliceloop(start, stop, step, arr, self)
+
+    def __del__(self):
+        lltype.free(self.storage, flavor='raw', track_allocation=False)
+
+class NDimArray(BaseArray):
+    def __init__(self, shape, dtype):
+        BaseArray.__init__(self)
+        self.size = 1
+        for s in shape:
+            self.size *= s
+        self.shape = shape
+        self.dtype = dtype
+        self.storage = dtype.malloc(self.size)
+        self.signature = dtype.signature
+
+    def get_concrete(self):
+        return self
+
+    def get_root_storage(self):
+        return self.storage
+
+    def find_size(self):
+        return self.size
+
+    def find_dtype(self):
+        return self.dtype
+
+    def eval(self, i):
+        return self.dtype.getitem(self.storage, i)
+
+    def descr_shape(self, space):
+        return space.newtuple(space.wrap(self.shape))
+
     def descr_len(self, space):
         return space.wrap(self.size)
 


More information about the pypy-commit mailing list