[pypy-svn] r46205 - pypy/dist/pypy/rpython/numpy

simonb at codespeak.net simonb at codespeak.net
Fri Aug 31 03:16:21 CEST 2007


Author: simonb
Date: Fri Aug 31 03:16:20 2007
New Revision: 46205

Modified:
   pypy/dist/pypy/rpython/numpy/rarray.py
Log:
broadcast iterator (not ready for this yet)

Modified: pypy/dist/pypy/rpython/numpy/rarray.py
==============================================================================
--- pypy/dist/pypy/rpython/numpy/rarray.py	(original)
+++ pypy/dist/pypy/rpython/numpy/rarray.py	Fri Aug 31 03:16:20 2007
@@ -96,6 +96,34 @@
         return it
     ll_iter_new._always_inline_ = True
 
+    def ll_iter_broadcast_to_shape(ITER, ao, shape, iter_reset=ll_iter_reset):
+        if ao.ndim > ndim:
+            raise Exception("array is not broadcastable to correct shape") # XX raise here ?
+        diff = j = ndim - ao.ndim
+        for i in range(ao.ndim):
+            if ao.shape[i] != 1 and ao.shape[i] != shape[j]:
+                raise Exception("array is not broadcastable to correct shape") # XX raise here ?
+            j += 1
+        it = malloc(ITER)
+        it.ao = ao
+        it.size = ll_mul_list(ao.shape, ndim)
+        it.nd_m1 = ndim - 1
+        #it.factors[nd-1] = 1
+        for i in unroll_ndim:
+            it.dims_m1[i] = ao.shape[i]-1
+            k = i - diff
+            if k<0 or ao.shape[k] != shape[i]:
+                #it.contiguous = False
+                it.strides[i] = 0
+            else:
+                it.strides[i] = ao.strides[k]
+            it.backstrides[i] = it.strides[i] * it.dims_m1[i]
+            #if i > 0:
+                #it.factors[nd-i-1] = it.factors[nd-i]*shape[nd-i]
+        iter_reset(it)
+        return it
+    ll_iter_broadcast_to_shape._always_inline_ = True    
+    
     def ll_iter_next(it):
         it.index += 1
         for i in unroll_ndim_rev:
@@ -107,6 +135,7 @@
             it.dataptr = direct_ptradd(it.dataptr, -it.backstrides[i])
     ll_iter_next._always_inline_ = True
 
+#    return ll_iter_new, ll_iter_broadcast_to_shape, ll_iter_next
     return ll_iter_new, ll_iter_next
 
 def ll_unary_op(p0, p1, op=lambda x:x):



More information about the Pypy-commit mailing list