mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-14 16:11:50 -05: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 ==========
|
||
|
|
||
|
|
||
|
*/
|
||
|
|