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