#include #include #include #include "var_alea.hpp" #include #include using namespace std; vector quantile_norm(int n, double sigma); struct gaussian_truncated : var_alea { gaussian_truncated(double a, double b, double mu = 0, double sigma = 1) :a(a), b(b), V(gsl_cdf_ugaussian_P(a), gsl_cdf_ugaussian_P(b)), mu(mu), sigma(sigma) {}; double operator()() { double v = V(); return mu + gsl_cdf_gaussian_Pinv(v,sigma); } private: double a, b; uniform V; double mu; double sigma; }; struct multi_gaussian_truncated : public var_alea > { multi_gaussian_truncated(double a, double b, const std::vector u) :a(a), b(b), V(gsl_cdf_ugaussian_P(a), gsl_cdf_ugaussian_P(b)), G(0,1), u(u), d(u.size()) {}; std::vector operator()() { double v = V(); double Z = gsl_cdf_gaussian_Pinv(v,1); std::vector Y(d); for(int i=0; i X(d); for(int i=0; i u; int d; }; template struct stratified_sampling { stratified_sampling(vector p, vector X) :p(p), X(X), mean(p.size(), 0), sigma2(p.size(), 0), I(p.size()){}; void draw(int N); vector get_mean() const; vector get_var() const; void print_mean() const; void print_sigma() const; pair estimator() const; private: void update(int N); vector p; vector X; vector M; vector cumM; vector mean; vector sigma2; const int I; }; //actualisation du nombre de tirages à faire par strates template void stratified_sampling::update(int Nk) { 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 N) { update(N); double m, s, oldmean; for(int i=0;i vector stratified_sampling::get_mean() const { return mean; }; template vector stratified_sampling::get_var() const { return sigma2; }; template void stratified_sampling::print_mean() const { cout<<"les espérances :"< void stratified_sampling::print_sigma() const { cout<<"les écarts types :"< pair stratified_sampling::estimator() const { double est_mean = 0; double est_std = 0; for (int i=0; i struct exponential_tilt : public std::function)> { exponential_tilt(std::vector mu, Fct f) : mu(mu), f(f){ norm_mu = 0; for(unsigned int i=0; i X) { std::vector Y(X.size()); double scal = 0; for (unsigned int i=0; i mu; Fct f; double norm_mu; };