13123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// random number generation -*- C++ -*-
23123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
33123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
43123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh//
53123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// This file is part of the GNU ISO C++ Library.  This library is free
63123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// software; you can redistribute it and/or modify it under the
73123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// terms of the GNU General Public License as published by the
83123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// Free Software Foundation; either version 3, or (at your option)
93123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// any later version.
103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// This library is distributed in the hope that it will be useful,
123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// but WITHOUT ANY WARRANTY; without even the implied warranty of
133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// GNU General Public License for more details.
153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// Under Section 7 of GPL version 3, you are granted additional
173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// permissions described in the GCC Runtime Library Exception, version
183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// 3.1, as published by the Free Software Foundation.
193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// You should have received a copy of the GNU General Public License and
213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// a copy of the GCC Runtime Library Exception along with this program;
223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh// <http://www.gnu.org/licenses/>.
243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh/**
263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * @file bits/random.h
273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh *  This is an internal header file, included by other library headers.
283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh *  Do not attempt to use it directly. @headername{random}
293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */
303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#ifndef _RANDOM_H
323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#define _RANDOM_H 1
333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#include <vector>
353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsiehnamespace std _GLIBCXX_VISIBILITY(default)
373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh{
383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh_GLIBCXX_BEGIN_NAMESPACE_VERSION
393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  // [26.4] Random number generation
413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @defgroup random Random Number Generation
443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @ingroup numerics
453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * A facility for generating random numbers on selected distributions.
473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @{
483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief A function template for converting the output of a (integral)
523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * uniform random number generator to a floatng point result in the range
533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * [0-1).
543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType, size_t __bits,
563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	   typename _UniformRandomNumberGenerator>
573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    _RealType
583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    generate_canonical(_UniformRandomNumberGenerator& __g);
593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh_GLIBCXX_END_NAMESPACE_VERSION
613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /*
633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * Implementation-space details.
643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  namespace __detail
663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  {
673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  _GLIBCXX_BEGIN_NAMESPACE_VERSION
683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    template<typename _UIntType, size_t __w,
703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	     bool = __w < static_cast<size_t>
713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh			  (std::numeric_limits<_UIntType>::digits)>
723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct _Shift
733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { static const _UIntType __value = 0; };
743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    template<typename _UIntType, size_t __w>
763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct _Shift<_UIntType, __w, true>
773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { static const _UIntType __value = _UIntType(1) << __w; };
783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    template<typename _Tp, _Tp __m, _Tp __a, _Tp __c, bool>
803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct _Mod;
813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    // Dispatch based on modulus value to prevent divide-by-zero compile-time
833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    // errors when m == 0.
843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    template<typename _Tp, _Tp __m, _Tp __a = 1, _Tp __c = 0>
853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      inline _Tp
863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      __mod(_Tp __x)
873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _Mod<_Tp, __m, __a, __c, __m == 0>::__calc(__x); }
883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    /*
903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     * An adaptor class for converting the output of any Generator into
913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     * the input for a specific Distribution.
923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     */
933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    template<typename _Engine, typename _DInputType>
943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct _Adaptor
953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      public:
983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_Adaptor(_Engine& __g)
993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_g(__g) { }
1003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
1013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_DInputType
1023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	min() const
1033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _DInputType(0); }
1043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
1053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_DInputType
1063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	max() const
1073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _DInputType(1); }
1083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
1093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	/*
1103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	 * Converts a value generated by the adapted random number generator
1113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	 * into a value in the input domain for the dependent random number
1123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	 * distribution.
1133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	 */
1143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_DInputType
1153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()()
1163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{
1173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  return std::generate_canonical<_DInputType,
1183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	                            std::numeric_limits<_DInputType>::digits,
1193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	                            _Engine>(_M_g);
1203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	}
1213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
1223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      private:
1233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_Engine& _M_g;
1243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      };
1253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
1263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  _GLIBCXX_END_NAMESPACE_VERSION
1273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  } // namespace __detail
1283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
1293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh_GLIBCXX_BEGIN_NAMESPACE_VERSION
1303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
1313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
1323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @addtogroup random_generators Random Number Generators
1333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @ingroup random
1343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
1353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * These classes define objects which provide random or pseudorandom
1363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * numbers, either from a discrete or a continuous interval.  The
1373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * random number generator supplied as a part of this library are
1383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * all uniform random number generators which provide a sequence of
1393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * random number uniformly distributed over their range.
1403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
1413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * A number generator is a function object with an operator() that
1423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * takes zero arguments and returns a number.
1433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
1443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * A compliant random number generator must satisfy the following
1453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * requirements.  <table border=1 cellpadding=10 cellspacing=0>
1463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * <caption align=top>Random Number Generator Requirements</caption>
1473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * <tr><td>To be documented.</td></tr> </table>
1483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
1493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @{
1503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
1513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
1523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
1533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief A model of a linear congruential random number generator.
1543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
1553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * A random number generator that produces pseudorandom numbers via
1563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * linear function:
1573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f[
1583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *     x_{i+1}\leftarrow(ax_{i} + c) \bmod m
1593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f]
1603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
1613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The template parameter @p _UIntType must be an unsigned integral type
1623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * large enough to store values up to (__m-1). If the template parameter
1633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @p __m is 0, the modulus @p __m used is
1643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * std::numeric_limits<_UIntType>::max() plus 1. Otherwise, the template
1653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * parameters @p __a and @p __c must be less than @p __m.
1663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
1673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The size of the state is @f$1@f$.
1683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
1693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
1703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class linear_congruential_engine
1713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
1723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_unsigned<_UIntType>::value, "template argument "
1733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "substituting _UIntType not an unsigned integral type");
1743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(__m == 0u || (__a < __m && __c < __m),
1753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument substituting __m out of bounds");
1763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
1773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      // XXX FIXME:
1783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      // _Mod::__calc should handle correctly __m % __a >= __m / __a too.
1793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(__m % __a < __m / __a,
1803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "sorry, not implemented yet: try a smaller 'a' constant");
1813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
1823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
1833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the generated random value. */
1843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _UIntType result_type;
1853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
1863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The multiplier. */
1873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type multiplier   = __a;
1883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** An increment. */
1893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type increment    = __c;
1903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The modulus. */
1913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type modulus      = __m;
1923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type default_seed = 1u;
1933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
1943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
1953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Constructs a %linear_congruential_engine random number
1963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        generator engine with seed @p __s.  The default seed value
1973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        is 1.
1983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
1993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __s The initial seed value.
2003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
2013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
2023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      linear_congruential_engine(result_type __s = default_seed)
2033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { seed(__s); }
2043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
2053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
2063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Constructs a %linear_congruential_engine random number
2073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        generator engine seeded from the seed sequence @p __q.
2083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
2093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __q the seed sequence.
2103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
2113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _Sseq, typename = typename
2123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	std::enable_if<!std::is_same<_Sseq, linear_congruential_engine>::value>
2133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       ::type>
2143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        explicit
2153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        linear_congruential_engine(_Sseq& __q)
2163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        { seed(__q); }
2173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
2183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
2193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Reseeds the %linear_congruential_engine random number generator
2203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        engine sequence to the seed @p __s.
2213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
2223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __s The new seed.
2233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
2243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
2253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      seed(result_type __s = default_seed);
2263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
2273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
2283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Reseeds the %linear_congruential_engine random number generator
2293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        engine
2303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * sequence using values from the seed sequence @p __q.
2313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
2323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __q the seed sequence.
2333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
2343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _Sseq>
2353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        typename std::enable_if<std::is_class<_Sseq>::value>::type
2363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        seed(_Sseq& __q);
2373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
2383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
2393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Gets the smallest possible value in the output range.
2403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
2413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * The minimum depends on the @p __c parameter: if it is zero, the
2423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * minimum generated must be > 0, otherwise 0 is allowed.
2433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
2443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type
2453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min()
2463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return __c == 0u ? 1u : 0u; }
2473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
2483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
2493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Gets the largest possible value in the output range.
2503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
2513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type
2523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max()
2533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return __m - 1u; }
2543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
2553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
2563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Discard a sequence of random numbers.
2573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
2583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
2593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      discard(unsigned long long __z)
2603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
2613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	for (; __z != 0ULL; --__z)
2623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  (*this)();
2633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
2643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
2653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
2663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Gets the next random number in the sequence.
2673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
2683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
2693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      operator()()
2703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
2713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_M_x = __detail::__mod<_UIntType, __m, __a, __c>(_M_x);
2723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	return _M_x;
2733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
2743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
2753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
2763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Compares two linear congruential random number generator
2773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * objects of the same type for equality.
2783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
2793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __lhs A linear congruential random number generator object.
2803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __rhs Another linear congruential random number generator
2813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *              object.
2823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
2833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns true if the infinite sequences of generated values
2843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *          would be equal, false otherwise.
2853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
2863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      friend bool
2873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      operator==(const linear_congruential_engine& __lhs,
2883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		 const linear_congruential_engine& __rhs)
2893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return __lhs._M_x == __rhs._M_x; }
2903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
2913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
2923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Writes the textual representation of the state x(i) of x to
2933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        @p __os.
2943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
2953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __os  The output stream.
2963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __lcr A % linear_congruential_engine random number generator.
2973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns __os.
2983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
2993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UIntType1, _UIntType1 __a1, _UIntType1 __c1,
3003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       _UIntType1 __m1, typename _CharT, typename _Traits>
3013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
3023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
3033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const std::linear_congruential_engine<_UIntType1,
3043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   __a1, __c1, __m1>& __lcr);
3053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
3063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
3073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Sets the state of the engine by reading its textual
3083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        representation from @p __is.
3093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
3103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * The textual representation must have been previously written using
3113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * an output stream whose imbued locale and whose type's template
3123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * specialization arguments _CharT and _Traits were the same as those
3133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * of @p __is.
3143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
3153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __is  The input stream.
3163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __lcr A % linear_congruential_engine random number generator.
3173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns __is.
3183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
3193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UIntType1, _UIntType1 __a1, _UIntType1 __c1,
3203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       _UIntType1 __m1, typename _CharT, typename _Traits>
3213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
3223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
3233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   std::linear_congruential_engine<_UIntType1, __a1,
3243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   __c1, __m1>& __lcr);
3253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
3263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
3273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _UIntType _M_x;
3283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
3293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
3303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
3313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Compares two linear congruential random number generator
3323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * objects of the same type for inequality.
3333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
3343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __lhs A linear congruential random number generator object.
3353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __rhs Another linear congruential random number generator
3363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *              object.
3373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
3383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns true if the infinite sequences of generated values
3393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *          would be different, false otherwise.
3403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
3413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
3423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
3433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::linear_congruential_engine<_UIntType, __a,
3443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       __c, __m>& __lhs,
3453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::linear_congruential_engine<_UIntType, __a,
3463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       __c, __m>& __rhs)
3473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__lhs == __rhs); }
3483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
3493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
3503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
3513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * A generalized feedback shift register discrete random number generator.
3523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
3533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * This algorithm avoids multiplication and division and is designed to be
3543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * friendly to a pipelined architecture.  If the parameters are chosen
3553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * correctly, this generator will produce numbers with a very long period and
3563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * fairly good apparent entropy, although still not cryptographically strong.
3573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
3583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The best way to use this generator is with the predefined mt19937 class.
3593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
3603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * This algorithm was originally invented by Makoto Matsumoto and
3613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * Takuji Nishimura.
3623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
3633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @tparam __w  Word size, the number of bits in each element of
3643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *              the state vector.
3653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @tparam __n  The degree of recursion.
3663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @tparam __m  The period parameter.
3673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @tparam __r  The separation point bit index.
3683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @tparam __a  The last row of the twist matrix.
3693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @tparam __u  The first right-shift tempering matrix parameter.
3703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @tparam __d  The first right-shift tempering matrix mask.
3713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @tparam __s  The first left-shift tempering matrix parameter.
3723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @tparam __b  The first left-shift tempering matrix mask.
3733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @tparam __t  The second left-shift tempering matrix parameter.
3743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @tparam __c  The second left-shift tempering matrix mask.
3753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @tparam __l  The second right-shift tempering matrix parameter.
3763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @tparam __f  Initialization multiplier.
3773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
3783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _UIntType, size_t __w,
3793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	   size_t __n, size_t __m, size_t __r,
3803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	   _UIntType __a, size_t __u, _UIntType __d, size_t __s,
3813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	   _UIntType __b, size_t __t,
3823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	   _UIntType __c, size_t __l, _UIntType __f>
3833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class mersenne_twister_engine
3843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
3853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_unsigned<_UIntType>::value, "template argument "
3863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "substituting _UIntType not an unsigned integral type");
3873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(1u <= __m && __m <= __n,
3883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument substituting __m out of bounds");
3893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(__r <= __w, "template argument substituting "
3903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "__r out of bound");
3913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(__u <= __w, "template argument substituting "
3923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "__u out of bound");
3933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(__s <= __w, "template argument substituting "
3943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "__s out of bound");
3953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(__t <= __w, "template argument substituting "
3963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "__t out of bound");
3973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(__l <= __w, "template argument substituting "
3983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "__l out of bound");
3993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(__w <= std::numeric_limits<_UIntType>::digits,
4003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument substituting __w out of bound");
4013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(__a <= (__detail::_Shift<_UIntType, __w>::__value - 1),
4023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument substituting __a out of bound");
4033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(__b <= (__detail::_Shift<_UIntType, __w>::__value - 1),
4043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument substituting __b out of bound");
4053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(__c <= (__detail::_Shift<_UIntType, __w>::__value - 1),
4063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument substituting __c out of bound");
4073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(__d <= (__detail::_Shift<_UIntType, __w>::__value - 1),
4083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument substituting __d out of bound");
4093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(__f <= (__detail::_Shift<_UIntType, __w>::__value - 1),
4103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument substituting __f out of bound");
4113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
4123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
4133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the generated random value. */
4143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _UIntType result_type;
4153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
4163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      // parameter values
4173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr size_t      word_size                 = __w;
4183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr size_t      state_size                = __n;
4193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr size_t      shift_size                = __m;
4203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr size_t      mask_bits                 = __r;
4213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type xor_mask                  = __a;
4223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr size_t      tempering_u               = __u;
4233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type tempering_d               = __d;
4243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr size_t      tempering_s               = __s;
4253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type tempering_b               = __b;
4263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr size_t      tempering_t               = __t;
4273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type tempering_c               = __c;
4283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr size_t      tempering_l               = __l;
4293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type initialization_multiplier = __f;
4303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type default_seed = 5489u;
4313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
4323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      // constructors and member function
4333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
4343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      mersenne_twister_engine(result_type __sd = default_seed)
4353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { seed(__sd); }
4363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
4373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
4383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Constructs a %mersenne_twister_engine random number generator
4393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        engine seeded from the seed sequence @p __q.
4403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
4413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __q the seed sequence.
4423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
4433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _Sseq, typename = typename
4443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        std::enable_if<!std::is_same<_Sseq, mersenne_twister_engine>::value>
4453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       ::type>
4463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        explicit
4473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        mersenne_twister_engine(_Sseq& __q)
4483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        { seed(__q); }
4493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
4503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
4513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      seed(result_type __sd = default_seed);
4523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
4533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _Sseq>
4543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	typename std::enable_if<std::is_class<_Sseq>::value>::type
4553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        seed(_Sseq& __q);
4563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
4573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
4583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Gets the smallest possible value in the output range.
4593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
4603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type
4613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min()
4623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return 0; };
4633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
4643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
4653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Gets the largest possible value in the output range.
4663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
4673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type
4683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max()
4693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return __detail::_Shift<_UIntType, __w>::__value - 1; }
4703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
4713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
4723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Discard a sequence of random numbers.
4733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
4743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
4753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      discard(unsigned long long __z)
4763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
4773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	for (; __z != 0ULL; --__z)
4783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  (*this)();
4793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
4803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
4813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
4823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      operator()();
4833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
4843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
4853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Compares two % mersenne_twister_engine random number generator
4863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        objects of the same type for equality.
4873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
4883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __lhs A % mersenne_twister_engine random number generator
4893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *              object.
4903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __rhs Another % mersenne_twister_engine random number
4913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *              generator object.
4923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
4933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns true if the infinite sequences of generated values
4943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *          would be equal, false otherwise.
4953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
4963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      friend bool
4973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      operator==(const mersenne_twister_engine& __lhs,
4983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		 const mersenne_twister_engine& __rhs)
4993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return (std::equal(__lhs._M_x, __lhs._M_x + state_size, __rhs._M_x)
5003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		&& __lhs._M_p == __rhs._M_p); }
5013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
5023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
5033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Inserts the current state of a % mersenne_twister_engine
5043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        random number generator engine @p __x into the output stream
5053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        @p __os.
5063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
5073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __os An output stream.
5083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A % mersenne_twister_engine random number generator
5093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *             engine.
5103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
5113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
5123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * an error state.
5133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
5143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UIntType1,
5153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       size_t __w1, size_t __n1,
5163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       size_t __m1, size_t __r1,
5173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       _UIntType1 __a1, size_t __u1,
5183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       _UIntType1 __d1, size_t __s1,
5193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       _UIntType1 __b1, size_t __t1,
5203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       _UIntType1 __c1, size_t __l1, _UIntType1 __f1,
5213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       typename _CharT, typename _Traits>
5223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
5233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
5243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const std::mersenne_twister_engine<_UIntType1, __w1, __n1,
5253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   __m1, __r1, __a1, __u1, __d1, __s1, __b1, __t1, __c1,
5263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   __l1, __f1>& __x);
5273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
5283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
5293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Extracts the current state of a % mersenne_twister_engine
5303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        random number generator engine @p __x from the input stream
5313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        @p __is.
5323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
5333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __is An input stream.
5343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A % mersenne_twister_engine random number generator
5353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *             engine.
5363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
5373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The input stream with the state of @p __x extracted or in
5383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * an error state.
5393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
5403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UIntType1,
5413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       size_t __w1, size_t __n1,
5423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       size_t __m1, size_t __r1,
5433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       _UIntType1 __a1, size_t __u1,
5443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       _UIntType1 __d1, size_t __s1,
5453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       _UIntType1 __b1, size_t __t1,
5463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       _UIntType1 __c1, size_t __l1, _UIntType1 __f1,
5473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       typename _CharT, typename _Traits>
5483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
5493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
5503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   std::mersenne_twister_engine<_UIntType1, __w1, __n1, __m1,
5513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   __r1, __a1, __u1, __d1, __s1, __b1, __t1, __c1,
5523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   __l1, __f1>& __x);
5533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
5543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
5553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _UIntType _M_x[state_size];
5563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      size_t    _M_p;
5573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
5583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
5593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
5603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Compares two % mersenne_twister_engine random number generator
5613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *        objects of the same type for inequality.
5623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
5633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __lhs A % mersenne_twister_engine random number generator
5643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *              object.
5653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __rhs Another % mersenne_twister_engine random number
5663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *              generator object.
5673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
5683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns true if the infinite sequences of generated values
5693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *          would be different, false otherwise.
5703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
5713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _UIntType, size_t __w,
5723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	   size_t __n, size_t __m, size_t __r,
5733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	   _UIntType __a, size_t __u, _UIntType __d, size_t __s,
5743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	   _UIntType __b, size_t __t,
5753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	   _UIntType __c, size_t __l, _UIntType __f>
5763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
5773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::mersenne_twister_engine<_UIntType, __w, __n, __m,
5783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>& __lhs,
5793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::mersenne_twister_engine<_UIntType, __w, __n, __m,
5803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>& __rhs)
5813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__lhs == __rhs); }
5823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
5833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
5843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
5853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief The Marsaglia-Zaman generator.
5863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
5873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * This is a model of a Generalized Fibonacci discrete random number
5883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * generator, sometimes referred to as the SWC generator.
5893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
5903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * A discrete random number generator that produces pseudorandom
5913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * numbers using:
5923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f[
5933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *     x_{i}\leftarrow(x_{i - s} - x_{i - r} - carry_{i-1}) \bmod m
5943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f]
5953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
5963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The size of the state is @f$r@f$
5973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * and the maximum period of the generator is @f$(m^r - m^s - 1)@f$.
5983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
5993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @var _M_x     The state of the generator.  This is a ring buffer.
6003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @var _M_carry The carry.
6013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @var _M_p     Current index of x(i - r).
6023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
6033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _UIntType, size_t __w, size_t __s, size_t __r>
6043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class subtract_with_carry_engine
6053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
6063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_unsigned<_UIntType>::value, "template argument "
6073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "substituting _UIntType not an unsigned integral type");
6083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(0u < __s && __s < __r,
6093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument substituting __s out of bounds");
6103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(0u < __w && __w <= std::numeric_limits<_UIntType>::digits,
6113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument substituting __w out of bounds");
6123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
6133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
6143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the generated random value. */
6153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _UIntType result_type;
6163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
6173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      // parameter values
6183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr size_t      word_size    = __w;
6193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr size_t      short_lag    = __s;
6203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr size_t      long_lag     = __r;
6213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type default_seed = 19780503u;
6223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
6233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
6243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Constructs an explicitly seeded % subtract_with_carry_engine
6253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        random number generator.
6263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
6273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
6283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      subtract_with_carry_engine(result_type __sd = default_seed)
6293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { seed(__sd); }
6303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
6313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
6323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Constructs a %subtract_with_carry_engine random number engine
6333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        seeded from the seed sequence @p __q.
6343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
6353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __q the seed sequence.
6363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
6373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _Sseq, typename = typename
6383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        std::enable_if<!std::is_same<_Sseq, subtract_with_carry_engine>::value>
6393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       ::type>
6403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        explicit
6413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        subtract_with_carry_engine(_Sseq& __q)
6423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        { seed(__q); }
6433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
6443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
6453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Seeds the initial state @f$x_0@f$ of the random number
6463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        generator.
6473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
6483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * N1688[4.19] modifies this as follows.  If @p __value == 0,
6493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * sets value to 19780503.  In any case, with a linear
6503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * congruential generator lcg(i) having parameters @f$ m_{lcg} =
6513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * 2147483563, a_{lcg} = 40014, c_{lcg} = 0, and lcg(0) = value
6523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @f$, sets @f$ x_{-r} \dots x_{-1} @f$ to @f$ lcg(1) \bmod m
6533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * \dots lcg(r) \bmod m @f$ respectively.  If @f$ x_{-1} = 0 @f$
6543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * set carry to 1, otherwise sets carry to 0.
6553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
6563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
6573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      seed(result_type __sd = default_seed);
6583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
6593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
6603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Seeds the initial state @f$x_0@f$ of the
6613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * % subtract_with_carry_engine random number generator.
6623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
6633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _Sseq>
6643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	typename std::enable_if<std::is_class<_Sseq>::value>::type
6653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        seed(_Sseq& __q);
6663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
6673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
6683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Gets the inclusive minimum value of the range of random
6693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * integers returned by this generator.
6703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
6713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type
6723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min()
6733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return 0; }
6743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
6753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
6763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Gets the inclusive maximum value of the range of random
6773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * integers returned by this generator.
6783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
6793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type
6803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max()
6813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return __detail::_Shift<_UIntType, __w>::__value - 1; }
6823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
6833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
6843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Discard a sequence of random numbers.
6853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
6863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
6873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      discard(unsigned long long __z)
6883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
6893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	for (; __z != 0ULL; --__z)
6903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  (*this)();
6913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
6923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
6933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
6943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Gets the next random number in the sequence.
6953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
6963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
6973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      operator()();
6983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
6993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
7003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Compares two % subtract_with_carry_engine random number
7013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        generator objects of the same type for equality.
7023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
7033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __lhs A % subtract_with_carry_engine random number generator
7043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *              object.
7053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __rhs Another % subtract_with_carry_engine random number
7063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *              generator object.
7073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
7083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns true if the infinite sequences of generated values
7093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *          would be equal, false otherwise.
7103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      */
7113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      friend bool
7123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      operator==(const subtract_with_carry_engine& __lhs,
7133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		 const subtract_with_carry_engine& __rhs)
7143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return (std::equal(__lhs._M_x, __lhs._M_x + long_lag, __rhs._M_x)
7153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		&& __lhs._M_carry == __rhs._M_carry
7163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		&& __lhs._M_p == __rhs._M_p); }
7173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
7183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
7193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Inserts the current state of a % subtract_with_carry_engine
7203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        random number generator engine @p __x into the output stream
7213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        @p __os.
7223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
7233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __os An output stream.
7243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A % subtract_with_carry_engine random number generator
7253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *             engine.
7263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
7273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
7283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * an error state.
7293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
7303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UIntType1, size_t __w1, size_t __s1, size_t __r1,
7313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       typename _CharT, typename _Traits>
7323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
7333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>&,
7343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const std::subtract_with_carry_engine<_UIntType1, __w1,
7353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   __s1, __r1>&);
7363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
7373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
7383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Extracts the current state of a % subtract_with_carry_engine
7393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        random number generator engine @p __x from the input stream
7403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        @p __is.
7413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
7423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __is An input stream.
7433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A % subtract_with_carry_engine random number generator
7443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *             engine.
7453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
7463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The input stream with the state of @p __x extracted or in
7473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * an error state.
7483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
7493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UIntType1, size_t __w1, size_t __s1, size_t __r1,
7503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       typename _CharT, typename _Traits>
7513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
7523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>&,
7533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   std::subtract_with_carry_engine<_UIntType1, __w1,
7543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   __s1, __r1>&);
7553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
7563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
7573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _UIntType  _M_x[long_lag];
7583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _UIntType  _M_carry;
7593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      size_t     _M_p;
7603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
7613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
7623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
7633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Compares two % subtract_with_carry_engine random number
7643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *        generator objects of the same type for inequality.
7653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
7663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __lhs A % subtract_with_carry_engine random number generator
7673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *              object.
7683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __rhs Another % subtract_with_carry_engine random number
7693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *              generator object.
7703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
7713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns true if the infinite sequences of generated values
7723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *          would be different, false otherwise.
7733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
7743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _UIntType, size_t __w, size_t __s, size_t __r>
7753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
7763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::subtract_with_carry_engine<_UIntType, __w,
7773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       __s, __r>& __lhs,
7783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::subtract_with_carry_engine<_UIntType, __w,
7793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       __s, __r>& __rhs)
7803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__lhs == __rhs); }
7813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
7823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
7833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
7843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * Produces random numbers from some base engine by discarding blocks of
7853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * data.
7863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
7873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * 0 <= @p __r <= @p __p
7883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
7893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RandomNumberEngine, size_t __p, size_t __r>
7903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class discard_block_engine
7913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
7923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(1 <= __r && __r <= __p,
7933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument substituting __r out of bounds");
7943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
7953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
7963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the generated random value. */
7973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef typename _RandomNumberEngine::result_type result_type;
7983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
7993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      // parameter values
8003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr size_t block_size = __p;
8013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr size_t used_block = __r;
8023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
8033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
8043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Constructs a default %discard_block_engine engine.
8053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
8063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * The underlying engine is default constructed as well.
8073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
8083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      discard_block_engine()
8093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_b(), _M_n(0) { }
8103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
8113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
8123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Copy constructs a %discard_block_engine engine.
8133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
8143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * Copies an existing base class random number generator.
8153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __rng An existing (base class) engine object.
8163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
8173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
8183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      discard_block_engine(const _RandomNumberEngine& __rng)
8193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_b(__rng), _M_n(0) { }
8203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
8213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
8223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Move constructs a %discard_block_engine engine.
8233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
8243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * Copies an existing base class random number generator.
8253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __rng An existing (base class) engine object.
8263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
8273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
8283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      discard_block_engine(_RandomNumberEngine&& __rng)
8293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_b(std::move(__rng)), _M_n(0) { }
8303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
8313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
8323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Seed constructs a %discard_block_engine engine.
8333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
8343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * Constructs the underlying generator engine seeded with @p __s.
8353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __s A seed value for the base class engine.
8363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
8373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
8383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      discard_block_engine(result_type __s)
8393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_b(__s), _M_n(0) { }
8403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
8413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
8423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Generator construct a %discard_block_engine engine.
8433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
8443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __q A seed sequence.
8453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
8463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _Sseq, typename = typename
8473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	std::enable_if<!std::is_same<_Sseq, discard_block_engine>::value
8483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		       && !std::is_same<_Sseq, _RandomNumberEngine>::value>
8493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       ::type>
8503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        explicit
8513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        discard_block_engine(_Sseq& __q)
8523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_b(__q), _M_n(0)
8533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        { }
8543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
8553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
8563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Reseeds the %discard_block_engine object with the default
8573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        seed for the underlying base class generator engine.
8583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
8593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
8603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      seed()
8613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
8623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_M_b.seed();
8633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_M_n = 0;
8643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
8653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
8663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
8673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Reseeds the %discard_block_engine object with the default
8683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        seed for the underlying base class generator engine.
8693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
8703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
8713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      seed(result_type __s)
8723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
8733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_M_b.seed(__s);
8743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_M_n = 0;
8753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
8763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
8773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
8783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Reseeds the %discard_block_engine object with the given seed
8793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        sequence.
8803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __q A seed generator function.
8813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
8823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _Sseq>
8833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        void
8843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        seed(_Sseq& __q)
8853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        {
8863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  _M_b.seed(__q);
8873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  _M_n = 0;
8883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	}
8893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
8903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
8913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Gets a const reference to the underlying generator engine
8923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        object.
8933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
8943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      const _RandomNumberEngine&
8953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      base() const noexcept
8963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_b; }
8973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
8983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
8993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Gets the minimum value in the generated random number range.
9003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
9013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type
9023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min()
9033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _RandomNumberEngine::min(); }
9043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
9053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
9063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Gets the maximum value in the generated random number range.
9073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
9083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type
9093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max()
9103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _RandomNumberEngine::max(); }
9113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
9123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
9133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Discard a sequence of random numbers.
9143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
9153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
9163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      discard(unsigned long long __z)
9173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
9183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	for (; __z != 0ULL; --__z)
9193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  (*this)();
9203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
9213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
9223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
9233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Gets the next value in the generated random number sequence.
9243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
9253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
9263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      operator()();
9273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
9283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
9293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Compares two %discard_block_engine random number generator
9303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        objects of the same type for equality.
9313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
9323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __lhs A %discard_block_engine random number generator object.
9333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __rhs Another %discard_block_engine random number generator
9343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *              object.
9353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
9363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns true if the infinite sequences of generated values
9373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *          would be equal, false otherwise.
9383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
9393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      friend bool
9403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      operator==(const discard_block_engine& __lhs,
9413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		 const discard_block_engine& __rhs)
9423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return __lhs._M_b == __rhs._M_b && __lhs._M_n == __rhs._M_n; }
9433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
9443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
9453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Inserts the current state of a %discard_block_engine random
9463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        number generator engine @p __x into the output stream
9473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        @p __os.
9483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
9493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __os An output stream.
9503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A %discard_block_engine random number generator engine.
9513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
9523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
9533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * an error state.
9543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
9553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _RandomNumberEngine1, size_t __p1, size_t __r1,
9563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       typename _CharT, typename _Traits>
9573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
9583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
9593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const std::discard_block_engine<_RandomNumberEngine1,
9603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   __p1, __r1>& __x);
9613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
9623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
9633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Extracts the current state of a % subtract_with_carry_engine
9643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        random number generator engine @p __x from the input stream
9653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        @p __is.
9663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
9673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __is An input stream.
9683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A %discard_block_engine random number generator engine.
9693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
9703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The input stream with the state of @p __x extracted or in
9713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * an error state.
9723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
9733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _RandomNumberEngine1, size_t __p1, size_t __r1,
9743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       typename _CharT, typename _Traits>
9753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
9763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
9773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   std::discard_block_engine<_RandomNumberEngine1,
9783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   __p1, __r1>& __x);
9793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
9803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
9813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _RandomNumberEngine _M_b;
9823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      size_t _M_n;
9833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
9843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
9853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
9863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Compares two %discard_block_engine random number generator
9873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *        objects of the same type for inequality.
9883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
9893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __lhs A %discard_block_engine random number generator object.
9903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __rhs Another %discard_block_engine random number generator
9913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *              object.
9923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
9933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns true if the infinite sequences of generated values
9943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *          would be different, false otherwise.
9953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
9963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RandomNumberEngine, size_t __p, size_t __r>
9973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
9983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::discard_block_engine<_RandomNumberEngine, __p,
9993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       __r>& __lhs,
10003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::discard_block_engine<_RandomNumberEngine, __p,
10013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       __r>& __rhs)
10023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__lhs == __rhs); }
10033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
10043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
10053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
10063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * Produces random numbers by combining random numbers from some base
10073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * engine to produce random numbers with a specifies number of bits @p __w.
10083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
10093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RandomNumberEngine, size_t __w, typename _UIntType>
10103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class independent_bits_engine
10113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
10123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_unsigned<_UIntType>::value, "template argument "
10133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "substituting _UIntType not an unsigned integral type");
10143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(0u < __w && __w <= std::numeric_limits<_UIntType>::digits,
10153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument substituting __w out of bounds");
10163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
10173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
10183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the generated random value. */
10193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _UIntType result_type;
10203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
10213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
10223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Constructs a default %independent_bits_engine engine.
10233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
10243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * The underlying engine is default constructed as well.
10253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
10263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      independent_bits_engine()
10273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_b() { }
10283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
10293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
10303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Copy constructs a %independent_bits_engine engine.
10313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
10323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * Copies an existing base class random number generator.
10333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __rng An existing (base class) engine object.
10343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
10353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
10363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      independent_bits_engine(const _RandomNumberEngine& __rng)
10373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_b(__rng) { }
10383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
10393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
10403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Move constructs a %independent_bits_engine engine.
10413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
10423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * Copies an existing base class random number generator.
10433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __rng An existing (base class) engine object.
10443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
10453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
10463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      independent_bits_engine(_RandomNumberEngine&& __rng)
10473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_b(std::move(__rng)) { }
10483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
10493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
10503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Seed constructs a %independent_bits_engine engine.
10513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
10523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * Constructs the underlying generator engine seeded with @p __s.
10533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __s A seed value for the base class engine.
10543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
10553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
10563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      independent_bits_engine(result_type __s)
10573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_b(__s) { }
10583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
10593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
10603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Generator construct a %independent_bits_engine engine.
10613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
10623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __q A seed sequence.
10633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
10643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _Sseq, typename = typename
10653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	std::enable_if<!std::is_same<_Sseq, independent_bits_engine>::value
10663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		       && !std::is_same<_Sseq, _RandomNumberEngine>::value>
10673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh               ::type>
10683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        explicit
10693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        independent_bits_engine(_Sseq& __q)
10703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        : _M_b(__q)
10713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        { }
10723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
10733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
10743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Reseeds the %independent_bits_engine object with the default
10753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        seed for the underlying base class generator engine.
10763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
10773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
10783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      seed()
10793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_b.seed(); }
10803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
10813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
10823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Reseeds the %independent_bits_engine object with the default
10833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        seed for the underlying base class generator engine.
10843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
10853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
10863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      seed(result_type __s)
10873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_b.seed(__s); }
10883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
10893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
10903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Reseeds the %independent_bits_engine object with the given
10913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        seed sequence.
10923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __q A seed generator function.
10933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
10943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _Sseq>
10953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        void
10963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        seed(_Sseq& __q)
10973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        { _M_b.seed(__q); }
10983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
10993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
11003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Gets a const reference to the underlying generator engine
11013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        object.
11023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
11033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      const _RandomNumberEngine&
11043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      base() const noexcept
11053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_b; }
11063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
11073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
11083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Gets the minimum value in the generated random number range.
11093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
11103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type
11113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min()
11123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return 0U; }
11133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
11143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
11153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Gets the maximum value in the generated random number range.
11163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
11173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type
11183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max()
11193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return __detail::_Shift<_UIntType, __w>::__value - 1; }
11203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
11213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
11223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Discard a sequence of random numbers.
11233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
11243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
11253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      discard(unsigned long long __z)
11263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
11273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	for (; __z != 0ULL; --__z)
11283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  (*this)();
11293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
11303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
11313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
11323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Gets the next value in the generated random number sequence.
11333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
11343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
11353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      operator()();
11363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
11373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
11383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Compares two %independent_bits_engine random number generator
11393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * objects of the same type for equality.
11403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
11413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __lhs A %independent_bits_engine random number generator
11423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *              object.
11433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __rhs Another %independent_bits_engine random number generator
11443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *              object.
11453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
11463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns true if the infinite sequences of generated values
11473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *          would be equal, false otherwise.
11483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
11493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      friend bool
11503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      operator==(const independent_bits_engine& __lhs,
11513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		 const independent_bits_engine& __rhs)
11523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return __lhs._M_b == __rhs._M_b; }
11533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
11543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
11553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Extracts the current state of a % subtract_with_carry_engine
11563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        random number generator engine @p __x from the input stream
11573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        @p __is.
11583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
11593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __is An input stream.
11603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A %independent_bits_engine random number generator
11613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *             engine.
11623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
11633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The input stream with the state of @p __x extracted or in
11643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *          an error state.
11653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
11663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _CharT, typename _Traits>
11673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
11683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
11693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   std::independent_bits_engine<_RandomNumberEngine,
11703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   __w, _UIntType>& __x)
11713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{
11723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  __is >> __x._M_b;
11733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  return __is;
11743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	}
11753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
11763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
11773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _RandomNumberEngine _M_b;
11783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
11793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
11803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
11813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Compares two %independent_bits_engine random number generator
11823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * objects of the same type for inequality.
11833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
11843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __lhs A %independent_bits_engine random number generator
11853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *              object.
11863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __rhs Another %independent_bits_engine random number generator
11873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *              object.
11883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
11893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns true if the infinite sequences of generated values
11903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *          would be different, false otherwise.
11913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
11923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RandomNumberEngine, size_t __w, typename _UIntType>
11933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
11943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::independent_bits_engine<_RandomNumberEngine, __w,
11953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       _UIntType>& __lhs,
11963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::independent_bits_engine<_RandomNumberEngine, __w,
11973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       _UIntType>& __rhs)
11983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__lhs == __rhs); }
11993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
12003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
12013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Inserts the current state of a %independent_bits_engine random
12023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *        number generator engine @p __x into the output stream @p __os.
12033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
12043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __os An output stream.
12053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __x  A %independent_bits_engine random number generator engine.
12063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
12073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns The output stream with the state of @p __x inserted or in
12083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *          an error state.
12093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
12103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RandomNumberEngine, size_t __w, typename _UIntType,
12113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	   typename _CharT, typename _Traits>
12123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    std::basic_ostream<_CharT, _Traits>&
12133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
12143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::independent_bits_engine<_RandomNumberEngine,
12153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       __w, _UIntType>& __x)
12163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
12173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      __os << __x.base();
12183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      return __os;
12193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    }
12203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
12213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
12223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
12233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Produces random numbers by combining random numbers from some
12243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * base engine to produce random numbers with a specifies number of bits
12253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @p __w.
12263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
12273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RandomNumberEngine, size_t __k>
12283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class shuffle_order_engine
12293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
12303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(1u <= __k, "template argument substituting "
12313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "__k out of bound");
12323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
12333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
12343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the generated random value. */
12353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef typename _RandomNumberEngine::result_type result_type;
12363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
12373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr size_t table_size = __k;
12383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
12393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
12403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Constructs a default %shuffle_order_engine engine.
12413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
12423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * The underlying engine is default constructed as well.
12433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
12443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      shuffle_order_engine()
12453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_b()
12463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_initialize(); }
12473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
12483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
12493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Copy constructs a %shuffle_order_engine engine.
12503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
12513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * Copies an existing base class random number generator.
12523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __rng An existing (base class) engine object.
12533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
12543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
12553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      shuffle_order_engine(const _RandomNumberEngine& __rng)
12563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_b(__rng)
12573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_initialize(); }
12583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
12593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
12603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Move constructs a %shuffle_order_engine engine.
12613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
12623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * Copies an existing base class random number generator.
12633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __rng An existing (base class) engine object.
12643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
12653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
12663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      shuffle_order_engine(_RandomNumberEngine&& __rng)
12673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_b(std::move(__rng))
12683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_initialize(); }
12693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
12703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
12713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Seed constructs a %shuffle_order_engine engine.
12723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
12733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * Constructs the underlying generator engine seeded with @p __s.
12743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __s A seed value for the base class engine.
12753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
12763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
12773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      shuffle_order_engine(result_type __s)
12783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_b(__s)
12793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_initialize(); }
12803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
12813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
12823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Generator construct a %shuffle_order_engine engine.
12833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
12843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __q A seed sequence.
12853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
12863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _Sseq, typename = typename
12873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	std::enable_if<!std::is_same<_Sseq, shuffle_order_engine>::value
12883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		       && !std::is_same<_Sseq, _RandomNumberEngine>::value>
12893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       ::type>
12903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        explicit
12913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        shuffle_order_engine(_Sseq& __q)
12923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        : _M_b(__q)
12933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        { _M_initialize(); }
12943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
12953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
12963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Reseeds the %shuffle_order_engine object with the default seed
12973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh                for the underlying base class generator engine.
12983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
12993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
13003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      seed()
13013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
13023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_M_b.seed();
13033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_M_initialize();
13043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
13053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
13063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
13073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Reseeds the %shuffle_order_engine object with the default seed
13083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        for the underlying base class generator engine.
13093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
13103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
13113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      seed(result_type __s)
13123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
13133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_M_b.seed(__s);
13143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_M_initialize();
13153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
13163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
13173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
13183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Reseeds the %shuffle_order_engine object with the given seed
13193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        sequence.
13203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __q A seed generator function.
13213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
13223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _Sseq>
13233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        void
13243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        seed(_Sseq& __q)
13253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        {
13263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  _M_b.seed(__q);
13273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  _M_initialize();
13283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	}
13293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
13303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
13313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * Gets a const reference to the underlying generator engine object.
13323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
13333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      const _RandomNumberEngine&
13343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      base() const noexcept
13353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_b; }
13363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
13373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
13383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * Gets the minimum value in the generated random number range.
13393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
13403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type
13413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min()
13423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _RandomNumberEngine::min(); }
13433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
13443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
13453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * Gets the maximum value in the generated random number range.
13463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
13473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static constexpr result_type
13483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max()
13493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _RandomNumberEngine::max(); }
13503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
13513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
13523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * Discard a sequence of random numbers.
13533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
13543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
13553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      discard(unsigned long long __z)
13563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
13573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	for (; __z != 0ULL; --__z)
13583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  (*this)();
13593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
13603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
13613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
13623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * Gets the next value in the generated random number sequence.
13633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
13643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
13653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      operator()();
13663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
13673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
13683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * Compares two %shuffle_order_engine random number generator objects
13693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * of the same type for equality.
13703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
13713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __lhs A %shuffle_order_engine random number generator object.
13723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __rhs Another %shuffle_order_engine random number generator
13733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *              object.
13743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
13753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns true if the infinite sequences of generated values
13763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *          would be equal, false otherwise.
13773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      */
13783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      friend bool
13793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      operator==(const shuffle_order_engine& __lhs,
13803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		 const shuffle_order_engine& __rhs)
13813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return (__lhs._M_b == __rhs._M_b
13823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		&& std::equal(__lhs._M_v, __lhs._M_v + __k, __rhs._M_v)
13833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		&& __lhs._M_y == __rhs._M_y); }
13843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
13853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
13863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Inserts the current state of a %shuffle_order_engine random
13873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        number generator engine @p __x into the output stream
13883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	@p __os.
13893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
13903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __os An output stream.
13913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A %shuffle_order_engine random number generator engine.
13923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
13933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
13943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * an error state.
13953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
13963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _RandomNumberEngine1, size_t __k1,
13973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       typename _CharT, typename _Traits>
13983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
13993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
14003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const std::shuffle_order_engine<_RandomNumberEngine1,
14013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   __k1>& __x);
14023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
14033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
14043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Extracts the current state of a % subtract_with_carry_engine
14053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        random number generator engine @p __x from the input stream
14063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        @p __is.
14073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
14083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __is An input stream.
14093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A %shuffle_order_engine random number generator engine.
14103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
14113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The input stream with the state of @p __x extracted or in
14123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * an error state.
14133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
14143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _RandomNumberEngine1, size_t __k1,
14153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       typename _CharT, typename _Traits>
14163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
14173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
14183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   std::shuffle_order_engine<_RandomNumberEngine1, __k1>& __x);
14193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
14203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
14213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void _M_initialize()
14223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
14233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	for (size_t __i = 0; __i < __k; ++__i)
14243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  _M_v[__i] = _M_b();
14253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_M_y = _M_b();
14263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
14273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
14283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _RandomNumberEngine _M_b;
14293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type _M_v[__k];
14303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type _M_y;
14313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
14323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
14333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
14343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * Compares two %shuffle_order_engine random number generator objects
14353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * of the same type for inequality.
14363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
14373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __lhs A %shuffle_order_engine random number generator object.
14383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __rhs Another %shuffle_order_engine random number generator
14393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *              object.
14403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
14413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns true if the infinite sequences of generated values
14423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *          would be different, false otherwise.
14433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
14443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RandomNumberEngine, size_t __k>
14453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
14463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::shuffle_order_engine<_RandomNumberEngine,
14473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       __k>& __lhs,
14483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::shuffle_order_engine<_RandomNumberEngine,
14493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       __k>& __rhs)
14503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__lhs == __rhs); }
14513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
14523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
14533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
14543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The classic Minimum Standard rand0 of Lewis, Goodman, and Miller.
14553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
14563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  typedef linear_congruential_engine<uint_fast32_t, 16807UL, 0UL, 2147483647UL>
14573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  minstd_rand0;
14583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
14593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
14603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * An alternative LCR (Lehmer Generator function).
14613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
14623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  typedef linear_congruential_engine<uint_fast32_t, 48271UL, 0UL, 2147483647UL>
14633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  minstd_rand;
14643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
14653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
14663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The classic Mersenne Twister.
14673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
14683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * Reference:
14693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * M. Matsumoto and T. Nishimura, Mersenne Twister: A 623-Dimensionally
14703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * Equidistributed Uniform Pseudo-Random Number Generator, ACM Transactions
14713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * on Modeling and Computer Simulation, Vol. 8, No. 1, January 1998, pp 3-30.
14723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
14733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  typedef mersenne_twister_engine<
14743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    uint_fast32_t,
14753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    32, 624, 397, 31,
14763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    0x9908b0dfUL, 11,
14773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    0xffffffffUL, 7,
14783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    0x9d2c5680UL, 15,
14793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    0xefc60000UL, 18, 1812433253UL> mt19937;
14803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
14813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
14823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * An alternative Mersenne Twister.
14833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
14843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  typedef mersenne_twister_engine<
14853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    uint_fast64_t,
14863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    64, 312, 156, 31,
14873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    0xb5026f5aa96619e9ULL, 29,
14883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    0x5555555555555555ULL, 17,
14893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    0x71d67fffeda60000ULL, 37,
14903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    0xfff7eee000000000ULL, 43,
14913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    6364136223846793005ULL> mt19937_64;
14923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
14933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  typedef subtract_with_carry_engine<uint_fast32_t, 24, 10, 24>
14943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    ranlux24_base;
14953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
14963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  typedef subtract_with_carry_engine<uint_fast64_t, 48, 5, 12>
14973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    ranlux48_base;
14983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
14993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24;
15003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
15013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48;
15023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
15033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  typedef shuffle_order_engine<minstd_rand0, 256> knuth_b;
15043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
15053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  typedef minstd_rand0 default_random_engine;
15063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
15073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
15083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * A standard interface to a platform-specific non-deterministic
15093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * random number generator (if any are available).
15103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
15113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  class random_device
15123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  {
15133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  public:
15143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    /** The type of the generated random value. */
15153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    typedef unsigned int result_type;
15163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
15173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    // constructors, destructors and member functions
15183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
15193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#ifdef _GLIBCXX_USE_RANDOM_TR1
15203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
15213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    explicit
15223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    random_device(const std::string& __token = "/dev/urandom")
15233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
15243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      if ((__token != "/dev/urandom" && __token != "/dev/random")
15253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  || !(_M_file = std::fopen(__token.c_str(), "rb")))
15263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	std::__throw_runtime_error(__N("random_device::"
15273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh				       "random_device(const std::string&)"));
15283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    }
15293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
15303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    ~random_device()
15313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { std::fclose(_M_file); }
15323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
15333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#else
15343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
15353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    explicit
15363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    random_device(const std::string& __token = "mt19937")
15373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    : _M_mt(_M_strtoul(__token)) { }
15383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
15393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  private:
15403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    static unsigned long
15413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    _M_strtoul(const std::string& __str)
15423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
15433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      unsigned long __ret = 5489UL;
15443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      if (__str != "mt19937")
15453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{
15463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  const char* __nptr = __str.c_str();
15473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  char* __endptr;
15483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  __ret = std::strtoul(__nptr, &__endptr, 0);
15493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  if (*__nptr == '\0' || *__endptr != '\0')
15503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	    std::__throw_runtime_error(__N("random_device::_M_strtoul"
15513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh					   "(const std::string&)"));
15523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	}
15533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      return __ret;
15543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    }
15553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
15563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  public:
15573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
15583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#endif
15593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
15603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    static constexpr result_type
15613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    min()
15623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return std::numeric_limits<result_type>::min(); }
15633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
15643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    static constexpr result_type
15653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    max()
15663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return std::numeric_limits<result_type>::max(); }
15673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
15683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    double
15693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    entropy() const noexcept
15703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return 0.0; }
15713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
15723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    result_type
15733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator()()
15743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
15753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#ifdef _GLIBCXX_USE_RANDOM_TR1
15763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type __ret;
15773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      std::fread(reinterpret_cast<void*>(&__ret), sizeof(result_type),
15783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		 1, _M_file);
15793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      return __ret;
15803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#else
15813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      return _M_mt();
15823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#endif
15833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    }
15843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
15853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    // No copy functions.
15863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    random_device(const random_device&) = delete;
15873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    void operator=(const random_device&) = delete;
15883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
15893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  private:
15903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
15913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#ifdef _GLIBCXX_USE_RANDOM_TR1
15923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    FILE*        _M_file;
15933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#else
15943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    mt19937      _M_mt;
15953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#endif
15963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  };
15973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
15983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /* @} */ // group random_generators
15993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
16003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
16013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @addtogroup random_distributions Random Number Distributions
16023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @ingroup random
16033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @{
16043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
16053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
16063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
16073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @addtogroup random_distributions_uniform Uniform Distributions
16083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @ingroup random_distributions
16093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @{
16103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
16113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
16123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
16133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Uniform discrete distribution for random numbers.
16143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * A discrete random distribution on the range @f$[min, max]@f$ with equal
16153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * probability throughout the range.
16163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
16173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _IntType = int>
16183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class uniform_int_distribution
16193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
16203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_integral<_IntType>::value,
16213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument not an integral type");
16223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
16233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
16243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the range of the distribution. */
16253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _IntType result_type;
16263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** Parameter type. */
16273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct param_type
16283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
16293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	typedef uniform_int_distribution<_IntType> distribution_type;
16303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
16313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	explicit
16323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type(_IntType __a = 0,
16333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   _IntType __b = std::numeric_limits<_IntType>::max())
16343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_a(__a), _M_b(__b)
16353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{
16363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  _GLIBCXX_DEBUG_ASSERT(_M_a <= _M_b);
16373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	}
16383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
16393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
16403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	a() const
16413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_a; }
16423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
16433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
16443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	b() const
16453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_b; }
16463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
16473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend bool
16483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
16493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
16503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
16513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      private:
16523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_IntType _M_a;
16533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_IntType _M_b;
16543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      };
16553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
16563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
16573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
16583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Constructs a uniform distribution object.
16593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
16603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
16613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      uniform_int_distribution(_IntType __a = 0,
16623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh			   _IntType __b = std::numeric_limits<_IntType>::max())
16633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__a, __b)
16643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
16653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
16663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
16673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      uniform_int_distribution(const param_type& __p)
16683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__p)
16693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
16703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
16713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
16723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Resets the distribution state.
16733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
16743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * Does nothing for the uniform integer distribution.
16753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
16763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
16773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      reset() { }
16783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
16793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
16803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      a() const
16813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.a(); }
16823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
16833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
16843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      b() const
16853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.b(); }
16863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
16873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
16883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the parameter set of the distribution.
16893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
16903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type
16913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param() const
16923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param; }
16933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
16943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
16953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Sets the parameter set of the distribution.
16963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __param The new parameter set of the distribution.
16973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
16983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
16993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param(const param_type& __param)
17003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_param = __param; }
17013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
17023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
17033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the inclusive lower bound of the distribution range.
17043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
17053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
17063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min() const
17073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return this->a(); }
17083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
17093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
17103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the inclusive upper bound of the distribution range.
17113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
17123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
17133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max() const
17143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return this->b(); }
17153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
17163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
17173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Generating functions.
17183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
17193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
17203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
17213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
17223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        { return this->operator()(__urng, this->param()); }
17233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
17243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
17253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
17263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
17273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const param_type& __p);
17283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
17293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type _M_param;
17303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
17313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
17323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
17333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Return true if two uniform integer distributions have
17343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *        the same parameters.
17353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
17363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _IntType>
17373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
17383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator==(const std::uniform_int_distribution<_IntType>& __d1,
17393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::uniform_int_distribution<_IntType>& __d2)
17403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return __d1.param() == __d2.param(); }
17413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
17423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
17433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Return true if two uniform integer distributions have
17443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *        different parameters.
17453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
17463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _IntType>
17473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
17483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::uniform_int_distribution<_IntType>& __d1,
17493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::uniform_int_distribution<_IntType>& __d2)
17503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__d1 == __d2); }
17513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
17523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
17533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Inserts a %uniform_int_distribution random number
17543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *        distribution @p __x into the output stream @p os.
17553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
17563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __os An output stream.
17573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __x  A %uniform_int_distribution random number distribution.
17583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
17593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns The output stream with the state of @p __x inserted or in
17603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * an error state.
17613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
17623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _IntType, typename _CharT, typename _Traits>
17633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    std::basic_ostream<_CharT, _Traits>&
17643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator<<(std::basic_ostream<_CharT, _Traits>&,
17653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::uniform_int_distribution<_IntType>&);
17663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
17673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
17683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Extracts a %uniform_int_distribution random number distribution
17693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @p __x from the input stream @p __is.
17703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
17713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __is An input stream.
17723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __x  A %uniform_int_distribution random number generator engine.
17733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
17743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns The input stream with @p __x extracted or in an error state.
17753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
17763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _IntType, typename _CharT, typename _Traits>
17773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    std::basic_istream<_CharT, _Traits>&
17783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator>>(std::basic_istream<_CharT, _Traits>&,
17793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       std::uniform_int_distribution<_IntType>&);
17803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
17813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
17823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
17833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Uniform continuous distribution for random numbers.
17843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
17853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * A continuous random distribution on the range [min, max) with equal
17863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * probability throughout the range.  The URNG should be real-valued and
17873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * deliver number in the range [0, 1).
17883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
17893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType = double>
17903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class uniform_real_distribution
17913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
17923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
17933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument not a floating point type");
17943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
17953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
17963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the range of the distribution. */
17973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _RealType result_type;
17983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** Parameter type. */
17993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct param_type
18003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
18013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	typedef uniform_real_distribution<_RealType> distribution_type;
18023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
18033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	explicit
18043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type(_RealType __a = _RealType(0),
18053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   _RealType __b = _RealType(1))
18063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_a(__a), _M_b(__b)
18073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{
18083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  _GLIBCXX_DEBUG_ASSERT(_M_a <= _M_b);
18093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	}
18103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
18113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
18123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	a() const
18133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_a; }
18143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
18153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
18163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	b() const
18173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_b; }
18183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
18193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend bool
18203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
18213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
18223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
18233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      private:
18243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType _M_a;
18253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType _M_b;
18263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      };
18273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
18283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
18293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
18303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Constructs a uniform_real_distribution object.
18313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
18323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __a [IN]  The lower bound of the distribution.
18333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __b [IN]  The upper bound of the distribution.
18343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
18353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
18363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      uniform_real_distribution(_RealType __a = _RealType(0),
18373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh				_RealType __b = _RealType(1))
18383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__a, __b)
18393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
18403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
18413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
18423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      uniform_real_distribution(const param_type& __p)
18433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__p)
18443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
18453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
18463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
18473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Resets the distribution state.
18483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
18493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * Does nothing for the uniform real distribution.
18503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
18513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
18523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      reset() { }
18533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
18543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
18553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      a() const
18563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.a(); }
18573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
18583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
18593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      b() const
18603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.b(); }
18613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
18623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
18633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the parameter set of the distribution.
18643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
18653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type
18663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param() const
18673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param; }
18683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
18693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
18703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Sets the parameter set of the distribution.
18713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __param The new parameter set of the distribution.
18723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
18733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
18743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param(const param_type& __param)
18753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_param = __param; }
18763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
18773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
18783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the inclusive lower bound of the distribution range.
18793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
18803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
18813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min() const
18823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return this->a(); }
18833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
18843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
18853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the inclusive upper bound of the distribution range.
18863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
18873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
18883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max() const
18893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return this->b(); }
18903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
18913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
18923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Generating functions.
18933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
18943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
18953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
18963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
18973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        { return this->operator()(__urng, this->param()); }
18983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
18993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
19003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
19013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
19023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const param_type& __p)
19033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{
19043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
19053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	    __aurng(__urng);
19063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  return (__aurng() * (__p.b() - __p.a())) + __p.a();
19073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	}
19083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
19093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
19103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type _M_param;
19113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
19123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
19133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
19143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Return true if two uniform real distributions have
19153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *        the same parameters.
19163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
19173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _IntType>
19183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
19193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator==(const std::uniform_real_distribution<_IntType>& __d1,
19203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::uniform_real_distribution<_IntType>& __d2)
19213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return __d1.param() == __d2.param(); }
19223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
19233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
19243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Return true if two uniform real distributions have
19253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *        different parameters.
19263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
19273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _IntType>
19283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
19293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::uniform_real_distribution<_IntType>& __d1,
19303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::uniform_real_distribution<_IntType>& __d2)
19313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__d1 == __d2); }
19323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
19333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
19343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Inserts a %uniform_real_distribution random number
19353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *        distribution @p __x into the output stream @p __os.
19363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
19373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __os An output stream.
19383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __x  A %uniform_real_distribution random number distribution.
19393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
19403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns The output stream with the state of @p __x inserted or in
19413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *          an error state.
19423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
19433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType, typename _CharT, typename _Traits>
19443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    std::basic_ostream<_CharT, _Traits>&
19453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator<<(std::basic_ostream<_CharT, _Traits>&,
19463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::uniform_real_distribution<_RealType>&);
19473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
19483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
19493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Extracts a %uniform_real_distribution random number distribution
19503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @p __x from the input stream @p __is.
19513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
19523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __is An input stream.
19533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __x  A %uniform_real_distribution random number generator engine.
19543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
19553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns The input stream with @p __x extracted or in an error state.
19563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
19573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType, typename _CharT, typename _Traits>
19583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    std::basic_istream<_CharT, _Traits>&
19593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator>>(std::basic_istream<_CharT, _Traits>&,
19603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       std::uniform_real_distribution<_RealType>&);
19613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
19623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /* @} */ // group random_distributions_uniform
19633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
19643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
19653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @addtogroup random_distributions_normal Normal Distributions
19663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @ingroup random_distributions
19673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @{
19683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
19693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
19703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
19713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief A normal continuous distribution for random numbers.
19723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
19733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The formula for the normal probability density function is
19743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f[
19753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *     p(x|\mu,\sigma) = \frac{1}{\sigma \sqrt{2 \pi}}
19763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *            e^{- \frac{{x - \mu}^ {2}}{2 \sigma ^ {2}} }
19773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f]
19783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
19793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType = double>
19803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class normal_distribution
19813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
19823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
19833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument not a floating point type");
19843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
19853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
19863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the range of the distribution. */
19873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _RealType result_type;
19883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** Parameter type. */
19893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct param_type
19903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
19913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	typedef normal_distribution<_RealType> distribution_type;
19923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
19933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	explicit
19943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type(_RealType __mean = _RealType(0),
19953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   _RealType __stddev = _RealType(1))
19963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_mean(__mean), _M_stddev(__stddev)
19973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{
19983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  _GLIBCXX_DEBUG_ASSERT(_M_stddev > _RealType(0));
19993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	}
20003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
20013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType
20023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	mean() const
20033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_mean; }
20043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
20053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType
20063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	stddev() const
20073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_stddev; }
20083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
20093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend bool
20103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
20113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return (__p1._M_mean == __p2._M_mean
20123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		  && __p1._M_stddev == __p2._M_stddev); }
20133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
20143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      private:
20153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType _M_mean;
20163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType _M_stddev;
20173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      };
20183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
20193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
20203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
20213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * Constructs a normal distribution with parameters @f$mean@f$ and
20223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * standard deviation.
20233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
20243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
20253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      normal_distribution(result_type __mean = result_type(0),
20263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh			  result_type __stddev = result_type(1))
20273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__mean, __stddev), _M_saved_available(false)
20283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
20293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
20303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
20313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      normal_distribution(const param_type& __p)
20323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__p), _M_saved_available(false)
20333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
20343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
20353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
20363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Resets the distribution state.
20373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
20383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
20393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      reset()
20403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_saved_available = false; }
20413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
20423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
20433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the mean of the distribution.
20443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
20453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _RealType
20463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      mean() const
20473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.mean(); }
20483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
20493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
20503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the standard deviation of the distribution.
20513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
20523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _RealType
20533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      stddev() const
20543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.stddev(); }
20553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
20563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
20573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the parameter set of the distribution.
20583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
20593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type
20603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param() const
20613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param; }
20623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
20633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
20643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Sets the parameter set of the distribution.
20653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __param The new parameter set of the distribution.
20663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
20673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
20683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param(const param_type& __param)
20693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_param = __param; }
20703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
20713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
20723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
20733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
20743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
20753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min() const
20763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return std::numeric_limits<result_type>::min(); }
20773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
20783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
20793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the least upper bound value of the distribution.
20803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
20813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
20823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max() const
20833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return std::numeric_limits<result_type>::max(); }
20843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
20853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
20863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Generating functions.
20873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
20883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
20893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
20903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
20913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return this->operator()(__urng, this->param()); }
20923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
20933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
20943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
20953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
20963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const param_type& __p);
20973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
20983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
20993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Return true if two normal distributions have
21003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        the same parameters and the sequences that would
21013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        be generated are equal.
21023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
21033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _RealType1>
21043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend bool
21053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        operator==(const std::normal_distribution<_RealType1>& __d1,
21063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const std::normal_distribution<_RealType1>& __d2);
21073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
21083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
21093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Inserts a %normal_distribution random number distribution
21103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @p __x into the output stream @p __os.
21113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
21123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __os An output stream.
21133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A %normal_distribution random number distribution.
21143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
21153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
21163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * an error state.
21173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
21183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
21193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
21203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
21213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const std::normal_distribution<_RealType1>& __x);
21223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
21233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
21243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Extracts a %normal_distribution random number distribution
21253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @p __x from the input stream @p __is.
21263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
21273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __is An input stream.
21283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A %normal_distribution random number generator engine.
21293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
21303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The input stream with @p __x extracted or in an error
21313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *          state.
21323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
21333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
21343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
21353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
21363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   std::normal_distribution<_RealType1>& __x);
21373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
21383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
21393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type  _M_param;
21403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type _M_saved;
21413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      bool        _M_saved_available;
21423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
21433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
21443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
21453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Return true if two normal distributions are different.
21463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
21473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType>
21483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
21493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::normal_distribution<_RealType>& __d1,
21503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::normal_distribution<_RealType>& __d2)
21513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__d1 == __d2); }
21523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
21533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
21543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
21553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief A lognormal_distribution random number distribution.
21563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
21573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The formula for the normal probability mass function is
21583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f[
21593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *     p(x|m,s) = \frac{1}{sx\sqrt{2\pi}}
21603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *                \exp{-\frac{(\ln{x} - m)^2}{2s^2}}
21613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f]
21623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
21633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType = double>
21643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class lognormal_distribution
21653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
21663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
21673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument not a floating point type");
21683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
21693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
21703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the range of the distribution. */
21713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _RealType result_type;
21723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** Parameter type. */
21733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct param_type
21743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
21753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	typedef lognormal_distribution<_RealType> distribution_type;
21763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
21773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	explicit
21783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type(_RealType __m = _RealType(0),
21793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   _RealType __s = _RealType(1))
21803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_m(__m), _M_s(__s)
21813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ }
21823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
21833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType
21843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	m() const
21853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_m; }
21863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
21873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType
21883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	s() const
21893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_s; }
21903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
21913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend bool
21923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
21933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return __p1._M_m == __p2._M_m && __p1._M_s == __p2._M_s; }
21943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
21953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      private:
21963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType _M_m;
21973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType _M_s;
21983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      };
21993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
22003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
22013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      lognormal_distribution(_RealType __m = _RealType(0),
22023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh			     _RealType __s = _RealType(1))
22033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__m, __s), _M_nd()
22043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
22053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
22063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
22073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      lognormal_distribution(const param_type& __p)
22083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__p), _M_nd()
22093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
22103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
22113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
22123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * Resets the distribution state.
22133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
22143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
22153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      reset()
22163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_nd.reset(); }
22173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
22183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
22193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
22203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
22213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _RealType
22223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      m() const
22233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.m(); }
22243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
22253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _RealType
22263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      s() const
22273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.s(); }
22283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
22293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
22303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the parameter set of the distribution.
22313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
22323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type
22333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param() const
22343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param; }
22353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
22363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
22373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Sets the parameter set of the distribution.
22383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __param The new parameter set of the distribution.
22393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
22403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
22413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param(const param_type& __param)
22423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_param = __param; }
22433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
22443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
22453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
22463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
22473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
22483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min() const
22493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return result_type(0); }
22503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
22513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
22523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the least upper bound value of the distribution.
22533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
22543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
22553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max() const
22563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return std::numeric_limits<result_type>::max(); }
22573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
22583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
22593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Generating functions.
22603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
22613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
22623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
22633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
22643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return this->operator()(__urng, this->param()); }
22653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
22663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
22673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
22683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
22693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const param_type& __p)
22703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        { return std::exp(__p.s() * _M_nd(__urng) + __p.m()); }
22713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
22723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
22733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Return true if two lognormal distributions have
22743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        the same parameters and the sequences that would
22753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        be generated are equal.
22763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
22773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      friend bool
22783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      operator==(const lognormal_distribution& __d1,
22793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		 const lognormal_distribution& __d2)
22803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return (__d1.param() == __d2.param()
22813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		&& __d1._M_nd == __d2._M_nd); }
22823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
22833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
22843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Inserts a %lognormal_distribution random number distribution
22853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @p __x into the output stream @p __os.
22863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
22873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __os An output stream.
22883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A %lognormal_distribution random number distribution.
22893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
22903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
22913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * an error state.
22923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
22933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
22943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
22953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
22963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const std::lognormal_distribution<_RealType1>& __x);
22973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
22983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
22993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Extracts a %lognormal_distribution random number distribution
23003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @p __x from the input stream @p __is.
23013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
23023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __is An input stream.
23033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x A %lognormal_distribution random number
23043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *            generator engine.
23053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
23063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The input stream with @p __x extracted or in an error state.
23073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
23083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
23093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
23103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
23113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   std::lognormal_distribution<_RealType1>& __x);
23123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
23133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
23143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type _M_param;
23153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
23163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      std::normal_distribution<result_type> _M_nd;
23173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
23183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
23193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
23203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Return true if two lognormal distributions are different.
23213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
23223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType>
23233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
23243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::lognormal_distribution<_RealType>& __d1,
23253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::lognormal_distribution<_RealType>& __d2)
23263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__d1 == __d2); }
23273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
23283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
23293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
23303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief A gamma continuous distribution for random numbers.
23313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
23323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The formula for the gamma probability density function is:
23333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f[
23343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *     p(x|\alpha,\beta) = \frac{1}{\beta\Gamma(\alpha)}
23353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *                         (x/\beta)^{\alpha - 1} e^{-x/\beta}
23363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f]
23373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
23383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType = double>
23393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class gamma_distribution
23403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
23413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
23423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument not a floating point type");
23433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
23443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
23453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the range of the distribution. */
23463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _RealType result_type;
23473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** Parameter type. */
23483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct param_type
23493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
23503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	typedef gamma_distribution<_RealType> distribution_type;
23513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend class gamma_distribution<_RealType>;
23523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
23533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	explicit
23543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type(_RealType __alpha_val = _RealType(1),
23553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   _RealType __beta_val = _RealType(1))
23563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_alpha(__alpha_val), _M_beta(__beta_val)
23573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{
23583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  _GLIBCXX_DEBUG_ASSERT(_M_alpha > _RealType(0));
23593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  _M_initialize();
23603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	}
23613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
23623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType
23633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	alpha() const
23643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_alpha; }
23653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
23663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType
23673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	beta() const
23683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_beta; }
23693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
23703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend bool
23713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
23723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return (__p1._M_alpha == __p2._M_alpha
23733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		  && __p1._M_beta == __p2._M_beta); }
23743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
23753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      private:
23763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	void
23773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_M_initialize();
23783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
23793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType _M_alpha;
23803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType _M_beta;
23813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
23823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType _M_malpha, _M_a2;
23833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      };
23843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
23853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
23863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
23873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Constructs a gamma distribution with parameters
23883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @f$\alpha@f$ and @f$\beta@f$.
23893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
23903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
23913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      gamma_distribution(_RealType __alpha_val = _RealType(1),
23923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh			 _RealType __beta_val = _RealType(1))
23933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__alpha_val, __beta_val), _M_nd()
23943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
23953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
23963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
23973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      gamma_distribution(const param_type& __p)
23983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__p), _M_nd()
23993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
24003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
24013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
24023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Resets the distribution state.
24033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
24043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
24053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      reset()
24063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_nd.reset(); }
24073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
24083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
24093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the @f$\alpha@f$ of the distribution.
24103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
24113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _RealType
24123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      alpha() const
24133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.alpha(); }
24143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
24153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
24163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the @f$\beta@f$ of the distribution.
24173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
24183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _RealType
24193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      beta() const
24203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.beta(); }
24213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
24223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
24233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the parameter set of the distribution.
24243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
24253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type
24263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param() const
24273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param; }
24283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
24293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
24303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Sets the parameter set of the distribution.
24313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __param The new parameter set of the distribution.
24323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
24333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
24343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param(const param_type& __param)
24353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_param = __param; }
24363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
24373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
24383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
24393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
24403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
24413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min() const
24423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return result_type(0); }
24433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
24443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
24453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the least upper bound value of the distribution.
24463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
24473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
24483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max() const
24493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return std::numeric_limits<result_type>::max(); }
24503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
24513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
24523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Generating functions.
24533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
24543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
24553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
24563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
24573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return this->operator()(__urng, this->param()); }
24583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
24593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
24603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
24613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
24623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const param_type& __p);
24633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
24643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
24653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Return true if two gamma distributions have the same
24663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        parameters and the sequences that would be generated
24673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        are equal.
24683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
24693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      friend bool
24703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      operator==(const gamma_distribution& __d1,
24713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		 const gamma_distribution& __d2)
24723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return (__d1.param() == __d2.param()
24733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		&& __d1._M_nd == __d2._M_nd); }
24743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
24753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
24763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Inserts a %gamma_distribution random number distribution
24773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @p __x into the output stream @p __os.
24783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
24793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __os An output stream.
24803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A %gamma_distribution random number distribution.
24813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
24823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
24833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * an error state.
24843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
24853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
24863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
24873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
24883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const std::gamma_distribution<_RealType1>& __x);
24893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
24903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
24913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Extracts a %gamma_distribution random number distribution
24923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @p __x from the input stream @p __is.
24933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
24943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __is An input stream.
24953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A %gamma_distribution random number generator engine.
24963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
24973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The input stream with @p __x extracted or in an error state.
24983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
24993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
25003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
25013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
25023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   std::gamma_distribution<_RealType1>& __x);
25033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
25043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
25053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type _M_param;
25063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
25073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      std::normal_distribution<result_type> _M_nd;
25083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
25093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
25103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
25113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Return true if two gamma distributions are different.
25123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
25133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   template<typename _RealType>
25143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
25153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     operator!=(const std::gamma_distribution<_RealType>& __d1,
25163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		const std::gamma_distribution<_RealType>& __d2)
25173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__d1 == __d2); }
25183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
25193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
25203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
25213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief A chi_squared_distribution random number distribution.
25223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
25233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The formula for the normal probability mass function is
25243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f$p(x|n) = \frac{x^{(n/2) - 1}e^{-x/2}}{\Gamma(n/2) 2^{n/2}}@f$
25253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
25263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType = double>
25273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class chi_squared_distribution
25283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
25293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
25303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument not a floating point type");
25313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
25323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
25333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the range of the distribution. */
25343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _RealType result_type;
25353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** Parameter type. */
25363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct param_type
25373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
25383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	typedef chi_squared_distribution<_RealType> distribution_type;
25393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
25403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	explicit
25413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type(_RealType __n = _RealType(1))
25423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_n(__n)
25433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ }
25443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
25453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType
25463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	n() const
25473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_n; }
25483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
25493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend bool
25503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
25513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return __p1._M_n == __p2._M_n; }
25523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
25533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      private:
25543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType _M_n;
25553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      };
25563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
25573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
25583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      chi_squared_distribution(_RealType __n = _RealType(1))
25593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__n), _M_gd(__n / 2)
25603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
25613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
25623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
25633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      chi_squared_distribution(const param_type& __p)
25643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__p), _M_gd(__p.n() / 2)
25653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
25663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
25673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
25683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Resets the distribution state.
25693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
25703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
25713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      reset()
25723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_gd.reset(); }
25733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
25743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
25753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
25763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
25773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _RealType
25783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      n() const
25793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.n(); }
25803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
25813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
25823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the parameter set of the distribution.
25833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
25843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type
25853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param() const
25863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param; }
25873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
25883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
25893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Sets the parameter set of the distribution.
25903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __param The new parameter set of the distribution.
25913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
25923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
25933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param(const param_type& __param)
25943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_param = __param; }
25953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
25963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
25973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
25983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
25993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
26003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min() const
26013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return result_type(0); }
26023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
26033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
26043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the least upper bound value of the distribution.
26053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
26063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
26073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max() const
26083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return std::numeric_limits<result_type>::max(); }
26093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
26103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
26113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Generating functions.
26123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
26133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
26143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
26153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
26163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return 2 * _M_gd(__urng); }
26173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
26183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
26193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
26203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
26213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const param_type& __p)
26223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        {
26233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  typedef typename std::gamma_distribution<result_type>::param_type
26243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	    param_type;
26253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  return 2 * _M_gd(__urng, param_type(__p.n() / 2));
26263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	}
26273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
26283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
26293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Return true if two Chi-squared distributions have
26303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        the same parameters and the sequences that would be
26313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        generated are equal.
26323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
26333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      friend bool
26343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      operator==(const chi_squared_distribution& __d1,
26353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		 const chi_squared_distribution& __d2)
26363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return __d1.param() == __d2.param() && __d1._M_gd == __d2._M_gd; }
26373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
26383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
26393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Inserts a %chi_squared_distribution random number distribution
26403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @p __x into the output stream @p __os.
26413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
26423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __os An output stream.
26433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A %chi_squared_distribution random number distribution.
26443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
26453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
26463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * an error state.
26473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
26483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
26493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
26503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
26513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const std::chi_squared_distribution<_RealType1>& __x);
26523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
26533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
26543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Extracts a %chi_squared_distribution random number distribution
26553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @p __x from the input stream @p __is.
26563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
26573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __is An input stream.
26583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x A %chi_squared_distribution random number
26593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *            generator engine.
26603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
26613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The input stream with @p __x extracted or in an error state.
26623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
26633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
26643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
26653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
26663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   std::chi_squared_distribution<_RealType1>& __x);
26673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
26683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
26693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type _M_param;
26703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
26713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      std::gamma_distribution<result_type> _M_gd;
26723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
26733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
26743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
26753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Return true if two Chi-squared distributions are different.
26763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
26773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType>
26783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
26793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::chi_squared_distribution<_RealType>& __d1,
26803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::chi_squared_distribution<_RealType>& __d2)
26813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__d1 == __d2); }
26823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
26833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
26843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
26853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief A cauchy_distribution random number distribution.
26863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
26873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The formula for the normal probability mass function is
26883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f$p(x|a,b) = (\pi b (1 + (\frac{x-a}{b})^2))^{-1}@f$
26893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
26903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType = double>
26913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class cauchy_distribution
26923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
26933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
26943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument not a floating point type");
26953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
26963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
26973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the range of the distribution. */
26983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _RealType result_type;
26993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** Parameter type. */
27003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct param_type
27013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
27023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	typedef cauchy_distribution<_RealType> distribution_type;
27033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
27043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	explicit
27053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type(_RealType __a = _RealType(0),
27063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   _RealType __b = _RealType(1))
27073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_a(__a), _M_b(__b)
27083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ }
27093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
27103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType
27113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	a() const
27123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_a; }
27133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
27143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType
27153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	b() const
27163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_b; }
27173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
27183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend bool
27193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
27203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
27213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
27223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      private:
27233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType _M_a;
27243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType _M_b;
27253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      };
27263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
27273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
27283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      cauchy_distribution(_RealType __a = _RealType(0),
27293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh			  _RealType __b = _RealType(1))
27303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__a, __b)
27313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
27323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
27333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
27343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      cauchy_distribution(const param_type& __p)
27353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__p)
27363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
27373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
27383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
27393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Resets the distribution state.
27403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
27413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
27423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      reset()
27433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
27443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
27453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
27463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
27473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
27483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _RealType
27493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      a() const
27503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.a(); }
27513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
27523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _RealType
27533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      b() const
27543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.b(); }
27553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
27563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
27573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the parameter set of the distribution.
27583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
27593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type
27603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param() const
27613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param; }
27623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
27633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
27643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Sets the parameter set of the distribution.
27653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __param The new parameter set of the distribution.
27663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
27673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
27683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param(const param_type& __param)
27693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_param = __param; }
27703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
27713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
27723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
27733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
27743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
27753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min() const
27763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return std::numeric_limits<result_type>::min(); }
27773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
27783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
27793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the least upper bound value of the distribution.
27803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
27813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
27823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max() const
27833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return std::numeric_limits<result_type>::max(); }
27843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
27853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
27863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Generating functions.
27873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
27883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
27893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
27903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
27913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return this->operator()(__urng, this->param()); }
27923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
27933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
27943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
27953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
27963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const param_type& __p);
27973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
27983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
27993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type _M_param;
28003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
28013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
28023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
28033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Return true if two Cauchy distributions have
28043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *        the same parameters.
28053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
28063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType>
28073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
28083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator==(const std::cauchy_distribution<_RealType>& __d1,
28093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::cauchy_distribution<_RealType>& __d2)
28103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return __d1.param() == __d2.param(); }
28113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
28123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
28133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Return true if two Cauchy distributions have
28143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *        different parameters.
28153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
28163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType>
28173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
28183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::cauchy_distribution<_RealType>& __d1,
28193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::cauchy_distribution<_RealType>& __d2)
28203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__d1 == __d2); }
28213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
28223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
28233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Inserts a %cauchy_distribution random number distribution
28243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @p __x into the output stream @p __os.
28253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
28263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __os An output stream.
28273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __x  A %cauchy_distribution random number distribution.
28283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
28293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns The output stream with the state of @p __x inserted or in
28303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * an error state.
28313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
28323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType, typename _CharT, typename _Traits>
28333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    std::basic_ostream<_CharT, _Traits>&
28343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
28353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::cauchy_distribution<_RealType>& __x);
28363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
28373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
28383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Extracts a %cauchy_distribution random number distribution
28393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @p __x from the input stream @p __is.
28403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
28413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __is An input stream.
28423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __x A %cauchy_distribution random number
28433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *            generator engine.
28443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
28453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns The input stream with @p __x extracted or in an error state.
28463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
28473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType, typename _CharT, typename _Traits>
28483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    std::basic_istream<_CharT, _Traits>&
28493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator>>(std::basic_istream<_CharT, _Traits>& __is,
28503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       std::cauchy_distribution<_RealType>& __x);
28513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
28523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
28533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
28543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief A fisher_f_distribution random number distribution.
28553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
28563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The formula for the normal probability mass function is
28573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f[
28583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *     p(x|m,n) = \frac{\Gamma((m+n)/2)}{\Gamma(m/2)\Gamma(n/2)}
28593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *                (\frac{m}{n})^{m/2} x^{(m/2)-1}
28603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *                (1 + \frac{mx}{n})^{-(m+n)/2}
28613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f]
28623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
28633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType = double>
28643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class fisher_f_distribution
28653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
28663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
28673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument not a floating point type");
28683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
28693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
28703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the range of the distribution. */
28713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _RealType result_type;
28723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** Parameter type. */
28733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct param_type
28743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
28753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	typedef fisher_f_distribution<_RealType> distribution_type;
28763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
28773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	explicit
28783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type(_RealType __m = _RealType(1),
28793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   _RealType __n = _RealType(1))
28803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_m(__m), _M_n(__n)
28813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ }
28823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
28833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType
28843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	m() const
28853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_m; }
28863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
28873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType
28883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	n() const
28893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_n; }
28903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
28913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend bool
28923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
28933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return __p1._M_m == __p2._M_m && __p1._M_n == __p2._M_n; }
28943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
28953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      private:
28963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType _M_m;
28973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType _M_n;
28983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      };
28993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
29003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
29013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      fisher_f_distribution(_RealType __m = _RealType(1),
29023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh			    _RealType __n = _RealType(1))
29033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__m, __n), _M_gd_x(__m / 2), _M_gd_y(__n / 2)
29043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
29053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
29063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
29073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      fisher_f_distribution(const param_type& __p)
29083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__p), _M_gd_x(__p.m() / 2), _M_gd_y(__p.n() / 2)
29093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
29103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
29113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
29123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Resets the distribution state.
29133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
29143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
29153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      reset()
29163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
29173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_M_gd_x.reset();
29183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_M_gd_y.reset();
29193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
29203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
29213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
29223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
29233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
29243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _RealType
29253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      m() const
29263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.m(); }
29273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
29283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _RealType
29293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      n() const
29303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.n(); }
29313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
29323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
29333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the parameter set of the distribution.
29343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
29353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type
29363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param() const
29373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param; }
29383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
29393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
29403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Sets the parameter set of the distribution.
29413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __param The new parameter set of the distribution.
29423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
29433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
29443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param(const param_type& __param)
29453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_param = __param; }
29463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
29473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
29483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
29493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
29503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
29513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min() const
29523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return result_type(0); }
29533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
29543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
29553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the least upper bound value of the distribution.
29563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
29573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
29583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max() const
29593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return std::numeric_limits<result_type>::max(); }
29603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
29613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
29623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Generating functions.
29633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
29643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
29653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
29663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
29673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return (_M_gd_x(__urng) * n()) / (_M_gd_y(__urng) * m()); }
29683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
29693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
29703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
29713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
29723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const param_type& __p)
29733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        {
29743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  typedef typename std::gamma_distribution<result_type>::param_type
29753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	    param_type;
29763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  return ((_M_gd_x(__urng, param_type(__p.m() / 2)) * n())
29773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		  / (_M_gd_y(__urng, param_type(__p.n() / 2)) * m()));
29783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	}
29793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
29803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
29813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Return true if two Fisher f distributions have
29823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        the same parameters and the sequences that would
29833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        be generated are equal.
29843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
29853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      friend bool
29863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      operator==(const fisher_f_distribution& __d1,
29873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		 const fisher_f_distribution& __d2)
29883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return (__d1.param() == __d2.param()
29893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		&& __d1._M_gd_x == __d2._M_gd_x
29903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		&& __d1._M_gd_y == __d2._M_gd_y); }
29913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
29923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
29933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Inserts a %fisher_f_distribution random number distribution
29943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @p __x into the output stream @p __os.
29953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
29963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __os An output stream.
29973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A %fisher_f_distribution random number distribution.
29983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
29993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
30003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * an error state.
30013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
30023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
30033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
30043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
30053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const std::fisher_f_distribution<_RealType1>& __x);
30063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
30073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
30083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Extracts a %fisher_f_distribution random number distribution
30093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @p __x from the input stream @p __is.
30103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
30113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __is An input stream.
30123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x A %fisher_f_distribution random number
30133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *            generator engine.
30143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
30153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The input stream with @p __x extracted or in an error state.
30163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
30173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
30183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
30193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
30203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   std::fisher_f_distribution<_RealType1>& __x);
30213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
30223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
30233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type _M_param;
30243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
30253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      std::gamma_distribution<result_type> _M_gd_x, _M_gd_y;
30263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
30273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
30283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
30293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Return true if two Fisher f distributions are diferent.
30303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
30313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType>
30323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
30333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::fisher_f_distribution<_RealType>& __d1,
30343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::fisher_f_distribution<_RealType>& __d2)
30353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__d1 == __d2); }
30363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
30373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
30383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief A student_t_distribution random number distribution.
30393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
30403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The formula for the normal probability mass function is:
30413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f[
30423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *     p(x|n) = \frac{1}{\sqrt(n\pi)} \frac{\Gamma((n+1)/2)}{\Gamma(n/2)}
30433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *              (1 + \frac{x^2}{n}) ^{-(n+1)/2}
30443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f]
30453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
30463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType = double>
30473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class student_t_distribution
30483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
30493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
30503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument not a floating point type");
30513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
30523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
30533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the range of the distribution. */
30543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _RealType result_type;
30553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** Parameter type. */
30563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct param_type
30573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
30583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	typedef student_t_distribution<_RealType> distribution_type;
30593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
30603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	explicit
30613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type(_RealType __n = _RealType(1))
30623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_n(__n)
30633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ }
30643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
30653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType
30663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	n() const
30673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_n; }
30683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
30693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend bool
30703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
30713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return __p1._M_n == __p2._M_n; }
30723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
30733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      private:
30743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType _M_n;
30753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      };
30763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
30773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
30783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      student_t_distribution(_RealType __n = _RealType(1))
30793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__n), _M_nd(), _M_gd(__n / 2, 2)
30803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
30813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
30823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
30833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      student_t_distribution(const param_type& __p)
30843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__p), _M_nd(), _M_gd(__p.n() / 2, 2)
30853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
30863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
30873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
30883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Resets the distribution state.
30893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
30903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
30913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      reset()
30923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
30933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_M_nd.reset();
30943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_M_gd.reset();
30953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
30963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
30973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
30983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
30993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
31003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _RealType
31013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      n() const
31023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.n(); }
31033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
31043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
31053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the parameter set of the distribution.
31063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
31073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type
31083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param() const
31093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param; }
31103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
31113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
31123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Sets the parameter set of the distribution.
31133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __param The new parameter set of the distribution.
31143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
31153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
31163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param(const param_type& __param)
31173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_param = __param; }
31183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
31193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
31203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
31213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
31223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
31233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min() const
31243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return std::numeric_limits<result_type>::min(); }
31253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
31263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
31273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the least upper bound value of the distribution.
31283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
31293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
31303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max() const
31313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return std::numeric_limits<result_type>::max(); }
31323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
31333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
31343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Generating functions.
31353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
31363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
31373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
31383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        operator()(_UniformRandomNumberGenerator& __urng)
31393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        { return _M_nd(__urng) * std::sqrt(n() / _M_gd(__urng)); }
31403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
31413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
31423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
31433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
31443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const param_type& __p)
31453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        {
31463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  typedef typename std::gamma_distribution<result_type>::param_type
31473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	    param_type;
31483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
31493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  const result_type __g = _M_gd(__urng, param_type(__p.n() / 2, 2));
31503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  return _M_nd(__urng) * std::sqrt(__p.n() / __g);
31513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        }
31523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
31533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
31543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Return true if two Student t distributions have
31553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        the same parameters and the sequences that would
31563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        be generated are equal.
31573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
31583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      friend bool
31593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      operator==(const student_t_distribution& __d1,
31603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		 const student_t_distribution& __d2)
31613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return (__d1.param() == __d2.param()
31623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		&& __d1._M_nd == __d2._M_nd && __d1._M_gd == __d2._M_gd); }
31633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
31643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
31653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Inserts a %student_t_distribution random number distribution
31663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @p __x into the output stream @p __os.
31673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
31683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __os An output stream.
31693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A %student_t_distribution random number distribution.
31703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
31713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
31723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * an error state.
31733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
31743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
31753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
31763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
31773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const std::student_t_distribution<_RealType1>& __x);
31783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
31793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
31803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Extracts a %student_t_distribution random number distribution
31813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @p __x from the input stream @p __is.
31823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
31833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __is An input stream.
31843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x A %student_t_distribution random number
31853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *            generator engine.
31863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
31873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The input stream with @p __x extracted or in an error state.
31883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
31893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
31903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
31913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
31923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   std::student_t_distribution<_RealType1>& __x);
31933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
31943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
31953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type _M_param;
31963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
31973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      std::normal_distribution<result_type> _M_nd;
31983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      std::gamma_distribution<result_type> _M_gd;
31993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
32003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
32013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
32023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Return true if two Student t distributions are different.
32033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
32043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType>
32053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
32063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::student_t_distribution<_RealType>& __d1,
32073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::student_t_distribution<_RealType>& __d2)
32083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__d1 == __d2); }
32093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
32103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
32113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /* @} */ // group random_distributions_normal
32123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
32133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
32143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @addtogroup random_distributions_bernoulli Bernoulli Distributions
32153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @ingroup random_distributions
32163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @{
32173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
32183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
32193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
32203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief A Bernoulli random number distribution.
32213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
32223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * Generates a sequence of true and false values with likelihood @f$p@f$
32233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * that true will come up and @f$(1 - p)@f$ that false will appear.
32243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
32253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  class bernoulli_distribution
32263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  {
32273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  public:
32283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    /** The type of the range of the distribution. */
32293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    typedef bool result_type;
32303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    /** Parameter type. */
32313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    struct param_type
32323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
32333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef bernoulli_distribution distribution_type;
32343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
32353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
32363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type(double __p = 0.5)
32373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_p(__p)
32383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
32393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_GLIBCXX_DEBUG_ASSERT((_M_p >= 0.0) && (_M_p <= 1.0));
32403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
32413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
32423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      double
32433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      p() const
32443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_p; }
32453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
32463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      friend bool
32473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      operator==(const param_type& __p1, const param_type& __p2)
32483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return __p1._M_p == __p2._M_p; }
32493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
32503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
32513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      double _M_p;
32523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
32533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
32543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  public:
32553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    /**
32563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     * @brief Constructs a Bernoulli distribution with likelihood @p p.
32573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     *
32583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     * @param __p  [IN]  The likelihood of a true result being returned.
32593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     *                   Must be in the interval @f$[0, 1]@f$.
32603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     */
32613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    explicit
32623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    bernoulli_distribution(double __p = 0.5)
32633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    : _M_param(__p)
32643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { }
32653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
32663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    explicit
32673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    bernoulli_distribution(const param_type& __p)
32683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    : _M_param(__p)
32693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { }
32703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
32713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    /**
32723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     * @brief Resets the distribution state.
32733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     *
32743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     * Does nothing for a Bernoulli distribution.
32753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     */
32763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    void
32773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    reset() { }
32783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
32793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    /**
32803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     * @brief Returns the @p p parameter of the distribution.
32813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     */
32823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    double
32833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    p() const
32843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return _M_param.p(); }
32853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
32863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    /**
32873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     * @brief Returns the parameter set of the distribution.
32883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     */
32893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    param_type
32903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    param() const
32913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return _M_param; }
32923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
32933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    /**
32943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     * @brief Sets the parameter set of the distribution.
32953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     * @param __param The new parameter set of the distribution.
32963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     */
32973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    void
32983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    param(const param_type& __param)
32993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { _M_param = __param; }
33003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
33013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    /**
33023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     * @brief Returns the greatest lower bound value of the distribution.
33033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     */
33043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    result_type
33053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    min() const
33063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return std::numeric_limits<result_type>::min(); }
33073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
33083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    /**
33093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     * @brief Returns the least upper bound value of the distribution.
33103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     */
33113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    result_type
33123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    max() const
33133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return std::numeric_limits<result_type>::max(); }
33143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
33153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    /**
33163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     * @brief Generating functions.
33173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh     */
33183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    template<typename _UniformRandomNumberGenerator>
33193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
33203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      operator()(_UniformRandomNumberGenerator& __urng)
33213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return this->operator()(__urng, this->param()); }
33223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
33233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    template<typename _UniformRandomNumberGenerator>
33243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
33253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      operator()(_UniformRandomNumberGenerator& __urng,
33263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		 const param_type& __p)
33273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
33283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	__detail::_Adaptor<_UniformRandomNumberGenerator, double>
33293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  __aurng(__urng);
33303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	if ((__aurng() - __aurng.min())
33313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	     < __p.p() * (__aurng.max() - __aurng.min()))
33323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  return true;
33333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	return false;
33343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
33353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
33363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  private:
33373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    param_type _M_param;
33383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  };
33393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
33403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
33413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Return true if two Bernoulli distributions have
33423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *        the same parameters.
33433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
33443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  inline bool
33453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  operator==(const std::bernoulli_distribution& __d1,
33463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	     const std::bernoulli_distribution& __d2)
33473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  { return __d1.param() == __d2.param(); }
33483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
33493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
33503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Return true if two Bernoulli distributions have
33513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *        different parameters.
33523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
33533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  inline bool
33543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  operator!=(const std::bernoulli_distribution& __d1,
33553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	     const std::bernoulli_distribution& __d2)
33563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  { return !(__d1 == __d2); }
33573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
33583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
33593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Inserts a %bernoulli_distribution random number distribution
33603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @p __x into the output stream @p __os.
33613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
33623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __os An output stream.
33633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __x  A %bernoulli_distribution random number distribution.
33643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
33653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns The output stream with the state of @p __x inserted or in
33663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * an error state.
33673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
33683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _CharT, typename _Traits>
33693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    std::basic_ostream<_CharT, _Traits>&
33703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
33713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::bernoulli_distribution& __x);
33723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
33733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
33743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Extracts a %bernoulli_distribution random number distribution
33753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @p __x from the input stream @p __is.
33763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
33773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __is An input stream.
33783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __x  A %bernoulli_distribution random number generator engine.
33793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
33803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns The input stream with @p __x extracted or in an error state.
33813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
33823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _CharT, typename _Traits>
33833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    std::basic_istream<_CharT, _Traits>&
33843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator>>(std::basic_istream<_CharT, _Traits>& __is,
33853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       std::bernoulli_distribution& __x)
33863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
33873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      double __p;
33883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      __is >> __p;
33893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      __x.param(bernoulli_distribution::param_type(__p));
33903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      return __is;
33913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    }
33923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
33933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
33943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
33953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief A discrete binomial random number distribution.
33963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
33973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The formula for the binomial probability density function is
33983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f$p(i|t,p) = \binom{n}{i} p^i (1 - p)^{t - i}@f$ where @f$t@f$
33993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * and @f$p@f$ are the parameters of the distribution.
34003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
34013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _IntType = int>
34023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class binomial_distribution
34033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
34043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_integral<_IntType>::value,
34053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument not an integral type");
34063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
34073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
34083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the range of the distribution. */
34093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _IntType result_type;
34103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** Parameter type. */
34113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct param_type
34123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
34133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	typedef binomial_distribution<_IntType> distribution_type;
34143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend class binomial_distribution<_IntType>;
34153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
34163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	explicit
34173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type(_IntType __t = _IntType(1), double __p = 0.5)
34183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_t(__t), _M_p(__p)
34193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{
34203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  _GLIBCXX_DEBUG_ASSERT((_M_t >= _IntType(0))
34213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh				&& (_M_p >= 0.0)
34223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh				&& (_M_p <= 1.0));
34233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  _M_initialize();
34243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	}
34253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
34263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_IntType
34273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	t() const
34283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_t; }
34293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
34303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	double
34313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	p() const
34323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_p; }
34333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
34343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend bool
34353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
34363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return __p1._M_t == __p2._M_t && __p1._M_p == __p2._M_p; }
34373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
34383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      private:
34393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	void
34403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_M_initialize();
34413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
34423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_IntType _M_t;
34433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	double _M_p;
34443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
34453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	double _M_q;
34463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#if _GLIBCXX_USE_C99_MATH_TR1
34473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	double _M_d1, _M_d2, _M_s1, _M_s2, _M_c,
34483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       _M_a1, _M_a123, _M_s, _M_lf, _M_lp1p;
34493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#endif
34503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	bool   _M_easy;
34513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      };
34523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
34533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      // constructors and member function
34543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
34553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      binomial_distribution(_IntType __t = _IntType(1),
34563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh			    double __p = 0.5)
34573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__t, __p), _M_nd()
34583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
34593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
34603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
34613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      binomial_distribution(const param_type& __p)
34623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__p), _M_nd()
34633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
34643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
34653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
34663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Resets the distribution state.
34673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
34683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
34693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      reset()
34703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_nd.reset(); }
34713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
34723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
34733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the distribution @p t parameter.
34743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
34753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _IntType
34763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      t() const
34773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.t(); }
34783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
34793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
34803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the distribution @p p parameter.
34813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
34823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      double
34833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      p() const
34843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.p(); }
34853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
34863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
34873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the parameter set of the distribution.
34883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
34893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type
34903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param() const
34913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param; }
34923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
34933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
34943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Sets the parameter set of the distribution.
34953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __param The new parameter set of the distribution.
34963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
34973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
34983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param(const param_type& __param)
34993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_param = __param; }
35003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
35013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
35023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
35033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
35043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
35053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min() const
35063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return 0; }
35073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
35083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
35093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the least upper bound value of the distribution.
35103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
35113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
35123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max() const
35133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.t(); }
35143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
35153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
35163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Generating functions.
35173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
35183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
35193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
35203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
35213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return this->operator()(__urng, this->param()); }
35223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
35233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
35243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
35253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
35263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const param_type& __p);
35273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
35283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
35293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Return true if two binomial distributions have
35303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        the same parameters and the sequences that would
35313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        be generated are equal.
35323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
35333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend bool
35343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        operator==(const binomial_distribution& __d1,
35353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const binomial_distribution& __d2)
35363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#ifdef _GLIBCXX_USE_C99_MATH_TR1
35373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return __d1.param() == __d2.param() && __d1._M_nd == __d2._M_nd; }
35383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#else
35393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        { return __d1.param() == __d2.param(); }
35403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#endif
35413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
35423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
35433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Inserts a %binomial_distribution random number distribution
35443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @p __x into the output stream @p __os.
35453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
35463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __os An output stream.
35473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A %binomial_distribution random number distribution.
35483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
35493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
35503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * an error state.
35513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
35523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _IntType1,
35533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       typename _CharT, typename _Traits>
35543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
35553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
35563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const std::binomial_distribution<_IntType1>& __x);
35573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
35583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
35593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Extracts a %binomial_distribution random number distribution
35603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @p __x from the input stream @p __is.
35613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
35623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __is An input stream.
35633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A %binomial_distribution random number generator engine.
35643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
35653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The input stream with @p __x extracted or in an error
35663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *          state.
35673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
35683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _IntType1,
35693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       typename _CharT, typename _Traits>
35703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
35713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
35723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   std::binomial_distribution<_IntType1>& __x);
35733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
35743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
35753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
35763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
35773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_M_waiting(_UniformRandomNumberGenerator& __urng, _IntType __t);
35783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
35793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type _M_param;
35803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
35813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      // NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined.
35823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      std::normal_distribution<double> _M_nd;
35833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
35843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
35853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
35863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Return true if two binomial distributions are different.
35873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
35883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _IntType>
35893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
35903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::binomial_distribution<_IntType>& __d1,
35913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::binomial_distribution<_IntType>& __d2)
35923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__d1 == __d2); }
35933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
35943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
35953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
35963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief A discrete geometric random number distribution.
35973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
35983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The formula for the geometric probability density function is
35993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f$p(i|p) = p(1 - p)^{i}@f$ where @f$p@f$ is the parameter of the
36003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * distribution.
36013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
36023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _IntType = int>
36033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class geometric_distribution
36043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
36053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_integral<_IntType>::value,
36063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument not an integral type");
36073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
36083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
36093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the range of the distribution. */
36103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _IntType  result_type;
36113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** Parameter type. */
36123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct param_type
36133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
36143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	typedef geometric_distribution<_IntType> distribution_type;
36153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend class geometric_distribution<_IntType>;
36163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
36173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	explicit
36183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type(double __p = 0.5)
36193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_p(__p)
36203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{
36213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  _GLIBCXX_DEBUG_ASSERT((_M_p > 0.0) && (_M_p < 1.0));
36223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  _M_initialize();
36233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	}
36243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
36253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	double
36263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	p() const
36273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_p; }
36283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
36293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend bool
36303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
36313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return __p1._M_p == __p2._M_p; }
36323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
36333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      private:
36343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	void
36353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_M_initialize()
36363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ _M_log_1_p = std::log(1.0 - _M_p); }
36373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
36383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	double _M_p;
36393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
36403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	double _M_log_1_p;
36413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      };
36423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
36433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      // constructors and member function
36443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
36453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      geometric_distribution(double __p = 0.5)
36463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__p)
36473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
36483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
36493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
36503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      geometric_distribution(const param_type& __p)
36513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__p)
36523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
36533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
36543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
36553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Resets the distribution state.
36563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
36573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * Does nothing for the geometric distribution.
36583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
36593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
36603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      reset() { }
36613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
36623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
36633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the distribution parameter @p p.
36643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
36653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      double
36663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      p() const
36673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.p(); }
36683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
36693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
36703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the parameter set of the distribution.
36713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
36723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type
36733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param() const
36743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param; }
36753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
36763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
36773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Sets the parameter set of the distribution.
36783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __param The new parameter set of the distribution.
36793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
36803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
36813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param(const param_type& __param)
36823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_param = __param; }
36833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
36843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
36853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
36863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
36873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
36883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min() const
36893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return 0; }
36903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
36913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
36923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the least upper bound value of the distribution.
36933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
36943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
36953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max() const
36963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return std::numeric_limits<result_type>::max(); }
36973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
36983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
36993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Generating functions.
37003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
37013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
37023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
37033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
37043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return this->operator()(__urng, this->param()); }
37053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
37063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
37073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
37083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
37093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const param_type& __p);
37103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
37113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
37123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type _M_param;
37133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
37143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
37153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
37163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Return true if two geometric distributions have
37173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *        the same parameters.
37183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
37193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _IntType>
37203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
37213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator==(const std::geometric_distribution<_IntType>& __d1,
37223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::geometric_distribution<_IntType>& __d2)
37233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return __d1.param() == __d2.param(); }
37243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
37253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
37263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Return true if two geometric distributions have
37273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *        different parameters.
37283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
37293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _IntType>
37303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
37313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::geometric_distribution<_IntType>& __d1,
37323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::geometric_distribution<_IntType>& __d2)
37333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__d1 == __d2); }
37343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
37353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
37363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Inserts a %geometric_distribution random number distribution
37373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @p __x into the output stream @p __os.
37383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
37393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __os An output stream.
37403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __x  A %geometric_distribution random number distribution.
37413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
37423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns The output stream with the state of @p __x inserted or in
37433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * an error state.
37443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
37453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _IntType,
37463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	   typename _CharT, typename _Traits>
37473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    std::basic_ostream<_CharT, _Traits>&
37483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
37493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::geometric_distribution<_IntType>& __x);
37503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
37513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
37523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Extracts a %geometric_distribution random number distribution
37533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @p __x from the input stream @p __is.
37543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
37553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __is An input stream.
37563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __x  A %geometric_distribution random number generator engine.
37573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
37583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns The input stream with @p __x extracted or in an error state.
37593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
37603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _IntType,
37613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	   typename _CharT, typename _Traits>
37623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    std::basic_istream<_CharT, _Traits>&
37633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator>>(std::basic_istream<_CharT, _Traits>& __is,
37643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       std::geometric_distribution<_IntType>& __x);
37653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
37663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
37673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
37683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief A negative_binomial_distribution random number distribution.
37693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
37703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The formula for the negative binomial probability mass function is
37713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f$p(i) = \binom{n}{i} p^i (1 - p)^{t - i}@f$ where @f$t@f$
37723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * and @f$p@f$ are the parameters of the distribution.
37733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
37743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _IntType = int>
37753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class negative_binomial_distribution
37763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
37773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_integral<_IntType>::value,
37783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument not an integral type");
37793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
37803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
37813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the range of the distribution. */
37823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _IntType result_type;
37833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** Parameter type. */
37843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct param_type
37853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
37863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	typedef negative_binomial_distribution<_IntType> distribution_type;
37873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
37883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	explicit
37893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type(_IntType __k = 1, double __p = 0.5)
37903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_k(__k), _M_p(__p)
37913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{
37923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  _GLIBCXX_DEBUG_ASSERT((_M_k > 0) && (_M_p > 0.0) && (_M_p <= 1.0));
37933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	}
37943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
37953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_IntType
37963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	k() const
37973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_k; }
37983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
37993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	double
38003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	p() const
38013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_p; }
38023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
38033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend bool
38043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
38053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return __p1._M_k == __p2._M_k && __p1._M_p == __p2._M_p; }
38063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
38073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      private:
38083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_IntType _M_k;
38093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	double _M_p;
38103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      };
38113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
38123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
38133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      negative_binomial_distribution(_IntType __k = 1, double __p = 0.5)
38143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__k, __p), _M_gd(__k, (1.0 - __p) / __p)
38153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
38163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
38173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
38183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      negative_binomial_distribution(const param_type& __p)
38193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__p), _M_gd(__p.k(), (1.0 - __p.p()) / __p.p())
38203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
38213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
38223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
38233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Resets the distribution state.
38243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
38253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
38263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      reset()
38273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_gd.reset(); }
38283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
38293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
38303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Return the @f$k@f$ parameter of the distribution.
38313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
38323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _IntType
38333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      k() const
38343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.k(); }
38353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
38363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
38373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Return the @f$p@f$ parameter of the distribution.
38383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
38393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      double
38403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      p() const
38413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.p(); }
38423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
38433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
38443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the parameter set of the distribution.
38453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
38463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type
38473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param() const
38483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param; }
38493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
38503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
38513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Sets the parameter set of the distribution.
38523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __param The new parameter set of the distribution.
38533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
38543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
38553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param(const param_type& __param)
38563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_param = __param; }
38573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
38583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
38593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
38603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
38613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
38623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min() const
38633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return result_type(0); }
38643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
38653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
38663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the least upper bound value of the distribution.
38673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
38683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
38693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max() const
38703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return std::numeric_limits<result_type>::max(); }
38713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
38723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
38733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Generating functions.
38743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
38753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
38763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
38773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        operator()(_UniformRandomNumberGenerator& __urng);
38783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
38793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
38803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
38813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
38823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const param_type& __p);
38833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
38843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
38853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Return true if two negative binomial distributions have
38863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        the same parameters and the sequences that would be
38873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        generated are equal.
38883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
38893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      friend bool
38903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      operator==(const negative_binomial_distribution& __d1,
38913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		 const negative_binomial_distribution& __d2)
38923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return __d1.param() == __d2.param() && __d1._M_gd == __d2._M_gd; }
38933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
38943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
38953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Inserts a %negative_binomial_distribution random
38963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        number distribution @p __x into the output stream @p __os.
38973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
38983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __os An output stream.
38993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A %negative_binomial_distribution random number
39003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *             distribution.
39013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
39023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
39033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *          an error state.
39043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
39053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _IntType1, typename _CharT, typename _Traits>
39063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
39073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
39083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const std::negative_binomial_distribution<_IntType1>& __x);
39093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
39103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
39113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Extracts a %negative_binomial_distribution random number
39123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        distribution @p __x from the input stream @p __is.
39133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
39143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __is An input stream.
39153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x A %negative_binomial_distribution random number
39163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *            generator engine.
39173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
39183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The input stream with @p __x extracted or in an error state.
39193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
39203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _IntType1, typename _CharT, typename _Traits>
39213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
39223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
39233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   std::negative_binomial_distribution<_IntType1>& __x);
39243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
39253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
39263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type _M_param;
39273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
39283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      std::gamma_distribution<double> _M_gd;
39293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
39303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
39313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
39323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Return true if two negative binomial distributions are different.
39333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
39343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _IntType>
39353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
39363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::negative_binomial_distribution<_IntType>& __d1,
39373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::negative_binomial_distribution<_IntType>& __d2)
39383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__d1 == __d2); }
39393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
39403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
39413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /* @} */ // group random_distributions_bernoulli
39423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
39433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
39443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @addtogroup random_distributions_poisson Poisson Distributions
39453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @ingroup random_distributions
39463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @{
39473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
39483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
39493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
39503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief A discrete Poisson random number distribution.
39513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
39523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The formula for the Poisson probability density function is
39533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f$p(i|\mu) = \frac{\mu^i}{i!} e^{-\mu}@f$ where @f$\mu@f$ is the
39543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * parameter of the distribution.
39553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
39563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _IntType = int>
39573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class poisson_distribution
39583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
39593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_integral<_IntType>::value,
39603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument not an integral type");
39613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
39623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
39633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the range of the distribution. */
39643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _IntType  result_type;
39653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** Parameter type. */
39663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct param_type
39673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
39683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	typedef poisson_distribution<_IntType> distribution_type;
39693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend class poisson_distribution<_IntType>;
39703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
39713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	explicit
39723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type(double __mean = 1.0)
39733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_mean(__mean)
39743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{
39753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  _GLIBCXX_DEBUG_ASSERT(_M_mean > 0.0);
39763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  _M_initialize();
39773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	}
39783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
39793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	double
39803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	mean() const
39813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_mean; }
39823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
39833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend bool
39843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
39853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return __p1._M_mean == __p2._M_mean; }
39863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
39873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      private:
39883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	// Hosts either log(mean) or the threshold of the simple method.
39893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	void
39903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_M_initialize();
39913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
39923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	double _M_mean;
39933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
39943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	double _M_lm_thr;
39953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#if _GLIBCXX_USE_C99_MATH_TR1
39963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	double _M_lfm, _M_sm, _M_d, _M_scx, _M_1cx, _M_c2b, _M_cb;
39973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#endif
39983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      };
39993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
40003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      // constructors and member function
40013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
40023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      poisson_distribution(double __mean = 1.0)
40033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__mean), _M_nd()
40043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
40053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
40063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
40073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      poisson_distribution(const param_type& __p)
40083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__p), _M_nd()
40093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
40103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
40113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
40123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Resets the distribution state.
40133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
40143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
40153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      reset()
40163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_nd.reset(); }
40173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
40183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
40193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the distribution parameter @p mean.
40203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
40213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      double
40223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      mean() const
40233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.mean(); }
40243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
40253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
40263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the parameter set of the distribution.
40273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
40283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type
40293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param() const
40303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param; }
40313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
40323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
40333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Sets the parameter set of the distribution.
40343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __param The new parameter set of the distribution.
40353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
40363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
40373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param(const param_type& __param)
40383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_param = __param; }
40393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
40403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
40413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
40423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
40433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
40443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min() const
40453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return 0; }
40463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
40473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
40483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the least upper bound value of the distribution.
40493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
40503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
40513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max() const
40523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return std::numeric_limits<result_type>::max(); }
40533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
40543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
40553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Generating functions.
40563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
40573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
40583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
40593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
40603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return this->operator()(__urng, this->param()); }
40613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
40623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
40633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
40643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
40653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const param_type& __p);
40663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
40673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       /**
40683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	* @brief Return true if two Poisson distributions have the same
40693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	*        parameters and the sequences that would be generated
40703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	*        are equal.
40713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	*/
40723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      friend bool
40733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      operator==(const poisson_distribution& __d1,
40743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		 const poisson_distribution& __d2)
40753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#ifdef _GLIBCXX_USE_C99_MATH_TR1
40763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return __d1.param() == __d2.param() && __d1._M_nd == __d2._M_nd; }
40773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#else
40783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return __d1.param() == __d2.param(); }
40793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#endif
40803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
40813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
40823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Inserts a %poisson_distribution random number distribution
40833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @p __x into the output stream @p __os.
40843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
40853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __os An output stream.
40863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A %poisson_distribution random number distribution.
40873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
40883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
40893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * an error state.
40903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
40913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _IntType1, typename _CharT, typename _Traits>
40923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
40933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
40943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const std::poisson_distribution<_IntType1>& __x);
40953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
40963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
40973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Extracts a %poisson_distribution random number distribution
40983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @p __x from the input stream @p __is.
40993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
41003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __is An input stream.
41013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A %poisson_distribution random number generator engine.
41023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
41033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The input stream with @p __x extracted or in an error
41043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *          state.
41053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
41063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _IntType1, typename _CharT, typename _Traits>
41073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
41083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
41093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   std::poisson_distribution<_IntType1>& __x);
41103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
41113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
41123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type _M_param;
41133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
41143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      // NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined.
41153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      std::normal_distribution<double> _M_nd;
41163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
41173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
41183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
41193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Return true if two Poisson distributions are different.
41203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
41213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _IntType>
41223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
41233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::poisson_distribution<_IntType>& __d1,
41243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::poisson_distribution<_IntType>& __d2)
41253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__d1 == __d2); }
41263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
41273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
41283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
41293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief An exponential continuous distribution for random numbers.
41303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
41313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The formula for the exponential probability density function is
41323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f$p(x|\lambda) = \lambda e^{-\lambda x}@f$.
41333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
41343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * <table border=1 cellpadding=10 cellspacing=0>
41353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * <caption align=top>Distribution Statistics</caption>
41363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * <tr><td>Mean</td><td>@f$\frac{1}{\lambda}@f$</td></tr>
41373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * <tr><td>Median</td><td>@f$\frac{\ln 2}{\lambda}@f$</td></tr>
41383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * <tr><td>Mode</td><td>@f$zero@f$</td></tr>
41393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * <tr><td>Range</td><td>@f$[0, \infty]@f$</td></tr>
41403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * <tr><td>Standard Deviation</td><td>@f$\frac{1}{\lambda}@f$</td></tr>
41413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * </table>
41423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
41433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType = double>
41443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class exponential_distribution
41453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
41463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
41473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument not a floating point type");
41483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
41493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
41503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the range of the distribution. */
41513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _RealType result_type;
41523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** Parameter type. */
41533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct param_type
41543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
41553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	typedef exponential_distribution<_RealType> distribution_type;
41563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
41573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	explicit
41583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type(_RealType __lambda = _RealType(1))
41593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_lambda(__lambda)
41603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{
41613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  _GLIBCXX_DEBUG_ASSERT(_M_lambda > _RealType(0));
41623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	}
41633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
41643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType
41653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	lambda() const
41663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_lambda; }
41673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
41683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend bool
41693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
41703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return __p1._M_lambda == __p2._M_lambda; }
41713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
41723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      private:
41733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType _M_lambda;
41743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      };
41753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
41763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
41773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
41783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Constructs an exponential distribution with inverse scale
41793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        parameter @f$\lambda@f$.
41803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
41813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
41823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      exponential_distribution(const result_type& __lambda = result_type(1))
41833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__lambda)
41843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
41853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
41863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
41873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      exponential_distribution(const param_type& __p)
41883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__p)
41893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
41903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
41913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
41923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Resets the distribution state.
41933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
41943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * Has no effect on exponential distributions.
41953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
41963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
41973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      reset() { }
41983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
41993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
42003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the inverse scale parameter of the distribution.
42013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
42023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _RealType
42033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      lambda() const
42043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.lambda(); }
42053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
42063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
42073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the parameter set of the distribution.
42083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
42093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type
42103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param() const
42113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param; }
42123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
42133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
42143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Sets the parameter set of the distribution.
42153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __param The new parameter set of the distribution.
42163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
42173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
42183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param(const param_type& __param)
42193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_param = __param; }
42203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
42213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
42223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
42233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
42243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
42253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min() const
42263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return result_type(0); }
42273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
42283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
42293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the least upper bound value of the distribution.
42303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
42313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
42323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max() const
42333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return std::numeric_limits<result_type>::max(); }
42343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
42353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
42363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Generating functions.
42373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
42383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
42393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
42403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
42413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        { return this->operator()(__urng, this->param()); }
42423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
42433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
42443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
42453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
42463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const param_type& __p)
42473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{
42483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
42493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	    __aurng(__urng);
42503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  return -std::log(__aurng()) / __p.lambda();
42513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	}
42523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
42533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
42543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type _M_param;
42553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
42563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
42573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
42583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Return true if two exponential distributions have the same
42593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *        parameters.
42603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
42613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType>
42623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
42633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator==(const std::exponential_distribution<_RealType>& __d1,
42643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::exponential_distribution<_RealType>& __d2)
42653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return __d1.param() == __d2.param(); }
42663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
42673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
42683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Return true if two exponential distributions have different
42693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *        parameters.
42703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
42713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType>
42723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
42733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::exponential_distribution<_RealType>& __d1,
42743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::exponential_distribution<_RealType>& __d2)
42753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__d1 == __d2); }
42763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
42773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
42783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Inserts a %exponential_distribution random number distribution
42793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @p __x into the output stream @p __os.
42803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
42813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __os An output stream.
42823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __x  A %exponential_distribution random number distribution.
42833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
42843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns The output stream with the state of @p __x inserted or in
42853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * an error state.
42863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
42873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType, typename _CharT, typename _Traits>
42883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    std::basic_ostream<_CharT, _Traits>&
42893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
42903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::exponential_distribution<_RealType>& __x);
42913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
42923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
42933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Extracts a %exponential_distribution random number distribution
42943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @p __x from the input stream @p __is.
42953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
42963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __is An input stream.
42973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __x A %exponential_distribution random number
42983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *            generator engine.
42993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
43003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns The input stream with @p __x extracted or in an error state.
43013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
43023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType, typename _CharT, typename _Traits>
43033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    std::basic_istream<_CharT, _Traits>&
43043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator>>(std::basic_istream<_CharT, _Traits>& __is,
43053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       std::exponential_distribution<_RealType>& __x);
43063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
43073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
43083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
43093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief A weibull_distribution random number distribution.
43103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
43113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The formula for the normal probability density function is:
43123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f[
43133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *     p(x|\alpha,\beta) = \frac{\alpha}{\beta} (\frac{x}{\beta})^{\alpha-1}
43143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *                         \exp{(-(\frac{x}{\beta})^\alpha)}
43153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f]
43163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
43173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType = double>
43183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class weibull_distribution
43193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
43203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
43213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument not a floating point type");
43223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
43233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
43243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the range of the distribution. */
43253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _RealType result_type;
43263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** Parameter type. */
43273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct param_type
43283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
43293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	typedef weibull_distribution<_RealType> distribution_type;
43303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
43313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	explicit
43323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type(_RealType __a = _RealType(1),
43333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   _RealType __b = _RealType(1))
43343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_a(__a), _M_b(__b)
43353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ }
43363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
43373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType
43383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	a() const
43393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_a; }
43403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
43413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType
43423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	b() const
43433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_b; }
43443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
43453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend bool
43463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
43473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
43483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
43493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      private:
43503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType _M_a;
43513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType _M_b;
43523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      };
43533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
43543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
43553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      weibull_distribution(_RealType __a = _RealType(1),
43563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh			   _RealType __b = _RealType(1))
43573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__a, __b)
43583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
43593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
43603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
43613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      weibull_distribution(const param_type& __p)
43623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__p)
43633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
43643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
43653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
43663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Resets the distribution state.
43673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
43683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
43693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      reset()
43703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
43713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
43723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
43733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Return the @f$a@f$ parameter of the distribution.
43743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
43753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _RealType
43763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      a() const
43773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.a(); }
43783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
43793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
43803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Return the @f$b@f$ parameter of the distribution.
43813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
43823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _RealType
43833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      b() const
43843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.b(); }
43853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
43863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
43873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the parameter set of the distribution.
43883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
43893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type
43903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param() const
43913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param; }
43923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
43933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
43943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Sets the parameter set of the distribution.
43953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __param The new parameter set of the distribution.
43963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
43973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
43983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param(const param_type& __param)
43993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_param = __param; }
44003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
44013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
44023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
44033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
44043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
44053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min() const
44063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return result_type(0); }
44073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
44083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
44093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the least upper bound value of the distribution.
44103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
44113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
44123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max() const
44133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return std::numeric_limits<result_type>::max(); }
44143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
44153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
44163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Generating functions.
44173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
44183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
44193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
44203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
44213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return this->operator()(__urng, this->param()); }
44223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
44233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
44243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
44253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
44263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const param_type& __p);
44273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
44283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
44293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type _M_param;
44303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
44313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
44323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   /**
44333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    * @brief Return true if two Weibull distributions have the same
44343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    *        parameters.
44353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    */
44363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType>
44373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
44383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator==(const std::weibull_distribution<_RealType>& __d1,
44393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::weibull_distribution<_RealType>& __d2)
44403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return __d1.param() == __d2.param(); }
44413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
44423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   /**
44433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    * @brief Return true if two Weibull distributions have different
44443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    *        parameters.
44453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    */
44463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType>
44473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
44483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::weibull_distribution<_RealType>& __d1,
44493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::weibull_distribution<_RealType>& __d2)
44503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__d1 == __d2); }
44513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
44523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
44533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Inserts a %weibull_distribution random number distribution
44543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @p __x into the output stream @p __os.
44553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
44563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __os An output stream.
44573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __x  A %weibull_distribution random number distribution.
44583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
44593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns The output stream with the state of @p __x inserted or in
44603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * an error state.
44613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
44623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType, typename _CharT, typename _Traits>
44633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    std::basic_ostream<_CharT, _Traits>&
44643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
44653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::weibull_distribution<_RealType>& __x);
44663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
44673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
44683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Extracts a %weibull_distribution random number distribution
44693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @p __x from the input stream @p __is.
44703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
44713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __is An input stream.
44723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __x A %weibull_distribution random number
44733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *            generator engine.
44743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
44753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns The input stream with @p __x extracted or in an error state.
44763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
44773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType, typename _CharT, typename _Traits>
44783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    std::basic_istream<_CharT, _Traits>&
44793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator>>(std::basic_istream<_CharT, _Traits>& __is,
44803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       std::weibull_distribution<_RealType>& __x);
44813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
44823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
44833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
44843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief A extreme_value_distribution random number distribution.
44853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
44863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The formula for the normal probability mass function is
44873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f[
44883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *     p(x|a,b) = \frac{1}{b}
44893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *                \exp( \frac{a-x}{b} - \exp(\frac{a-x}{b}))
44903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @f]
44913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
44923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType = double>
44933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class extreme_value_distribution
44943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
44953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
44963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument not a floating point type");
44973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
44983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
44993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the range of the distribution. */
45003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _RealType result_type;
45013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** Parameter type. */
45023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct param_type
45033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
45043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	typedef extreme_value_distribution<_RealType> distribution_type;
45053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
45063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	explicit
45073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type(_RealType __a = _RealType(0),
45083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   _RealType __b = _RealType(1))
45093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_a(__a), _M_b(__b)
45103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ }
45113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
45123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType
45133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	a() const
45143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_a; }
45153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
45163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType
45173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	b() const
45183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_b; }
45193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
45203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend bool
45213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
45223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
45233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
45243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      private:
45253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType _M_a;
45263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_RealType _M_b;
45273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      };
45283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
45293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
45303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      extreme_value_distribution(_RealType __a = _RealType(0),
45313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh				 _RealType __b = _RealType(1))
45323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__a, __b)
45333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
45343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
45353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
45363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      extreme_value_distribution(const param_type& __p)
45373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__p)
45383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
45393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
45403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
45413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Resets the distribution state.
45423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
45433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
45443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      reset()
45453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
45463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
45473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
45483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Return the @f$a@f$ parameter of the distribution.
45493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
45503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _RealType
45513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      a() const
45523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.a(); }
45533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
45543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
45553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Return the @f$b@f$ parameter of the distribution.
45563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
45573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      _RealType
45583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      b() const
45593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param.b(); }
45603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
45613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
45623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the parameter set of the distribution.
45633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
45643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type
45653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param() const
45663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param; }
45673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
45683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
45693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Sets the parameter set of the distribution.
45703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __param The new parameter set of the distribution.
45713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
45723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
45733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param(const param_type& __param)
45743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_param = __param; }
45753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
45763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
45773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
45783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
45793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
45803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min() const
45813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return std::numeric_limits<result_type>::min(); }
45823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
45833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
45843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the least upper bound value of the distribution.
45853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
45863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
45873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max() const
45883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return std::numeric_limits<result_type>::max(); }
45893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
45903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
45913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Generating functions.
45923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
45933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
45943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
45953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
45963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return this->operator()(__urng, this->param()); }
45973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
45983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
45993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
46003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
46013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const param_type& __p);
46023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
46033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
46043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type _M_param;
46053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
46063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
46073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
46083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    * @brief Return true if two extreme value distributions have the same
46093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    *        parameters.
46103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
46113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType>
46123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
46133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator==(const std::extreme_value_distribution<_RealType>& __d1,
46143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::extreme_value_distribution<_RealType>& __d2)
46153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return __d1.param() == __d2.param(); }
46163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
46173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
46183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    * @brief Return true if two extreme value distributions have different
46193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    *        parameters.
46203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
46213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType>
46223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
46233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::extreme_value_distribution<_RealType>& __d1,
46243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::extreme_value_distribution<_RealType>& __d2)
46253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__d1 == __d2); }
46263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
46273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
46283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Inserts a %extreme_value_distribution random number distribution
46293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @p __x into the output stream @p __os.
46303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
46313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __os An output stream.
46323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __x  A %extreme_value_distribution random number distribution.
46333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
46343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns The output stream with the state of @p __x inserted or in
46353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * an error state.
46363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
46373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType, typename _CharT, typename _Traits>
46383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    std::basic_ostream<_CharT, _Traits>&
46393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
46403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::extreme_value_distribution<_RealType>& __x);
46413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
46423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
46433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief Extracts a %extreme_value_distribution random number
46443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *        distribution @p __x from the input stream @p __is.
46453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
46463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __is An input stream.
46473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @param __x A %extreme_value_distribution random number
46483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *            generator engine.
46493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
46503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @returns The input stream with @p __x extracted or in an error state.
46513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
46523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType, typename _CharT, typename _Traits>
46533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    std::basic_istream<_CharT, _Traits>&
46543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator>>(std::basic_istream<_CharT, _Traits>& __is,
46553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       std::extreme_value_distribution<_RealType>& __x);
46563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
46573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
46583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
46593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief A discrete_distribution random number distribution.
46603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
46613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The formula for the discrete probability mass function is
46623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
46633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
46643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _IntType = int>
46653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class discrete_distribution
46663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
46673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_integral<_IntType>::value,
46683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument not an integral type");
46693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
46703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
46713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the range of the distribution. */
46723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _IntType result_type;
46733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** Parameter type. */
46743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct param_type
46753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
46763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	typedef discrete_distribution<_IntType> distribution_type;
46773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend class discrete_distribution<_IntType>;
46783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
46793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type()
46803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_prob(), _M_cp()
46813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ }
46823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
46833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	template<typename _InputIterator>
46843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  param_type(_InputIterator __wbegin,
46853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		     _InputIterator __wend)
46863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  : _M_prob(__wbegin, __wend), _M_cp()
46873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  { _M_initialize(); }
46883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
46893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type(initializer_list<double> __wil)
46903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_prob(__wil.begin(), __wil.end()), _M_cp()
46913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ _M_initialize(); }
46923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
46933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	template<typename _Func>
46943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  param_type(size_t __nw, double __xmin, double __xmax,
46953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		     _Func __fw);
46963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
46973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	// See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/
46983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type(const param_type&) = default;
46993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type& operator=(const param_type&) = default;
47003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
47013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	std::vector<double>
47023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	probabilities() const
47033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_prob.empty() ? std::vector<double>(1, 1.0) : _M_prob; }
47043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
47053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend bool
47063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
47073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return __p1._M_prob == __p2._M_prob; }
47083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
47093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      private:
47103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	void
47113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_M_initialize();
47123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
47133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	std::vector<double> _M_prob;
47143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	std::vector<double> _M_cp;
47153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      };
47163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
47173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      discrete_distribution()
47183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param()
47193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
47203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
47213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _InputIterator>
47223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	discrete_distribution(_InputIterator __wbegin,
47233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh			      _InputIterator __wend)
47243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_param(__wbegin, __wend)
47253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ }
47263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
47273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      discrete_distribution(initializer_list<double> __wl)
47283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__wl)
47293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
47303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
47313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _Func>
47323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	discrete_distribution(size_t __nw, double __xmin, double __xmax,
47333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh			      _Func __fw)
47343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_param(__nw, __xmin, __xmax, __fw)
47353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ }
47363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
47373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
47383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      discrete_distribution(const param_type& __p)
47393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__p)
47403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
47413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
47423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
47433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Resets the distribution state.
47443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
47453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
47463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      reset()
47473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
47483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
47493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
47503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the probabilities of the distribution.
47513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
47523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      std::vector<double>
47533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      probabilities() const
47543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
47553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	return _M_param._M_prob.empty()
47563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  ? std::vector<double>(1, 1.0) : _M_param._M_prob;
47573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
47583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
47593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
47603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the parameter set of the distribution.
47613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
47623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type
47633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param() const
47643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param; }
47653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
47663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
47673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Sets the parameter set of the distribution.
47683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __param The new parameter set of the distribution.
47693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
47703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
47713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param(const param_type& __param)
47723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_param = __param; }
47733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
47743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
47753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
47763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
47773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
47783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min() const
47793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return result_type(0); }
47803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
47813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
47823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the least upper bound value of the distribution.
47833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
47843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
47853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max() const
47863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
47873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	return _M_param._M_prob.empty()
47883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  ? result_type(0) : result_type(_M_param._M_prob.size() - 1);
47893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
47903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
47913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
47923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Generating functions.
47933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
47943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
47953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
47963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
47973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return this->operator()(__urng, this->param()); }
47983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
47993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
48003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
48013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
48023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const param_type& __p);
48033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
48043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
48053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Inserts a %discrete_distribution random number distribution
48063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @p __x into the output stream @p __os.
48073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
48083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __os An output stream.
48093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A %discrete_distribution random number distribution.
48103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
48113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
48123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * an error state.
48133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
48143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _IntType1, typename _CharT, typename _Traits>
48153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
48163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
48173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const std::discrete_distribution<_IntType1>& __x);
48183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
48193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
48203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Extracts a %discrete_distribution random number distribution
48213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @p __x from the input stream @p __is.
48223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
48233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __is An input stream.
48243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x A %discrete_distribution random number
48253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *            generator engine.
48263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
48273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The input stream with @p __x extracted or in an error
48283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *          state.
48293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
48303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _IntType1, typename _CharT, typename _Traits>
48313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
48323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
48333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   std::discrete_distribution<_IntType1>& __x);
48343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
48353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
48363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type _M_param;
48373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
48383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
48393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
48403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    * @brief Return true if two discrete distributions have the same
48413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    *        parameters.
48423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    */
48433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _IntType>
48443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
48453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator==(const std::discrete_distribution<_IntType>& __d1,
48463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::discrete_distribution<_IntType>& __d2)
48473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return __d1.param() == __d2.param(); }
48483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
48493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
48503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    * @brief Return true if two discrete distributions have different
48513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    *        parameters.
48523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    */
48533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _IntType>
48543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
48553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::discrete_distribution<_IntType>& __d1,
48563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::discrete_distribution<_IntType>& __d2)
48573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__d1 == __d2); }
48583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
48593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
48603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
48613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief A piecewise_constant_distribution random number distribution.
48623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
48633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The formula for the piecewise constant probability mass function is
48643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
48653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
48663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType = double>
48673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class piecewise_constant_distribution
48683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
48693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
48703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument not a floating point type");
48713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
48723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
48733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the range of the distribution. */
48743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _RealType result_type;
48753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** Parameter type. */
48763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct param_type
48773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
48783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	typedef piecewise_constant_distribution<_RealType> distribution_type;
48793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend class piecewise_constant_distribution<_RealType>;
48803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
48813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type()
48823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_int(), _M_den(), _M_cp()
48833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ }
48843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
48853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	template<typename _InputIteratorB, typename _InputIteratorW>
48863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  param_type(_InputIteratorB __bfirst,
48873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		     _InputIteratorB __bend,
48883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		     _InputIteratorW __wbegin);
48893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
48903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	template<typename _Func>
48913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  param_type(initializer_list<_RealType> __bi, _Func __fw);
48923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
48933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	template<typename _Func>
48943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  param_type(size_t __nw, _RealType __xmin, _RealType __xmax,
48953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		     _Func __fw);
48963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
48973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	// See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/
48983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type(const param_type&) = default;
48993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type& operator=(const param_type&) = default;
49003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
49013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	std::vector<_RealType>
49023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	intervals() const
49033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{
49043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  if (_M_int.empty())
49053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	    {
49063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	      std::vector<_RealType> __tmp(2);
49073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	      __tmp[1] = _RealType(1);
49083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	      return __tmp;
49093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	    }
49103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  else
49113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	    return _M_int;
49123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	}
49133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
49143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	std::vector<double>
49153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	densities() const
49163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_den.empty() ? std::vector<double>(1, 1.0) : _M_den; }
49173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
49183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend bool
49193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
49203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return __p1._M_int == __p2._M_int && __p1._M_den == __p2._M_den; }
49213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
49223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      private:
49233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	void
49243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_M_initialize();
49253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
49263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	std::vector<_RealType> _M_int;
49273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	std::vector<double> _M_den;
49283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	std::vector<double> _M_cp;
49293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      };
49303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
49313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
49323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      piecewise_constant_distribution()
49333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param()
49343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
49353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
49363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _InputIteratorB, typename _InputIteratorW>
49373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	piecewise_constant_distribution(_InputIteratorB __bfirst,
49383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh					_InputIteratorB __bend,
49393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh					_InputIteratorW __wbegin)
49403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_param(__bfirst, __bend, __wbegin)
49413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ }
49423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
49433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _Func>
49443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	piecewise_constant_distribution(initializer_list<_RealType> __bl,
49453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh					_Func __fw)
49463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_param(__bl, __fw)
49473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ }
49483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
49493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _Func>
49503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	piecewise_constant_distribution(size_t __nw,
49513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh					_RealType __xmin, _RealType __xmax,
49523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh					_Func __fw)
49533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_param(__nw, __xmin, __xmax, __fw)
49543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ }
49553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
49563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
49573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      piecewise_constant_distribution(const param_type& __p)
49583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__p)
49593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
49603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
49613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
49623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Resets the distribution state.
49633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
49643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
49653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      reset()
49663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
49673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
49683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
49693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns a vector of the intervals.
49703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
49713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      std::vector<_RealType>
49723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      intervals() const
49733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
49743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	if (_M_param._M_int.empty())
49753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  {
49763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	    std::vector<_RealType> __tmp(2);
49773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	    __tmp[1] = _RealType(1);
49783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	    return __tmp;
49793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  }
49803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	else
49813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  return _M_param._M_int;
49823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
49833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
49843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
49853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns a vector of the probability densities.
49863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
49873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      std::vector<double>
49883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      densities() const
49893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
49903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	return _M_param._M_den.empty()
49913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  ? std::vector<double>(1, 1.0) : _M_param._M_den;
49923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
49933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
49943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
49953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the parameter set of the distribution.
49963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
49973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type
49983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param() const
49993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param; }
50003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
50013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
50023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Sets the parameter set of the distribution.
50033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __param The new parameter set of the distribution.
50043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
50053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
50063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param(const param_type& __param)
50073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_param = __param; }
50083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
50093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
50103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
50113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
50123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
50133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min() const
50143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
50153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	return _M_param._M_int.empty()
50163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  ? result_type(0) : _M_param._M_int.front();
50173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
50183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
50193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
50203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the least upper bound value of the distribution.
50213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
50223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
50233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max() const
50243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
50253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	return _M_param._M_int.empty()
50263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  ? result_type(1) : _M_param._M_int.back();
50273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
50283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
50293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
50303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Generating functions.
50313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
50323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
50333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
50343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
50353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return this->operator()(__urng, this->param()); }
50363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
50373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
50383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
50393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
50403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const param_type& __p);
50413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
50423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
50433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Inserts a %piecewise_constan_distribution random
50443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        number distribution @p __x into the output stream @p __os.
50453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
50463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __os An output stream.
50473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A %piecewise_constan_distribution random number
50483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *             distribution.
50493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
50503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
50513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * an error state.
50523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
50533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
50543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
50553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
50563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const std::piecewise_constant_distribution<_RealType1>& __x);
50573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
50583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
50593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Extracts a %piecewise_constan_distribution random
50603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        number distribution @p __x from the input stream @p __is.
50613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
50623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __is An input stream.
50633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x A %piecewise_constan_distribution random number
50643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *            generator engine.
50653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
50663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The input stream with @p __x extracted or in an error
50673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *          state.
50683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
50693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
50703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
50713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
50723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   std::piecewise_constant_distribution<_RealType1>& __x);
50733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
50743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
50753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type _M_param;
50763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
50773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
50783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
50793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    * @brief Return true if two piecewise constant distributions have the
50803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    *        same parameters.
50813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
50823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType>
50833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
50843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator==(const std::piecewise_constant_distribution<_RealType>& __d1,
50853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::piecewise_constant_distribution<_RealType>& __d2)
50863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return __d1.param() == __d2.param(); }
50873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
50883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
50893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    * @brief Return true if two piecewise constant distributions have
50903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    *        different parameters.
50913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
50923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType>
50933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
50943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::piecewise_constant_distribution<_RealType>& __d1,
50953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::piecewise_constant_distribution<_RealType>& __d2)
50963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__d1 == __d2); }
50973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
50983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
50993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
51003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief A piecewise_linear_distribution random number distribution.
51013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
51023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * The formula for the piecewise linear probability mass function is
51033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *
51043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
51053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType = double>
51063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    class piecewise_linear_distribution
51073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    {
51083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      static_assert(std::is_floating_point<_RealType>::value,
51093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		    "template argument not a floating point type");
51103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
51113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    public:
51123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** The type of the range of the distribution. */
51133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      typedef _RealType result_type;
51143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /** Parameter type. */
51153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      struct param_type
51163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
51173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	typedef piecewise_linear_distribution<_RealType> distribution_type;
51183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend class piecewise_linear_distribution<_RealType>;
51193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
51203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type()
51213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_int(), _M_den(), _M_cp(), _M_m()
51223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ }
51233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
51243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	template<typename _InputIteratorB, typename _InputIteratorW>
51253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  param_type(_InputIteratorB __bfirst,
51263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		     _InputIteratorB __bend,
51273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		     _InputIteratorW __wbegin);
51283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
51293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	template<typename _Func>
51303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  param_type(initializer_list<_RealType> __bl, _Func __fw);
51313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
51323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	template<typename _Func>
51333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  param_type(size_t __nw, _RealType __xmin, _RealType __xmax,
51343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		     _Func __fw);
51353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
51363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	// See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/
51373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type(const param_type&) = default;
51383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	param_type& operator=(const param_type&) = default;
51393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
51403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	std::vector<_RealType>
51413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	intervals() const
51423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{
51433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  if (_M_int.empty())
51443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	    {
51453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	      std::vector<_RealType> __tmp(2);
51463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	      __tmp[1] = _RealType(1);
51473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	      return __tmp;
51483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	    }
51493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  else
51503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	    return _M_int;
51513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	}
51523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
51533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	std::vector<double>
51543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	densities() const
51553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return _M_den.empty() ? std::vector<double>(2, 1.0) : _M_den; }
51563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
51573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend bool
51583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator==(const param_type& __p1, const param_type& __p2)
51593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return (__p1._M_int == __p2._M_int
51603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		  && __p1._M_den == __p2._M_den); }
51613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
51623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      private:
51633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	void
51643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	_M_initialize();
51653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
51663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	std::vector<_RealType> _M_int;
51673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	std::vector<double> _M_den;
51683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	std::vector<double> _M_cp;
51693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	std::vector<double> _M_m;
51703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      };
51713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
51723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
51733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      piecewise_linear_distribution()
51743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param()
51753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
51763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
51773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _InputIteratorB, typename _InputIteratorW>
51783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	piecewise_linear_distribution(_InputIteratorB __bfirst,
51793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh				      _InputIteratorB __bend,
51803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh				      _InputIteratorW __wbegin)
51813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_param(__bfirst, __bend, __wbegin)
51823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ }
51833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
51843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _Func>
51853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	piecewise_linear_distribution(initializer_list<_RealType> __bl,
51863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh				      _Func __fw)
51873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_param(__bl, __fw)
51883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ }
51893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
51903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _Func>
51913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	piecewise_linear_distribution(size_t __nw,
51923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh				      _RealType __xmin, _RealType __xmax,
51933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh				      _Func __fw)
51943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	: _M_param(__nw, __xmin, __xmax, __fw)
51953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ }
51963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
51973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      explicit
51983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      piecewise_linear_distribution(const param_type& __p)
51993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      : _M_param(__p)
52003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
52013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
52023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
52033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * Resets the distribution state.
52043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
52053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
52063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      reset()
52073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { }
52083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
52093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
52103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Return the intervals of the distribution.
52113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
52123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      std::vector<_RealType>
52133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      intervals() const
52143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
52153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	if (_M_param._M_int.empty())
52163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  {
52173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	    std::vector<_RealType> __tmp(2);
52183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	    __tmp[1] = _RealType(1);
52193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	    return __tmp;
52203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  }
52213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	else
52223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  return _M_param._M_int;
52233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
52243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
52253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
52263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Return a vector of the probability densities of the
52273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        distribution.
52283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
52293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      std::vector<double>
52303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      densities() const
52313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
52323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	return _M_param._M_den.empty()
52333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  ? std::vector<double>(2, 1.0) : _M_param._M_den;
52343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
52353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
52363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
52373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the parameter set of the distribution.
52383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
52393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type
52403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param() const
52413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { return _M_param; }
52423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
52433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
52443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Sets the parameter set of the distribution.
52453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __param The new parameter set of the distribution.
52463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
52473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
52483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param(const param_type& __param)
52493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { _M_param = __param; }
52503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
52513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
52523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the greatest lower bound value of the distribution.
52533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
52543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
52553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      min() const
52563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
52573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	return _M_param._M_int.empty()
52583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  ? result_type(0) : _M_param._M_int.front();
52593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
52603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
52613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
52623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Returns the least upper bound value of the distribution.
52633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
52643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      result_type
52653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      max() const
52663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      {
52673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	return _M_param._M_int.empty()
52683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	  ? result_type(1) : _M_param._M_int.back();
52693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      }
52703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
52713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
52723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Generating functions.
52733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
52743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
52753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
52763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng)
52773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	{ return this->operator()(__urng, this->param()); }
52783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
52793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _UniformRandomNumberGenerator>
52803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	result_type
52813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator()(_UniformRandomNumberGenerator& __urng,
52823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const param_type& __p);
52833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
52843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
52853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Inserts a %piecewise_linear_distribution random number
52863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        distribution @p __x into the output stream @p __os.
52873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
52883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __os An output stream.
52893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A %piecewise_linear_distribution random number
52903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *             distribution.
52913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
52923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The output stream with the state of @p __x inserted or in
52933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *          an error state.
52943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
52953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
52963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_ostream<_CharT, _Traits>&
52973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
52983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   const std::piecewise_linear_distribution<_RealType1>& __x);
52993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
53003123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      /**
53013123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @brief Extracts a %piecewise_linear_distribution random number
53023123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *        distribution @p __x from the input stream @p __is.
53033123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
53043123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __is An input stream.
53053123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @param __x  A %piecewise_linear_distribution random number
53063123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *             generator engine.
53073123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *
53083123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       * @returns The input stream with @p __x extracted or in an error
53093123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       *          state.
53103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh       */
53113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      template<typename _RealType1, typename _CharT, typename _Traits>
53123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	friend std::basic_istream<_CharT, _Traits>&
53133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	operator>>(std::basic_istream<_CharT, _Traits>& __is,
53143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh		   std::piecewise_linear_distribution<_RealType1>& __x);
53153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
53163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    private:
53173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param_type _M_param;
53183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    };
53193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
53203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
53213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    * @brief Return true if two piecewise linear distributions have the
53223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    *        same parameters.
53233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
53243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType>
53253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
53263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator==(const std::piecewise_linear_distribution<_RealType>& __d1,
53273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::piecewise_linear_distribution<_RealType>& __d2)
53283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return __d1.param() == __d2.param(); }
53293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
53303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
53313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    * @brief Return true if two piecewise linear distributions have
53323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    *        different parameters.
53333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
53343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  template<typename _RealType>
53353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    inline bool
53363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    operator!=(const std::piecewise_linear_distribution<_RealType>& __d1,
53373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh	       const std::piecewise_linear_distribution<_RealType>& __d2)
53383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return !(__d1 == __d2); }
53393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
53403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
53413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /* @} */ // group random_distributions_poisson
53423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
53433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /* @} */ // group random_distributions
53443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
53453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
53463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @addtogroup random_utilities Random Number Utilities
53473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @ingroup random
53483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @{
53493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
53503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
53513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /**
53523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   * @brief The seed_seq class generates sequences of seeds for random
53533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   *        number generators.
53543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh   */
53553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  class seed_seq
53563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  {
53573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
53583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  public:
53593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    /** The type of the seed vales. */
53603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    typedef uint_least32_t result_type;
53613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
53623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    /** Default constructor. */
53633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    seed_seq()
53643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    : _M_v()
53653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { }
53663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
53673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    template<typename _IntType>
53683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      seed_seq(std::initializer_list<_IntType> il);
53693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
53703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    template<typename _InputIterator>
53713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      seed_seq(_InputIterator __begin, _InputIterator __end);
53723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
53733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    // generating functions
53743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    template<typename _RandomAccessIterator>
53753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
53763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      generate(_RandomAccessIterator __begin, _RandomAccessIterator __end);
53773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
53783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    // property functions
53793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    size_t size() const
53803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    { return _M_v.size(); }
53813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
53823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    template<typename OutputIterator>
53833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      void
53843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      param(OutputIterator __dest) const
53853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh      { std::copy(_M_v.begin(), _M_v.end(), __dest); }
53863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
53873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  private:
53883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    ///
53893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    std::vector<result_type> _M_v;
53903123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  };
53913123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
53923123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /* @} */ // group random_utilities
53933123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
53943123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh  /* @} */ // group random
53953123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
53963123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh_GLIBCXX_END_NAMESPACE_VERSION
53973123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh} // namespace std
53983123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
53993123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#endif
5400