1 #include <NTL/vec_ZZ.h>
2 #include <NTL/mat_ZZ.h>
3 #include <barvinok/NTL_QQ.h>
4 #include <barvinok/polylib.h>
5 #include "genfun_constructor.h"
7 gf_base
*gf_base::create(Polyhedron
*context
, unsigned dim
, unsigned nparam
,
8 barvinok_options
*options
)
11 if (options
->incremental_specialization
== 2)
12 red
= new partial_bfcounter(context
, dim
, nparam
);
13 else if (options
->incremental_specialization
== 1)
14 red
= new partial_ireducer(context
, dim
, nparam
);
16 red
= new partial_reducer(context
, dim
, nparam
);
20 void partial_ireducer::base(const QQ
& c
, const vec_ZZ
& num
, const mat_ZZ
& den_f
)
22 gf
->add(c
, num
, den_f
);
25 void partial_reducer::split(const mat_ZZ
& num
, vec_ZZ
& num_s
, mat_ZZ
& num_p
,
26 const mat_ZZ
& den_f
, vec_ZZ
& den_s
, mat_ZZ
& den_r
)
28 unsigned len
= den_f
.NumRows(); // number of factors in den
29 unsigned nvar
= tmp
.length();
32 den_r
.SetDims(len
, lower
);
34 for (int r
= 0; r
< len
; ++r
) {
37 for (int k
= 0; k
< nvar
; ++k
)
39 den_s
[r
] = tmp
* lambda
;
40 all_zero
= den_s
[r
] == 0;
42 for (int k
= nvar
; k
< dim
; ++k
) {
43 den_r
[r
][k
-nvar
] = den_f
[r
][k
];
45 all_zero
= den_r
[r
][k
-nvar
] == 0;
51 num_s
.SetLength(num
.NumRows());
52 num_p
.SetDims(num
.NumRows(), lower
);
53 for (int i
= 0; i
< num
.NumRows(); ++i
) {
54 for (int k
= 0; k
< nvar
; ++k
)
56 num_s
[i
] = tmp
* lambda
;
57 for (int k
= nvar
; k
< dim
; ++k
)
58 num_p
[i
][k
-nvar
] = num
[i
][k
];
62 void partial_reducer::base(const QQ
& c
, const vec_ZZ
& num
, const mat_ZZ
& den_f
)
64 gf
->add(c
, num
, den_f
);
67 void partial_reducer::base(const vec_QQ
& c
, const mat_ZZ
& num
, const mat_ZZ
& den_f
)
69 gf
->add(new short_rat(c
, num
, den_f
));
72 void partial_bfcounter::base(mat_ZZ
& factors
, bfc_vec
& v
)
75 unsigned nf
= factors
.NumRows();
77 for (int i
= 0; i
< v
.size(); ++i
) {
78 bfc_term
* bfct
= static_cast<bfc_term
*>(v
[i
]);
79 den
.SetDims(0, lower
);
82 for (int j
= 0; j
< nf
; ++j
) {
83 total_power
+= v
[i
]->powers
[j
];
84 den
.SetDims(total_power
, lower
);
85 for (int k
= 0; k
< v
[i
]->powers
[j
]; ++k
)
86 den
[p
++] = factors
[j
];
88 for (int j
= 0; j
< v
[i
]->terms
.NumRows(); ++j
)
89 gf
->add(bfct
->c
[j
], v
[i
]->terms
[j
], den
);