docs: @Override
  	public RandomVariable getValue(double evaluationTime, AssetModelMonteCarloSimulationModel model) throws CalculationException {
  
  		/*
  		 * The following valuation code requires in-depth knowledge of the model to calculate the denstiy analytically.
  		 */
  		BlackScholesModel blackScholesModel = null;
  		if(model instanceof MonteCarloAssetModel) {
  			try {
  				blackScholesModel = (BlackScholesModel)((MonteCarloAssetModel)model).getModel();
  			}
  			catch(Exception e) {}
  		}
  		else if(model instanceof MonteCarloBlackScholesModel) {
  			blackScholesModel = ((MonteCarloBlackScholesModel)model).getModel();
  		}
  		if(model == null) {
  			throw new ClassCastException("This method requires a Black-Scholes type model (MonteCarloBlackScholesModel).");
  		}
  
  		// Get underlying and numeraire
  		RandomVariable underlyingAtMaturity	= model.getAssetValue(maturity,0);
  		RandomVariable underlyingAtToday		= model.getAssetValue(0.0,0);
  
  		// Get some model parameters
  		double T		= maturity-evaluationTime;
  		double r		= blackScholesModel.getRiskFreeRate().doubleValue();
  		double sigma	= blackScholesModel.getVolatility().doubleValue();
  
  		RandomVariable lr = underlyingAtMaturity.log().sub(underlyingAtToday.log()).sub(r * T - 0.5 * sigma*sigma * T).div(sigma * sigma * T).div(underlyingAtToday);
  
  		RandomVariable payoff = underlyingAtMaturity.sub(strike).choose(new Scalar(1.0), new Scalar(0.0));
  
  		RandomVariable modifiedPayoff = payoff.mult(lr);
  
  		RandomVariable numeraireAtMaturity	= model.getNumeraire(maturity);
  		RandomVariable numeraireAtToday		= model.getNumeraire(0);
  		RandomVariable monteCarloWeightsAtMaturity		= model.getMonteCarloWeights(maturity);
  		RandomVariable monteCarloWeightsAtToday		= model.getMonteCarloWeights(maturity);
  
  		return modifiedPayoff.div(numeraireAtMaturity).mult(numeraireAtToday).mult(monteCarloWeightsAtMaturity).div(monteCarloWeightsAtToday);
  	}