omega/convert.cc: relation2Domain: only collect set variables
[barvinok.git] / omega / count.cc
blob7b1880ca352abab789c7967773bb595546075398
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 evalue *count_relation(Relation& r)
13 varvector vv;
14 varvector params;
15 struct barvinok_options *options = barvinok_options_new_with_defaults();
16 Polyhedron *D = relation2Domain(r, vv, params, options->MaxRays);
17 int dim = r.is_set() ? r.n_set() : r.n_inp() + r.n_out();
19 int d = 0;
20 evalue *EP = NULL;
21 for (Polyhedron *P = D; P; P = P->next, ++d) {
22 assert(d == 0);
23 int exist = P->Dimension - params.size() - dim;
24 EP = barvinok_enumerate_e(P, exist, params.size(), options->MaxRays);
26 reduce_evalue(EP);
27 Domain_Free(D);
28 barvinok_options_free(options);
29 return EP;
32 evalue *rank_relation(Relation& r)
34 varvector vv;
35 varvector params;
36 struct barvinok_options *options = barvinok_options_new_with_defaults();
37 Polyhedron *D = relation2Domain(r, vv, params, options->MaxRays);
38 int dim = r.is_set() ? r.n_set() : r.n_inp() + r.n_out();
40 evalue *EP = NULL;
41 if (D) {
42 assert(D->next == NULL);
43 Polyhedron *C = Universe_Polyhedron(params.size());
44 EP = barvinok_lexsmaller_ev(D, D, dim, C, options->MaxRays);
45 Polyhedron_Free(C);
47 Domain_Free(D);
48 barvinok_options_free(options);
49 return EP;
52 evalue *count_lexsmaller(Relation& r, Relation& domain)
54 varvector P_vv;
55 varvector P_params;
56 varvector D_vv;
57 varvector D_params;
58 struct barvinok_options *options = barvinok_options_new_with_defaults();
59 Polyhedron *P = relation2Domain(r, P_vv, P_params, options->MaxRays);
60 int P_dim = r.is_set() ? r.n_set() : r.n_inp() + r.n_out();
61 Polyhedron *D = relation2Domain(domain, D_vv, D_params, options->MaxRays);
62 int D_dim = r.is_set() ? r.n_set() : r.n_inp() + r.n_out();
63 assert(P_dim == D_dim);
65 evalue *EP = NULL;
66 if (P && D) {
67 assert(P->next == NULL);
68 assert(D->next == NULL);
69 Polyhedron *C = Universe_Polyhedron(D_params.size());
70 EP = barvinok_lexsmaller_ev(P, D, D_dim, C, options->MaxRays);
71 Polyhedron_Free(C);
73 Domain_Free(P);
74 Domain_Free(D);
75 barvinok_options_free(options);
76 return EP;