X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fadt%2Fgaussseidel.c;h=572716bd980748f1087a1ff5b0b220e346015c70;hb=9de6d983ab8fddcf4b3b1b29dab74e87ebb8d72b;hp=51f215fc7d2bdfc67a1a0566d1fdf22a7f318f3c;hpb=e07b61c6ed5d198a484761f8a40a4f26520d964d;p=libfirm diff --git a/ir/adt/gaussseidel.c b/ir/adt/gaussseidel.c index 51f215fc7..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,32 +22,34 @@ */ #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, 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); @@ -63,7 +66,8 @@ 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 *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; @@ -72,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) @@ -83,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; @@ -95,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; @@ -103,13 +110,15 @@ 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]; @@ -123,7 +132,8 @@ void gs_matrix_trim_row_capacities(gs_matrix_t *m) { } } -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]; @@ -138,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; @@ -201,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; @@ -214,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; @@ -230,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; @@ -277,7 +291,8 @@ 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 = XMALLOCN(double, b); @@ -311,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