X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=isl_map_piplib.c;h=165fdaebb4bb39699e75ce443da1bcb0c3ff5b1e;hb=63fb8a7f484648c3caa25351c8c94ac2395ec563;hp=c5bacc1587abae5a847101648fcbd9e82b7d880e;hpb=7635ee8ae7ea70cef81e389155ef7e1694af0c09;p=platform%2Fupstream%2Fisl.git diff --git a/isl_map_piplib.c b/isl_map_piplib.c index c5bacc1..165fdae 100644 --- a/isl_map_piplib.c +++ b/isl_map_piplib.c @@ -1,11 +1,20 @@ -#include "isl_set.h" -#include "isl_map.h" -#include "isl_mat.h" -#include "isl_seq.h" +/* + * Copyright 2008-2009 Katholieke Universiteit Leuven + * + * Use of this software is governed by the MIT license + * + * Written by Sven Verdoolaege, K.U.Leuven, Departement + * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium + */ + +#include +#include +#include +#include +#include +#include #include "isl_piplib.h" #include "isl_map_piplib.h" -#include "isl_map_private.h" -#include "isl_equalities.h" static void copy_values_from(isl_int *dst, Entier *src, unsigned n) { @@ -223,7 +232,7 @@ static struct isl_map *scan_quast_r(struct scan_data *data, PipQuast *q, if (add_equality(data->ctx, bmap, data->pos, j, l->vector) < 0) goto error; - map = isl_map_add(map, isl_basic_map_copy(bmap)); + map = isl_map_add_basic_map(map, isl_basic_map_copy(bmap)); if (isl_basic_map_free_equality(bmap, n_out)) goto error; } else if (data->rest) { @@ -232,7 +241,7 @@ static struct isl_map *scan_quast_r(struct scan_data *data, PipQuast *q, bset = isl_basic_set_drop_dims(bset, n_in, n_out); if (!bset) goto error; - *data->rest = isl_set_add(*data->rest, bset); + *data->rest = isl_set_add_basic_set(*data->rest, bset); } if (isl_basic_map_free_inequality(bmap, 2*(bmap->n_div - old_n_div))) @@ -247,11 +256,11 @@ error: /* * Returns a map of dimension "keep_dim" with "context" as domain and - * as range the first "isl_dim_size(keep_dim, isl_dim_out)" variables + * as range the first "isl_space_dim(keep_dim, isl_dim_out)" variables * in the quast lists. */ static struct isl_map *isl_map_from_quast(struct isl_ctx *ctx, PipQuast *q, - struct isl_dim *keep_dim, + isl_space *keep_dim, struct isl_basic_set *context, struct isl_set **rest) { @@ -261,7 +270,7 @@ static struct isl_map *isl_map_from_quast(struct isl_ctx *ctx, PipQuast *q, int n_sol, n_nosol; struct scan_data data; struct isl_map *map = NULL; - struct isl_dim *dims; + isl_space *dims; unsigned nparam; unsigned dim; unsigned keep; @@ -276,7 +285,7 @@ static struct isl_map *isl_map_from_quast(struct isl_ctx *ctx, PipQuast *q, dim = isl_basic_set_n_dim(context); nparam = isl_basic_set_n_param(context); - keep = isl_dim_size(keep_dim, isl_dim_out); + keep = isl_space_dim(keep_dim, isl_dim_out); pip_param = nparam + dim; max_depth = 0; @@ -287,19 +296,19 @@ static struct isl_map *isl_map_from_quast(struct isl_ctx *ctx, PipQuast *q, nexist -= pip_param-1; if (rest) { - *rest = isl_set_alloc_dim(isl_dim_copy(context->dim), n_nosol, + *rest = isl_set_alloc_space(isl_space_copy(context->dim), n_nosol, ISL_MAP_DISJOINT); if (!*rest) goto error; } - map = isl_map_alloc_dim(isl_dim_copy(keep_dim), n_sol, + map = isl_map_alloc_space(isl_space_copy(keep_dim), n_sol, ISL_MAP_DISJOINT); if (!map) goto error; - dims = isl_dim_reverse(isl_dim_copy(context->dim)); + dims = isl_space_reverse(isl_space_copy(context->dim)); data.bmap = isl_basic_map_from_basic_set(context, dims); - data.bmap = isl_basic_map_extend_dim(data.bmap, + data.bmap = isl_basic_map_extend_space(data.bmap, keep_dim, nexist, keep, max_depth+2*nexist); if (!data.bmap) goto error2; @@ -328,7 +337,7 @@ static struct isl_map *isl_map_from_quast(struct isl_ctx *ctx, PipQuast *q, return map; error: isl_basic_set_free(context); - isl_dim_free(keep_dim); + isl_space_free(keep_dim); error2: if (data.pos) free(data.pos); @@ -396,7 +405,7 @@ PipMatrix *isl_basic_set_to_pip(struct isl_basic_set *bset, unsigned pip_param, pip_param, extra_front, extra_back); } -static struct isl_map *extremum_on( +struct isl_map *isl_pip_basic_map_lexopt( struct isl_basic_map *bmap, struct isl_basic_set *dom, struct isl_set **empty, int max) { @@ -435,7 +444,7 @@ static struct isl_map *extremum_on( struct isl_basic_set *copy; copy = isl_basic_set_copy(dom); map = isl_map_from_quast(ctx, sol, - isl_dim_copy(bmap->dim), copy, empty); + isl_space_copy(bmap->dim), copy, empty); } else { map = isl_map_empty_like_basic_map(bmap); if (empty) @@ -465,372 +474,3 @@ error: isl_basic_set_free(dom); return NULL; } - -struct isl_map *isl_pip_basic_map_lexmax( - struct isl_basic_map *bmap, struct isl_basic_set *dom, - struct isl_set **empty) -{ - return extremum_on(bmap, dom, empty, 1); -} - -struct isl_map *isl_pip_basic_map_lexmin( - struct isl_basic_map *bmap, struct isl_basic_set *dom, - struct isl_set **empty) -{ - return extremum_on(bmap, dom, empty, 0); -} - -/* Project the given basic set onto its parameter domain, possibly introducing - * new, explicit, existential variables in the constraints. - * The input has parameters and output variables. - * The output has the same parameters, but no output variables, only - * explicit existentially quantified variables. - */ -static struct isl_set *compute_divs_no_eq(struct isl_basic_set *bset) -{ - PipMatrix *domain = NULL, *context = NULL; - PipOptions *options; - PipQuast *sol; - struct isl_ctx *ctx; - struct isl_dim *dim; - struct isl_map *map; - struct isl_set *set; - struct isl_basic_set *dom; - unsigned nparam; - - if (!bset) - goto error; - - ctx = bset->ctx; - nparam = isl_basic_set_n_param(bset); - - domain = isl_basic_set_to_pip(bset, nparam, 0, 0); - if (!domain) - goto error; - context = pip_matrix_alloc(0, nparam + 2); - if (!context) - goto error; - - options = pip_options_init(); - options->Simplify = 1; - options->Urs_unknowns = -1; - options->Urs_parms = -1; - sol = pip_solve(domain, context, -1, options); - - dom = isl_basic_set_alloc(ctx, nparam, 0, 0, 0, 0); - map = isl_map_from_quast(ctx, sol, isl_dim_copy(dom->dim), dom, NULL); - set = (struct isl_set *)map; - - pip_quast_free(sol); - pip_options_free(options); - pip_matrix_free(domain); - pip_matrix_free(context); - - isl_basic_set_free(bset); - - return set; -error: - if (domain) - pip_matrix_free(domain); - if (context) - pip_matrix_free(context); - isl_basic_set_free(dom); - isl_basic_set_free(bset); - return NULL; -} - -static struct isl_map *isl_map_reset_dim(struct isl_map *map, - struct isl_dim *dim) -{ - int i; - - if (!map || !dim) - goto error; - - for (i = 0; i < map->n; ++i) { - isl_dim_free(map->p[i]->dim); - map->p[i]->dim = isl_dim_copy(dim); - } - isl_dim_free(map->dim); - map->dim = dim; - - return map; -error: - isl_map_free(map); - isl_dim_free(dim); - return NULL; -} - -static struct isl_set *isl_set_reset_dim(struct isl_set *set, - struct isl_dim *dim) -{ - return (struct isl_set *) isl_map_reset_dim((struct isl_map *)set, dim); -} - -/* Given a matrix M (mat) and a size n (size), replace mat - * by the matrix - * - * [ M 0 ] - * [ 0 I ] - * - * where I is an n x n identity matrix. - */ -static struct isl_mat *append_identity(struct isl_ctx *ctx, - struct isl_mat *mat, unsigned size) -{ - int i; - unsigned n_row, n_col; - - n_row = mat->n_row; - n_col = mat->n_col; - mat = isl_mat_extend(ctx, mat, n_row + size, n_col + size); - if (!mat) - return NULL; - for (i = 0; i < n_row; ++i) - isl_seq_clr(mat->row[i] + n_col, size); - for (i = 0; i < size; ++i) { - isl_seq_clr(mat->row[n_row + i], n_col + size); - isl_int_set_si(mat->row[n_row + i][n_col + i], 1); - } - return mat; -} - -/* Apply a preimage specified by "mat" on the parameters of "bset". - */ -static struct isl_basic_set *basic_set_parameter_preimage( - struct isl_basic_set *bset, struct isl_mat *mat) -{ - unsigned nparam, n_out; - - if (!bset || !mat) - goto error; - - bset->dim = isl_dim_cow(bset->dim); - if (!bset->dim) - goto error; - - nparam = isl_basic_set_dim(bset, isl_dim_param); - n_out = isl_basic_set_dim(bset, isl_dim_set); - - isl_assert(bset->ctx, mat->n_row == 1 + nparam, goto error); - - mat = append_identity(bset->ctx, mat, n_out); - if (!mat) - goto error; - - bset->dim->nparam = 0; - bset->dim->n_out += nparam; - bset = isl_basic_set_preimage(bset, mat); - if (bset) { - bset->dim->nparam = bset->dim->n_out - n_out; - bset->dim->n_out = n_out; - } - return bset; -error: - isl_mat_free(bset ? bset->ctx : NULL, mat); - isl_basic_set_free(bset); - return NULL; -} - -/* Apply a preimage specified by "mat" on the parameters of "set". - */ -static struct isl_set *set_parameter_preimage( - struct isl_set *set, struct isl_mat *mat) -{ - struct isl_dim *dim = NULL; - unsigned nparam, n_out; - - if (!set || !mat) - goto error; - - dim = isl_dim_copy(set->dim); - dim = isl_dim_cow(dim); - if (!dim) - goto error; - - nparam = isl_set_dim(set, isl_dim_param); - n_out = isl_set_dim(set, isl_dim_set); - - isl_assert(set->ctx, mat->n_row == 1 + nparam, goto error); - - mat = append_identity(set->ctx, mat, n_out); - if (!mat) - goto error; - - dim->nparam = 0; - dim->n_out += nparam; - isl_set_reset_dim(set, dim); - set = isl_set_preimage(set, mat); - if (!set) - goto error2; - dim = isl_dim_copy(set->dim); - dim = isl_dim_cow(dim); - if (!dim) - goto error2; - dim->nparam = dim->n_out - n_out; - dim->n_out = n_out; - isl_set_reset_dim(set, dim); - return set; -error: - isl_dim_free(dim); - isl_mat_free(set ? set->ctx : NULL, mat); -error2: - isl_set_free(set); - return NULL; -} - -/* Intersect the basic set "bset" with the affine space specified by the - * equalities in "eq". - */ -static struct isl_basic_set *basic_set_append_equalities( - struct isl_basic_set *bset, struct isl_mat *eq) -{ - int i, k; - unsigned len; - - if (!bset || !eq) - goto error; - - bset = isl_basic_set_extend_dim(bset, isl_dim_copy(bset->dim), 0, - eq->n_row, 0); - if (!bset) - goto error; - - len = 1 + isl_dim_total(bset->dim) + bset->extra; - for (i = 0; i < eq->n_row; ++i) { - k = isl_basic_set_alloc_equality(bset); - if (k < 0) - goto error; - isl_seq_cpy(bset->eq[k], eq->row[i], eq->n_col); - isl_seq_clr(bset->eq[k] + eq->n_col, len - eq->n_col); - } - isl_mat_free(bset->ctx, eq); - - return bset; -error: - isl_mat_free(bset ? bset->ctx : NULL, eq); - isl_basic_set_free(bset); - return NULL; -} - -/* Intersect the set "set" with the affine space specified by the - * equalities in "eq". - */ -static struct isl_set *set_append_equalities(struct isl_set *set, - struct isl_mat *eq) -{ - int i; - - if (!set || !eq) - goto error; - - for (i = 0; i < set->n; ++i) { - set->p[i] = basic_set_append_equalities(set->p[i], - isl_mat_copy(set->ctx, eq)); - if (!set->p[i]) - goto error; - } - isl_mat_free(set->ctx, eq); - return set; -error: - isl_mat_free(set ? set->ctx : NULL, eq); - isl_set_free(set); - return NULL; -} - -/* Project the given basic set onto its parameter domain, possibly introducing - * new, explicit, existential variables in the constraints. - * The input has parameters and output variables. - * The output has the same parameters, but no output variables, only - * explicit existentially quantified variables. - * - * The actual projection is performed by pip, but pip doesn't seem - * to like equalities very much, so we first remove the equalities - * among the parameters by performing a variable compression on - * the parameters. Afterward, an inverse transformation is performed - * and the equalities among the parameters are inserted back in. - */ -static struct isl_set *compute_divs(struct isl_basic_set *bset) -{ - int i, j; - struct isl_mat *eq; - struct isl_mat *T, *T2; - struct isl_set *set; - unsigned nparam, n_out; - - bset = isl_basic_set_cow(bset); - if (!bset) - return NULL; - - if (bset->n_eq == 0) - return compute_divs_no_eq(bset); - - isl_basic_set_gauss(bset, NULL); - - nparam = isl_basic_set_dim(bset, isl_dim_param); - n_out = isl_basic_set_dim(bset, isl_dim_out); - - for (i = 0, j = n_out - 1; i < bset->n_eq && j >= 0; --j) { - if (!isl_int_is_zero(bset->eq[i][1 + nparam + j])) - ++i; - } - if (i == bset->n_eq) - return compute_divs_no_eq(bset); - - eq = isl_mat_sub_alloc(bset->ctx, bset->eq, i, bset->n_eq - i, - 0, 1 + nparam); - eq = isl_mat_cow(bset->ctx, eq); - T = isl_mat_variable_compression(bset->ctx, - isl_mat_copy(bset->ctx, eq), &T2); - bset = basic_set_parameter_preimage(bset, T); - - set = compute_divs_no_eq(bset); - set = set_parameter_preimage(set, T2); - set = set_append_equalities(set, eq); - return set; -} - -/* Compute an explicit representation for all the existentially - * quantified variables. - * The input and output dimensions are first turned into parameters - * and the existential variables into output dimensions. - * compute_divs then returns a map with the same parameters and - * no input or output dimensions and the dimension specification - * is reset to that of the input. - */ -struct isl_map *isl_pip_basic_map_compute_divs(struct isl_basic_map *bmap) -{ - struct isl_basic_set *bset; - struct isl_set *set; - struct isl_map *map; - struct isl_dim *dim, *orig_dim = NULL; - unsigned nparam; - unsigned n_in; - unsigned n_out; - - bmap = isl_basic_map_cow(bmap); - if (!bmap) - return NULL; - - nparam = isl_basic_map_dim(bmap, isl_dim_param); - n_in = isl_basic_map_dim(bmap, isl_dim_in); - n_out = isl_basic_map_dim(bmap, isl_dim_out); - dim = isl_dim_set_alloc(bmap->ctx, nparam + n_in + n_out, bmap->n_div); - if (!dim) - goto error; - - orig_dim = bmap->dim; - bmap->dim = dim; - bmap->extra -= bmap->n_div; - bmap->n_div = 0; - bset = (struct isl_basic_set *)bmap; - - set = compute_divs(bset); - map = (struct isl_map *)set; - map = isl_map_reset_dim(map, orig_dim); - - return map; -error: - isl_basic_map_free(bmap); - return NULL; -}