xref: /netbsd-src/external/mit/isl/dist/polyhedron_minimize.c (revision 5971e316fdea024efff6be8f03536623db06833e)
1*5971e316Smrg /*
2*5971e316Smrg  * Copyright 2008-2009 Katholieke Universiteit Leuven
3*5971e316Smrg  *
4*5971e316Smrg  * Use of this software is governed by the MIT license
5*5971e316Smrg  *
6*5971e316Smrg  * Written by Sven Verdoolaege, K.U.Leuven, Departement
7*5971e316Smrg  * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
8*5971e316Smrg  */
9*5971e316Smrg 
10*5971e316Smrg #include <assert.h>
11*5971e316Smrg #include <isl/set.h>
12*5971e316Smrg #include <isl/vec.h>
13*5971e316Smrg #include <isl_ilp_private.h>
14*5971e316Smrg #include <isl_seq.h>
15*5971e316Smrg #include <isl_vec_private.h>
16*5971e316Smrg 
17*5971e316Smrg /* The input of this program is the same as that of the "polytope_minimize"
18*5971e316Smrg  * program from the barvinok distribution.
19*5971e316Smrg  *
20*5971e316Smrg  * Constraints of set is PolyLib format.
21*5971e316Smrg  * Linear or affine objective function in PolyLib format.
22*5971e316Smrg  */
23*5971e316Smrg 
isl_vec_lin_to_aff(__isl_take isl_vec * vec)24*5971e316Smrg static __isl_give isl_vec *isl_vec_lin_to_aff(__isl_take isl_vec *vec)
25*5971e316Smrg {
26*5971e316Smrg 	struct isl_vec *aff;
27*5971e316Smrg 
28*5971e316Smrg 	if (!vec)
29*5971e316Smrg 		return NULL;
30*5971e316Smrg 	aff = isl_vec_alloc(vec->ctx, 1 + vec->size);
31*5971e316Smrg 	if (!aff)
32*5971e316Smrg 		goto error;
33*5971e316Smrg 	isl_int_set_si(aff->el[0], 0);
34*5971e316Smrg 	isl_seq_cpy(aff->el + 1, vec->el, vec->size);
35*5971e316Smrg 	isl_vec_free(vec);
36*5971e316Smrg 	return aff;
37*5971e316Smrg error:
38*5971e316Smrg 	isl_vec_free(vec);
39*5971e316Smrg 	return NULL;
40*5971e316Smrg }
41*5971e316Smrg 
42*5971e316Smrg /* Rotate elements of vector right.
43*5971e316Smrg  * In particular, move the constant term from the end of the
44*5971e316Smrg  * vector to the start of the vector.
45*5971e316Smrg  */
vec_ror(__isl_take isl_vec * vec)46*5971e316Smrg static __isl_give isl_vec *vec_ror(__isl_take isl_vec *vec)
47*5971e316Smrg {
48*5971e316Smrg 	int i;
49*5971e316Smrg 
50*5971e316Smrg 	if (!vec)
51*5971e316Smrg 		return NULL;
52*5971e316Smrg 	for (i = vec->size - 2; i >= 0; --i)
53*5971e316Smrg 		isl_int_swap(vec->el[i], vec->el[i + 1]);
54*5971e316Smrg 	return vec;
55*5971e316Smrg }
56*5971e316Smrg 
main(int argc,char ** argv)57*5971e316Smrg int main(int argc, char **argv)
58*5971e316Smrg {
59*5971e316Smrg 	struct isl_ctx *ctx = isl_ctx_alloc();
60*5971e316Smrg 	struct isl_basic_set *bset;
61*5971e316Smrg 	struct isl_vec *obj;
62*5971e316Smrg 	struct isl_vec *sol;
63*5971e316Smrg 	isl_int opt;
64*5971e316Smrg 	isl_size dim;
65*5971e316Smrg 	enum isl_lp_result res;
66*5971e316Smrg 	isl_printer *p;
67*5971e316Smrg 
68*5971e316Smrg 	isl_int_init(opt);
69*5971e316Smrg 	bset = isl_basic_set_read_from_file(ctx, stdin);
70*5971e316Smrg 	dim = isl_basic_set_dim(bset, isl_dim_all);
71*5971e316Smrg 	assert(dim >= 0);
72*5971e316Smrg 	obj = isl_vec_read_from_file(ctx, stdin);
73*5971e316Smrg 	assert(obj);
74*5971e316Smrg 	assert(obj->size >= dim && obj->size <= dim + 1);
75*5971e316Smrg 	if (obj->size != dim + 1)
76*5971e316Smrg 		obj = isl_vec_lin_to_aff(obj);
77*5971e316Smrg 	else
78*5971e316Smrg 		obj = vec_ror(obj);
79*5971e316Smrg 	res = isl_basic_set_solve_ilp(bset, 0, obj->el, &opt, &sol);
80*5971e316Smrg 	switch (res) {
81*5971e316Smrg 	case isl_lp_error:
82*5971e316Smrg 		fprintf(stderr, "error\n");
83*5971e316Smrg 		return -1;
84*5971e316Smrg 	case isl_lp_empty:
85*5971e316Smrg 		fprintf(stdout, "empty\n");
86*5971e316Smrg 		break;
87*5971e316Smrg 	case isl_lp_unbounded:
88*5971e316Smrg 		fprintf(stdout, "unbounded\n");
89*5971e316Smrg 		break;
90*5971e316Smrg 	case isl_lp_ok:
91*5971e316Smrg 		p = isl_printer_to_file(ctx, stdout);
92*5971e316Smrg 		p = isl_printer_print_vec(p, sol);
93*5971e316Smrg 		p = isl_printer_end_line(p);
94*5971e316Smrg 		p = isl_printer_print_isl_int(p, opt);
95*5971e316Smrg 		p = isl_printer_end_line(p);
96*5971e316Smrg 		isl_printer_free(p);
97*5971e316Smrg 	}
98*5971e316Smrg 	isl_basic_set_free(bset);
99*5971e316Smrg 	isl_vec_free(obj);
100*5971e316Smrg 	isl_vec_free(sol);
101*5971e316Smrg 	isl_ctx_free(ctx);
102*5971e316Smrg 	isl_int_clear(opt);
103*5971e316Smrg 
104*5971e316Smrg 	return 0;
105*5971e316Smrg }
106