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 forsight - all rates are simulationTime=exerciseDate)
  		 */
  		RandomVariable valueFixLeg		= new RandomVariableFromDoubleArray(fixingDates[fixingDates.length-1], 0.0);
  		RandomVariable valueFloatLeg	= new RandomVariableFromDoubleArray(paymentDates[paymentDates.length-1], -1.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 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 = new RandomVariableFromDoubleArray(paymentDate, 1.0 * periodLength);
  			valueFixLeg = valueFixLeg.add(payoff);
  
  			// Discount back to beginning of period
  			valueFloatLeg = valueFloatLeg.discount(libor, periodLength);
  			valueFixLeg = valueFixLeg.discount(libor, periodLength);
  		}
  		valueFloatLeg = valueFloatLeg.add(1.0);
  
  		RandomVariable parSwapRate = valueFloatLeg.div(valueFixLeg);
  
  		RandomVariable payoffUnit	= new RandomVariableFromDoubleArray(paymentDates[0], periodLengths[0]);
  		payoffUnit = payoffUnit.discount(model.getLIBOR(exerciseDate, fixingDates[0], paymentDates[0]),paymentDates[0]-fixingDates[0]);
  
  		RandomVariable value = parSwapRate.sub(strike).floor(0.0).mult(payoffUnit);
  
  		// 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
  			value = value.discount(libor, periodLength);
  		}
  
  		/*
  		 * Calculate value
  		 */
  		RandomVariable	numeraire				= model.getNumeraire(exerciseDate);
  		RandomVariable	monteCarloProbabilities	= model.getMonteCarloWeights(model.getTimeIndex(exerciseDate));
  		value = value.div(numeraire).mult(monteCarloProbabilities);
  
  		RandomVariable	numeraireAtZero					= model.getNumeraire(evaluationTime);
  		RandomVariable	monteCarloProbabilitiesAtZero	= model.getMonteCarloWeights(evaluationTime);
  		value = value.mult(numeraireAtZero).div(monteCarloProbabilitiesAtZero);
  
  		return value;
  	}