[pypy-commit] pypy matrixmath-dot: translation fixes: avoid negative slices

mattip noreply at buildbot.pypy.org
Mon Dec 5 22:42:12 CET 2011


Author: mattip
Branch: matrixmath-dot
Changeset: r50192:26e6b2238d4a
Date: 2011-12-05 10:30 +0200
http://bitbucket.org/pypy/pypy/changeset/26e6b2238d4a/

Log:	translation fixes: avoid negative slices

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
@@ -482,30 +482,43 @@
             w_res = self.descr_mul(space, w_other)
             assert isinstance(w_res, BaseArray)
             return w_res.descr_sum(space)
+        dtype = interp_ufuncs.find_binop_result_dtype(space, 
+                                     self.find_dtype(), w_other.find_dtype())
+        if self.find_size() < 1 and w_other.find_size() <1:
+            #numpy compatability
+            return scalar_w(space, dtype,space.wrap(0))
         #Do the dims match?
         my_critical_dim_size = self.shape[-1]
         other_critical_dim_size = w_other.shape[0]
+        other_critical_dim = 0
         other_critical_dim_stride = w_other.strides[0] 
-        if len(w_other.shape) > 2:
-            other_critical_dim_size = w_other.shape[-2]
-            other_critical_dim_stride = w_other.strides[-2] 
+        out_shape = []
+        if len(w_other.shape) > 1:
+            other_critical_dim = len(w_other.shape)-1
+            other_critical_dim_size = w_other.shape[other_critical_dim]
+            other_critical_dim_stride = w_other.strides[other_critical_dim]
+            assert other_critical_dim >= 0
+            out_shape += self.shape[:-1] + w_other.shape[0:other_critical_dim] + w_other.shape[other_critical_dim:]
+        elif len(w_other.shape) > 0:
+            #dot does not reduce
+            out_shape += self.shape[:-1]
         if my_critical_dim_size != other_critical_dim_size:
             raise OperationError(space.w_ValueError, space.wrap(
                                             "objects are not aligned"))
-        out_shape = self.shape[:-1] + w_other.shape[0:-2] + w_other.shape[-1:]
         out_size = 1
         for os in out_shape:
             out_size *= os
         out_ndims = len(out_shape)
-        dtype = interp_ufuncs.find_binop_result_dtype(space, 
-                                     self.find_dtype(), w_other.find_dtype())
         #TODO: what should the order be? C or F?
         arr = W_NDimArray(out_size, out_shape, dtype=dtype)
         out_iter = ArrayIterator(out_size)
-        #TODO: invalidate self, w_other with arr
+        #TODO: invalidate self, w_other with arr ?
+        
         me_iter = BroadcastIterator(self,self.shape[:-1] + [1])
+        assert other_critical_dim >= 0
         other_iter = BroadcastIterator(self, 
-                               w_other.shape[:-2] + [1] + w_other.shape[-1:])
+                               w_other.shape[:other_critical_dim] + [1] + \
+                                           w_other.shape[other_critical_dim:])
         while not out_iter.done():
             i = OneDimIterator(me_iter.get_offset(), self.strides[-1], self.shape[-1])
             j = OneDimIterator(other_iter.get_offset(), other_critical_dim_stride, other_critical_dim_size)


More information about the pypy-commit mailing list