diff options
Diffstat (limited to 'boost/math/distributions/laplace.hpp')
-rw-r--r-- | boost/math/distributions/laplace.hpp | 94 |
1 files changed, 66 insertions, 28 deletions
diff --git a/boost/math/distributions/laplace.hpp b/boost/math/distributions/laplace.hpp index a872b16839..09b24c868b 100644 --- a/boost/math/distributions/laplace.hpp +++ b/boost/math/distributions/laplace.hpp @@ -1,6 +1,6 @@ // Copyright Thijs van den Berg, 2008. // Copyright John Maddock 2008. -// Copyright Paul A. Bristow 2008. +// Copyright Paul A. Bristow 2008, 2014. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file @@ -24,6 +24,11 @@ namespace boost{ namespace math{ +#ifdef BOOST_MSVC +# pragma warning(push) +# pragma warning(disable:4127) // conditional expression is constant +#endif + template <class RealType = double, class Policy = policies::policy<> > class laplace_distribution { @@ -37,8 +42,8 @@ public: // ---------------------------------- // Constructor(s) // ---------------------------------- - laplace_distribution(RealType location = 0, RealType scale = 1) - : m_location(location), m_scale(scale) + laplace_distribution(RealType l_location = 0, RealType l_scale = 1) + : m_location(l_location), m_scale(l_scale) { RealType result; check_parameters("boost::math::laplace_distribution<%1%>::laplace_distribution()", &result); @@ -72,23 +77,38 @@ private: }; // class laplace_distribution // -// Convenient type synonym for double +// Convenient type synonym for double. typedef laplace_distribution<double> laplace; // -// Non member functions +// Non-member functions. template <class RealType, class Policy> inline const std::pair<RealType, RealType> range(const laplace_distribution<RealType, Policy>&) { - using boost::math::tools::max_value; - return std::pair<RealType, RealType>(-max_value<RealType>(), max_value<RealType>()); + if (std::numeric_limits<RealType>::has_infinity) + { // Can use infinity. + return std::pair<RealType, RealType>(-std::numeric_limits<RealType>::infinity(), std::numeric_limits<RealType>::infinity()); // - to + infinity. + } + else + { // Can only use max_value. + using boost::math::tools::max_value; + return std::pair<RealType, RealType>(-max_value<RealType>(), max_value<RealType>()); // - to + max value. + } + } template <class RealType, class Policy> inline const std::pair<RealType, RealType> support(const laplace_distribution<RealType, Policy>&) { - using boost::math::tools::max_value; - return std::pair<RealType, RealType>(-max_value<RealType>(), max_value<RealType>()); + if (std::numeric_limits<RealType>::has_infinity) + { // Can Use infinity. + return std::pair<RealType, RealType>(-std::numeric_limits<RealType>::infinity(), std::numeric_limits<RealType>::infinity()); // - to + infinity. + } + else + { // Can only use max_value. + using boost::math::tools::max_value; + return std::pair<RealType, RealType>(-max_value<RealType>(), max_value<RealType>()); // - to + max value. + } } template <class RealType, class Policy> @@ -99,12 +119,15 @@ inline RealType pdf(const laplace_distribution<RealType, Policy>& dist, const Re // Checking function argument RealType result = 0; const char* function = "boost::math::pdf(const laplace_distribution<%1%>&, %1%))"; - if (false == dist.check_parameters(function, &result)) return result; - if (false == detail::check_x(function, x, &result, Policy())) return result; - // Special pdf values + // Check scale and location. + if (false == dist.check_parameters(function, &result)) return result; + // Special pdf values. if((boost::math::isinf)(x)) + { return 0; // pdf + and - infinity is zero. + } + if (false == detail::check_x(function, x, &result, Policy())) return result; // General case RealType scale( dist.scale() ); @@ -123,20 +146,21 @@ inline RealType pdf(const laplace_distribution<RealType, Policy>& dist, const Re template <class RealType, class Policy> inline RealType cdf(const laplace_distribution<RealType, Policy>& dist, const RealType& x) { - BOOST_MATH_STD_USING // for ADL of std functions + BOOST_MATH_STD_USING // For ADL of std functions. - // Checking function argument RealType result = 0; + // Checking function argument. const char* function = "boost::math::cdf(const laplace_distribution<%1%>&, %1%)"; + // Check scale and location. if (false == dist.check_parameters(function, &result)) return result; - if (false == detail::check_x(function, x, &result, Policy())) return result; // Special cdf values: if((boost::math::isinf)(x)) { - if(x < 0) return 0; // -infinity - return 1; // + infinity + if(x < 0) return 0; // -infinity. + return 1; // + infinity. } + if (false == detail::check_x(function, x, &result, Policy())) return result; // General cdf values RealType scale( dist.scale() ); @@ -195,25 +219,29 @@ inline RealType quantile(const laplace_distribution<RealType, Policy>& dist, con template <class RealType, class Policy> inline RealType cdf(const complemented2_type<laplace_distribution<RealType, Policy>, RealType>& c) { + // Calculate complement of cdf. BOOST_MATH_STD_USING // for ADL of std functions RealType scale = c.dist.scale(); RealType location = c.dist.location(); RealType x = c.param; - - // Checking function argument RealType result = 0; + + // Checking function argument. const char* function = "boost::math::cdf(const complemented2_type<laplace_distribution<%1%>, %1%>&)"; - if(false == detail::check_x(function, x, &result, Policy()))return result; - // Calculate complement of cdf. + // Check scale and location. + //if(false == detail::check_scale(function, scale, result, Policy())) return false; + //if(false == detail::check_location(function, location, result, Policy())) return false; + if (false == c.dist.check_parameters(function, &result)) return result; - // Special cdf value + // Special cdf values. if((boost::math::isinf)(x)) { if(x < 0) return 1; // cdf complement -infinity is unity. return 0; // cdf complement +infinity is zero. } + if(false == detail::check_x(function, x, &result, Policy()))return result; // Cdf interval value. if (-x < -location) @@ -237,17 +265,23 @@ inline RealType quantile(const complemented2_type<laplace_distribution<RealType, RealType scale = c.dist.scale(); RealType location = c.dist.location(); RealType q = c.param; + RealType result = 0; // Checking function argument. - RealType result = 0; const char* function = "quantile(const complemented2_type<laplace_distribution<%1%>, %1%>&)"; + if (false == c.dist.check_parameters(function, &result)) return result; + + // Extreme values. + if(q == 0) + { + return std::numeric_limits<RealType>::infinity(); + } + if(q == 1) + { + return -std::numeric_limits<RealType>::infinity(); + } if(false == detail::check_probability(function, q, &result, Policy())) return result; - - // extreme values - if(q == 0) return std::numeric_limits<RealType>::infinity(); - if(q == 1) return -std::numeric_limits<RealType>::infinity(); - if (0.5 - q < 0.0) result = location + scale*log( static_cast<RealType>(-q*2 + 2) ); else @@ -299,6 +333,10 @@ inline RealType kurtosis_excess(const laplace_distribution<RealType, Policy>& /* return 3; } +#ifdef BOOST_MSVC +# pragma warning(pop) +#endif + } // namespace math } // namespace boost |