From 884a400de195f51516a5ee2fd549b792ca45898d Mon Sep 17 00:00:00 2001
From: Raphael Boucherie <raphael.boucherie@inria.fr>
Date: Fri, 21 Apr 2017 18:11:57 +0200
Subject: [PATCH] added assert

---
 Makefile                    |  5 ++-
 src/libhqr.c                | 74 ++++++++++++++-----------------------
 testings/testing_tileinit.c | 13 ++++---
 3 files changed, 39 insertions(+), 53 deletions(-)

diff --git a/Makefile b/Makefile
index 4950cfd..3a7f943 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@ CFLAGS = -Iinclude -Wall -g3
 LDFLAGS = -lm
 LIBHQR=src/libhqr.a
 
-default: testing_pivgen testing_treedraw
+default: testing_pivgen testing_treedraw testing_tileinit
 
 src/queue.o:           include/queue.h include/common.h
 src/libhqr.o:          include/common.h include/libhqr.h
@@ -24,6 +24,9 @@ testing_pivgen : testings/testing_pivgen.o ${LIBHQR}
 testing_treedraw : testings/testing_treedraw.o ${LIBHQR}
 	$(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
 
+testing_tileinit : testings/testing_tileinit.o ${LIBHQR}
+	$(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
+
 clean :
 	rm -f include/*~
 	rm -f src/*.o src/*~
diff --git a/src/libhqr.c b/src/libhqr.c
index c63dd15..e62ae55 100644
--- a/src/libhqr.c
+++ b/src/libhqr.c
@@ -208,7 +208,7 @@ 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){
     int id, perm_m, p, a;
     libhqr_tileinfo_t *arg = (libhqr_tileinfo_t*)(qrtree->args);
-    perm_m = hqr_getinvperm( qrtree, k, m );
+    perm_m = m;
     p = qrtree->p;
     a = qrtree->a;
     myassert( (p==1) || (perm_m / (p*a)) == (m / (p*a)) );
@@ -223,15 +223,11 @@ 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){
-    int id, om, op;
+    int id;
     libhqr_tileinfo_t *arg = (libhqr_tileinfo_t*)(qrtree->args);
     int gmt = qrtree->mt;
-    om = m;
-    op = p;
-    m = hqr_getinvperm( qrtree, k, om);
-    p = hqr_getinvperm( qrtree, k, op);
     myassert( m > p && p >= k );
-    myassert( m == gmt || op == rdmtx_currpiv( qrtree, k, om ) );
+    myassert( m == gmt || p == rdmtx_currpiv( qrtree, k, m ) );
     if(m == qrtree->mt){
         id = (k * qrtree->mt) + p;
         return arg[id].first_nextpiv;
@@ -243,15 +239,11 @@ 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){
-    int id, om, op;
+    int id;
     libhqr_tileinfo_t *arg = (libhqr_tileinfo_t*)(qrtree->args);
     int gmt = qrtree->mt;
-    om = m;
-    op = p;
-    m = hqr_getinvperm( qrtree, k, om );
-    p = hqr_getinvperm( qrtree, k, op );
     myassert( m >= p && p >= k && m < gmt );
-    myassert( m == p || op == rdmtx_currpiv( qrtree, k, om ) );
+    myassert( m == p || p == rdmtx_currpiv( qrtree, k, m ) );
 
     if(m == p){
         id = (k * qrtree->mt) + p;
@@ -361,7 +353,7 @@ static int hqr_geti( const libhqr_tree_t *qrtree, int k, int m )
     int a = qrtree->a;
     int p = qrtree->p;
     int domino = qrtree->domino;
-    int lm = hqr_getinvperm( qrtree, k, m );
+    int lm = m;
 
     int pos1, j, pa = p * a;
     int nbextra1 = nbextra1_formula;
@@ -397,7 +389,7 @@ static int hqr_gettype( const libhqr_tree_t *qrtree, int k, int m ) {
     int p = qrtree->p;
     int domino = qrtree->domino;
 
-    int lm = hqr_getinvperm( qrtree, k, m );
+    int lm = m;
     myassert( lm >= k );
 
     /* Element to be reduce in distributed */
@@ -1353,19 +1345,15 @@ static void hqr_high_greedy_init(hqr_subpiv_t *arg, int minMN){
 static int hqr_currpiv(const libhqr_tree_t *qrtree, int k, int m)
 {
     hqr_args_t *arg = (hqr_args_t*)(qrtree->args);
-    int tmp, tmpk, perm_m;
+    int tmp, tmpk;
     int lm, rank;
     int a = qrtree->a;
     int p = qrtree->p;
     int domino = qrtree->domino;
     int gmt = qrtree->mt;
 
-    perm_m = hqr_getinvperm( qrtree, k, m );
-    lm   = perm_m / p; /* Local index in the distribution over p domains */
-    rank = perm_m % p; /* Staring index in this distribution             */
-
-    myassert( (p==1) || (perm_m / (p*a)) == (m / (p*a)) );
-    myassert( (p==1) || (perm_m % p) == (m % p) );
+    lm   = m / p; /* Local index in the distribution over p domains */
+    rank = m % p; /* Staring index in this distribution             */
 
     /* TS level common to every case */
     if ( domino ) {
@@ -1379,7 +1367,7 @@ static int hqr_currpiv(const libhqr_tree_t *qrtree, int k, int m)
                 return  tmp * a * p + rank ;
             break;
         case 1:
-            tmp = arg->llvl->currpiv(arg->llvl, k, perm_m);
+            tmp = arg->llvl->currpiv(arg->llvl, k, m);
             return  ( tmp == k / a ) ? k * p + rank : tmp * a * p + rank;
             break;
         case 2:
@@ -1387,7 +1375,7 @@ static int hqr_currpiv(const libhqr_tree_t *qrtree, int k, int m)
             break;
         case 3:
             if ( arg->hlvl != NULL )
-                return arg->hlvl->currpiv(arg->hlvl, k, perm_m);
+                return arg->hlvl->currpiv(arg->hlvl, k, m);
         default:
             return gmt;
         }
@@ -1399,20 +1387,20 @@ static int hqr_currpiv(const libhqr_tree_t *qrtree, int k, int m)
             tmp = lm / a;
             /* tmpk = (k + p - 1 - m%p) / p / a;  */
             tmpk = k / (p * a);
-            return  ( tmp == tmpk ) ? k + (perm_m-k)%p : tmp * a * p + rank ;
+            return  ( tmp == tmpk ) ? k + (m-k)%p : tmp * a * p + rank ;
             break;
         case 1:
-            tmp = arg->llvl->currpiv(arg->llvl, k, perm_m);
+            tmp = arg->llvl->currpiv(arg->llvl, k, m);
             /* tmpk = (k + p - 1 - m%p) / p / a; */
             tmpk = k / (p * a);
-            return  ( tmp == tmpk ) ? k + (perm_m-k)%p : tmp * a * p + rank ;
+            return  ( tmp == tmpk ) ? k + (m-k)%p : tmp * a * p + rank ;
             break;
         case 2:
-            return  perm_m - p;
+            return  m - p;
             break;
         case 3:
             if ( arg->hlvl != NULL )
-                return arg->hlvl->currpiv(arg->hlvl, k, perm_m);
+                return arg->hlvl->currpiv(arg->hlvl, k, m);
         default:
             return gmt;
         }
@@ -1442,17 +1430,11 @@ static int hqr_nextpiv(const libhqr_tree_t *qrtree, int k, int pivot, int start)
 {
     hqr_args_t *arg = (hqr_args_t*)(qrtree->args);
     int tmp, ls, lp, nextp;
-    int opivot, ostart; /* original values before permutation */
     int lpivot, rpivot, lstart;
     int a = qrtree->a;
     int p = qrtree->p;
     int gmt = qrtree->mt;
 
-    ostart = start;
-    opivot = pivot;
-    start = hqr_getinvperm( qrtree, k, ostart);
-    pivot = hqr_getinvperm( qrtree, k, opivot);
-
     lpivot = pivot / p; /* Local index in the distribution over p domains */
     rpivot = pivot % p; /* Staring index in this distribution             */
 
@@ -1460,11 +1442,11 @@ static int hqr_nextpiv(const libhqr_tree_t *qrtree, int k, int pivot, int start)
     lstart = ( start == gmt ) ? arg->llvl->ldd * a : start / p;
 
     myassert( start > pivot && pivot >= k );
-    myassert( start == gmt || opivot == hqr_currpiv( qrtree, k, ostart ) );
+    myassert( start == gmt || pivot == hqr_currpiv( qrtree, k, start ) );
 
     /* TS level common to every case */
-    ls = (start < gmt) ? hqr_gettype( qrtree, k, ostart ) : -1;
-    lp = hqr_gettype( qrtree, k, opivot );
+    ls = (start < gmt) ? hqr_gettype( qrtree, k, start ) : -1;
+    lp = hqr_gettype( qrtree, k, pivot );
 
     switch( ls )
         {
@@ -1572,27 +1554,21 @@ hqr_prevpiv(const libhqr_tree_t *qrtree, int k, int pivot, int start)
 {
     hqr_args_t *arg = (hqr_args_t*)(qrtree->args);
     int tmp, ls, lp, nextp;
-    int opivot, ostart; /* original values before permutation */
     int lpivot, rpivot, lstart;
     int a = qrtree->a;
     int p = qrtree->p;
     int gmt = qrtree->mt;
 
-    ostart = start;
-    opivot = pivot;
-    start = hqr_getinvperm( qrtree, k, ostart );
-    pivot = hqr_getinvperm( qrtree, k, opivot );
-
     lpivot = pivot / p; /* Local index in the distribution over p domains */
     rpivot = pivot % p; /* Staring index in this distribution             */
     lstart = start / p; /* Local index in the distribution over p domains */
 
     myassert( start >= pivot && pivot >= k && start < gmt );
-    myassert( start == pivot || opivot == hqr_currpiv( qrtree, k, ostart ) );
+    myassert( start == pivot || pivot == hqr_currpiv( qrtree, k, start ) );
 
     /* T Slevel common to every case */
-    ls = hqr_gettype( qrtree, k, ostart );
-    lp = hqr_gettype( qrtree, k, opivot );
+    ls = hqr_gettype( qrtree, k, start );
+    lp = hqr_gettype( qrtree, k, pivot );
 
     if ( lp == LIBHQR_KILLED_BY_TS )
       return gmt;
@@ -2860,6 +2836,10 @@ void libhqr_matrix_init(libhqr_tree_t *qrtree, const libhqr_tree_t *qrtree_init)
             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);
+            assert( (arg[tile_id].nextpiv <= qrtree->mt && arg[tile_id].nextpiv >= k) || arg[tile_id].nextpiv==-1  );
+            assert( (arg[tile_id].prevpiv <= qrtree->mt && arg[tile_id].prevpiv >= k) || arg[tile_id].prevpiv==-1  );
+            assert( (arg[tile_id].first_nextpiv <= qrtree->mt && arg[tile_id].first_nextpiv >= k) || arg[tile_id].first_nextpiv==-1  );
+            assert( (arg[tile_id].first_prevpiv <= qrtree->mt && arg[tile_id].first_prevpiv >= k) || arg[tile_id].first_prevpiv==-1  );
         }
     }
     qrtree->args = (void*)arg;
diff --git a/testings/testing_tileinit.c b/testings/testing_tileinit.c
index 9f40d84..895aa63 100644
--- a/testings/testing_tileinit.c
+++ b/testings/testing_tileinit.c
@@ -18,20 +18,23 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#include <assert.h>
 #include "libhqr.h"
 
 int
 main(int argc, char ** argv)
 {
+    int rc;
     libhqr_tree_t qrtree;
     libhqr_tiledesc_t matrix;
-    libhqr_tileinfo_t *tiles;
+
+    memset( &qrtree, 0xdeadbeef, sizeof(libhqr_tree_t) );
     matrix.nodes = 1;
-    matrix.p     = 1;
-    matrix.mt    = 3;
+    matrix.p     = 3;
+    matrix.mt    = 1;
     matrix.nt    = 1;
-    libhqr_hqr_init( &qrtree, LIBHQR_QR, &matrix, LIBHQR_BINARY_TREE, LIBHQR_FLAT_TREE, 1, 2, 0, 0);
+    libhqr_hqr_init( &qrtree, LIBHQR_QR, &matrix, 0, 0, 1, 3, 0, 0);
+    rc = libhqr_tree_check( &matrix, &qrtree );
     libhqr_hqr_finalize( &qrtree );
-    free(tiles);
     return 1;
 }
-- 
GitLab