Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r49985 - sandbox/math_toolkit/boost/math/distributions
From: thijs_at_[hidden]
Date: 2008-11-28 08:36:24


Author: thijs
Date: 2008-11-28 08:36:24 EST (Fri, 28 Nov 2008)
New Revision: 49985
URL: http://svn.boost.org/trac/boost/changeset/49985

Log:
First version of the Laplace distribution
Added:
   sandbox/math_toolkit/boost/math/distributions/laplace.hpp (contents, props changed)

Added: sandbox/math_toolkit/boost/math/distributions/laplace.hpp
==============================================================================
--- (empty file)
+++ sandbox/math_toolkit/boost/math/distributions/laplace.hpp 2008-11-28 08:36:24 EST (Fri, 28 Nov 2008)
@@ -0,0 +1,300 @@
+// Copyright Thijs van den Berg, 2008.
+// Copyright John Maddock 2008.
+// Copyright Paul A. Bristow 2008.
+
+// 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)
+
+// This module implements the Laplace distribution.
+// http://en.wikipedia.org/wiki/Laplace_distribution
+//
+// Abramowitz and Stegun 1972, p 930
+// http://www.math.sfu.ca/~cbm/aands/page_930.htm
+
+#ifndef BOOST_STATS_LAPLACE_HPP
+#define BOOST_STATS_LAPLACE_HPP
+
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <limits>
+
+namespace boost{ namespace math{
+
+template <class RealType = double, class Policy = policies::policy<> >
+class laplace_distribution
+{
+public:
+ // ----------------------------------
+ // public Types
+ // ----------------------------------
+ typedef RealType value_type;
+ typedef Policy policy_type;
+
+ // ----------------------------------
+ // Constructor(s)
+ // ----------------------------------
+ laplace_distribution(RealType location = 0, RealType scale = 1)
+ : m_location(location), m_scale(scale)
+ {
+ RealType result;
+ check_parameters("boost::math::laplace_distribution<%1%>::laplace_distribution()", &result);
+ }
+
+
+ // ----------------------------------
+ // Public functions
+ // ----------------------------------
+
+ RealType location() const
+ {
+ return m_location;
+ }
+
+ RealType scale() const
+ {
+ return m_scale;
+ }
+
+ bool check_parameters(const char* function, RealType* result) const
+ {
+ if(false == detail::check_scale(function, m_scale, result, Policy())) return false;
+ if(false == detail::check_location(function, m_location, result, Policy())) return false;
+ return true;
+ }
+
+
+private:
+ RealType m_location;
+ RealType m_scale;
+
+}; // class laplace_distribution
+
+
+
+//
+// Convenient type synonym
+//
+typedef laplace_distribution<double> laplace;
+
+//
+// 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>());
+}
+
+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>());
+}
+
+template <class RealType, class Policy>
+inline RealType pdf(const laplace_distribution<RealType, Policy>& dist, const RealType& x)
+{
+ BOOST_MATH_STD_USING // for ADL of std functions
+
+ // Checking function argument
+ RealType result;
+ 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
+ if((boost::math::isinf)(x))
+ return 0; // pdf + and - infinity is zero.
+
+ // General case
+ RealType scale( dist.scale() );
+ RealType location( dist.location() );
+
+ RealType exponent = x - location;
+ if (exponent>0) exponent = -exponent;
+ exponent /= scale;
+
+ result = exp(exponent);
+ result /= 2 * scale;
+
+ return result;
+} // pdf
+
+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
+
+ // Checking function argument
+ RealType result;
+ const char* function = "boost::math::cdf(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 cdf values
+ if((boost::math::isinf)(x))
+ {
+ if(x < 0) return 0; // -infinity
+ return 1; // + infinity
+ }
+
+ // General cdf values
+ RealType scale( dist.scale() );
+ RealType location( dist.location() );
+
+ if (x < location)
+ result = exp( (x-location)/scale )/2;
+ else
+ result = 1 - exp( (location-x)/scale )/2;
+
+ return result;
+} // cdf
+
+
+template <class RealType, class Policy>
+inline RealType quantile(const laplace_distribution<RealType, Policy>& dist, const RealType& p)
+{
+ BOOST_MATH_STD_USING // for ADL of std functions
+
+ // Checking function argument
+ RealType result;
+ const char* function = "boost::math::quantile(const laplace_distribution<%1%>&, %1%)";
+ if (false == dist.check_parameters(function, &result)) return result;
+ if(false == detail::check_probability(function, p, &result, Policy())) return result;
+
+ // extreme values
+ if(p == 0) return -std::numeric_limits<RealType>::infinity();
+ if(p == 1) return std::numeric_limits<RealType>::infinity();
+
+ // Calculate Quantile
+ RealType scale( dist.scale() );
+ RealType location( dist.location() );
+
+ if (p - 0.5 < 0.0)
+ result = location + scale*log( static_cast<RealType>(p*2) );
+ else
+ result = location - scale*log( static_cast<RealType>(-p*2 + 2) );
+
+ return result;
+} // quantile
+
+
+template <class RealType, class Policy>
+inline RealType cdf(const complemented2_type<laplace_distribution<RealType, Policy>, RealType>& c)
+{
+ 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;
+ 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 cdf
+
+ // Special cdf value
+ if((boost::math::isinf)(x))
+ {
+ if(x < 0) return 1; // cdf complement -infinity is unity.
+ return 0; // cdf complement +infinity is zero
+ }
+
+ // Cdf interval value
+ if (-x < location)
+ result = exp( (-x-location)/scale )/2;
+ else
+ result = 1 - exp( (location+x)/scale )/2;
+
+ return result;
+} // cdf complement
+
+
+template <class RealType, class Policy>
+inline RealType quantile(const complemented2_type<laplace_distribution<RealType, Policy>, RealType>& c)
+{
+ BOOST_MATH_STD_USING // for ADL of std functions
+
+ // Calculate quantile
+ RealType scale = c.dist.scale();
+ RealType location = c.dist.location();
+ RealType q = c.param;
+
+ // Checking function argument
+ RealType result;
+ const char* function = "quantile(const complemented2_type<laplace_distribution<%1%>, %1%>&)";
+ 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
+ result = location - scale*log( static_cast<RealType>(q*2) );
+
+
+ return result;
+} // quantile
+
+template <class RealType, class Policy>
+inline RealType mean(const laplace_distribution<RealType, Policy>& dist)
+{
+ return dist.location();
+}
+
+template <class RealType, class Policy>
+inline RealType standard_deviation(const laplace_distribution<RealType, Policy>& dist)
+{
+ return constants::root_two<RealType>() * dist.scale();
+}
+
+template <class RealType, class Policy>
+inline RealType mode(const laplace_distribution<RealType, Policy>& dist)
+{
+ return dist.location();
+}
+
+template <class RealType, class Policy>
+inline RealType median(const laplace_distribution<RealType, Policy>& dist)
+{
+ return dist.location();
+}
+
+template <class RealType, class Policy>
+inline RealType skewness(const laplace_distribution<RealType, Policy>& /*dist*/)
+{
+ return 0;
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis(const laplace_distribution<RealType, Policy>& /*dist*/)
+{
+ return 6;
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis_excess(const laplace_distribution<RealType, Policy>& /*dist*/)
+{
+ return 3;
+}
+
+} // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_STATS_LAPLACE_HPP
+
+


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