/*@@@@@@@@@@@@@@@@@@@@@@@@ ExactValues.cpp @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 Random Option Pricing
 Summer 2002
 Authors: A. Korobchevsky
          S. Ferrando
 Ryerson University ALL RIGHTS RESERVED
 
 Purpose: Computes exact value of Discrete Binomial options
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

#include <cmath>
#include <iostream>
using namespace std;
 
#include "../Und/Binom.h" 
#include "ContExactValues.h" 




/*@@@@@@@@@@@@@@@@@@@@@@@@  calcResults  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 Function: calcResults
 Purpose: Compute the option price and it's standard error
 Param: Underlying - underlying function object
        Derivative - derivative function object
	double& - Option value (output param.)  
	double& - Standard error (output param.)
 Precondition: Underlying, Derivative and RNG parameters initialized
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
void ContExactValues::calcResults(Underlying* und, Derivative* der, vector<double>& cv, vector<double>& se)
{ double r = und->r;
  double t = und->T;
  double sd = und->sigma;
  double dtwo = (r + pow(sd, 2) / 2) * t / (sd * sqrt(t));
  
  cout << "r = "<< r << ", T = " << t << ", sigma = " << sd << endl;

// BEGIN Cont
  double value = S * cumulative(dtwo) -  
	    exp(-r * t) * S * cumulative(dtwo - sd * sqrt(t)) +
 	    exp(-r * t) * (pow(sd, 2) / (2 * r)) * S * (cumulative(-dtwo + 2 * r * sqrt(t) / sd) - 
   	 exp(r * t) * cumulative(-dtwo));
// END Cont

  for (int i = 0; i < 500; i++)
  { cv.push_back(value);
    se.push_back(0);
  }
} 
