#include #include #include #include #include "rtnorm.hpp" using namespace std; template struct var_alea { typedef T result_type; var_alea() : value(0) {}; var_alea(T value) : value(value) {}; virtual ~var_alea() {}; virtual T operator()() = 0; T current() const { return value; }; protected: T value; }; typedef var_alea var_alea_real; struct gaussian_truncated : public var_alea_real { gaussian_truncated(double a, double b, double mean=0, double sigma2=1, int seed=0) :a(a), b(b), mean(mean), sigma2(sigma2), seed(seed) { const gsl_rng_type* type = gsl_rng_default; gen = gsl_rng_alloc(type); gsl_rng_set(gen, seed); }; gaussian_truncated(gaussian_truncated const &other) :a(other.a),b(other.b), mean(other.mean),sigma2(other.sigma2){ gen = gsl_rng_clone(other.gen); }; double operator()() { pair p = rtnorm(gen, a, b, mean, sigma2); return value = p.first; }; ~gaussian_truncated() { gsl_rng_free(gen); } private: int seed; double mean, sigma2, a, b; gsl_rng *gen; }; template struct stratified_sampling { stratified_sampling(vector p, vector gen) :p(p), gen(gen), mean(p.size(), 0), sigma2(p.size(), 0){}; void update(int N); void draw(); vector get_mean(); //double estimator(); private: vector p; vector M; vector cumM; vector mean; vector sigma2; vector gen; }; //actualisation du nombre de tirages à faire par strates template void stratified_sampling::update(int Nk) { int I = p.size(); bool first_step = M.empty(); //reinitialistation du vecteur M du nombre de tirages par strates if (first_step) { M.resize(I,1); cumM.resize(I,0); } else { for(int i=0; i m(I, 0); //le vecteur des m_i idéals if (first_step) { for (int i=0; i sigma(p.size(),0); for (int i=0; i < I; i++) { sigma[i]=sqrt(sigma2[i]); } double scal = std::inner_product(p.begin(), p.end(), sigma.begin(), (double) 0); for (int i=0; i < I; i++) { m[i] = (Nk-I)*p[i]*sigma[i]/scal; std::cout< void stratified_sampling::draw() { int I = p.size(); double m, s, oldmean; for(int i=0;i vector stratified_sampling::get_mean() { return mean; };