barvinok_enumerate: respect incremental_specialization option
[barvinok.git] / genfun_constructor.h
blob12388a0a1cba22e546ccbf7f6a2657b60d646a28
1 #include <gmp.h>
2 #include <NTL/mat_ZZ.h>
3 #include <barvinok/util.h>
4 #include <barvinok/genfun.h>
5 #include <barvinok/options.h>
6 #include "reducer.h"
7 #include "bfcounter.h"
9 #ifdef NTL_STD_CXX
10 using namespace NTL;
11 #endif
13 /* base for generating function counting */
14 struct gf_base {
15 np_base *base;
16 gen_fun *gf;
18 gf_base(np_base *npb, Polyhedron *context) : base(npb) {
19 gf = new gen_fun(context);
21 virtual ~gf_base() {
23 static gf_base *create(Polyhedron *context, unsigned dim, unsigned nparam,
24 barvinok_options *options);
26 void start_gf(Polyhedron *P, barvinok_options *options) {
27 base->start(P, options);
31 struct partial_ireducer : public ireducer, public gf_base {
32 partial_ireducer(Polyhedron *context, unsigned dim, unsigned nparam) :
33 ireducer(dim), gf_base(this, context) {
34 lower = nparam;
36 ~partial_ireducer() {
38 virtual void base(QQ& c, const vec_ZZ& num, const mat_ZZ& den_f);
39 virtual gen_fun *get_gf() {
40 return gf;
44 struct partial_reducer : public reducer, public gf_base {
45 vec_ZZ lambda;
46 vec_ZZ tmp;
48 partial_reducer(Polyhedron *context, unsigned dim, unsigned nparam) :
49 reducer(dim), gf_base(this, context) {
50 lower = nparam;
52 tmp.SetLength(dim - nparam);
54 virtual void init(Polyhedron *P) {
55 randomvector(P, lambda, dim - lower);
57 ~partial_reducer() {
59 virtual void base(QQ& c, const vec_ZZ& num, const mat_ZZ& den_f);
61 virtual void split(vec_ZZ& num, ZZ& num_s, vec_ZZ& num_p,
62 mat_ZZ& den_f, vec_ZZ& den_s, mat_ZZ& den_r);
63 virtual gen_fun *get_gf() {
64 return gf;
68 struct partial_bfcounter : public bfcounter_base, public gf_base {
69 partial_bfcounter(Polyhedron *context, unsigned dim, unsigned nparam) :
70 bfcounter_base(dim), gf_base(this, context) {
71 lower = nparam;
73 ~partial_bfcounter() {
75 virtual void base(mat_ZZ& factors, bfc_vec& v);