aboutsummaryrefslogtreecommitdiffstats
path: root/option.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'option.cpp')
-rw-r--r--option.cpp38
1 files changed, 16 insertions, 22 deletions
diff --git a/option.cpp b/option.cpp
index 7fb5ce3..0e5a56c 100644
--- a/option.cpp
+++ b/option.cpp
@@ -1,6 +1,7 @@
#include <algorithm>
#include <iostream>
#include "rqmc.hpp"
+#include "p_adic.o"
double frac_part(double x){
return x - floor(x);
@@ -37,36 +38,24 @@ struct asian_option : public std::unary_function<std::vector<double>, double>
-template <typename Fct>
-struct quasi_option : public generator<double>
+template <typename Fct, typename LDS>
+struct quasi_option : public generator<typename Fct::result_type>
{
- quasi_option(int n, int d, Fct payoff) : n(n), d(d), payoff(payoff), U(0,1), s(d), seed(d) {};
+ quasi_option(int n, int d, Fct payoff) : n(n), d(d), payoff(payoff), G(d) {};
- double operator()() {
- std::vector<double> X(d);
+ typename Fct::result_type operator()() {
double sum =0;
- for(int i=0; i<d; i++){
- seed[i]=U();
- }
- for (int i=0; i<n; i++){
- X=s();
- //std::cout<<X[i]<<std::endl;
- for(int i=0; i<d; i++){
- X[i] = gsl_cdf_gaussian_Pinv(frac_part(seed[i]+X[i]), 1);
- }
- sum += payoff(X);
- //std::cout<<X[i]<<std::endl;
+ for(int i=0; i<n; i++){
+ sum += payoff(G());
+
}
-
return sum/n;
};
private:
int n, d;
Fct payoff;
- uniform U;
- sobol s;
- std::vector<double> seed;
+ quasi_gaussian<LDS> G;
};
int main(){
@@ -76,10 +65,15 @@ int main(){
int d =16;
- typedef asian_option payoff_type;
std::vector<double> result(3);
- result = monte_carlo(100, quasi_option<payoff_type> (N, d, A));
+ result = monte_carlo(100, quasi_option<asian_option, sobol> (N, d, A));
+ for(int i =0; i<3; i++){
+ std::cout<<result[i]<<std::endl;
+ }
+
+ std::vector<double> result2(3);
+ result = monte_carlo(100, quasi_option<asian_option, halton> (N, d, A));
for(int i =0; i<3; i++){
std::cout<<result[i]<<std::endl;
}