add .gitignore
[barvinok.git] / genfun_constructor.cc
blob51ec57dc72ad4da13a9323e6c7e6d17007d022a9
1 #include "genfun_constructor.h"
3 gf_base *gf_base::create(Polyhedron *context, unsigned dim, unsigned nparam,
4 barvinok_options *options)
6 gf_base *red;
7 if (options->incremental_specialization == 2)
8 red = new partial_bfcounter(context, dim, nparam);
9 else if (options->incremental_specialization == 1)
10 red = new partial_ireducer(context, dim, nparam);
11 else
12 red = new partial_reducer(context, dim, nparam);
13 return red;
16 void partial_ireducer::base(QQ& c, const vec_ZZ& num, const mat_ZZ& den_f)
18 gf->add(c, num, den_f);
21 void partial_reducer::split(vec_ZZ& num, ZZ& num_s, vec_ZZ& num_p,
22 const mat_ZZ& den_f, vec_ZZ& den_s, mat_ZZ& den_r)
24 unsigned len = den_f.NumRows(); // number of factors in den
25 unsigned nvar = tmp.length();
27 den_s.SetLength(len);
28 den_r.SetDims(len, lower);
30 for (int r = 0; r < len; ++r) {
31 bool all_zero;
33 for (int k = 0; k < nvar; ++k)
34 tmp[k] = den_f[r][k];
35 den_s[r] = tmp * lambda;
36 all_zero = den_s[r] == 0;
38 for (int k = nvar; k < dim; ++k) {
39 den_r[r][k-nvar] = den_f[r][k];
40 if (all_zero)
41 all_zero = den_r[r][k-nvar] == 0;
43 if (all_zero)
44 throw Orthogonal;
47 for (int k = 0; k < nvar; ++k)
48 tmp[k] = num[k];
49 num_s = tmp *lambda;
50 num_p.SetLength(lower);
51 for (int k = nvar ; k < dim; ++k)
52 num_p[k-nvar] = num[k];
55 void partial_reducer::base(QQ& c, const vec_ZZ& num, const mat_ZZ& den_f)
57 gf->add(c, num, den_f);
60 void partial_bfcounter::base(mat_ZZ& factors, bfc_vec& v)
62 mat_ZZ den;
63 unsigned nf = factors.NumRows();
65 for (int i = 0; i < v.size(); ++i) {
66 bfc_term* bfct = static_cast<bfc_term *>(v[i]);
67 den.SetDims(0, lower);
68 int total_power = 0;
69 int p = 0;
70 for (int j = 0; j < nf; ++j) {
71 total_power += v[i]->powers[j];
72 den.SetDims(total_power, lower);
73 for (int k = 0; k < v[i]->powers[j]; ++k)
74 den[p++] = factors[j];
76 for (int j = 0; j < v[i]->terms.NumRows(); ++j)
77 gf->add(bfct->c[j], v[i]->terms[j], den);
78 delete v[i];