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