aboutsummaryrefslogtreecommitdiffstats
path: root/src/rqmc.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/rqmc.hpp')
-rw-r--r--src/rqmc.hpp69
1 files changed, 17 insertions, 52 deletions
diff --git a/src/rqmc.hpp b/src/rqmc.hpp
index 840e069..a150447 100644
--- a/src/rqmc.hpp
+++ b/src/rqmc.hpp
@@ -9,7 +9,7 @@ double frac_part(double x);
//fonctions de compositions de monte_carlo.hpp
template <class _Result>
-struct generator
+struct generator
{
typedef _Result result_type;
};
@@ -18,9 +18,12 @@ template <typename Fct, typename VA>
struct compose_t : public generator< typename Fct::result_type >
{
compose_t(Fct f, VA X) : f(f), X(X) {};
- typename Fct::result_type operator()() {
- return f(X());
+ typename Fct::result_type operator()() {
+ return f(X());
};
+ void reseed() {
+ X.reseed();
+ }
private:
Fct f; VA X;
};
@@ -36,6 +39,7 @@ struct mean_t: public generator<double>
{
mean_t(int n, VA X): n(n), X(X) {};
double operator()(){
+ X.reseed();
double sum = 0;
for(int i=0; i<n; i++){
sum+=X();
@@ -45,7 +49,7 @@ struct mean_t: public generator<double>
private :
int n; VA X;
};
-
+
template <typename VA>
inline mean_t<VA>
mean(int n, VA X){
@@ -74,7 +78,7 @@ std::vector<double> monte_carlo(int n, L X, double p=0.05)
template <typename L, typename Fct>
std::vector<double> monte_carlo(int n, Fct f, L X, double p=0.05)
{
- return monte_carlo(n, compose(f, X), p);
+ return monte_carlo(n, compose(f, X), p);
};
//Les classes de quasi-mean
@@ -84,8 +88,8 @@ struct quasi_gaussian : public var_alea<std::vector<double> >
{
quasi_gaussian (int d, double mean = 0, double std =1)
: d(d), mean(mean), std(std), s(d), U(0,1), seed(d) {
- for(int i=0; i<d; i++) {seed[i]=U();}
- };
+ reseed();
+ };
std::vector<double> operator ()(){
std::vector<double> result = s();
for(int i=0;i<d; i++){
@@ -93,54 +97,15 @@ struct quasi_gaussian : public var_alea<std::vector<double> >
}
return value = result;
}
- private:
+ void reseed() {
+ for(int i=0; i<d; i++) {
+ seed[i]=U();
+ }
+ }
+ private:
int d;
double mean, std;
LDS s;
uniform U;
std::vector<double> seed;
};
-
-
-
-struct gaussian_d : public var_alea<std::vector<double> >
-{
- gaussian_d(int d, double mean = 0, double std =1)
- : d(d), mean(mean), std(std), G(mean, std) {};
- std::vector<double> operator ()(){
- std::vector<double> result(d);
- for(int i=0;i<d; i++){
- result[i] = G();
- }
- return value = result;
- }
- private:
- int d;
- double mean, std;
- gaussian G;
-};
-
-template <typename Fct, typename LDS>
-struct quasi_mean : public generator<typename Fct::result_type>
-{
- quasi_mean(int n, int d, Fct f) : n(n), d(d), f(f), G(d) {};
-
- typename Fct::result_type operator()() {
- double sum =0;
- for(int i=0; i<n; i++){
- sum += f(G());
-
- }
- return sum/n;
- };
-
- private:
- int n, d;
- Fct f;
- quasi_gaussian<LDS> G;
- };
-
-
-
-
-