diff --git a/include/queue.h b/include/queue.h index 1af84b4d3a2e6e9cac2f1cf6569be89928909cdd..77bfa93cc72c5cbd7de2b90a0bf51426ce330004 100644 --- a/include/queue.h +++ b/include/queue.h @@ -20,7 +20,7 @@ BEGIN_C_DECLS -typedef struct libhqr_queue_tile_s{ +typedef struct libhqr_queue_tile_s { struct libhqr_queue_tile_s *prev; struct libhqr_queue_tile_s *next; int numero; @@ -35,6 +35,11 @@ void libhqr_queue_tile_prev (libhqr_queue_tile_t ** queue_tile); void libhqr_queue_tile_last (libhqr_queue_tile_t ** queue_tile); void libhqr_queue_tile_next (libhqr_queue_tile_t ** queue_tile); +void libhqr_queue_tile_push (libhqr_queue_tile_t ** queue_tile, int numero); +int libhqr_queue_tile_head (libhqr_queue_tile_t ** queue_tile); +int libhqr_queue_tile_pop (libhqr_queue_tile_t ** queue_tile); +void libhqr_queue_tile_delete(libhqr_queue_tile_t ** queue_tile); + END_C_DECLS #endif /* _QUEUE_H_ */ diff --git a/src/queue.c b/src/queue.c index e0ce90521153bc993c960d2e85255d2cfebc3867..322a6aacf621c100313840c8729ec0fbdfd79322 100644 --- a/src/queue.c +++ b/src/queue.c @@ -16,6 +16,7 @@ #include "queue.h" #include <stdlib.h> #include <stdio.h> +#include <assert.h> /**************************************************** * Generic functions for queue @@ -26,6 +27,62 @@ libhqr_queue_tile_t *libhqr_queue_tile_new (void) return (NULL); } +void libhqr_queue_tile_push (libhqr_queue_tile_t ** queue_tile, int numero) +{ + if (queue_tile != NULL) + { + libhqr_queue_tile_t *p_l = NULL; + libhqr_queue_tile_t *p_p = NULL; + + assert( (*queue_tile) == NULL || (*queue_tile)->prev == NULL ); + p_l = *queue_tile; + p_p = malloc (sizeof (*p_p)); + if (p_p != NULL) + { + p_p->numero = numero; + p_p->next = p_l; + p_p->prev = NULL; + if (p_l != NULL) + p_l->prev = p_p; + *queue_tile = p_p; + } + else + { + fprintf (stderr, "Memoire insuffisante\n"); + exit (EXIT_FAILURE); + } + } + return; +} + +int libhqr_queue_tile_head (libhqr_queue_tile_t ** queue_tile) +{ + if (queue_tile != NULL && *queue_tile != NULL) + { + return (*queue_tile)->numero; + } + return -1; +} + +int libhqr_queue_tile_pop (libhqr_queue_tile_t ** queue_tile) +{ + int ret = -1; + if (queue_tile != NULL) + { + libhqr_queue_tile_t *p_l = NULL; + libhqr_queue_tile_t *p_p = NULL; + + p_l = *queue_tile; + p_p = p_l->next; + if (p_p != NULL) + p_p->prev = NULL; + ret = p_l->numero; + free (p_l); + *queue_tile = p_p; + } + return (ret); +} + void libhqr_queue_tile_first (libhqr_queue_tile_t ** queue_tile) { if (queue_tile != NULL && *queue_tile != NULL) diff --git a/src/treewalk.c b/src/treewalk.c index 0fbd5f26e978ba6af94d5fe513b31829b84c90c7..d5f11c20316aaab629b98fe1c08aca53bae55984 100644 --- a/src/treewalk.c +++ b/src/treewalk.c @@ -16,6 +16,7 @@ #include "libhqr.h" #include "queue.h" #include <stdio.h> +#include <assert.h> /**************************************************** * LIBHQR_TREEWALK @@ -31,35 +32,50 @@ * Factorization step * */ +void libhqr_treewalk(const libhqr_tree_t *qrtree, int k) +{ + int tsid = -1, ttid = -1; + int p = k; + int pivot = k; + libhqr_queue_tile_t *tt = libhqr_queue_tile_new(); + libhqr_queue_tile_t *ts = libhqr_queue_tile_new(); -void libhqr_treewalk(const libhqr_tree_t *qrtree,int k){ - int pivot = qrtree->mt; - printf("%d\n" , pivot); - int p = pivot; - printf("%d\n" , qrtree->prevpiv(qrtree, k, pivot, p)); - int a,b; - libhqr_queue_tile_t *tt = libhqr_queue_tile_new(); - libhqr_queue_tile_t *ts = libhqr_queue_tile_new(); - while(p = qrtree->prevpiv(qrtree, k, pivot, p)){ - while(p = qrtree->nextpiv(qrtree, k, pivot, p)){ - if(qrtree->gettype(qrtree, k, p)){ - libhqr_queue_tile_post(&tt,p); - } - libhqr_queue_tile_post(&ts, p); - } - libhqr_queue_tile_last(&ts); - libhqr_queue_tile_last(&tt); - a = ts->numero; - printf("%d\n" , a); - b = tt->numero; - printf("%d\n" , b); - while(a != b){ - libhqr_queue_tile_get(&ts); - libhqr_queue_tile_last(&ts); - a = ts->numero; - printf("%d\n" , a); - } - libhqr_queue_tile_last(&tt); - libhqr_queue_tile_get(&tt); - } + libhqr_queue_tile_push(&tt, k); + + while( tt ) + { + /* Stack all elements killed on the way down */ + p = qrtree->prevpiv(qrtree, k, pivot, p); + while( p != qrtree->mt ) { + /* If it's a TS tile, or a TT at the bottom of the tree that kills noone */ + if( (qrtree->gettype(qrtree, k, p) == 0) || + (qrtree->prevpiv(qrtree, k, p, p) != qrtree->mt) ) + { + libhqr_queue_tile_push(&tt,p); + printf("PUSH TT: %d\n", p); + } + libhqr_queue_tile_push(&ts, p); + printf("PUSH TS: %d\n", p); + p = qrtree->prevpiv(qrtree, k, pivot, p); + assert( p != -1 ); + } + + tsid = libhqr_queue_tile_head(&ts); + ttid = libhqr_queue_tile_pop(&tt); + + /* Unstack all element killed by TS, or by TT and already discovered */ + while(tsid != -1 && tsid != ttid) { + printf( "TS=%d, TT=%d\n", tsid, ttid ); + + tsid = libhqr_queue_tile_pop(&ts); + printf("POP TS: %d\n", tsid); + printf("Call function on (%d, %d)\n", + qrtree->currpiv(qrtree, k, tsid), tsid ); + tsid = libhqr_queue_tile_head(&ts); + } + pivot = p = ttid; + } + + assert(ts == NULL); + assert(tt == NULL); } diff --git a/testings/testing_treewalk.c b/testings/testing_treewalk.c index 2224a9acbdb1973b23712b2f06917621e96509f9..7a0598435c6d64a433717cea211aea8b1da0c2b0 100644 --- a/testings/testing_treewalk.c +++ b/testings/testing_treewalk.c @@ -27,16 +27,18 @@ main(int argc, char ** argv) * Test treewalk for HQR trees */ matrix.nodes = 1; - matrix.p = 1; - matrix.mt = 4; - matrix.nt = 13; + matrix.p = 1; + matrix.mt = 8; + matrix.nt = 4; int matrix2[matrix.mt][matrix.nt]; - libhqr_hqr_init( &qrtree, LIBHQR_QR, &matrix, -1 , -1 , -1 , -1, 0, 0); + + libhqr_hqr_init( &qrtree, LIBHQR_QR, &matrix, LIBHQR_FIBONACCI_TREE, LIBHQR_FLAT_TREE, 1, 1, 0, 0); + minMN = libhqr_imin(matrix.mt, matrix.nt ); rc = libhqr_tree_check( &matrix, &qrtree ); printf("%d\n", rc); for (k=0; k<minMN; k++) { - libhqr_treewalk( &qrtree, k); + libhqr_treewalk( &qrtree, k ); } libhqr_hqr_finalize( &qrtree ); }