4 #include "count_solutions.h"
6 typedef std::vector
<Variable_ID
> varvector
;
8 static void max_index(Constraint_Handle c
, varvector
& vv
)
10 for (Constr_Vars_Iter
cvi(c
); cvi
; ++cvi
) {
11 Variable_ID var
= (*cvi
).var
;
12 if (find(vv
.begin(), vv
.end(), var
) == vv
.end())
17 double count_solutions(Relation
& r
)
27 for (int j
= 1; j
<= r
.n_set(); ++j
)
28 vv
.push_back(r
.set_var(j
));
30 dim
= r
.n_inp() + r
.n_out();
31 for (int j
= 1; j
<= r
.n_inp(); ++j
)
32 vv
.push_back(r
.input_var(j
));
33 for (int j
= 1; j
<= r
.n_out(); ++j
)
34 vv
.push_back(r
.output_var(j
));
38 for (DNF_Iterator
di(r
.query_DNF()); di
; ++di
) {
40 for (EQ_Iterator ei
= (*di
)->EQs(); ei
; ++ei
)
42 for (GEQ_Iterator gi
= (*di
)->GEQs(); gi
; ++gi
)
44 if (vv
.size() > max_size
)
48 int *coeffs
= new int[max_size
];
49 int *indices
= new int[max_size
];
52 for (DNF_Iterator
di(r
.query_DNF()); di
; ++di
) {
57 for (EQ_Iterator ei
= (*di
)->EQs(); ei
; ++ei
)
59 for (GEQ_Iterator gi
= (*di
)->GEQs(); gi
; ++gi
)
62 for (EQ_Iterator ei
= (*di
)->EQs(); ei
; ++ei
) {
64 for (i
= 0, j
= 0; i
< vv
.size(); ++i
) {
65 if ((*ei
).get_coef(vv
[i
]) != 0) {
66 coeffs
[j
] = (*ei
).get_coef(vv
[i
]);
70 DFA
*e
= build_DFA_eq(j
, coeffs
, (*ei
).get_const(), indices
);
75 c
= dfaMinimize(dfaProduct(c
, e
, dfaAND
));
80 for (GEQ_Iterator gi
= (*di
)->GEQs(); gi
; ++gi
) {
82 for (i
= 0, j
= 0; i
< vv
.size(); ++i
) {
83 if ((*gi
).get_coef(vv
[i
]) != 0) {
84 coeffs
[j
] = -(*gi
).get_coef(vv
[i
]);
88 DFA
* e
= build_DFA_ineq(j
, coeffs
, -(*gi
).get_const()-1, indices
);
93 c
= dfaMinimize(dfaProduct(c
, e
, dfaAND
));
100 for (int i
= dim
; i
< vv
.size(); ++i
) {
102 c
= dfaMinimize(dfaProject(c
, i
));
110 dfa
= dfaMinimize(dfaProduct(dfa
, c
, dfaOR
));
116 double c
= count_accepting_paths(dfa
, dfa
->ns
, dim
);