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