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 bool is_indicator(gen_fun
*gf
, barvinok_options
*options
)
61 test
= gf
->Hadamard_product(gf
, options
);
62 test
->add(mone
, gf
, options
);
64 test
->print(std::cerr
, 0, NULL
);
68 int main(int argc
, char **argv
)
71 Polyhedron
*P
, *C
, *B
, *Pold
;
74 gen_fun
*S
, *S_shift
, *hp
, *S_divide
, *frob
;
80 barvinok_options
*options
= barvinok_options_new_with_defaults();
82 coins
= Vector_Read();
84 assert(coins
->Size
== 4);
86 M
= Matrix_Alloc(5, 7);
87 Vector_Copy(coins
->p
, M
->p
[0]+1, 4);
89 value_set_si(M
->p
[0][1+4], -1);
90 for (int i
= 0; i
< 4; ++i
) {
91 value_set_si(M
->p
[1+i
][0], 1);
92 value_set_si(M
->p
[1+i
][1+i
], 1);
94 C
= Constraints2Polyhedron(M
, options
->MaxRays
);
96 C
= remove_equalities_p(C
, 4, NULL
, options
->MaxRays
);
98 Polyhedron_Print(stderr
, P_VALUE_FMT
, C
);
100 B
= uncone(C
, options
->MaxRays
);
102 basis
= Polyhedron_Reduced_Basis(B
, options
);
103 small
= Vector_Alloc(B
->Dimension
+ 2);
104 Vector_Copy(basis
->p
[0], small
->p
, B
->Dimension
);
108 T
= Matrix_Alloc(small
->Size
, small
->Size
);
109 Vector_Copy(small
->p
, T
->p
[0], small
->Size
);
110 ok
= unimodular_complete(T
, 1);
113 Vector_Exchange(T
->p
[0], T
->p
[2], T
->NbColumns
);
114 Matrix_Print(stderr
, P_VALUE_FMT
, T
);
116 Polyhedron_Print(stderr
, P_VALUE_FMT
, C
);
117 P
= Polyhedron_Image(C
, T
, options
->MaxRays
);
121 Polyhedron_Print(stderr
, P_VALUE_FMT
, P
);
127 S
= barvinok_enumerate_scarf_series(P
, 2, 2, options
);
128 S
->print(std::cerr
, 0, NULL
);
131 S_shift
= new gen_fun(S
);
132 S_divide
= new gen_fun(S
);
133 S_divide
->divide(up
);
140 hp
= S
->Hadamard_product(S_shift
, options
);
141 S
->add(mone
, hp
, options
);
145 hp
= S
->Hadamard_product(S_divide
, options
);
146 ok
= hp
->summate(&c
);
148 assert(value_zero_p(c
));
154 frob
= S
->summate(1, options
);
155 frob
->print(std::cout
, 0, NULL
);
164 barvinok_options_free(options
);