/* Evaluate "u" in the void point "pnt". * In particular, return the value NaN. */ static __isl_give isl_val *FN(UNION,eval_void)(__isl_take UNION *u, __isl_take isl_point *pnt) { isl_ctx *ctx; ctx = isl_point_get_ctx(pnt); FN(UNION,free)(u); isl_point_free(pnt); return isl_val_nan(ctx); }
__isl_give isl_basic_set *isl_basic_set_from_point(__isl_take isl_point *pnt) { isl_basic_set *bset; isl_basic_set *model; model = isl_basic_set_empty(isl_dim_copy(pnt->dim)); bset = isl_basic_set_from_vec(isl_vec_copy(pnt->vec)); bset = isl_basic_set_from_underlying_set(bset, model); isl_point_free(pnt); return bset; }
__isl_give isl_point *isl_point_cow(__isl_take isl_point *pnt) { struct isl_point *pnt2; if (!pnt) return NULL; if (pnt->ref == 1) return pnt; pnt2 = isl_point_dup(pnt); isl_point_free(pnt); return pnt2; }
__isl_give isl_val *FN(UNION,eval)(__isl_take UNION *u, __isl_take isl_point *pnt) { uint32_t hash; struct isl_hash_table_entry *entry; isl_bool is_void; isl_space *space; isl_val *v; if (!u || !pnt) goto error; is_void = isl_point_is_void(pnt); if (is_void < 0) goto error; if (is_void) return FN(UNION,eval_void)(u, pnt); space = isl_space_copy(pnt->dim); if (!space) goto error; hash = isl_space_get_hash(space); entry = isl_hash_table_find(u->space->ctx, &u->table, hash, &FN(UNION,has_domain_space), space, 0); isl_space_free(space); if (!entry) { v = isl_val_zero(isl_point_get_ctx(pnt)); isl_point_free(pnt); } else { v = FN(PART,eval)(FN(PART,copy)(entry->data), pnt); } FN(UNION,free)(u); return v; error: FN(UNION,free)(u); isl_point_free(pnt); return NULL; }
__isl_give isl_point *isl_point_sub_ui(__isl_take isl_point *pnt, enum isl_dim_type type, int pos, unsigned val) { if (!pnt || isl_point_is_void(pnt)) return pnt; pnt = isl_point_cow(pnt); if (!pnt) return NULL; pnt->vec = isl_vec_cow(pnt->vec); if (!pnt->vec) goto error; if (type == isl_dim_set) pos += isl_dim_size(pnt->dim, isl_dim_param); isl_int_sub_ui(pnt->vec->el[1 + pos], pnt->vec->el[1 + pos], val); return pnt; error: isl_point_free(pnt); return NULL; }
void destroy_solver (void) { if (solution != 0) isl_point_free (solution); if (solutions != 0) isl_set_free (solutions); isl_local_space_free (ls); isl_ctx_free (context); }
__isl_give isl_basic_set *isl_basic_set_box_from_points( __isl_take isl_point *pnt1, __isl_take isl_point *pnt2) { isl_basic_set *bset; unsigned total; int i; int k; isl_int t; isl_int_init(t); if (!pnt1 || !pnt2) goto error; isl_assert(pnt1->dim->ctx, isl_dim_equal(pnt1->dim, pnt2->dim), goto error); if (isl_point_is_void(pnt1) && isl_point_is_void(pnt2)) { isl_dim *dim = isl_dim_copy(pnt1->dim); isl_point_free(pnt1); isl_point_free(pnt2); isl_int_clear(t); return isl_basic_set_empty(dim); } if (isl_point_is_void(pnt1)) { isl_point_free(pnt1); isl_int_clear(t); return isl_basic_set_from_point(pnt2); } if (isl_point_is_void(pnt2)) { isl_point_free(pnt2); isl_int_clear(t); return isl_basic_set_from_point(pnt1); } total = isl_dim_total(pnt1->dim); bset = isl_basic_set_alloc_dim(isl_dim_copy(pnt1->dim), 0, 0, 2 * total); for (i = 0; i < total; ++i) { isl_int_mul(t, pnt1->vec->el[1 + i], pnt2->vec->el[0]); isl_int_submul(t, pnt2->vec->el[1 + i], pnt1->vec->el[0]); k = isl_basic_set_alloc_inequality(bset); if (k < 0) goto error; isl_seq_clr(bset->ineq[k] + 1, total); if (isl_int_is_pos(t)) { isl_int_set_si(bset->ineq[k][1 + i], -1); isl_int_set(bset->ineq[k][0], pnt1->vec->el[1 + i]); } else { isl_int_set_si(bset->ineq[k][1 + i], 1); isl_int_neg(bset->ineq[k][0], pnt1->vec->el[1 + i]); } isl_int_fdiv_q(bset->ineq[k][0], bset->ineq[k][0], pnt1->vec->el[0]); k = isl_basic_set_alloc_inequality(bset); if (k < 0) goto error; isl_seq_clr(bset->ineq[k] + 1, total); if (isl_int_is_pos(t)) { isl_int_set_si(bset->ineq[k][1 + i], 1); isl_int_neg(bset->ineq[k][0], pnt2->vec->el[1 + i]); } else { isl_int_set_si(bset->ineq[k][1 + i], -1); isl_int_set(bset->ineq[k][0], pnt2->vec->el[1 + i]); } isl_int_fdiv_q(bset->ineq[k][0], bset->ineq[k][0], pnt2->vec->el[0]); } bset = isl_basic_set_finalize(bset); isl_point_free(pnt1); isl_point_free(pnt2); isl_int_clear(t); return bset; error: isl_point_free(pnt1); isl_point_free(pnt2); isl_int_clear(t); return NULL; }