1/*
2 * Copyright 2008-2009 Katholieke Universiteit Leuven
3 *
4 * Use of this software is governed by the MIT license
5 *
6 * Written by Sven Verdoolaege, K.U.Leuven, Departement
7 * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
8 */
9
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"
15
16struct isl_vec *isl_pip_basic_set_sample(struct isl_basic_set *bset)
17{
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;
24
25	if (!bset)
26		goto error;
27	ctx = isl_basic_set_get_ctx(bset);
28	isl_assert(ctx, isl_basic_set_n_param(bset) == 0, goto error);
29	isl_assert(ctx, isl_basic_set_dim(bset, isl_dim_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;
34
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);
55		}
56		isl_assert(ctx, i == dim, goto error);
57	}
58
59	pip_quast_free(sol);
60	pip_options_free(options);
61	pip_matrix_free(domain);
62
63	isl_basic_set_free(bset);
64	return vec;
65error:
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;
73}
74