Bridge++  Ver. 1.3.x
test_RandomNumbers_SFMT_Uniform.cpp
Go to the documentation of this file.
1 
14 #ifdef USE_SFMTLIB
15 
16 #include "test.h"
17 
18 #include "randomNumbers_SFMT.h"
19 
20 //====================================================================
22 
31 namespace Test_RandomNumbers_SFMT {
32  const std::string test_name = "RandomNumbers.SFMT.Uniform";
33 
34  //- test-private parameters
35  namespace {
36  const std::string filename_input = "test_RandomNumbers_SFMT_Uniform.yaml";
37  const std::string filename_output = "stdout";
38 
39  class Parameters_Test_RandomNumbers : public Parameters {
40  public:
41  Parameters_Test_RandomNumbers()
42  {
43  Register_int("number_of_seeds", 0);
44  Register_int("seed_base", 0);
45  Register_int("number_of_samples", 0);
46 
47  Register_string("verbose_level", "NULL");
48 
49  Register_double("expected_result", 0.0);
50  }
51  };
52  }
53 
54  //- prototype declaration
55  int uniform_calc_pi(void);
56 
57 #ifdef USE_TESTMANAGER_AUTOREGISTER
58  namespace {
59  static const bool is_registered = TestManager::RegisterTest(
60  test_name,
62  );
63  }
64 #endif
65 
66  //====================================================================
67  int uniform_calc_pi(void)
68  {
69  // #### parameter setup ####
70  unique_ptr<Parameters> params_test(new Parameters_Test_RandomNumbers);
71  unique_ptr<Parameters> params_all(new Parameters);
72 
73  params_all->Register_Parameters("Test_RandomNumbers", params_test);
74 
75  ParameterManager::read(filename_input, params_all);
76 
77  int Nseed = params_test->get_int("number_of_seeds");
78  int seed_base = params_test->get_int("seed_base");
79  int Nrand = params_test->get_int("number_of_samples");
80  const string str_vlevel = params_test->get_string("verbose_level");
81 
82  const bool do_check = params_test->is_set("expected_result");
83  const double expected_result = do_check ? params_test->get_double("expected_result") : 0.0;
84 
86 
87  //- print input parameters
88  vout.general(vl, " Nseed = %d\n", Nseed);
89  vout.general(vl, " seed_base = %d\n", seed_base);
90  vout.general(vl, " Nrand = %d\n", Nrand);
91  vout.general(vl, " vlevel = %s\n", str_vlevel.c_str());
92  vout.general(vl, "\n");
93 
94 
95  // #### object setup #####
96  unique_ptr<Timer> timer(new Timer(test_name));
97 
98 
99  // #### Execution main part ####
100  timer->start();
101 
102  vout.general(vl, "\n");
103  vout.general(vl, "Monte Carlo estimate of pi:\n");
104  vout.general(vl, " number of samples = %10d\n", Nrand);
105  vout.general(vl, " seed estimate of pi\n");
106 
107  double t1 = 0.0;
108  double t2 = 0.0;
109  for (int iseed = 0; iseed < Nseed; ++iseed) {
110  int iseed2 = seed_base + iseed;
111 
112  unique_ptr<RandomNumbers> rand(new RandomNumbers_SFMT(iseed2));
113 
114  int Npi = 0;
115  for (int i = 0; i < Nrand; ++i) {
116  double rand1 = rand->get();
117  double rand2 = rand->get();
118  double r = rand1 * rand1 + rand2 * rand2;
119  if (r < 1.0) { ++Npi; }
120  // vout.general(vl, " %10.8f %10.8f\n",rand1,rand2);
121  }
122 
123  double pi_exp = (4.0 * Npi) / Nrand;
124 
125  t1 += pi_exp;
126  t2 += pi_exp * pi_exp;
127 
128  //vout.general(vl, " estimate of pi = %10.8f\n",pi_exp);
129  vout.general(vl, " %10d %14.10f\n", iseed2, pi_exp);
130  }
131 
132  double api = t1 / (double)Nseed;
133  double vpi = t2 / (double)Nseed - api * api;
134  double dpi = sqrt(vpi);
135  double epi = dpi / sqrt((double)Nseed - 1);
136 
137  double pi = 3.141592653589793;
138  vout.general(vl, " true value = %10.8f\n", pi);
139  vout.general(vl, " average = %10.8f\n", api);
140  vout.general(vl, " variance = %10.8f\n", vpi);
141  vout.general(vl, " deviation = %10.8f\n", dpi);
142  vout.general(vl, " error = %10.8f\n", epi);
143 
144  double result = api;
145  // changed to check the obtained value of pi itseft. [25 May 2014 H.M.]
146 
147  timer->report();
148 
149 
150  if (do_check) {
151  return Test::verify(result, expected_result);
152  } else {
153  vout.detailed(vl, "check skipped: expected_result not set.\n\n");
154  return EXIT_SKIP;
155  }
156  }
157 } // namespace Test_RandomNumbers
158 #endif // USE_SFMTLIB
#define EXIT_SKIP
Definition: test.h:17
BridgeIO vout
Definition: bridgeIO.cpp:278
void detailed(const char *format,...)
Definition: bridgeIO.cpp:82
void general(const char *format,...)
Definition: bridgeIO.cpp:65
const std::string test_name
Class for parameters.
Definition: parameters.h:38
static bool RegisterTest(const std::string &key, const Test_function func)
Definition: testManager.h:80
int verify(const double result, const double expected, double eps)
Definition: test.cpp:27
Bridge::VerboseLevel vl
Definition: checker.cpp:18
VerboseLevel
Definition: bridgeIO.h:39
static void read(const std::string &params_file, Parameters *params)
Definition: timer.h:31
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:28