X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=isl_mat.c;h=6dc9d190a4b2cef01a1438c2233571eff723987b;hb=2950a5e9d94343fc9a1edaabc36dd74d1f1439e9;hp=31bc8096e52535843c7cfd60c46f01eeee38ebd0;hpb=a26da543f020a0a4f98636a3628ea8610b76f52f;p=platform%2Fupstream%2Fisl.git diff --git a/isl_mat.c b/isl_mat.c index 31bc809..6dc9d19 100644 --- a/isl_mat.c +++ b/isl_mat.c @@ -7,9 +7,10 @@ * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium */ -#include "isl_dim.h" -#include "isl_seq.h" -#include "isl_mat.h" +#include +#include +#include +#include #include "isl_map_private.h" #include @@ -54,6 +55,7 @@ struct isl_mat *isl_mat_extend(struct isl_mat *mat, { int i; isl_int *old; + isl_int **row; if (!mat) return NULL; @@ -86,9 +88,10 @@ struct isl_mat *isl_mat_extend(struct isl_mat *mat, mat->block = isl_blk_extend(mat->ctx, mat->block, n_row * mat->max_col); if (isl_blk_is_error(mat->block)) goto error; - mat->row = isl_realloc_array(mat->ctx, mat->row, isl_int *, n_row); - if (!mat->row) + row = isl_realloc_array(mat->ctx, mat->row, isl_int *, n_row); + if (!row) goto error; + mat->row = row; for (i = 0; i < mat->n_row; ++i) mat->row[i] = mat->block.data + (mat->row[i] - old); @@ -202,6 +205,68 @@ void isl_mat_free(struct isl_mat *mat) free(mat); } +int isl_mat_rows(__isl_keep isl_mat *mat) +{ + return mat ? mat->n_row : -1; +} + +int isl_mat_cols(__isl_keep isl_mat *mat) +{ + return mat ? mat->n_col : -1; +} + +int isl_mat_get_element(__isl_keep isl_mat *mat, int row, int col, isl_int *v) +{ + if (!mat) + return -1; + if (row < 0 || row >= mat->n_row) + isl_die(mat->ctx, isl_error_invalid, "row out of range", + return -1); + if (col < 0 || col >= mat->n_col) + isl_die(mat->ctx, isl_error_invalid, "column out of range", + return -1); + isl_int_set(*v, mat->row[row][col]); + return 0; +} + +__isl_give isl_mat *isl_mat_set_element(__isl_take isl_mat *mat, + int row, int col, isl_int v) +{ + mat = isl_mat_cow(mat); + if (!mat) + return NULL; + if (row < 0 || row >= mat->n_row) + isl_die(mat->ctx, isl_error_invalid, "row out of range", + goto error); + if (col < 0 || col >= mat->n_col) + isl_die(mat->ctx, isl_error_invalid, "column out of range", + goto error); + isl_int_set(mat->row[row][col], v); + return mat; +error: + isl_mat_free(mat); + return NULL; +} + +__isl_give isl_mat *isl_mat_set_element_si(__isl_take isl_mat *mat, + int row, int col, int v) +{ + mat = isl_mat_cow(mat); + if (!mat) + return NULL; + if (row < 0 || row >= mat->n_row) + isl_die(mat->ctx, isl_error_invalid, "row out of range", + goto error); + if (col < 0 || col >= mat->n_col) + isl_die(mat->ctx, isl_error_invalid, "column out of range", + goto error); + isl_int_set_si(mat->row[row][col], v); + return mat; +error: + isl_mat_free(mat); + return NULL; +} + struct isl_mat *isl_mat_identity(struct isl_ctx *ctx, unsigned n_row) { int i; @@ -482,6 +547,7 @@ error: isl_mat_free(*U); *U = NULL; } + isl_mat_free(M); return NULL; } @@ -813,6 +879,7 @@ struct isl_mat *isl_mat_right_inverse(struct isl_mat *mat) return inv; error: isl_mat_free(mat); + isl_mat_free(inv); return NULL; } @@ -890,6 +957,8 @@ struct isl_mat *isl_mat_product(struct isl_mat *left, struct isl_mat *right) if (left->n_col == 0) { for (i = 0; i < prod->n_row; ++i) isl_seq_clr(prod->row[i], prod->n_col); + isl_mat_free(left); + isl_mat_free(right); return prod; } for (i = 0; i < prod->n_row; ++i) { @@ -1133,14 +1202,13 @@ error: return NULL; } -__isl_give isl_mat *isl_mat_add_zero_cols(__isl_take isl_mat *mat, unsigned n) +__isl_give isl_mat *isl_mat_insert_zero_cols(__isl_take isl_mat *mat, + unsigned first, unsigned n) { int i; - int first; if (!mat) return NULL; - first = mat->n_col; mat = isl_mat_insert_cols(mat, first, n); if (!mat) return NULL; @@ -1151,6 +1219,14 @@ __isl_give isl_mat *isl_mat_add_zero_cols(__isl_take isl_mat *mat, unsigned n) return mat; } +__isl_give isl_mat *isl_mat_add_zero_cols(__isl_take isl_mat *mat, unsigned n) +{ + if (!mat) + return NULL; + + return isl_mat_insert_zero_cols(mat, mat->n_col, n); +} + __isl_give isl_mat *isl_mat_insert_rows(__isl_take isl_mat *mat, unsigned row, unsigned n) { @@ -1176,6 +1252,14 @@ error: return NULL; } +__isl_give isl_mat *isl_mat_add_rows(__isl_take isl_mat *mat, unsigned n) +{ + if (!mat) + return NULL; + + return isl_mat_insert_rows(mat, mat->n_row, n); +} + void isl_mat_col_submul(struct isl_mat *mat, int dst_col, isl_int f, int src_col) { @@ -1185,6 +1269,18 @@ void isl_mat_col_submul(struct isl_mat *mat, isl_int_submul(mat->row[i][dst_col], f, mat->row[i][src_col]); } +void isl_mat_col_add(__isl_keep isl_mat *mat, int dst_col, int src_col) +{ + int i; + + if (!mat) + return; + + for (i = 0; i < mat->n_row; ++i) + isl_int_add(mat->row[i][dst_col], + mat->row[i][dst_col], 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;