1   /*<html><pre>  -<a                             href="qh-stat.htm"
2   >-------------------------------</a><a name="TOP">-</a>
3 
4    stat.h
5      contains all statistics that are collected for qhull
6 
7    see qh-stat.htm and stat.c
8 
9    copyright (c) 1993-2003, The Geometry Center
10 
11    recompile qhull if you change this file
12 
13    Integer statistics are Z* while real statistics are W*.
14 
15    define maydebugx to call a routine at every statistic event
16 
17 */
18 
19 #ifndef qhDEFstat
20 #define qhDEFstat 1
21 
22 
23 /*-<a                             href="qh-stat.htm#TOC"
24   >-------------------------------</a><a name="KEEPstatistics">-</a>
25 
26   qh_KEEPstatistics
27     0 turns off statistic gathering (except zzdef/zzinc/zzadd/zzval/wwval)
28 */
29 #ifndef qh_KEEPstatistics
30 #define qh_KEEPstatistics 1
31 #endif
32 
33 /*-<a                             href="qh-stat.htm#TOC"
34   >-------------------------------</a><a name="statistics">-</a>
35 
36   Zxxx for integers, Wxxx for reals
37 
38   notes:
39     be sure that all statistics are defined in stat.c
40       otherwise initialization may core dump
41     can pick up all statistics by:
42       grep '[zw].*_[(][ZW]' *.c >z.x
43     remove trailers with query">-</a>
44     remove leaders with  query-replace-regexp [ ^I]+  (
45 */
46 #if qh_KEEPstatistics
47 enum statistics {     /* alphabetical after Z/W */
48     Zacoplanar,
49     Wacoplanarmax,
50     Wacoplanartot,
51     Zangle,
52     Wangle,
53     Wanglemax,
54     Wanglemin,
55     Zangletests,
56     Wareatot,
57     Wareamax,
58     Wareamin,
59     Zavoidold,
60     Wavoidoldmax,
61     Wavoidoldtot,
62     Zback0,
63     Zbestcentrum,
64     Zbestdist,
65     Zbestlower,
66     Zbestlowerv,
67     Zcentrumtests,
68     Zcheckpart,
69     Zcomputefurthest,
70     Zconcave,
71     Wconcavemax,
72     Wconcavetot,
73     Zconcaveridges,
74     Zconcaveridge,
75     Zcoplanar,
76     Wcoplanarmax,
77     Wcoplanartot,
78     Zcoplanarangle,
79     Zcoplanarcentrum,
80     Zcoplanarhorizon,
81     Zcoplanarinside,
82     Zcoplanarpart,
83     Zcoplanarridges,
84     Wcpu,
85     Zcyclefacetmax,
86     Zcyclefacettot,
87     Zcyclehorizon,
88     Zcyclevertex,
89     Zdegen,
90     Wdegenmax,
91     Wdegentot,
92     Zdegenvertex,
93     Zdelfacetdup,
94     Zdelridge,
95     Zdelvertextot,
96     Zdelvertexmax,
97     Zdetsimplex,
98     Zdistcheck,
99     Zdistconvex,
100     Zdistgood,
101     Zdistio,
102     Zdistplane,
103     Zdiststat,
104     Zdistvertex,
105     Zdistzero,
106     Zdoc1,
107     Zdoc2,
108     Zdoc3,
109     Zdoc4,
110     Zdoc5,
111     Zdoc6,
112     Zdoc7,
113     Zdoc8,
114     Zdoc9,
115     Zdoc10,
116     Zdoc11,
117     Zdoc12,
118     Zdropdegen,
119     Zdropneighbor,
120     Zdupflip,
121     Zduplicate,
122     Wduplicatemax,
123     Wduplicatetot,
124     Zdupridge,
125     Zdupsame,
126     Zflipped,
127     Wflippedmax,
128     Wflippedtot,
129     Zflippedfacets,
130     Zfindbest,
131     Zfindbestmax,
132     Zfindbesttot,
133     Zfindcoplanar,
134     Zfindfail,
135     Zfindhorizon,
136     Zfindhorizonmax,
137     Zfindhorizontot,
138     Zfindjump,
139     Zfindnew,
140     Zfindnewmax,
141     Zfindnewtot,
142     Zfindnewjump,
143     Zfindnewsharp,
144     Zgauss0,
145     Zgoodfacet,
146     Zhashlookup,
147     Zhashridge,
148     Zhashridgetest,
149     Zhashtests,
150     Zinsidevisible,
151     Zintersect,
152     Zintersectfail,
153     Zintersectmax,
154     Zintersectnum,
155     Zintersecttot,
156     Zmaxneighbors,
157     Wmaxout,
158     Wmaxoutside,
159     Zmaxridges,
160     Zmaxvertex,
161     Zmaxvertices,
162     Zmaxvneighbors,
163     Zmemfacets,
164     Zmempoints,
165     Zmemridges,
166     Zmemvertices,
167     Zmergeflipdup,
168     Zmergehorizon,
169     Zmergeinittot,
170     Zmergeinitmax,
171     Zmergeinittot2,
172     Zmergeintohorizon,
173     Zmergenew,
174     Zmergesettot,
175     Zmergesetmax,
176     Zmergesettot2,
177     Zmergesimplex,
178     Zmergevertex,
179     Wmindenom,
180     Wminvertex,
181     Zminnorm,
182     Zmultiridge,
183     Znearlysingular,
184     Zneighbor,
185     Wnewbalance,
186     Wnewbalance2,
187     Znewfacettot,
188     Znewfacetmax,
189     Znewvertex,
190     Wnewvertex,
191     Wnewvertexmax,
192     Znoarea,
193     Znonsimplicial,
194     Znowsimplicial,
195     Znotgood,
196     Znotgoodnew,
197     Znotmax,
198     Znumfacets,
199     Znummergemax,
200     Znummergetot,
201     Znumneighbors,
202     Znumridges,
203     Znumvertices,
204     Znumvisibility,
205     Znumvneighbors,
206     Zonehorizon,
207     Zpartangle,
208     Zpartcoplanar,
209     Zpartflip,
210     Zparthorizon,
211     Zpartinside,
212     Zpartition,
213     Zpartitionall,
214     Zpartnear,
215     Zpbalance,
216     Wpbalance,
217     Wpbalance2,
218     Zpostfacets,
219     Zpremergetot,
220     Zprocessed,
221     Zremvertex,
222     Zremvertexdel,
223     Zrenameall,
224     Zrenamepinch,
225     Zrenameshare,
226     Zretry,
227     Wretrymax,
228     Zridge,
229     Wridge,
230     Wridgemax,
231     Zridge0,
232     Wridge0,
233     Wridge0max,
234     Zridgemid,
235     Wridgemid,
236     Wridgemidmax,
237     Zridgeok,
238     Wridgeok,
239     Wridgeokmax,
240     Zsearchpoints,
241     Zsetplane,
242     Ztestvneighbor,
243     Ztotcheck,
244     Ztothorizon,
245     Ztotmerge,
246     Ztotpartcoplanar,
247     Ztotpartition,
248     Ztotridges,
249     Ztotvertices,
250     Ztotvisible,
251     Ztricoplanar,
252     Ztricoplanarmax,
253     Ztricoplanartot,
254     Ztridegen,
255     Ztrimirror,
256     Ztrinull,
257     Wvertexmax,
258     Wvertexmin,
259     Zvertexridge,
260     Zvertexridgetot,
261     Zvertexridgemax,
262     Zvertices,
263     Zvisfacettot,
264     Zvisfacetmax,
265     Zvisvertextot,
266     Zvisvertexmax,
267     Zwidefacet,
268     Zwidevertices,
269     ZEND};
270 
271 /*-<a                             href="qh-stat.htm#TOC"
272   >-------------------------------</a><a name="ZZstat">-</a>
273 
274   Zxxx/Wxxx statistics that remain defined if qh_KEEPstatistics=0
275 
276   notes:
277     be sure to use zzdef, zzinc, etc. with these statistics (no double checking!)
278 */
279 #else
280 enum statistics {     /* for zzdef etc. macros */
281   Zback0,
282   Zbestdist,
283   Zcentrumtests,
284   Zcheckpart,
285   Zconcaveridges,
286   Zcoplanarhorizon,
287   Zcoplanarpart,
288   Zcoplanarridges,
289   Zcyclefacettot,
290   Zcyclehorizon,
291   Zdelvertextot,
292   Zdistcheck,
293   Zdistconvex,
294   Zdistzero,
295   Zdoc1,
296   Zdoc2,
297   Zdoc3,
298   Zdoc11,
299   Zflippedfacets,
300   Zgauss0,
301   Zminnorm,
302   Zmultiridge,
303   Znearlysingular,
304   Wnewvertexmax,
305   Znumvisibility,
306   Zpartcoplanar,
307   Zpartition,
308   Zpartitionall,
309   Zprocessed,
310   Zretry,
311   Zridge,
312   Wridge,
313   Wridgemax,
314   Zridge0,
315   Wridge0,
316   Wridge0max,
317   Zridgemid,
318   Wridgemid,
319   Wridgemidmax,
320   Zridgeok,
321   Wridgeok,
322   Wridgeokmax,
323   Zsetplane,
324   Ztotmerge,
325     ZEND};
326 #endif
327 
328 /*-<a                             href="qh-stat.htm#TOC"
329   >-------------------------------</a><a name="ztype">-</a>
330 
331   ztype
332     the type of a statistic sets its initial value.
333 
334   notes:
335     The type should be the same as the macro for collecting the statistic
336 */
337 enum ztypes {zdoc,zinc,zadd,zmax,zmin,ZTYPEreal,wadd,wmax,wmin,ZTYPEend};
338 
339 /*========== macros and constants =============*/
340 
341 /*-<a                             href="qh-stat.htm#TOC"
342   >--------------------------------</a><a name="MAYdebugx">-</a>
343 
344   MAYdebugx
345     define as maydebug() to be called frequently for error trapping
346 */
347 #define MAYdebugx
348 
349 /*-<a                             href="qh-stat.htm#TOC"
350   >--------------------------------</a><a name="zdef_">-</a>
351 
352   zzdef_, zdef_( type, name, doc, -1)
353     define a statistic (assumes 'qhstat.next= 0;')
354 
355   zdef_( type, name, doc, count)
356     define an averaged statistic
357     printed as name/count
358 */
359 #define zzdef_(stype,name,string,cnt) qhstat id[qhstat next++]=name; \
360    qhstat doc[name]= string; qhstat count[name]= cnt; qhstat type[name]= stype
361 #if qh_KEEPstatistics
362 #define zdef_(stype,name,string,cnt) qhstat id[qhstat next++]=name; \
363    qhstat doc[name]= string; qhstat count[name]= cnt; qhstat type[name]= stype
364 #else
365 #define zdef_(type,name,doc,count)
366 #endif
367 
368 /*-<a                             href="qh-stat.htm#TOC"
369   >--------------------------------</a><a name="zinc_">-</a>
370 
371   zzinc_( name ), zinc_( name)
372     increment an integer statistic
373 */
374 #define zzinc_(id) {MAYdebugx; qhstat stats[id].i++;}
375 #if qh_KEEPstatistics
376 #define zinc_(id) {MAYdebugx; qhstat stats[id].i++;}
377 #else
378 #define zinc_(id) {}
379 #endif
380 
381 /*-<a                             href="qh-stat.htm#TOC"
382   >--------------------------------</a><a name="zadd_">-</a>
383 
384   zzadd_( name, value ), zadd_( name, value ), wadd_( name, value )
385     add value to an integer or real statistic
386 */
387 #define zzadd_(id, val) {MAYdebugx; qhstat stats[id].i += (val);}
388 #define wwadd_(id, val) {MAYdebugx; qhstat stats[id].r += (val);}
389 #if qh_KEEPstatistics
390 #define zadd_(id, val) {MAYdebugx; qhstat stats[id].i += (val);}
391 #define wadd_(id, val) {MAYdebugx; qhstat stats[id].r += (val);}
392 #else
393 #define zadd_(id, val) {}
394 #define wadd_(id, val) {}
395 #endif
396 
397 /*-<a                             href="qh-stat.htm#TOC"
398   >--------------------------------</a><a name="zval_">-</a>
399 
400   zzval_( name ), zval_( name ), wwval_( name )
401     set or return value of a statistic
402 */
403 #define zzval_(id) ((qhstat stats[id]).i)
404 #define wwval_(id) ((qhstat stats[id]).r)
405 #if qh_KEEPstatistics
406 #define zval_(id) ((qhstat stats[id]).i)
407 #define wval_(id) ((qhstat stats[id]).r)
408 #else
409 #define zval_(id) qhstat tempi
410 #define wval_(id) qhstat tempr
411 #endif
412 
413 /*-<a                             href="qh-stat.htm#TOC"
414   >--------------------------------</a><a name="zmax_">-</a>
415 
416   zmax_( id, val ), wmax_( id, value )
417     maximize id with val
418 */
419 #define wwmax_(id, val) {MAYdebugx; maximize_(qhstat stats[id].r,(val));}
420 #if qh_KEEPstatistics
421 #define zmax_(id, val) {MAYdebugx; maximize_(qhstat stats[id].i,(val));}
422 #define wmax_(id, val) {MAYdebugx; maximize_(qhstat stats[id].r,(val));}
423 #else
424 #define zmax_(id, val) {}
425 #define wmax_(id, val) {}
426 #endif
427 
428 /*-<a                             href="qh-stat.htm#TOC"
429   >--------------------------------</a><a name="zmin_">-</a>
430 
431   zmin_( id, val ), wmin_( id, value )
432     minimize id with val
433 */
434 #if qh_KEEPstatistics
435 #define zmin_(id, val) {MAYdebugx; minimize_(qhstat stats[id].i,(val));}
436 #define wmin_(id, val) {MAYdebugx; minimize_(qhstat stats[id].r,(val));}
437 #else
438 #define zmin_(id, val) {}
439 #define wmin_(id, val) {}
440 #endif
441 
442 /*================== stat.h types ==============*/
443 
444 
445 /*-<a                             href="qh-stat.htm#TOC"
446   >--------------------------------</a><a name="intrealT">-</a>
447 
448   intrealT
449     union of integer and real, used for statistics
450 */
451 typedef union intrealT intrealT;    /* union of int and realT */
452 union intrealT {
453     int i;
454     realT r;
455 };
456 
457 /*-<a                             href="qh-stat.htm#TOC"
458   >--------------------------------</a><a name="qhstat">-</a>
459 
460   qhstat
461     global data structure for statistics
462 
463   notes:
464    access to qh_qhstat is via the "qhstat" macro.  There are two choices
465    qh_QHpointer = 1     access globals via a pointer
466                         enables qh_saveqhull() and qh_restoreqhull()
467 		= 0     qh_qhstat is a static data structure
468 		        only one instance of qhull() can be active at a time
469 			default value
470    qh_QHpointer is defined in qhull.h
471 
472    allocated in stat.c
473 */
474 typedef struct qhstatT qhstatT;
475 #if qh_QHpointer
476 #define qhstat qh_qhstat->
477 extern qhstatT *qh_qhstat;
478 #else
479 #define qhstat qh_qhstat.
480 extern qhstatT qh_qhstat;
481 #endif
482 struct qhstatT {
483   intrealT   stats[ZEND];     /* integer and real statistics */
484   unsigned   char id[ZEND+10]; /* id's in print order */
485   char      *doc[ZEND];       /* array of documentation strings */
486   short int  count[ZEND];     /* -1 if none, else index of count to use */
487   char       type[ZEND];      /* type, see ztypes above */
488   char       printed[ZEND];   /* true, if statistic has been printed */
489   intrealT   init[ZTYPEend];  /* initial values by types, set initstatistics */
490 
491   int        next;            /* next index for zdef_ */
492   int        precision;       /* index for precision problems */
493   int        vridges;         /* index for Voronoi ridges */
494   int        tempi;
495   realT      tempr;
496 };
497 
498 /*========== function prototypes ===========*/
499 
500 void    qh_allstatA(void);
501 void    qh_allstatB(void);
502 void    qh_allstatC(void);
503 void    qh_allstatD(void);
504 void    qh_allstatE(void);
505 void    qh_allstatE2(void);
506 void    qh_allstatF(void);
507 void    qh_allstatG(void);
508 void    qh_allstatH(void);
509 void    qh_allstatI(void);
510 void    qh_allstatistics (void);
511 void    qh_collectstatistics (void);
512 void	qh_freestatistics (void);
513 void    qh_initstatistics (void);
514 boolT 	qh_newstats (int index, int *nextindex);
515 boolT 	qh_nostatistic (int i);
516 void    qh_printallstatistics (FILE *fp, char *string);
517 void    qh_printstatistics (FILE *fp, char *string);
518 void  	qh_printstatlevel (FILE *fp, int id, int start);
519 void  	qh_printstats (FILE *fp, int index, int *nextindex);
520 realT   qh_stddev (int num, realT tot, realT tot2, realT *ave);
521 
522 #endif   /* qhDEFstat */
523