1 #include <barvinok/util.h>
2 #include "evalue_util.h"
4 static int type_offset(enode
*p
)
6 return p
->type
== fractional
? 1 :
7 p
->type
== flooring
? 1 : 0;
10 static void evalue_print(std::ostream
& o
, evalue
*e
, char **p
, int d
)
12 if (value_notzero_p(e
->d
)) {
13 o
<< VALUE_TO_INT(e
->x
.n
) * (d
/ VALUE_TO_INT(e
->d
));
16 assert(e
->x
.p
->type
== polynomial
|| e
->x
.p
->type
== flooring
||
17 e
->x
.p
->type
== fractional
);
18 int offset
= type_offset(e
->x
.p
);
19 for (int i
= e
->x
.p
->size
-1; i
>= offset
; --i
) {
20 if (EVALUE_IS_ZERO(e
->x
.p
->arr
[i
]))
22 if (i
!= e
->x
.p
->size
-1 &&
23 (value_zero_p(e
->x
.p
->arr
[i
].d
) ||
24 value_pos_p(e
->x
.p
->arr
[i
].x
.n
)))
26 if (i
== offset
|| !(value_one_p(e
->x
.p
->arr
[i
].x
.n
) &&
27 d
== VALUE_TO_INT(e
->x
.p
->arr
[i
].d
))) {
28 if (value_zero_p(e
->x
.p
->arr
[i
].d
))
30 evalue_print(o
, &e
->x
.p
->arr
[i
], p
, d
);
31 if (value_zero_p(e
->x
.p
->arr
[i
].d
))
36 for (int j
= 0; j
< i
-offset
; ++j
) {
39 if (e
->x
.p
->type
== flooring
) {
41 evalue_print(o
, &e
->x
.p
->arr
[0], p
);
43 } else if (e
->x
.p
->type
== fractional
) {
45 evalue_print(o
, &e
->x
.p
->arr
[0], p
);
48 o
<< p
[e
->x
.p
->pos
-1];
53 void evalue_print(std::ostream
& o
, evalue
*e
, char **p
)
59 if (value_notone_p(d
))
61 evalue_print(o
, e
, p
, VALUE_TO_INT(d
));
62 if (value_notone_p(d
))
63 o
<< ")/" << VALUE_TO_INT(d
);