add isl_{map,set}_add
[isl.git] / isl_sample_piplib.c
blob0ed40fc8e15d64cd060b27bc4ebd29281396e223
1 /*
2 * Copyright 2008-2009 Katholieke Universiteit Leuven
4 * Use of this software is governed by the GNU LGPLv2.1 license
6 * Written by Sven Verdoolaege, K.U.Leuven, Departement
7 * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
8 */
10 #include "isl_mat.h"
11 #include "isl_vec.h"
12 #include "isl_seq.h"
13 #include "isl_piplib.h"
14 #include "isl_sample_piplib.h"
16 struct isl_vec *isl_pip_basic_set_sample(struct isl_basic_set *bset)
18 PipOptions *options = NULL;
19 PipMatrix *domain = NULL;
20 PipQuast *sol = NULL;
21 struct isl_vec *vec = NULL;
22 unsigned dim;
23 struct isl_ctx *ctx;
25 if (!bset)
26 goto error;
27 ctx = bset->ctx;
28 isl_assert(ctx, isl_basic_set_n_param(bset) == 0, goto error);
29 isl_assert(ctx, bset->n_div == 0, goto error);
30 dim = isl_basic_set_n_dim(bset);
31 domain = isl_basic_map_to_pip((struct isl_basic_map *)bset, 0, 0, 0);
32 if (!domain)
33 goto error;
35 options = pip_options_init();
36 if (!options)
37 goto error;
38 sol = pip_solve(domain, NULL, -1, options);
39 if (!sol)
40 goto error;
41 if (!sol->list)
42 vec = isl_vec_alloc(ctx, 0);
43 else {
44 PipList *l;
45 int i;
46 vec = isl_vec_alloc(ctx, 1 + dim);
47 if (!vec)
48 goto error;
49 isl_int_set_si(vec->block.data[0], 1);
50 for (i = 0, l = sol->list; l && i < dim; ++i, l = l->next) {
51 isl_seq_cpy_from_pip(&vec->block.data[1+i],
52 &l->vector->the_vector[0], 1);
53 isl_assert(ctx, !entier_zero_p(l->vector->the_deno[0]),
54 goto error);
56 isl_assert(ctx, i == dim, goto error);
59 pip_quast_free(sol);
60 pip_options_free(options);
61 pip_matrix_free(domain);
63 isl_basic_set_free(bset);
64 return vec;
65 error:
66 isl_vec_free(vec);
67 isl_basic_set_free(bset);
68 if (sol)
69 pip_quast_free(sol);
70 if (domain)
71 pip_matrix_free(domain);
72 return NULL;