[pypy-commit] pypy default: Separated the any/all reduce functions for numpy arrays

justinpeel noreply at buildbot.pypy.org
Tue Jul 12 00:47:10 CEST 2011


Author: Justin Peel <notmuchtotell at gmail.com>
Branch: 
Changeset: r45483:b81b9f3ab263
Date: 2011-07-11 08:12 -0600
http://bitbucket.org/pypy/pypy/changeset/b81b9f3ab263/

Log:	Separated the any/all reduce functions for numpy arrays

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
@@ -181,42 +181,52 @@
             return space.wrap(loop(self, self.eval(0), size))
         return func_with_new_name(impl, "reduce_%s_impl" % function.__name__)
 
-    def _reduce_any_all_impl(function, init, cond):
+    def _reduce_all_impl(function, init, cond):
         reduce_driver = jit.JitDriver(greens=['signature'],
                          reds = ['i', 'size', 'result', 'self'])
         def loop(self, result, size):
             i = 0
-            if cond:
-                while i < size:
-                    reduce_driver.jit_merge_point(signature=self.signature,
-                                                  self=self, size=size, i=i,
-                                                  result=result)
-                    result = function(result, self.eval(i))
-                    if result:
-                        break
-                    i += 1
-            else:
-                while i < size:
-                    reduce_driver.jit_merge_point(signature=self.signature,
-                                                  self=self, size=size, i=i,
-                                                  result=result)
-                    result = function(result, self.eval(i))
-                    if not result:
-                        break
-                    i += 1
+            while i < size:
+                reduce_driver.jit_merge_point(signature=self.signature,
+                                              self=self, size=size, i=i,
+                                              result=result)
+                result = function(result, self.eval(i))
+                if not result:
+                    break
+                i += 1
             return result
 
         def impl(self, space):
             size = self.find_size()
             return space.wrap(loop(self, init, size))
-        return func_with_new_name(impl, "reduce_%s_impl" % function.__name__)
+        return func_with_new_name(impl, "reduce_all_impl")
+
+    def _reduce_any_impl(function, init, cond):
+        reduce_driver = jit.JitDriver(greens=['signature'],
+                         reds = ['i', 'size', 'result', 'self'])       
+
+        def loop(self, result, size):
+            i = 0
+            while i < size:
+                reduce_driver.jit_merge_point(signature=self.signature,
+                                              self=self, size=size, i=i,
+                                              result=result)
+                result = function(result, self.eval(i))
+                if result:
+                    break
+                i += 1
+            return result
+        def impl(self, space):
+            size = self.find_size()
+            return space.wrap(loop(self, init, size))
+        return func_with_new_name(impl, "reduce_any_impl")
 
     descr_sum = _reduce_sum_prod_impl(add, 0.0)
     descr_prod = _reduce_sum_prod_impl(mul, 1.0)
     descr_max = _reduce_max_min_impl(maximum)
     descr_min = _reduce_max_min_impl(minimum)
-    descr_all = _reduce_any_all_impl(and_bool, True, False)
-    descr_any = _reduce_any_all_impl(or_bool, False, True)
+    descr_all = _reduce_all_impl(and_bool, True, False)
+    descr_any = _reduce_any_impl(or_bool, False, True)
 
     def descr_dot(self, space, w_other):
         if isinstance(w_other, BaseArray):


More information about the pypy-commit mailing list