X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fadt%2Fhungarian.c;h=57cb265c0cd8c9883ea06dd19628511227a9c31f;hb=ca21c59ea00ff05918de26952e91ac39f1589e01;hp=32f1d6879e3ccbaffa89952bf10e2cad8d0aff12;hpb=bb9f2e36362333c6635b89f5258171b06c786608;p=libfirm diff --git a/ir/adt/hungarian.c b/ir/adt/hungarian.c index 32f1d6879..57cb265c0 100644 --- a/ir/adt/hungarian.c +++ b/ir/adt/hungarian.c @@ -49,7 +49,6 @@ struct _hungarian_problem_t { int num_rows; /**< number of rows */ int num_cols; /**< number of columns */ int **cost; /**< the cost matrix */ - int width; /**< the width for cost matrix dumper */ int max_cost; /**< the maximal costs in the matrix */ int match_type; /**< PERFECT or NORMAL matching */ bitset_t *missing_left; /**< left side nodes having no edge to the right side */ @@ -58,13 +57,8 @@ struct _hungarian_problem_t { DEBUG_ONLY(firm_dbg_module_t *dbg); }; -static inline void *get_init_mem(struct obstack *obst, long sz) { - void *p = obstack_alloc(obst, sz); - memset(p, 0, sz); - return p; -} - -static void hungarian_dump_f(FILE *f, int **C, int rows, int cols, int width) { +static void hungarian_dump_f(FILE *f, int **C, int rows, int cols, int width) +{ int i, j; fprintf(f , "\n"); @@ -78,14 +72,16 @@ static void hungarian_dump_f(FILE *f, int **C, int rows, int cols, int width) { fprintf(f, "\n"); } -void hungarian_print_costmatrix(hungarian_problem_t *p) { - hungarian_dump_f(stderr, p->cost, p->num_rows, p->num_cols, p->width); +void hungarian_print_cost_matrix(hungarian_problem_t *p, int width) +{ + hungarian_dump_f(stderr, p->cost, p->num_rows, p->num_cols, width); } /** * Create the object and allocate memory for the data structures. */ -hungarian_problem_t *hungarian_new(int rows, int cols, int width, int match_type) { +hungarian_problem_t *hungarian_new(int rows, int cols, int match_type) +{ int i; hungarian_problem_t *p = XMALLOCZ(hungarian_problem_t); @@ -102,7 +98,6 @@ hungarian_problem_t *hungarian_new(int rows, int cols, int width, int match_type p->num_rows = rows; p->num_cols = cols; - p->width = width; p->match_type = match_type; /* @@ -118,9 +113,9 @@ hungarian_problem_t *hungarian_new(int rows, int cols, int width, int match_type } /* allocate space for cost matrix */ - p->cost = (int **)get_init_mem(&p->obst, rows * sizeof(p->cost[0])); + p->cost = OALLOCNZ(&p->obst, int*, rows); for (i = 0; i < p->num_rows; i++) - p->cost[i] = (int *)get_init_mem(&p->obst, cols * sizeof(p->cost[0][0])); + p->cost[i] = OALLOCNZ(&p->obst, int, cols); return p; } @@ -128,7 +123,8 @@ hungarian_problem_t *hungarian_new(int rows, int cols, int width, int match_type /** * Prepare the cost matrix. */ -void hungarian_prepare_cost_matrix(hungarian_problem_t *p, int mode) { +void hungarian_prepare_cost_matrix(hungarian_problem_t *p, int mode) +{ int i, j; if (mode == HUNGARIAN_MODE_MAXIMIZE_UTIL) { @@ -148,7 +144,8 @@ void hungarian_prepare_cost_matrix(hungarian_problem_t *p, int mode) { /** * Set cost[left][right] to cost. */ -void hungarian_add(hungarian_problem_t *p, int left, int right, int cost) { +void hungarian_add(hungarian_problem_t *p, int left, int right, int cost) +{ assert(p->num_rows > left && "Invalid row selected."); assert(p->num_cols > right && "Invalid column selected."); assert(cost >= 0); @@ -165,7 +162,8 @@ void hungarian_add(hungarian_problem_t *p, int left, int right, int cost) { /** * Set cost[left][right] to 0. */ -void hungarian_remv(hungarian_problem_t *p, int left, int right) { +void hungarian_remv(hungarian_problem_t *p, int left, int right) +{ assert(p->num_rows > left && "Invalid row selected."); assert(p->num_cols > right && "Invalid column selected."); @@ -180,7 +178,8 @@ void hungarian_remv(hungarian_problem_t *p, int left, int right) { /** * Frees all allocated memory. */ -void hungarian_free(hungarian_problem_t* p) { +void hungarian_free(hungarian_problem_t* p) +{ obstack_free(&p->obst, NULL); xfree(p); } @@ -188,7 +187,8 @@ void hungarian_free(hungarian_problem_t* p) { /** * Do the assignment. */ -int hungarian_solve(hungarian_problem_t* p, int *assignment, int *final_cost, int cost_threshold) { +int hungarian_solve(hungarian_problem_t* p, int *assignment, int *final_cost, int cost_threshold) +{ int i, j, m, n, k, l, s, t, q, unmatched, cost; int *col_mate; int *row_mate; @@ -275,11 +275,11 @@ row_done: ; goto done; unmatched = t; - while (1) { + for (;;) { DBG((p->dbg, LEVEL_1, "Matched %d rows.\n", m - t)); q = 0; - while (1) { + for (;;) { while (q < t) { /* Begin explore node q of the forest 19 */ k = unchosen_row[q]; @@ -351,7 +351,7 @@ row_done: ; breakthru: /* Begin update the matching 20 */ DBG((p->dbg, LEVEL_1, "Breakthrough at node %d of %d.\n", q, t)); - while (1) { + for (;;) { j = col_mate[k]; col_mate[k] = l; row_mate[l] = k; @@ -449,7 +449,8 @@ done: xfree(unchosen_row); xfree(col_mate); - *final_cost = cost; + if (final_cost != NULL) + *final_cost = cost; return 0; }