polysign_isl.c: isl_polyhedron_affine_sign: use isl_val
[barvinok.git] / basis_reduction.c
blob359346e2b2583eff6519cd9877c77286e4819e5f
1 #include <assert.h>
2 #include <isl/options.h>
3 #include <isl/val_gmp.h>
4 #include <isl_set_polylib.h>
5 #include <barvinok/basis_reduction.h>
6 #include <barvinok/options.h>
7 #include "config.h"
9 #ifndef HAVE_LIBGLPK
10 Matrix *glpk_Polyhedron_Reduced_Basis(Polyhedron *P,
11 struct barvinok_options *options)
13 assert(0);
15 #endif
17 #ifndef HAVE_LIBCDDGMP
18 Matrix *cdd_Polyhedron_Reduced_Basis(Polyhedron *P,
19 struct barvinok_options *options)
21 assert(0);
23 #endif
25 Matrix *isl_Polyhedron_Reduced_Basis(Polyhedron *P,
26 struct barvinok_options *options)
28 int i, j;
29 isl_val *v;
30 isl_ctx *ctx;
31 isl_space *dim;
32 int nvar = P->Dimension;
33 isl_basic_set *bset;
34 isl_mat *basis;
35 Matrix *M;
36 int isl_gbr_only_first;
38 ctx = isl_ctx_alloc_with_options(&barvinok_options_args, options);
39 assert(ctx);
41 isl_gbr_only_first = isl_options_get_gbr_only_first(ctx);
42 isl_options_set_gbr_only_first(ctx, options->gbr_only_first);
44 dim = isl_space_set_alloc(ctx, 0, nvar);
45 bset = isl_basic_set_new_from_polylib(P, dim);
47 basis = isl_basic_set_reduced_basis(bset);
48 isl_basic_set_free(bset);
50 M = Matrix_Alloc(nvar, nvar);
52 for (i = 0; i < nvar; ++i)
53 for (j = 0; j < nvar; ++j) {
54 v = isl_mat_get_element_val(basis, 1 + i, 1 + j);
55 isl_val_get_num_gmp(v, M->p[i][j]);
56 isl_val_free(v);
59 isl_mat_free(basis);
61 isl_ctx_free(ctx);
63 isl_options_set_gbr_only_first(ctx, isl_gbr_only_first);
65 return M;
68 Matrix *Polyhedron_Reduced_Basis(Polyhedron *P, struct barvinok_options *options)
70 if (options->gbr_lp_solver == BV_GBR_GLPK)
71 return glpk_Polyhedron_Reduced_Basis(P, options);
72 else if (options->gbr_lp_solver == BV_GBR_CDD)
73 return cdd_Polyhedron_Reduced_Basis(P, options);
74 else if (options->gbr_lp_solver == BV_GBR_ISL)
75 return isl_Polyhedron_Reduced_Basis(P, options);
76 else
77 assert(0);