edomain.cc: add EDomain::contains
[barvinok.git] / evalue_util.cc
blob8f2a2e0939319ec9ee42161c7c837d300ecac3dc
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 void evalue_denom(evalue *e, Value *d)
12 if (value_notzero_p(e->d)) {
13 value_lcm(*d, e->d, d);
14 return;
16 int offset = type_offset(e->x.p);
17 for (int i = e->x.p->size-1; i >= offset; --i)
18 evalue_denom(&e->x.p->arr[i], d);
21 static void evalue_print(std::ostream& o, evalue *e, char **p, int d)
23 if (value_notzero_p(e->d)) {
24 o << VALUE_TO_INT(e->x.n) * (d / VALUE_TO_INT(e->d));
25 return;
27 assert(e->x.p->type == polynomial || e->x.p->type == flooring ||
28 e->x.p->type == fractional);
29 int offset = type_offset(e->x.p);
30 for (int i = e->x.p->size-1; i >= offset; --i) {
31 if (EVALUE_IS_ZERO(e->x.p->arr[i]))
32 continue;
33 if (i != e->x.p->size-1 &&
34 (value_zero_p(e->x.p->arr[i].d) ||
35 value_pos_p(e->x.p->arr[i].x.n)))
36 o << "+";
37 if (i == offset || !(value_one_p(e->x.p->arr[i].x.n) &&
38 d == VALUE_TO_INT(e->x.p->arr[i].d))) {
39 if (value_zero_p(e->x.p->arr[i].d))
40 o << "(";
41 evalue_print(o, &e->x.p->arr[i], p, d);
42 if (value_zero_p(e->x.p->arr[i].d))
43 o << ")";
44 if (i != offset)
45 o << "*";
47 for (int j = 0; j < i-offset; ++j) {
48 if (j != 0)
49 o << "*";
50 if (e->x.p->type == flooring) {
51 o << "[";
52 evalue_print(o, &e->x.p->arr[0], p);
53 o << "]";
54 } else if (e->x.p->type == fractional) {
55 o << "{";
56 evalue_print(o, &e->x.p->arr[0], p);
57 o << "}";
58 } else
59 o << p[e->x.p->pos-1];
64 void evalue_print(std::ostream& o, evalue *e, char **p)
66 Value d;
67 value_init(d);
68 value_set_si(d, 1);
69 evalue_denom(e, &d);
70 if (value_notone_p(d))
71 o << "(";
72 evalue_print(o, e, p, VALUE_TO_INT(d));
73 if (value_notone_p(d))
74 o << ")/" << VALUE_TO_INT(d);
75 value_clear(d);