Implement binary emitter for fpush.
[libfirm] / ir / adt / hungarian.c
index 05910a9..26c4fe5 100644 (file)
@@ -29,9 +29,7 @@
  * @brief   Solving the Minimum Assignment Problem using the Hungarian Method.
  * @version $Id$
  */
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include "config.h"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -51,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 */
@@ -60,12 +57,6 @@ 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) {
        int i, j;
 
@@ -80,18 +71,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 = xmalloc(sizeof(*p));
-
-       memset(p, 0, sizeof(p[0]));
+       hungarian_problem_t *p = XMALLOCZ(hungarian_problem_t);
 
        FIRM_DBG_REGISTER(p->dbg, "firm.hungarian");
 
@@ -106,7 +95,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;
 
        /*
@@ -122,9 +110,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;
 }
@@ -207,15 +195,15 @@ int hungarian_solve(hungarian_problem_t* p, int *assignment, int *final_cost, in
        m    = p->num_rows;
        n    = p->num_cols;
 
-       col_mate     = xcalloc(p->num_rows, sizeof(col_mate[0]));
-       unchosen_row = xcalloc(p->num_rows, sizeof(unchosen_row[0]));
-       row_dec      = xcalloc(p->num_rows, sizeof(row_dec[0]));
-       slack_row    = xcalloc(p->num_rows, sizeof(slack_row[0]));
+       col_mate     = XMALLOCNZ(int, p->num_rows);
+       unchosen_row = XMALLOCNZ(int, p->num_rows);
+       row_dec      = XMALLOCNZ(int, p->num_rows);
+       slack_row    = XMALLOCNZ(int, p->num_rows);
 
-       row_mate     = xcalloc(p->num_cols, sizeof(row_mate[0]));
-       parent_row   = xcalloc(p->num_cols, sizeof(parent_row[0]));
-       col_inc      = xcalloc(p->num_cols, sizeof(col_inc[0]));
-       slack        = xcalloc(p->num_cols, sizeof(slack[0]));
+       row_mate     = XMALLOCNZ(int, p->num_cols);
+       parent_row   = XMALLOCNZ(int, p->num_cols);
+       col_inc      = XMALLOCNZ(int, p->num_cols);
+       slack        = XMALLOCNZ(int, p->num_cols);
 
        memset(assignment, -1, m * sizeof(assignment[0]));
 
@@ -453,7 +441,8 @@ done:
        xfree(unchosen_row);
        xfree(col_mate);
 
-       *final_cost = cost;
+       if (final_cost != NULL)
+               *final_cost = cost;
 
        return 0;
 }