MCQMCIntegration  0.1
MCQMCIntegration.h
Go to the documentation of this file.
1 #pragma once
2 #ifndef MCQMC_INTEGRATION_HPP
3 #define MCQMC_INTEGRATION_HPP
4 
22 #include <random>
23 
24 namespace MCQMCIntegration {
25 
26  /*
27  * calculate variance
28  *
29  * See "Online algorithm" at
30  * https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Online_algorithm
31  */
33  public:
35  void addData(const double x) {
36  n++;
37  df = n - 1;
38  double delta = x - mean;
39  mean += delta / static_cast<double>(n);
40  M2 += delta * (x - mean);
41  }
42  double getMean() const;
43  double unbiasedVar() const;
44  double var() const;
45  double absErr(const int prob) const;
46  double relErr(const int prob) const;
47  private:
48  int n;
49  int df;
50  double mean;
51  double M2;
52  };
53 
58  struct MCQMCResult {
59  double value;
60  double error;
61  };
62 
63  /*
64  * Monte-Carlo Integration.
65  *
66  * @tperm I integrand function class.
67  * @tparm R Random number generator class.
68  * @tparm D Distribution class for Random number generator.
69  *
70  * @param[in] s dimension of integration area @b R.
71  * @param[in] m sample number per a trial.
72  * @param[in] N number of trials.
73  * @param[in,out] integrand integrand function class, which should have
74  * double operator()(double[]).
75  * @param[in,out] rand random number generator.
76  * @param[in,out] dist random number distribution class.
77  * @param[in] probability expected probability of returned value x is
78  * between x - absolute error and x + absolute error. this should be
79  * one of {95, 99, 999, 9999}.
80  * @return MCQMCResult.
81  */
82  template<typename I, typename R, typename D>
84  uint32_t m,
85  uint32_t N,
86  I& integrand,
87  R& rand,
88  D& dist,
89  int probability = 99)
90  {
91  double point[s];
92  OnlineVariance eachintval;
93  uint32_t cnt = 0;
94  do {
95  OnlineVariance intsum;
96  for (uint32_t j = 0; j < m; ++j) {
97  for (uint32_t i = 0; i < s; ++i) {
98  point[i] = dist(rand);
99  }
100  intsum.addData(integrand(point));
101  }
102  eachintval.addData(intsum.getMean());
103  ++cnt;
104  } while ( cnt < N );
105  return MCQMCResult({eachintval.getMean(),
106  eachintval.absErr(probability)});
107  }
108 
109  /*
110  * Quasi Monte-Carlo Integration
111  *
112  * @tperm I integrand function class
113  * @tparm D DigitalNet class for Quasi Monete-Carlo integration.
114  *
115  * @param[in] N number of trials.
116  * @param[in,out] integrand integrand function class, which should have
117  * double operator()(double[]).
118  * @param[in,out] digitalNet digital net class.
119  * @param[in] probability expected probability of returned value x is
120  * between x - absolute error and x + absolute error. this should be
121  * one of {95, 99, 999, 9999}.
122  * @return MCQMCResult.
123  */
124  template<typename I, typename D>
126  I& integrand,
127  D& digitalNet,
128  int probability = 99)
129  {
130  uint32_t m = digitalNet.getM();
131  digitalNet.pointInitialize();
132  OnlineVariance eachintval;
133  uint32_t cnt = 0;
134  do {
135  OnlineVariance intsum;
136  uint64_t max = 1;
137  max = max << m;
138  for (uint64_t j = 0; j < max; ++j) {
139  intsum.addData(integrand(digitalNet.getPoint()));
140  digitalNet.nextPoint();
141  }
142  eachintval.addData(intsum.getMean());
143  cnt++;
144  } while ( cnt < N );
145  return MCQMCResult({eachintval.getMean(),
146  eachintval.absErr(probability)});
147  }
148 
149  /*
150  * Quasi Monte-Carlo Integration
151  *
152  * @tperm I integrand function class
153  *
154  * @param[in] N number of trials.
155  * @param[in,out] integrand integrand function class, which should have
156  * double operator()(double[]).
157  * @param[in,out] digitalNet digital net class.
158  * @param[in] probability expected probability of returned value x is
159  * between x - absolute error and x + absolute error. this should be
160  * one of {95, 99, 999, 9999}.
161  * @return MCQMCResult.
162  */
163  template<typename I>
165  I& integrand,
166  DigitalNetID digitalNetId,
167  uint32_t s,
168  uint32_t m,
169  int probability)
170  {
171  DigitalNet<uint64_t> digitalNet(digitalNetId, s, m);
172  digitalNet.pointInitialize();
173  OnlineVariance eachintval;
174  uint32_t cnt = 0;
175  do {
176  OnlineVariance intsum;
177  uint64_t max = 1;
178  max = max << m;
179  for (uint64_t j = 0; j < max; ++j) {
180  intsum.addData(integrand(digitalNet.getPoint()));
181  digitalNet.nextPoint();
182  }
183  eachintval.addData(intsum.getMean());
184  cnt++;
185  } while ( cnt < N );
186  return MCQMCResult({eachintval.getMean(),
187  eachintval.absErr(probability)});
188  }
189 }
190 #endif // MCQMC_INTEGRATION_HPP
double absErr(const int prob) const
MCQMCResult monte_carlo_integration(uint32_t s, uint32_t m, uint32_t N, I &integrand, R &rand, D &dist, int probability=99)
Definition: MCQMCIntegration.h:83
double getPoint(int i) const
get a component of a point vector.
Definition: DigitalNet.h:139
double error
Definition: MCQMCIntegration.h:60
Definition: MCQMCIntegration.h:32
DigitalNet class for Quasi Monte-Carlo Method.
double relErr(const int prob) const
Definition: DigitalNet.h:30
void addData(const double x)
Definition: MCQMCIntegration.h:35
double value
Definition: MCQMCIntegration.h:59
MCQMCResult quasi_monte_carlo_integration(uint32_t N, I &integrand, D &digitalNet, int probability=99)
Definition: MCQMCIntegration.h:125
void pointInitialize()
(re-)initialize point.
DigitalNetID
ID of pre-defined Digital Net.
Definition: DigitalNet.h:34
void nextPoint()
state transition to next point.
Result Structure of Numeric Integration.
Definition: MCQMCIntegration.h:58
Digital Net class for Quasi Mote-Carlo Method.
Definition: DigitalNet.h:72