137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// random number generation -*- C++ -*-
237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh//
537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// This file is part of the GNU ISO C++ Library.  This library is free
637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// software; you can redistribute it and/or modify it under the
737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// terms of the GNU General Public License as published by the
837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// Free Software Foundation; either version 3, or (at your option)
937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// any later version.
1037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
1137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// This library is distributed in the hope that it will be useful,
1237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// but WITHOUT ANY WARRANTY; without even the implied warranty of
1337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// GNU General Public License for more details.
1537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
1637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// Under Section 7 of GPL version 3, you are granted additional
1737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// permissions described in the GCC Runtime Library Exception, version
1837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// 3.1, as published by the Free Software Foundation.
1937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
2037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// You should have received a copy of the GNU General Public License and
2137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// a copy of the GCC Runtime Library Exception along with this program;
2237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
2337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// <http://www.gnu.org/licenses/>.
2437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
2537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh/**
2637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @file bits/random.h
2737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh *  This is an internal header file, included by other library headers.
2837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh *  Do not attempt to use it directly. @headername{random}
2937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */
3037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
3137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifndef _RANDOM_H
3237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#define _RANDOM_H 1
3337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
3437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#include <vector>
3537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
3637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsiehnamespace std _GLIBCXX_VISIBILITY(default)
3737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh{
3837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh_GLIBCXX_BEGIN_NAMESPACE_VERSION
3937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
4037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  // [26.4] Random number generation
4137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
4237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
4337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @defgroup random Random Number Generation
4437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @ingroup numerics
4537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
4637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * A facility for generating random numbers on selected distributions.
4737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @{
4837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
4937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
5037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
5137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief A function template for converting the output of a (integral)
5237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * uniform random number generator to a floatng point result in the range
5337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * [0-1).
5437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
5537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType, size_t __bits,
5637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	   typename _UniformRandomNumberGenerator>
5737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    _RealType
5837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    generate_canonical(_UniformRandomNumberGenerator& __g);
5937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
6037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh_GLIBCXX_END_NAMESPACE_VERSION
6137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
6237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /*
6337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * Implementation-space details.
6437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
6537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  namespace __detail
6637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  {
6737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  _GLIBCXX_BEGIN_NAMESPACE_VERSION
6837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
6937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    template<typename _UIntType, size_t __w,
7037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	     bool = __w < static_cast<size_t>
7137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh			  (std::numeric_limits<_UIntType>::digits)>
7237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct _Shift
7337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { static const _UIntType __value = 0; };
7437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
7537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    template<typename _UIntType, size_t __w>
7637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct _Shift<_UIntType, __w, true>
7737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { static const _UIntType __value = _UIntType(1) << __w; };
7837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
7937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    template<typename _Tp, _Tp __m, _Tp __a, _Tp __c, bool>
8037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct _Mod;
8137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
8237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    // Dispatch based on modulus value to prevent divide-by-zero compile-time
8337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    // errors when m == 0.
8437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    template<typename _Tp, _Tp __m, _Tp __a = 1, _Tp __c = 0>
8537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      inline _Tp
8637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      __mod(_Tp __x)
8737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _Mod<_Tp, __m, __a, __c, __m == 0>::__calc(__x); }
8837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
8937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    /*
9037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     * An adaptor class for converting the output of any Generator into
9137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     * the input for a specific Distribution.
9237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     */
9337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    template<typename _Engine, typename _DInputType>
9437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct _Adaptor
9537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
9637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
9737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      public:
9837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_Adaptor(_Engine& __g)
9937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_g(__g) { }
10037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
10137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_DInputType
10237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	min() const
10337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _DInputType(0); }
10437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
10537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_DInputType
10637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	max() const
10737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _DInputType(1); }
10837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
10937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	/*
11037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	 * Converts a value generated by the adapted random number generator
11137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	 * into a value in the input domain for the dependent random number
11237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	 * distribution.
11337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	 */
11437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_DInputType
11537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()()
11637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
11737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  return std::generate_canonical<_DInputType,
11837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	                            std::numeric_limits<_DInputType>::digits,
11937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	                            _Engine>(_M_g);
12037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
12137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
12237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      private:
12337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_Engine& _M_g;
12437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      };
12537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
12637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  _GLIBCXX_END_NAMESPACE_VERSION
12737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  } // namespace __detail
12837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
12937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh_GLIBCXX_BEGIN_NAMESPACE_VERSION
13037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
13137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
13237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @addtogroup random_generators Random Number Generators
13337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @ingroup random
13437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
13537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * These classes define objects which provide random or pseudorandom
13637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * numbers, either from a discrete or a continuous interval.  The
13737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * random number generator supplied as a part of this library are
13837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * all uniform random number generators which provide a sequence of
13937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * random number uniformly distributed over their range.
14037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
14137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * A number generator is a function object with an operator() that
14237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * takes zero arguments and returns a number.
14337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
14437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * A compliant random number generator must satisfy the following
14537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * requirements.  <table border=1 cellpadding=10 cellspacing=0>
14637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * <caption align=top>Random Number Generator Requirements</caption>
14737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * <tr><td>To be documented.</td></tr> </table>
14837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
14937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @{
15037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
15137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
15237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
15337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief A model of a linear congruential random number generator.
15437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
15537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * A random number generator that produces pseudorandom numbers via
15637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * linear function:
15737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f[
15837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *     x_{i+1}\leftarrow(ax_{i} + c) \bmod m
15937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f]
16037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
16137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The template parameter @p _UIntType must be an unsigned integral type
16237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * large enough to store values up to (__m-1). If the template parameter
16337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @p __m is 0, the modulus @p __m used is
16437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * std::numeric_limits<_UIntType>::max() plus 1. Otherwise, the template
16537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * parameters @p __a and @p __c must be less than @p __m.
16637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
16737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The size of the state is @f$1@f$.
16837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
16937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
17037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class linear_congruential_engine
17137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
17237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_unsigned<_UIntType>::value, "template argument "
17337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "substituting _UIntType not an unsigned integral type");
17437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(__m == 0u || (__a < __m && __c < __m),
17537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument substituting __m out of bounds");
17637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
17737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // XXX FIXME:
17837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // _Mod::__calc should handle correctly __m % __a >= __m / __a too.
17937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(__m % __a < __m / __a,
18037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "sorry, not implemented yet: try a smaller 'a' constant");
18137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
18237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
18337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the generated random value. */
18437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _UIntType result_type;
18537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
18637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The multiplier. */
18737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type multiplier   = __a;
18837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** An increment. */
18937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type increment    = __c;
19037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The modulus. */
19137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type modulus      = __m;
19237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type default_seed = 1u;
19337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
19437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
19537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Constructs a %linear_congruential_engine random number
19637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        generator engine with seed @p __s.  The default seed value
19737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        is 1.
19837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
19937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __s The initial seed value.
20037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
20137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
20237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      linear_congruential_engine(result_type __s = default_seed)
20337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { seed(__s); }
20437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
20537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
20637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Constructs a %linear_congruential_engine random number
20737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        generator engine seeded from the seed sequence @p __q.
20837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
20937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __q the seed sequence.
21037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
21137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _Sseq, typename = typename
21237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	std::enable_if<!std::is_same<_Sseq, linear_congruential_engine>::value>
21337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       ::type>
21437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        explicit
21537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        linear_congruential_engine(_Sseq& __q)
21637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        { seed(__q); }
21737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
21837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
21937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Reseeds the %linear_congruential_engine random number generator
22037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        engine sequence to the seed @p __s.
22137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
22237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __s The new seed.
22337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
22437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
22537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      seed(result_type __s = default_seed);
22637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
22737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
22837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Reseeds the %linear_congruential_engine random number generator
22937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        engine
23037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * sequence using values from the seed sequence @p __q.
23137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
23237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __q the seed sequence.
23337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
23437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _Sseq>
23537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        typename std::enable_if<std::is_class<_Sseq>::value>::type
23637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        seed(_Sseq& __q);
23737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
23837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
23937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Gets the smallest possible value in the output range.
24037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
24137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * The minimum depends on the @p __c parameter: if it is zero, the
24237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * minimum generated must be > 0, otherwise 0 is allowed.
24337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
24437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type
24537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min()
24637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return __c == 0u ? 1u : 0u; }
24737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
24837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
24937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Gets the largest possible value in the output range.
25037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
25137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type
25237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max()
25337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return __m - 1u; }
25437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
25537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
25637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Discard a sequence of random numbers.
25737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
25837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
25937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      discard(unsigned long long __z)
26037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
26137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	for (; __z != 0ULL; --__z)
26237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  (*this)();
26337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
26437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
26537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
26637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Gets the next random number in the sequence.
26737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
26837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
26937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator()()
27037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
27137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_x = __detail::__mod<_UIntType, __m, __a, __c>(_M_x);
27237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return _M_x;
27337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
27437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
27537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
27637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Compares two linear congruential random number generator
27737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * objects of the same type for equality.
27837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
27937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __lhs A linear congruential random number generator object.
28037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __rhs Another linear congruential random number generator
28137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *              object.
28237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
28337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns true if the infinite sequences of generated values
28437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *          would be equal, false otherwise.
28537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
28637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      friend bool
28737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator==(const linear_congruential_engine& __lhs,
28837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		 const linear_congruential_engine& __rhs)
28937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return __lhs._M_x == __rhs._M_x; }
29037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
29137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
29237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Writes the textual representation of the state x(i) of x to
29337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        @p __os.
29437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
29537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __os  The output stream.
29637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __lcr A % linear_congruential_engine random number generator.
29737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns __os.
29837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
29937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UIntType1, _UIntType1 __a1, _UIntType1 __c1,
30037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       _UIntType1 __m1, typename _CharT, typename _Traits>
30137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
30237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
30337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const std::linear_congruential_engine<_UIntType1,
30437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   __a1, __c1, __m1>& __lcr);
30537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
30637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
30737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Sets the state of the engine by reading its textual
30837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        representation from @p __is.
30937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
31037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * The textual representation must have been previously written using
31137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * an output stream whose imbued locale and whose type's template
31237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * specialization arguments _CharT and _Traits were the same as those
31337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * of @p __is.
31437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
31537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __is  The input stream.
31637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __lcr A % linear_congruential_engine random number generator.
31737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns __is.
31837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
31937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UIntType1, _UIntType1 __a1, _UIntType1 __c1,
32037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       _UIntType1 __m1, typename _CharT, typename _Traits>
32137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
32237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
32337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   std::linear_congruential_engine<_UIntType1, __a1,
32437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   __c1, __m1>& __lcr);
32537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
32637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
32737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _UIntType _M_x;
32837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
32937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
33037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
33137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Compares two linear congruential random number generator
33237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * objects of the same type for inequality.
33337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
33437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __lhs A linear congruential random number generator object.
33537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __rhs Another linear congruential random number generator
33637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *              object.
33737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
33837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns true if the infinite sequences of generated values
33937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *          would be different, false otherwise.
34037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
34137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
34237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
34337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::linear_congruential_engine<_UIntType, __a,
34437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       __c, __m>& __lhs,
34537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::linear_congruential_engine<_UIntType, __a,
34637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       __c, __m>& __rhs)
34737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__lhs == __rhs); }
34837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
34937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
35037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
35137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * A generalized feedback shift register discrete random number generator.
35237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
35337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * This algorithm avoids multiplication and division and is designed to be
35437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * friendly to a pipelined architecture.  If the parameters are chosen
35537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * correctly, this generator will produce numbers with a very long period and
35637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * fairly good apparent entropy, although still not cryptographically strong.
35737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
35837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The best way to use this generator is with the predefined mt19937 class.
35937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
36037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * This algorithm was originally invented by Makoto Matsumoto and
36137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * Takuji Nishimura.
36237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
36337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @tparam __w  Word size, the number of bits in each element of
36437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *              the state vector.
36537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @tparam __n  The degree of recursion.
36637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @tparam __m  The period parameter.
36737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @tparam __r  The separation point bit index.
36837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @tparam __a  The last row of the twist matrix.
36937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @tparam __u  The first right-shift tempering matrix parameter.
37037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @tparam __d  The first right-shift tempering matrix mask.
37137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @tparam __s  The first left-shift tempering matrix parameter.
37237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @tparam __b  The first left-shift tempering matrix mask.
37337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @tparam __t  The second left-shift tempering matrix parameter.
37437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @tparam __c  The second left-shift tempering matrix mask.
37537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @tparam __l  The second right-shift tempering matrix parameter.
37637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @tparam __f  Initialization multiplier.
37737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
37837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _UIntType, size_t __w,
37937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	   size_t __n, size_t __m, size_t __r,
38037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	   _UIntType __a, size_t __u, _UIntType __d, size_t __s,
38137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	   _UIntType __b, size_t __t,
38237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	   _UIntType __c, size_t __l, _UIntType __f>
38337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class mersenne_twister_engine
38437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
38537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_unsigned<_UIntType>::value, "template argument "
38637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "substituting _UIntType not an unsigned integral type");
38737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(1u <= __m && __m <= __n,
38837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument substituting __m out of bounds");
38937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(__r <= __w, "template argument substituting "
39037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "__r out of bound");
39137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(__u <= __w, "template argument substituting "
39237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "__u out of bound");
39337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(__s <= __w, "template argument substituting "
39437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "__s out of bound");
39537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(__t <= __w, "template argument substituting "
39637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "__t out of bound");
39737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(__l <= __w, "template argument substituting "
39837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "__l out of bound");
39937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(__w <= std::numeric_limits<_UIntType>::digits,
40037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument substituting __w out of bound");
40137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(__a <= (__detail::_Shift<_UIntType, __w>::__value - 1),
40237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument substituting __a out of bound");
40337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(__b <= (__detail::_Shift<_UIntType, __w>::__value - 1),
40437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument substituting __b out of bound");
40537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(__c <= (__detail::_Shift<_UIntType, __w>::__value - 1),
40637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument substituting __c out of bound");
40737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(__d <= (__detail::_Shift<_UIntType, __w>::__value - 1),
40837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument substituting __d out of bound");
40937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(__f <= (__detail::_Shift<_UIntType, __w>::__value - 1),
41037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument substituting __f out of bound");
41137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
41237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
41337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the generated random value. */
41437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _UIntType result_type;
41537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
41637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // parameter values
41737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr size_t      word_size                 = __w;
41837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr size_t      state_size                = __n;
41937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr size_t      shift_size                = __m;
42037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr size_t      mask_bits                 = __r;
42137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type xor_mask                  = __a;
42237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr size_t      tempering_u               = __u;
42337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type tempering_d               = __d;
42437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr size_t      tempering_s               = __s;
42537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type tempering_b               = __b;
42637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr size_t      tempering_t               = __t;
42737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type tempering_c               = __c;
42837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr size_t      tempering_l               = __l;
42937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type initialization_multiplier = __f;
43037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type default_seed = 5489u;
43137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
43237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // constructors and member function
43337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
43437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      mersenne_twister_engine(result_type __sd = default_seed)
43537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { seed(__sd); }
43637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
43737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
43837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Constructs a %mersenne_twister_engine random number generator
43937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        engine seeded from the seed sequence @p __q.
44037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
44137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __q the seed sequence.
44237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
44337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _Sseq, typename = typename
44437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        std::enable_if<!std::is_same<_Sseq, mersenne_twister_engine>::value>
44537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       ::type>
44637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        explicit
44737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        mersenne_twister_engine(_Sseq& __q)
44837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        { seed(__q); }
44937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
45037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
45137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      seed(result_type __sd = default_seed);
45237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
45337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _Sseq>
45437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	typename std::enable_if<std::is_class<_Sseq>::value>::type
45537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        seed(_Sseq& __q);
45637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
45737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
45837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Gets the smallest possible value in the output range.
45937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
46037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type
46137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min()
46237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return 0; };
46337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
46437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
46537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Gets the largest possible value in the output range.
46637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
46737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type
46837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max()
46937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return __detail::_Shift<_UIntType, __w>::__value - 1; }
47037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
47137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
47237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Discard a sequence of random numbers.
47337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
47437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
47537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      discard(unsigned long long __z)
47637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
47737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	for (; __z != 0ULL; --__z)
47837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  (*this)();
47937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
48037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
48137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
48237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator()();
48337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
48437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
48537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Compares two % mersenne_twister_engine random number generator
48637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        objects of the same type for equality.
48737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
48837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __lhs A % mersenne_twister_engine random number generator
48937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *              object.
49037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __rhs Another % mersenne_twister_engine random number
49137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *              generator object.
49237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
49337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns true if the infinite sequences of generated values
49437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *          would be equal, false otherwise.
49537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
49637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      friend bool
49737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator==(const mersenne_twister_engine& __lhs,
49837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		 const mersenne_twister_engine& __rhs)
49937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return (std::equal(__lhs._M_x, __lhs._M_x + state_size, __rhs._M_x)
50037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		&& __lhs._M_p == __rhs._M_p); }
50137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
50237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
50337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Inserts the current state of a % mersenne_twister_engine
50437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        random number generator engine @p __x into the output stream
50537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        @p __os.
50637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
50737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __os An output stream.
50837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A % mersenne_twister_engine random number generator
50937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *             engine.
51037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
51137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
51237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * an error state.
51337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
51437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UIntType1,
51537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       size_t __w1, size_t __n1,
51637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       size_t __m1, size_t __r1,
51737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       _UIntType1 __a1, size_t __u1,
51837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       _UIntType1 __d1, size_t __s1,
51937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       _UIntType1 __b1, size_t __t1,
52037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       _UIntType1 __c1, size_t __l1, _UIntType1 __f1,
52137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       typename _CharT, typename _Traits>
52237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
52337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
52437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const std::mersenne_twister_engine<_UIntType1, __w1, __n1,
52537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   __m1, __r1, __a1, __u1, __d1, __s1, __b1, __t1, __c1,
52637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   __l1, __f1>& __x);
52737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
52837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
52937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Extracts the current state of a % mersenne_twister_engine
53037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        random number generator engine @p __x from the input stream
53137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        @p __is.
53237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
53337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __is An input stream.
53437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A % mersenne_twister_engine random number generator
53537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *             engine.
53637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
53737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The input stream with the state of @p __x extracted or in
53837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * an error state.
53937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
54037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UIntType1,
54137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       size_t __w1, size_t __n1,
54237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       size_t __m1, size_t __r1,
54337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       _UIntType1 __a1, size_t __u1,
54437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       _UIntType1 __d1, size_t __s1,
54537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       _UIntType1 __b1, size_t __t1,
54637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       _UIntType1 __c1, size_t __l1, _UIntType1 __f1,
54737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       typename _CharT, typename _Traits>
54837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
54937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
55037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   std::mersenne_twister_engine<_UIntType1, __w1, __n1, __m1,
55137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   __r1, __a1, __u1, __d1, __s1, __b1, __t1, __c1,
55237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   __l1, __f1>& __x);
55337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
55437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
55537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _UIntType _M_x[state_size];
55637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      size_t    _M_p;
55737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
55837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
55937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
56037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Compares two % mersenne_twister_engine random number generator
56137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *        objects of the same type for inequality.
56237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
56337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __lhs A % mersenne_twister_engine random number generator
56437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *              object.
56537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __rhs Another % mersenne_twister_engine random number
56637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *              generator object.
56737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
56837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns true if the infinite sequences of generated values
56937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *          would be different, false otherwise.
57037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
57137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _UIntType, size_t __w,
57237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	   size_t __n, size_t __m, size_t __r,
57337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	   _UIntType __a, size_t __u, _UIntType __d, size_t __s,
57437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	   _UIntType __b, size_t __t,
57537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	   _UIntType __c, size_t __l, _UIntType __f>
57637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
57737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::mersenne_twister_engine<_UIntType, __w, __n, __m,
57837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>& __lhs,
57937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::mersenne_twister_engine<_UIntType, __w, __n, __m,
58037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>& __rhs)
58137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__lhs == __rhs); }
58237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
58337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
58437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
58537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief The Marsaglia-Zaman generator.
58637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
58737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * This is a model of a Generalized Fibonacci discrete random number
58837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * generator, sometimes referred to as the SWC generator.
58937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
59037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * A discrete random number generator that produces pseudorandom
59137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * numbers using:
59237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f[
59337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *     x_{i}\leftarrow(x_{i - s} - x_{i - r} - carry_{i-1}) \bmod m
59437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f]
59537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
59637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The size of the state is @f$r@f$
59737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * and the maximum period of the generator is @f$(m^r - m^s - 1)@f$.
59837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
59937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @var _M_x     The state of the generator.  This is a ring buffer.
60037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @var _M_carry The carry.
60137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @var _M_p     Current index of x(i - r).
60237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
60337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _UIntType, size_t __w, size_t __s, size_t __r>
60437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class subtract_with_carry_engine
60537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
60637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_unsigned<_UIntType>::value, "template argument "
60737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "substituting _UIntType not an unsigned integral type");
60837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(0u < __s && __s < __r,
60937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument substituting __s out of bounds");
61037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(0u < __w && __w <= std::numeric_limits<_UIntType>::digits,
61137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument substituting __w out of bounds");
61237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
61337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
61437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the generated random value. */
61537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _UIntType result_type;
61637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
61737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // parameter values
61837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr size_t      word_size    = __w;
61937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr size_t      short_lag    = __s;
62037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr size_t      long_lag     = __r;
62137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type default_seed = 19780503u;
62237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
62337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
62437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Constructs an explicitly seeded % subtract_with_carry_engine
62537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        random number generator.
62637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
62737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
62837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      subtract_with_carry_engine(result_type __sd = default_seed)
62937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { seed(__sd); }
63037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
63137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
63237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Constructs a %subtract_with_carry_engine random number engine
63337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        seeded from the seed sequence @p __q.
63437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
63537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __q the seed sequence.
63637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
63737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _Sseq, typename = typename
63837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        std::enable_if<!std::is_same<_Sseq, subtract_with_carry_engine>::value>
63937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       ::type>
64037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        explicit
64137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        subtract_with_carry_engine(_Sseq& __q)
64237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        { seed(__q); }
64337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
64437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
64537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Seeds the initial state @f$x_0@f$ of the random number
64637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        generator.
64737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
64837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * N1688[4.19] modifies this as follows.  If @p __value == 0,
64937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * sets value to 19780503.  In any case, with a linear
65037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * congruential generator lcg(i) having parameters @f$ m_{lcg} =
65137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * 2147483563, a_{lcg} = 40014, c_{lcg} = 0, and lcg(0) = value
65237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @f$, sets @f$ x_{-r} \dots x_{-1} @f$ to @f$ lcg(1) \bmod m
65337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * \dots lcg(r) \bmod m @f$ respectively.  If @f$ x_{-1} = 0 @f$
65437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * set carry to 1, otherwise sets carry to 0.
65537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
65637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
65737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      seed(result_type __sd = default_seed);
65837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
65937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
66037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Seeds the initial state @f$x_0@f$ of the
66137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * % subtract_with_carry_engine random number generator.
66237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
66337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _Sseq>
66437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	typename std::enable_if<std::is_class<_Sseq>::value>::type
66537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        seed(_Sseq& __q);
66637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
66737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
66837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Gets the inclusive minimum value of the range of random
66937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * integers returned by this generator.
67037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
67137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type
67237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min()
67337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return 0; }
67437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
67537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
67637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Gets the inclusive maximum value of the range of random
67737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * integers returned by this generator.
67837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
67937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type
68037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max()
68137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return __detail::_Shift<_UIntType, __w>::__value - 1; }
68237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
68337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
68437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Discard a sequence of random numbers.
68537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
68637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
68737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      discard(unsigned long long __z)
68837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
68937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	for (; __z != 0ULL; --__z)
69037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  (*this)();
69137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
69237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
69337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
69437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Gets the next random number in the sequence.
69537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
69637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
69737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator()();
69837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
69937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
70037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Compares two % subtract_with_carry_engine random number
70137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        generator objects of the same type for equality.
70237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
70337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __lhs A % subtract_with_carry_engine random number generator
70437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *              object.
70537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __rhs Another % subtract_with_carry_engine random number
70637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *              generator object.
70737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
70837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns true if the infinite sequences of generated values
70937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *          would be equal, false otherwise.
71037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      */
71137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      friend bool
71237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator==(const subtract_with_carry_engine& __lhs,
71337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		 const subtract_with_carry_engine& __rhs)
71437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return (std::equal(__lhs._M_x, __lhs._M_x + long_lag, __rhs._M_x)
71537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		&& __lhs._M_carry == __rhs._M_carry
71637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		&& __lhs._M_p == __rhs._M_p); }
71737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
71837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
71937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Inserts the current state of a % subtract_with_carry_engine
72037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        random number generator engine @p __x into the output stream
72137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        @p __os.
72237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
72337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __os An output stream.
72437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A % subtract_with_carry_engine random number generator
72537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *             engine.
72637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
72737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
72837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * an error state.
72937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
73037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UIntType1, size_t __w1, size_t __s1, size_t __r1,
73137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       typename _CharT, typename _Traits>
73237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
73337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>&,
73437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const std::subtract_with_carry_engine<_UIntType1, __w1,
73537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   __s1, __r1>&);
73637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
73737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
73837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Extracts the current state of a % subtract_with_carry_engine
73937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        random number generator engine @p __x from the input stream
74037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        @p __is.
74137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
74237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __is An input stream.
74337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A % subtract_with_carry_engine random number generator
74437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *             engine.
74537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
74637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The input stream with the state of @p __x extracted or in
74737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * an error state.
74837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
74937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UIntType1, size_t __w1, size_t __s1, size_t __r1,
75037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       typename _CharT, typename _Traits>
75137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
75237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>&,
75337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   std::subtract_with_carry_engine<_UIntType1, __w1,
75437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   __s1, __r1>&);
75537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
75637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
75737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _UIntType  _M_x[long_lag];
75837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _UIntType  _M_carry;
75937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      size_t     _M_p;
76037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
76137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
76237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
76337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Compares two % subtract_with_carry_engine random number
76437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *        generator objects of the same type for inequality.
76537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
76637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __lhs A % subtract_with_carry_engine random number generator
76737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *              object.
76837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __rhs Another % subtract_with_carry_engine random number
76937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *              generator object.
77037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
77137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns true if the infinite sequences of generated values
77237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *          would be different, false otherwise.
77337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
77437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _UIntType, size_t __w, size_t __s, size_t __r>
77537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
77637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::subtract_with_carry_engine<_UIntType, __w,
77737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       __s, __r>& __lhs,
77837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::subtract_with_carry_engine<_UIntType, __w,
77937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       __s, __r>& __rhs)
78037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__lhs == __rhs); }
78137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
78237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
78337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
78437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * Produces random numbers from some base engine by discarding blocks of
78537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * data.
78637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
78737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * 0 <= @p __r <= @p __p
78837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
78937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RandomNumberEngine, size_t __p, size_t __r>
79037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class discard_block_engine
79137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
79237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(1 <= __r && __r <= __p,
79337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument substituting __r out of bounds");
79437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
79537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
79637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the generated random value. */
79737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef typename _RandomNumberEngine::result_type result_type;
79837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
79937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // parameter values
80037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr size_t block_size = __p;
80137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr size_t used_block = __r;
80237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
80337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
80437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Constructs a default %discard_block_engine engine.
80537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
80637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * The underlying engine is default constructed as well.
80737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
80837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      discard_block_engine()
80937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_b(), _M_n(0) { }
81037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
81137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
81237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Copy constructs a %discard_block_engine engine.
81337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
81437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * Copies an existing base class random number generator.
81537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __rng An existing (base class) engine object.
81637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
81737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
81837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      discard_block_engine(const _RandomNumberEngine& __rng)
81937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_b(__rng), _M_n(0) { }
82037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
82137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
82237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Move constructs a %discard_block_engine engine.
82337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
82437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * Copies an existing base class random number generator.
82537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __rng An existing (base class) engine object.
82637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
82737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
82837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      discard_block_engine(_RandomNumberEngine&& __rng)
82937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_b(std::move(__rng)), _M_n(0) { }
83037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
83137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
83237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Seed constructs a %discard_block_engine engine.
83337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
83437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * Constructs the underlying generator engine seeded with @p __s.
83537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __s A seed value for the base class engine.
83637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
83737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
83837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      discard_block_engine(result_type __s)
83937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_b(__s), _M_n(0) { }
84037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
84137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
84237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Generator construct a %discard_block_engine engine.
84337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
84437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __q A seed sequence.
84537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
84637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _Sseq, typename = typename
84737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	std::enable_if<!std::is_same<_Sseq, discard_block_engine>::value
84837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		       && !std::is_same<_Sseq, _RandomNumberEngine>::value>
84937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       ::type>
85037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        explicit
85137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        discard_block_engine(_Sseq& __q)
85237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_b(__q), _M_n(0)
85337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        { }
85437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
85537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
85637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Reseeds the %discard_block_engine object with the default
85737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        seed for the underlying base class generator engine.
85837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
85937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
86037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      seed()
86137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
86237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_b.seed();
86337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_n = 0;
86437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
86537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
86637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
86737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Reseeds the %discard_block_engine object with the default
86837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        seed for the underlying base class generator engine.
86937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
87037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
87137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      seed(result_type __s)
87237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
87337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_b.seed(__s);
87437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_n = 0;
87537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
87637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
87737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
87837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Reseeds the %discard_block_engine object with the given seed
87937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        sequence.
88037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __q A seed generator function.
88137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
88237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _Sseq>
88337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        void
88437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        seed(_Sseq& __q)
88537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        {
88637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  _M_b.seed(__q);
88737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  _M_n = 0;
88837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
88937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
89037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
89137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Gets a const reference to the underlying generator engine
89237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        object.
89337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
89437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      const _RandomNumberEngine&
89537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      base() const noexcept
89637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_b; }
89737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
89837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
89937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Gets the minimum value in the generated random number range.
90037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
90137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type
90237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min()
90337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _RandomNumberEngine::min(); }
90437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
90537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
90637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Gets the maximum value in the generated random number range.
90737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
90837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type
90937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max()
91037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _RandomNumberEngine::max(); }
91137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
91237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
91337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Discard a sequence of random numbers.
91437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
91537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
91637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      discard(unsigned long long __z)
91737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
91837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	for (; __z != 0ULL; --__z)
91937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  (*this)();
92037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
92137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
92237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
92337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Gets the next value in the generated random number sequence.
92437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
92537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
92637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator()();
92737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
92837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
92937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Compares two %discard_block_engine random number generator
93037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        objects of the same type for equality.
93137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
93237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __lhs A %discard_block_engine random number generator object.
93337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __rhs Another %discard_block_engine random number generator
93437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *              object.
93537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
93637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns true if the infinite sequences of generated values
93737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *          would be equal, false otherwise.
93837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
93937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      friend bool
94037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator==(const discard_block_engine& __lhs,
94137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		 const discard_block_engine& __rhs)
94237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return __lhs._M_b == __rhs._M_b && __lhs._M_n == __rhs._M_n; }
94337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
94437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
94537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Inserts the current state of a %discard_block_engine random
94637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        number generator engine @p __x into the output stream
94737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        @p __os.
94837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
94937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __os An output stream.
95037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A %discard_block_engine random number generator engine.
95137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
95237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
95337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * an error state.
95437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
95537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _RandomNumberEngine1, size_t __p1, size_t __r1,
95637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       typename _CharT, typename _Traits>
95737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
95837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
95937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const std::discard_block_engine<_RandomNumberEngine1,
96037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   __p1, __r1>& __x);
96137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
96237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
96337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Extracts the current state of a % subtract_with_carry_engine
96437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        random number generator engine @p __x from the input stream
96537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        @p __is.
96637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
96737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __is An input stream.
96837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A %discard_block_engine random number generator engine.
96937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
97037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The input stream with the state of @p __x extracted or in
97137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * an error state.
97237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
97337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _RandomNumberEngine1, size_t __p1, size_t __r1,
97437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       typename _CharT, typename _Traits>
97537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
97637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
97737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   std::discard_block_engine<_RandomNumberEngine1,
97837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   __p1, __r1>& __x);
97937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
98037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
98137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _RandomNumberEngine _M_b;
98237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      size_t _M_n;
98337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
98437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
98537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
98637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Compares two %discard_block_engine random number generator
98737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *        objects of the same type for inequality.
98837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
98937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __lhs A %discard_block_engine random number generator object.
99037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __rhs Another %discard_block_engine random number generator
99137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *              object.
99237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
99337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns true if the infinite sequences of generated values
99437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *          would be different, false otherwise.
99537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
99637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RandomNumberEngine, size_t __p, size_t __r>
99737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
99837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::discard_block_engine<_RandomNumberEngine, __p,
99937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       __r>& __lhs,
100037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::discard_block_engine<_RandomNumberEngine, __p,
100137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       __r>& __rhs)
100237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__lhs == __rhs); }
100337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
100437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
100537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
100637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * Produces random numbers by combining random numbers from some base
100737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * engine to produce random numbers with a specifies number of bits @p __w.
100837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
100937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RandomNumberEngine, size_t __w, typename _UIntType>
101037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class independent_bits_engine
101137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
101237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_unsigned<_UIntType>::value, "template argument "
101337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "substituting _UIntType not an unsigned integral type");
101437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(0u < __w && __w <= std::numeric_limits<_UIntType>::digits,
101537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument substituting __w out of bounds");
101637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
101737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
101837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the generated random value. */
101937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _UIntType result_type;
102037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
102137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
102237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Constructs a default %independent_bits_engine engine.
102337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
102437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * The underlying engine is default constructed as well.
102537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
102637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      independent_bits_engine()
102737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_b() { }
102837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
102937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
103037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Copy constructs a %independent_bits_engine engine.
103137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
103237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * Copies an existing base class random number generator.
103337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __rng An existing (base class) engine object.
103437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
103537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
103637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      independent_bits_engine(const _RandomNumberEngine& __rng)
103737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_b(__rng) { }
103837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
103937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
104037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Move constructs a %independent_bits_engine engine.
104137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
104237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * Copies an existing base class random number generator.
104337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __rng An existing (base class) engine object.
104437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
104537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
104637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      independent_bits_engine(_RandomNumberEngine&& __rng)
104737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_b(std::move(__rng)) { }
104837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
104937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
105037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Seed constructs a %independent_bits_engine engine.
105137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
105237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * Constructs the underlying generator engine seeded with @p __s.
105337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __s A seed value for the base class engine.
105437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
105537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
105637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      independent_bits_engine(result_type __s)
105737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_b(__s) { }
105837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
105937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
106037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Generator construct a %independent_bits_engine engine.
106137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
106237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __q A seed sequence.
106337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
106437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _Sseq, typename = typename
106537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	std::enable_if<!std::is_same<_Sseq, independent_bits_engine>::value
106637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		       && !std::is_same<_Sseq, _RandomNumberEngine>::value>
106737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh               ::type>
106837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        explicit
106937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        independent_bits_engine(_Sseq& __q)
107037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        : _M_b(__q)
107137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        { }
107237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
107337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
107437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Reseeds the %independent_bits_engine object with the default
107537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        seed for the underlying base class generator engine.
107637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
107737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
107837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      seed()
107937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_b.seed(); }
108037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
108137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
108237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Reseeds the %independent_bits_engine object with the default
108337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        seed for the underlying base class generator engine.
108437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
108537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
108637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      seed(result_type __s)
108737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_b.seed(__s); }
108837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
108937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
109037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Reseeds the %independent_bits_engine object with the given
109137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        seed sequence.
109237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __q A seed generator function.
109337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
109437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _Sseq>
109537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        void
109637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        seed(_Sseq& __q)
109737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        { _M_b.seed(__q); }
109837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
109937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
110037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Gets a const reference to the underlying generator engine
110137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        object.
110237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
110337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      const _RandomNumberEngine&
110437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      base() const noexcept
110537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_b; }
110637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
110737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
110837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Gets the minimum value in the generated random number range.
110937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
111037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type
111137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min()
111237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return 0U; }
111337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
111437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
111537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Gets the maximum value in the generated random number range.
111637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
111737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type
111837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max()
111937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return __detail::_Shift<_UIntType, __w>::__value - 1; }
112037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
112137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
112237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Discard a sequence of random numbers.
112337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
112437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
112537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      discard(unsigned long long __z)
112637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
112737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	for (; __z != 0ULL; --__z)
112837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  (*this)();
112937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
113037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
113137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
113237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Gets the next value in the generated random number sequence.
113337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
113437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
113537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator()();
113637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
113737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
113837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Compares two %independent_bits_engine random number generator
113937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * objects of the same type for equality.
114037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
114137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __lhs A %independent_bits_engine random number generator
114237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *              object.
114337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __rhs Another %independent_bits_engine random number generator
114437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *              object.
114537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
114637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns true if the infinite sequences of generated values
114737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *          would be equal, false otherwise.
114837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
114937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      friend bool
115037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator==(const independent_bits_engine& __lhs,
115137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		 const independent_bits_engine& __rhs)
115237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return __lhs._M_b == __rhs._M_b; }
115337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
115437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
115537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Extracts the current state of a % subtract_with_carry_engine
115637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        random number generator engine @p __x from the input stream
115737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        @p __is.
115837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
115937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __is An input stream.
116037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A %independent_bits_engine random number generator
116137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *             engine.
116237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
116337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The input stream with the state of @p __x extracted or in
116437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *          an error state.
116537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
116637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _CharT, typename _Traits>
116737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
116837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
116937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   std::independent_bits_engine<_RandomNumberEngine,
117037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   __w, _UIntType>& __x)
117137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
117237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  __is >> __x._M_b;
117337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  return __is;
117437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
117537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
117637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
117737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _RandomNumberEngine _M_b;
117837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
117937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
118037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
118137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Compares two %independent_bits_engine random number generator
118237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * objects of the same type for inequality.
118337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
118437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __lhs A %independent_bits_engine random number generator
118537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *              object.
118637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __rhs Another %independent_bits_engine random number generator
118737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *              object.
118837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
118937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns true if the infinite sequences of generated values
119037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *          would be different, false otherwise.
119137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
119237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RandomNumberEngine, size_t __w, typename _UIntType>
119337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
119437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::independent_bits_engine<_RandomNumberEngine, __w,
119537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       _UIntType>& __lhs,
119637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::independent_bits_engine<_RandomNumberEngine, __w,
119737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       _UIntType>& __rhs)
119837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__lhs == __rhs); }
119937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
120037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
120137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Inserts the current state of a %independent_bits_engine random
120237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *        number generator engine @p __x into the output stream @p __os.
120337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
120437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __os An output stream.
120537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __x  A %independent_bits_engine random number generator engine.
120637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
120737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns The output stream with the state of @p __x inserted or in
120837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *          an error state.
120937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
121037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RandomNumberEngine, size_t __w, typename _UIntType,
121137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	   typename _CharT, typename _Traits>
121237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    std::basic_ostream<_CharT, _Traits>&
121337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
121437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::independent_bits_engine<_RandomNumberEngine,
121537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       __w, _UIntType>& __x)
121637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
121737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      __os << __x.base();
121837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      return __os;
121937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    }
122037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
122137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
122237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
122337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Produces random numbers by combining random numbers from some
122437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * base engine to produce random numbers with a specifies number of bits
122537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @p __w.
122637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
122737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RandomNumberEngine, size_t __k>
122837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class shuffle_order_engine
122937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
123037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(1u <= __k, "template argument substituting "
123137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "__k out of bound");
123237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
123337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
123437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the generated random value. */
123537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef typename _RandomNumberEngine::result_type result_type;
123637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
123737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr size_t table_size = __k;
123837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
123937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
124037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Constructs a default %shuffle_order_engine engine.
124137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
124237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * The underlying engine is default constructed as well.
124337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
124437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      shuffle_order_engine()
124537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_b()
124637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_initialize(); }
124737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
124837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
124937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Copy constructs a %shuffle_order_engine engine.
125037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
125137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * Copies an existing base class random number generator.
125237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __rng An existing (base class) engine object.
125337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
125437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
125537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      shuffle_order_engine(const _RandomNumberEngine& __rng)
125637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_b(__rng)
125737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_initialize(); }
125837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
125937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
126037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Move constructs a %shuffle_order_engine engine.
126137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
126237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * Copies an existing base class random number generator.
126337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __rng An existing (base class) engine object.
126437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
126537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
126637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      shuffle_order_engine(_RandomNumberEngine&& __rng)
126737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_b(std::move(__rng))
126837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_initialize(); }
126937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
127037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
127137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Seed constructs a %shuffle_order_engine engine.
127237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
127337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * Constructs the underlying generator engine seeded with @p __s.
127437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __s A seed value for the base class engine.
127537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
127637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
127737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      shuffle_order_engine(result_type __s)
127837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_b(__s)
127937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_initialize(); }
128037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
128137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
128237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Generator construct a %shuffle_order_engine engine.
128337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
128437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __q A seed sequence.
128537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
128637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _Sseq, typename = typename
128737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	std::enable_if<!std::is_same<_Sseq, shuffle_order_engine>::value
128837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		       && !std::is_same<_Sseq, _RandomNumberEngine>::value>
128937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       ::type>
129037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        explicit
129137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        shuffle_order_engine(_Sseq& __q)
129237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        : _M_b(__q)
129337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        { _M_initialize(); }
129437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
129537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
129637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Reseeds the %shuffle_order_engine object with the default seed
129737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh                for the underlying base class generator engine.
129837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
129937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
130037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      seed()
130137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
130237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_b.seed();
130337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_initialize();
130437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
130537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
130637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
130737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Reseeds the %shuffle_order_engine object with the default seed
130837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        for the underlying base class generator engine.
130937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
131037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
131137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      seed(result_type __s)
131237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
131337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_b.seed(__s);
131437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_initialize();
131537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
131637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
131737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
131837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Reseeds the %shuffle_order_engine object with the given seed
131937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        sequence.
132037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __q A seed generator function.
132137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
132237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _Sseq>
132337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        void
132437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        seed(_Sseq& __q)
132537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        {
132637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  _M_b.seed(__q);
132737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  _M_initialize();
132837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
132937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
133037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
133137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * Gets a const reference to the underlying generator engine object.
133237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
133337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      const _RandomNumberEngine&
133437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      base() const noexcept
133537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_b; }
133637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
133737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
133837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * Gets the minimum value in the generated random number range.
133937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
134037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type
134137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min()
134237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _RandomNumberEngine::min(); }
134337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
134437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
134537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * Gets the maximum value in the generated random number range.
134637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
134737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static constexpr result_type
134837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max()
134937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _RandomNumberEngine::max(); }
135037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
135137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
135237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * Discard a sequence of random numbers.
135337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
135437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
135537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      discard(unsigned long long __z)
135637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
135737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	for (; __z != 0ULL; --__z)
135837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  (*this)();
135937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
136037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
136137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
136237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * Gets the next value in the generated random number sequence.
136337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
136437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
136537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator()();
136637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
136737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
136837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * Compares two %shuffle_order_engine random number generator objects
136937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * of the same type for equality.
137037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
137137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __lhs A %shuffle_order_engine random number generator object.
137237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __rhs Another %shuffle_order_engine random number generator
137337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *              object.
137437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
137537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns true if the infinite sequences of generated values
137637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *          would be equal, false otherwise.
137737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      */
137837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      friend bool
137937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator==(const shuffle_order_engine& __lhs,
138037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		 const shuffle_order_engine& __rhs)
138137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return (__lhs._M_b == __rhs._M_b
138237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		&& std::equal(__lhs._M_v, __lhs._M_v + __k, __rhs._M_v)
138337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		&& __lhs._M_y == __rhs._M_y); }
138437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
138537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
138637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Inserts the current state of a %shuffle_order_engine random
138737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        number generator engine @p __x into the output stream
138837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	@p __os.
138937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
139037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __os An output stream.
139137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A %shuffle_order_engine random number generator engine.
139237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
139337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
139437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * an error state.
139537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
139637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _RandomNumberEngine1, size_t __k1,
139737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       typename _CharT, typename _Traits>
139837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
139937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
140037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const std::shuffle_order_engine<_RandomNumberEngine1,
140137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   __k1>& __x);
140237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
140337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
140437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Extracts the current state of a % subtract_with_carry_engine
140537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        random number generator engine @p __x from the input stream
140637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        @p __is.
140737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
140837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __is An input stream.
140937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A %shuffle_order_engine random number generator engine.
141037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
141137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The input stream with the state of @p __x extracted or in
141237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * an error state.
141337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
141437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _RandomNumberEngine1, size_t __k1,
141537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       typename _CharT, typename _Traits>
141637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
141737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
141837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   std::shuffle_order_engine<_RandomNumberEngine1, __k1>& __x);
141937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
142037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
142137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void _M_initialize()
142237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
142337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	for (size_t __i = 0; __i < __k; ++__i)
142437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  _M_v[__i] = _M_b();
142537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_y = _M_b();
142637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
142737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
142837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _RandomNumberEngine _M_b;
142937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type _M_v[__k];
143037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type _M_y;
143137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
143237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
143337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
143437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * Compares two %shuffle_order_engine random number generator objects
143537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * of the same type for inequality.
143637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
143737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __lhs A %shuffle_order_engine random number generator object.
143837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __rhs Another %shuffle_order_engine random number generator
143937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *              object.
144037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
144137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns true if the infinite sequences of generated values
144237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *          would be different, false otherwise.
144337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
144437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RandomNumberEngine, size_t __k>
144537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
144637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::shuffle_order_engine<_RandomNumberEngine,
144737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       __k>& __lhs,
144837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::shuffle_order_engine<_RandomNumberEngine,
144937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       __k>& __rhs)
145037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__lhs == __rhs); }
145137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
145237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
145337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
145437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The classic Minimum Standard rand0 of Lewis, Goodman, and Miller.
145537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
145637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  typedef linear_congruential_engine<uint_fast32_t, 16807UL, 0UL, 2147483647UL>
145737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  minstd_rand0;
145837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
145937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
146037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * An alternative LCR (Lehmer Generator function).
146137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
146237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  typedef linear_congruential_engine<uint_fast32_t, 48271UL, 0UL, 2147483647UL>
146337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  minstd_rand;
146437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
146537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
146637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The classic Mersenne Twister.
146737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
146837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * Reference:
146937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * M. Matsumoto and T. Nishimura, Mersenne Twister: A 623-Dimensionally
147037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * Equidistributed Uniform Pseudo-Random Number Generator, ACM Transactions
147137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * on Modeling and Computer Simulation, Vol. 8, No. 1, January 1998, pp 3-30.
147237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
147337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  typedef mersenne_twister_engine<
147437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    uint_fast32_t,
147537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    32, 624, 397, 31,
147637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    0x9908b0dfUL, 11,
147737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    0xffffffffUL, 7,
147837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    0x9d2c5680UL, 15,
147937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    0xefc60000UL, 18, 1812433253UL> mt19937;
148037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
148137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
148237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * An alternative Mersenne Twister.
148337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
148437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  typedef mersenne_twister_engine<
148537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    uint_fast64_t,
148637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    64, 312, 156, 31,
148737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    0xb5026f5aa96619e9ULL, 29,
148837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    0x5555555555555555ULL, 17,
148937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    0x71d67fffeda60000ULL, 37,
149037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    0xfff7eee000000000ULL, 43,
149137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    6364136223846793005ULL> mt19937_64;
149237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
149337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  typedef subtract_with_carry_engine<uint_fast32_t, 24, 10, 24>
149437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    ranlux24_base;
149537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
149637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  typedef subtract_with_carry_engine<uint_fast64_t, 48, 5, 12>
149737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    ranlux48_base;
149837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
149937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24;
150037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
150137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48;
150237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
150337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  typedef shuffle_order_engine<minstd_rand0, 256> knuth_b;
150437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
150537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  typedef minstd_rand0 default_random_engine;
150637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
150737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
150837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * A standard interface to a platform-specific non-deterministic
150937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * random number generator (if any are available).
151037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
151137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  class random_device
151237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  {
151337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  public:
151437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    /** The type of the generated random value. */
151537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    typedef unsigned int result_type;
151637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
151737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    // constructors, destructors and member functions
151837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
151937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifdef _GLIBCXX_USE_RANDOM_TR1
152037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
152137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    explicit
152237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    random_device(const std::string& __token = "/dev/urandom")
152337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
152437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      if ((__token != "/dev/urandom" && __token != "/dev/random")
152537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  || !(_M_file = std::fopen(__token.c_str(), "rb")))
152637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	std::__throw_runtime_error(__N("random_device::"
152737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh				       "random_device(const std::string&)"));
152837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    }
152937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
153037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    ~random_device()
153137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { std::fclose(_M_file); }
153237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
153337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#else
153437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
153537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    explicit
153637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    random_device(const std::string& __token = "mt19937")
153737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    : _M_mt(_M_strtoul(__token)) { }
153837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
153937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  private:
154037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    static unsigned long
154137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    _M_strtoul(const std::string& __str)
154237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
154337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      unsigned long __ret = 5489UL;
154437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      if (__str != "mt19937")
154537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
154637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  const char* __nptr = __str.c_str();
154737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  char* __endptr;
154837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  __ret = std::strtoul(__nptr, &__endptr, 0);
154937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  if (*__nptr == '\0' || *__endptr != '\0')
155037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	    std::__throw_runtime_error(__N("random_device::_M_strtoul"
155137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh					   "(const std::string&)"));
155237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
155337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      return __ret;
155437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    }
155537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
155637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  public:
155737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
155837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif
155937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
156037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    static constexpr result_type
156137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    min()
156237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return std::numeric_limits<result_type>::min(); }
156337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
156437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    static constexpr result_type
156537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    max()
156637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return std::numeric_limits<result_type>::max(); }
156737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
156837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    double
156937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    entropy() const noexcept
157037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return 0.0; }
157137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
157237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    result_type
157337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator()()
157437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
157537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifdef _GLIBCXX_USE_RANDOM_TR1
157637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type __ret;
157737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      std::fread(reinterpret_cast<void*>(&__ret), sizeof(result_type),
157837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		 1, _M_file);
157937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      return __ret;
158037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#else
158137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      return _M_mt();
158237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif
158337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    }
158437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
158537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    // No copy functions.
158637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    random_device(const random_device&) = delete;
158737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    void operator=(const random_device&) = delete;
158837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
158937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  private:
159037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
159137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifdef _GLIBCXX_USE_RANDOM_TR1
159237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    FILE*        _M_file;
159337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#else
159437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    mt19937      _M_mt;
159537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif
159637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  };
159737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
159837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /* @} */ // group random_generators
159937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
160037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
160137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @addtogroup random_distributions Random Number Distributions
160237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @ingroup random
160337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @{
160437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
160537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
160637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
160737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @addtogroup random_distributions_uniform Uniform Distributions
160837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @ingroup random_distributions
160937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @{
161037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
161137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
161237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
161337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Uniform discrete distribution for random numbers.
161437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * A discrete random distribution on the range @f$[min, max]@f$ with equal
161537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * probability throughout the range.
161637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
161737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _IntType = int>
161837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class uniform_int_distribution
161937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
162037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_integral<_IntType>::value,
162137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument not an integral type");
162237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
162337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
162437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the range of the distribution. */
162537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _IntType result_type;
162637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** Parameter type. */
162737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct param_type
162837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
162937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	typedef uniform_int_distribution<_IntType> distribution_type;
163037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
163137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	explicit
163237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type(_IntType __a = 0,
163337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   _IntType __b = std::numeric_limits<_IntType>::max())
163437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_a(__a), _M_b(__b)
163537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
163637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  _GLIBCXX_DEBUG_ASSERT(_M_a <= _M_b);
163737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
163837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
163937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
164037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	a() const
164137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_a; }
164237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
164337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
164437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	b() const
164537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_b; }
164637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
164737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend bool
164837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
164937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
165037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
165137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      private:
165237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_IntType _M_a;
165337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_IntType _M_b;
165437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      };
165537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
165637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
165737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
165837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Constructs a uniform distribution object.
165937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
166037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
166137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      uniform_int_distribution(_IntType __a = 0,
166237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh			   _IntType __b = std::numeric_limits<_IntType>::max())
166337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__a, __b)
166437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
166537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
166637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
166737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      uniform_int_distribution(const param_type& __p)
166837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__p)
166937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
167037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
167137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
167237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Resets the distribution state.
167337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
167437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * Does nothing for the uniform integer distribution.
167537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
167637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
167737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      reset() { }
167837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
167937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
168037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      a() const
168137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.a(); }
168237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
168337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
168437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      b() const
168537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.b(); }
168637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
168737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
168837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the parameter set of the distribution.
168937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
169037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type
169137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param() const
169237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param; }
169337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
169437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
169537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Sets the parameter set of the distribution.
169637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __param The new parameter set of the distribution.
169737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
169837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
169937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param(const param_type& __param)
170037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_param = __param; }
170137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
170237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
170337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the inclusive lower bound of the distribution range.
170437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
170537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
170637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min() const
170737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return this->a(); }
170837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
170937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
171037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the inclusive upper bound of the distribution range.
171137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
171237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
171337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max() const
171437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return this->b(); }
171537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
171637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
171737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Generating functions.
171837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
171937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
172037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
172137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
172237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        { return this->operator()(__urng, this->param()); }
172337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
172437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
172537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
172637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
172737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const param_type& __p);
172837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
172937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type _M_param;
173037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
173137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
173237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
173337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Return true if two uniform integer distributions have
173437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *        the same parameters.
173537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
173637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _IntType>
173737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
173837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator==(const std::uniform_int_distribution<_IntType>& __d1,
173937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::uniform_int_distribution<_IntType>& __d2)
174037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return __d1.param() == __d2.param(); }
174137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
174237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
174337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Return true if two uniform integer distributions have
174437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *        different parameters.
174537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
174637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _IntType>
174737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
174837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::uniform_int_distribution<_IntType>& __d1,
174937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::uniform_int_distribution<_IntType>& __d2)
175037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__d1 == __d2); }
175137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
175237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
175337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Inserts a %uniform_int_distribution random number
175437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *        distribution @p __x into the output stream @p os.
175537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
175637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __os An output stream.
175737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __x  A %uniform_int_distribution random number distribution.
175837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
175937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns The output stream with the state of @p __x inserted or in
176037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * an error state.
176137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
176237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _IntType, typename _CharT, typename _Traits>
176337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    std::basic_ostream<_CharT, _Traits>&
176437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator<<(std::basic_ostream<_CharT, _Traits>&,
176537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::uniform_int_distribution<_IntType>&);
176637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
176737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
176837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Extracts a %uniform_int_distribution random number distribution
176937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @p __x from the input stream @p __is.
177037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
177137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __is An input stream.
177237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __x  A %uniform_int_distribution random number generator engine.
177337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
177437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns The input stream with @p __x extracted or in an error state.
177537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
177637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _IntType, typename _CharT, typename _Traits>
177737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    std::basic_istream<_CharT, _Traits>&
177837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator>>(std::basic_istream<_CharT, _Traits>&,
177937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       std::uniform_int_distribution<_IntType>&);
178037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
178137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
178237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
178337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Uniform continuous distribution for random numbers.
178437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
178537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * A continuous random distribution on the range [min, max) with equal
178637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * probability throughout the range.  The URNG should be real-valued and
178737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * deliver number in the range [0, 1).
178837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
178937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType = double>
179037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class uniform_real_distribution
179137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
179237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
179337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument not a floating point type");
179437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
179537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
179637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the range of the distribution. */
179737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _RealType result_type;
179837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** Parameter type. */
179937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct param_type
180037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
180137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	typedef uniform_real_distribution<_RealType> distribution_type;
180237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
180337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	explicit
180437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type(_RealType __a = _RealType(0),
180537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   _RealType __b = _RealType(1))
180637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_a(__a), _M_b(__b)
180737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
180837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  _GLIBCXX_DEBUG_ASSERT(_M_a <= _M_b);
180937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
181037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
181137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
181237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	a() const
181337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_a; }
181437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
181537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
181637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	b() const
181737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_b; }
181837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
181937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend bool
182037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
182137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
182237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
182337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      private:
182437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType _M_a;
182537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType _M_b;
182637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      };
182737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
182837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
182937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
183037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Constructs a uniform_real_distribution object.
183137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
183237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __a [IN]  The lower bound of the distribution.
183337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __b [IN]  The upper bound of the distribution.
183437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
183537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
183637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      uniform_real_distribution(_RealType __a = _RealType(0),
183737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh				_RealType __b = _RealType(1))
183837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__a, __b)
183937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
184037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
184137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
184237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      uniform_real_distribution(const param_type& __p)
184337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__p)
184437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
184537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
184637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
184737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Resets the distribution state.
184837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
184937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * Does nothing for the uniform real distribution.
185037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
185137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
185237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      reset() { }
185337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
185437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
185537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      a() const
185637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.a(); }
185737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
185837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
185937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      b() const
186037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.b(); }
186137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
186237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
186337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the parameter set of the distribution.
186437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
186537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type
186637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param() const
186737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param; }
186837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
186937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
187037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Sets the parameter set of the distribution.
187137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __param The new parameter set of the distribution.
187237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
187337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
187437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param(const param_type& __param)
187537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_param = __param; }
187637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
187737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
187837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the inclusive lower bound of the distribution range.
187937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
188037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
188137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min() const
188237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return this->a(); }
188337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
188437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
188537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the inclusive upper bound of the distribution range.
188637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
188737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
188837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max() const
188937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return this->b(); }
189037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
189137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
189237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Generating functions.
189337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
189437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
189537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
189637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
189737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        { return this->operator()(__urng, this->param()); }
189837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
189937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
190037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
190137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
190237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const param_type& __p)
190337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
190437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
190537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	    __aurng(__urng);
190637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  return (__aurng() * (__p.b() - __p.a())) + __p.a();
190737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
190837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
190937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
191037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type _M_param;
191137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
191237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
191337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
191437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Return true if two uniform real distributions have
191537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *        the same parameters.
191637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
191737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _IntType>
191837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
191937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator==(const std::uniform_real_distribution<_IntType>& __d1,
192037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::uniform_real_distribution<_IntType>& __d2)
192137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return __d1.param() == __d2.param(); }
192237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
192337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
192437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Return true if two uniform real distributions have
192537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *        different parameters.
192637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
192737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _IntType>
192837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
192937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::uniform_real_distribution<_IntType>& __d1,
193037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::uniform_real_distribution<_IntType>& __d2)
193137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__d1 == __d2); }
193237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
193337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
193437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Inserts a %uniform_real_distribution random number
193537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *        distribution @p __x into the output stream @p __os.
193637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
193737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __os An output stream.
193837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __x  A %uniform_real_distribution random number distribution.
193937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
194037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns The output stream with the state of @p __x inserted or in
194137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *          an error state.
194237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
194337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType, typename _CharT, typename _Traits>
194437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    std::basic_ostream<_CharT, _Traits>&
194537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator<<(std::basic_ostream<_CharT, _Traits>&,
194637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::uniform_real_distribution<_RealType>&);
194737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
194837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
194937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Extracts a %uniform_real_distribution random number distribution
195037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @p __x from the input stream @p __is.
195137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
195237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __is An input stream.
195337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __x  A %uniform_real_distribution random number generator engine.
195437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
195537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns The input stream with @p __x extracted or in an error state.
195637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
195737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType, typename _CharT, typename _Traits>
195837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    std::basic_istream<_CharT, _Traits>&
195937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator>>(std::basic_istream<_CharT, _Traits>&,
196037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       std::uniform_real_distribution<_RealType>&);
196137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
196237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /* @} */ // group random_distributions_uniform
196337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
196437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
196537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @addtogroup random_distributions_normal Normal Distributions
196637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @ingroup random_distributions
196737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @{
196837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
196937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
197037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
197137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief A normal continuous distribution for random numbers.
197237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
197337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The formula for the normal probability density function is
197437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f[
197537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *     p(x|\mu,\sigma) = \frac{1}{\sigma \sqrt{2 \pi}}
197637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *            e^{- \frac{{x - \mu}^ {2}}{2 \sigma ^ {2}} }
197737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f]
197837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
197937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType = double>
198037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class normal_distribution
198137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
198237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
198337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument not a floating point type");
198437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
198537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
198637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the range of the distribution. */
198737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _RealType result_type;
198837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** Parameter type. */
198937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct param_type
199037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
199137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	typedef normal_distribution<_RealType> distribution_type;
199237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
199337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	explicit
199437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type(_RealType __mean = _RealType(0),
199537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   _RealType __stddev = _RealType(1))
199637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_mean(__mean), _M_stddev(__stddev)
199737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
199837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  _GLIBCXX_DEBUG_ASSERT(_M_stddev > _RealType(0));
199937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
200037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
200137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType
200237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	mean() const
200337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_mean; }
200437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
200537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType
200637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	stddev() const
200737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_stddev; }
200837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
200937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend bool
201037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
201137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return (__p1._M_mean == __p2._M_mean
201237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		  && __p1._M_stddev == __p2._M_stddev); }
201337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
201437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      private:
201537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType _M_mean;
201637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType _M_stddev;
201737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      };
201837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
201937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
202037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
202137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * Constructs a normal distribution with parameters @f$mean@f$ and
202237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * standard deviation.
202337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
202437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
202537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      normal_distribution(result_type __mean = result_type(0),
202637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh			  result_type __stddev = result_type(1))
202737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__mean, __stddev), _M_saved_available(false)
202837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
202937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
203037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
203137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      normal_distribution(const param_type& __p)
203237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__p), _M_saved_available(false)
203337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
203437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
203537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
203637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Resets the distribution state.
203737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
203837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
203937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      reset()
204037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_saved_available = false; }
204137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
204237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
204337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the mean of the distribution.
204437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
204537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _RealType
204637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      mean() const
204737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.mean(); }
204837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
204937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
205037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the standard deviation of the distribution.
205137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
205237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _RealType
205337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      stddev() const
205437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.stddev(); }
205537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
205637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
205737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the parameter set of the distribution.
205837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
205937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type
206037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param() const
206137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param; }
206237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
206337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
206437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Sets the parameter set of the distribution.
206537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __param The new parameter set of the distribution.
206637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
206737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
206837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param(const param_type& __param)
206937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_param = __param; }
207037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
207137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
207237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
207337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
207437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
207537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min() const
207637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return std::numeric_limits<result_type>::min(); }
207737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
207837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
207937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the least upper bound value of the distribution.
208037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
208137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
208237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max() const
208337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return std::numeric_limits<result_type>::max(); }
208437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
208537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
208637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Generating functions.
208737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
208837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
208937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
209037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
209137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return this->operator()(__urng, this->param()); }
209237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
209337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
209437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
209537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
209637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const param_type& __p);
209737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
209837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
209937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Return true if two normal distributions have
210037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        the same parameters and the sequences that would
210137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        be generated are equal.
210237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
210337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _RealType1>
210437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend bool
210537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        operator==(const std::normal_distribution<_RealType1>& __d1,
210637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const std::normal_distribution<_RealType1>& __d2);
210737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
210837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
210937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Inserts a %normal_distribution random number distribution
211037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @p __x into the output stream @p __os.
211137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
211237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __os An output stream.
211337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A %normal_distribution random number distribution.
211437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
211537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
211637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * an error state.
211737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
211837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
211937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
212037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
212137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const std::normal_distribution<_RealType1>& __x);
212237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
212337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
212437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Extracts a %normal_distribution random number distribution
212537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @p __x from the input stream @p __is.
212637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
212737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __is An input stream.
212837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A %normal_distribution random number generator engine.
212937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
213037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The input stream with @p __x extracted or in an error
213137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *          state.
213237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
213337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
213437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
213537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
213637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   std::normal_distribution<_RealType1>& __x);
213737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
213837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
213937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type  _M_param;
214037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type _M_saved;
214137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      bool        _M_saved_available;
214237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
214337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
214437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
214537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Return true if two normal distributions are different.
214637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
214737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType>
214837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
214937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::normal_distribution<_RealType>& __d1,
215037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::normal_distribution<_RealType>& __d2)
215137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__d1 == __d2); }
215237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
215337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
215437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
215537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief A lognormal_distribution random number distribution.
215637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
215737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The formula for the normal probability mass function is
215837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f[
215937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *     p(x|m,s) = \frac{1}{sx\sqrt{2\pi}}
216037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *                \exp{-\frac{(\ln{x} - m)^2}{2s^2}}
216137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f]
216237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
216337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType = double>
216437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class lognormal_distribution
216537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
216637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
216737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument not a floating point type");
216837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
216937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
217037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the range of the distribution. */
217137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _RealType result_type;
217237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** Parameter type. */
217337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct param_type
217437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
217537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	typedef lognormal_distribution<_RealType> distribution_type;
217637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
217737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	explicit
217837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type(_RealType __m = _RealType(0),
217937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   _RealType __s = _RealType(1))
218037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_m(__m), _M_s(__s)
218137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ }
218237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
218337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType
218437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	m() const
218537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_m; }
218637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
218737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType
218837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	s() const
218937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_s; }
219037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
219137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend bool
219237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
219337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return __p1._M_m == __p2._M_m && __p1._M_s == __p2._M_s; }
219437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
219537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      private:
219637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType _M_m;
219737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType _M_s;
219837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      };
219937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
220037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
220137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      lognormal_distribution(_RealType __m = _RealType(0),
220237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh			     _RealType __s = _RealType(1))
220337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__m, __s), _M_nd()
220437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
220537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
220637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
220737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      lognormal_distribution(const param_type& __p)
220837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__p), _M_nd()
220937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
221037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
221137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
221237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * Resets the distribution state.
221337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
221437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
221537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      reset()
221637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_nd.reset(); }
221737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
221837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
221937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
222037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
222137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _RealType
222237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      m() const
222337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.m(); }
222437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
222537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _RealType
222637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      s() const
222737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.s(); }
222837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
222937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
223037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the parameter set of the distribution.
223137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
223237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type
223337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param() const
223437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param; }
223537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
223637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
223737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Sets the parameter set of the distribution.
223837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __param The new parameter set of the distribution.
223937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
224037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
224137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param(const param_type& __param)
224237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_param = __param; }
224337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
224437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
224537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
224637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
224737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
224837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min() const
224937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return result_type(0); }
225037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
225137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
225237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the least upper bound value of the distribution.
225337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
225437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
225537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max() const
225637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return std::numeric_limits<result_type>::max(); }
225737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
225837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
225937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Generating functions.
226037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
226137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
226237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
226337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
226437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return this->operator()(__urng, this->param()); }
226537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
226637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
226737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
226837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
226937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const param_type& __p)
227037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        { return std::exp(__p.s() * _M_nd(__urng) + __p.m()); }
227137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
227237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
227337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Return true if two lognormal distributions have
227437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        the same parameters and the sequences that would
227537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        be generated are equal.
227637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
227737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      friend bool
227837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator==(const lognormal_distribution& __d1,
227937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		 const lognormal_distribution& __d2)
228037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return (__d1.param() == __d2.param()
228137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		&& __d1._M_nd == __d2._M_nd); }
228237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
228337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
228437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Inserts a %lognormal_distribution random number distribution
228537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @p __x into the output stream @p __os.
228637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
228737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __os An output stream.
228837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A %lognormal_distribution random number distribution.
228937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
229037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
229137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * an error state.
229237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
229337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
229437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
229537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
229637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const std::lognormal_distribution<_RealType1>& __x);
229737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
229837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
229937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Extracts a %lognormal_distribution random number distribution
230037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @p __x from the input stream @p __is.
230137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
230237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __is An input stream.
230337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x A %lognormal_distribution random number
230437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *            generator engine.
230537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
230637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The input stream with @p __x extracted or in an error state.
230737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
230837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
230937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
231037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
231137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   std::lognormal_distribution<_RealType1>& __x);
231237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
231337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
231437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type _M_param;
231537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
231637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      std::normal_distribution<result_type> _M_nd;
231737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
231837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
231937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
232037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Return true if two lognormal distributions are different.
232137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
232237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType>
232337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
232437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::lognormal_distribution<_RealType>& __d1,
232537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::lognormal_distribution<_RealType>& __d2)
232637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__d1 == __d2); }
232737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
232837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
232937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
233037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief A gamma continuous distribution for random numbers.
233137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
233237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The formula for the gamma probability density function is:
233337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f[
233437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *     p(x|\alpha,\beta) = \frac{1}{\beta\Gamma(\alpha)}
233537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *                         (x/\beta)^{\alpha - 1} e^{-x/\beta}
233637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f]
233737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
233837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType = double>
233937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class gamma_distribution
234037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
234137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
234237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument not a floating point type");
234337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
234437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
234537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the range of the distribution. */
234637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _RealType result_type;
234737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** Parameter type. */
234837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct param_type
234937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
235037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	typedef gamma_distribution<_RealType> distribution_type;
235137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend class gamma_distribution<_RealType>;
235237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
235337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	explicit
235437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type(_RealType __alpha_val = _RealType(1),
235537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   _RealType __beta_val = _RealType(1))
235637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_alpha(__alpha_val), _M_beta(__beta_val)
235737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
235837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  _GLIBCXX_DEBUG_ASSERT(_M_alpha > _RealType(0));
235937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  _M_initialize();
236037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
236137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
236237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType
236337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	alpha() const
236437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_alpha; }
236537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
236637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType
236737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	beta() const
236837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_beta; }
236937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
237037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend bool
237137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
237237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return (__p1._M_alpha == __p2._M_alpha
237337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		  && __p1._M_beta == __p2._M_beta); }
237437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
237537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      private:
237637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	void
237737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_initialize();
237837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
237937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType _M_alpha;
238037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType _M_beta;
238137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
238237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType _M_malpha, _M_a2;
238337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      };
238437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
238537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
238637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
238737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Constructs a gamma distribution with parameters
238837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @f$\alpha@f$ and @f$\beta@f$.
238937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
239037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
239137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      gamma_distribution(_RealType __alpha_val = _RealType(1),
239237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh			 _RealType __beta_val = _RealType(1))
239337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__alpha_val, __beta_val), _M_nd()
239437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
239537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
239637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
239737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      gamma_distribution(const param_type& __p)
239837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__p), _M_nd()
239937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
240037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
240137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
240237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Resets the distribution state.
240337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
240437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
240537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      reset()
240637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_nd.reset(); }
240737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
240837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
240937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the @f$\alpha@f$ of the distribution.
241037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
241137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _RealType
241237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      alpha() const
241337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.alpha(); }
241437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
241537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
241637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the @f$\beta@f$ of the distribution.
241737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
241837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _RealType
241937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      beta() const
242037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.beta(); }
242137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
242237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
242337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the parameter set of the distribution.
242437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
242537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type
242637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param() const
242737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param; }
242837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
242937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
243037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Sets the parameter set of the distribution.
243137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __param The new parameter set of the distribution.
243237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
243337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
243437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param(const param_type& __param)
243537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_param = __param; }
243637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
243737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
243837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
243937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
244037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
244137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min() const
244237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return result_type(0); }
244337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
244437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
244537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the least upper bound value of the distribution.
244637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
244737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
244837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max() const
244937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return std::numeric_limits<result_type>::max(); }
245037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
245137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
245237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Generating functions.
245337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
245437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
245537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
245637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
245737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return this->operator()(__urng, this->param()); }
245837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
245937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
246037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
246137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
246237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const param_type& __p);
246337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
246437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
246537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Return true if two gamma distributions have the same
246637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        parameters and the sequences that would be generated
246737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        are equal.
246837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
246937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      friend bool
247037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator==(const gamma_distribution& __d1,
247137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		 const gamma_distribution& __d2)
247237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return (__d1.param() == __d2.param()
247337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		&& __d1._M_nd == __d2._M_nd); }
247437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
247537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
247637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Inserts a %gamma_distribution random number distribution
247737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @p __x into the output stream @p __os.
247837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
247937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __os An output stream.
248037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A %gamma_distribution random number distribution.
248137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
248237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
248337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * an error state.
248437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
248537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
248637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
248737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
248837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const std::gamma_distribution<_RealType1>& __x);
248937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
249037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
249137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Extracts a %gamma_distribution random number distribution
249237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @p __x from the input stream @p __is.
249337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
249437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __is An input stream.
249537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A %gamma_distribution random number generator engine.
249637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
249737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The input stream with @p __x extracted or in an error state.
249837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
249937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
250037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
250137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
250237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   std::gamma_distribution<_RealType1>& __x);
250337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
250437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
250537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type _M_param;
250637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
250737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      std::normal_distribution<result_type> _M_nd;
250837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
250937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
251037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
251137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Return true if two gamma distributions are different.
251237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
251337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   template<typename _RealType>
251437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
251537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     operator!=(const std::gamma_distribution<_RealType>& __d1,
251637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		const std::gamma_distribution<_RealType>& __d2)
251737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__d1 == __d2); }
251837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
251937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
252037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
252137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief A chi_squared_distribution random number distribution.
252237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
252337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The formula for the normal probability mass function is
252437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f$p(x|n) = \frac{x^{(n/2) - 1}e^{-x/2}}{\Gamma(n/2) 2^{n/2}}@f$
252537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
252637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType = double>
252737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class chi_squared_distribution
252837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
252937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
253037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument not a floating point type");
253137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
253237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
253337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the range of the distribution. */
253437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _RealType result_type;
253537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** Parameter type. */
253637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct param_type
253737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
253837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	typedef chi_squared_distribution<_RealType> distribution_type;
253937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
254037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	explicit
254137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type(_RealType __n = _RealType(1))
254237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_n(__n)
254337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ }
254437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
254537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType
254637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	n() const
254737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_n; }
254837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
254937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend bool
255037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
255137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return __p1._M_n == __p2._M_n; }
255237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
255337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      private:
255437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType _M_n;
255537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      };
255637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
255737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
255837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      chi_squared_distribution(_RealType __n = _RealType(1))
255937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__n), _M_gd(__n / 2)
256037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
256137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
256237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
256337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      chi_squared_distribution(const param_type& __p)
256437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__p), _M_gd(__p.n() / 2)
256537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
256637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
256737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
256837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Resets the distribution state.
256937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
257037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
257137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      reset()
257237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_gd.reset(); }
257337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
257437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
257537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
257637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
257737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _RealType
257837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      n() const
257937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.n(); }
258037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
258137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
258237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the parameter set of the distribution.
258337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
258437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type
258537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param() const
258637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param; }
258737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
258837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
258937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Sets the parameter set of the distribution.
259037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __param The new parameter set of the distribution.
259137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
259237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
259337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param(const param_type& __param)
259437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_param = __param; }
259537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
259637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
259737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
259837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
259937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
260037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min() const
260137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return result_type(0); }
260237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
260337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
260437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the least upper bound value of the distribution.
260537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
260637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
260737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max() const
260837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return std::numeric_limits<result_type>::max(); }
260937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
261037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
261137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Generating functions.
261237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
261337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
261437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
261537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
261637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return 2 * _M_gd(__urng); }
261737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
261837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
261937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
262037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
262137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const param_type& __p)
262237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        {
262337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  typedef typename std::gamma_distribution<result_type>::param_type
262437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	    param_type;
262537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  return 2 * _M_gd(__urng, param_type(__p.n() / 2));
262637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
262737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
262837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
262937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Return true if two Chi-squared distributions have
263037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        the same parameters and the sequences that would be
263137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        generated are equal.
263237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
263337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      friend bool
263437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator==(const chi_squared_distribution& __d1,
263537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		 const chi_squared_distribution& __d2)
263637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return __d1.param() == __d2.param() && __d1._M_gd == __d2._M_gd; }
263737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
263837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
263937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Inserts a %chi_squared_distribution random number distribution
264037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @p __x into the output stream @p __os.
264137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
264237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __os An output stream.
264337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A %chi_squared_distribution random number distribution.
264437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
264537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
264637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * an error state.
264737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
264837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
264937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
265037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
265137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const std::chi_squared_distribution<_RealType1>& __x);
265237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
265337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
265437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Extracts a %chi_squared_distribution random number distribution
265537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @p __x from the input stream @p __is.
265637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
265737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __is An input stream.
265837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x A %chi_squared_distribution random number
265937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *            generator engine.
266037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
266137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The input stream with @p __x extracted or in an error state.
266237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
266337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
266437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
266537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
266637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   std::chi_squared_distribution<_RealType1>& __x);
266737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
266837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
266937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type _M_param;
267037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
267137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      std::gamma_distribution<result_type> _M_gd;
267237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
267337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
267437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
267537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Return true if two Chi-squared distributions are different.
267637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
267737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType>
267837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
267937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::chi_squared_distribution<_RealType>& __d1,
268037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::chi_squared_distribution<_RealType>& __d2)
268137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__d1 == __d2); }
268237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
268337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
268437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
268537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief A cauchy_distribution random number distribution.
268637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
268737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The formula for the normal probability mass function is
268837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f$p(x|a,b) = (\pi b (1 + (\frac{x-a}{b})^2))^{-1}@f$
268937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
269037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType = double>
269137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class cauchy_distribution
269237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
269337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
269437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument not a floating point type");
269537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
269637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
269737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the range of the distribution. */
269837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _RealType result_type;
269937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** Parameter type. */
270037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct param_type
270137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
270237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	typedef cauchy_distribution<_RealType> distribution_type;
270337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
270437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	explicit
270537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type(_RealType __a = _RealType(0),
270637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   _RealType __b = _RealType(1))
270737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_a(__a), _M_b(__b)
270837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ }
270937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
271037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType
271137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	a() const
271237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_a; }
271337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
271437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType
271537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	b() const
271637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_b; }
271737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
271837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend bool
271937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
272037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
272137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
272237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      private:
272337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType _M_a;
272437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType _M_b;
272537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      };
272637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
272737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
272837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      cauchy_distribution(_RealType __a = _RealType(0),
272937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh			  _RealType __b = _RealType(1))
273037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__a, __b)
273137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
273237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
273337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
273437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      cauchy_distribution(const param_type& __p)
273537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__p)
273637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
273737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
273837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
273937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Resets the distribution state.
274037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
274137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
274237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      reset()
274337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
274437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
274537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
274637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
274737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
274837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _RealType
274937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      a() const
275037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.a(); }
275137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
275237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _RealType
275337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      b() const
275437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.b(); }
275537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
275637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
275737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the parameter set of the distribution.
275837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
275937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type
276037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param() const
276137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param; }
276237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
276337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
276437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Sets the parameter set of the distribution.
276537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __param The new parameter set of the distribution.
276637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
276737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
276837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param(const param_type& __param)
276937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_param = __param; }
277037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
277137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
277237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
277337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
277437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
277537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min() const
277637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return std::numeric_limits<result_type>::min(); }
277737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
277837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
277937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the least upper bound value of the distribution.
278037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
278137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
278237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max() const
278337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return std::numeric_limits<result_type>::max(); }
278437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
278537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
278637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Generating functions.
278737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
278837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
278937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
279037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
279137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return this->operator()(__urng, this->param()); }
279237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
279337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
279437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
279537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
279637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const param_type& __p);
279737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
279837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
279937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type _M_param;
280037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
280137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
280237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
280337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Return true if two Cauchy distributions have
280437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *        the same parameters.
280537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
280637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType>
280737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
280837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator==(const std::cauchy_distribution<_RealType>& __d1,
280937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::cauchy_distribution<_RealType>& __d2)
281037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return __d1.param() == __d2.param(); }
281137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
281237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
281337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Return true if two Cauchy distributions have
281437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *        different parameters.
281537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
281637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType>
281737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
281837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::cauchy_distribution<_RealType>& __d1,
281937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::cauchy_distribution<_RealType>& __d2)
282037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__d1 == __d2); }
282137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
282237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
282337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Inserts a %cauchy_distribution random number distribution
282437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @p __x into the output stream @p __os.
282537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
282637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __os An output stream.
282737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __x  A %cauchy_distribution random number distribution.
282837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
282937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns The output stream with the state of @p __x inserted or in
283037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * an error state.
283137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
283237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType, typename _CharT, typename _Traits>
283337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    std::basic_ostream<_CharT, _Traits>&
283437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
283537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::cauchy_distribution<_RealType>& __x);
283637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
283737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
283837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Extracts a %cauchy_distribution random number distribution
283937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @p __x from the input stream @p __is.
284037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
284137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __is An input stream.
284237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __x A %cauchy_distribution random number
284337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *            generator engine.
284437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
284537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns The input stream with @p __x extracted or in an error state.
284637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
284737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType, typename _CharT, typename _Traits>
284837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    std::basic_istream<_CharT, _Traits>&
284937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator>>(std::basic_istream<_CharT, _Traits>& __is,
285037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       std::cauchy_distribution<_RealType>& __x);
285137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
285237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
285337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
285437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief A fisher_f_distribution random number distribution.
285537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
285637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The formula for the normal probability mass function is
285737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f[
285837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *     p(x|m,n) = \frac{\Gamma((m+n)/2)}{\Gamma(m/2)\Gamma(n/2)}
285937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *                (\frac{m}{n})^{m/2} x^{(m/2)-1}
286037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *                (1 + \frac{mx}{n})^{-(m+n)/2}
286137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f]
286237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
286337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType = double>
286437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class fisher_f_distribution
286537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
286637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
286737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument not a floating point type");
286837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
286937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
287037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the range of the distribution. */
287137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _RealType result_type;
287237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** Parameter type. */
287337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct param_type
287437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
287537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	typedef fisher_f_distribution<_RealType> distribution_type;
287637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
287737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	explicit
287837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type(_RealType __m = _RealType(1),
287937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   _RealType __n = _RealType(1))
288037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_m(__m), _M_n(__n)
288137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ }
288237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
288337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType
288437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	m() const
288537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_m; }
288637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
288737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType
288837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	n() const
288937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_n; }
289037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
289137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend bool
289237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
289337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return __p1._M_m == __p2._M_m && __p1._M_n == __p2._M_n; }
289437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
289537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      private:
289637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType _M_m;
289737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType _M_n;
289837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      };
289937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
290037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
290137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      fisher_f_distribution(_RealType __m = _RealType(1),
290237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh			    _RealType __n = _RealType(1))
290337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__m, __n), _M_gd_x(__m / 2), _M_gd_y(__n / 2)
290437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
290537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
290637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
290737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      fisher_f_distribution(const param_type& __p)
290837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__p), _M_gd_x(__p.m() / 2), _M_gd_y(__p.n() / 2)
290937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
291037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
291137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
291237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Resets the distribution state.
291337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
291437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
291537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      reset()
291637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
291737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_gd_x.reset();
291837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_gd_y.reset();
291937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
292037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
292137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
292237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
292337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
292437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _RealType
292537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      m() const
292637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.m(); }
292737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
292837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _RealType
292937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      n() const
293037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.n(); }
293137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
293237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
293337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the parameter set of the distribution.
293437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
293537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type
293637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param() const
293737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param; }
293837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
293937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
294037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Sets the parameter set of the distribution.
294137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __param The new parameter set of the distribution.
294237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
294337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
294437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param(const param_type& __param)
294537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_param = __param; }
294637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
294737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
294837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
294937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
295037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
295137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min() const
295237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return result_type(0); }
295337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
295437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
295537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the least upper bound value of the distribution.
295637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
295737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
295837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max() const
295937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return std::numeric_limits<result_type>::max(); }
296037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
296137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
296237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Generating functions.
296337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
296437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
296537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
296637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
296737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return (_M_gd_x(__urng) * n()) / (_M_gd_y(__urng) * m()); }
296837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
296937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
297037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
297137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
297237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const param_type& __p)
297337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        {
297437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  typedef typename std::gamma_distribution<result_type>::param_type
297537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	    param_type;
297637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  return ((_M_gd_x(__urng, param_type(__p.m() / 2)) * n())
297737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		  / (_M_gd_y(__urng, param_type(__p.n() / 2)) * m()));
297837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
297937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
298037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
298137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Return true if two Fisher f distributions have
298237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        the same parameters and the sequences that would
298337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        be generated are equal.
298437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
298537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      friend bool
298637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator==(const fisher_f_distribution& __d1,
298737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		 const fisher_f_distribution& __d2)
298837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return (__d1.param() == __d2.param()
298937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		&& __d1._M_gd_x == __d2._M_gd_x
299037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		&& __d1._M_gd_y == __d2._M_gd_y); }
299137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
299237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
299337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Inserts a %fisher_f_distribution random number distribution
299437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @p __x into the output stream @p __os.
299537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
299637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __os An output stream.
299737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A %fisher_f_distribution random number distribution.
299837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
299937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
300037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * an error state.
300137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
300237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
300337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
300437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
300537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const std::fisher_f_distribution<_RealType1>& __x);
300637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
300737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
300837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Extracts a %fisher_f_distribution random number distribution
300937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @p __x from the input stream @p __is.
301037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
301137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __is An input stream.
301237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x A %fisher_f_distribution random number
301337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *            generator engine.
301437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
301537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The input stream with @p __x extracted or in an error state.
301637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
301737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
301837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
301937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
302037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   std::fisher_f_distribution<_RealType1>& __x);
302137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
302237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
302337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type _M_param;
302437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
302537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      std::gamma_distribution<result_type> _M_gd_x, _M_gd_y;
302637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
302737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
302837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
302937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Return true if two Fisher f distributions are diferent.
303037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
303137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType>
303237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
303337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::fisher_f_distribution<_RealType>& __d1,
303437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::fisher_f_distribution<_RealType>& __d2)
303537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__d1 == __d2); }
303637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
303737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
303837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief A student_t_distribution random number distribution.
303937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
304037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The formula for the normal probability mass function is:
304137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f[
304237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *     p(x|n) = \frac{1}{\sqrt(n\pi)} \frac{\Gamma((n+1)/2)}{\Gamma(n/2)}
304337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *              (1 + \frac{x^2}{n}) ^{-(n+1)/2}
304437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f]
304537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
304637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType = double>
304737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class student_t_distribution
304837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
304937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
305037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument not a floating point type");
305137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
305237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
305337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the range of the distribution. */
305437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _RealType result_type;
305537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** Parameter type. */
305637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct param_type
305737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
305837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	typedef student_t_distribution<_RealType> distribution_type;
305937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
306037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	explicit
306137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type(_RealType __n = _RealType(1))
306237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_n(__n)
306337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ }
306437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
306537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType
306637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	n() const
306737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_n; }
306837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
306937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend bool
307037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
307137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return __p1._M_n == __p2._M_n; }
307237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
307337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      private:
307437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType _M_n;
307537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      };
307637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
307737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
307837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      student_t_distribution(_RealType __n = _RealType(1))
307937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__n), _M_nd(), _M_gd(__n / 2, 2)
308037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
308137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
308237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
308337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      student_t_distribution(const param_type& __p)
308437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__p), _M_nd(), _M_gd(__p.n() / 2, 2)
308537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
308637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
308737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
308837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Resets the distribution state.
308937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
309037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
309137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      reset()
309237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
309337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_nd.reset();
309437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_gd.reset();
309537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
309637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
309737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
309837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
309937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
310037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _RealType
310137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      n() const
310237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.n(); }
310337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
310437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
310537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the parameter set of the distribution.
310637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
310737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type
310837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param() const
310937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param; }
311037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
311137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
311237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Sets the parameter set of the distribution.
311337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __param The new parameter set of the distribution.
311437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
311537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
311637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param(const param_type& __param)
311737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_param = __param; }
311837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
311937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
312037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
312137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
312237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
312337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min() const
312437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return std::numeric_limits<result_type>::min(); }
312537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
312637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
312737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the least upper bound value of the distribution.
312837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
312937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
313037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max() const
313137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return std::numeric_limits<result_type>::max(); }
313237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
313337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
313437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Generating functions.
313537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
313637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
313737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
313837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        operator()(_UniformRandomNumberGenerator& __urng)
313937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        { return _M_nd(__urng) * std::sqrt(n() / _M_gd(__urng)); }
314037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
314137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
314237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
314337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
314437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const param_type& __p)
314537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        {
314637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  typedef typename std::gamma_distribution<result_type>::param_type
314737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	    param_type;
314837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
314937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  const result_type __g = _M_gd(__urng, param_type(__p.n() / 2, 2));
315037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  return _M_nd(__urng) * std::sqrt(__p.n() / __g);
315137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        }
315237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
315337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
315437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Return true if two Student t distributions have
315537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        the same parameters and the sequences that would
315637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        be generated are equal.
315737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
315837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      friend bool
315937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator==(const student_t_distribution& __d1,
316037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		 const student_t_distribution& __d2)
316137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return (__d1.param() == __d2.param()
316237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		&& __d1._M_nd == __d2._M_nd && __d1._M_gd == __d2._M_gd); }
316337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
316437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
316537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Inserts a %student_t_distribution random number distribution
316637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @p __x into the output stream @p __os.
316737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
316837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __os An output stream.
316937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A %student_t_distribution random number distribution.
317037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
317137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
317237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * an error state.
317337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
317437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
317537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
317637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
317737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const std::student_t_distribution<_RealType1>& __x);
317837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
317937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
318037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Extracts a %student_t_distribution random number distribution
318137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @p __x from the input stream @p __is.
318237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
318337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __is An input stream.
318437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x A %student_t_distribution random number
318537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *            generator engine.
318637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
318737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The input stream with @p __x extracted or in an error state.
318837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
318937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
319037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
319137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
319237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   std::student_t_distribution<_RealType1>& __x);
319337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
319437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
319537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type _M_param;
319637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
319737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      std::normal_distribution<result_type> _M_nd;
319837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      std::gamma_distribution<result_type> _M_gd;
319937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
320037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
320137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
320237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Return true if two Student t distributions are different.
320337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
320437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType>
320537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
320637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::student_t_distribution<_RealType>& __d1,
320737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::student_t_distribution<_RealType>& __d2)
320837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__d1 == __d2); }
320937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
321037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
321137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /* @} */ // group random_distributions_normal
321237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
321337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
321437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @addtogroup random_distributions_bernoulli Bernoulli Distributions
321537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @ingroup random_distributions
321637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @{
321737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
321837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
321937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
322037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief A Bernoulli random number distribution.
322137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
322237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * Generates a sequence of true and false values with likelihood @f$p@f$
322337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * that true will come up and @f$(1 - p)@f$ that false will appear.
322437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
322537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  class bernoulli_distribution
322637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  {
322737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  public:
322837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    /** The type of the range of the distribution. */
322937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    typedef bool result_type;
323037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    /** Parameter type. */
323137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    struct param_type
323237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
323337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef bernoulli_distribution distribution_type;
323437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
323537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
323637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type(double __p = 0.5)
323737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_p(__p)
323837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
323937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_GLIBCXX_DEBUG_ASSERT((_M_p >= 0.0) && (_M_p <= 1.0));
324037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
324137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
324237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      double
324337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      p() const
324437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_p; }
324537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
324637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      friend bool
324737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator==(const param_type& __p1, const param_type& __p2)
324837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return __p1._M_p == __p2._M_p; }
324937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
325037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
325137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      double _M_p;
325237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
325337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
325437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  public:
325537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    /**
325637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     * @brief Constructs a Bernoulli distribution with likelihood @p p.
325737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     *
325837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     * @param __p  [IN]  The likelihood of a true result being returned.
325937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     *                   Must be in the interval @f$[0, 1]@f$.
326037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     */
326137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    explicit
326237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    bernoulli_distribution(double __p = 0.5)
326337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    : _M_param(__p)
326437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { }
326537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
326637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    explicit
326737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    bernoulli_distribution(const param_type& __p)
326837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    : _M_param(__p)
326937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { }
327037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
327137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    /**
327237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     * @brief Resets the distribution state.
327337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     *
327437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     * Does nothing for a Bernoulli distribution.
327537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     */
327637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    void
327737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    reset() { }
327837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
327937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    /**
328037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     * @brief Returns the @p p parameter of the distribution.
328137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     */
328237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    double
328337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    p() const
328437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return _M_param.p(); }
328537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
328637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    /**
328737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     * @brief Returns the parameter set of the distribution.
328837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     */
328937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    param_type
329037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    param() const
329137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return _M_param; }
329237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
329337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    /**
329437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     * @brief Sets the parameter set of the distribution.
329537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     * @param __param The new parameter set of the distribution.
329637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     */
329737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    void
329837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    param(const param_type& __param)
329937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { _M_param = __param; }
330037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
330137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    /**
330237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     * @brief Returns the greatest lower bound value of the distribution.
330337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     */
330437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    result_type
330537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    min() const
330637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return std::numeric_limits<result_type>::min(); }
330737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
330837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    /**
330937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     * @brief Returns the least upper bound value of the distribution.
331037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     */
331137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    result_type
331237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    max() const
331337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return std::numeric_limits<result_type>::max(); }
331437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
331537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    /**
331637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     * @brief Generating functions.
331737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh     */
331837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    template<typename _UniformRandomNumberGenerator>
331937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
332037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator()(_UniformRandomNumberGenerator& __urng)
332137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return this->operator()(__urng, this->param()); }
332237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
332337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    template<typename _UniformRandomNumberGenerator>
332437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
332537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator()(_UniformRandomNumberGenerator& __urng,
332637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		 const param_type& __p)
332737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
332837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	__detail::_Adaptor<_UniformRandomNumberGenerator, double>
332937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  __aurng(__urng);
333037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	if ((__aurng() - __aurng.min())
333137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	     < __p.p() * (__aurng.max() - __aurng.min()))
333237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  return true;
333337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return false;
333437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
333537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
333637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  private:
333737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    param_type _M_param;
333837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  };
333937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
334037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
334137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Return true if two Bernoulli distributions have
334237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *        the same parameters.
334337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
334437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  inline bool
334537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  operator==(const std::bernoulli_distribution& __d1,
334637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	     const std::bernoulli_distribution& __d2)
334737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  { return __d1.param() == __d2.param(); }
334837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
334937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
335037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Return true if two Bernoulli distributions have
335137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *        different parameters.
335237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
335337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  inline bool
335437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  operator!=(const std::bernoulli_distribution& __d1,
335537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	     const std::bernoulli_distribution& __d2)
335637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  { return !(__d1 == __d2); }
335737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
335837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
335937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Inserts a %bernoulli_distribution random number distribution
336037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @p __x into the output stream @p __os.
336137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
336237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __os An output stream.
336337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __x  A %bernoulli_distribution random number distribution.
336437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
336537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns The output stream with the state of @p __x inserted or in
336637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * an error state.
336737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
336837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _CharT, typename _Traits>
336937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    std::basic_ostream<_CharT, _Traits>&
337037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
337137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::bernoulli_distribution& __x);
337237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
337337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
337437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Extracts a %bernoulli_distribution random number distribution
337537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @p __x from the input stream @p __is.
337637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
337737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __is An input stream.
337837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __x  A %bernoulli_distribution random number generator engine.
337937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
338037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns The input stream with @p __x extracted or in an error state.
338137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
338237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _CharT, typename _Traits>
338337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    std::basic_istream<_CharT, _Traits>&
338437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator>>(std::basic_istream<_CharT, _Traits>& __is,
338537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       std::bernoulli_distribution& __x)
338637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
338737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      double __p;
338837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      __is >> __p;
338937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      __x.param(bernoulli_distribution::param_type(__p));
339037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      return __is;
339137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    }
339237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
339337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
339437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
339537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief A discrete binomial random number distribution.
339637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
339737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The formula for the binomial probability density function is
339837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f$p(i|t,p) = \binom{n}{i} p^i (1 - p)^{t - i}@f$ where @f$t@f$
339937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * and @f$p@f$ are the parameters of the distribution.
340037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
340137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _IntType = int>
340237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class binomial_distribution
340337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
340437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_integral<_IntType>::value,
340537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument not an integral type");
340637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
340737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
340837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the range of the distribution. */
340937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _IntType result_type;
341037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** Parameter type. */
341137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct param_type
341237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
341337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	typedef binomial_distribution<_IntType> distribution_type;
341437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend class binomial_distribution<_IntType>;
341537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
341637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	explicit
341737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type(_IntType __t = _IntType(1), double __p = 0.5)
341837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_t(__t), _M_p(__p)
341937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
342037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  _GLIBCXX_DEBUG_ASSERT((_M_t >= _IntType(0))
342137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh				&& (_M_p >= 0.0)
342237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh				&& (_M_p <= 1.0));
342337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  _M_initialize();
342437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
342537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
342637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_IntType
342737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	t() const
342837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_t; }
342937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
343037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	double
343137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	p() const
343237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_p; }
343337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
343437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend bool
343537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
343637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return __p1._M_t == __p2._M_t && __p1._M_p == __p2._M_p; }
343737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
343837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      private:
343937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	void
344037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_initialize();
344137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
344237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_IntType _M_t;
344337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	double _M_p;
344437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
344537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	double _M_q;
344637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#if _GLIBCXX_USE_C99_MATH_TR1
344737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	double _M_d1, _M_d2, _M_s1, _M_s2, _M_c,
344837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       _M_a1, _M_a123, _M_s, _M_lf, _M_lp1p;
344937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif
345037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	bool   _M_easy;
345137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      };
345237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
345337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // constructors and member function
345437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
345537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      binomial_distribution(_IntType __t = _IntType(1),
345637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh			    double __p = 0.5)
345737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__t, __p), _M_nd()
345837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
345937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
346037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
346137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      binomial_distribution(const param_type& __p)
346237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__p), _M_nd()
346337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
346437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
346537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
346637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Resets the distribution state.
346737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
346837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
346937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      reset()
347037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_nd.reset(); }
347137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
347237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
347337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the distribution @p t parameter.
347437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
347537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _IntType
347637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      t() const
347737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.t(); }
347837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
347937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
348037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the distribution @p p parameter.
348137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
348237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      double
348337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      p() const
348437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.p(); }
348537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
348637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
348737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the parameter set of the distribution.
348837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
348937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type
349037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param() const
349137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param; }
349237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
349337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
349437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Sets the parameter set of the distribution.
349537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __param The new parameter set of the distribution.
349637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
349737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
349837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param(const param_type& __param)
349937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_param = __param; }
350037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
350137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
350237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
350337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
350437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
350537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min() const
350637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return 0; }
350737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
350837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
350937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the least upper bound value of the distribution.
351037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
351137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
351237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max() const
351337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.t(); }
351437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
351537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
351637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Generating functions.
351737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
351837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
351937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
352037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
352137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return this->operator()(__urng, this->param()); }
352237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
352337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
352437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
352537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
352637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const param_type& __p);
352737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
352837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
352937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Return true if two binomial distributions have
353037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        the same parameters and the sequences that would
353137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        be generated are equal.
353237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
353337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend bool
353437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        operator==(const binomial_distribution& __d1,
353537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const binomial_distribution& __d2)
353637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifdef _GLIBCXX_USE_C99_MATH_TR1
353737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return __d1.param() == __d2.param() && __d1._M_nd == __d2._M_nd; }
353837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#else
353937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        { return __d1.param() == __d2.param(); }
354037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif
354137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
354237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
354337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Inserts a %binomial_distribution random number distribution
354437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @p __x into the output stream @p __os.
354537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
354637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __os An output stream.
354737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A %binomial_distribution random number distribution.
354837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
354937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
355037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * an error state.
355137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
355237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _IntType1,
355337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       typename _CharT, typename _Traits>
355437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
355537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
355637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const std::binomial_distribution<_IntType1>& __x);
355737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
355837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
355937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Extracts a %binomial_distribution random number distribution
356037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @p __x from the input stream @p __is.
356137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
356237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __is An input stream.
356337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A %binomial_distribution random number generator engine.
356437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
356537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The input stream with @p __x extracted or in an error
356637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *          state.
356737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
356837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _IntType1,
356937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       typename _CharT, typename _Traits>
357037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
357137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
357237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   std::binomial_distribution<_IntType1>& __x);
357337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
357437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
357537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
357637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
357737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_waiting(_UniformRandomNumberGenerator& __urng, _IntType __t);
357837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
357937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type _M_param;
358037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
358137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined.
358237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      std::normal_distribution<double> _M_nd;
358337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
358437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
358537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
358637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Return true if two binomial distributions are different.
358737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
358837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _IntType>
358937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
359037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::binomial_distribution<_IntType>& __d1,
359137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::binomial_distribution<_IntType>& __d2)
359237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__d1 == __d2); }
359337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
359437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
359537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
359637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief A discrete geometric random number distribution.
359737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
359837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The formula for the geometric probability density function is
359937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f$p(i|p) = p(1 - p)^{i}@f$ where @f$p@f$ is the parameter of the
360037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * distribution.
360137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
360237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _IntType = int>
360337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class geometric_distribution
360437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
360537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_integral<_IntType>::value,
360637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument not an integral type");
360737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
360837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
360937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the range of the distribution. */
361037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _IntType  result_type;
361137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** Parameter type. */
361237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct param_type
361337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
361437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	typedef geometric_distribution<_IntType> distribution_type;
361537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend class geometric_distribution<_IntType>;
361637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
361737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	explicit
361837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type(double __p = 0.5)
361937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_p(__p)
362037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
362137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  _GLIBCXX_DEBUG_ASSERT((_M_p > 0.0) && (_M_p < 1.0));
362237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  _M_initialize();
362337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
362437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
362537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	double
362637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	p() const
362737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_p; }
362837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
362937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend bool
363037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
363137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return __p1._M_p == __p2._M_p; }
363237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
363337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      private:
363437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	void
363537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_initialize()
363637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ _M_log_1_p = std::log(1.0 - _M_p); }
363737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
363837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	double _M_p;
363937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
364037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	double _M_log_1_p;
364137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      };
364237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
364337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // constructors and member function
364437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
364537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      geometric_distribution(double __p = 0.5)
364637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__p)
364737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
364837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
364937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
365037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      geometric_distribution(const param_type& __p)
365137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__p)
365237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
365337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
365437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
365537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Resets the distribution state.
365637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
365737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * Does nothing for the geometric distribution.
365837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
365937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
366037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      reset() { }
366137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
366237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
366337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the distribution parameter @p p.
366437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
366537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      double
366637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      p() const
366737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.p(); }
366837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
366937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
367037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the parameter set of the distribution.
367137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
367237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type
367337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param() const
367437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param; }
367537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
367637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
367737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Sets the parameter set of the distribution.
367837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __param The new parameter set of the distribution.
367937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
368037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
368137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param(const param_type& __param)
368237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_param = __param; }
368337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
368437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
368537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
368637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
368737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
368837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min() const
368937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return 0; }
369037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
369137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
369237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the least upper bound value of the distribution.
369337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
369437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
369537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max() const
369637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return std::numeric_limits<result_type>::max(); }
369737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
369837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
369937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Generating functions.
370037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
370137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
370237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
370337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
370437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return this->operator()(__urng, this->param()); }
370537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
370637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
370737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
370837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
370937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const param_type& __p);
371037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
371137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
371237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type _M_param;
371337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
371437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
371537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
371637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Return true if two geometric distributions have
371737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *        the same parameters.
371837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
371937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _IntType>
372037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
372137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator==(const std::geometric_distribution<_IntType>& __d1,
372237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::geometric_distribution<_IntType>& __d2)
372337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return __d1.param() == __d2.param(); }
372437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
372537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
372637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Return true if two geometric distributions have
372737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *        different parameters.
372837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
372937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _IntType>
373037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
373137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::geometric_distribution<_IntType>& __d1,
373237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::geometric_distribution<_IntType>& __d2)
373337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__d1 == __d2); }
373437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
373537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
373637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Inserts a %geometric_distribution random number distribution
373737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @p __x into the output stream @p __os.
373837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
373937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __os An output stream.
374037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __x  A %geometric_distribution random number distribution.
374137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
374237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns The output stream with the state of @p __x inserted or in
374337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * an error state.
374437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
374537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _IntType,
374637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	   typename _CharT, typename _Traits>
374737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    std::basic_ostream<_CharT, _Traits>&
374837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
374937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::geometric_distribution<_IntType>& __x);
375037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
375137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
375237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Extracts a %geometric_distribution random number distribution
375337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @p __x from the input stream @p __is.
375437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
375537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __is An input stream.
375637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __x  A %geometric_distribution random number generator engine.
375737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
375837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns The input stream with @p __x extracted or in an error state.
375937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
376037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _IntType,
376137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	   typename _CharT, typename _Traits>
376237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    std::basic_istream<_CharT, _Traits>&
376337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator>>(std::basic_istream<_CharT, _Traits>& __is,
376437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       std::geometric_distribution<_IntType>& __x);
376537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
376637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
376737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
376837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief A negative_binomial_distribution random number distribution.
376937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
377037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The formula for the negative binomial probability mass function is
377137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f$p(i) = \binom{n}{i} p^i (1 - p)^{t - i}@f$ where @f$t@f$
377237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * and @f$p@f$ are the parameters of the distribution.
377337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
377437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _IntType = int>
377537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class negative_binomial_distribution
377637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
377737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_integral<_IntType>::value,
377837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument not an integral type");
377937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
378037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
378137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the range of the distribution. */
378237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _IntType result_type;
378337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** Parameter type. */
378437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct param_type
378537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
378637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	typedef negative_binomial_distribution<_IntType> distribution_type;
378737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
378837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	explicit
378937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type(_IntType __k = 1, double __p = 0.5)
379037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_k(__k), _M_p(__p)
379137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
379237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  _GLIBCXX_DEBUG_ASSERT((_M_k > 0) && (_M_p > 0.0) && (_M_p <= 1.0));
379337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
379437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
379537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_IntType
379637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	k() const
379737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_k; }
379837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
379937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	double
380037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	p() const
380137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_p; }
380237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
380337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend bool
380437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
380537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return __p1._M_k == __p2._M_k && __p1._M_p == __p2._M_p; }
380637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
380737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      private:
380837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_IntType _M_k;
380937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	double _M_p;
381037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      };
381137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
381237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
381337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      negative_binomial_distribution(_IntType __k = 1, double __p = 0.5)
381437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__k, __p), _M_gd(__k, (1.0 - __p) / __p)
381537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
381637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
381737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
381837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      negative_binomial_distribution(const param_type& __p)
381937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__p), _M_gd(__p.k(), (1.0 - __p.p()) / __p.p())
382037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
382137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
382237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
382337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Resets the distribution state.
382437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
382537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
382637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      reset()
382737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_gd.reset(); }
382837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
382937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
383037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Return the @f$k@f$ parameter of the distribution.
383137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
383237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _IntType
383337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      k() const
383437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.k(); }
383537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
383637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
383737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Return the @f$p@f$ parameter of the distribution.
383837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
383937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      double
384037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      p() const
384137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.p(); }
384237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
384337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
384437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the parameter set of the distribution.
384537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
384637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type
384737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param() const
384837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param; }
384937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
385037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
385137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Sets the parameter set of the distribution.
385237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __param The new parameter set of the distribution.
385337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
385437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
385537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param(const param_type& __param)
385637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_param = __param; }
385737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
385837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
385937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
386037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
386137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
386237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min() const
386337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return result_type(0); }
386437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
386537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
386637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the least upper bound value of the distribution.
386737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
386837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
386937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max() const
387037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return std::numeric_limits<result_type>::max(); }
387137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
387237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
387337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Generating functions.
387437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
387537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
387637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
387737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        operator()(_UniformRandomNumberGenerator& __urng);
387837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
387937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
388037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
388137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
388237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const param_type& __p);
388337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
388437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
388537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Return true if two negative binomial distributions have
388637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        the same parameters and the sequences that would be
388737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        generated are equal.
388837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
388937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      friend bool
389037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator==(const negative_binomial_distribution& __d1,
389137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		 const negative_binomial_distribution& __d2)
389237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return __d1.param() == __d2.param() && __d1._M_gd == __d2._M_gd; }
389337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
389437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
389537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Inserts a %negative_binomial_distribution random
389637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        number distribution @p __x into the output stream @p __os.
389737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
389837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __os An output stream.
389937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A %negative_binomial_distribution random number
390037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *             distribution.
390137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
390237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
390337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *          an error state.
390437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
390537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _IntType1, typename _CharT, typename _Traits>
390637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
390737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
390837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const std::negative_binomial_distribution<_IntType1>& __x);
390937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
391037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
391137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Extracts a %negative_binomial_distribution random number
391237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        distribution @p __x from the input stream @p __is.
391337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
391437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __is An input stream.
391537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x A %negative_binomial_distribution random number
391637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *            generator engine.
391737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
391837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The input stream with @p __x extracted or in an error state.
391937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
392037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _IntType1, typename _CharT, typename _Traits>
392137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
392237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
392337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   std::negative_binomial_distribution<_IntType1>& __x);
392437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
392537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
392637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type _M_param;
392737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
392837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      std::gamma_distribution<double> _M_gd;
392937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
393037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
393137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
393237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Return true if two negative binomial distributions are different.
393337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
393437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _IntType>
393537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
393637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::negative_binomial_distribution<_IntType>& __d1,
393737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::negative_binomial_distribution<_IntType>& __d2)
393837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__d1 == __d2); }
393937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
394037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
394137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /* @} */ // group random_distributions_bernoulli
394237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
394337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
394437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @addtogroup random_distributions_poisson Poisson Distributions
394537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @ingroup random_distributions
394637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @{
394737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
394837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
394937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
395037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief A discrete Poisson random number distribution.
395137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
395237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The formula for the Poisson probability density function is
395337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f$p(i|\mu) = \frac{\mu^i}{i!} e^{-\mu}@f$ where @f$\mu@f$ is the
395437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * parameter of the distribution.
395537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
395637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _IntType = int>
395737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class poisson_distribution
395837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
395937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_integral<_IntType>::value,
396037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument not an integral type");
396137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
396237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
396337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the range of the distribution. */
396437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _IntType  result_type;
396537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** Parameter type. */
396637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct param_type
396737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
396837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	typedef poisson_distribution<_IntType> distribution_type;
396937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend class poisson_distribution<_IntType>;
397037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
397137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	explicit
397237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type(double __mean = 1.0)
397337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_mean(__mean)
397437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
397537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  _GLIBCXX_DEBUG_ASSERT(_M_mean > 0.0);
397637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  _M_initialize();
397737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
397837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
397937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	double
398037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	mean() const
398137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_mean; }
398237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
398337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend bool
398437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
398537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return __p1._M_mean == __p2._M_mean; }
398637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
398737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      private:
398837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	// Hosts either log(mean) or the threshold of the simple method.
398937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	void
399037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_initialize();
399137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
399237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	double _M_mean;
399337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
399437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	double _M_lm_thr;
399537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#if _GLIBCXX_USE_C99_MATH_TR1
399637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	double _M_lfm, _M_sm, _M_d, _M_scx, _M_1cx, _M_c2b, _M_cb;
399737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif
399837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      };
399937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
400037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // constructors and member function
400137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
400237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      poisson_distribution(double __mean = 1.0)
400337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__mean), _M_nd()
400437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
400537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
400637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
400737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      poisson_distribution(const param_type& __p)
400837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__p), _M_nd()
400937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
401037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
401137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
401237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Resets the distribution state.
401337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
401437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
401537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      reset()
401637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_nd.reset(); }
401737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
401837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
401937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the distribution parameter @p mean.
402037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
402137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      double
402237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      mean() const
402337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.mean(); }
402437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
402537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
402637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the parameter set of the distribution.
402737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
402837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type
402937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param() const
403037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param; }
403137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
403237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
403337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Sets the parameter set of the distribution.
403437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __param The new parameter set of the distribution.
403537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
403637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
403737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param(const param_type& __param)
403837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_param = __param; }
403937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
404037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
404137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
404237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
404337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
404437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min() const
404537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return 0; }
404637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
404737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
404837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the least upper bound value of the distribution.
404937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
405037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
405137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max() const
405237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return std::numeric_limits<result_type>::max(); }
405337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
405437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
405537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Generating functions.
405637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
405737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
405837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
405937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
406037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return this->operator()(__urng, this->param()); }
406137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
406237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
406337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
406437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
406537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const param_type& __p);
406637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
406737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       /**
406837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	* @brief Return true if two Poisson distributions have the same
406937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	*        parameters and the sequences that would be generated
407037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	*        are equal.
407137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	*/
407237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      friend bool
407337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      operator==(const poisson_distribution& __d1,
407437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		 const poisson_distribution& __d2)
407537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifdef _GLIBCXX_USE_C99_MATH_TR1
407637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return __d1.param() == __d2.param() && __d1._M_nd == __d2._M_nd; }
407737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#else
407837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return __d1.param() == __d2.param(); }
407937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif
408037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
408137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
408237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Inserts a %poisson_distribution random number distribution
408337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @p __x into the output stream @p __os.
408437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
408537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __os An output stream.
408637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A %poisson_distribution random number distribution.
408737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
408837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
408937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * an error state.
409037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
409137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _IntType1, typename _CharT, typename _Traits>
409237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
409337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
409437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const std::poisson_distribution<_IntType1>& __x);
409537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
409637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
409737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Extracts a %poisson_distribution random number distribution
409837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @p __x from the input stream @p __is.
409937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
410037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __is An input stream.
410137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A %poisson_distribution random number generator engine.
410237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
410337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The input stream with @p __x extracted or in an error
410437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *          state.
410537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
410637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _IntType1, typename _CharT, typename _Traits>
410737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
410837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
410937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   std::poisson_distribution<_IntType1>& __x);
411037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
411137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
411237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type _M_param;
411337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
411437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      // NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined.
411537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      std::normal_distribution<double> _M_nd;
411637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
411737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
411837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
411937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Return true if two Poisson distributions are different.
412037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
412137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _IntType>
412237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
412337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::poisson_distribution<_IntType>& __d1,
412437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::poisson_distribution<_IntType>& __d2)
412537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__d1 == __d2); }
412637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
412737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
412837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
412937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief An exponential continuous distribution for random numbers.
413037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
413137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The formula for the exponential probability density function is
413237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f$p(x|\lambda) = \lambda e^{-\lambda x}@f$.
413337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
413437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * <table border=1 cellpadding=10 cellspacing=0>
413537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * <caption align=top>Distribution Statistics</caption>
413637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * <tr><td>Mean</td><td>@f$\frac{1}{\lambda}@f$</td></tr>
413737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * <tr><td>Median</td><td>@f$\frac{\ln 2}{\lambda}@f$</td></tr>
413837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * <tr><td>Mode</td><td>@f$zero@f$</td></tr>
413937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * <tr><td>Range</td><td>@f$[0, \infty]@f$</td></tr>
414037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * <tr><td>Standard Deviation</td><td>@f$\frac{1}{\lambda}@f$</td></tr>
414137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * </table>
414237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
414337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType = double>
414437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class exponential_distribution
414537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
414637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
414737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument not a floating point type");
414837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
414937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
415037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the range of the distribution. */
415137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _RealType result_type;
415237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** Parameter type. */
415337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct param_type
415437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
415537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	typedef exponential_distribution<_RealType> distribution_type;
415637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
415737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	explicit
415837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type(_RealType __lambda = _RealType(1))
415937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_lambda(__lambda)
416037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
416137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  _GLIBCXX_DEBUG_ASSERT(_M_lambda > _RealType(0));
416237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
416337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
416437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType
416537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	lambda() const
416637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_lambda; }
416737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
416837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend bool
416937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
417037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return __p1._M_lambda == __p2._M_lambda; }
417137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
417237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      private:
417337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType _M_lambda;
417437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      };
417537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
417637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
417737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
417837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Constructs an exponential distribution with inverse scale
417937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        parameter @f$\lambda@f$.
418037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
418137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
418237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      exponential_distribution(const result_type& __lambda = result_type(1))
418337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__lambda)
418437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
418537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
418637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
418737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      exponential_distribution(const param_type& __p)
418837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__p)
418937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
419037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
419137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
419237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Resets the distribution state.
419337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
419437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * Has no effect on exponential distributions.
419537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
419637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
419737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      reset() { }
419837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
419937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
420037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the inverse scale parameter of the distribution.
420137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
420237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _RealType
420337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      lambda() const
420437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.lambda(); }
420537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
420637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
420737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the parameter set of the distribution.
420837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
420937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type
421037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param() const
421137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param; }
421237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
421337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
421437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Sets the parameter set of the distribution.
421537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __param The new parameter set of the distribution.
421637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
421737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
421837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param(const param_type& __param)
421937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_param = __param; }
422037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
422137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
422237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
422337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
422437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
422537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min() const
422637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return result_type(0); }
422737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
422837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
422937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the least upper bound value of the distribution.
423037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
423137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
423237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max() const
423337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return std::numeric_limits<result_type>::max(); }
423437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
423537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
423637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Generating functions.
423737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
423837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
423937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
424037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
424137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh        { return this->operator()(__urng, this->param()); }
424237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
424337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
424437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
424537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
424637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const param_type& __p)
424737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
424837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
424937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	    __aurng(__urng);
425037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  return -std::log(__aurng()) / __p.lambda();
425137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
425237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
425337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
425437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type _M_param;
425537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
425637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
425737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
425837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Return true if two exponential distributions have the same
425937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *        parameters.
426037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
426137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType>
426237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
426337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator==(const std::exponential_distribution<_RealType>& __d1,
426437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::exponential_distribution<_RealType>& __d2)
426537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return __d1.param() == __d2.param(); }
426637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
426737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
426837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Return true if two exponential distributions have different
426937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *        parameters.
427037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
427137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType>
427237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
427337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::exponential_distribution<_RealType>& __d1,
427437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::exponential_distribution<_RealType>& __d2)
427537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__d1 == __d2); }
427637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
427737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
427837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Inserts a %exponential_distribution random number distribution
427937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @p __x into the output stream @p __os.
428037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
428137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __os An output stream.
428237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __x  A %exponential_distribution random number distribution.
428337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
428437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns The output stream with the state of @p __x inserted or in
428537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * an error state.
428637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
428737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType, typename _CharT, typename _Traits>
428837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    std::basic_ostream<_CharT, _Traits>&
428937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
429037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::exponential_distribution<_RealType>& __x);
429137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
429237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
429337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Extracts a %exponential_distribution random number distribution
429437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @p __x from the input stream @p __is.
429537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
429637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __is An input stream.
429737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __x A %exponential_distribution random number
429837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *            generator engine.
429937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
430037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns The input stream with @p __x extracted or in an error state.
430137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
430237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType, typename _CharT, typename _Traits>
430337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    std::basic_istream<_CharT, _Traits>&
430437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator>>(std::basic_istream<_CharT, _Traits>& __is,
430537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       std::exponential_distribution<_RealType>& __x);
430637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
430737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
430837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
430937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief A weibull_distribution random number distribution.
431037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
431137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The formula for the normal probability density function is:
431237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f[
431337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *     p(x|\alpha,\beta) = \frac{\alpha}{\beta} (\frac{x}{\beta})^{\alpha-1}
431437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *                         \exp{(-(\frac{x}{\beta})^\alpha)}
431537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f]
431637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
431737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType = double>
431837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class weibull_distribution
431937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
432037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
432137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument not a floating point type");
432237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
432337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
432437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the range of the distribution. */
432537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _RealType result_type;
432637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** Parameter type. */
432737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct param_type
432837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
432937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	typedef weibull_distribution<_RealType> distribution_type;
433037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
433137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	explicit
433237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type(_RealType __a = _RealType(1),
433337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   _RealType __b = _RealType(1))
433437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_a(__a), _M_b(__b)
433537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ }
433637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
433737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType
433837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	a() const
433937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_a; }
434037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
434137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType
434237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	b() const
434337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_b; }
434437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
434537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend bool
434637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
434737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
434837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
434937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      private:
435037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType _M_a;
435137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType _M_b;
435237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      };
435337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
435437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
435537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      weibull_distribution(_RealType __a = _RealType(1),
435637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh			   _RealType __b = _RealType(1))
435737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__a, __b)
435837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
435937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
436037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
436137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      weibull_distribution(const param_type& __p)
436237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__p)
436337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
436437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
436537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
436637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Resets the distribution state.
436737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
436837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
436937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      reset()
437037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
437137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
437237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
437337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Return the @f$a@f$ parameter of the distribution.
437437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
437537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _RealType
437637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      a() const
437737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.a(); }
437837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
437937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
438037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Return the @f$b@f$ parameter of the distribution.
438137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
438237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _RealType
438337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      b() const
438437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.b(); }
438537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
438637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
438737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the parameter set of the distribution.
438837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
438937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type
439037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param() const
439137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param; }
439237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
439337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
439437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Sets the parameter set of the distribution.
439537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __param The new parameter set of the distribution.
439637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
439737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
439837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param(const param_type& __param)
439937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_param = __param; }
440037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
440137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
440237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
440337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
440437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
440537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min() const
440637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return result_type(0); }
440737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
440837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
440937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the least upper bound value of the distribution.
441037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
441137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
441237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max() const
441337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return std::numeric_limits<result_type>::max(); }
441437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
441537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
441637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Generating functions.
441737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
441837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
441937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
442037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
442137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return this->operator()(__urng, this->param()); }
442237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
442337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
442437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
442537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
442637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const param_type& __p);
442737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
442837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
442937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type _M_param;
443037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
443137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
443237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   /**
443337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    * @brief Return true if two Weibull distributions have the same
443437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    *        parameters.
443537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    */
443637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType>
443737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
443837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator==(const std::weibull_distribution<_RealType>& __d1,
443937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::weibull_distribution<_RealType>& __d2)
444037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return __d1.param() == __d2.param(); }
444137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
444237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   /**
444337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    * @brief Return true if two Weibull distributions have different
444437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    *        parameters.
444537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    */
444637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType>
444737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
444837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::weibull_distribution<_RealType>& __d1,
444937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::weibull_distribution<_RealType>& __d2)
445037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__d1 == __d2); }
445137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
445237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
445337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Inserts a %weibull_distribution random number distribution
445437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @p __x into the output stream @p __os.
445537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
445637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __os An output stream.
445737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __x  A %weibull_distribution random number distribution.
445837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
445937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns The output stream with the state of @p __x inserted or in
446037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * an error state.
446137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
446237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType, typename _CharT, typename _Traits>
446337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    std::basic_ostream<_CharT, _Traits>&
446437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
446537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::weibull_distribution<_RealType>& __x);
446637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
446737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
446837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Extracts a %weibull_distribution random number distribution
446937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @p __x from the input stream @p __is.
447037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
447137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __is An input stream.
447237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __x A %weibull_distribution random number
447337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *            generator engine.
447437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
447537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns The input stream with @p __x extracted or in an error state.
447637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
447737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType, typename _CharT, typename _Traits>
447837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    std::basic_istream<_CharT, _Traits>&
447937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator>>(std::basic_istream<_CharT, _Traits>& __is,
448037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       std::weibull_distribution<_RealType>& __x);
448137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
448237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
448337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
448437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief A extreme_value_distribution random number distribution.
448537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
448637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The formula for the normal probability mass function is
448737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f[
448837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *     p(x|a,b) = \frac{1}{b}
448937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *                \exp( \frac{a-x}{b} - \exp(\frac{a-x}{b}))
449037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @f]
449137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
449237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType = double>
449337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class extreme_value_distribution
449437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
449537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
449637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument not a floating point type");
449737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
449837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
449937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the range of the distribution. */
450037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _RealType result_type;
450137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** Parameter type. */
450237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct param_type
450337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
450437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	typedef extreme_value_distribution<_RealType> distribution_type;
450537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
450637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	explicit
450737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type(_RealType __a = _RealType(0),
450837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   _RealType __b = _RealType(1))
450937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_a(__a), _M_b(__b)
451037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ }
451137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
451237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType
451337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	a() const
451437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_a; }
451537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
451637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType
451737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	b() const
451837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_b; }
451937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
452037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend bool
452137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
452237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
452337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
452437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      private:
452537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType _M_a;
452637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_RealType _M_b;
452737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      };
452837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
452937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
453037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      extreme_value_distribution(_RealType __a = _RealType(0),
453137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh				 _RealType __b = _RealType(1))
453237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__a, __b)
453337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
453437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
453537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
453637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      extreme_value_distribution(const param_type& __p)
453737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__p)
453837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
453937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
454037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
454137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Resets the distribution state.
454237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
454337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
454437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      reset()
454537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
454637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
454737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
454837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Return the @f$a@f$ parameter of the distribution.
454937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
455037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _RealType
455137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      a() const
455237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.a(); }
455337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
455437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
455537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Return the @f$b@f$ parameter of the distribution.
455637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
455737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      _RealType
455837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      b() const
455937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param.b(); }
456037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
456137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
456237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the parameter set of the distribution.
456337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
456437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type
456537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param() const
456637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param; }
456737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
456837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
456937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Sets the parameter set of the distribution.
457037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __param The new parameter set of the distribution.
457137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
457237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
457337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param(const param_type& __param)
457437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_param = __param; }
457537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
457637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
457737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
457837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
457937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
458037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min() const
458137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return std::numeric_limits<result_type>::min(); }
458237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
458337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
458437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the least upper bound value of the distribution.
458537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
458637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
458737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max() const
458837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return std::numeric_limits<result_type>::max(); }
458937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
459037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
459137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Generating functions.
459237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
459337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
459437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
459537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
459637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return this->operator()(__urng, this->param()); }
459737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
459837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
459937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
460037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
460137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const param_type& __p);
460237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
460337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
460437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type _M_param;
460537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
460637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
460737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
460837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    * @brief Return true if two extreme value distributions have the same
460937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    *        parameters.
461037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
461137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType>
461237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
461337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator==(const std::extreme_value_distribution<_RealType>& __d1,
461437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::extreme_value_distribution<_RealType>& __d2)
461537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return __d1.param() == __d2.param(); }
461637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
461737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
461837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    * @brief Return true if two extreme value distributions have different
461937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    *        parameters.
462037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
462137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType>
462237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
462337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::extreme_value_distribution<_RealType>& __d1,
462437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::extreme_value_distribution<_RealType>& __d2)
462537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__d1 == __d2); }
462637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
462737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
462837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Inserts a %extreme_value_distribution random number distribution
462937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @p __x into the output stream @p __os.
463037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
463137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __os An output stream.
463237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __x  A %extreme_value_distribution random number distribution.
463337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
463437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns The output stream with the state of @p __x inserted or in
463537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * an error state.
463637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
463737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType, typename _CharT, typename _Traits>
463837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    std::basic_ostream<_CharT, _Traits>&
463937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
464037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::extreme_value_distribution<_RealType>& __x);
464137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
464237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
464337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief Extracts a %extreme_value_distribution random number
464437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *        distribution @p __x from the input stream @p __is.
464537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
464637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __is An input stream.
464737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @param __x A %extreme_value_distribution random number
464837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *            generator engine.
464937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
465037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @returns The input stream with @p __x extracted or in an error state.
465137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
465237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType, typename _CharT, typename _Traits>
465337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    std::basic_istream<_CharT, _Traits>&
465437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator>>(std::basic_istream<_CharT, _Traits>& __is,
465537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       std::extreme_value_distribution<_RealType>& __x);
465637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
465737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
465837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
465937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief A discrete_distribution random number distribution.
466037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
466137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The formula for the discrete probability mass function is
466237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
466337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
466437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _IntType = int>
466537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class discrete_distribution
466637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
466737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_integral<_IntType>::value,
466837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument not an integral type");
466937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
467037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
467137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the range of the distribution. */
467237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _IntType result_type;
467337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** Parameter type. */
467437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct param_type
467537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
467637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	typedef discrete_distribution<_IntType> distribution_type;
467737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend class discrete_distribution<_IntType>;
467837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
467937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type()
468037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_prob(), _M_cp()
468137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ }
468237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
468337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	template<typename _InputIterator>
468437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  param_type(_InputIterator __wbegin,
468537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		     _InputIterator __wend)
468637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  : _M_prob(__wbegin, __wend), _M_cp()
468737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  { _M_initialize(); }
468837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
468937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type(initializer_list<double> __wil)
469037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_prob(__wil.begin(), __wil.end()), _M_cp()
469137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ _M_initialize(); }
469237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
469337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	template<typename _Func>
469437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  param_type(size_t __nw, double __xmin, double __xmax,
469537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		     _Func __fw);
469637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
469737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	// See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/
469837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type(const param_type&) = default;
469937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type& operator=(const param_type&) = default;
470037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
470137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	std::vector<double>
470237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	probabilities() const
470337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_prob.empty() ? std::vector<double>(1, 1.0) : _M_prob; }
470437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
470537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend bool
470637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
470737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return __p1._M_prob == __p2._M_prob; }
470837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
470937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      private:
471037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	void
471137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_initialize();
471237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
471337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	std::vector<double> _M_prob;
471437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	std::vector<double> _M_cp;
471537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      };
471637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
471737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      discrete_distribution()
471837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param()
471937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
472037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
472137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _InputIterator>
472237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	discrete_distribution(_InputIterator __wbegin,
472337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh			      _InputIterator __wend)
472437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_param(__wbegin, __wend)
472537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ }
472637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
472737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      discrete_distribution(initializer_list<double> __wl)
472837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__wl)
472937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
473037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
473137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _Func>
473237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	discrete_distribution(size_t __nw, double __xmin, double __xmax,
473337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh			      _Func __fw)
473437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_param(__nw, __xmin, __xmax, __fw)
473537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ }
473637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
473737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
473837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      discrete_distribution(const param_type& __p)
473937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__p)
474037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
474137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
474237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
474337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Resets the distribution state.
474437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
474537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
474637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      reset()
474737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
474837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
474937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
475037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the probabilities of the distribution.
475137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
475237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      std::vector<double>
475337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      probabilities() const
475437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
475537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return _M_param._M_prob.empty()
475637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  ? std::vector<double>(1, 1.0) : _M_param._M_prob;
475737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
475837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
475937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
476037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the parameter set of the distribution.
476137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
476237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type
476337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param() const
476437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param; }
476537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
476637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
476737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Sets the parameter set of the distribution.
476837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __param The new parameter set of the distribution.
476937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
477037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
477137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param(const param_type& __param)
477237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_param = __param; }
477337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
477437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
477537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
477637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
477737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
477837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min() const
477937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return result_type(0); }
478037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
478137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
478237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the least upper bound value of the distribution.
478337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
478437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
478537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max() const
478637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
478737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return _M_param._M_prob.empty()
478837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  ? result_type(0) : result_type(_M_param._M_prob.size() - 1);
478937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
479037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
479137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
479237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Generating functions.
479337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
479437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
479537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
479637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
479737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return this->operator()(__urng, this->param()); }
479837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
479937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
480037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
480137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
480237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const param_type& __p);
480337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
480437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
480537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Inserts a %discrete_distribution random number distribution
480637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @p __x into the output stream @p __os.
480737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
480837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __os An output stream.
480937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A %discrete_distribution random number distribution.
481037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
481137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
481237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * an error state.
481337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
481437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _IntType1, typename _CharT, typename _Traits>
481537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
481637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
481737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const std::discrete_distribution<_IntType1>& __x);
481837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
481937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
482037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Extracts a %discrete_distribution random number distribution
482137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @p __x from the input stream @p __is.
482237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
482337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __is An input stream.
482437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x A %discrete_distribution random number
482537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *            generator engine.
482637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
482737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The input stream with @p __x extracted or in an error
482837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *          state.
482937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
483037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _IntType1, typename _CharT, typename _Traits>
483137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
483237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
483337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   std::discrete_distribution<_IntType1>& __x);
483437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
483537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
483637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type _M_param;
483737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
483837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
483937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
484037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    * @brief Return true if two discrete distributions have the same
484137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    *        parameters.
484237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    */
484337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _IntType>
484437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
484537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator==(const std::discrete_distribution<_IntType>& __d1,
484637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::discrete_distribution<_IntType>& __d2)
484737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return __d1.param() == __d2.param(); }
484837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
484937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
485037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    * @brief Return true if two discrete distributions have different
485137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    *        parameters.
485237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    */
485337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _IntType>
485437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
485537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::discrete_distribution<_IntType>& __d1,
485637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::discrete_distribution<_IntType>& __d2)
485737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__d1 == __d2); }
485837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
485937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
486037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
486137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief A piecewise_constant_distribution random number distribution.
486237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
486337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The formula for the piecewise constant probability mass function is
486437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
486537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
486637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType = double>
486737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class piecewise_constant_distribution
486837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
486937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
487037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument not a floating point type");
487137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
487237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
487337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the range of the distribution. */
487437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _RealType result_type;
487537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** Parameter type. */
487637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct param_type
487737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
487837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	typedef piecewise_constant_distribution<_RealType> distribution_type;
487937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend class piecewise_constant_distribution<_RealType>;
488037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
488137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type()
488237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_int(), _M_den(), _M_cp()
488337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ }
488437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
488537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	template<typename _InputIteratorB, typename _InputIteratorW>
488637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  param_type(_InputIteratorB __bfirst,
488737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		     _InputIteratorB __bend,
488837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		     _InputIteratorW __wbegin);
488937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
489037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	template<typename _Func>
489137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  param_type(initializer_list<_RealType> __bi, _Func __fw);
489237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
489337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	template<typename _Func>
489437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  param_type(size_t __nw, _RealType __xmin, _RealType __xmax,
489537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		     _Func __fw);
489637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
489737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	// See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/
489837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type(const param_type&) = default;
489937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type& operator=(const param_type&) = default;
490037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
490137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	std::vector<_RealType>
490237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	intervals() const
490337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
490437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  if (_M_int.empty())
490537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	    {
490637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	      std::vector<_RealType> __tmp(2);
490737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	      __tmp[1] = _RealType(1);
490837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	      return __tmp;
490937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	    }
491037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  else
491137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	    return _M_int;
491237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
491337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
491437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	std::vector<double>
491537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	densities() const
491637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_den.empty() ? std::vector<double>(1, 1.0) : _M_den; }
491737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
491837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend bool
491937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
492037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return __p1._M_int == __p2._M_int && __p1._M_den == __p2._M_den; }
492137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
492237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      private:
492337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	void
492437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_initialize();
492537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
492637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	std::vector<_RealType> _M_int;
492737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	std::vector<double> _M_den;
492837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	std::vector<double> _M_cp;
492937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      };
493037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
493137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
493237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      piecewise_constant_distribution()
493337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param()
493437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
493537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
493637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _InputIteratorB, typename _InputIteratorW>
493737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	piecewise_constant_distribution(_InputIteratorB __bfirst,
493837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh					_InputIteratorB __bend,
493937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh					_InputIteratorW __wbegin)
494037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_param(__bfirst, __bend, __wbegin)
494137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ }
494237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
494337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _Func>
494437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	piecewise_constant_distribution(initializer_list<_RealType> __bl,
494537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh					_Func __fw)
494637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_param(__bl, __fw)
494737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ }
494837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
494937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _Func>
495037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	piecewise_constant_distribution(size_t __nw,
495137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh					_RealType __xmin, _RealType __xmax,
495237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh					_Func __fw)
495337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_param(__nw, __xmin, __xmax, __fw)
495437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ }
495537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
495637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
495737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      piecewise_constant_distribution(const param_type& __p)
495837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__p)
495937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
496037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
496137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
496237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Resets the distribution state.
496337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
496437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
496537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      reset()
496637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
496737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
496837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
496937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns a vector of the intervals.
497037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
497137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      std::vector<_RealType>
497237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      intervals() const
497337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
497437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	if (_M_param._M_int.empty())
497537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  {
497637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	    std::vector<_RealType> __tmp(2);
497737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	    __tmp[1] = _RealType(1);
497837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	    return __tmp;
497937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  }
498037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	else
498137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  return _M_param._M_int;
498237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
498337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
498437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
498537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns a vector of the probability densities.
498637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
498737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      std::vector<double>
498837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      densities() const
498937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
499037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return _M_param._M_den.empty()
499137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  ? std::vector<double>(1, 1.0) : _M_param._M_den;
499237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
499337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
499437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
499537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the parameter set of the distribution.
499637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
499737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type
499837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param() const
499937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param; }
500037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
500137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
500237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Sets the parameter set of the distribution.
500337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __param The new parameter set of the distribution.
500437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
500537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
500637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param(const param_type& __param)
500737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_param = __param; }
500837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
500937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
501037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
501137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
501237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
501337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min() const
501437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
501537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return _M_param._M_int.empty()
501637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  ? result_type(0) : _M_param._M_int.front();
501737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
501837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
501937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
502037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the least upper bound value of the distribution.
502137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
502237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
502337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max() const
502437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
502537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return _M_param._M_int.empty()
502637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  ? result_type(1) : _M_param._M_int.back();
502737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
502837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
502937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
503037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Generating functions.
503137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
503237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
503337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
503437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
503537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return this->operator()(__urng, this->param()); }
503637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
503737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
503837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
503937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
504037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const param_type& __p);
504137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
504237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
504337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Inserts a %piecewise_constan_distribution random
504437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        number distribution @p __x into the output stream @p __os.
504537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
504637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __os An output stream.
504737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A %piecewise_constan_distribution random number
504837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *             distribution.
504937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
505037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
505137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * an error state.
505237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
505337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
505437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
505537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
505637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const std::piecewise_constant_distribution<_RealType1>& __x);
505737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
505837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
505937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Extracts a %piecewise_constan_distribution random
506037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        number distribution @p __x from the input stream @p __is.
506137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
506237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __is An input stream.
506337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x A %piecewise_constan_distribution random number
506437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *            generator engine.
506537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
506637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The input stream with @p __x extracted or in an error
506737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *          state.
506837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
506937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
507037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
507137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
507237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   std::piecewise_constant_distribution<_RealType1>& __x);
507337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
507437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
507537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type _M_param;
507637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
507737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
507837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
507937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    * @brief Return true if two piecewise constant distributions have the
508037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    *        same parameters.
508137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
508237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType>
508337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
508437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator==(const std::piecewise_constant_distribution<_RealType>& __d1,
508537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::piecewise_constant_distribution<_RealType>& __d2)
508637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return __d1.param() == __d2.param(); }
508737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
508837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
508937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    * @brief Return true if two piecewise constant distributions have
509037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    *        different parameters.
509137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
509237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType>
509337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
509437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::piecewise_constant_distribution<_RealType>& __d1,
509537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::piecewise_constant_distribution<_RealType>& __d2)
509637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__d1 == __d2); }
509737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
509837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
509937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
510037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief A piecewise_linear_distribution random number distribution.
510137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
510237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * The formula for the piecewise linear probability mass function is
510337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *
510437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
510537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType = double>
510637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    class piecewise_linear_distribution
510737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    {
510837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
510937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		    "template argument not a floating point type");
511037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
511137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    public:
511237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** The type of the range of the distribution. */
511337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      typedef _RealType result_type;
511437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /** Parameter type. */
511537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      struct param_type
511637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
511737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	typedef piecewise_linear_distribution<_RealType> distribution_type;
511837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend class piecewise_linear_distribution<_RealType>;
511937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
512037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type()
512137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_int(), _M_den(), _M_cp(), _M_m()
512237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ }
512337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
512437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	template<typename _InputIteratorB, typename _InputIteratorW>
512537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  param_type(_InputIteratorB __bfirst,
512637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		     _InputIteratorB __bend,
512737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		     _InputIteratorW __wbegin);
512837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
512937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	template<typename _Func>
513037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  param_type(initializer_list<_RealType> __bl, _Func __fw);
513137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
513237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	template<typename _Func>
513337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  param_type(size_t __nw, _RealType __xmin, _RealType __xmax,
513437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		     _Func __fw);
513537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
513637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	// See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/
513737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type(const param_type&) = default;
513837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	param_type& operator=(const param_type&) = default;
513937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
514037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	std::vector<_RealType>
514137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	intervals() const
514237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{
514337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  if (_M_int.empty())
514437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	    {
514537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	      std::vector<_RealType> __tmp(2);
514637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	      __tmp[1] = _RealType(1);
514737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	      return __tmp;
514837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	    }
514937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  else
515037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	    return _M_int;
515137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	}
515237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
515337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	std::vector<double>
515437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	densities() const
515537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return _M_den.empty() ? std::vector<double>(2, 1.0) : _M_den; }
515637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
515737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend bool
515837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
515937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return (__p1._M_int == __p2._M_int
516037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		  && __p1._M_den == __p2._M_den); }
516137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
516237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      private:
516337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	void
516437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	_M_initialize();
516537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
516637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	std::vector<_RealType> _M_int;
516737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	std::vector<double> _M_den;
516837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	std::vector<double> _M_cp;
516937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	std::vector<double> _M_m;
517037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      };
517137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
517237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
517337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      piecewise_linear_distribution()
517437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param()
517537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
517637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
517737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _InputIteratorB, typename _InputIteratorW>
517837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	piecewise_linear_distribution(_InputIteratorB __bfirst,
517937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh				      _InputIteratorB __bend,
518037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh				      _InputIteratorW __wbegin)
518137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_param(__bfirst, __bend, __wbegin)
518237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ }
518337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
518437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _Func>
518537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	piecewise_linear_distribution(initializer_list<_RealType> __bl,
518637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh				      _Func __fw)
518737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_param(__bl, __fw)
518837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ }
518937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
519037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _Func>
519137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	piecewise_linear_distribution(size_t __nw,
519237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh				      _RealType __xmin, _RealType __xmax,
519337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh				      _Func __fw)
519437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	: _M_param(__nw, __xmin, __xmax, __fw)
519537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ }
519637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
519737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      explicit
519837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      piecewise_linear_distribution(const param_type& __p)
519937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      : _M_param(__p)
520037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
520137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
520237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
520337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * Resets the distribution state.
520437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
520537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
520637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      reset()
520737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { }
520837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
520937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
521037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Return the intervals of the distribution.
521137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
521237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      std::vector<_RealType>
521337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      intervals() const
521437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
521537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	if (_M_param._M_int.empty())
521637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  {
521737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	    std::vector<_RealType> __tmp(2);
521837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	    __tmp[1] = _RealType(1);
521937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	    return __tmp;
522037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  }
522137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	else
522237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  return _M_param._M_int;
522337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
522437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
522537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
522637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Return a vector of the probability densities of the
522737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        distribution.
522837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
522937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      std::vector<double>
523037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      densities() const
523137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
523237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return _M_param._M_den.empty()
523337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  ? std::vector<double>(2, 1.0) : _M_param._M_den;
523437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
523537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
523637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
523737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the parameter set of the distribution.
523837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
523937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type
524037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param() const
524137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { return _M_param; }
524237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
524337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
524437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Sets the parameter set of the distribution.
524537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __param The new parameter set of the distribution.
524637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
524737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
524837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param(const param_type& __param)
524937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { _M_param = __param; }
525037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
525137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
525237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
525337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
525437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
525537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      min() const
525637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
525737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return _M_param._M_int.empty()
525837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  ? result_type(0) : _M_param._M_int.front();
525937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
526037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
526137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
526237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Returns the least upper bound value of the distribution.
526337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
526437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      result_type
526537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      max() const
526637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      {
526737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	return _M_param._M_int.empty()
526837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	  ? result_type(1) : _M_param._M_int.back();
526937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      }
527037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
527137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
527237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Generating functions.
527337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
527437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
527537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
527637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
527737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	{ return this->operator()(__urng, this->param()); }
527837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
527937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _UniformRandomNumberGenerator>
528037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	result_type
528137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
528237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const param_type& __p);
528337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
528437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
528537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Inserts a %piecewise_linear_distribution random number
528637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        distribution @p __x into the output stream @p __os.
528737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
528837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __os An output stream.
528937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A %piecewise_linear_distribution random number
529037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *             distribution.
529137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
529237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
529337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *          an error state.
529437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
529537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
529637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
529737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
529837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   const std::piecewise_linear_distribution<_RealType1>& __x);
529937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
530037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      /**
530137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @brief Extracts a %piecewise_linear_distribution random number
530237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *        distribution @p __x from the input stream @p __is.
530337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
530437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __is An input stream.
530537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @param __x  A %piecewise_linear_distribution random number
530637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *             generator engine.
530737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *
530837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       * @returns The input stream with @p __x extracted or in an error
530937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       *          state.
531037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh       */
531137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
531237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
531337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
531437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh		   std::piecewise_linear_distribution<_RealType1>& __x);
531537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
531637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    private:
531737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param_type _M_param;
531837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    };
531937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
532037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
532137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    * @brief Return true if two piecewise linear distributions have the
532237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    *        same parameters.
532337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
532437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType>
532537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
532637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator==(const std::piecewise_linear_distribution<_RealType>& __d1,
532737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::piecewise_linear_distribution<_RealType>& __d2)
532837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return __d1.param() == __d2.param(); }
532937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
533037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
533137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    * @brief Return true if two piecewise linear distributions have
533237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    *        different parameters.
533337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
533437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  template<typename _RealType>
533537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    inline bool
533637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    operator!=(const std::piecewise_linear_distribution<_RealType>& __d1,
533737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh	       const std::piecewise_linear_distribution<_RealType>& __d2)
533837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return !(__d1 == __d2); }
533937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
534037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
534137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /* @} */ // group random_distributions_poisson
534237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
534337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /* @} */ // group random_distributions
534437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
534537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
534637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @addtogroup random_utilities Random Number Utilities
534737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @ingroup random
534837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @{
534937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
535037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
535137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /**
535237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   * @brief The seed_seq class generates sequences of seeds for random
535337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   *        number generators.
535437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh   */
535537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  class seed_seq
535637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  {
535737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
535837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  public:
535937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    /** The type of the seed vales. */
536037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    typedef uint_least32_t result_type;
536137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
536237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    /** Default constructor. */
536337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    seed_seq()
536437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    : _M_v()
536537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { }
536637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
536737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    template<typename _IntType>
536837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      seed_seq(std::initializer_list<_IntType> il);
536937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
537037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    template<typename _InputIterator>
537137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      seed_seq(_InputIterator __begin, _InputIterator __end);
537237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
537337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    // generating functions
537437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    template<typename _RandomAccessIterator>
537537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
537637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      generate(_RandomAccessIterator __begin, _RandomAccessIterator __end);
537737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
537837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    // property functions
537937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    size_t size() const
538037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    { return _M_v.size(); }
538137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
538237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    template<typename OutputIterator>
538337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      void
538437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      param(OutputIterator __dest) const
538537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh      { std::copy(_M_v.begin(), _M_v.end(), __dest); }
538637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
538737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  private:
538837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    ///
538937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh    std::vector<result_type> _M_v;
539037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  };
539137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
539237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /* @} */ // group random_utilities
539337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
539437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh  /* @} */ // group random
539537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
539637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh_GLIBCXX_END_NAMESPACE_VERSION
539737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh} // namespace std
539837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh
539937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif
5400