mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-30 12:30:23 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			586 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			586 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //  Copyright Thijs van den Berg, 2008.
 | |
| //  Copyright John Maddock 2008.
 | |
| //  Copyright Paul A. Bristow 2008, 2009, 2014.
 | |
| 
 | |
| //  Use, modification and distribution are subject to the
 | |
| //  Boost Software License, Version 1.0. (See accompanying file
 | |
| //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | |
| 
 | |
| // add few more tests for farther out than 2??
 | |
| // long double test
 | |
| // add test for convenience typedef laplace.
 | |
| // Permit infinity arguments.
 | |
| #ifdef _MSC_VER
 | |
| #pragma warning (disable : 4127) // conditional expression is constant.
 | |
| #endif
 | |
| 
 | |
| /*
 | |
| 
 | |
| This module tests the Laplace distribution.
 | |
| 
 | |
| Test 1: test_pdf_cdf_ocatave()
 | |
|          Compare pdf, cdf agains results obtained from GNU Octave.
 | |
| 
 | |
| Test 2: test_cdf_quantile_symmetry()
 | |
|          Checks if quantile is the inverse of cdf by testing
 | |
|          quantile(cdf(x)) == x
 | |
| 
 | |
| Test 3: test_hazard_pdf_cdf_symmetry()
 | |
|          Checks the relation between hazard, pdf and cdf.
 | |
|          hazard = pdf/(1-cdf)
 | |
| 
 | |
| 
 | |
| Test 4: test_location_scale_symmetry()
 | |
|          Checks the pdf, cdf invariant for translation and scaling invariant
 | |
|                  cdf(x,location,scale) = cdf( (x-location)/scale, 0, 1)
 | |
|          scale * pdf(x,location,scale) = pdf( (x-location)/scale, 0, 1)
 | |
| 
 | |
| Test 5: test_mmm_moments()
 | |
|          Tests...
 | |
|          mean   == location
 | |
|          mode   == location
 | |
|          median == location
 | |
| 
 | |
|          standard_deviation = sqrt(2)*scale
 | |
|          skewness == 0
 | |
|          kurtoris == 6
 | |
|          excess kurtoris == 3
 | |
| 
 | |
| Test 6: test_complemented()
 | |
|          Test the cdf an quantile complemented function.
 | |
|          cdf(L,x) + cdf(complement(l,x)) == 1
 | |
|          quantile(L,p) == quantile(complement(l,1-p))
 | |
| 
 | |
| Test 7: test_bad_dist_parameters()
 | |
|          Test invalid distribution construction.
 | |
| 
 | |
| Test 8: test_extreme_function_arguments()
 | |
|          Test x = +/- inf. for cdf(), pdf()
 | |
|          Test p ={0,1} for quantile()
 | |
| */
 | |
| 
 | |
| 
 | |
| #define BOOST_TEST_MAIN
 | |
| #include <boost/test/unit_test.hpp>
 | |
| #include <boost/math/tools/test.hpp>
 | |
| #include <boost/math/constants/constants.hpp>
 | |
| #include <boost/math/distributions/laplace.hpp>
 | |
| #include "test_out_of_range.hpp"
 | |
| using boost::math::laplace_distribution;
 | |
| 
 | |
| /*
 | |
| #include <iostream>
 | |
|    using std::cout;
 | |
|    using std::endl;
 | |
|    using std::setprecision;
 | |
| 
 | |
| #include <limits>
 | |
|   using std::numeric_limits;
 | |
| */
 | |
|    
 | |
| /* 
 | |
|    This function test various values of the standard Laplace distribution pdf,cdf
 | |
|    against values generated by GNU Octave
 | |
|    The test code is generated woth the following Octave script:
 | |
|  
 | |
| f = fopen('octave_boost_laplace.cpp', 'w');
 | |
| 
 | |
| for x = [real(-2.0), real(-1.0), real(-0.5), real(0.0), real(0.5), real(1.0), real(2.0)]
 | |
| 
 | |
|    # pdf tests
 | |
|    # -----------------------
 | |
|    fdisp(f, "   BOOST_CHECK_CLOSE(" ),;
 | |
|    fdisp(f, (sprintf ("      pdf(laplace_distribution<RealType>(), static_cast<RealType>(%16.14fL)),", x)));
 | |
|    fdisp(f, (sprintf ("      static_cast<RealType>(%16.14fL),", laplace_pdf(x) )) );
 | |
|    fdisp(f, "   tolerance);" );
 | |
|    fdisp(f, "" );
 | |
|   
 | |
|    # cdf tests
 | |
|    # -----------------------
 | |
|    fdisp(f, "   BOOST_CHECK_CLOSE(" );
 | |
|    fdisp(f, (sprintf ("      cdf(laplace_distribution<RealType>(), static_cast<RealType>(%16.14fL)),", x)));
 | |
|    fdisp(f, (sprintf ("      static_cast<RealType>(%16.14fL),", laplace_cdf(x) )) );
 | |
|    fdisp(f, "   tolerance);" );
 | |
|    fdisp(f, "" );
 | |
|    
 | |
| endfor
 | |
| 
 | |
| fclose(f);
 | |
| 
 | |
| 
 | |
| Laplace distribution values version 2.0
 | |
| 
 | |
| Using NTL version 5.4 and the formula in Wikipedia Paul A. Bristow
 | |
| NTL class RR precision 150 bits.
 | |
| NTL class RR output precision 50 decimal digits OK.
 | |
| Laplace pdf
 | |
| -10  0.22699964881242425767795757780275305118959044437696e-4
 | |
| -9.5  0.37425914943850295735594659677277583056493449453316e-4
 | |
| -9  0.61704902043339774748818345365016913036076416123496e-4
 | |
| -8.5  0.00010173418450532208718446671524353319364865576338509
 | |
| -8  0.00016773131395125591941069456289043050965545006686111
 | |
| -7.5  0.00027654218507391679155100004426517859890566829114007
 | |
| -7  0.00045594098277725810400156804220464131323686226383407
 | |
| -6.5  0.00075171959648878622369145166608382691500025647887521
 | |
| -6  0.0012393760883331792115225837154083339457532397924584
 | |
| -5.5  0.0020433857192320334967323513423603842041953283241185
 | |
| -5  0.0033689734995427335483180242115742121244247925136568
 | |
| -4.5  0.0055544982691211532480715671434652638857696337503689
 | |
| -4  0.0091578194443670901468590106366206211059560337810038
 | |
| -3.5  0.015098691711159250369893146181809922535830266119032
 | |
| -3  0.024893534183931971489671207825030888315849796096331
 | |
| -2.5  0.041042499311949397584764337233579903918902060509316
 | |
| -2  0.067667641618306345946999747486242201703815772944649
 | |
| -1.5  0.11156508007421491446664023538200626067108581471131
 | |
| -1  0.18393972058572116079776188508073043372290556554506
 | |
| -0.5  0.30326532985631671180189976749559022672095906778368
 | |
| 0  0.5
 | |
| 0.5  0.30326532985631671180189976749559022672095906778368
 | |
| 1  0.18393972058572116079776188508073043372290556554506
 | |
| 1.5  0.11156508007421491446664023538200626067108581471131
 | |
| 2  0.067667641618306345946999747486242201703815772944649
 | |
| 2.5  0.041042499311949397584764337233579903918902060509316
 | |
| 3  0.024893534183931971489671207825030888315849796096331
 | |
| 3.5  0.015098691711159250369893146181809922535830266119032
 | |
| 4  0.0091578194443670901468590106366206211059560337810038
 | |
| 4.5  0.0055544982691211532480715671434652638857696337503689
 | |
| 5  0.0033689734995427335483180242115742121244247925136568
 | |
| 5.5  0.0020433857192320334967323513423603842041953283241185
 | |
| 6  0.0012393760883331792115225837154083339457532397924584
 | |
| 6.5  0.00075171959648878622369145166608382691500025647887521
 | |
| 7  0.00045594098277725810400156804220464131323686226383407
 | |
| 7.5  0.00027654218507391679155100004426517859890566829114007
 | |
| 8  0.00016773131395125591941069456289043050965545006686111
 | |
| 8.5  0.00010173418450532208718446671524353319364865576338509
 | |
| 9  0.61704902043339774748818345365016913036076416123496e-4
 | |
| 9.5  0.37425914943850295735594659677277583056493449453316e-4
 | |
| 10  0.22699964881242425767795757780275305118959044437696e-4
 | |
| 
 | |
| Laplace cdf
 | |
| -10  0.9999773000351187575742322042422197246948810411152
 | |
| -9.5  0.99996257408505614970426440534032272241694350636029
 | |
| -9  0.99993829509795666022525118165463498308696392404693
 | |
| -8.5  0.99989826581549467791281553328475646680635134420916
 | |
| -8  0.99983226868604874408058930543710956949034454956485
 | |
| -7.5  0.9997234578149260832084489999557348214010943317417
 | |
| -7  0.99954405901722274189599843195779535868676313746042
 | |
| -6.5  0.99924828040351121377630854833391617308499974328643
 | |
| -6  0.99876062391166682078847741628459166605424676032523
 | |
| -5.5  0.99795661428076796650326764865763961579580467117776
 | |
| -5  0.99663102650045726645168197578842578787557520756024
 | |
| -4.5  0.9944455017308788467519284328565347361142303666328
 | |
| -4  0.99084218055563290985314098936337937889404396651458
 | |
| -3.5  0.98490130828884074963010685381819007746416973359633
 | |
| -3  0.9751064658160680285103287921749691116841502037504
 | |
| -2.5  0.95895750068805060241523566276642009608109793962206
 | |
| -2  0.93233235838169365405300025251375779829618422688019
 | |
| -1.5  0.8884349199257850855333597646179937393289141857266
 | |
| -1  0.81606027941427883920223811491926956627709443427977
 | |
| -0.5  0.69673467014368328819810023250440977327904093221632
 | |
| 0  0.5
 | |
| 0.5  0.30326532985631671180189976749559022672095906778368
 | |
| 1  0.18393972058572116079776188508073043372290556572023
 | |
| 1.5  0.11156508007421491446664023538200626067108581462372
 | |
| 2  0.067667641618306345946999747486242201703815773119812
 | |
| 2.5  0.041042499311949397584764337233579903918902060377944
 | |
| 3  0.024893534183931971489671207825030888315849796249598
 | |
| 3.5  0.015098691711159250369893146181809922535830266053346
 | |
| 4  0.009157819444367090146859010636620621105956033835742
 | |
| 4.5  0.005554498269121153248071567143465263885769633717526
 | |
| 5  0.0033689734995427335483180242115742121244247924397602
 | |
| 5.5  0.0020433857192320334967323513423603842041953284719117
 | |
| 6  0.0012393760883331792115225837154083339457532396747712
 | |
| 6.5  0.00075171959648878622369145166608382691500025636324071
 | |
| 7  0.00045594098277725810400156804220464131323686218925325
 | |
| 7.5  0.00027654218507391679155100004426517859890566825829713
 | |
| 8  0.00016773131395125591941069456289043050965545008482209
 | |
| 8.5  0.00010173418450532208718446671524353319364865579083973
 | |
| 9  0.61704902043339774748818345365016913036076303396971e-4
 | |
| 9.5  0.37425914943850295735594659677277583056493289386783e-4
 | |
| 10  0.22699964881242425767795757780275305118958884798806e-4
 | |
| 
 | |
| */
 | |
| template <class RealType>
 | |
| void test_pdf_cdf_ocatave()
 | |
| {
 | |
|    RealType tolerance(1e-10f);
 | |
|    
 | |
|    BOOST_CHECK_CLOSE(
 | |
|       pdf(laplace_distribution<RealType>(), static_cast<RealType>(-2.L)),
 | |
|      // static_cast<RealType>(0.06766764161831L),
 | |
|       static_cast<RealType>(0.067667641618306345946999747486242201703815773119812L),
 | |
|    tolerance);
 | |
| 
 | |
|    BOOST_CHECK_CLOSE(
 | |
|       cdf(laplace_distribution<RealType>(), static_cast<RealType>(-2.L)),
 | |
|       //static_cast<RealType>(0.06766764161831L),
 | |
|       static_cast<RealType>(0.067667641618306345946999747486242201703815773119812L),
 | |
|    tolerance);
 | |
| 
 | |
|    BOOST_CHECK_CLOSE(
 | |
|       pdf(laplace_distribution<RealType>(), static_cast<RealType>(-1.L)),
 | |
|       //static_cast<RealType>(0.18393972058572L),
 | |
|       static_cast<RealType>(0.18393972058572116079776188508073043372290556554506L),
 | |
|    tolerance);
 | |
| 
 | |
|    BOOST_CHECK_CLOSE(
 | |
|       cdf(laplace_distribution<RealType>(), static_cast<RealType>(-1.L)),
 | |
|       static_cast<RealType>(0.18393972058572L),
 | |
|    tolerance);
 | |
| 
 | |
|    BOOST_CHECK_CLOSE(
 | |
|       pdf(laplace_distribution<RealType>(), static_cast<RealType>(-0.5L)),
 | |
|    // static_cast<RealType>(0.30326532985632L),
 | |
|       static_cast<RealType>(0.30326532985631671180189976749559022672095906778368L),
 | |
|    tolerance);
 | |
| 
 | |
|    BOOST_CHECK_CLOSE(
 | |
|       cdf(laplace_distribution<RealType>(), static_cast<RealType>(-0.5L)),
 | |
|       //static_cast<RealType>(0.30326532985632L),
 | |
|       static_cast<RealType>(0.30326532985631671180189976749559022672095906778368L),
 | |
|    tolerance);
 | |
| 
 | |
|    BOOST_CHECK_CLOSE(
 | |
|       pdf(laplace_distribution<RealType>(), static_cast<RealType>(0.0L)),
 | |
|       static_cast<RealType>(0.5L),
 | |
|    tolerance);
 | |
| 
 | |
|    BOOST_CHECK_CLOSE(
 | |
|       cdf(laplace_distribution<RealType>(), static_cast<RealType>(0.0L)),
 | |
|       static_cast<RealType>(0.5L),
 | |
|    tolerance);
 | |
| 
 | |
|    BOOST_CHECK_CLOSE(
 | |
|       pdf(laplace_distribution<RealType>(), static_cast<RealType>(0.5L)),
 | |
|       //static_cast<RealType>(0.30326532985632L),
 | |
|       static_cast<RealType>(0.30326532985631671180189976749559022672095906778368L),
 | |
|    tolerance);
 | |
| 
 | |
|    BOOST_CHECK_CLOSE(
 | |
|       cdf(laplace_distribution<RealType>(), static_cast<RealType>(0.5L)),
 | |
|       // static_cast<RealType>(0.69673467014368L),
 | |
|       static_cast<RealType>(0.69673467014368328819810023250440977327904093221632L),
 | |
|    tolerance);
 | |
| 
 | |
|    BOOST_CHECK_CLOSE(
 | |
|       pdf(laplace_distribution<RealType>(), static_cast<RealType>(1.0L)),
 | |
|     //  static_cast<RealType>(0.18393972058572L),
 | |
|       static_cast<RealType>(0.18393972058572116079776188508073043372290556554506L),
 | |
|    tolerance);
 | |
| 
 | |
|    BOOST_CHECK_CLOSE(
 | |
|       cdf(laplace_distribution<RealType>(), static_cast<RealType>(1.00000000000000L)),
 | |
|      // static_cast<RealType>(0.81606027941428L),
 | |
|       static_cast<RealType>(0.81606027941427883920223811491926956627709443427977L),
 | |
|    tolerance);
 | |
| 
 | |
|    BOOST_CHECK_CLOSE(
 | |
|       pdf(laplace_distribution<RealType>(), static_cast<RealType>(2.0L)),
 | |
|     //  static_cast<RealType>(0.06766764161831L),
 | |
|       static_cast<RealType>(0.067667641618306345946999747486242201703815772944649L),
 | |
|    tolerance);
 | |
| 
 | |
|    BOOST_CHECK_CLOSE(
 | |
|       cdf(laplace_distribution<RealType>(), static_cast<RealType>(2.0L)),
 | |
|    //   static_cast<RealType>(0.93233235838169L),
 | |
|       static_cast<RealType>(0.93233235838169365405300025251375779829618422688019L),
 | |
|    tolerance);
 | |
| 
 | |
|    check_out_of_range<laplace_distribution<RealType> >(0, 1);
 | |
|    BOOST_MATH_CHECK_THROW(laplace_distribution<RealType>(0, 0), std::domain_error);
 | |
|    BOOST_MATH_CHECK_THROW(laplace_distribution<RealType>(0, -1), std::domain_error);
 | |
| }
 | |
| 
 | |
| template <class RealType>
 | |
| void test_cdf_quantile_symmetry()
 | |
| {
 | |
|    RealType tolerance(boost::math::tools::epsilon<RealType>() * 500); // 5 eps as a percentage.
 | |
| 
 | |
|    const float xtest[7] = {  -2.0, -1.0, -0.5, 0.0, 0.5, 1.0, 2.0 };
 | |
|    
 | |
|    for (int i=0; i<7; ++i)
 | |
|    {
 | |
|       RealType x( static_cast<RealType>(xtest[i]) );
 | |
|       RealType x2( quantile(laplace_distribution<RealType>(), cdf(laplace_distribution<RealType>(), x)) );
 | |
|       BOOST_CHECK_CLOSE( x, x2, tolerance);
 | |
|    }
 | |
| }
 | |
| 
 | |
| template <class RealType>
 | |
| void test_hazard_pdf_cdf_symmetry()
 | |
| {
 | |
|    RealType tolerance(boost::math::tools::epsilon<RealType>() * 500); // 5 eps as a percentage
 | |
| 
 | |
|    const float xtest[7] = {  -2.0, -1.0, -0.5, 0.0, 0.5, 1.0, 2.0 };
 | |
| 
 | |
|    for (int xi=0; xi<7; ++xi)
 | |
|    {
 | |
|       RealType x( static_cast<RealType>(xtest[xi]) );
 | |
|       RealType p(  pdf(laplace_distribution<RealType>(), x)  );
 | |
|       RealType c(  cdf(laplace_distribution<RealType>(), x)  );
 | |
|       RealType h1(   p/(static_cast<RealType>(1.0) - c)  );
 | |
|       RealType h2(  hazard(laplace_distribution<RealType>(), x)  );
 | |
|       BOOST_CHECK_CLOSE( h1, h2, tolerance);
 | |
|    }
 | |
| }
 | |
| 
 | |
| template <class RealType>
 | |
| void test_location_scale_symmetry()
 | |
| {
 | |
|    RealType tolerance(boost::math::tools::epsilon<RealType>() * 500); // 5 eps as a percentage
 | |
| 
 | |
|    const float xtest[7] = {  -2.0, -1.0, -0.5, 0.0, 0.5, 1.0, 2.0 };
 | |
|    const float ltest[7] = {  -2.0, -1.0, -0.5, 0.0, 0.5, 1.0, 2.0 };
 | |
|    const float stest[3] = {  0.5, 1.0, 2.0 };
 | |
| 
 | |
|    for (int xi=0; xi<7; ++xi)
 | |
|       for (int li=0; li<7; ++li)
 | |
|          for (int si=0; si<3; ++si)
 | |
|          {
 | |
|             RealType x( static_cast<RealType>(xtest[xi]) );
 | |
|             RealType l( static_cast<RealType>(ltest[li]) );
 | |
|             RealType s( static_cast<RealType>(stest[si]) );
 | |
|             RealType x0( (x-l)/s );
 | |
| 
 | |
|             BOOST_CHECK_CLOSE( 
 | |
|                pdf(laplace_distribution<RealType>(l,s), x) * s,
 | |
|                pdf(laplace_distribution<RealType>(), x0),
 | |
|                tolerance);
 | |
| 
 | |
|             BOOST_CHECK_CLOSE( 
 | |
|                cdf(laplace_distribution<RealType>(l,s), x),
 | |
|                cdf(laplace_distribution<RealType>(), x0),
 | |
|                tolerance);
 | |
| 
 | |
|          }
 | |
| }
 | |
| 
 | |
| template <class RealType>
 | |
| void test_mmm_moments()
 | |
| {
 | |
|    RealType tolerance(boost::math::tools::epsilon<RealType>() * 500); // 5 eps as a percentage
 | |
| 
 | |
|  //  const float xtest[7] = {  -2.0, -1.0, -0.5, 0.0, 0.5, 1.0, 2.0 };
 | |
|    const float ltest[7] = {  -2.0, -1.0, -0.5, 0.0, 0.5, 1.0, 2.0 };
 | |
|    const float stest[3] = {  0.5, 1.0, 2.0 };
 | |
| 
 | |
|    for (int xi=0; xi<7; ++xi)
 | |
|       for (int li=0; li<7; ++li)
 | |
|          for (int si=0; si<3; ++si)
 | |
|          {
 | |
|             //RealType x( static_cast<RealType>(xtest[xi]) );
 | |
|             RealType l( static_cast<RealType>(ltest[li]) );
 | |
|             RealType s( static_cast<RealType>(stest[si]) );
 | |
| 
 | |
|             BOOST_CHECK_CLOSE( 
 | |
|                mean( laplace_distribution<RealType>(l,s) ),
 | |
|                l,
 | |
|                tolerance);
 | |
| 
 | |
|             BOOST_CHECK_CLOSE( 
 | |
|                median( laplace_distribution<RealType>(l,s) ),
 | |
|                l,
 | |
|                tolerance);
 | |
| 
 | |
|             BOOST_CHECK_CLOSE( 
 | |
|                mode( laplace_distribution<RealType>(l,s) ),
 | |
|                l,
 | |
|                tolerance);
 | |
| 
 | |
| 
 | |
|             BOOST_CHECK_CLOSE( 
 | |
|                standard_deviation( laplace_distribution<RealType>(l,s) ),
 | |
|                static_cast<RealType>( s * boost::math::constants::root_two<RealType>() ),
 | |
|                tolerance);
 | |
| 
 | |
|             BOOST_CHECK_CLOSE( 
 | |
|                skewness( laplace_distribution<RealType>(l,s) ),
 | |
|                static_cast<RealType>(0),
 | |
|                tolerance);
 | |
| 
 | |
|             BOOST_CHECK_CLOSE( 
 | |
|                kurtosis( laplace_distribution<RealType>(l,s) ),
 | |
|                static_cast<RealType>(6),
 | |
|                tolerance);
 | |
| 
 | |
|             BOOST_CHECK_CLOSE( 
 | |
|                kurtosis_excess( laplace_distribution<RealType>(l,s) ),
 | |
|                static_cast<RealType>(3),
 | |
|                tolerance);
 | |
|          }
 | |
| } // template <class RealType> void test_mmm_moments()
 | |
| 
 | |
| template <class RealType>
 | |
| void test_complemented()
 | |
| {
 | |
|    RealType tolerance(boost::math::tools::epsilon<RealType>() * 500); // 5 eps as a percentage.
 | |
| 
 | |
|    const float xtest[7] = {  -2.0, -1.0, -0.5, 0.0, 0.5, 1.0, 2.0 }; // x values.
 | |
|    const float ptest[7] = {  0.125, 0.25, 0.5, 0.75, 0.875 }; // probability values.
 | |
|    const float ltest[7] = {  -2.0, -1.0, -0.5, 0.0, 0.5, 1.0, 2.0 }; // locations.
 | |
|    const float stest[3] = {  0.5, 1.0, 2.0 }; // scales.
 | |
| 
 | |
|    for (int li=0; li<7; ++li)
 | |
|       for (int si=0; si<3; ++si)
 | |
|       {
 | |
|          RealType l( static_cast<RealType>(ltest[li]) );
 | |
|          RealType s( static_cast<RealType>(stest[si]) );
 | |
| 
 | |
|          for (int xi=0; xi<7; ++xi)
 | |
|          {
 | |
|             RealType x( static_cast<RealType>(xtest[xi]) );
 | |
| 
 | |
|             // Check sum of cdf and complement = unity.
 | |
|             BOOST_CHECK_CLOSE( 
 | |
|                cdf(complement(laplace_distribution<RealType>(l,s), x))
 | |
|                  + cdf(laplace_distribution<RealType>(l,s), x),
 | |
|                static_cast<RealType>(1),
 | |
|                tolerance);
 | |
| 
 | |
|          }
 | |
| 
 | |
|          for (int pi=0; pi<5; ++pi)
 | |
|          {
 | |
|             RealType p( static_cast<RealType>(ptest[pi]) );
 | |
| 
 | |
|             BOOST_CHECK_CLOSE( 
 | |
|                quantile(complement(laplace_distribution<RealType>(l,s), 1-p )), 
 | |
|                quantile(laplace_distribution<RealType>(l,s), p),
 | |
|                tolerance);
 | |
|          }
 | |
|       }
 | |
| } // void test_complemented()
 | |
| 
 | |
| template <class RealType>
 | |
| void test_bad_dist_parameters()
 | |
| {
 | |
|    // Check that can generate laplace distribution using both convenience methods:
 | |
|    laplace_distribution<double> lp1(0.5); // Using default RealType double.
 | |
|    boost::math::laplace lp2(0.5); // Using typedef. 
 | |
| #ifndef BOOST_NO_EXCEPTIONS
 | |
|    BOOST_MATH_CHECK_THROW(boost::math::laplace_distribution<RealType> lbad1(0, 0), std::domain_error);
 | |
|    BOOST_MATH_CHECK_THROW(boost::math::laplace_distribution<RealType> lbad2(0, -1), std::domain_error);
 | |
| #else
 | |
|    BOOST_MATH_CHECK_THROW(boost::math::laplace_distribution<RealType>(0, 0), std::domain_error);
 | |
|    BOOST_MATH_CHECK_THROW(boost::math::laplace_distribution<RealType>(0, -1), std::domain_error);
 | |
| #endif
 | |
| }
 | |
| 
 | |
| template <class RealType>
 | |
| void test_extreme_function_arguments()
 | |
| {
 | |
|    using boost::math::laplace_distribution;
 | |
|    using boost::math::policies::policy;
 | |
|    using boost::math::policies::overflow_error; 
 | |
|    using boost::math::policies::ignore_error;
 | |
| 
 | |
|    typedef policy<
 | |
|       overflow_error<ignore_error> // Ignore if argument value causes overflow.
 | |
|       > ignore_overflow_policy;
 | |
| 
 | |
|    laplace_distribution<RealType> L01(0, 1);
 | |
|    // Compare random variate x = infinity with RealType max value, usually std::numeric_limits<RealType>::max().
 | |
|    using boost::math::tools::max_value;  // In case std::numeric_limits<RealType>::max() is not defined.
 | |
|    BOOST_CHECK_EQUAL(pdf(L01, +max_value<RealType>()), pdf(L01, +std::numeric_limits<RealType>::infinity()) );
 | |
|    BOOST_CHECK_EQUAL(pdf(L01, -max_value<RealType>()), pdf(L01, -std::numeric_limits<RealType>::infinity()) );
 | |
| 
 | |
|   if(std::numeric_limits<RealType>::has_infinity)
 | |
|   {
 | |
|    laplace_distribution<RealType, ignore_overflow_policy> L1(0, 1);
 | |
|    laplace_distribution<RealType, ignore_overflow_policy> L2(1, 2);
 | |
|    laplace_distribution<RealType> l01;
 | |
| 
 | |
|    // Check pdf == 0 at x = +/- infinity.
 | |
|    BOOST_CHECK_EQUAL(pdf(L01, +std::numeric_limits<RealType>::infinity()), 0 );
 | |
|    BOOST_CHECK_EQUAL(pdf(L01, -std::numeric_limits<RealType>::infinity()), 0 );
 | |
| 
 | |
|    BOOST_CHECK_EQUAL(cdf(L01, +std::numeric_limits<RealType>::infinity()), 1 );
 | |
|    BOOST_CHECK_EQUAL(cdf(L01, -std::numeric_limits<RealType>::infinity()), 0 );
 | |
|    BOOST_CHECK_EQUAL(cdf(complement(L01, +std::numeric_limits<RealType>::infinity())), 0 );
 | |
|    BOOST_CHECK_EQUAL(cdf(complement(L01, -std::numeric_limits<RealType>::infinity())), 1 );
 | |
| 
 | |
|    // Trac #9672 Feb 2014 x = infinity is now allowed.
 | |
|    //BOOST_MATH_CHECK_THROW(pdf(L1, +std::numeric_limits<RealType>::infinity()), std::domain_error);
 | |
|    //BOOST_MATH_CHECK_THROW(pdf(L1, -std::numeric_limits<RealType>::infinity()), std::domain_error);
 | |
|    //BOOST_MATH_CHECK_THROW(pdf(L2, +std::numeric_limits<RealType>::infinity()), std::domain_error);
 | |
|    //BOOST_MATH_CHECK_THROW(pdf(L2, -std::numeric_limits<RealType>::infinity()), std::domain_error);
 | |
| 
 | |
|    // Check cdf at x = +/- infinity.
 | |
|    //BOOST_MATH_CHECK_THROW(cdf(L1, +std::numeric_limits<RealType>::infinity()), std::domain_error);
 | |
|    //BOOST_MATH_CHECK_THROW(cdf(L1, -std::numeric_limits<RealType>::infinity()), std::domain_error);
 | |
|    //BOOST_MATH_CHECK_THROW(cdf(L2, +std::numeric_limits<RealType>::infinity()), std::domain_error);
 | |
|    //BOOST_MATH_CHECK_THROW(cdf(L2, -std::numeric_limits<RealType>::infinity()), std::domain_error);
 | |
| 
 | |
|    // Check quantile at p = 0, 1 which return infinity.
 | |
|    BOOST_CHECK_EQUAL(quantile(L1, 0), -std::numeric_limits<RealType>::infinity() );
 | |
|    BOOST_CHECK_EQUAL(quantile(L1, 1), +std::numeric_limits<RealType>::infinity() );
 | |
|    BOOST_CHECK_EQUAL(quantile(L2, 0), -std::numeric_limits<RealType>::infinity() );
 | |
|    BOOST_CHECK_EQUAL(quantile(L2, 1), +std::numeric_limits<RealType>::infinity() );
 | |
|   }
 | |
| }
 | |
| 
 | |
| BOOST_AUTO_TEST_CASE( vs_GNU_Octave )
 | |
| {
 | |
|    test_pdf_cdf_ocatave<float>();
 | |
|    test_pdf_cdf_ocatave<double>();
 | |
| }
 | |
| 
 | |
| BOOST_AUTO_TEST_CASE( cdf_quantile_symmetry )
 | |
| {
 | |
|    test_cdf_quantile_symmetry<float>();
 | |
|    test_cdf_quantile_symmetry<double>();
 | |
| }
 | |
| 
 | |
| BOOST_AUTO_TEST_CASE( hazard_pdf_cdf_symmetry )
 | |
| {
 | |
|    test_hazard_pdf_cdf_symmetry<float>();
 | |
|    test_hazard_pdf_cdf_symmetry<double>();
 | |
| }
 | |
| 
 | |
| BOOST_AUTO_TEST_CASE( location_scale_symmetry )
 | |
| {
 | |
|    test_location_scale_symmetry<float>();
 | |
|    test_location_scale_symmetry<double>();
 | |
| }
 | |
| 
 | |
| BOOST_AUTO_TEST_CASE( mmm_moments )
 | |
| {
 | |
|    test_mmm_moments<float>();
 | |
|    test_mmm_moments<double>();
 | |
| }
 | |
| 
 | |
| BOOST_AUTO_TEST_CASE( t_complemented )
 | |
| {
 | |
|    test_complemented<float>();
 | |
|    test_complemented<double>();
 | |
| }
 | |
| 
 | |
| BOOST_AUTO_TEST_CASE( bad_dist_parameters )
 | |
| {
 | |
|    test_bad_dist_parameters<float>();
 | |
|    test_bad_dist_parameters<double>();
 | |
| }
 | |
| 
 | |
| BOOST_AUTO_TEST_CASE( extreme_function_arguments )
 | |
| {
 | |
|    BOOST_TEST_MESSAGE("extreme arguments");
 | |
|    test_extreme_function_arguments<float>();
 | |
|    test_extreme_function_arguments<double>();
 | |
| }
 | |
| 
 | |
| /*
 | |
| 
 | |
| Output:
 | |
| 
 | |
| ------ Rebuild All started: Project: test_laplace, Configuration: Debug Win32 ------
 | |
|   test_laplace.cpp
 | |
|   test_laplace.vcxproj -> J:\Cpp\MathToolkit\test\Math_test\Debug\test_laplace.exe
 | |
|   Running 8 test cases...
 | |
|   
 | |
|   *** No errors detected
 | |
| ========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========
 | |
| 
 | |
| 
 | |
| */
 | |
| 
 |