summaryrefslogtreecommitdiff
path: root/isl_mat.c
diff options
context:
space:
mode:
authorSven Verdoolaege <skimo@kotnet.org>2009-02-11 19:22:36 +0100
committerSven Verdoolaege <skimo@kotnet.org>2009-02-15 23:47:03 +0100
commit8c66b5046a36b0dcff0a012064967b97ebc3b3e2 (patch)
tree355e84d6f98cd478fe1ea1e0d0456cb24627e391 /isl_mat.c
parente6deb2c609acf3386919101684738088361b36d7 (diff)
downloadisl-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.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/isl_mat.c b/isl_mat.c
index bf217327..4663d42b 100644
--- a/isl_mat.c
+++ b/isl_mat.c
@@ -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]);
+}