2 #include <isl/val_gmp.h>
4 #include <isl_set_polylib.h>
7 static void values2isl(Value
*src
, isl_int
*dst
, int len
)
11 for (i
= 0; i
< len
; ++i
)
12 isl_int_set_gmp(dst
[i
], src
[i
]);
15 static __isl_give isl_mat
*extract_equalities(isl_ctx
*ctx
, Matrix
*M
)
23 for (i
= 0; i
< M
->NbRows
; ++i
)
24 if (value_zero_p(M
->p
[i
][0]))
27 eq
= isl_mat_alloc(ctx
, n
, M
->NbColumns
- 1);
28 for (i
= 0; i
< M
->NbRows
; ++i
) {
29 if (!value_zero_p(M
->p
[i
][0]))
31 for (j
= 0; j
< M
->NbColumns
- 1; ++j
) {
32 v
= isl_val_int_from_gmp(ctx
, M
->p
[i
][1 + j
]);
33 eq
= isl_mat_set_element_val(eq
, i
, j
, v
);
40 static __isl_give isl_mat
*extract_inequalities(isl_ctx
*ctx
, Matrix
*M
)
48 for (i
= 0; i
< M
->NbRows
; ++i
)
49 if (!value_zero_p(M
->p
[i
][0]))
52 ineq
= isl_mat_alloc(ctx
, n
, M
->NbColumns
- 1);
53 for (i
= 0; i
< M
->NbRows
; ++i
) {
54 if (value_zero_p(M
->p
[i
][0]))
56 for (j
= 0; j
< M
->NbColumns
- 1; ++j
) {
57 v
= isl_val_int_from_gmp(ctx
, M
->p
[i
][1 + j
]);
58 ineq
= isl_mat_set_element_val(ineq
, i
, j
, v
);
65 enum order_sign
isl_polyhedron_affine_sign(Polyhedron
*D
, Matrix
*T
,
66 struct barvinok_options
*options
)
68 isl_ctx
*ctx
= isl_ctx_alloc();
74 enum isl_lp_result lp_min
, lp_max
;
75 enum order_sign sign
= order_undefined
;
81 assert(D
->Dimension
== T
->NbColumns
- 1);
83 aff
= isl_vec_alloc(ctx
, T
->NbColumns
);
85 values2isl(T
->p
[0], aff
->el
+ 1, T
->NbColumns
- 1);
86 values2isl(T
->p
[0] + T
->NbColumns
- 1, aff
->el
, 1);
87 values2isl(T
->p
[1] + T
->NbColumns
- 1, &denom
, 1);
89 dim
= isl_space_set_alloc(ctx
, 0, D
->Dimension
);
90 bset
= isl_basic_set_new_from_polylib(D
, dim
);
92 lp_min
= isl_basic_set_solve_lp(bset
, 0, aff
->el
, denom
, &min
,
94 assert(lp_min
!= isl_lp_error
);
96 if (lp_min
== isl_lp_empty
)
97 sign
= order_undefined
;
98 else if (lp_min
== isl_lp_ok
&& isl_int_is_pos(min
))
101 lp_max
= isl_basic_set_solve_lp(bset
, 1, aff
->el
, denom
, &max
,
103 assert(lp_max
!= isl_lp_error
);
105 if (lp_max
== isl_lp_ok
&& isl_int_is_neg(max
))
107 else if (lp_min
== isl_lp_ok
&& lp_max
== isl_lp_ok
&&
108 isl_int_is_zero(min
) && isl_int_is_zero(max
))
110 else if (lp_min
== isl_lp_ok
&& isl_int_is_zero(min
))
112 else if (lp_max
== isl_lp_ok
&& isl_int_is_zero(max
))
115 sign
= order_unknown
;
118 isl_basic_set_free(bset
);
122 isl_int_clear(denom
);
128 static enum lp_result
isl_lp_result2lp_result(enum isl_lp_result res
)
133 case isl_lp_unbounded
:
142 enum lp_result
isl_constraints_opt(Matrix
*C
, Value
*obj
, Value denom
,
143 enum lp_dir dir
, Value
*opt
)
145 isl_ctx
*ctx
= isl_ctx_alloc();
149 isl_int isl_denom
, isl_opt
;
151 enum isl_lp_result res
;
152 int max
= dir
== lp_max
;
154 isl_int_init(isl_denom
);
155 isl_int_init(isl_opt
);
157 eq
= extract_equalities(ctx
, C
);
158 ineq
= extract_inequalities(ctx
, C
);
159 dim
= isl_space_set_alloc(ctx
, 0, C
->NbColumns
- 2);
160 bset
= isl_basic_set_from_constraint_matrices(dim
, eq
, ineq
,
161 isl_dim_set
, isl_dim_div
, isl_dim_param
, isl_dim_cst
);
162 aff
= isl_vec_alloc(ctx
, C
->NbColumns
- 1);
164 values2isl(obj
, aff
->el
+ 1, aff
->size
- 1);
165 values2isl(obj
+ aff
->size
- 1, aff
->el
, 1);
166 isl_int_set_gmp(isl_denom
, denom
);
168 res
= isl_basic_set_solve_lp(bset
, max
, aff
->el
, isl_denom
, &isl_opt
,
170 isl_int_get_gmp(isl_opt
, *opt
);
173 isl_int_clear(isl_denom
);
174 isl_int_clear(isl_opt
);
175 isl_basic_set_free(bset
);
178 return isl_lp_result2lp_result(res
);