Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r68406 - in trunk: boost/random libs/random/test
From: steven_at_[hidden]
Date: 2011-01-23 18:33:42


Author: steven_watanabe
Date: 2011-01-23 18:33:41 EST (Sun, 23 Jan 2011)
New Revision: 68406
URL: http://svn.boost.org/trac/boost/changeset/68406

Log:
Update cauchy_distribution to match C++0x.
Added:
   trunk/libs/random/test/test_cauchy.cpp (contents, props changed)
   trunk/libs/random/test/test_cauchy_distribution.cpp (contents, props changed)
Text files modified:
   trunk/boost/random/cauchy_distribution.hpp | 250 +++++++++++++++++++++++++++------------
   trunk/libs/random/test/Jamfile.v2 | 2
   2 files changed, 174 insertions(+), 78 deletions(-)

Modified: trunk/boost/random/cauchy_distribution.hpp
==============================================================================
--- trunk/boost/random/cauchy_distribution.hpp (original)
+++ trunk/boost/random/cauchy_distribution.hpp 2011-01-23 18:33:41 EST (Sun, 23 Jan 2011)
@@ -17,24 +17,20 @@
 #define BOOST_RANDOM_CAUCHY_DISTRIBUTION_HPP
 
 #include <boost/config/no_tr1/cmath.hpp>
-#include <iostream>
+#include <iosfwd>
+#include <istream>
 #include <boost/limits.hpp>
-#include <boost/static_assert.hpp>
 #include <boost/random/detail/config.hpp>
+#include <boost/random/detail/operators.hpp>
 
 namespace boost {
-
-#if defined(__GNUC__) && (__GNUC__ < 3)
-// Special gcc workaround: gcc 2.95.x ignores using-declarations
-// in template classes (confirmed by gcc author Martin v. Loewis)
- using std::tan;
-#endif
+namespace random {
 
 // Cauchy distribution:
 
 /**
  * The cauchy distribution is a continuous distribution with two
- * parameters, sigma and median.
+ * parameters, median and sigma.
  *
  * It has \f$\displaystyle p(x) = \frac{\sigma}{\pi(\sigma^2 + (x-m)^2)}\f$
  */
@@ -42,80 +38,178 @@
 class cauchy_distribution
 {
 public:
- typedef RealType input_type;
- typedef RealType result_type;
+ typedef RealType input_type;
+ typedef RealType result_type;
 
-#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
- BOOST_STATIC_ASSERT(!std::numeric_limits<RealType>::is_integer);
-#endif
-
- /**
- * Constructs a \cauchy_distribution with the paramters @c median
- * and @c sigma.
- */
- explicit cauchy_distribution(result_type median_arg = result_type(0.0),
- result_type sigma_arg = result_type(1.0))
- : _median(median_arg), _sigma(sigma_arg) { }
-
- // compiler-generated copy ctor and assignment operator are fine
-
- /**
- * Returns: the "median" parameter of the distribution
- */
- result_type median() const { return _median; }
- /**
- * Returns: the "sigma" parameter of the distribution
- */
- result_type sigma() const { return _sigma; }
- /**
- * Effects: Subsequent uses of the distribution do not depend
- * on values produced by any engine prior to invoking reset.
- */
- void reset() { }
-
- /**
- * Returns: A random variate distributed according to the
- * cauchy distribution.
- */
- template<class Engine>
- result_type operator()(Engine& eng)
- {
- // Can we have a boost::mathconst please?
- const result_type pi = result_type(3.14159265358979323846);
-#ifndef BOOST_NO_STDC_NAMESPACE
- using std::tan;
-#endif
- return _median + _sigma * tan(pi*(eng()-result_type(0.5)));
- }
-
-#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
- /**
- * Writes the parameters of the distribution to a @c std::ostream.
- */
- template<class CharT, class Traits>
- friend std::basic_ostream<CharT,Traits>&
- operator<<(std::basic_ostream<CharT,Traits>& os, const cauchy_distribution& cd)
- {
- os << cd._median << " " << cd._sigma;
- return os;
- }
-
- /**
- * Reads the parameters of the distribution from a @c std::istream.
- */
- template<class CharT, class Traits>
- friend std::basic_istream<CharT,Traits>&
- operator>>(std::basic_istream<CharT,Traits>& is, cauchy_distribution& cd)
- {
- is >> std::ws >> cd._median >> std::ws >> cd._sigma;
- return is;
- }
-#endif
+ class param_type
+ {
+ public:
+
+ typedef cauchy_distribution distribution_type;
+
+ /** Constructs the parameters of the cauchy distribution. */
+ explicit param_type(RealType median_arg = RealType(0.0),
+ RealType sigma_arg = RealType(1.0))
+ : _median(median_arg), _sigma(sigma_arg) {}
+
+ // backwards compatibility for Boost.Random
+
+ /** Returns the median of the distribution. */
+ RealType median() const { return _median; }
+ /** Returns the sigma parameter of the distribution. */
+ RealType sigma() const { return _sigma; }
+
+ // The new names in C++0x.
+
+ /** Returns the median of the distribution. */
+ RealType a() const { return _median; }
+ /** Returns the sigma parameter of the distribution. */
+ RealType b() const { return _sigma; }
+
+ /** Writes the parameters to a std::ostream. */
+ BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, param_type, parm)
+ {
+ os << parm._median << " " << parm._sigma;
+ return os;
+ }
+
+ /** Reads the parameters from a std::istream. */
+ BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, param_type, parm)
+ {
+ is >> parm._median >> std::ws >> parm._sigma;
+ return is;
+ }
+
+ /** Returns true if the two sets of parameters are equal. */
+ BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(param_type, lhs, rhs)
+ { return lhs._median == rhs._median && lhs._sigma == rhs._sigma; }
+
+ /** Returns true if the two sets of parameters are different. */
+ BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(param_type)
+
+ private:
+ RealType _median;
+ RealType _sigma;
+ };
+
+ /**
+ * Constructs a \cauchy_distribution with the paramters @c median
+ * and @c sigma.
+ */
+ explicit cauchy_distribution(RealType median_arg = RealType(0.0),
+ RealType sigma_arg = RealType(1.0))
+ : _median(median_arg), _sigma(sigma_arg) { }
+
+ /**
+ * Constructs a \cauchy_distribution from it's parameters.
+ */
+ explicit cauchy_distribution(const param_type& parm)
+ : _median(parm.median()), _sigma(parm.sigma()) { }
+
+ // compiler-generated copy ctor and assignment operator are fine
+
+ // backwards compatibility for Boost.Random
+
+ /** Returns: the "median" parameter of the distribution */
+ RealType median() const { return _median; }
+ /** Returns: the "sigma" parameter of the distribution */
+ RealType sigma() const { return _sigma; }
+
+ // The new names in C++0x
+
+ /** Returns: the "median" parameter of the distribution */
+ RealType a() const { return _median; }
+ /** Returns: the "sigma" parameter of the distribution */
+ RealType b() const { return _sigma; }
+
+ /** Returns the smallest value that the distribution can produce. */
+ RealType min BOOST_PREVENT_MACRO_SUBSTITUTION () const
+ { return -(std::numeric_limits<RealType>::infinity)(); }
+
+ /** Returns the largest value that the distribution can produce. */
+ RealType max BOOST_PREVENT_MACRO_SUBSTITUTION () const
+ { return (std::numeric_limits<RealType>::infinity)(); }
+
+ param_type param() const { return param_type(_median, _sigma); }
+
+ void param(const param_type& parm)
+ {
+ _median = parm.median();
+ _sigma = parm.sigma();
+ }
+
+ /**
+ * Effects: Subsequent uses of the distribution do not depend
+ * on values produced by any engine prior to invoking reset.
+ */
+ void reset() { }
+
+ /**
+ * Returns: A random variate distributed according to the
+ * cauchy distribution.
+ */
+ template<class Engine>
+ result_type operator()(Engine& eng)
+ {
+ // Can we have a boost::mathconst please?
+ const result_type pi = result_type(3.14159265358979323846);
+ using std::tan;
+ return _median + _sigma * tan(pi*(eng()-result_type(0.5)));
+ }
+
+ /**
+ * Returns: A random variate distributed according to the
+ * cauchy distribution with parameters specified by param.
+ */
+ template<class Engine>
+ result_type operator()(Engine& eng, const param_type& parm)
+ {
+ return cauchy_distribution(parm)(eng);
+ }
+
+ /**
+ * Writes the distribution to a @c std::ostream.
+ */
+ BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, cauchy_distribution, cd)
+ {
+ os << cd._median << " " << cd._sigma;
+ return os;
+ }
+
+ /**
+ * Reads the distribution from a @c std::istream.
+ */
+ BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, cauchy_distribution, cd)
+ {
+ is >> cd._median >> std::ws >> cd._sigma;
+ return is;
+ }
+
+ /**
+ * Returns true if the two distributions will produce
+ * identical sequences of values, given equal generators.
+ */
+ BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(cauchy_distribution, lhs, rhs)
+ { return lhs._median == rhs._median && lhs._sigma == rhs._sigma; }
+
+ /**
+ * Returns true if the two distributions may produce
+ * different sequences of values, given equal generators.
+ */
+ BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(cauchy_distribution)
 
 private:
- result_type _median, _sigma;
+
+ /// \cond
+ RealType _median;
+ RealType _sigma;
+ /// \endcond
 };
 
+} // namespace random
+
+using random::cauchy_distribution;
+
 } // namespace boost
 
 #endif // BOOST_RANDOM_CAUCHY_DISTRIBUTION_HPP

Modified: trunk/libs/random/test/Jamfile.v2
==============================================================================
--- trunk/libs/random/test/Jamfile.v2 (original)
+++ trunk/libs/random/test/Jamfile.v2 2011-01-23 18:33:41 EST (Sun, 23 Jan 2011)
@@ -77,6 +77,8 @@
 run test_exponential_distribution.cpp /boost//unit_test_framework ;
 run test_bernoulli.cpp ;
 run test_bernoulli_distribution.cpp /boost//unit_test_framework ;
+run test_cauchy.cpp ;
+run test_cauchy_distribution.cpp /boost//unit_test_framework ;
 
 # run nondet_random_speed.cpp ;
 # run random_device.cpp ;

Added: trunk/libs/random/test/test_cauchy.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/random/test/test_cauchy.cpp 2011-01-23 18:33:41 EST (Sun, 23 Jan 2011)
@@ -0,0 +1,28 @@
+/* test_cauchy.cpp
+ *
+ * Copyright Steven Watanabe 2011
+ * Distributed under 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)
+ *
+ * $Id$
+ *
+ */
+
+#include <boost/random/cauchy_distribution.hpp>
+#include <boost/random/uniform_real.hpp>
+#include <boost/math/distributions/cauchy.hpp>
+
+#define BOOST_RANDOM_DISTRIBUTION boost::random::cauchy_distribution<>
+#define BOOST_RANDOM_DISTRIBUTION_NAME cauchy
+#define BOOST_MATH_DISTRIBUTION boost::math::cauchy
+#define BOOST_RANDOM_ARG1_TYPE double
+#define BOOST_RANDOM_ARG1_NAME median
+#define BOOST_RANDOM_ARG1_DEFAULT 1000.0
+#define BOOST_RANDOM_ARG1_DISTRIBUTION(n) boost::uniform_real<>(-n, n)
+#define BOOST_RANDOM_ARG2_TYPE double
+#define BOOST_RANDOM_ARG2_NAME sigma
+#define BOOST_RANDOM_ARG2_DEFAULT 1000.0
+#define BOOST_RANDOM_ARG2_DISTRIBUTION(n) boost::uniform_real<>(0.001, n)
+
+#include "test_real_distribution.ipp"

Added: trunk/libs/random/test/test_cauchy_distribution.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/random/test/test_cauchy_distribution.cpp 2011-01-23 18:33:41 EST (Sun, 23 Jan 2011)
@@ -0,0 +1,35 @@
+/* test_cauchy_distribution.cpp
+ *
+ * Copyright Steven Watanabe 2011
+ * Distributed under 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)
+ *
+ * $Id$
+ *
+ */
+
+#include <boost/random/cauchy_distribution.hpp>
+#include <limits>
+
+#define BOOST_RANDOM_DISTRIBUTION boost::random::cauchy_distribution<>
+#define BOOST_RANDOM_ARG1 a
+#define BOOST_RANDOM_ARG2 b
+#define BOOST_RANDOM_ARG1_DEFAULT 0.0
+#define BOOST_RANDOM_ARG2_DEFAULT 1.0
+#define BOOST_RANDOM_ARG1_VALUE 7.5
+#define BOOST_RANDOM_ARG2_VALUE 0.25
+
+#define BOOST_RANDOM_DIST0_MIN -(std::numeric_limits<double>::infinity)()
+#define BOOST_RANDOM_DIST0_MAX (std::numeric_limits<double>::infinity)()
+#define BOOST_RANDOM_DIST1_MIN -(std::numeric_limits<double>::infinity)()
+#define BOOST_RANDOM_DIST1_MAX (std::numeric_limits<double>::infinity)()
+#define BOOST_RANDOM_DIST2_MIN -(std::numeric_limits<double>::infinity)()
+#define BOOST_RANDOM_DIST2_MAX (std::numeric_limits<double>::infinity)()
+
+#define BOOST_RANDOM_TEST1_PARAMS (-100000.0, 0.000001)
+#define BOOST_RANDOM_TEST2_PARAMS (100000.0, 0.000001)
+#define BOOST_RANDOM_TEST1_MAX 0.0
+#define BOOST_RANDOM_TEST2_MIN 0.0
+
+#include "test_distribution.ipp"


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