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