5 #include <NTL/mat_ZZ.h>
6 #include <barvinok/NTL_QQ.h>
7 #include <barvinok/options.h>
8 #include "decomposer.h"
15 extern struct OrthogonalException
{} Orthogonal
;
17 /* base for non-parametric counting */
18 struct np_base
: public signed_cone_consumer
{
21 np_base(unsigned dim
) {
26 virtual void handle(const mat_ZZ
& rays
, Value
*vertex
, const QQ
& c
,
28 barvinok_options
*options
) = 0;
29 virtual void handle(const signed_cone
& sc
, barvinok_options
*options
);
30 virtual void start(Polyhedron
*P
, barvinok_options
*options
);
31 void do_vertex_cone(const QQ
& factor
, Polyhedron
*Cone
,
32 Value
*vertex
, barvinok_options
*options
) {
33 current_vertex
= vertex
;
34 this->factor
= factor
;
35 barvinok_decompose(Cone
, *this, options
);
37 virtual void init(Polyhedron
*P
, int n_try
) {
39 virtual void reset() {
42 virtual void get_count(Value
*result
) {
50 Value
*current_vertex
;
53 struct reducer
: public np_base
{
58 int lower
; // call base when only this many variables is left
61 reducer(unsigned dim
) : np_base(dim
) {
62 vertex
.SetDims(1, dim
);
76 virtual void handle(const mat_ZZ
& rays
, Value
*vertex
, const QQ
& c
,
77 unsigned long det
, barvinok_options
*options
);
78 void reduce(const vec_QQ
& c
, const mat_ZZ
& num
, const mat_ZZ
& den_f
);
79 void reduce_canonical(const vec_QQ
& c
, const mat_ZZ
& num
,
81 virtual void base(const QQ
& c
, const vec_ZZ
& num
, const mat_ZZ
& den_f
) = 0;
82 virtual void base(const vec_QQ
& c
, const mat_ZZ
& num
, const mat_ZZ
& den_f
);
83 virtual void split(const mat_ZZ
& num
, vec_ZZ
& num_s
, mat_ZZ
& num_p
,
84 const mat_ZZ
& den_f
, vec_ZZ
& den_s
, mat_ZZ
& den_r
) = 0;
85 virtual gen_fun
*get_gf() {
91 void split_one(const mat_ZZ
& num
, vec_ZZ
& num_s
, mat_ZZ
& num_p
,
92 const mat_ZZ
& den_f
, vec_ZZ
& den_s
, mat_ZZ
& den_r
);
94 struct ireducer
: public reducer
{
95 ireducer(unsigned dim
) : reducer(dim
) {}
97 virtual void split(const mat_ZZ
& num
, vec_ZZ
& num_s
, mat_ZZ
& num_p
,
98 const mat_ZZ
& den_f
, vec_ZZ
& den_s
, mat_ZZ
& den_r
) {
99 split_one(num
, num_s
, num_p
, den_f
, den_s
, den_r
);
103 void normalize(ZZ
& sign
, vec_ZZ
& num_s
, mat_ZZ
& num_p
, vec_ZZ
& den_s
, vec_ZZ
& den_p
,
106 // incremental counter
107 struct icounter
: public ireducer
{
110 icounter(unsigned dim
) : ireducer(dim
) {
117 virtual void base(const QQ
& c
, const vec_ZZ
& num
, const mat_ZZ
& den_f
);
118 virtual void get_count(Value
*result
) {
119 assert(value_one_p(&count
[0]._mp_den
));
120 value_assign(*result
, &count
[0]._mp_num
);