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>
10 Matrix
*glpk_Polyhedron_Reduced_Basis(Polyhedron
*P
,
11 struct barvinok_options
*options
)
17 #ifndef HAVE_LIBCDDGMP
18 Matrix
*cdd_Polyhedron_Reduced_Basis(Polyhedron
*P
,
19 struct barvinok_options
*options
)
25 Matrix
*isl_Polyhedron_Reduced_Basis(Polyhedron
*P
,
26 struct barvinok_options
*options
)
32 int nvar
= P
->Dimension
;
36 int isl_gbr_only_first
;
38 ctx
= isl_ctx_alloc_with_options(&barvinok_options_args
, options
);
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
]);
63 isl_options_set_gbr_only_first(ctx
, isl_gbr_only_first
);
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
);