diff options
author | Sven Verdoolaege <skimo@kotnet.org> | 2009-02-11 19:22:36 +0100 |
---|---|---|
committer | Sven Verdoolaege <skimo@kotnet.org> | 2009-02-15 23:47:03 +0100 |
commit | 8c66b5046a36b0dcff0a012064967b97ebc3b3e2 (patch) | |
tree | 355e84d6f98cd478fe1ea1e0d0456cb24627e391 /isl_mat.c | |
parent | e6deb2c609acf3386919101684738088361b36d7 (diff) | |
download | isl-8c66b5046a36b0dcff0a012064967b97ebc3b3e2.tar.gz isl-8c66b5046a36b0dcff0a012064967b97ebc3b3e2.tar.bz2 isl-8c66b5046a36b0dcff0a012064967b97ebc3b3e2.zip |
fix serious error in isl_mat_parameter_compression
The old version would sometimes remove valid solutions.
Since isl_mat_parameter_compression is used during simplification
on practically any set containing existentially quantified variables
involved in equalities, any such set could get corrupted.
Diffstat (limited to 'isl_mat.c')
-rw-r--r-- | isl_mat.c | 27 |
1 files changed, 27 insertions, 0 deletions
@@ -653,6 +653,23 @@ error: return NULL; } +struct isl_mat *isl_mat_transpose(struct isl_ctx *ctx, struct isl_mat *mat) +{ + int i, j; + + mat = isl_mat_cow(ctx, mat); + if (!mat) + return NULL; + isl_assert(ctx, mat->n_col == mat->n_row, goto error); + for (i = 0; i < mat->n_row; ++i) + for (j = i + 1; j < mat->n_col; ++j) + isl_int_swap(mat->row[i][j], mat->row[j][i]); + return mat; +error: + isl_mat_free(ctx, mat); + return NULL; +} + struct isl_mat *isl_mat_swap_rows(struct isl_ctx *ctx, struct isl_mat *mat, unsigned i, unsigned j) { @@ -838,6 +855,7 @@ struct isl_mat *isl_mat_drop_cols(struct isl_ctx *ctx, struct isl_mat *mat, { int r; + mat = isl_mat_cow(ctx, mat); if (!mat) return NULL; @@ -855,6 +873,7 @@ struct isl_mat *isl_mat_drop_rows(struct isl_ctx *ctx, struct isl_mat *mat, { int r; + mat = isl_mat_cow(ctx, mat); if (!mat) return NULL; @@ -873,3 +892,11 @@ void isl_mat_col_submul(struct isl_mat *mat, for (i = 0; i < mat->n_row; ++i) isl_int_submul(mat->row[i][dst_col], f, mat->row[i][src_col]); } + +void isl_mat_col_mul(struct isl_mat *mat, int dst_col, isl_int f, int src_col) +{ + int i; + + for (i = 0; i < mat->n_row; ++i) + isl_int_mul(mat->row[i][dst_col], f, mat->row[i][src_col]); +} |