/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.model.curve.interestrate;
import java.util.Collections;
import java.util.Set;
import com.google.common.collect.Sets;
import com.opengamma.engine.ComputationTarget;
import com.opengamma.engine.function.FunctionCompilationContext;
import com.opengamma.engine.target.ComputationTargetType;
import com.opengamma.engine.value.ValueProperties;
import com.opengamma.engine.value.ValuePropertyNames;
import com.opengamma.engine.value.ValueRequirement;
import com.opengamma.engine.value.ValueRequirementNames;
import com.opengamma.financial.analytics.model.InterpolatedDataProperties;
import com.opengamma.financial.property.DefaultPropertyFunction;
import com.opengamma.util.ArgumentChecker;
/**
* @deprecated This function sets defaults for deprecated yield curve calculation functions.
*/
@Deprecated
public class FXImpliedYieldCurveDefaults extends DefaultPropertyFunction {
/** The value requirement names for which these defaults apply */
private static final String[] VALUE_REQUIREMENTS = new String[] {
ValueRequirementNames.YIELD_CURVE,
ValueRequirementNames.YIELD_CURVE_JACOBIAN,
ValueRequirementNames.FX_IMPLIED_TRANSITION_MATRIX,
ValueRequirementNames.YIELD_CURVE_SERIES
};
/** The interpolator name */
private final Set<String> _interpolatorName;
/** The left extrapolator name */
private final Set<String> _leftExtrapolatorName;
/** The right extrapolator name */
private final Set<String> _rightExtrapolatorName;
/** The absolute tolerance */
private final Set<String> _absoluteTolerance;
/** The relative tolerance */
private final Set<String> _relativeTolerance;
/** The maximum number of iterations */
private final Set<String> _maxIterations;
/** The matrix decomposition method */
private final Set<String> _decomposition;
/** Whether to use finite difference or analytic derivatives */
private final Set<String> _useFiniteDifference;
/** The currencies for which these defaults apply */
private final Set<String> _applicableCurrencies;
/**
* @param absoluteTolerance The absolute tolerance used in root-finding
* @param relativeTolerance The relative tolerance use in root-finding
* @param maxIterations The maximum number of iterations used in root-finding
* @param decomposition The matrix decomposition method used in root-finding
* @param interpolatorName The interpolator name
* @param leftExtrapolatorName The left extrapolator name
* @param rightExtrapolatorName The right extrapolator name
* @param useFiniteDifference True if calculations should use finite difference in root-finding, otherwise analytic derivatives are used
* @param applicableCurrencies The currencies for which these defaults apply
*/
public FXImpliedYieldCurveDefaults(final String absoluteTolerance, final String relativeTolerance, final String maxIterations, final String decomposition,
final String useFiniteDifference, final String interpolatorName, final String leftExtrapolatorName, final String rightExtrapolatorName,
final String... applicableCurrencies) {
super(ComputationTargetType.CURRENCY, true);
ArgumentChecker.notNull(absoluteTolerance, "absolute tolerance");
ArgumentChecker.notNull(relativeTolerance, "relative tolerance");
ArgumentChecker.notNull(maxIterations, "max iterations");
ArgumentChecker.notNull(decomposition, "decomposition");
ArgumentChecker.notNull(useFiniteDifference, "use finite difference");
ArgumentChecker.notNull(interpolatorName, "interpolator name");
ArgumentChecker.notNull(leftExtrapolatorName, "left extrapolator name");
ArgumentChecker.notNull(rightExtrapolatorName, "right extrapolator name");
ArgumentChecker.notNull(applicableCurrencies, "applicable currencies");
_absoluteTolerance = Collections.singleton(absoluteTolerance);
_relativeTolerance = Collections.singleton(relativeTolerance);
_maxIterations = Collections.singleton(maxIterations);
_decomposition = Collections.singleton(decomposition);
_useFiniteDifference = Collections.singleton(useFiniteDifference);
_interpolatorName = Collections.singleton(interpolatorName);
_leftExtrapolatorName = Collections.singleton(leftExtrapolatorName);
_rightExtrapolatorName = Collections.singleton(rightExtrapolatorName);
_applicableCurrencies = Sets.newHashSet(applicableCurrencies);
}
@Override
public boolean canApplyTo(final FunctionCompilationContext context, final ComputationTarget target) {
if (target.getUniqueId() == null) {
return false;
}
for (final String applicableCurrencyName : _applicableCurrencies) {
if (applicableCurrencyName.equals(target.getUniqueId().getValue())) {
return true;
}
}
return false;
}
@Override
protected void getDefaults(final PropertyDefaults defaults) {
for (final String valueRequirement : VALUE_REQUIREMENTS) {
defaults.addValuePropertyName(valueRequirement, MultiYieldCurvePropertiesAndDefaults.PROPERTY_ROOT_FINDER_ABSOLUTE_TOLERANCE);
defaults.addValuePropertyName(valueRequirement, MultiYieldCurvePropertiesAndDefaults.PROPERTY_ROOT_FINDER_RELATIVE_TOLERANCE);
defaults.addValuePropertyName(valueRequirement, MultiYieldCurvePropertiesAndDefaults.PROPERTY_ROOT_FINDER_MAX_ITERATIONS);
defaults.addValuePropertyName(valueRequirement, MultiYieldCurvePropertiesAndDefaults.PROPERTY_DECOMPOSITION);
defaults.addValuePropertyName(valueRequirement, MultiYieldCurvePropertiesAndDefaults.PROPERTY_USE_FINITE_DIFFERENCE);
defaults.addValuePropertyName(valueRequirement, InterpolatedDataProperties.X_INTERPOLATOR_NAME);
defaults.addValuePropertyName(valueRequirement, InterpolatedDataProperties.LEFT_X_EXTRAPOLATOR_NAME);
defaults.addValuePropertyName(valueRequirement, InterpolatedDataProperties.RIGHT_X_EXTRAPOLATOR_NAME);
}
}
@Override
public Set<ValueRequirement> getRequirements(final FunctionCompilationContext context, final ComputationTarget target, final ValueRequirement desiredValue) {
final ValueProperties constraints = desiredValue.getConstraints();
final String curveCalculationMethod = constraints.getStrictValue(ValuePropertyNames.CURVE_CALCULATION_METHOD);
if (curveCalculationMethod == null) {
return super.getRequirements(context, target, desiredValue);
}
if (!curveCalculationMethod.equals(FXImpliedYieldCurveFunction.FX_IMPLIED)) {
return null;
}
return super.getRequirements(context, target, desiredValue);
}
@Override
protected Set<String> getDefaultValue(final FunctionCompilationContext context, final ComputationTarget target, final ValueRequirement desiredValue, final String propertyName) {
switch (propertyName) {
case MultiYieldCurvePropertiesAndDefaults.PROPERTY_DECOMPOSITION:
return _decomposition;
case MultiYieldCurvePropertiesAndDefaults.PROPERTY_ROOT_FINDER_ABSOLUTE_TOLERANCE:
return _absoluteTolerance;
case MultiYieldCurvePropertiesAndDefaults.PROPERTY_ROOT_FINDER_RELATIVE_TOLERANCE:
return _relativeTolerance;
case MultiYieldCurvePropertiesAndDefaults.PROPERTY_ROOT_FINDER_MAX_ITERATIONS:
return _maxIterations;
case MultiYieldCurvePropertiesAndDefaults.PROPERTY_USE_FINITE_DIFFERENCE:
return _useFiniteDifference;
case InterpolatedDataProperties.X_INTERPOLATOR_NAME:
return _interpolatorName;
case InterpolatedDataProperties.LEFT_X_EXTRAPOLATOR_NAME:
return _leftExtrapolatorName;
case InterpolatedDataProperties.RIGHT_X_EXTRAPOLATOR_NAME:
return _rightExtrapolatorName;
default:
return null;
}
}
}