docs: public RandomVariable getValues(double evaluationTime, LIBORMarketModel model) {
  		if(evaluationTime > 0) {
  			throw new RuntimeException("Forward start evaluation currently not supported.");
  		}
  
  		double swapStart    = swapTenor[0];
  		double swapEnd      = swapTenor[swapTenor.length-1];
  
  		int swapStartIndex  = model.getLiborPeriodIndex(swapStart);
  		int swapEndIndex    = model.getLiborPeriodIndex(swapEnd);
  		int optionMaturityIndex = model.getCovarianceModel().getTimeDiscretization().getTimeIndex(swapStart)-1;
  
  		Map<String, double[]>  logSwaprateDerivative  = getLogSwaprateDerivative(model.getLiborPeriodDiscretization(), model.getDiscountCurve(), model.getForwardRateCurve(), swapTenor);
  		double[]    swapCovarianceWeights  = logSwaprateDerivative.get("values");
  
  		// Get the integrated libor covariance from the model
  		double[][]	integratedLIBORCovariance = model.getIntegratedLIBORCovariance()[optionMaturityIndex];
  
  		// Calculate integrated swap rate covariance
  		double integratedSwapRateVariance = 0.0;
  		for(int componentIndex1 = swapStartIndex; componentIndex1 < swapEndIndex; componentIndex1++) {
  			// Sum the libor cross terms (use symmetry)
  			for(int componentIndex2 = componentIndex1+1; componentIndex2 < swapEndIndex; componentIndex2++) {
  				integratedSwapRateVariance += 2.0 * swapCovarianceWeights[componentIndex1-swapStartIndex] * swapCovarianceWeights[componentIndex2-swapStartIndex] * integratedLIBORCovariance[componentIndex1][componentIndex2];
  			}
  			// Add diagonal term (libor variance term)
  			integratedSwapRateVariance += swapCovarianceWeights[componentIndex1-swapStartIndex] * swapCovarianceWeights[componentIndex1-swapStartIndex] * integratedLIBORCovariance[componentIndex1][componentIndex1];
  		}
  
  		// Return integratedSwapRateVariance if requested
  		if(valueUnit == ValueUnit.INTEGRATEDVARIANCELOGNORMAL || valueUnit == ValueUnit.INTEGRATEDVARIANCE) {
  			return new RandomVariableFromDoubleArray(evaluationTime, integratedSwapRateVariance);
  		}
  
  		double volatility		= Math.sqrt(integratedSwapRateVariance / swapStart);
  
  		// Return integratedSwapRateVariance if requested
  		if(valueUnit == ValueUnit.VOLATILITYLOGNORMAL || valueUnit == ValueUnit.VOLATILITY) {
  			return new RandomVariableFromDoubleArray(evaluationTime, volatility);
  		}
  
  		// Use black formula for swaption to calculate the price
  		double parSwaprate		= net.finmath.marketdata.products.Swap.getForwardSwapRate(new TimeDiscretizationFromArray(swapTenor), new TimeDiscretizationFromArray(swapTenor), model.getForwardRateCurve(), model.getDiscountCurve());
  		double swapAnnuity      = net.finmath.marketdata.products.SwapAnnuity.getSwapAnnuity(new TimeDiscretizationFromArray(swapTenor), model.getDiscountCurve());
  
  		double optionMaturity	= swapStart;
  
  		double valueSwaption = AnalyticFormulas.blackModelSwaptionValue(parSwaprate, volatility, optionMaturity, swaprate, swapAnnuity);
  		return new RandomVariableFromDoubleArray(evaluationTime, valueSwaption);
  	}