From 44ca20ce7e4845f74af42b9387641fda12ada398 Mon Sep 17 00:00:00 2001
From: Raphael Boucherie <raphael.boucherie@inria.fr>
Date: Thu, 20 Apr 2017 11:27:30 +0200
Subject: [PATCH] added assert for next/prev piv

---
 include/libhqr.h          |  1 +
 src/libhqr.c              | 47 +++++++++++++++++++++++----------------
 testings/testing_pivgen.c |  5 +++--
 3 files changed, 32 insertions(+), 21 deletions(-)

diff --git a/include/libhqr.h b/include/libhqr.h
index 579da90..03056e2 100644
--- a/include/libhqr.h
+++ b/include/libhqr.h
@@ -190,6 +190,7 @@ int  libhqr_hqr_init( libhqr_tree_t *qrtree,
                       int type_llvl, int type_hlvl,
                       int a, int p, int domino, int tsrr );
 void libhqr_hqr_finalize( libhqr_tree_t *qrtree );
+void libhqr_matrix_finalize(libhqr_tree_t *qrtree);
 
 /*
  * function for drawing the tree
diff --git a/src/libhqr.c b/src/libhqr.c
index 60b94fc..ca1c524 100644
--- a/src/libhqr.c
+++ b/src/libhqr.c
@@ -180,13 +180,13 @@ static void hqr_low_binary_init(   hqr_subpiv_t *arg);
 static void hqr_low_fibonacci_init(hqr_subpiv_t *arg, int minMN);
 
 /* Stocking matrix info */
-void libhqr_matrix_init(libhqr_tree_t *qrtree);
+void libhqr_matrix_init(libhqr_tree_t *qrtree, const libhqr_tree_t *qrtree_init);
 
 /* Function for getting the info on the matrix*/
-int rdmtx_gettype(const libhqr_tree_t *qrtree, int k, int m);
-int rdmtx_currpiv(const libhqr_tree_t *qrtree, int k, int m);
-int rdmtx_nextpiv(const libhqr_tree_t *qrtree, int k, int p, int m);
-int rdmtx_prevpiv(const libhqr_tree_t *qrtree, int k, int p, int m);
+static int rdmtx_gettype(const libhqr_tree_t *qrtree, int k, int m);
+static int rdmtx_currpiv(const libhqr_tree_t *qrtree, int k, int m);
+static int rdmtx_nextpiv(const libhqr_tree_t *qrtree, int k, int p, int m);
+static int rdmtx_prevpiv(const libhqr_tree_t *qrtree, int k, int p, int m);
 
 /****************************************************
  * Reading functions
@@ -196,17 +196,16 @@ int rdmtx_prevpiv(const libhqr_tree_t *qrtree, int k, int p, int m);
  *    qrtree - tree used for the factorization
  *    k      - Step k of the QR factorization
  *    m      - line anhilated
- *
  */
 
-int rdmtx_gettype(const libhqr_tree_t *qrtree, int k, int m){
+static int rdmtx_gettype(const libhqr_tree_t *qrtree, int k, int m){
     int id;
     libhqr_tileinfo_t *arg = (libhqr_tileinfo_t*)(qrtree->args);
     id = (k * qrtree->mt) + m;
     return arg[id].type;
 }
 
-int rdmtx_currpiv(const libhqr_tree_t *qrtree, int k, int m){
+static int rdmtx_currpiv(const libhqr_tree_t *qrtree, int k, int m){
     int id;
     libhqr_tileinfo_t *arg = (libhqr_tileinfo_t*)(qrtree->args);
     id = (k * qrtree->mt) + m;
@@ -218,9 +217,11 @@ int rdmtx_currpiv(const libhqr_tree_t *qrtree, int k, int m){
  *    p - line used as pivot
  */
 
-int rdmtx_nextpiv(const libhqr_tree_t *qrtree, int k, int p, int m){
+static int rdmtx_nextpiv(const libhqr_tree_t *qrtree, int k, int p, int m){
     int id;
     libhqr_tileinfo_t *arg = (libhqr_tileinfo_t*)(qrtree->args);
+    myassert( m > p && p >= k );
+    myassert( m == qrtree->mt || p == rdmtx_currpiv( qrtree, k, m ) );
     if(m == qrtree->mt){
         id = (k * qrtree->mt) + p;
         return arg[id].first_nextpiv;
@@ -231,9 +232,11 @@ int rdmtx_nextpiv(const libhqr_tree_t *qrtree, int k, int p, int m){
     }
 }
 
-int rdmtx_prevpiv(const libhqr_tree_t *qrtree, int k, int p, int m){
+static int rdmtx_prevpiv(const libhqr_tree_t *qrtree, int k, int p, int m){
     int id;
     libhqr_tileinfo_t *arg = (libhqr_tileinfo_t*)(qrtree->args);
+    myassert( m >= p && p >= k && m < qrtree->mt );
+    myassert( m == p || p == rdmtx_currpiv( qrtree, k, m ) );
     if(m == p){
         id = (k * qrtree->mt) + p;
         return arg[id].first_prevpiv;
@@ -2021,7 +2024,7 @@ libhqr_hqr_init( libhqr_tree_t *qrtree,
     qrtree->args       = malloc( qrtree->mt * qrtree->nt * sizeof(libhqr_tileinfo_t) );
 
     /* Initialize the matrix */
-    libhqr_matrix_init(qrtree);
+    libhqr_matrix_init(qrtree, &qrtree_init);
 
     /* Free the initial qrtree */
     libhqr_hqr_finalize( &qrtree_init );
@@ -2826,21 +2829,27 @@ libhqr_svd_init( libhqr_tree_t *qrtree,
     return 0;
 }
 
-void libhqr_matrix_init(libhqr_tree_t *qrtree){
+void libhqr_matrix_init(libhqr_tree_t *qrtree, const libhqr_tree_t *qrtree_init){
     int i, minMN, tile_id, p, k;
     libhqr_tileinfo_t *arg = (libhqr_tileinfo_t*)(qrtree->args);
     minMN = libhqr_imin(qrtree->nt, qrtree->mt);
     for (k = 0; k < minMN; k++){
-        for (i = 0; i < minMN; i++){
+        for (i = 0; i < qrtree->mt; i++){
             tile_id = (k * qrtree->mt) + i;
-            arg[tile_id].currpiv = qrtree->currpiv(qrtree, k, i);
+
+            arg[tile_id].type    = qrtree_init->gettype(qrtree_init, k, i);
+            arg[tile_id].currpiv = qrtree_init->currpiv(qrtree_init, k, i);
             p = arg[tile_id].currpiv;
-            arg[tile_id].first_nextpiv = qrtree->nextpiv(qrtree, k, i, qrtree->mt);
-            arg[tile_id].first_prevpiv = qrtree->prevpiv(qrtree, k, i, i);
-            arg[tile_id].type = qrtree->gettype(qrtree, k, i);
-            arg[tile_id].nextpiv = qrtree->nextpiv(qrtree, k, p, i);
-            arg[tile_id].prevpiv = qrtree->prevpiv(qrtree, k, p, i);
+            arg[tile_id].first_nextpiv = qrtree_init->nextpiv(qrtree_init, k, i, qrtree->mt);
+            arg[tile_id].first_prevpiv = qrtree_init->prevpiv(qrtree_init, k, i, i);
+            arg[tile_id].nextpiv = qrtree_init->nextpiv(qrtree_init, k, p, i);
+            arg[tile_id].prevpiv = qrtree_init->prevpiv(qrtree_init, k, p, i);
         }
     }
     qrtree->args = (void*)arg;
 }
+
+void libhqr_matrix_finalize(libhqr_tree_t *qrtree){
+     libhqr_tileinfo_t *arg = (libhqr_tileinfo_t*)(qrtree->args);
+     free(arg);
+}
diff --git a/testings/testing_pivgen.c b/testings/testing_pivgen.c
index 3fa5add..f28bd0f 100644
--- a/testings/testing_pivgen.c
+++ b/testings/testing_pivgen.c
@@ -76,8 +76,9 @@ int main(int argc, char ** argv)
 		fprintf(stderr, "-M %d -N %d --treel=%d --qr_a=%d --tsrr=%d                                   FAILED(%d)\n",
 			allM[m], allN[n], alltreel[l], allA[a], r, rc);
 		ret |= 1;
+                return 0;
 	      }
-	      libhqr_hqr_finalize( &qrtree );
+	      libhqr_matrix_finalize( &qrtree );
 
 	      done++;
 	      printf("\r%6d / %6d", done, todo);
@@ -110,7 +111,7 @@ int main(int argc, char ** argv)
 		      ret |= 1;
 		    }
 
-		    libhqr_hqr_finalize( &qrtree );
+		    libhqr_matrix_finalize( &qrtree );
 
 		    done++;
 		    printf("\r%6d / %6d", done, todo);
-- 
GitLab