Boost logo

Boost-Commit :

From: pbristow_at_[hidden]
Date: 2007-08-29 10:10:31


Author: pbristow
Date: 2007-08-29 10:10:31 EDT (Wed, 29 Aug 2007)
New Revision: 39051
URL: http://svn.boost.org/trac/boost/changeset/39051

Log:
corrected tests.
Text files modified:
   sandbox/math_toolkit/libs/math/test/test_triangular.cpp | 103 ++++++++++++++++++++++-----------------
   1 files changed, 57 insertions(+), 46 deletions(-)

Modified: sandbox/math_toolkit/libs/math/test/test_triangular.cpp
==============================================================================
--- sandbox/math_toolkit/libs/math/test/test_triangular.cpp (original)
+++ sandbox/math_toolkit/libs/math/test/test_triangular.cpp 2007-08-29 10:10:31 EDT (Wed, 29 Aug 2007)
@@ -1,5 +1,5 @@
-// Copyright Paul Bristow 2007.
-// Copyright John Maddock 2006.
+// Copyright Paul Bristow 2006, 2007.
+// Copyright John Maddock 2006, 2007.
 
 // Use, modification and distribution are subject to the
 // Boost Software License, Version 1.0.
@@ -19,7 +19,8 @@
 
 #include <boost/math/distributions/triangular.hpp>
 using boost::math::triangular_distribution;
-#include <boost/math/tools/test.hpp>
+#include <boost/math/tools/test.hpp>
+#include <boost/math/special_functions\fpclassify.hpp>
 
 #include <iostream>
 using std::cout;
@@ -285,7 +286,7 @@
     tolerance);
 
    // cdf complement
- BOOST_CHECK_EQUAL( // x < lower
+ BOOST_CHECK_EQUAL( // x < lower
     cdf(complement(triangular_distribution<RealType>(0, 0, 1), static_cast<RealType>(-1))),
     static_cast<RealType>(1));
   BOOST_CHECK_EQUAL( // x == lower
@@ -303,7 +304,6 @@
     cdf(complement(triangular_distribution<RealType>(0, 1, 1), static_cast<RealType>(1))),
     static_cast<RealType>(0));
 
-
   BOOST_CHECK_EQUAL( // x > upper
     cdf(complement(triangular_distribution<RealType>(0, 0, 1), static_cast<RealType>(2))),
     static_cast<RealType>(0));
@@ -316,13 +316,13 @@
     static_cast<RealType>(0.875L),
     tolerance);
 
- BOOST_CHECK_CLOSE_FRACTION( // x = +0.5
+ BOOST_CHECK_CLOSE_FRACTION( // x = +0.5
     cdf(complement(triangular_distribution<RealType>(-1, 0, 1), static_cast<RealType>(0.5))),
     static_cast<RealType>(0.125),
     tolerance);
   
- triangular_distribution<RealType> triang; // Using typedef == triangular_distribution<double> tristd;
- triangular_distribution<RealType> tristd(0, 0.5, 1); // 'Standard' triangular distribution.
+ triangular_distribution<RealType> triang; // Using typedef == triangular_distribution<double> tristd;
+ triangular_distribution<RealType> tristd(0, 0.5, 1); // 'Standard' triangular distribution.
 
   BOOST_CHECK_CLOSE_FRACTION( // median of Standard triangular is sqrt(mode/2) if c > 1/2 else 1 - sqrt((1-c)/2)
     median(tristd),
@@ -389,18 +389,17 @@
 
   check_triangular(
     static_cast<RealType>(0), // lower
- static_cast<RealType>(0.5), // mode
+ static_cast<RealType>(0.5), // mode
     static_cast<RealType>(1), // upper
     static_cast<RealType>(0.5), // x
     static_cast<RealType>(0.5), // p
     static_cast<RealType>(1 - 0.5), // q
     tolerance);
 
- return;
   // Some Not-standard triangular tests.
   check_triangular(
     static_cast<RealType>(-1), // lower
- static_cast<RealType>(1), // mode
+ static_cast<RealType>(0), // mode
     static_cast<RealType>(1), // upper
     static_cast<RealType>(0), // x
     static_cast<RealType>(0.5), // p
@@ -408,12 +407,12 @@
     tolerance);
 
   check_triangular(
- static_cast<RealType>(1), // lower
+ static_cast<RealType>(1), // lower
     static_cast<RealType>(1), // mode
- static_cast<RealType>(3), // upper
- static_cast<RealType>(2), // x
- static_cast<RealType>(0.5), // p
- static_cast<RealType>(1 - 0.5), // q = 1 - p
+ static_cast<RealType>(3), // upper
+ static_cast<RealType>(2), // x
+ static_cast<RealType>(0.75), // p
+ static_cast<RealType>(1 - 0.75), // q = 1 - p
     tolerance);
 
   check_triangular(
@@ -428,53 +427,66 @@
     boost::math::tools::epsilon<RealType>(),
     static_cast<RealType>(boost::math::tools::epsilon<double>())) * 5; // 5 eps as a fraction.
   cout << "Tolerance (as fraction) for type " << typeid(RealType).name() << " is " << tolerance << "." << endl;
- triangular_distribution<RealType> distu01(0, 1);
+ triangular_distribution<RealType> tridef; // (-1, 0, 1) // default
   RealType x = static_cast<RealType>(0.5);
   using namespace std; // ADL of std names.
   // mean:
   BOOST_CHECK_CLOSE_FRACTION(
- mean(distu01), static_cast<RealType>(0.5), tolerance);
+ mean(tridef), static_cast<RealType>(0), tolerance);
   // variance:
   BOOST_CHECK_CLOSE_FRACTION(
- variance(distu01), static_cast<RealType>(0.0833333333333333333333333333333333333333333L), tolerance);
+ variance(tridef), static_cast<RealType>(0.16666666666666666666666666666666666666666667L), tolerance);
+ // was 0.0833333333333333333333333333333333333333333L
+
   // std deviation:
   BOOST_CHECK_CLOSE_FRACTION(
- standard_deviation(distu01), sqrt(variance(distu01)), tolerance);
+ standard_deviation(tridef), sqrt(variance(tridef)), tolerance);
   // hazard:
   BOOST_CHECK_CLOSE_FRACTION(
- hazard(distu01, x), pdf(distu01, x) / cdf(complement(distu01, x)), tolerance);
+ hazard(tridef, x), pdf(tridef, x) / cdf(complement(tridef, x)), tolerance);
   // cumulative hazard:
   BOOST_CHECK_CLOSE_FRACTION(
- chf(distu01, x), -log(cdf(complement(distu01, x))), tolerance);
+ chf(tridef, x), -log(cdf(complement(tridef, x))), tolerance);
   // coefficient_of_variation:
+ if (mean(tridef) != 0)
+ {
   BOOST_CHECK_CLOSE_FRACTION(
- coefficient_of_variation(distu01), standard_deviation(distu01) / mean(distu01), tolerance);
+ coefficient_of_variation(tridef), standard_deviation(tridef) / mean(tridef), tolerance);
+ }
   // mode:
   BOOST_CHECK_CLOSE_FRACTION(
- mode(distu01), static_cast<RealType>(0), tolerance);
+ mode(tridef), static_cast<RealType>(0), tolerance);
   // skewness:
   BOOST_CHECK_CLOSE_FRACTION(
     median(trim12), static_cast<RealType>(-0.13397459621556151), tolerance);
   BOOST_CHECK_EQUAL(
- skewness(distu01), static_cast<RealType>(0));
+ skewness(tridef), static_cast<RealType>(0));
   // kurtosis:
   BOOST_CHECK_CLOSE_FRACTION(
- kurtosis_excess(distu01), kurtosis(distu01) - static_cast<RealType>(3L), tolerance);
+ kurtosis_excess(tridef), kurtosis(tridef) - static_cast<RealType>(3L), tolerance);
   // kurtosis excess = kurtosis - 3;
   BOOST_CHECK_CLOSE_FRACTION(
- kurtosis_excess(distu01), static_cast<RealType>(-1.2), tolerance);
+ kurtosis_excess(tridef), static_cast<RealType>(-0.6), tolerance); // for all distributions.
 
   if(std::numeric_limits<RealType>::has_infinity)
   { // BOOST_CHECK tests for infinity using std::numeric_limits<>::infinity()
     // Note that infinity is not implemented for real_concept, so these tests
     // are only done for types, like built-in float, double.. that have infinity.
- // Note that these assume that BOOST_MATH_OVERFLOW_ERROR_POLICY is NOT throw_on_error.
+ // Note that these assume that BOOST_MATH_OVERFLOW_ERROR_POLICY is NOT throw_on_error.
     // #define BOOST_MATH_OVERFLOW_ERROR_POLICY == throw_on_error would give a throw here.
     // #define BOOST_MATH_DOMAIN_ERROR_POLICY == throw_on_error IS defined, so the throw path
     // of error handling is tested below with BOOST_CHECK_THROW tests.
 
- BOOST_CHECK_EQUAL(pdf(distu01, std::numeric_limits<RealType>::infinity()), 0);
- BOOST_CHECK_EQUAL(pdf(distu01, -std::numeric_limits<RealType>::infinity()), 0);
+ using boost::math::policies::policy;
+ using boost::math::policies::domain_error;
+ using boost::math::policies::ignore_error;
+
+ // Define a (bad?) policy to ignore domain errors ('bad' arguments):
+ typedef policy<domain_error<ignore_error> > inf_policy; // domain error returns infinity.
+ triangular_distribution<RealType, inf_policy> tridef_inf(-1, 0., 1);
+ // But can't use BOOST_CHECK_EQUAL(?, quiet_NaN)
+ using boost::math::isnan;
+ BOOST_CHECK(isnan(pdf(tridef_inf, std::numeric_limits<RealType>::infinity())));
   } // test for infinity using std::numeric_limits<>::infinity()
   else
   { // real_concept case, does has_infinfity == false, so can't check it throws.
@@ -483,25 +495,24 @@
     // value of std::numeric_limits<RealType>::infinity() is zero, so FPclassify is zero,
     // so (boost::math::isfinite)(std::numeric_limits<RealType>::infinity()) does not detect infinity.
     // so these tests would never throw.
- //BOOST_CHECK_THROW(pdf(distu01, std::numeric_limits<RealType>::infinity()), std::domain_error);
- //BOOST_CHECK_THROW(pdf(distu01, std::numeric_limits<RealType>::quiet_NaN()), std::domain_error);
- // BOOST_CHECK_THROW(pdf(distu01, boost::math::tools::max_value<RealType>() * 2), std::domain_error); // Doesn't throw.
- BOOST_CHECK_EQUAL(pdf(distu01, boost::math::tools::max_value<RealType>()), 0);
+ //BOOST_CHECK_THROW(pdf(tridef, std::numeric_limits<RealType>::infinity()), std::domain_error);
+ //BOOST_CHECK_THROW(pdf(tridef, std::numeric_limits<RealType>::quiet_NaN()), std::domain_error);
+ // BOOST_CHECK_THROW(pdf(tridef, boost::math::tools::max_value<RealType>() * 2), std::domain_error); // Doesn't throw.
+ BOOST_CHECK_EQUAL(pdf(tridef, boost::math::tools::max_value<RealType>()), 0);
   }
   // Special cases:
- BOOST_CHECK(pdf(distu01, 0) == 1);
- BOOST_CHECK(cdf(distu01, 0) == 0);
- BOOST_CHECK(pdf(distu01, 1) == 1);
- BOOST_CHECK(cdf(distu01, 1) == 1);
- BOOST_CHECK(cdf(complement(distu01, 0)) == 1);
- BOOST_CHECK(cdf(complement(distu01, 1)) == 0);
- BOOST_CHECK(quantile(distu01, 0) == 0);
- BOOST_CHECK(quantile(complement(distu01, 0)) == 1);
- BOOST_CHECK(quantile(distu01, 1) == 1);
- BOOST_CHECK(quantile(complement(distu01, 1)) == 1);
+ BOOST_CHECK(pdf(tridef, -1) == 0);
+ BOOST_CHECK(pdf(tridef, 1) == 0);
+ BOOST_CHECK(cdf(tridef, 0) == 0.5);
+ BOOST_CHECK(pdf(tridef, 1) == 0);
+ BOOST_CHECK(cdf(tridef, 1) == 1);
+ BOOST_CHECK(cdf(complement(tridef, -1)) == 1);
+ BOOST_CHECK(cdf(complement(tridef, 1)) == 0);
+ BOOST_CHECK(quantile(tridef, 1) == 1);
+ BOOST_CHECK(quantile(complement(tridef, 1)) == -1);
 
- BOOST_CHECK_EQUAL(support(trim12).first, tristd.lower());
- BOOST_CHECK_EQUAL(support(trim12).second, tristd.upper());
+ BOOST_CHECK_EQUAL(support(trim12).first, trim12.lower());
+ BOOST_CHECK_EQUAL(support(trim12).second, trim12.upper());
 
   // Error checks:
   if(std::numeric_limits<RealType>::has_quiet_NaN)


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk