Changeset 24790
- Timestamp:
- Jul 14, 2009, 6:35:11 PM (17 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/math/psStats.c (modified) (25 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/math/psStats.c
r24092 r24790 128 128 RESULT = Xt; } 129 129 130 # define COUNT_WARNING(LIMIT, INTERVAL, ...) { \ 131 static int nCalls = 1; \ 132 if (nCalls < LIMIT) { \ 133 psWarning(__VA_ARGS__); \ 134 } \ 135 if (!(nCalls % INTERVAL)) { \ 136 psWarning(__VA_ARGS__); \ 137 psWarning("(warning raised %d times)", nCalls); \ 138 } \ 139 nCalls ++; \ 140 } 141 142 130 143 /*****************************************************************************/ 131 144 /* TYPE DEFINITIONS */ … … 331 344 332 345 if (count == 0) { 333 psLogMsg(TRACE, PS_LOG_DETAIL, "No valid data in input vector.\n");346 COUNT_WARNING(10, 100, "No valid data in input vector.\n"); 334 347 stats->sampleUQ = NAN; 335 348 stats->sampleLQ = NAN; … … 394 407 // If the mean is NAN, then generate a warning and set the stdev to NAN. 395 408 if (isnan(stats->sampleMean)) { 396 psLogMsg(TRACE, PS_LOG_DETAIL, "WARNING: vectorSampleStdev(): sample mean is NAN. Setting stats->sampleStdev = NAN.\n");409 COUNT_WARNING(10, 100, "WARNING: vectorSampleStdev(): sample mean is NAN. Setting stats->sampleStdev = NAN."); 397 410 stats->sampleStdev = NAN; 398 411 return true; … … 438 451 // Assume that the user knows what he's doing when he masks out everything --> no error. 439 452 stats->sampleStdev = NAN; 440 psLogMsg(TRACE, PS_LOG_DETAIL, "WARNING: vectorSampleStdev(): no valid psVector elements (%ld). Setting stats->sampleStdev = NAN.\n", count);453 COUNT_WARNING(10, 100, "WARNING: vectorSampleStdev(): no valid psVector elements (%ld). Setting stats->sampleStdev = NAN.\n", count); 441 454 return true; 442 455 } 443 456 if (count == 1) { 444 457 stats->sampleStdev = 0.0; 445 psLogMsg(TRACE, PS_LOG_DETAIL, "WARNING: vectorSampleStdev(): only one valid psVector elements (%ld). " 446 "Setting stats->sampleStdev = 0.0.\n", count); 458 COUNT_WARNING(10, 100, "WARNING: vectorSampleStdev(): only one valid psVector elements (%ld). Setting stats->sampleStdev = 0.0.\n", count); 447 459 return true; 448 460 } … … 468 480 } 469 481 if (isnan(stats->sampleMean)) { 470 psLogMsg(TRACE, PS_LOG_DETAIL, "WARNING: vectorSampleMoments(): sample mean is NAN.\n");482 COUNT_WARNING(10, 100, "WARNING: vectorSampleMoments(): sample mean is NAN.\n"); 471 483 goto SAMPLE_MOMENTS_BAD; 472 484 } … … 475 487 } 476 488 if (isnan(stats->sampleStdev) || stats->sampleStdev == 0.0) { 477 psLogMsg(TRACE, PS_LOG_DETAIL, "WARNING: vectorSampleMoments(): sample stdev is NAN or 0.\n");489 COUNT_WARNING(10, 100, "WARNING: vectorSampleMoments(): sample stdev is NAN or 0.\n"); 478 490 goto SAMPLE_MOMENTS_BAD; 479 491 } … … 583 595 vectorSampleMedian(myVector, tmpMask, maskVal, stats); 584 596 if (isnan(stats->sampleMedian)) { 585 psLogMsg(TRACE, PS_LOG_DETAIL, "Call to vectorSampleMedian returned NAN\n");597 COUNT_WARNING(10, 100, "Call to vectorSampleMedian returned NAN\n"); 586 598 return true; 587 599 } … … 591 603 vectorSampleStdev(myVector, errors, tmpMask, maskVal, stats); 592 604 if (isnan(stats->sampleStdev)) { 593 psLogMsg(TRACE, PS_LOG_DETAIL, "Call to vectorSampleStdev returned NAN\n");605 COUNT_WARNING(10, 100, "Call to vectorSampleStdev returned NAN\n"); 594 606 return true; 595 607 } … … 649 661 if (isnan(stats->sampleMean) || isnan(stats->sampleStdev)) { 650 662 iter = stats->clipIter; 651 psLogMsg(TRACE, PS_LOG_DETAIL, "vectorSampleMean() or vectorSampleStdev() returned a NAN.\n");663 COUNT_WARNING(10, 100, "vectorSampleMean() or vectorSampleStdev() returned a NAN.\n"); 652 664 clippedMean = NAN; 653 665 clippedStdev = NAN; … … 747 759 if (numValid == 0 || isnan(min) || isnan(max)) { 748 760 // Data range calculation failed 749 psLogMsg(TRACE, PS_LOG_DETAIL, "Failed to calculate the min/max of the input vector.\n");761 COUNT_WARNING(10, 100, "Failed to calculate the min/max of the input vector.\n"); 750 762 goto escape; 751 763 } … … 763 775 stats->results |= PS_STAT_ROBUST_STDEV; 764 776 stats->results |= PS_STAT_ROBUST_QUARTILE; 765 psLogMsg(TRACE, PS_LOG_DETAIL, "All data points have the same value: %f.\n", min);777 COUNT_WARNING(10, 100, "All data points have the same value: %f.\n", min); 766 778 psFree(mask); 767 779 psFree(statsMinMax); … … 832 844 // convert bin to bin value: this is the robust histogram median. 833 845 if (isnan(stats->robustMedian)) { 834 psLogMsg(TRACE, PS_LOG_DETAIL, "Failed to fit a quadratic and calculate the 50-percent position.\n");846 COUNT_WARNING(10, 100, "Failed to fit a quadratic and calculate the 50-percent position.\n"); 835 847 goto escape; 836 848 } … … 854 866 855 867 if ((binLo < 0) || (binHi < 0)) { 856 psLogMsg(TRACE, PS_LOG_DETAIL, "Failed to calculate the 15.8655%% and 84.1345%% data points.\n");868 COUNT_WARNING(10, 100, "Failed to calculate the 15.8655%% and 84.1345%% data points.\n"); 857 869 goto escape; 858 870 } … … 950 962 stats->results |= PS_STAT_ROBUST_STDEV; 951 963 stats->results |= PS_STAT_ROBUST_QUARTILE; 952 psLogMsg(TRACE, PS_LOG_DETAIL, "Maximum number of iterations (%d) exceeded.", PS_ROBUST_MAX_ITERATIONS);964 COUNT_WARNING(10, 100, "Maximum number of iterations (%d) exceeded.", PS_ROBUST_MAX_ITERATIONS); 953 965 psFree(mask); 954 966 psFree(statsMinMax); … … 978 990 psF32 binHi25F32 = fitQuadraticSearchForYThenReturnBin(cumulative->bounds, cumulative->nums, binHi25, totalDataPoints * 0.75f); 979 991 if (isnan(binLo25F32) || isnan(binHi25F32)) { 980 psLogMsg(TRACE, PS_LOG_DETAIL, "could not determine the robustUQ: fitQuadraticSearchForYThenReturnBin() returned a NAN.\n");992 COUNT_WARNING(10, 100, "could not determine the robustUQ: fitQuadraticSearchForYThenReturnBin() returned a NAN.\n"); 981 993 goto escape; 982 994 } … … 1263 1275 float max = statsMinMax->max; 1264 1276 if (numValid == 0 || isnan(min) || isnan(max)) { 1265 psLogMsg(TRACE, PS_LOG_DETAIL, "Failed to calculate the min/max of the input vector.\n");1277 COUNT_WARNING(10, 100, "Failed to calculate the min/max of the input vector.\n"); 1266 1278 psFree(statsMinMax); 1267 1279 psTrace(TRACE, 4, "---- %s(false) end ----\n", __func__); … … 1460 1472 float max = statsMinMax->max; 1461 1473 if (numValid == 0 || isnan(min) || isnan(max)) { 1462 psLogMsg(TRACE, PS_LOG_DETAIL, "Failed to calculate the min/max of the input vector.\n");1474 COUNT_WARNING(10, 100, "Failed to calculate the min/max of the input vector.\n"); 1463 1475 psFree(statsMinMax); 1464 1476 psTrace(TRACE, 4, "---- %s(false) end ----\n", __func__); … … 1508 1520 PS_BIN_FOR_VALUE (binMax, histogram->bounds, guessMean + maxFitSigma*guessStdev, 0); 1509 1521 if (binMin == binMax) { 1510 psLogMsg(TRACE, PS_LOG_DETAIL, "Failed to calculate the min/max of the input vector.\n");1522 COUNT_WARNING(10, 100, "Failed to calculate the min/max of the input vector.\n"); 1511 1523 psFree(statsMinMax); 1512 1524 return true; … … 1756 1768 float max = statsMinMax->max; 1757 1769 if (numValid == 0 || isnan(min) || isnan(max)) { 1758 psLogMsg(TRACE, PS_LOG_DETAIL, "Failed to calculate the min/max of the input vector.\n");1770 COUNT_WARNING(10, 100, "Failed to calculate the min/max of the input vector.\n"); 1759 1771 psFree(statsMinMax); 1760 1772 stats->fittedStdev = NAN; … … 1774 1786 psHistogram *histogram = psHistogramAlloc(min, max, numBins); // A new histogram (without outliers) 1775 1787 if (!psVectorHistogram(histogram, myVector, errors, mask, maskVal)) { 1776 psLogMsg(TRACE, PS_LOG_DETAIL, "Unable to generate histogram for fitted statistics v4.\n");1788 COUNT_WARNING(10, 100, "Unable to generate histogram for fitted statistics v4.\n"); 1777 1789 psFree(histogram); 1778 1790 psFree(statsMinMax); … … 1809 1821 PS_BIN_FOR_VALUE (binMax, histogram->bounds, guessMean + maxFitSigma*guessStdev, 0); 1810 1822 if (binMin == binMax) { 1811 psLogMsg(TRACE, PS_LOG_DETAIL, "Failed to calculate the min/max of the input vector.\n");1823 COUNT_WARNING(10, 100, "Failed to calculate the min/max of the input vector.\n"); 1812 1824 psFree(statsMinMax); 1813 1825 stats->fittedStdev = NAN; … … 1882 1894 1883 1895 if (!status) { 1884 psLogMsg(TRACE, PS_LOG_DETAIL, "Failed to fit a gaussian to the robust histogram.\n");1896 COUNT_WARNING(10, 100, "Failed to fit a gaussian to the robust histogram.\n"); 1885 1897 psFree(poly); 1886 1898 psFree(histogram); … … 1892 1904 1893 1905 if (poly->coeff[2] >= 0.0) { 1894 psLogMsg(TRACE, PS_LOG_MINUTIA, "Failed parabolic fit: %f + %f x + %f x^2\n", poly->coeff[0], poly->coeff[1], poly->coeff[2]);1906 COUNT_WARNING(10, 100, "Failed parabolic fit: %f + %f x + %f x^2\n", poly->coeff[0], poly->coeff[1], poly->coeff[2]); 1895 1907 psFree(poly); 1896 1908 psFree(histogram); … … 1906 1918 } 1907 1919 1908 psLogMsg(TRACE, PS_LOG_DETAIL, "fit did not converge\n");1920 COUNT_WARNING(10, 100, "fit did not converge\n"); 1909 1921 stats->fittedStdev = NAN; 1910 1922 stats->fittedStdev = NAN; … … 1975 1987 1976 1988 if (!status) { 1977 psLogMsg(TRACE, PS_LOG_DETAIL, "Failed to fit a gaussian to the robust histogram.\n");1989 COUNT_WARNING(10, 100, "Failed to fit a gaussian to the robust histogram.\n"); 1978 1990 psFree(poly); 1979 1991 psFree(histogram);
Note:
See TracChangeset
for help on using the changeset viewer.
