Mentions légales du service

Skip to content
Snippets Groups Projects
Commit 33318884 authored by Mathieu Faverge's avatar Mathieu Faverge
Browse files

Add ts tpqrt with round robin

parent 2fef23a1
No related branches found
No related tags found
No related merge requests found
......@@ -95,6 +95,7 @@ set(srcs
src/svd.c
src/hqr.c
src/tphqr.c
src/tshqr.c
src/mtxtree.c
# Others
src/check.c
......
......@@ -210,6 +210,7 @@ int libhqr_init_tphqr( libhqr_tree_t *qrtree,
libhqr_tree_e hlvl, int a, int p );
int libhqr_init_tshqr( libhqr_tree_t *qrtree,
int roundrobin,
libhqr_facto_e trans, int kt, int lt,
const libhqr_matrix_t *A );
......
......@@ -18,7 +18,9 @@
#include <math.h>
#include <string.h>
void print_onelist( libhqr_list_t *list )
#if defined(LIBHQR_DEBUG)
static inline void
print_onelist( libhqr_list_t *list )
{
libhqr_list_elt_t *elt = *list;
while( elt != NULL ) {
......@@ -28,7 +30,8 @@ void print_onelist( libhqr_list_t *list )
printf("\n");
}
void print_alllist( int nblist, libhqr_list_t *lists )
static inline void
print_alllist( int nblist, libhqr_list_t *lists )
{
int i;
......@@ -36,178 +39,58 @@ void print_alllist( int nblist, libhqr_list_t *lists )
print_onelist( lists + i );
}
}
#endif
static int
tphqr_getnbgeqrf( const libhqr_tree_t *qrtree, int k )
{
libhqr_tile_args_t *args = (libhqr_tile_args_t*)(qrtree->args);
int *nbgeqrf = args->nbgeqrf;
libhqr_tile_args_t *args = (libhqr_tile_args_t*)(qrtree->args);
int *nbgeqrf = args->nbgeqrf;
return nbgeqrf[k];
}
static int
tphqr_getm( const libhqr_tree_t *qrtree, int k, int i )
{
libhqr_tile_args_t *args = (libhqr_tile_args_t*)(qrtree->args);
int *killers = args->killers;
libhqr_tile_args_t *args = (libhqr_tile_args_t*)(qrtree->args);
int *killers = args->killers;
killers += k * qrtree->mt;
return killers[i];
}
static int
tshqr_getnbgeqrf( const libhqr_tree_t *qrtree, int k )
{
(void)qrtree;
(void)k;
return 1;
}
static int
tshqr_getm( const libhqr_tree_t *qrtree, int k, int i )
{
(void)qrtree;
(void)k;
(void)i;
return 0;
}
int
libhqr_initmtx_tshqr( libhqr_tree_t *qrtree,
libhqr_facto_e trans, int kt, int lt,
const libhqr_matrix_t *A )
{
libhqr_tile_args_t *args;
libhqr_tile_info_t *tileinfo;
int *pivots;
int j, k, l;
if (qrtree == NULL) {
fprintf(stderr, "libhqr_hqr_init, illegal value of qrtree");
return -1;
}
if ((trans != LIBHQR_TSQR) &&
(trans != LIBHQR_TSLQ)) {
fprintf(stderr, "libhqr_hqr_init, illegal value of trans");
return -2;
}
if (A == NULL) {
fprintf(stderr, "libhqr_hqr_init, illegal value of A");
return -3;
}
libhqr_rdmtx_initfct( qrtree );
qrtree->init = LIBHQR_QRTREE_MTX;
qrtree->facto = trans;
qrtree->getnbgeqrf = tshqr_getnbgeqrf;
qrtree->getm = tshqr_getm;
qrtree->mt = (trans == LIBHQR_TSQR) ? A->mt : A->nt;
qrtree->nt = kt;
qrtree->p = 1;
qrtree->a = 1;
qrtree->args = malloc( sizeof(libhqr_tile_args_t) );
args = (libhqr_tile_args_t*)qrtree->args;
args->tileinfo = malloc( qrtree->mt * qrtree->nt * sizeof(libhqr_tile_info_t) );
args->killers = NULL;
args->pivots = malloc( qrtree->nt * sizeof(int) );
args->nbgeqrf = NULL;
tileinfo = args->tileinfo;
pivots = args->pivots;
/* Initialize the matrix */
for (k=0; k<qrtree->nt; k++, tileinfo += qrtree->mt)
{
tileinfo[0].type = LIBHQR_KILLED_BY_LOCALTREE;
tileinfo[0].index = 0;
tileinfo[0].currpiv = -1;
tileinfo[0].nextpiv = qrtree->mt;
tileinfo[0].prevpiv = qrtree->mt;
tileinfo[0].first_nextpiv = qrtree->mt;
tileinfo[0].first_prevpiv = qrtree->mt;
for (j=1; j<qrtree->mt-lt; j++, l++) {
tileinfo[j].type = LIBHQR_KILLED_BY_TS;
tileinfo[j].index = -2;
tileinfo[j].currpiv = 0;
tileinfo[j].nextpiv = qrtree->mt;
tileinfo[j].prevpiv = qrtree->mt;
tileinfo[j].first_nextpiv = qrtree->mt;
tileinfo[j].first_prevpiv = qrtree->mt;
/* If first_nextpiv is undefined, it is the current tile */
if ( tileinfo[0].first_nextpiv == qrtree->mt ) {
tileinfo[0].first_nextpiv = j;
}
/* The previous tile is the former first_prevpiv, and the current one become the first_prevpiv */
if ( tileinfo[0].first_prevpiv != qrtree->mt ) {
tileinfo[tileinfo[0].first_prevpiv].nextpiv = j;
tileinfo[j].prevpiv = tileinfo[0].first_prevpiv;
}
tileinfo[0].first_prevpiv = j;
}
/* Add the new element when performing a TT kernel */
if ( lt > 0 ) {
int last = qrtree->mt-lt;
for( j=last; j<qrtree->mt; j++ ) {
tileinfo[j].type = -1;
tileinfo[j].index = -1;
tileinfo[j].currpiv = -1;
tileinfo[j].nextpiv = -1;
tileinfo[j].prevpiv = -1;
tileinfo[j].first_nextpiv = -1;
tileinfo[j].first_prevpiv = -1;
}
lt--;
}
/* Let's register elt1 as the first pivot */
pivots[k] = 0;
}
return 0;
}
int
libhqr_init_tshqr( libhqr_tree_t *qrtree,
libhqr_facto_e trans, int kt, int lt, const libhqr_matrix_t *A )
{
return libhqr_initmtx_tshqr( qrtree, trans, kt, lt, A );
}
int
libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
libhqr_facto_e trans, int kt, int lt, const libhqr_matrix_t *A,
libhqr_tree_e hlvl, int a, int p )
libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
libhqr_facto_e trans,
int kt,
int lt,
const libhqr_matrix_t *A,
libhqr_tree_e hlvl,
int a,
int p )
{
libhqr_tile_args_t *args;
libhqr_tile_info_t *tileinfo;
int *killers, *pivots;
int low_mt, i, j, k, l;
int lp, la, killer_index;
int *killers, *pivots;
int low_mt, i, j, k, l;
int lp, la, killer_index;
if (qrtree == NULL) {
fprintf(stderr, "libhqr_hqr_init, illegal value of qrtree");
return -1;
if ( qrtree == NULL ) {
fprintf( stderr, "libhqr_hqr_init, illegal value of qrtree" );
return -1;
}
if ((trans != LIBHQR_TSQR) &&
(trans != LIBHQR_TSLQ)) {
fprintf(stderr, "libhqr_hqr_init, illegal value of trans");
return -2;
if ( ( trans != LIBHQR_TSQR ) && ( trans != LIBHQR_TSLQ ) ) {
fprintf( stderr, "libhqr_hqr_init, illegal value of trans" );
return -2;
}
if (A == NULL) {
fprintf(stderr, "libhqr_hqr_init, illegal value of A");
return -3;
if ( A == NULL ) {
fprintf( stderr, "libhqr_hqr_init, illegal value of A" );
return -3;
}
/* Compute parameters */
if ( a == -1) {
if ( a == -1 ) {
a = 4; /* TODO: add automatic computation */
}
else {
......@@ -227,12 +110,12 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
}
libhqr_rdmtx_initfct( qrtree );
qrtree->init = LIBHQR_QRTREE_MTX;
qrtree->facto = trans;
qrtree->init = LIBHQR_QRTREE_MTX;
qrtree->facto = trans;
qrtree->getnbgeqrf = tphqr_getnbgeqrf;
qrtree->getm = tphqr_getm;
qrtree->mt = (trans == LIBHQR_TSQR) ? A->mt : A->nt;
qrtree->nt = kt;
qrtree->mt = ( trans == LIBHQR_TSQR ) ? A->mt : A->nt;
qrtree->nt = kt;
a = libhqr_imin( a, qrtree->mt );
......@@ -242,15 +125,15 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
qrtree->p = p;
qrtree->a = a;
qrtree->args = malloc( sizeof(libhqr_tile_args_t) );
args = (libhqr_tile_args_t*)qrtree->args;
args->tileinfo = malloc( qrtree->mt * qrtree->nt * sizeof(libhqr_tile_info_t) );
args->killers = malloc( qrtree->mt * qrtree->nt * sizeof(int) );
args->pivots = malloc( 2 * qrtree->nt * sizeof(int) );
qrtree->args = malloc( sizeof( libhqr_tile_args_t ) );
args = (libhqr_tile_args_t *)qrtree->args;
args->tileinfo = malloc( qrtree->mt * qrtree->nt * sizeof( libhqr_tile_info_t ) );
args->killers = malloc( qrtree->mt * qrtree->nt * sizeof( int ) );
args->pivots = malloc( 2 * qrtree->nt * sizeof( int ) );
args->nbgeqrf = args->pivots + qrtree->nt;
tileinfo = args->tileinfo;
killers = args->killers;
pivots = args->pivots;
tileinfo = args->tileinfo;
killers = args->killers;
pivots = args->pivots;
/**
* Compute the number of sets:
......@@ -260,9 +143,9 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
* 2) low_mt * p for the low level TS trees
* 3) low_mt * p to temporary save the node that will be reduced at the next step
*/
libhqr_list_t *lists = calloc( (2 * low_mt + 1) * p + 1, sizeof(libhqr_list_t) );
libhqr_list_t *lists = calloc( ( 2 * low_mt + 1 ) * p + 1, sizeof( libhqr_list_t ) );
libhqr_list_t *lists0, *lists1, *lists2, *lists3;
libhqr_list_elt_t *elts = malloc( qrtree->mt * sizeof(libhqr_list_elt_t) );
libhqr_list_elt_t *elts = malloc( qrtree->mt * sizeof( libhqr_list_elt_t ) );
libhqr_list_elt_t *elt1, *elt2;
lists3 = lists;
......@@ -270,7 +153,7 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
lists1 = lists2 + low_mt * p;
lists0 = lists1 + p;
for (k=0; k<qrtree->mt-lt; k++) {
for ( k = 0; k < qrtree->mt - lt; k++ ) {
elts[k].next = NULL;
elts[k].id = k;
elts[k].date = 0;
......@@ -282,12 +165,11 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
}
/* Initialize the matrix */
for (k=0; k<qrtree->nt; k++, killers += qrtree->mt, tileinfo += qrtree->mt)
{
for ( k = 0; k < qrtree->nt; k++, killers += qrtree->mt, tileinfo += qrtree->mt ) {
killer_index = 0;
/* Move remaining rows from level 3 to level 2 */
for (i=0; i<(low_mt*p); i++) {
for ( i = 0; i < ( low_mt * p ); i++ ) {
assert( lists2[i] == NULL );
lists2[i] = lists3[i];
lists3[i] = NULL;
......@@ -295,9 +177,8 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
/* Handle TS tiles */
l = 0;
for (i=0; i<p; i++) {
for (j=0; j<low_mt; j++, l++) {
for ( i = 0; i < p; i++ ) {
for ( j = 0; j < low_mt; j++, l++ ) {
elt1 = libhqr_list_pop( lists2 + l );
elt2 = libhqr_list_pop( lists2 + l );
......@@ -305,7 +186,7 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
continue;
}
assert( (elt1 != NULL) && (elt1->next == NULL) );
assert( ( elt1 != NULL ) && ( elt1->next == NULL ) );
tileinfo[elt1->id].type = LIBHQR_KILLED_BY_LOCALTREE;
tileinfo[elt1->id].index = killer_index;
......@@ -314,15 +195,14 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
tileinfo[elt1->id].prevpiv = qrtree->mt;
tileinfo[elt1->id].first_nextpiv = qrtree->mt;
tileinfo[elt1->id].first_prevpiv = qrtree->mt;
killers[killer_index] = elt1->id;
killers[killer_index] = elt1->id;
killer_index++;
/* Let's kill the tiles with the main one */
while( elt2 != NULL )
{
assert( (elt2 != NULL) && (elt2->next == NULL) );
while ( elt2 != NULL ) {
assert( ( elt2 != NULL ) && ( elt2->next == NULL ) );
int date = libhqr_imax( elt1->date, elt2->date ) + 1;
int date = libhqr_imax( elt1->date, elt2->date ) + 1;
elt1->date = date;
elt2->date = date;
......@@ -339,7 +219,8 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
tileinfo[elt1->id].first_nextpiv = elt2->id;
}
/* The previous tile is the former first_prevpiv, and the current one become the first_prevpiv */
/* The previous tile is the former first_prevpiv, and the current one become the
* first_prevpiv */
if ( tileinfo[elt1->id].first_prevpiv != qrtree->mt ) {
tileinfo[tileinfo[elt1->id].first_prevpiv].nextpiv = elt2->id;
tileinfo[elt2->id].prevpiv = tileinfo[elt1->id].first_prevpiv;
......@@ -356,7 +237,7 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
}
/* Handle local tree */
for (i=0; i<p; i++) {
for ( i = 0; i < p; i++ ) {
elt1 = libhqr_list_pop( lists1 + i );
elt2 = libhqr_list_pop( lists1 + i );
......@@ -364,13 +245,12 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
continue;
}
while( elt2 != NULL )
{
int date = libhqr_imax( elt1->date, elt2->date ) + 1;
while ( elt2 != NULL ) {
int date = libhqr_imax( elt1->date, elt2->date ) + 1;
elt1->date = date;
elt2->date = date;
assert( tileinfo[elt2->id].type == LIBHQR_KILLED_BY_LOCALTREE);
assert( tileinfo[elt2->id].type == LIBHQR_KILLED_BY_LOCALTREE );
tileinfo[elt2->id].currpiv = elt1->id;
/* If first_nextpiv is undefined, it is the current tile */
......@@ -378,7 +258,8 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
tileinfo[elt1->id].first_nextpiv = elt2->id;
}
/* The previous tile is the former first_prevpiv, and the current one become the first_prevpiv */
/* The previous tile is the former first_prevpiv, and the current one become the
* first_prevpiv */
if ( tileinfo[elt1->id].first_prevpiv != qrtree->mt ) {
tileinfo[tileinfo[elt1->id].first_prevpiv].nextpiv = elt2->id;
tileinfo[elt2->id].prevpiv = tileinfo[elt1->id].first_prevpiv;
......@@ -409,13 +290,12 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
continue;
}
while( elt2 != NULL )
{
int date = libhqr_imax( elt1->date, elt2->date ) + 1;
while ( elt2 != NULL ) {
int date = libhqr_imax( elt1->date, elt2->date ) + 1;
elt1->date = date;
elt2->date = date;
assert( tileinfo[elt2->id].type == LIBHQR_KILLED_BY_DISTTREE);
assert( tileinfo[elt2->id].type == LIBHQR_KILLED_BY_DISTTREE );
tileinfo[elt2->id].currpiv = elt1->id;
/* If first_nextpiv is undefined, it is the current tile */
......@@ -423,7 +303,8 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
tileinfo[elt1->id].first_nextpiv = elt2->id;
}
/* The previous tile is the former first_prevpiv, and the current one become the first_prevpiv */
/* The previous tile is the former first_prevpiv, and the current one become the
* first_prevpiv */
if ( tileinfo[elt1->id].first_prevpiv != qrtree->mt ) {
tileinfo[tileinfo[elt1->id].first_prevpiv].nextpiv = elt2->id;
tileinfo[elt2->id].prevpiv = tileinfo[elt1->id].first_prevpiv;
......@@ -456,7 +337,7 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
/* Add the new element when performing a TT kernel */
if ( lt > 0 ) {
int last = qrtree->mt-lt;
int last = qrtree->mt - lt;
elts[last].next = NULL;
elts[last].id = last;
elts[last].date = 0;
......@@ -466,7 +347,7 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
assert( lp * low_mt + la < low_mt * p );
libhqr_list_push( lists3 + lp * low_mt + la, elts + last );
for( i=last; i<qrtree->mt; i++ ) {
for ( i = last; i < qrtree->mt; i++ ) {
tileinfo[i].type = -1;
tileinfo[i].index = -1;
tileinfo[i].currpiv = -1;
......@@ -479,13 +360,14 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
}
}
if (0)
{
#if defined(LIBHQR_DEBUG)
if ( 0 ) {
tileinfo = args->tileinfo;
for (j=0; j<qrtree->nt; j++, tileinfo += qrtree->mt) {
printf("---- Step %d ----\n", j );
for (i=0; i<qrtree->mt; i++) {
printf( "{type = %-1d, index = %-2d, currpiv = %-3d, nextpiv = %-3d, prevpiv = %-3d, first_nextpiv = %-3d, first_prevpiv = %-3d}\n",
for ( j = 0; j < qrtree->nt; j++, tileinfo += qrtree->mt ) {
printf( "---- Step %d ----\n", j );
for ( i = 0; i < qrtree->mt; i++ ) {
printf( "{type = %-1d, index = %-2d, currpiv = %-3d, nextpiv = %-3d, prevpiv = "
"%-3d, first_nextpiv = %-3d, first_prevpiv = %-3d}\n",
tileinfo[i].type,
tileinfo[i].index,
tileinfo[i].currpiv,
......@@ -497,21 +379,25 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
}
}
if (0)
{
print_alllist( low_mt*p, lists );
if ( 0 ) {
print_alllist( low_mt * p, lists );
}
#endif
free(elts);
free(lists);
free( elts );
free( lists );
return 0;
}
int
libhqr_init_tphqr( libhqr_tree_t *qrtree,
libhqr_facto_e trans, int kt, int lt, const libhqr_matrix_t *A,
libhqr_tree_e hlvl, int a, int p )
libhqr_init_tphqr( libhqr_tree_t *qrtree,
libhqr_facto_e trans,
int kt,
int lt,
const libhqr_matrix_t *A,
libhqr_tree_e hlvl,
int a,
int p )
{
return libhqr_initmtx_tphqr( qrtree, trans, kt, lt, A, hlvl, a, p );
}
/**
*
* @file tshqr.c
*
* @copyright 2018-2018 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
* Univ. Bordeaux. All rights reserved.
*
* @version 1.0.0
* @author Mathieu Faverge
* @date 2018-09-30
*
*/
#include "libhqr_internal.h"
#include "libhqr_list.h"
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
static int
tshqr_getnbgeqrf( const libhqr_tree_t *qrtree, int k )
{
(void)qrtree;
(void)k;
return 1;
}
static int
tshqr_getm( const libhqr_tree_t *qrtree, int k, int i )
{
libhqr_tile_args_t *args = (libhqr_tile_args_t *)( qrtree->args );
(void)i;
return args->nbgeqrf == NULL ? 0 : k;
}
int
libhqr_initmtx_tshqr( libhqr_tree_t *qrtree,
int roundrobin,
libhqr_facto_e trans,
int kt,
int lt,
const libhqr_matrix_t *A )
{
libhqr_tile_args_t *args;
libhqr_tile_info_t *tileinfo;
int *pivots;
int j, k, l, killer;
if ( qrtree == NULL ) {
fprintf( stderr, "libhqr_hqr_init, illegal value of qrtree" );
return -1;
}
if ( ( trans != LIBHQR_TSQR ) && ( trans != LIBHQR_TSLQ ) ) {
fprintf( stderr, "libhqr_hqr_init, illegal value of trans" );
return -2;
}
if ( A == NULL ) {
fprintf( stderr, "libhqr_hqr_init, illegal value of A" );
return -3;
}
libhqr_rdmtx_initfct( qrtree );
qrtree->init = LIBHQR_QRTREE_MTX;
qrtree->facto = trans;
qrtree->getnbgeqrf = tshqr_getnbgeqrf;
qrtree->getm = tshqr_getm;
qrtree->mt = ( trans == LIBHQR_TSQR ) ? A->mt : A->nt;
qrtree->nt = kt;
qrtree->p = 1;
qrtree->a = 1;
qrtree->args = malloc( sizeof( libhqr_tile_args_t ) );
args = (libhqr_tile_args_t *)qrtree->args;
args->tileinfo = malloc( qrtree->mt * qrtree->nt * sizeof( libhqr_tile_info_t ) );
args->killers = NULL;
args->pivots = malloc( qrtree->nt * sizeof( int ) );
args->nbgeqrf = roundrobin ? malloc(1) : NULL;
tileinfo = args->tileinfo;
pivots = args->pivots;
/* Initialize the matrix */
for ( k = 0; k < qrtree->nt; k++, tileinfo += qrtree->mt ) {
killer = roundrobin ? k : 0;
tileinfo[killer].type = LIBHQR_KILLED_BY_LOCALTREE;
tileinfo[killer].index = killer;
tileinfo[killer].currpiv = -1;
tileinfo[killer].nextpiv = qrtree->mt;
tileinfo[killer].prevpiv = qrtree->mt;
tileinfo[killer].first_nextpiv = qrtree->mt;
tileinfo[killer].first_prevpiv = qrtree->mt;
l = killer;
for ( j = 1; j < qrtree->mt - lt; j++ ) {
l = (l+1) % (qrtree->mt - lt);
tileinfo[l].type = LIBHQR_KILLED_BY_TS;
tileinfo[l].index = -2;
tileinfo[l].currpiv = killer;
tileinfo[l].nextpiv = qrtree->mt;
tileinfo[l].prevpiv = qrtree->mt;
tileinfo[l].first_nextpiv = qrtree->mt;
tileinfo[l].first_prevpiv = qrtree->mt;
/* If first_nextpiv is undefined, it is the current tile */
if ( tileinfo[killer].first_nextpiv == qrtree->mt ) {
tileinfo[killer].first_nextpiv = l;
}
/* The previous tile is the former first_prevpiv, and the current one become the
* first_prevpiv */
if ( tileinfo[killer].first_prevpiv != qrtree->mt ) {
tileinfo[tileinfo[killer].first_prevpiv].nextpiv = l;
tileinfo[l].prevpiv = tileinfo[killer].first_prevpiv;
}
tileinfo[killer].first_prevpiv = l;
}
/* Add the new element when performing a TT kernel */
if ( lt > 0 ) {
int last = qrtree->mt - lt;
for ( j = last; j < qrtree->mt; j++ ) {
tileinfo[j].type = -1;
tileinfo[j].index = -1;
tileinfo[j].currpiv = -1;
tileinfo[j].nextpiv = -1;
tileinfo[j].prevpiv = -1;
tileinfo[j].first_nextpiv = -1;
tileinfo[j].first_prevpiv = -1;
}
lt--;
}
/* Let's register elt1 as the first pivot */
pivots[k] = killer;
}
return 0;
}
int
libhqr_init_tshqr( libhqr_tree_t *qrtree,
int roundrobin,
libhqr_facto_e trans,
int kt,
int lt,
const libhqr_matrix_t *A )
{
return libhqr_initmtx_tshqr( qrtree, roundrobin, trans, kt, lt, A );
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment