/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.model.volatility.local;
import static com.opengamma.engine.value.ValuePropertyNames.CURVE;
import static com.opengamma.financial.analytics.model.volatility.local.PDEPropertyNamesAndValues.PROPERTY_DISCOUNTING_CURVE_NAME;
import java.util.Collections;
import java.util.Set;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.analytics.financial.model.interestrate.curve.ForwardCurve;
import com.opengamma.analytics.financial.model.interestrate.curve.YieldAndDiscountCurve;
import com.opengamma.analytics.financial.model.option.pricing.analytic.formula.EuropeanVanillaOption;
import com.opengamma.analytics.financial.model.volatility.local.LocalVolatilitySurfaceMoneyness;
import com.opengamma.analytics.financial.model.volatility.local.PDELocalVolatilityCalculator;
import com.opengamma.engine.ComputationTarget;
import com.opengamma.engine.function.AbstractFunction;
import com.opengamma.engine.function.FunctionCompilationContext;
import com.opengamma.engine.target.ComputationTargetReference;
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.engine.value.ValueSpecification;
import com.opengamma.financial.analytics.model.curve.forward.ForwardCurveValuePropertyNames;
import com.opengamma.financial.security.FinancialSecurity;
import com.opengamma.util.ArgumentChecker;
/**
*
*/
public abstract class LocalVolatilityPDEFunction extends AbstractFunction.NonCompiledInvoker {
/** The name of this local volatility calculation method */
public static final String CALCULATION_METHOD = "LocalVolatilityPDE";
private final String _blackSmileInterpolatorName;
public LocalVolatilityPDEFunction(final String blackSmileInterpolatorName) {
ArgumentChecker.notNull(blackSmileInterpolatorName, "Black smile interpolator name");
_blackSmileInterpolatorName = blackSmileInterpolatorName;
}
@Override
public Set<ValueSpecification> getResults(final FunctionCompilationContext context, final ComputationTarget target) {
final ValueProperties properties = getResultProperties();
return Collections.singleton(new ValueSpecification(getRequirementName(), target.toSpecification(), properties));
}
protected abstract String getRequirementName();
protected abstract ComputationTargetReference getVolatilitySurfaceAndForwardCurveTarget(final ComputationTarget target);
protected abstract ComputationTargetReference getDiscountingCurveTarget(final ComputationTarget target);
protected abstract String getInstrumentType();
protected abstract EuropeanVanillaOption getOption(final FinancialSecurity security, final ZonedDateTime date);
protected abstract ValueProperties getResultProperties();
protected abstract ValueProperties getResultProperties(final ValueRequirement desiredValue);
protected ValueRequirement getVolatilitySurfaceRequirement(final ComputationTarget target, final ValueRequirement desiredValue) {
final ValueProperties properties = LocalVolatilitySurfaceUtils.addAllDupireLocalVolatilitySurfaceProperties(ValueProperties.builder().get(), getInstrumentType(), _blackSmileInterpolatorName,
LocalVolatilitySurfacePropertyNamesAndValues.MONEYNESS, desiredValue).get();
return new ValueRequirement(ValueRequirementNames.LOCAL_VOLATILITY_SURFACE, getVolatilitySurfaceAndForwardCurveTarget(target), properties);
}
protected ValueRequirement getForwardCurveRequirement(final ComputationTarget target, final ValueRequirement desiredValue) {
final String calculationMethod = desiredValue.getConstraint(ForwardCurveValuePropertyNames.PROPERTY_FORWARD_CURVE_CALCULATION_METHOD);
final String forwardCurveName = desiredValue.getConstraint(ValuePropertyNames.CURVE);
final ValueProperties properties = ValueProperties.builder()
.with(ForwardCurveValuePropertyNames.PROPERTY_FORWARD_CURVE_CALCULATION_METHOD, calculationMethod)
.with(CURVE, forwardCurveName).get();
return new ValueRequirement(ValueRequirementNames.FORWARD_CURVE, getVolatilitySurfaceAndForwardCurveTarget(target), properties);
}
protected ValueRequirement getDiscountingCurveRequirement(final ComputationTarget target, final ValueRequirement desiredValue) {
final ValueProperties properties = ValueProperties.builder()
.with(ValuePropertyNames.CURVE, desiredValue.getConstraint(PROPERTY_DISCOUNTING_CURVE_NAME))
.with(ValuePropertyNames.CURVE_CALCULATION_CONFIG, desiredValue.getConstraint(ValuePropertyNames.CURVE_CALCULATION_CONFIG)).get();
return new ValueRequirement(ValueRequirementNames.YIELD_CURVE, getDiscountingCurveTarget(target), properties);
}
protected Object getResult(final PDELocalVolatilityCalculator<?> calculator, final LocalVolatilitySurfaceMoneyness localVolatility, final ForwardCurve forwardCurve,
final EuropeanVanillaOption option, final YieldAndDiscountCurve discountingCurve) {
return calculator.getResult(localVolatility, forwardCurve, option, discountingCurve);
}
protected String getBlackSmileInterpolatorName() {
return _blackSmileInterpolatorName;
}
}