4 #include <NTL/mat_ZZ.h>
5 #include <barvinok/NTL_QQ.h>
6 #include "decomposer.h"
13 /* base for non-parametric counting */
14 struct np_base
: public polar_decomposer
{
19 np_base(unsigned dim
) {
25 virtual void handle_polar(Polyhedron
*C
, Value
*vertex
, QQ c
) = 0;
26 virtual void handle_polar(Polyhedron
*C
, int s
);
27 void start(Polyhedron
*P
, unsigned MaxRays
);
28 virtual void init(Polyhedron
*P
) {
32 Value
*current_vertex
;
36 struct reducer
: public np_base
{
43 int lower
; // call base when only this many variables is left
45 reducer(unsigned dim
) : np_base(dim
) {
58 virtual void handle_polar(Polyhedron
*C
, Value
*vertex
, QQ c
);
59 void reduce(QQ c
, vec_ZZ
& num
, mat_ZZ
& den_f
);
60 virtual void base(QQ
& c
, const vec_ZZ
& num
, const mat_ZZ
& den_f
) = 0;
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
) = 0;
65 struct ireducer
: public reducer
{
66 ireducer(unsigned dim
) : reducer(dim
) {}
68 virtual void split(vec_ZZ
& num
, ZZ
& num_s
, vec_ZZ
& num_p
,
69 mat_ZZ
& den_f
, vec_ZZ
& den_s
, mat_ZZ
& den_r
);
72 void normalize(ZZ
& sign
, ZZ
& num_s
, vec_ZZ
& num_p
, vec_ZZ
& den_s
, vec_ZZ
& den_p
,