/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.provider.description.interestrate;
import java.util.List;
import java.util.Set;
import com.opengamma.analytics.financial.instrument.index.GeneratorSwapFixedIbor;
import com.opengamma.analytics.financial.provider.sensitivity.multicurve.ForwardSensitivity;
import com.opengamma.analytics.math.surface.Surface;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.tuple.DoublesPair;
/**
* Provider of normal (Bachelier) smile for swaptions.
* The volatility is time to expiration/tenor dependent.
*/
public class NormalSwaptionExpiryTenorProvider implements NormalSwaptionProviderInterface, SwaptionSurfaceProvider {
/** The multicurve provider. */
private final MulticurveProviderInterface _multicurve;
/** The normal (Bachelier) volatility surface. Not null.
* The dimensions are expiration and tenor. */
private final Surface<Double, Double, Double> _parameters;
/** The underlying swaps generators. */
private final GeneratorSwapFixedIbor _generator;
/**
* Constructor.
* @param multicurve The multi-curve provider. Not null.
* @param parameters The normal volatility parameters. Not null.
* @param generator The underlying swaps generators. Not null.
*/
public NormalSwaptionExpiryTenorProvider(final MulticurveProviderInterface multicurve,
final Surface<Double, Double, Double> parameters, final GeneratorSwapFixedIbor generator) {
ArgumentChecker.notNull(multicurve, "multicurve");
ArgumentChecker.notNull(parameters, "parameters");
ArgumentChecker.notNull(generator, "swap generator");
_multicurve = multicurve;
_parameters = parameters;
_generator = generator;
}
@Override
public NormalSwaptionExpiryTenorProvider copy() {
final MulticurveProviderInterface multicurveProvider = _multicurve.copy();
return new NormalSwaptionExpiryTenorProvider(multicurveProvider, _parameters, _generator);
}
@Override
public MulticurveProviderInterface getMulticurveProvider() {
return _multicurve;
}
@Override
public double getVolatility(double expiry, double tenor, double strikeRate, double forwardRate) {
return _parameters.getZValue(expiry, tenor);
}
@Override
public GeneratorSwapFixedIbor getGeneratorSwap() {
return _generator;
}
@Override
public double[] parameterSensitivity(final String name, final List<DoublesPair> pointSensitivity) {
return _multicurve.parameterSensitivity(name, pointSensitivity);
}
@Override
public double[] parameterForwardSensitivity(final String name, final List<ForwardSensitivity> pointSensitivity) {
return _multicurve.parameterForwardSensitivity(name, pointSensitivity);
}
@Override
public Set<String> getAllCurveNames() {
return _multicurve.getAllCurveNames();
}
/**
* Returns the The normal (Bachelier) volatility surface. The dimensions are expiration and tenor.
* @return The surface
*/
@Override
public Surface<Double, Double, Double> getParameterSurface() {
return _parameters;
}
}