docs: public RandomVariableInterface getValue(double evaluationTime, LIBORMarketModel model) throws CalculationException {
  
  		int swapStartIndex1  = model.getLiborPeriodIndex(swapTenor1[0]);
  		int swapEndIndex1    = model.getLiborPeriodIndex(swapTenor1[swapTenor1.length-1]);
  
  		int swapStartIndex2  = model.getLiborPeriodIndex(swapTenor2[0]);
  		int swapEndIndex2    = model.getLiborPeriodIndex(swapTenor2[swapTenor2.length-1]);
  
  		int optionMaturityIndex = model.getTimeIndex(Math.min(swapTenor1[0], swapTenor2[0]));
  
  		double[]  swapCovarianceWeights1  = SwaptionSingleCurveAnalyticApproximation.getLogSwaprateDerivative(model.getLiborPeriodDiscretization(), model.getForwardRateCurve(), swapTenor1).get("values");
  		double[]  swapCovarianceWeights2  = SwaptionSingleCurveAnalyticApproximation.getLogSwaprateDerivative(model.getLiborPeriodDiscretization(), model.getForwardRateCurve(), swapTenor2).get("values");
  
  		// Get the integrated libor covariance from the model
  		double[][]	integratedLIBORCovariance = model.getIntegratedLIBORCovariance()[optionMaturityIndex];
  
  		// Calculate integrated swap rate covariance
  		double integratedSwapRateCovariance = 0.0;
  
  		for(int componentIndex1 = swapStartIndex1; componentIndex1 < swapEndIndex1; componentIndex1++) {
  			// Sum the libor cross terms (use symmetry)
  			for(int componentIndex2 = swapStartIndex2; componentIndex2 < swapEndIndex2; componentIndex2++) {
  				integratedSwapRateCovariance += swapCovarianceWeights1[componentIndex1-swapStartIndex1] * swapCovarianceWeights2[componentIndex2-swapStartIndex2] * integratedLIBORCovariance[componentIndex1][componentIndex2];
  			}
  		}
  
  		return new RandomVariable(evaluationTime, integratedSwapRateCovariance);
  	}