summaryrefslogtreecommitdiff
path: root/boost/math/distributions/laplace.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/math/distributions/laplace.hpp')
-rw-r--r--boost/math/distributions/laplace.hpp94
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