Mentions légales du service

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

Merge branch 'treewalk_update' into 'master'

treewalk update

See merge request !8
parents cc0b160a 95f6f838
No related branches found
No related tags found
1 merge request!8treewalk update
...@@ -226,10 +226,11 @@ void libhqr_matrix_finalize(libhqr_tree_t *qrtree); ...@@ -226,10 +226,11 @@ void libhqr_matrix_finalize(libhqr_tree_t *qrtree);
* function for drawing the tree * function for drawing the tree
*/ */
void libhqr_treewalk(const libhqr_tree_t *qrtree,int k, int *tiles, FILE *file); void libhqr_treewalk(const libhqr_tree_t *qrtree, int k, int *tiles);
void draw_rectangle(int k, int p, int m, int *tiles, FILE *file); void draw_rectangle(int k, int p, int m, int step_m, FILE *file);
void draw_horizontal_line(int k, int p, int m, int *tiles, FILE *file); void draw_lines(const libhqr_tree_t *qrtree, int k, int *tiles, int *step, FILE *file);
void draw_vertical_line(int k, int p, int m, int *tiles, FILE *file); void draw_horizontal_line(int k, int p, int m, int step_p, int step_m, FILE *file);
void draw_vertical_line(int k, int p, int m, int step_m, FILE *file);
void libhqr_print_tree(const libhqr_tree_t *qrtree, libhqr_tiledesc_t *matrix); void libhqr_print_tree(const libhqr_tree_t *qrtree, libhqr_tiledesc_t *matrix);
/* /*
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
#include <string.h> #include <string.h>
/* /*
* Common prameters to the 2 following functions: * Common prameters to the 3 following functions:
* k - Factorization step for the color * k - Factorization step for the color
* p - annihilator * p - annihilator
* m - tile eliminated * m - tile eliminated
...@@ -31,38 +31,63 @@ ...@@ -31,38 +31,63 @@
* tiles - table stocking the tiles * tiles - table stocking the tiles
*/ */
void draw_horizontal_line(int k, int p, int m, int *tiles, FILE *file){ void draw_horizontal_line(int k, int p, int m, int step_p, int step_m, FILE *file){
int y, ordinate1, ordinate2, absciss1, absciss2, absciss3, absciss4; int yp, ym;
ordinate1 = SIZE + SIZE * m; int x, xp, xm;
ordinate2 = SIZE + SIZE * p;
absciss1 = (SIZE + (SIZE / 4)) + SIZE * tiles[m]; /* Row of the tiles */
absciss3 = (SIZE + (SIZE / 4)) + SIZE * tiles[p]; ym = SIZE + SIZE * m;
/* Increasing the step */ yp = SIZE + SIZE * p;
y = libhqr_imax(tiles[m], tiles[p]) + 1;
tiles[m] = tiles[p] = y; /* Starting position of the tiles */
absciss2 = (SIZE + (SIZE / 4)) + SIZE * tiles[m]; xm = (SIZE + (SIZE / 4)) + SIZE * step_m;
absciss4 = (SIZE + (SIZE / 4)) + SIZE * tiles[p]; xp = (SIZE + (SIZE / 4)) + SIZE * step_p;
libhqr_drawline( absciss1, ordinate1, absciss2, ordinate1, k, file);
libhqr_drawline( absciss3, ordinate2, absciss4, ordinate2, k, file); /* Final position of the tiles */
x = libhqr_imax(step_m, step_p) + 1;
x = (SIZE + (SIZE / 4)) + SIZE * x;
libhqr_drawline( xm, ym, x, ym, k, file );
libhqr_drawline( xp, yp, x, yp, k, file );
} }
void draw_vertical_line(int k, int p, int m, int *tiles, FILE *file){ void draw_vertical_line(int k, int p, int m, int step_m, FILE *file){
int absciss, ordinate1, ordinate2; int absciss, ym, yp;
absciss = SIZE + SIZE * tiles[m]; absciss = SIZE + SIZE * step_m;
ordinate1 = SIZE + SIZE * m; ym = SIZE + SIZE * m;
ordinate2 = SIZE + SIZE * p; yp = SIZE + SIZE * p;
libhqr_drawline(absciss, ordinate1, absciss, ordinate2, k, file); libhqr_drawline(absciss, ym, absciss, yp, k, file);
} }
void draw_rectangle(int k, int p, int m, int *tiles, FILE *file){ void draw_rectangle(int k, int p, int m, int step_m, FILE *file){
int absciss, ordinate; int absciss, ordinate;
absciss = ((SIZE * 3) /4) + SIZE * tiles[m]; absciss = ((SIZE * 3) /4) + SIZE * step_m;
ordinate = ((SIZE * 3) /4) + SIZE * m; ordinate = ((SIZE * 3) /4) + SIZE * m;
libhqr_drawTS(absciss, ordinate, WIDTH, HEIGHT, k, file); libhqr_drawTS(absciss, ordinate, WIDTH, HEIGHT, k, file);
ordinate = ((SIZE * 3) /4) + SIZE * p; ordinate = ((SIZE * 3) /4) + SIZE * p;
libhqr_drawTT(absciss, ordinate, WIDTH, HEIGHT, k, file); libhqr_drawTT(absciss, ordinate, WIDTH, HEIGHT, k, file);
} }
void draw_lines(const libhqr_tree_t *qrtree, int k, int *tiles, int *step, FILE *file){
int i, m, p, tmp;
/* Get order for step k */
libhqr_treewalk(qrtree, k, tiles);
/* Draw lines */
for(i = k; i < (qrtree->mt-1); i++){
m = tiles[i];
p = qrtree->currpiv(qrtree, k, m);
draw_horizontal_line(k, p, m, step[p], step[m], file);
tmp = libhqr_imax( step[p], step[m] ) + 1;
step[m] = tmp;
step[p] = tmp;
draw_vertical_line(k, p, m, tmp, file);
}
}
/**************************************************** /****************************************************
* LIBHQR_TREEWALK * LIBHQR_TREEWALK
***************************************************/ ***************************************************/
...@@ -77,17 +102,15 @@ void draw_rectangle(int k, int p, int m, int *tiles, FILE *file){ ...@@ -77,17 +102,15 @@ void draw_rectangle(int k, int p, int m, int *tiles, FILE *file){
* Factorization step * Factorization step
* *
* @param[in] tiles * @param[in] tiles
* Table stocking the tiles and their step * Table stocking the tiles and their step in the order they are killed
*
* @param[in] file
* File where the tree is drawn
* *
*/ */
void libhqr_treewalk(const libhqr_tree_t *qrtree, int k, int *tiles, FILE *file) void libhqr_treewalk(const libhqr_tree_t *qrtree, int k, int *tiles)
{ {
int tsid = -1, ttid = -1; int tsid = -1, ttid = -1;
int p = k; int p = k;
int pivot = k; int pivot = k;
int m = k;
libhqr_queue_tile_t *tt = libhqr_queue_tile_new(); libhqr_queue_tile_t *tt = libhqr_queue_tile_new();
libhqr_queue_tile_t *ts = libhqr_queue_tile_new(); libhqr_queue_tile_t *ts = libhqr_queue_tile_new();
libhqr_queue_tile_push(&tt, k); libhqr_queue_tile_push(&tt, k);
...@@ -121,13 +144,15 @@ void libhqr_treewalk(const libhqr_tree_t *qrtree, int k, int *tiles, FILE *file) ...@@ -121,13 +144,15 @@ void libhqr_treewalk(const libhqr_tree_t *qrtree, int k, int *tiles, FILE *file)
/* printf("POP TS: %d\n", tsid); */ /* printf("POP TS: %d\n", tsid); */
/* printf("Call function on (%d, %d)\n", /* printf("Call function on (%d, %d)\n",
qrtree->currpiv(qrtree, k, tsid), tsid ); */ qrtree->currpiv(qrtree, k, tsid), tsid ); */
draw_horizontal_line(k, qrtree->currpiv(qrtree, k, tsid), tsid, tiles, file); assert(m < (qrtree->mt-1));
draw_vertical_line(k, qrtree->currpiv(qrtree, k, tsid), tsid, tiles, file); tiles[m] = tsid;
m++;
tsid = libhqr_queue_tile_head(&ts); tsid = libhqr_queue_tile_head(&ts);
} }
pivot = p = ttid; pivot = p = ttid;
} }
assert(m == (qrtree->mt-1));
assert(ts == NULL); assert(ts == NULL);
assert(tt == NULL); assert(tt == NULL);
} }
...@@ -137,21 +162,28 @@ void libhqr_treewalk(const libhqr_tree_t *qrtree, int k, int *tiles, FILE *file) ...@@ -137,21 +162,28 @@ void libhqr_treewalk(const libhqr_tree_t *qrtree, int k, int *tiles, FILE *file)
***************************************************/ ***************************************************/
void libhqr_print_tree(const libhqr_tree_t *qrtree, libhqr_tiledesc_t *matrix){ void libhqr_print_tree(const libhqr_tree_t *qrtree, libhqr_tiledesc_t *matrix){
int maxMN, minMN, k, i; int maxMN, minMN, k, i, step_m;
int *tiles; int *tiles;
int *step;
FILE *file; FILE *file;
maxMN = libhqr_imax(matrix->mt, matrix->nt ); maxMN = libhqr_imax(matrix->mt, matrix->nt );
minMN = libhqr_imin(matrix->mt, matrix->nt ); minMN = libhqr_imin(matrix->mt, matrix->nt );
tiles = (int*)malloc(maxMN*sizeof(int)); tiles = (int*)malloc(maxMN*sizeof(int));
memset( tiles, 0, maxMN*sizeof(int) ); memset( tiles, 0, maxMN*sizeof(int) );
step = (int*) malloc( qrtree->mt * sizeof(int) );
memset( step, 0, qrtree->mt * sizeof(int) );
file = fopen("tree.svg","w+"); file = fopen("tree.svg","w+");
libhqr_writeheader(file); libhqr_writeheader(file);
for (k = 0; k < minMN; k++){ for (k = 0; k < minMN; k++){
/* Drawing the lines */ /* Drawing the lines */
libhqr_treewalk(qrtree, k, tiles, file); draw_lines(qrtree, k, tiles, step, file);
/* Drawing the rectangles */ /* Drawing the rectangles */
for (i = k + 1; i < maxMN; i++){ for (i = k + 1; i < maxMN; i++){
draw_rectangle(k, qrtree->currpiv(qrtree, k, i), i, tiles, file); draw_rectangle(k, qrtree->currpiv(qrtree, k, i), i, step[i], file);
} }
} }
libhqr_writeend(file); libhqr_writeend(file);
......
...@@ -38,7 +38,7 @@ main(int argc, char ** argv) ...@@ -38,7 +38,7 @@ main(int argc, char ** argv)
libhqr_hqr_init( &qrtree, LIBHQR_QR, &matrix, llvl, hlvl, qr_a, qr_p, domino, tsrr ); libhqr_hqr_init( &qrtree, LIBHQR_QR, &matrix, llvl, hlvl, qr_a, qr_p, domino, tsrr );
libhqr_print_tree( &qrtree, &matrix ); libhqr_print_tree( &qrtree, &matrix );
libhqr_hqr_finalize( &qrtree ); libhqr_matrix_finalize( &qrtree );
return 1; return 1;
} }
...@@ -38,7 +38,7 @@ main(int argc, char ** argv) ...@@ -38,7 +38,7 @@ main(int argc, char ** argv)
libhqr_systolic_init( &qrtree, LIBHQR_QR, &matrix, P, Q ); libhqr_systolic_init( &qrtree, LIBHQR_QR, &matrix, P, Q );
libhqr_print_tree( &qrtree, &matrix ); libhqr_print_tree( &qrtree, &matrix );
libhqr_systolic_finalize( &qrtree ); libhqr_matrix_finalize( &qrtree );
return 1; return 1;
} }
...@@ -33,6 +33,6 @@ main(int argc, char ** argv) ...@@ -33,6 +33,6 @@ main(int argc, char ** argv)
matrix.nt = 1; matrix.nt = 1;
libhqr_hqr_init( &qrtree, LIBHQR_QR, &matrix, 0, 0, 1, 3, 0, 0); libhqr_hqr_init( &qrtree, LIBHQR_QR, &matrix, 0, 0, 1, 3, 0, 0);
rc = libhqr_tree_check( &matrix, &qrtree ); rc = libhqr_tree_check( &matrix, &qrtree );
libhqr_hqr_finalize( &qrtree ); libhqr_matrix_finalize( &qrtree );
return 1; return 1;
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment