# HG changeset patch
# User Martin Albrecht <malb@informatik.uni-bremen.de>
# Date 1246355238 -3600
# Node ID 67100be18c76e556bcd7ad224e94cd31e649c0a0
# Parent  faeb78565a2d78d8870773f4611fb2c68f1a02af
M4RI's heuristic choice for echelonize

diff -r faeb78565a2d -r 67100be18c76 sage/matrix/matrix_mod2_dense.pxd
--- a/sage/matrix/matrix_mod2_dense.pxd	Tue Jun 30 10:46:56 2009 +0100
+++ b/sage/matrix/matrix_mod2_dense.pxd	Tue Jun 30 10:47:18 2009 +0100
@@ -137,6 +137,9 @@
     # row echelon form using Gray codes
     cdef int mzd_echelonize_m4ri(mzd_t *m, int full, int k)
 
+    # row echelon form using a heuristic choice of algorithm
+    cdef int mzd_echelonize(mzd_t *m, int full)
+
     # reduced row echelon form from upper triangular form
     cdef void mzd_top_echelonize_m4ri(mzd_t *m, int k)
 
@@ -146,9 +149,6 @@
     # assymptotically fast PLUQ factorization
     cdef long mzd_pluq(mzd_t *A, mzp_t *P, mzp_t *Q, int cutoff)
 
-    # PLUQ factorization using Gray codes
-    cdef long _mzd_pluq_mmpf(mzd_t *A, mzp_t *P, mzp_t *Q, int k)
-
     # cubic PLUQ factorization
     cdef long _mzd_pluq_naive(mzd_t *A, mzp_t *P, mzp_t *Q)
 
diff -r faeb78565a2d -r 67100be18c76 sage/matrix/matrix_mod2_dense.pyx
--- a/sage/matrix/matrix_mod2_dense.pyx	Tue Jun 30 10:46:56 2009 +0100
+++ b/sage/matrix/matrix_mod2_dense.pyx	Tue Jun 30 10:47:18 2009 +0100
@@ -982,6 +982,19 @@
             self.cache('rank', r)
             self.cache('pivots', self._pivots())
 
+        elif algorithm == 'heuristic':
+            
+            self.check_mutability()
+            self.clear_cache()        
+
+            _sig_on
+            r =  mzd_echelonize(self._entries, full)
+            _sig_off
+            
+            self.cache('in_echelon_form',True)
+            self.cache('rank', r)
+            self.cache('pivots', self._pivots())
+
         elif algorithm == 'linbox':
 
             #self._echelonize_linbox()
@@ -1751,10 +1764,6 @@
         _sig_on
         mzd_pluq(B._entries, p, q, param)
         _sig_off
-    elif algorithm == "mmpf":
-        _sig_on
-        _mzd_pluq_mmpf(B._entries, p, q, param)
-        _sig_off
     elif algorithm == "naive":
         _sig_on
         _mzd_pluq_naive(B._entries, p, q)
