1 #include "genfun_constructor.h"
3 gf_base
*gf_base::create(Polyhedron
*context
, unsigned dim
, unsigned nparam
,
4 barvinok_options
*options
)
7 if (options
->incremental_specialization
== 2)
8 red
= new partial_bfcounter(context
, dim
, nparam
);
9 else if (options
->incremental_specialization
== 1)
10 red
= new partial_ireducer(context
, dim
, nparam
);
12 red
= new partial_reducer(context
, dim
, nparam
);
16 void partial_ireducer::base(QQ
& c
, const vec_ZZ
& num
, const mat_ZZ
& den_f
)
18 gf
->add(c
, num
, den_f
);
21 void partial_reducer::split(vec_ZZ
& num
, ZZ
& num_s
, vec_ZZ
& num_p
,
22 const mat_ZZ
& den_f
, vec_ZZ
& den_s
, mat_ZZ
& den_r
)
24 unsigned len
= den_f
.NumRows(); // number of factors in den
25 unsigned nvar
= tmp
.length();
28 den_r
.SetDims(len
, lower
);
30 for (int r
= 0; r
< len
; ++r
) {
33 for (int k
= 0; k
< nvar
; ++k
)
35 den_s
[r
] = tmp
* lambda
;
36 all_zero
= den_s
[r
] == 0;
38 for (int k
= nvar
; k
< dim
; ++k
) {
39 den_r
[r
][k
-nvar
] = den_f
[r
][k
];
41 all_zero
= den_r
[r
][k
-nvar
] == 0;
47 for (int k
= 0; k
< nvar
; ++k
)
50 num_p
.SetLength(lower
);
51 for (int k
= nvar
; k
< dim
; ++k
)
52 num_p
[k
-nvar
] = num
[k
];
55 void partial_reducer::base(QQ
& c
, const vec_ZZ
& num
, const mat_ZZ
& den_f
)
57 gf
->add(c
, num
, den_f
);
60 void partial_bfcounter::base(mat_ZZ
& factors
, bfc_vec
& v
)
63 unsigned nf
= factors
.NumRows();
65 for (int i
= 0; i
< v
.size(); ++i
) {
66 bfc_term
* bfct
= static_cast<bfc_term
*>(v
[i
]);
67 den
.SetDims(0, lower
);
70 for (int j
= 0; j
< nf
; ++j
) {
71 total_power
+= v
[i
]->powers
[j
];
72 den
.SetDims(total_power
, lower
);
73 for (int k
= 0; k
< v
[i
]->powers
[j
]; ++k
)
74 den
[p
++] = factors
[j
];
76 for (int j
= 0; j
< v
[i
]->terms
.NumRows(); ++j
)
77 gf
->add(bfct
->c
[j
], v
[i
]->terms
[j
], den
);