lattice_point.h: make self-contained
[barvinok.git] / bfcounter.h
blobdf8c8f64e0d96ffe3fdb95e8f5aa5a08179af8f3
1 #include <vector>
2 #include <gmp.h>
3 #include <barvinok/polylib.h>
4 #include <barvinok/NTL_QQ.h>
5 #include "reducer.h"
7 struct bfc_term_base {
8 // the number of times a given factor appears in the denominator
9 int *powers;
10 mat_ZZ terms;
12 bfc_term_base(int len) {
13 powers = new int[len];
16 virtual ~bfc_term_base() {
17 delete [] powers;
21 struct bfc_term : public bfc_term_base {
22 vec_QQ c;
24 bfc_term(int len) : bfc_term_base(len) {}
27 typedef std::vector< bfc_term_base * > bfc_vec;
29 struct bf_reducer;
31 struct bf_base : public np_base {
32 ZZ one;
33 mpq_t tcount;
34 mpz_t tn;
35 mpz_t td;
36 int lower; // call base when only this many variables is left
38 bf_base(unsigned dim) : np_base(dim) {
39 mpq_init(tcount);
40 mpz_init(tn);
41 mpz_init(td);
42 one = 1;
45 ~bf_base() {
46 mpq_clear(tcount);
47 mpz_clear(tn);
48 mpz_clear(td);
51 virtual void handle(const mat_ZZ& rays, Value *vertex, const QQ& c,
52 unsigned long det, int *closed, barvinok_options *options);
53 int setup_factors(const mat_ZZ& rays, mat_ZZ& factors, bfc_term_base* t, int s);
55 bfc_term_base* find_bfc_term(bfc_vec& v, int *powers, int len);
56 void add_term(bfc_term_base *t, vec_ZZ& num1, vec_ZZ& num);
57 void add_term(bfc_term_base *t, vec_ZZ& num);
59 void reduce(mat_ZZ& factors, bfc_vec& v, barvinok_options *options);
60 virtual void base(mat_ZZ& factors, bfc_vec& v) = 0;
62 virtual bfc_term_base* new_bf_term(int len) = 0;
63 virtual void set_factor(bfc_term_base *t, int k, int change) = 0;
64 virtual void set_factor(bfc_term_base *t, int k, mpq_t &f, int change) = 0;
65 virtual void set_factor(bfc_term_base *t, int k, const QQ& c, int change) = 0;
66 virtual void update_term(bfc_term_base *t, int i) = 0;
67 virtual void insert_term(bfc_term_base *t, int i) = 0;
68 virtual bool constant_vertex(int dim) = 0;
69 virtual void cum(bf_reducer *bfr, bfc_term_base *t, int k,
70 dpoly_r *r, barvinok_options *options) = 0;
73 struct bfcounter_base : public bf_base {
74 QQ c;
76 bfcounter_base(unsigned dim) : bf_base(dim) {
79 bfc_term_base* new_bf_term(int len);
81 virtual void set_factor(bfc_term_base *t, int k, int change);
82 virtual void set_factor(bfc_term_base *t, int k, mpq_t &f, int change);
83 virtual void set_factor(bfc_term_base *t, int k, const QQ& c_factor, int change);
84 virtual void insert_term(bfc_term_base *t, int i);
85 virtual void update_term(bfc_term_base *t, int i);
87 virtual bool constant_vertex(int dim) { return true; }
88 virtual void cum(bf_reducer *bfr, bfc_term_base *t, int k, dpoly_r *r,
89 barvinok_options *options) {
90 assert(0);
94 struct bf_reducer {
95 mat_ZZ& factors;
96 bfc_vec& v;
97 bf_base *bf;
99 unsigned nf;
100 unsigned d;
102 mat_ZZ nfactors;
103 int *old2new;
104 int *sign;
105 unsigned int nnf;
106 bfc_vec vn;
108 vec_ZZ extra_num;
109 int changes;
110 int no_param; // r from text
111 int only_param; // k-r-s from text
112 int total_power; // k from text
114 // created in compute_reduced_factors
115 int *bpowers;
116 // set in update_powers
117 int *npowers;
118 vec_ZZ l_extra_num;
119 int l_changes;
121 bf_reducer(mat_ZZ& factors, bfc_vec& v, bf_base *bf)
122 : factors(factors), v(v), bf(bf) {
123 nf = factors.NumRows();
124 d = factors.NumCols();
125 old2new = new int[nf];
126 sign = new int[nf];
128 extra_num.SetLength(d-1);
130 ~bf_reducer() {
131 delete [] old2new;
132 delete [] sign;
133 delete [] npowers;
134 delete [] bpowers;
137 void compute_reduced_factors();
138 void compute_extra_num(int i);
140 void reduce(barvinok_options *options);
142 void update_powers(const std::vector<int>& powers);