#include <iostream>
#include <stdio.h>
#include <math.h>
template<
class ty> 
dtype get_dtype();
 
template<> 
dtype get_dtype<float>() { 
return f32; }
 
template<> 
dtype get_dtype<double>() { 
return f64; }
 
template<class ty, bool use_barrier>
static ty monte_carlo_barrier(int N, ty K, ty t, ty vol, ty r, ty strike, int steps, ty B)
{
    dtype pres = get_dtype<ty>();
 
    ty dt = t / (ty)(steps - 1);
    randmat = 
exp((r - (vol * vol * 0.5)) * dt + vol * 
sqrt(dt) * randmat);
    if (use_barrier) {
    }
    payoff = 
max(0.0, S - K);
    ty P = mean<ty>(payoff) * 
exp(-r * t);
    return P;
}
template<class ty, bool use_barrier>
double monte_carlo_bench(int N)
{
    int steps = 180;
    ty stock_price = 100.0;
    ty maturity = 0.5;
    ty volatility = .30;
    ty rate = .01;
    ty strike = 100;
    ty barrier = 115.0;
    for (int i = 0; i < 10; i++) {
        monte_carlo_barrier<ty, use_barrier>(N, stock_price, maturity, volatility,
                                             rate, strike, steps, barrier);
    }
}
int main()
{
    try {
        
        monte_carlo_bench<float, false>(1000);
        monte_carlo_bench<float, true>(1000);
        for (int n = 10000; n <= 100000; n += 10000) {
            printf("Time for %7d paths - "
                   "vanilla method: %4.3f ms,  "
                   "barrier method: %4.3f ms\n", n,
                   1000 * monte_carlo_bench<float, false>(n),
                   1000 * monte_carlo_bench<float, true>(n));
        }
        std::cerr << ae.
what() << std::endl;
    }
    return 0;
}