X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fadt%2Fgaussseidel.c;h=572716bd980748f1087a1ff5b0b220e346015c70;hb=f85d684391adac08d54c3fdcda868e6392de2ffb;hp=5811ead7d960fa1362cb5dc117ec4f03f69d3e23;hpb=118c38b635c32482d330db6b32b99b726e95eef6;p=libfirm diff --git a/ir/adt/gaussseidel.c b/ir/adt/gaussseidel.c index 5811ead7d..572716bd9 100644 --- a/ir/adt/gaussseidel.c +++ b/ir/adt/gaussseidel.c @@ -1,9 +1,10 @@ +#include "config.h" + #include #include #include #include "xmalloc.h" #include "gaussseidel.h" -#include "firm_config.h" #include "util.h" #define MAX(x,y) ((x) > (y) ? (x) : (y)) @@ -21,37 +22,39 @@ */ #define COL_INCREASE 2 -typedef struct _col_val_t { +typedef struct col_val_t { double v; int col_idx; } col_val_t; -typedef struct _row_col_t { +typedef struct row_col_t { int c_cols; int n_cols; double diag; col_val_t *cols; } row_col_t; -struct _gs_matrix_t { +struct gs_matrix_t { int initial_col_increase; int c_rows; int n_zero_entries; ///< Upper bound on number of entries equal to 0.0 row_col_t *rows; }; -static INLINE void alloc_cols(row_col_t *row, int c_cols) { +static inline void alloc_cols(row_col_t *row, int c_cols) +{ assert(c_cols > row->c_cols); row->c_cols = c_cols; - row->cols = xrealloc(row->cols, c_cols * sizeof(*row->cols)); + row->cols = XREALLOC(row->cols, col_val_t, c_cols); } -static INLINE void alloc_rows(gs_matrix_t *m, int c_rows, int c_cols, int begin_init) { +static inline void alloc_rows(gs_matrix_t *m, int c_rows, int c_cols, int begin_init) +{ int i; assert(c_rows > m->c_rows); m->c_rows = c_rows; - m->rows = xrealloc(m->rows, c_rows * sizeof(*m->rows)); + m->rows = XREALLOC(m->rows, row_col_t, c_rows); for (i = begin_init; i < c_rows; ++i) { m->rows[i].c_cols = 0; @@ -63,9 +66,9 @@ static INLINE void alloc_rows(gs_matrix_t *m, int c_rows, int c_cols, int begin_ } } -gs_matrix_t *gs_new_matrix(int n_init_rows, int n_init_cols) { - gs_matrix_t *res = xmalloc(sizeof(*res)); - memset(res, 0, sizeof(*res)); +gs_matrix_t *gs_new_matrix(int n_init_rows, int n_init_cols) +{ + gs_matrix_t *res = XMALLOCZ(gs_matrix_t); if (n_init_rows < 16) n_init_rows = 16; res->initial_col_increase = n_init_cols; @@ -73,7 +76,8 @@ gs_matrix_t *gs_new_matrix(int n_init_rows, int n_init_cols) { return res; } -void gs_delete_matrix(gs_matrix_t *m) { +void gs_delete_matrix(gs_matrix_t *m) +{ int i; for (i = 0; i < m->c_rows; ++i) { if (m->rows[i].c_cols) @@ -84,7 +88,8 @@ void gs_delete_matrix(gs_matrix_t *m) { xfree(m); } -unsigned gs_matrix_get_n_entries(const gs_matrix_t *m) { +unsigned gs_matrix_get_n_entries(const gs_matrix_t *m) +{ int i; unsigned n_entries = 0; @@ -96,7 +101,8 @@ unsigned gs_matrix_get_n_entries(const gs_matrix_t *m) { return n_entries - m->n_zero_entries; } -int gs_matrix_get_sizeof_allocated_memory(const gs_matrix_t *m) { +int gs_matrix_get_sizeof_allocated_memory(const gs_matrix_t *m) +{ int i, n_col_val_ts = 0; for (i = 0; i < m->c_rows; ++i) n_col_val_ts += m->rows[i].c_cols; @@ -104,27 +110,30 @@ int gs_matrix_get_sizeof_allocated_memory(const gs_matrix_t *m) { return n_col_val_ts * sizeof(col_val_t) + m->c_rows * sizeof(row_col_t) + sizeof(gs_matrix_t); } -void gs_matrix_assure_row_capacity(gs_matrix_t *m, int row, int min_capacity) { +void gs_matrix_assure_row_capacity(gs_matrix_t *m, int row, int min_capacity) +{ row_col_t *the_row = &m->rows[row]; if (the_row->c_cols < min_capacity) alloc_cols(the_row, min_capacity); } -void gs_matrix_trim_row_capacities(gs_matrix_t *m) { +void gs_matrix_trim_row_capacities(gs_matrix_t *m) +{ int i; for (i = 0; i < m->c_rows; ++i) { row_col_t *the_row = &m->rows[i]; if (the_row->c_cols) { the_row->c_cols = the_row->n_cols; if (the_row->c_cols) - the_row->cols = xrealloc(the_row->cols, the_row->c_cols * sizeof(*the_row->cols)); + the_row->cols = XREALLOC(the_row->cols, col_val_t, the_row->c_cols); else xfree(the_row->cols); } } } -void gs_matrix_delete_zero_entries(gs_matrix_t *m) { +void gs_matrix_delete_zero_entries(gs_matrix_t *m) +{ int i, read_pos; for (i = 0; i < m->c_rows; ++i) { row_col_t *the_row = &m->rows[i]; @@ -139,7 +148,8 @@ void gs_matrix_delete_zero_entries(gs_matrix_t *m) { m->n_zero_entries = 0; } -void gs_matrix_set(gs_matrix_t *m, int row, int col, double val) { +void gs_matrix_set(gs_matrix_t *m, int row, int col, double val) +{ row_col_t *the_row; col_val_t *cols; int min, max, c, i; @@ -202,7 +212,8 @@ void gs_matrix_set(gs_matrix_t *m, int row, int col, double val) { assert(c>=the_row->n_cols-1 || the_row->cols[c].col_idx < the_row->cols[c+1].col_idx); } -double gs_matrix_get(const gs_matrix_t *m, int row, int col) { +double gs_matrix_get(const gs_matrix_t *m, int row, int col) +{ row_col_t *the_row; int c; @@ -215,7 +226,8 @@ double gs_matrix_get(const gs_matrix_t *m, int row, int col) { return the_row->diag != 0.0 ? 1.0 / the_row->diag : 0.0; // Search for correct column - for (c = 0; c < the_row->n_cols && the_row->cols[c].col_idx < col; ++c); + for (c = 0; c < the_row->n_cols && the_row->cols[c].col_idx < col; ++c) { + } if (c >= the_row->n_cols || the_row->cols[c].col_idx > col) return 0.0; @@ -231,7 +243,8 @@ double gs_matrix_get(const gs_matrix_t *m, int row, int col) { * * Note that the diagonal element is stored separately in this matrix implementation. * */ -double gs_matrix_gauss_seidel(const gs_matrix_t *m, double *x, int n) { +double gs_matrix_gauss_seidel(const gs_matrix_t *m, double *x, int n) +{ double res = 0.0; int r; @@ -278,10 +291,11 @@ void gs_matrix_export(const gs_matrix_t *m, double *nw, int size) } } -void gs_matrix_dump(const gs_matrix_t *m, int a, int b, FILE *out) { +void gs_matrix_dump(const gs_matrix_t *m, int a, int b, FILE *out) +{ int effective_rows = MIN(a, m->c_rows); int r, c, i; - double *elems = xmalloc(b * sizeof(*elems)); + double *elems = XMALLOCN(double, b); // The rows which have some content for (r=0; r < effective_rows; ++r) { @@ -312,17 +326,3 @@ void gs_matrix_dump(const gs_matrix_t *m, int a, int b, FILE *out) { xfree(elems); } - -void gs_matrix_self_test(int d) { - int i, o; - gs_matrix_t *m = gs_new_matrix(10, 10); - - for (i=0; i