1 /*************************************************/
3 /* program to compare effective number of points */
4 /* in a polytope with the corresponding */
5 /* evaluation of the Ehrhart polynomial. */
6 /* Parameters vary in range -RANGE to RANGE */
7 /* (define below) by default. */
8 /* Can be overridden by specifying */
9 /* -r<RANGE>, or -m<min> and -M<max> */
11 /* written by Vincent Loechner (c) 2000. */
12 /* loechner@icps.u-strasbg.fr */
13 /*************************************************/
19 #include <polylib/polylibgmp.h>
20 #include "ev_operations.h"
25 /* define this to print all the results */
26 /* else, only a progress bar is printed */
27 /* #define PRINT_ALL_RESULTS
28 /* define this to continue the test after first error found */
29 /* #define DONT_BREAK_ON_ERROR */
31 /* RANGE : normal range for evalutations (-RANGE -> RANGE) */
34 /* SRANGE : small range for evalutations */
37 /* if dimension >= BIDDIM, use SRANGE */
40 /* VSRANGE : very small range for evalutations */
43 /* if dimension >= VBIDDIM, use VSRANGE */
50 #ifdef DONT_BREAK_ON_ERROR
51 #define PRINT_ALL_RESULTS
54 #ifndef PRINT_ALL_RESULTS
58 /****************************************************/
59 /* function check_poly : */
60 /* scans the parameter space from min to max (all */
61 /* directions). Computes the number of points in */
62 /* the polytope using both methods, and compare them*/
63 /* returns 1 on success */
64 /****************************************************/
66 int check_poly(Polyhedron
*S
, Polyhedron
*C
, Enumeration
*en
,
67 int exist
, int nparam
, int pos
, Value
*z
) {
72 value_init(c
); value_init(tmp
);
76 /* Computes the ehrhart polynomial */
77 value_assign(c
,*(ctmp
=compute_poly(en
,&z
[S
->Dimension
-nparam
+1])));
79 /* if c=0 we may be out of context. */
80 /* scanning is useless in this case*/
81 if(!in_domain(C
,&z
[S
->Dimension
-nparam
+1])) {
87 #ifdef PRINT_ALL_RESULTS
89 value_print(stdout
,VALUE_FMT
,z
[S
->Dimension
-nparam
+1]);
90 for(k
=S
->Dimension
-nparam
+2;k
<=S
->Dimension
;++k
) {
92 value_print(stdout
,VALUE_FMT
,z
[k
]);
95 value_print(stdout
,VALUE_FMT
,c
);
99 /* Manually count the number of points */
100 count_points_e(1, S
, exist
, nparam
, z
, &tmp
);
101 #ifdef PRINT_ALL_RESULTS
102 printf(", count = ");
103 value_print(stdout
, P_VALUE_FMT
, tmp
);
107 if(value_ne(tmp
,c
)) {
110 fprintf(stderr
,"Error !\n");
111 fprintf(stderr
,"EP( ");
112 value_print(stderr
,VALUE_FMT
,z
[S
->Dimension
-nparam
+1]);
113 for(k
=S
->Dimension
-nparam
+2;k
<=S
->Dimension
;++k
) {
114 fprintf(stderr
,", ");
115 value_print(stderr
,VALUE_FMT
,z
[k
]);
117 fprintf(stderr
," ) should be ");
118 value_print(stderr
,VALUE_FMT
,tmp
);
119 fprintf(stderr
,", while EP eval gives ");
120 value_print(stderr
,VALUE_FMT
,c
);
121 fprintf(stderr
,".\n");
124 Enumeration_Print(stderr
, en
, params
);
127 if (in_domain(ee
->ValidityDomain
,&z
[S
->Dimension
-nparam
+1])) {
128 Print_Domain(stderr
, ee
->ValidityDomain
, params
);
129 print_evalue(stderr
, &ee
->EP
, params
);
134 #ifndef DONT_BREAK_ON_ERROR
135 value_clear(c
); value_clear(tmp
);
140 #ifdef PRINT_ALL_RESULTS
147 for(value_assign(tmp
,min
); value_le(tmp
,max
); value_increment(tmp
,tmp
)) {
149 #ifndef PRINT_ALL_RESULTS
150 k
= VALUE_TO_INT(tmp
);
151 if(!pos
&& !(k
%st
)) {
157 value_assign(z
[pos
+S
->Dimension
-nparam
+1],tmp
);
158 if(!check_poly(S
, C
, en
, exist
, nparam
, pos
+1, z
)) {
159 value_clear(c
); value_clear(tmp
);
163 value_clear(c
); value_clear(tmp
);
167 int main(int argc
,char *argv
[])
170 Polyhedron
*C
, *P
, *S
;
179 /******* Read the input *********/
182 fgets(s
, 128, stdin
);
183 while ((*s
=='#') || (sscanf(s
, "E %d", &exist
)<1))
184 fgets(s
, 128, stdin
);
186 fgets(s
, 128, stdin
);
187 while ((*s
=='#') || (sscanf(s
, "P %d", &nparam
)<1))
188 fgets(s
, 128, stdin
);
190 P
= Constraints2Polyhedron(P1
,MAXRAYS
);
191 params
= Read_ParamNames(stdin
, nparam
);
194 /******* Read the options: initialize min and max ********/
195 if(P
->Dimension
>= VBIGDIM
)
197 else if(P
->Dimension
>= BIGDIM
)
203 for(i
=1;i
<argc
;i
++) {
204 if(!strncmp(argv
[i
],"-m",2)) {
207 m
= atoi(&argv
[i
][2]);
209 else if(!strncmp(argv
[i
],"-M",2)) {
212 M
= atoi(&argv
[i
][2]);
214 else if(!strncmp(argv
[i
], "-r", 2)) {
216 /* range specified */
217 M
= atoi(&argv
[i
][2]);
221 fprintf(stderr
,"Unknown option: %s\n",argv
[i
]);
222 fprintf(stderr
,"Usage: %s [-m<>][-M<>][-r<>]\n",argv
[0]);
228 fprintf(stderr
,"Nothing to do: min > max !\n");
237 /******* Compute true context *******/
238 C1
= Matrix_Alloc(nparam
+1,P
->Dimension
+1);
240 for(i
=0;i
<C1
->NbRows
;i
++)
241 for(j
=0;j
<C1
->NbColumns
;j
++)
242 if(i
==j
-P
->Dimension
+nparam
)
243 value_set_si(C1
->p
[i
][j
],1);
245 value_set_si(C1
->p
[i
][j
],0);
246 C
= Polyhedron_Image(P
,C1
,MAXRAYS
);
248 /******* Compute EP *********/
249 EP
= barvinok_enumerate_e(P
, exist
, nparam
, MAXRAYS
);
250 en
= partition2enumeration(EP
);
252 /******* Initializations for check *********/
253 p
= (Value
*)malloc(sizeof(Value
) * (P
->Dimension
+2));
254 for(i
=0;i
<=P
->Dimension
;i
++) {
256 value_set_si(p
[i
],0);
259 value_set_si(p
[i
],1);
261 /* S = scanning list of polyhedra */
262 S
= Polyhedron_Scan(P
,C
,MAXRAYS
);
264 #ifndef PRINT_ALL_RESULTS
265 if(C
->Dimension
> 0) {
266 value_substract(tmp
,max
,min
);
267 if (VALUE_TO_INT(tmp
) > 80)
268 st
= 1+(VALUE_TO_INT(tmp
))/80;
271 for(i
=VALUE_TO_INT(min
);i
<=VALUE_TO_INT(max
);i
+=st
)
278 /******* CHECK NOW *********/
279 if(S
&& !check_poly(S
, C
, en
, exist
, nparam
, 0, p
)) {
280 fprintf(stderr
,"Check failed !\n");
281 for(i
=0;i
<=(P
->Dimension
+1);i
++)
287 #ifndef PRINT_ALL_RESULTS
291 for(i
=0;i
<=(P
->Dimension
+1);i
++)
294 Free_ParamNames(params
, C
->Dimension
);