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