3 #include <barvinok/genfun.h>
4 #include <barvinok/util.h>
5 #include <barvinok/barvinok.h>
6 #include <barvinok/basis_reduction.h>
13 static Polyhedron
*uncone(Polyhedron
*C
, unsigned MaxRays
)
19 Constraints
= Matrix_Alloc(C
->NbConstraints
, 1+(C
->Dimension
-1)+1);
20 for (i
= 0; i
< C
->NbConstraints
; ++i
) {
21 /* positivity constraints */
22 if (First_Non_Zero(C
->Constraint
[i
]+1, C
->Dimension
) == -1) {
23 assert(i
== C
->NbConstraints
-1);
24 Constraints
->NbRows
= i
;
27 assert(value_zero_p(C
->Constraint
[i
][1+C
->Dimension
]));
28 Vector_Copy(C
->Constraint
[i
], Constraints
->p
[i
], 1+C
->Dimension
);
30 P
= Constraints2Polyhedron(Constraints
, MaxRays
);
31 Matrix_Free(Constraints
);
36 void static scan(gen_fun
*S
)
41 params
= Vector_Alloc(2);
42 for (int j
= 19; j
<= 39; ++j
) {
43 value_set_si(params
->p
[1], j
);
44 for (int i
= 8; i
<= 17; ++i
) {
45 value_set_si(params
->p
[0], i
);
46 S
->coefficient(params
->p
, &c
);
47 fprintf(stderr
, "%d %d: ", i
, j
);
48 value_print(stderr
, VALUE_FMT
, c
);
49 fprintf(stderr
, "\n");
56 int main(int argc
, char **argv
)
59 Polyhedron
*P
, *C
, *B
, *Pold
;
62 gen_fun
*S
, *S_shift
, *hp
, *S_divide
, *frob
;
68 barvinok_options
*options
= barvinok_options_new_with_defaults();
70 coins
= Vector_Read();
72 assert(coins
->Size
== 4);
74 M
= Matrix_Alloc(5, 7);
75 Vector_Copy(coins
->p
, M
->p
[0]+1, 4);
77 value_set_si(M
->p
[0][1+4], -1);
78 for (int i
= 0; i
< 4; ++i
) {
79 value_set_si(M
->p
[1+i
][0], 1);
80 value_set_si(M
->p
[1+i
][1+i
], 1);
82 C
= Constraints2Polyhedron(M
, options
->MaxRays
);
84 C
= remove_equalities_p(C
, 4, NULL
, options
->MaxRays
);
86 Polyhedron_Print(stderr
, P_VALUE_FMT
, C
);
88 B
= uncone(C
, options
->MaxRays
);
90 basis
= Polyhedron_Reduced_Basis(B
, options
);
91 small
= Vector_Alloc(B
->Dimension
+ 2);
92 Vector_Copy(basis
->p
[0], small
->p
, B
->Dimension
);
96 T
= Matrix_Alloc(small
->Size
, small
->Size
);
97 Vector_Copy(small
->p
, T
->p
[0], small
->Size
);
98 ok
= unimodular_complete(T
, 1);
101 Vector_Exchange(T
->p
[0], T
->p
[2], T
->NbColumns
);
102 Matrix_Print(stderr
, P_VALUE_FMT
, T
);
104 Polyhedron_Print(stderr
, P_VALUE_FMT
, C
);
105 P
= Polyhedron_Image(C
, T
, options
->MaxRays
);
109 Polyhedron_Print(stderr
, P_VALUE_FMT
, P
);
115 S
= barvinok_enumerate_scarf_series(P
, 2, 2, options
);
116 S
->print(std::cerr
, 0, NULL
);
119 S_shift
= new gen_fun(S
);
120 S_divide
= new gen_fun(S
);
121 S_divide
->divide(up
);
128 hp
= S
->Hadamard_product(S_shift
, options
);
129 S
->add(mone
, hp
, options
);
133 hp
= S
->Hadamard_product(S_divide
, options
);
134 ok
= hp
->summate(&c
);
136 assert(value_zero_p(c
));
142 frob
= S
->summate(1, options
);
143 frob
->print(std::cout
, 0, NULL
);
152 barvinok_options_free(options
);