Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
test_RandomNumbers_Mseries_Uniform.cpp
Go to the documentation of this file.
1 
14 #include "parameterManager_YAML.h"
15 
16 #include "bridgeIO.h"
17 using Bridge::vout;
18 
19 #include "randomNumbers_Mseries.h"
20 
21 #ifdef USE_TEST
22 #include "test.h"
23 #endif
24 
25 #ifdef USE_TESTMANAGER_AUTOREGISTER
26 #include "testManager.h"
27 #endif
28 
29 //====================================================================
31 
38 namespace Test_RandomNumbers {
39  //- test-private parameters
40  namespace {
41  const std::string filename_input = "test_RandomNumbers_Mseries_Uniform.yaml";
42  const std::string filename_output = "stdout";
43 
44  class Parameters_Test_RandomNumbers : public Parameters {
45  public:
46  Parameters_Test_RandomNumbers()
47  {
48  Register_int("number_of_seeds", 0);
49  Register_int("seed_base", 0);
50  Register_int("number_of_samples", 0);
51 
52  Register_string("verbose_level", "NULL");
53 
54  Register_double("expected_result", 0.0);
55  }
56  };
57  }
58 
59  //- prototype declaration
60  int uniform_calc_pi(void);
61 
62 #ifdef USE_TESTMANAGER_AUTOREGISTER
63  namespace {
64  static const bool is_registered = TestManager::RegisterTest(
65  "RandomNumbers.Mseries.Uniform",
67  );
68  }
69 #endif
70 
71  //====================================================================
72  int uniform_calc_pi(void)
73  {
74  // #### parameter setup ####
75  Parameters_Test_RandomNumbers params_test;
76 
77  Parameters params_all;
78 
79  params_all.Register_Parameters("Test_RandomNumbers", &params_test);
80 
81  ParameterManager_YAML params_manager;
82  params_manager.read_params(filename_input, &params_all);
83 
84  int Nseed = params_test.get_int("number_of_seeds");
85  int seed_base = params_test.get_int("seed_base");
86  int Nrand = params_test.get_int("number_of_samples");
87  const string str_vlevel = params_test.get_string("verbose_level");
88 #ifdef USE_TEST
89  const double expected_result = params_test.get_double("expected_result");
90 #endif
91 
93 
94  //- print input parameters
95  vout.general(vl, " Nseed = %d\n", Nseed);
96  vout.general(vl, " seed_base = %d\n", seed_base);
97  vout.general(vl, " Nrand = %d\n", Nrand);
98  vout.general(vl, " vlevel = %s\n", str_vlevel.c_str());
99  vout.general(vl, "\n");
100 
101 
102  // #### Execution main part ####
103  vout.general(vl, "\n");
104  vout.general(vl, "Monte Calro estimate of pi:\n");
105  vout.general(vl, " number of samples = %10d\n", Nrand);
106  vout.general(vl, " seed estimate of pi\n");
107 
108  double t1 = 0.0;
109  double t2 = 0.0;
110  for (int iseed = 0; iseed < Nseed; ++iseed) {
111  int iseed2 = seed_base + iseed;
112 
113  RandomNumbers *rand = new RandomNumbers_Mseries(iseed2);
114 
115  int Npi = 0;
116  for (int i = 0; i < Nrand; ++i) {
117  double rn1 = rand->get();
118  double rn2 = rand->get();
119  double r = rn1 * rn1 + rn2 * rn2;
120  if (r < 1.0) { ++Npi; }
121  // vout.general(vl, " %10.8f %10.8f\n",rn1,rn2);
122  }
123 
124  double pi_exp = (4.0 * Npi) / Nrand;
125 
126  t1 += pi_exp;
127  t2 += pi_exp * pi_exp;
128 
129  //vout.general(vl, " estimate of pi = %10.8f\n",pi_exp);
130  vout.general(vl, " %10d %14.10f\n", iseed2, pi_exp);
131 
132  delete rand;
133  }
134 
135  double api = t1 / (double)Nseed;
136  double vpi = t2 / (double)Nseed - api * api;
137  double dpi = sqrt(vpi);
138  double epi = dpi / sqrt((double)Nseed - 1);
139 
140  double pi = 3.141592653589793;
141  vout.general(vl, " true value = %10.8f\n", pi);
142  vout.general(vl, " average = %10.8f\n", api);
143  vout.general(vl, " variance = %10.8f\n", vpi);
144  vout.general(vl, " deviation = %10.8f\n", dpi);
145  vout.general(vl, " error = %10.8f\n", epi);
146 
147  double result = epi;
148 
149 
150 #ifdef USE_TEST
151  return Test::verify(expected_result, result);
152 
153 #else
154  return EXIT_SUCCESS;
155 #endif
156  }
157 } // namespace Test_RandomNumbers