Mentions légales du service

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

Merge branch 'treedrawing_svg' into 'master'

Treewalk

See merge request !4
parents 2d3311d1 70f4d73f
No related branches found
No related tags found
1 merge request!4Treewalk
......@@ -3,15 +3,16 @@ CFLAGS = -Iinclude -Wall -g3
LDFLAGS = -lm
LIBHQR=src/libhqr.a
default: testing_pivgen testing_treewalk
default: testing_pivgen testing_treewalk testing_treedraw
src/queue.o: include/queue.h include/common.h
src/libhqr.o: include/common.h include/libhqr.h
src/libhqr_dbg.o: include/common.h include/libhqr.h
src/libhqr_systolic.o: include/common.h include/libhqr.h
src/treewalk.o: include/common.h include/libhqr.h include/queue.h
src/treedraw.o: include/common.h include/libhqr.h include/libdraw.h
$(LIBHQR): src/libhqr.o src/libhqr_dbg.o src/libhqr_systolic.o src/treewalk.o src/queue.o
$(LIBHQR): src/libhqr.o src/libhqr_dbg.o src/libhqr_systolic.o src/treewalk.o src/queue.o src/treedraw.o
ar cr $@ $^
%.o : %.c
......@@ -23,6 +24,9 @@ testing_pivgen : testings/testing_pivgen.o ${LIBHQR}
testing_treewalk : testings/testing_treewalk.c ${LIBHQR}
$(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
testing_treedraw : testings/testing_treedraw.o ${LIBHQR}
$(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
clean :
rm -f include/*~
rm -f src/*.o src/*~
......@@ -30,4 +34,4 @@ clean :
cleanall: clean
rm -f ${LIBHQR}
rm -f testing_pivgen testing_treewalk
rm -f testing_pivgen testing_treewalk testing_treedraw tree.svg
/**
*
* @file libdraw.h
*
* Header file for all the functions of drawing.
*
* @copyright 2017 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
* Univ. Bordeaux. All rights reserved.
*
* @version 1.0.0
* @author Raphael Boucherie
* @author Mathieu Faverge
* @date 2017-04-04
*
**/
#ifndef _LIBDRAW_H_
#define _LIBDRAW_H_
#include <common.h>
BEGIN_C_DECLS
/*
* Clobal array for color
*/
extern char *color[4];
/*
* function for treedraw
*/
void libhqr_writeheader(FILE *tree);
void libhqr_writeend(FILE *tree);
void libhqr_drawTT(int x, int y, int w, int h, int k, FILE *tree);
void libhqr_drawTS(int x, int y, int w, int h, int k, FILE *tree);
void libhqr_drawline(int x1, int y1, int x2, int y2, FILE *tree);
END_C_DECLS
#endif /* _LIBDRAW_H_ */
......@@ -20,20 +20,17 @@
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;
} libhqr_queue_tile_t;
libhqr_queue_tile_t *libhqr_queue_tile_new (void);
void libhqr_queue_tile_post (libhqr_queue_tile_t ** queue_tile, int numero);
int libhqr_queue_tile_get (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);
void libhqr_queue_tile_first (libhqr_queue_tile_t ** queue_tile);
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);
END_C_DECLS
......
......@@ -16,6 +16,7 @@
#include "queue.h"
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
/****************************************************
* Generic functions for queue
......@@ -26,48 +27,14 @@ libhqr_queue_tile_t *libhqr_queue_tile_new (void)
return (NULL);
}
void libhqr_queue_tile_first (libhqr_queue_tile_t ** queue_tile)
{
if (queue_tile != NULL && *queue_tile != NULL)
{
while ((*queue_tile)->prev != NULL)
libhqr_queue_tile_prev (queue_tile);
}
return;
}
void libhqr_queue_tile_prev (libhqr_queue_tile_t ** queue_tile)
{
if (queue_tile != NULL && *queue_tile != NULL)
*queue_tile = (*queue_tile)->prev;
return;
}
void libhqr_queue_tile_last (libhqr_queue_tile_t ** queue_tile)
{
if (queue_tile != NULL && *queue_tile != NULL)
{
while ((*queue_tile)->next != NULL)
libhqr_queue_tile_next (queue_tile);
}
return;
}
void libhqr_queue_tile_next (libhqr_queue_tile_t ** queue_tile)
{
if (queue_tile != NULL && *queue_tile != NULL)
*queue_tile = (*queue_tile)->next;
return;
}
void libhqr_queue_tile_post (libhqr_queue_tile_t ** queue_tile, int numero)
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;
libhqr_queue_tile_first (queue_tile);
assert( (*queue_tile) == NULL || (*queue_tile)->prev == NULL );
p_l = *queue_tile;
p_p = malloc (sizeof (*p_p));
if (p_p != NULL)
......@@ -88,35 +55,31 @@ void libhqr_queue_tile_post (libhqr_queue_tile_t ** queue_tile, int numero)
return;
}
int libhqr_queue_tile_get (libhqr_queue_tile_t ** queue_tile)
int libhqr_queue_tile_head (libhqr_queue_tile_t ** queue_tile)
{
int ret;
if (queue_tile != NULL && *queue_tile != NULL)
{
libhqr_queue_tile_t *p_l = NULL;
libhqr_queue_tile_t *p_p = NULL;
libhqr_queue_tile_last (queue_tile);
p_l = *queue_tile;
if (p_l != NULL)
p_p = p_l->prev;
ret = p_l->numero;
free (p_l);
p_l = NULL;
if (p_p != NULL)
p_p->next = NULL;
*queue_tile = p_p;
return (*queue_tile)->numero;
}
return (ret);
return -1;
}
void libhqr_queue_tile_delete (libhqr_queue_tile_t ** queue_tile)
int libhqr_queue_tile_pop (libhqr_queue_tile_t ** queue_tile)
{
if (queue_tile != NULL && *queue_tile != NULL)
{
while (*queue_tile != NULL)
libhqr_queue_tile_get (queue_tile);
}
return;
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);
}
/**
*
* @file treedraw.c
*
* All the functions required for drawing tree are here.
*
* @copyright 2017 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
* Univ. Bordeaux. All rights reserved.
*
* @version 1.0.0
* @author Raphael Boucherie
* @author Mathieu Faverge
* @date 2017-04-04
*
*/
#include <string.h>
#include <stdio.h>
#include "libdraw.h"
/*
* Global array for color
*/
char *color[4] = {"red", "blue", "green", "purple"};
/*
* functions writing in the svg file
*/
void libhqr_writeheader(FILE *tree){
if(fprintf(tree, "<?xml version=\"1.0\" standalone=\"no\"?>\n"
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \n \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n"
"<svg width=\"2000\" height=\"2000\" version=\"1.1\" \n xmlns=\"http://www.w3.org/2000/svg\">\n") <0)
return;
}
/*
* Common prameters to the 2 following functions:
* x - Parameter x for the x-axis
* y - Parameter y for the y-axis
* w - Parameter w for the width
* h - Parameter h for the height
* k - Factorization step for the color
*/
void libhqr_drawTT(int x, int y, int w, int h, int k, FILE *tree){
if(fprintf(tree,"<rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" fill=\"%s\" /> \n", x, y, w, h, color[k%4]) < 0 )
return;
}
void libhqr_drawTS(int x, int y, int w, int h, int k, FILE *tree){
if(fprintf(tree,"<rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" fill=\"%s\" /> \n", x, y, w, h, color[k%4]) < 0 )
return;
int x2 = x + (w / 4);
int y2 = y + (h / 4);
int w2 = (w / 2);
int h2 = (h / 2);
if(fprintf(tree,"<rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" fill =\"white\"/> \n", x2, y2, w2, h2) < 0 ) return;
}
void libhqr_drawline(int x1, int y1, int x2, int y2, FILE *tree){
if(fprintf(tree,"<line x1=\"%d\" y1=\"%d\" x2=\"%d\" y2=\"%d\" style=\"fill:none;stroke:black;stroke-width:2px;\"/> \n", x1, y1, x2, y2) < 0 ) return;
}
void libhqr_writeend(FILE *tree){
if(fprintf(tree, "</svg>") < 0) return;
}
......@@ -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);
}
/**
*
* @file testting_treedraw.c
*
* Testing file for drawing functions and drawing tree
*
* @copyright 2017 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
* Univ. Bordeaux. All rights reserved.
*
* @version 1.0.0
* @author Raphael Boucherie
* @author Mathieu Faverge
* @date 2017-04-04
*
*/
#include <stdio.h>
#include <string.h>
#include "libdraw.h"
#define WIDTH 50
#define HEIGHT 50
int
main(int argc, char ** argv)
{
FILE *tree = fopen("tree.svg","w+");
int x,y,i,j;
libhqr_writeheader(tree);
libhqr_drawline(125,100,125,800,tree);
for (i = 1; i < 5; i++){
for (j = 1; j < 9; j++){
x = 100*i;
y = 100*j;
libhqr_drawTS(x,y,WIDTH,HEIGHT,3,tree);
}
}
libhqr_writeend(tree);
return 1;
}
......@@ -23,20 +23,19 @@ main(int argc, char ** argv)
libhqr_tree_t qrtree;
libhqr_tiledesc_t matrix;
int minMN, k, rc ;
/*
* Test treewalk for HQR trees
*/
matrix.nodes = 1;
matrix.p = 1;
matrix.mt = 4;
matrix.nt = 13;
libhqr_hqr_init( &qrtree, LIBHQR_QR, &matrix, -1 , -1 , -1 , -1, 0, 0);
matrix.p = 1;
matrix.mt = 8;
matrix.nt = 4;
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 );
}
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