/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.model.sabrcube.defaultproperties; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import com.opengamma.analytics.math.interpolation.Interpolator1DFactory; import com.opengamma.engine.function.config.AbstractFunctionConfigurationBean; import com.opengamma.engine.function.config.FunctionConfiguration; import com.opengamma.financial.analytics.model.volatility.SmileFittingPropertyNamesAndValues; import com.opengamma.util.ArgumentChecker; /** * Function repository configuration source for the functions contained in this package. * @deprecated The functions in this package are deprecated */ @Deprecated public class DefaultPropertiesFunctions extends AbstractFunctionConfigurationBean { /** * Currency-specific data. */ public static class CurrencyInfo implements InitializingBean { /** The logger */ private static final Logger s_logger = LoggerFactory.getLogger(DefaultPropertiesFunctions.CurrencyInfo.class); /** The curve configuration name */ private String _curveConfiguration; /** The cube name. Left in for backwards compatibility */ private String _cubeName; /** True if the cube name is set directly */ private boolean _isCubeNameParameterSet; /** The cube definition name */ private String _cubeDefinitionName; /** The cube specification name */ private String _cubeSpecificationName; /** The forward surface definition name */ private String _surfaceDefinitionName; /** The forward surface specification name */ private String _surfaceSpecificationName; /** * Gets the curve configuration name. * @return The curve configuration name */ public String getCurveConfiguration() { return _curveConfiguration; } /** * Sets the curve configuration name. * @param curveConfiguration The curve configuration name */ public void setCurveConfiguration(final String curveConfiguration) { _curveConfiguration = curveConfiguration; } /** * Gets the cube name. Should not be used. * @return The cube name * @deprecated Should not be used; get the cube definition and specification * and forward surface definition and specification names with the individual * methods. */ @Deprecated public String getCubeName() { return _cubeName; } /** * Sets the cube definition and specification and forward surface definition * and specification names to the same value. Should not be used. * @param cubeName The cube name * @deprecated Should not be used; set the cube definition and specification * and forward surface definition and specification names with the individual * methods. */ @Deprecated public void setCubeName(final String cubeName) { _isCubeNameParameterSet = true; _cubeName = cubeName; if (_cubeDefinitionName != null) { s_logger.error("Cube definition name was already set using the setCubeDefinitionName() method. This will" + " almost certainly result in unexpected behaviour"); _cubeDefinitionName = cubeName; } if (_cubeSpecificationName != null) { s_logger.error("Cube specification name was already set using the setCubeSpecificationName() method. This will" + " almost certainly result in unexpected behaviour"); _cubeSpecificationName = cubeName; } if (_surfaceDefinitionName != null) { s_logger.error("Surface definition name was already set using the setSurfaceDefinitionName() method. This will" + " almost certainly result in unexpected behaviour"); _surfaceDefinitionName = cubeName; } if (_surfaceSpecificationName != null) { s_logger.error("Surface specification name was already set using the setSurfaceSpecificationName() method. This will" + " almost certainly result in unexpected behaviour"); _surfaceSpecificationName = cubeName; } } /** * Returns true if the cubeName parameter is set. * @return True if the cubeName parameter is set */ public boolean isCubeNameParameterSet() { return _isCubeNameParameterSet; } /** * Gets the cube definition name. * @return The cube definition name */ public String getCubeDefinitionName() { return _cubeDefinitionName; } /** * Sets the cube definition name. * @param cubeDefinitionName The cube definition name. */ public void setCubeDefinitionName(final String cubeDefinitionName) { if (_isCubeNameParameterSet) { s_logger.error("Cube definition name was already set using the deprecated setCubeName() method. This will" + " almost certainly result in unexpected behaviour"); _cubeDefinitionName = cubeDefinitionName; return; } _cubeDefinitionName = cubeDefinitionName; } /** * Gets the cube specification name. * @return The cube specification name */ public String getCubeSpecificationName() { return _cubeSpecificationName; } /** * Sets the cube specification name. * @param cubeSpecificationName The cube specification name. */ public void setCubeSpecificationName(final String cubeSpecificationName) { if (_isCubeNameParameterSet) { s_logger.error("Cube specification name was already set using the deprecated setCubeName() method. This will" + " almost certainly result in unexpected behaviour"); _cubeSpecificationName = cubeSpecificationName; return; } _cubeSpecificationName = cubeSpecificationName; } /** * Gets the forward surface definition name. * @return The surface definition name */ public String getSurfaceDefinitionName() { return _surfaceDefinitionName; } /** * Sets the forward surface definition name. * @param surfaceDefinitionName The surface definition name. */ public void setSurfaceDefinitionName(final String surfaceDefinitionName) { if (_isCubeNameParameterSet) { s_logger.error("Surface definition name was already set using the deprecated setCubeName() method. This will" + " almost certainly result in unexpected behaviour"); _surfaceDefinitionName = surfaceDefinitionName; return; } _surfaceDefinitionName = surfaceDefinitionName; } /** * Gets the surface specification name. * @return The surface specification name */ public String getSurfaceSpecificationName() { return _surfaceSpecificationName; } /** * Sets the surface specification name. * @param surfaceSpecificationName The surface specification name. */ public void setSurfaceSpecificationName(final String surfaceSpecificationName) { if (_isCubeNameParameterSet) { s_logger.error("Surface specification name was already set using the deprecated setCubeName() method. This will" + " almost certainly result in unexpected behaviour"); _surfaceSpecificationName = surfaceSpecificationName; return; } _surfaceSpecificationName = surfaceSpecificationName; } @Override public void afterPropertiesSet() { ArgumentChecker.notNullInjected(getCubeDefinitionName(), "cubeDefinitionName"); ArgumentChecker.notNullInjected(getCubeSpecificationName(), "cubeSpecificationName"); ArgumentChecker.notNullInjected(getSurfaceDefinitionName(), "surfaceDefinitionName"); ArgumentChecker.notNullInjected(getSurfaceSpecificationName(), "surfaceSpecificationName"); ArgumentChecker.notNullInjected(getCurveConfiguration(), "curveConfiguration"); } } /** The per-currency info */ private final Map<String, CurrencyInfo> _perCurrencyInfo = new HashMap<>(); private String _fittingMethod = SmileFittingPropertyNamesAndValues.NON_LINEAR_LEAST_SQUARES; private String _xInterpolator = Interpolator1DFactory.LINEAR; private String _xLeftExtrapolator = Interpolator1DFactory.FLAT_EXTRAPOLATOR; private String _xRightExtrapolator = Interpolator1DFactory.FLAT_EXTRAPOLATOR; private String _yInterpolator = Interpolator1DFactory.LINEAR; private String _yLeftExtrapolator = Interpolator1DFactory.FLAT_EXTRAPOLATOR; private String _yRightExtrapolator = Interpolator1DFactory.FLAT_EXTRAPOLATOR; private double _cutOff = 0.07; private double _mu = 10.0; public void setPerCurrencyInfo(final Map<String, CurrencyInfo> perCurrencyInfo) { _perCurrencyInfo.clear(); _perCurrencyInfo.putAll(perCurrencyInfo); } public Map<String, CurrencyInfo> getPerCurrencyInfo() { return _perCurrencyInfo; } public void setCurrencyInfo(final String currency, final CurrencyInfo info) { _perCurrencyInfo.put(currency, info); } public CurrencyInfo getCurrencyInfo(final String currency) { return _perCurrencyInfo.get(currency); } public void setFittingMethod(final String fittingMethod) { _fittingMethod = fittingMethod; } public String getFittingMethod() { return _fittingMethod; } public String getXInterpolator() { return _xInterpolator; } public void setXInterpolator(final String xInterpolator) { _xInterpolator = xInterpolator; } public String getXLeftExtrapolator() { return _xLeftExtrapolator; } public void setXLeftExtrapolator(final String xLeftExtrapolator) { _xLeftExtrapolator = xLeftExtrapolator; } public String getXRightExtrapolator() { return _xRightExtrapolator; } public void setXRightExtrapolator(final String xRightExtrapolator) { _xRightExtrapolator = xRightExtrapolator; } public String getYInterpolator() { return _yInterpolator; } public void setYInterpolator(final String yInterpolator) { _yInterpolator = yInterpolator; } public String getYLeftExtrapolator() { return _yLeftExtrapolator; } public void setYLeftExtrapolator(final String yLeftExtrapolator) { _yLeftExtrapolator = yLeftExtrapolator; } public String getYRightExtrapolator() { return _yRightExtrapolator; } public void setYRightExtrapolator(final String yRightExtrapolator) { _yRightExtrapolator = yRightExtrapolator; } public void setCutOff(final double cutOff) { _cutOff = cutOff; } public double getCutOff() { return _cutOff; } public void setMu(final double mu) { _mu = mu; } public double getMu() { return _mu; } @Override public void afterPropertiesSet() { ArgumentChecker.notNullInjected(getFittingMethod(), "fittingMethod"); ArgumentChecker.notNullInjected(getXInterpolator(), "xInterpolator"); ArgumentChecker.notNullInjected(getXLeftExtrapolator(), "xLeftExtrapolator"); ArgumentChecker.notNullInjected(getXRightExtrapolator(), "xRightExtrapolator"); ArgumentChecker.notNullInjected(getYInterpolator(), "yInterpolator"); ArgumentChecker.notNullInjected(getYLeftExtrapolator(), "yLeftExtrapolator"); ArgumentChecker.notNullInjected(getYRightExtrapolator(), "yRightExtrapolator"); super.afterPropertiesSet(); } /** * Adds defaults for SABR calculations without extrapolation. * @param functions The functions */ protected void addNoExtrapolationDefaults(final List<FunctionConfiguration> functions) { final List<String> args = new ArrayList<>(); args.add(getFittingMethod()); for (final Map.Entry<String, CurrencyInfo> e : getPerCurrencyInfo().entrySet()) { if (e.getValue().isCubeNameParameterSet()) { args.add(e.getKey()); args.add(e.getValue().getCurveConfiguration()); args.add(e.getValue().getCubeName()); } else { args.add(e.getKey()); args.add(e.getValue().getCurveConfiguration()); args.add(e.getValue().getCubeDefinitionName()); args.add(e.getValue().getCubeSpecificationName()); args.add(e.getValue().getSurfaceDefinitionName()); args.add(e.getValue().getSurfaceSpecificationName()); } } functions.add(functionConfiguration(SABRNoExtrapolationDefaults.class, args.toArray(new String[args.size()]))); } /** * Adds defaults for the calculation of vega using SABR without extrapolation. * @param functions The functions */ protected void addNoExtrapolationVegaDefaults(final List<FunctionConfiguration> functions) { final List<String> args = new ArrayList<>(); args.add(getFittingMethod()); args.add(getXInterpolator()); args.add(getXLeftExtrapolator()); args.add(getXRightExtrapolator()); args.add(getYInterpolator()); args.add(getYLeftExtrapolator()); args.add(getYRightExtrapolator()); for (final Map.Entry<String, CurrencyInfo> e : getPerCurrencyInfo().entrySet()) { if (e.getValue().isCubeNameParameterSet()) { args.add(e.getKey()); args.add(e.getValue().getCurveConfiguration()); args.add(e.getValue().getCubeName()); } else { args.add(e.getKey()); args.add(e.getValue().getCurveConfiguration()); args.add(e.getValue().getCubeDefinitionName()); args.add(e.getValue().getCubeSpecificationName()); args.add(e.getValue().getSurfaceDefinitionName()); args.add(e.getValue().getSurfaceSpecificationName()); } } functions.add(functionConfiguration(SABRNoExtrapolationVegaDefaults.class, args.toArray(new String[args.size()]))); } /** * Adds defaults for SABR calculations with right extrapolation. * @param functions The functions */ protected void addRightExtrapolationDefaults(final List<FunctionConfiguration> functions) { final List<String> args = new ArrayList<>(); args.add(getFittingMethod()); args.add(Double.toString(getCutOff())); args.add(Double.toString(getMu())); for (final Map.Entry<String, CurrencyInfo> e : getPerCurrencyInfo().entrySet()) { if (e.getValue().isCubeNameParameterSet()) { args.add(e.getKey()); args.add(e.getValue().getCurveConfiguration()); args.add(e.getValue().getCubeName()); } else { args.add(e.getKey()); args.add(e.getValue().getCurveConfiguration()); args.add(e.getValue().getCubeDefinitionName()); args.add(e.getValue().getCubeSpecificationName()); args.add(e.getValue().getSurfaceDefinitionName()); args.add(e.getValue().getSurfaceSpecificationName()); } } functions.add(functionConfiguration(SABRRightExtrapolationDefaults.class, args.toArray(new String[args.size()]))); } /** * Adds defaults for the calculation of vega using SABR with right extrapolation. * @param functions The functions */ protected void addRightExtrapolationVegaDefaults(final List<FunctionConfiguration> functions) { final List<String> args = new ArrayList<>(); args.add(getFittingMethod()); args.add(Double.toString(getCutOff())); args.add(Double.toString(getMu())); args.add(getXInterpolator()); args.add(getXLeftExtrapolator()); args.add(getXRightExtrapolator()); args.add(getYInterpolator()); args.add(getYLeftExtrapolator()); args.add(getYRightExtrapolator()); for (final Map.Entry<String, CurrencyInfo> e : getPerCurrencyInfo().entrySet()) { if (e.getValue().isCubeNameParameterSet()) { args.add(e.getKey()); args.add(e.getValue().getCurveConfiguration()); args.add(e.getValue().getCubeName()); } else { args.add(e.getKey()); args.add(e.getValue().getCurveConfiguration()); args.add(e.getValue().getCubeDefinitionName()); args.add(e.getValue().getCubeSpecificationName()); args.add(e.getValue().getSurfaceDefinitionName()); args.add(e.getValue().getSurfaceSpecificationName()); } } functions.add(functionConfiguration(SABRRightExtrapolationVegaDefaults.class, args.toArray(new String[args.size()]))); } @Override protected void addAllConfigurations(final List<FunctionConfiguration> functions) { if (!getPerCurrencyInfo().isEmpty()) { addNoExtrapolationDefaults(functions); addNoExtrapolationVegaDefaults(functions); addRightExtrapolationDefaults(functions); addRightExtrapolationVegaDefaults(functions); } } }