docs: @Override
  	public RandomVariableInterface getValue(double evaluationTime, LIBORModelMonteCarloSimulationInterface model) throws CalculationException {
  
  		// Allocate accumulator for values
  		RandomVariableInterface values = new RandomVariable(0.0);
  
  		/*
  		 * We go forward in time and on each path we remember the number of exercises so far.
  		 */
  		RandomVariableInterface numberOfExcercises = new RandomVariable(maximumNumberOfExercises-0.5);
  
  		for(int period=0; period<fixingDates.length; period++)
  		{
  			double fixingDate	= fixingDates[period];
  			double paymentDate	= paymentDates[period];
  
  			// evaluationTime > fixingDate is allowed. Negative fixing date is allowed too (but likely not supported by the model)
  			if(evaluationTime > paymentDate) {
  				continue;
  			}
  
  			double strike	 	= strikes[period];
  			double periodLength	= paymentDate - fixingDate;
  
  			// Get random variables
  			RandomVariableInterface	libor					= model.getLIBOR(fixingDate, fixingDate, paymentDate);
  			RandomVariableInterface	numeraire				= model.getNumeraire(paymentDate);
  			RandomVariableInterface	monteCarloProbabilities	= model.getMonteCarloWeights(model.getTimeIndex(paymentDate));
  
  			// Calculate payout
  			RandomVariableInterface payoff = libor.sub(strike).mult(periodLength);
  			RandomVariableInterface indicator = new RandomVariable(1.0).barrier(payoff, new RandomVariable(1.0), new RandomVariable(0.0));
  			indicator = indicator.barrier(numberOfExcercises, indicator, 0.0);
  
  			payoff = payoff.div(numeraire).mult(monteCarloProbabilities);
  
  			// Accumulate numeraire relative values
  			values = values.addProduct(indicator, payoff);
  
  			// Update exercise counter
  			numberOfExcercises = numberOfExcercises.sub(indicator);
  		}
  
  		RandomVariableInterface	numeraireAtEvaluationTime				= model.getNumeraire(evaluationTime);
  		RandomVariableInterface	monteCarloProbabilitiesAtEvaluationTime	= model.getMonteCarloWeights(evaluationTime);
  		values = values.mult(numeraireAtEvaluationTime).div(monteCarloProbabilitiesAtEvaluationTime);
  
  		return values;
  	}