diff --git a/src/libhqr.c b/src/libhqr.c index ca1c524309838b01c35b7931d9635211c160a090..c63dd1560b92eefb144b12009b39d8c5ef2cd4d4 100644 --- a/src/libhqr.c +++ b/src/libhqr.c @@ -206,8 +206,13 @@ 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; + int id, perm_m, p, a; libhqr_tileinfo_t *arg = (libhqr_tileinfo_t*)(qrtree->args); + perm_m = hqr_getinvperm( qrtree, k, m ); + p = qrtree->p; + a = qrtree->a; + myassert( (p==1) || (perm_m / (p*a)) == (m / (p*a)) ); + myassert( (p==1) || (perm_m % p) == (m % p) ); id = (k * qrtree->mt) + m; return arg[id].currpiv; } @@ -218,10 +223,15 @@ 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; + int id, om, op; 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 == qrtree->mt || p == rdmtx_currpiv( qrtree, k, m ) ); + myassert( m == gmt || op == rdmtx_currpiv( qrtree, k, om ) ); if(m == qrtree->mt){ id = (k * qrtree->mt) + p; return arg[id].first_nextpiv; @@ -233,17 +243,23 @@ 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; + int id, om, op; 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 ) ); + 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 ) ); + if(m == p){ id = (k * qrtree->mt) + p; return arg[id].first_prevpiv; } else{ id = (k * qrtree->mt) + m; - return arg[id].nextpiv; + return arg[id].prevpiv; } } /**************************************************** @@ -377,10 +393,9 @@ static int hqr_geti( const libhqr_tree_t *qrtree, int k, int m ) * 3 - if m is reduced in distributed */ static int hqr_gettype( const libhqr_tree_t *qrtree, int k, int m ) { - hqr_args_t *arg = (hqr_args_t*)(qrtree->args); int a = qrtree->a; int p = qrtree->p; - int domino = arg->domino; + int domino = qrtree->domino; int lm = hqr_getinvperm( qrtree, k, m ); myassert( lm >= k ); @@ -1342,7 +1357,7 @@ static int hqr_currpiv(const libhqr_tree_t *qrtree, int k, int m) int lm, rank; int a = qrtree->a; int p = qrtree->p; - int domino = arg->domino; + int domino = qrtree->domino; int gmt = qrtree->mt; perm_m = hqr_getinvperm( qrtree, k, m ); @@ -1889,7 +1904,7 @@ libhqr_hqr_init( libhqr_tree_t *qrtree, } if ((trans != LIBHQR_QR) && (trans != LIBHQR_LQ)) { - fprintf(stderr, "libhqr_hqr_ini, illegal value of trans"); + fprintf(stderr, "libhqr_hqr_init, illegal value of trans"); return -2; } if (A == NULL) { @@ -2838,6 +2853,7 @@ void libhqr_matrix_init(libhqr_tree_t *qrtree, const libhqr_tree_t *qrtree_init) tile_id = (k * qrtree->mt) + i; arg[tile_id].type = qrtree_init->gettype(qrtree_init, k, i); + assert( (i < k) || (arg[tile_id].type >= 0) ); arg[tile_id].currpiv = qrtree_init->currpiv(qrtree_init, k, i); p = arg[tile_id].currpiv; arg[tile_id].first_nextpiv = qrtree_init->nextpiv(qrtree_init, k, i, qrtree->mt); diff --git a/src/libhqr_dbg.c b/src/libhqr_dbg.c index 46d82ef0a7e92db340cc4ab08271813c3cbd97cd..cc333f41fbafe64b3061bd13356f7dfc53c8f959 100644 --- a/src/libhqr_dbg.c +++ b/src/libhqr_dbg.c @@ -19,13 +19,16 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <assert.h> /* static int libhqr_qrtree_getinon0( const qr_piv_t *arg, */ /* const int k, int i, int mt ); */ #define ENDCHECK( test, ret ) \ - if ( !test ) \ - return ret; + if ( !test ) { \ + assert( ret == 0 ); \ + return ret; \ + } int libhqr_tree_check( libhqr_tiledesc_t *A, libhqr_tree_t *qrtree) { @@ -152,7 +155,7 @@ int libhqr_tree_check( libhqr_tiledesc_t *A, libhqr_tree_t *qrtree) a, p, A->mt, A->nt, m, k); check = 0; - return 3; + ENDCHECK( check, 3 ); } } } @@ -195,7 +198,7 @@ int libhqr_tree_check( libhqr_tiledesc_t *A, libhqr_tree_t *qrtree) a, p, A->mt, A->nt, m, k); check = 0; - return 3; + ENDCHECK( check, 3 ); } } } @@ -227,11 +230,11 @@ int libhqr_tree_check( libhqr_tiledesc_t *A, libhqr_tree_t *qrtree) printf(" ----------------------------------------------------\n" " - a = %d, p = %d, M = %d, N = %d\n" " Check next/prev:\n" - " next( m=%d, k=%d, start=%d ) => %d && prev( m=%d, k=%d, start=%d ) => %d\n ( %d != %d )", + " next( k=%d, m=%d, start=%d ) => %d && prev( k=%d, m=%d, start=%d ) => %d (instead of %d)\n", a, p, A->mt, A->nt, - m, k, start, next, m, k, next, prev, start, prev); - check = 0; - return 3; + k, m, start, next, k, m, next, prev, start); + check = 0; + ENDCHECK( check, 3 ); } start = next; } while ( start != A->mt ); diff --git a/testings/testing_pivgen.c b/testings/testing_pivgen.c index f28bd0fd78be7ee1b19975a1856af7f18ba20f12..ef8827ec6955f6e38933eeecb3a3585653b4bd2d 100644 --- a/testings/testing_pivgen.c +++ b/testings/testing_pivgen.c @@ -76,6 +76,7 @@ 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; + libhqr_matrix_finalize( &qrtree ); return 0; } libhqr_matrix_finalize( &qrtree ); diff --git a/testings/testing_tileinit.c b/testings/testing_tileinit.c index 7938c86dbd2400c49bf76e41bf4ca32897e59383..9f40d84b1b5fa76e5b7d19e25d1c0cb35702eb5f 100644 --- a/testings/testing_tileinit.c +++ b/testings/testing_tileinit.c @@ -28,11 +28,9 @@ main(int argc, char ** argv) libhqr_tileinfo_t *tiles; matrix.nodes = 1; matrix.p = 1; - matrix.mt = 16; - matrix.nt = 4; - tiles = (libhqr_tileinfo_t*)malloc(matrix.mt*sizeof(libhqr_tileinfo_t)); + matrix.mt = 3; + matrix.nt = 1; libhqr_hqr_init( &qrtree, LIBHQR_QR, &matrix, LIBHQR_BINARY_TREE, LIBHQR_FLAT_TREE, 1, 2, 0, 0); - libhqr_tile_init(&qrtree, 0, tiles); libhqr_hqr_finalize( &qrtree ); free(tiles); return 1;