4 #include <barvinok/polylib.h>
5 #include <barvinok/NTL_QQ.h>
9 // the number of times a given factor appears in the denominator
13 bfc_term_base(int len
) {
14 powers
= new int[len
];
17 virtual ~bfc_term_base() {
22 struct bfc_term
: public bfc_term_base
{
25 bfc_term(int len
) : bfc_term_base(len
) {}
28 typedef std::vector
< bfc_term_base
* > bfc_vec
;
32 struct bf_base
: public np_base
{
36 int lower
; // call base when only this many variables is left
38 bf_base(unsigned dim
) : np_base(dim
) {
50 virtual void handle(const mat_ZZ
& rays
, Value
*vertex
, const QQ
& c
,
51 unsigned long det
, barvinok_options
*options
);
52 int setup_factors(const mat_ZZ
& rays
, mat_ZZ
& factors
, bfc_term_base
* t
, int s
);
54 bfc_term_base
* find_bfc_term(bfc_vec
& v
, int *powers
, int len
);
55 void add_term(bfc_term_base
*t
, vec_ZZ
& num1
, vec_ZZ
& num
);
56 void add_term(bfc_term_base
*t
, vec_ZZ
& num
);
58 void reduce(mat_ZZ
& factors
, bfc_vec
& v
, barvinok_options
*options
);
59 virtual void base(mat_ZZ
& factors
, bfc_vec
& v
) = 0;
61 virtual bfc_term_base
* new_bf_term(int len
) = 0;
62 virtual void set_factor(bfc_term_base
*t
, int k
, int change
) = 0;
63 virtual void set_factor(bfc_term_base
*t
, int k
, mpq_t
&f
, int change
) = 0;
64 virtual void set_factor(bfc_term_base
*t
, int k
, const QQ
& c
, int change
) = 0;
65 virtual void update_term(bfc_term_base
*t
, int i
) = 0;
66 virtual void insert_term(bfc_term_base
*t
, int i
) = 0;
67 virtual bool constant_vertex(int dim
) = 0;
68 virtual void cum(bf_reducer
*bfr
, bfc_term_base
*t
, int k
,
69 dpoly_r
*r
, barvinok_options
*options
) = 0;
72 struct bfcounter_base
: public bf_base
{
75 bfcounter_base(unsigned dim
) : bf_base(dim
) {
78 bfc_term_base
* new_bf_term(int len
);
80 virtual void set_factor(bfc_term_base
*t
, int k
, int change
);
81 virtual void set_factor(bfc_term_base
*t
, int k
, mpq_t
&f
, int change
);
82 virtual void set_factor(bfc_term_base
*t
, int k
, const QQ
& c_factor
, int change
);
83 virtual void insert_term(bfc_term_base
*t
, int i
);
84 virtual void update_term(bfc_term_base
*t
, int i
);
86 virtual bool constant_vertex(int dim
) { return true; }
87 virtual void cum(bf_reducer
*bfr
, bfc_term_base
*t
, int k
, dpoly_r
*r
,
88 barvinok_options
*options
) {
109 int no_param
; // r from text
110 int only_param
; // k-r-s from text
111 int total_power
; // k from text
113 // created in compute_reduced_factors
115 // set in update_powers
120 bf_reducer(mat_ZZ
& factors
, bfc_vec
& v
, bf_base
*bf
)
121 : factors(factors
), v(v
), bf(bf
) {
122 nf
= factors
.NumRows();
123 d
= factors
.NumCols();
124 old2new
= new int[nf
];
127 extra_num
.SetLength(d
-1);
136 void compute_reduced_factors();
137 void compute_extra_num(int i
);
139 void reduce(barvinok_options
*options
);
141 void update_powers(const std::vector
<int>& powers
);