standard_constraints: take constraints instead of polyhedron as input
[barvinok.git] / omega / count.cc
blob29fc66cd91af706e604e996e2125b9162526ed12
1 #include <assert.h>
2 #include <barvinok/barvinok.h>
3 #include <barvinok/util.h>
4 #include <omega.h>
5 #include "omega/convert.h"
6 #include "count.h"
8 #include <iostream>
9 using namespace std;
11 #define MAXRAYS POL_NO_DUAL
13 evalue *count_relation(Relation& r)
15 varvector vv;
16 varvector params;
17 Polyhedron *D = relation2Domain(r, vv, params);
18 int dim = r.is_set() ? r.n_set() : r.n_inp() + r.n_out();
20 int d = 0;
21 evalue *EP = NULL;
22 for (Polyhedron *P = D; P; P = P->next, ++d) {
23 assert(d == 0);
24 int exist = P->Dimension - params.size() - dim;
25 EP = barvinok_enumerate_e(P, exist, params.size(), MAXRAYS);
27 reduce_evalue(EP);
28 Domain_Free(D);
29 return EP;
32 evalue *rank_relation(Relation& r)
34 varvector vv;
35 varvector params;
36 Polyhedron *D = relation2Domain(r, vv, params);
37 int dim = r.is_set() ? r.n_set() : r.n_inp() + r.n_out();
39 evalue *EP = NULL;
40 if (D) {
41 assert(D->next == NULL);
42 Polyhedron *C = Universe_Polyhedron(params.size());
43 EP = barvinok_lexsmaller_ev(D, D, dim, C, MAXRAYS);
44 Polyhedron_Free(C);
46 Domain_Free(D);
47 return EP;
50 evalue *count_lexsmaller(Relation& r, Relation& domain)
52 varvector P_vv;
53 varvector P_params;
54 varvector D_vv;
55 varvector D_params;
56 Polyhedron *P = relation2Domain(r, P_vv, P_params);
57 int P_dim = r.is_set() ? r.n_set() : r.n_inp() + r.n_out();
58 Polyhedron *D = relation2Domain(domain, D_vv, D_params);
59 int D_dim = r.is_set() ? r.n_set() : r.n_inp() + r.n_out();
60 assert(P_dim == D_dim);
62 evalue *EP = NULL;
63 if (P && D) {
64 assert(P->next == NULL);
65 assert(D->next == NULL);
66 Polyhedron *C = Universe_Polyhedron(D_params.size());
67 EP = barvinok_lexsmaller_ev(P, D, D_dim, C, MAXRAYS);
68 Polyhedron_Free(C);
70 Domain_Free(P);
71 Domain_Free(D);
72 return EP;