/*@@@@@@@@@@@@@@@@@@@@@@@@ BasicMC.cpp @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 Random Option Pricing
 Summer 2002
 Authors: A. Korobchevsky
          S. Ferrando
 Ryerson University ALL RIGHTS RESERVED
 
 Purpose: Discrete Binomial implementation of Basic Monte Carlo Algorithm
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

#include <cmath>

#include "../Und/Binom.h" 
#include "BasicMC.h" 




/*@@@@@@@@@@@@@@@@@@@@@@@@  calcResults  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 Function: calcResults
 Purpose: Compute the option price and it's standard error
 Param: Underlying - underlying function object
        Derivative - derivative function object
	vector<double>& - Option value in jumps of 100 simulations (output param.)  
	vector<double>& - Standard error (output param.)
 Precondition: Underlying, Derivative and RNG parameters initialized
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
void BasicMC::calcResults(Underlying* binom, Derivative* ec, vector<double>& cv, vector<double>& se)
{ double sum_CT = 0;
  double sum_values = 0;
  double error = 0;

  for (int j = 1; j <= M; j++)
  { double ST = S;
    ec->init();
    ec->update(ST); 

    for (int i = 1; i <= binom->N; i++)
    { ST = binom->next(ST);
      ec->update(ST); 
    }

    double CT = ec->payOff(ST);
    
    if (j > 1)
      error = ((j - 2) * error + (j - 1.0) / j * pow(ST - sum_values / (j - 1), 2)) / (j - 1); 
      
    sum_CT += CT;
	 sum_values += ST;

    if (j % gap == 0 && j > M0)
    { cv.push_back(sum_CT/j * exp(-binom->r * binom->T));
      se.push_back(sqrt(error / j) * exp(-binom->r * binom->T / binom->N));
    }
  }
} 
