lexmin: more sanity checks
[barvinok.git] / test.c
blobe59895714877d62ffb2e287a29d3af7777dddef7
1 #include <assert.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <barvinok/util.h>
6 #include <barvinok/barvinok.h>
7 #include "config.h"
9 #ifdef HAVE_GROWING_CHERNIKOVA
10 #define MAXRAYS POL_NO_DUAL
11 #else
12 #define MAXRAYS 600
13 #endif
15 #ifdef HAVE_SYS_TIMES_H
17 #include <sys/times.h>
19 static void time_diff(struct tms *before, struct tms *after)
21 long ticks = sysconf(_SC_CLK_TCK);
22 printf("User: %g; Sys: %g\n",
23 (0.0 + after->tms_utime - before->tms_utime) / ticks,
24 (0.0 + after->tms_stime - before->tms_stime) / ticks);
27 #else
29 struct tms {};
30 static void times(struct tms* time)
33 static void time_diff(struct tms *before, struct tms *after)
37 #endif
39 int main()
41 int i, nbPol, nbVec, func, j;
42 Polyhedron *A, *B, *C, *D, *E, *F, *G;
43 char s[128];
45 nbPol = nbVec = 0;
46 fgets(s, 128, stdin);
47 while ((*s=='#') ||
48 ((sscanf(s, "D %d", &nbPol)<1) && (sscanf(s, "V %d", &nbVec)<1)) )
49 fgets(s, 128, stdin);
51 for (i = 0; i < nbPol; ++i) {
52 Matrix *M = Matrix_Read();
53 A = Constraints2Polyhedron(M, MAXRAYS);
54 Matrix_Free(M);
55 fgets(s, 128, stdin);
56 while ((*s=='#') || (sscanf(s, "F %d", &func)<1))
57 fgets(s, 128, stdin);
59 switch(func) {
60 case 0: {
61 Value cb, ck;
62 value_init(cb);
63 value_init(ck);
64 fgets(s, 128, stdin);
65 /* workaround for apparent bug in older gmps */
66 *strchr(s, '\n') = '\0';
67 while ((*s=='#') || (value_read(ck, s) != 0)) {
68 fgets(s, 128, stdin);
69 /* workaround for apparent bug in older gmps */
70 *strchr(s, '\n') = '\0';
72 barvinok_count(A, &cb, MAXRAYS);
73 if (value_ne(cb, ck))
74 return -1;
75 value_clear(cb);
76 value_clear(ck);
77 break;
79 case 1:
80 Polyhedron_Print(stdout, P_VALUE_FMT, A);
81 B = Polyhedron_Polar(A, MAXRAYS);
82 Polyhedron_Print(stdout, P_VALUE_FMT, B);
83 C = Polyhedron_Polar(B, MAXRAYS);
84 Polyhedron_Print(stdout, P_VALUE_FMT, C);
85 Polyhedron_Free(C);
86 Polyhedron_Free(B);
87 break;
88 case 2:
89 Polyhedron_Print(stdout, P_VALUE_FMT, A);
90 for (j = 0; j < A->NbRays; ++j) {
91 B = supporting_cone(A, j);
92 Polyhedron_Print(stdout, P_VALUE_FMT, B);
93 Polyhedron_Free(B);
95 break;
96 case 3:
97 Polyhedron_Print(stdout, P_VALUE_FMT, A);
98 C = B = NULL;
99 barvinok_decompose(A,&B,&C);
100 puts("Pos:");
101 Polyhedron_Print(stdout, P_VALUE_FMT, B);
102 puts("Neg:");
103 Polyhedron_Print(stdout, P_VALUE_FMT, C);
104 Domain_Free(B);
105 Domain_Free(C);
106 break;
107 case 4: {
108 Value cm, cb;
109 struct tms tms_before, tms_between, tms_after;
110 value_init(cm);
111 value_init(cb);
112 Polyhedron_Print(stdout, P_VALUE_FMT, A);
113 times(&tms_before);
114 manual_count(A, &cm);
115 times(&tms_between);
116 barvinok_count(A, &cb, 100);
117 times(&tms_after);
118 printf("manual: ");
119 value_print(stdout, P_VALUE_FMT, cm);
120 puts("");
121 time_diff(&tms_before, &tms_between);
122 printf("Barvinok: ");
123 value_print(stdout, P_VALUE_FMT, cb);
124 puts("");
125 time_diff(&tms_between, &tms_after);
126 value_clear(cm);
127 value_clear(cb);
128 break;
130 case 5:
131 Polyhedron_Print(stdout, P_VALUE_FMT, A);
132 B = triangulate_cone(A, 100);
133 Polyhedron_Print(stdout, P_VALUE_FMT, B);
134 check_triangulization(A, B);
135 Domain_Free(B);
136 break;
137 case 6:
138 Polyhedron_Print(stdout, P_VALUE_FMT, A);
139 B = remove_equalities(A);
140 Polyhedron_Print(stdout, P_VALUE_FMT, B);
141 Polyhedron_Free(B);
142 break;
143 case 8: {
144 evalue *EP;
145 Matrix *M = Matrix_Read();
146 char **param_name;
147 C = Constraints2Polyhedron(M, MAXRAYS);
148 Matrix_Free(M);
149 Polyhedron_Print(stdout, P_VALUE_FMT, A);
150 Polyhedron_Print(stdout, P_VALUE_FMT, C);
151 EP = barvinok_enumerate_ev(A, C, MAXRAYS);
152 param_name = Read_ParamNames(stdin, C->Dimension);
153 print_evalue(stdout, EP, param_name);
154 free_evalue_refs(EP);
155 free(EP);
156 Polyhedron_Free(C);
158 case 9:
159 Polyhedron_Print(stdout, P_VALUE_FMT, A);
160 Polyhedron_Polarize(A);
161 C = B = NULL;
162 barvinok_decompose(A,&B,&C);
163 for (D = B; D; D = D->next)
164 Polyhedron_Polarize(D);
165 for (D = C; D; D = D->next)
166 Polyhedron_Polarize(D);
167 puts("Pos:");
168 Polyhedron_Print(stdout, P_VALUE_FMT, B);
169 puts("Neg:");
170 Polyhedron_Print(stdout, P_VALUE_FMT, C);
171 Domain_Free(B);
172 Domain_Free(C);
173 break;
175 Polyhedron_Free(A);
177 for (i = 0; i < nbVec; ++i) {
178 Vector *V = Vector_Read();
179 Matrix *M = unimodular_complete(V);
180 Matrix_Print(stdout, P_VALUE_FMT, M);
181 Matrix_Free(M);
182 Vector_Free(V);
185 return 0;