docs: @Override
  	public RandomVariable getValue(double evaluationTime, LIBORModelMonteCarloSimulationModel model) throws CalculationException {
  		/*
  		 * Calculate value of the swap at exercise date on each path (beware of perfect foresight - all rates are simulationTime=exerciseDate)
  		 */
  		RandomVariable valueOfSwapAtExerciseDate	= model.getRandomVariableForConstant(/*fixingDates[fixingDates.length-1],*/0.0);
  
  		// Calculate the value of the swap by working backward through all periods
  		for(int period=fixingDates.length-1; period>=0; period--)
  		{
  			double fixingDate	= fixingDates[period];
  			double paymentDate	= paymentDates[period];
  			double swaprate		= swaprates[period];
  
  			double periodLength	= periodLengths != null ? periodLengths[period] : paymentDate - fixingDate;
  
  			// Get random variables - note that this is the rate at simulation time = exerciseDate
  			RandomVariable libor	= model.getLIBOR(exerciseDate, fixingDate, paymentDate);
  
  			// Add payment received at end of period
  			RandomVariable payoff = libor.sub(swaprate).mult(periodLength);
  			valueOfSwapAtExerciseDate = valueOfSwapAtExerciseDate.add(payoff);
  
  			// Discount back to beginning of period
  			valueOfSwapAtExerciseDate = valueOfSwapAtExerciseDate.discount(libor, paymentDate - fixingDate);
  		}
  
  		// If the exercise date is not the first periods start date, then discount back to the exercise date (calculate the forward starting swap)
  		if(fixingDates[0] != exerciseDate) {
  			RandomVariable libor	= model.getLIBOR(exerciseDate, exerciseDate, fixingDates[0]);
  			double periodLength	= fixingDates[0] - exerciseDate;
  
  			// Discount back to beginning of period
  			valueOfSwapAtExerciseDate = valueOfSwapAtExerciseDate.discount(libor, periodLength);
  		}
  
  		/*
  		 * Calculate swaption value
  		 */
  		RandomVariable values = valueOfSwapAtExerciseDate.floor(0.0);
  
  		RandomVariable	numeraire				= model.getNumeraire(exerciseDate);
  		RandomVariable	monteCarloProbabilities	= model.getMonteCarloWeights(model.getTimeIndex(exerciseDate));
  		values = values.div(numeraire).mult(monteCarloProbabilities);
  
  		RandomVariable	numeraireAtZero					= model.getNumeraire(evaluationTime);
  		RandomVariable	monteCarloProbabilitiesAtZero	= model.getMonteCarloWeights(evaluationTime);
  		values = values.mult(numeraireAtZero).div(monteCarloProbabilitiesAtZero);
  
  		return values;
  	}