mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-03 21:40:52 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			184 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
//  Copyright John Maddock 2007.
 | 
						|
//  Copyright Paul A. Bristow 2010
 | 
						|
//  Use, modification and distribution are subject to the
 | 
						|
//  Boost Software License, Version 1.0. (See accompanying file
 | 
						|
//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | 
						|
 | 
						|
// Note that this file contains quickbook mark-up as well as code
 | 
						|
// and comments, don't change any of the special comment mark-ups!
 | 
						|
 | 
						|
//[policy_eg_10
 | 
						|
 | 
						|
/*`
 | 
						|
 | 
						|
To understand how the rounding policies for 
 | 
						|
the discrete distributions can be used, we'll
 | 
						|
use the 50-sample binomial distribution with a 
 | 
						|
success fraction of 0.5 once again, and calculate
 | 
						|
all the possible quantiles at 0.05 and 0.95.
 | 
						|
 | 
						|
Begin by including the needed headers (and some using statements for conciseness):
 | 
						|
 | 
						|
*/
 | 
						|
#include <iostream>
 | 
						|
using std::cout; using std::endl;
 | 
						|
using std::left; using std::fixed; using std::right; using std::scientific;
 | 
						|
#include <iomanip>
 | 
						|
using std::setw;
 | 
						|
using std::setprecision;
 | 
						|
 | 
						|
#include <boost/math/distributions/binomial.hpp>
 | 
						|
/*`
 | 
						|
 | 
						|
Next we'll bring the needed declarations into scope, and
 | 
						|
define distribution types for all the available rounding policies:
 | 
						|
 | 
						|
*/
 | 
						|
// Avoid 
 | 
						|
// using namespace std; // and 
 | 
						|
// using namespace boost::math;
 | 
						|
// to avoid potential ambiguity of names, like binomial.
 | 
						|
// using namespace boost::math::policies; is small risk, but
 | 
						|
// the necessary items are brought into scope thus:
 | 
						|
 | 
						|
using boost::math::binomial_distribution;
 | 
						|
using boost::math::policies::policy;
 | 
						|
using boost::math::policies::discrete_quantile;
 | 
						|
 | 
						|
using boost::math::policies::integer_round_outwards;
 | 
						|
using boost::math::policies::integer_round_down;
 | 
						|
using boost::math::policies::integer_round_up;
 | 
						|
using boost::math::policies::integer_round_nearest;
 | 
						|
using boost::math::policies::integer_round_inwards;
 | 
						|
using boost::math::policies::real;
 | 
						|
 | 
						|
using boost::math::binomial_distribution; // Not std::binomial_distribution.
 | 
						|
 | 
						|
typedef binomial_distribution<
 | 
						|
            double, 
 | 
						|
            policy<discrete_quantile<integer_round_outwards> > > 
 | 
						|
        binom_round_outwards;
 | 
						|
 | 
						|
typedef binomial_distribution<
 | 
						|
            double, 
 | 
						|
            policy<discrete_quantile<integer_round_inwards> > > 
 | 
						|
        binom_round_inwards;
 | 
						|
 | 
						|
typedef binomial_distribution<
 | 
						|
            double, 
 | 
						|
            policy<discrete_quantile<integer_round_down> > > 
 | 
						|
        binom_round_down;
 | 
						|
 | 
						|
typedef binomial_distribution<
 | 
						|
            double, 
 | 
						|
            policy<discrete_quantile<integer_round_up> > > 
 | 
						|
        binom_round_up;
 | 
						|
 | 
						|
typedef binomial_distribution<
 | 
						|
            double, 
 | 
						|
            policy<discrete_quantile<integer_round_nearest> > > 
 | 
						|
        binom_round_nearest;
 | 
						|
 | 
						|
typedef binomial_distribution<
 | 
						|
            double, 
 | 
						|
            policy<discrete_quantile<real> > > 
 | 
						|
        binom_real_quantile;
 | 
						|
 | 
						|
/*`
 | 
						|
Now let's set to work calling those quantiles:
 | 
						|
*/
 | 
						|
 | 
						|
int main()
 | 
						|
{
 | 
						|
   cout << 
 | 
						|
      "Testing rounding policies for a 50 sample binomial distribution,\n"
 | 
						|
      "with a success fraction of 0.5.\n\n"
 | 
						|
      "Lower quantiles are calculated at p = 0.05\n\n"
 | 
						|
      "Upper quantiles at p = 0.95.\n\n";
 | 
						|
 | 
						|
   cout << setw(25) << right
 | 
						|
      << "Policy"<< setw(18) << right 
 | 
						|
      << "Lower Quantile" << setw(18) << right 
 | 
						|
      << "Upper Quantile" << endl;
 | 
						|
   
 | 
						|
   // Test integer_round_outwards:
 | 
						|
   cout << setw(25) << right
 | 
						|
      << "integer_round_outwards"
 | 
						|
      << setw(18) << right
 | 
						|
      << quantile(binom_round_outwards(50, 0.5), 0.05)
 | 
						|
      << setw(18) << right
 | 
						|
      << quantile(binom_round_outwards(50, 0.5), 0.95) 
 | 
						|
      << endl;
 | 
						|
   
 | 
						|
   // Test integer_round_inwards:
 | 
						|
   cout << setw(25) << right
 | 
						|
      << "integer_round_inwards"
 | 
						|
      << setw(18) << right
 | 
						|
      << quantile(binom_round_inwards(50, 0.5), 0.05)
 | 
						|
      << setw(18) << right
 | 
						|
      << quantile(binom_round_inwards(50, 0.5), 0.95) 
 | 
						|
      << endl;
 | 
						|
   
 | 
						|
   // Test integer_round_down:
 | 
						|
   cout << setw(25) << right
 | 
						|
      << "integer_round_down"
 | 
						|
      << setw(18) << right
 | 
						|
      << quantile(binom_round_down(50, 0.5), 0.05)
 | 
						|
      << setw(18) << right
 | 
						|
      << quantile(binom_round_down(50, 0.5), 0.95) 
 | 
						|
      << endl;
 | 
						|
   
 | 
						|
   // Test integer_round_up:
 | 
						|
   cout << setw(25) << right
 | 
						|
      << "integer_round_up"
 | 
						|
      << setw(18) << right
 | 
						|
      << quantile(binom_round_up(50, 0.5), 0.05)
 | 
						|
      << setw(18) << right
 | 
						|
      << quantile(binom_round_up(50, 0.5), 0.95) 
 | 
						|
      << endl;
 | 
						|
   
 | 
						|
   // Test integer_round_nearest:
 | 
						|
   cout << setw(25) << right
 | 
						|
      << "integer_round_nearest"
 | 
						|
      << setw(18) << right
 | 
						|
      << quantile(binom_round_nearest(50, 0.5), 0.05)
 | 
						|
      << setw(18) << right
 | 
						|
      << quantile(binom_round_nearest(50, 0.5), 0.95) 
 | 
						|
      << endl;
 | 
						|
   
 | 
						|
   // Test real:
 | 
						|
   cout << setw(25) << right
 | 
						|
      << "real"
 | 
						|
      << setw(18) << right
 | 
						|
      << quantile(binom_real_quantile(50, 0.5), 0.05)
 | 
						|
      << setw(18) << right
 | 
						|
      << quantile(binom_real_quantile(50, 0.5), 0.95) 
 | 
						|
      << endl;
 | 
						|
} // int main()
 | 
						|
 | 
						|
/*`
 | 
						|
 | 
						|
Which produces the program output:
 | 
						|
 | 
						|
[pre
 | 
						|
  policy_eg_10.vcxproj -> J:\Cpp\MathToolkit\test\Math_test\Release\policy_eg_10.exe
 | 
						|
  Testing rounding policies for a 50 sample binomial distribution,
 | 
						|
  with a success fraction of 0.5.
 | 
						|
  
 | 
						|
  Lower quantiles are calculated at p = 0.05
 | 
						|
  
 | 
						|
  Upper quantiles at p = 0.95.
 | 
						|
  
 | 
						|
                     Policy    Lower Quantile    Upper Quantile
 | 
						|
     integer_round_outwards                18                31
 | 
						|
      integer_round_inwards                19                30
 | 
						|
         integer_round_down                18                30
 | 
						|
           integer_round_up                19                31
 | 
						|
      integer_round_nearest                19                30
 | 
						|
                       real            18.701            30.299
 | 
						|
]
 | 
						|
 | 
						|
*/
 | 
						|
 | 
						|
//] //[policy_eg_10] ends quickbook import.
 |