/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.model.credit.isda.calibration; import static com.opengamma.financial.analytics.model.credit.CreditInstrumentPropertyNamesAndValues.PROPERTY_SPREAD_CURVE_SHIFT; import static com.opengamma.financial.analytics.model.credit.CreditInstrumentPropertyNamesAndValues.PROPERTY_SPREAD_CURVE_SHIFT_TYPE; import java.util.Collections; import java.util.Map; import java.util.Set; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import com.opengamma.engine.ComputationTarget; import com.opengamma.engine.ComputationTargetSpecification; import com.opengamma.engine.function.AbstractFunction; import com.opengamma.engine.function.FunctionCompilationContext; 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.OpenGammaCompilationContext; import com.opengamma.financial.analytics.model.YieldCurveFunctionUtils; import com.opengamma.financial.analytics.model.cds.ISDAFunctionConstants; import com.opengamma.financial.analytics.model.credit.CreditInstrumentPropertyNamesAndValues; import com.opengamma.financial.analytics.model.credit.CreditSecurityToIdentifierVisitor; import com.opengamma.financial.security.FinancialSecurity; import com.opengamma.financial.security.FinancialSecurityUtils; /** * */ public abstract class ISDAHazardRateCurveFunction extends AbstractFunction.NonCompiledInvoker { @Override public Set<ValueSpecification> getResults(final FunctionCompilationContext context, final ComputationTarget target) { final ValueProperties properties = ValueProperties.all(); return Collections.singleton(new ValueSpecification(ValueRequirementNames.HAZARD_RATE_CURVE, target.toSpecification(), properties)); } @Override public Set<ValueRequirement> getRequirements(final FunctionCompilationContext context, final ComputationTarget target, final ValueRequirement desiredValue) { final ValueProperties constraints = desiredValue.getConstraints(); final Set<String> yieldCurveNames = constraints.getValues(CreditInstrumentPropertyNamesAndValues.PROPERTY_YIELD_CURVE); if (yieldCurveNames == null || yieldCurveNames.size() != 1) { return null; } final Set<String> yieldCurveCalculationConfigNames = constraints.getValues(CreditInstrumentPropertyNamesAndValues.PROPERTY_YIELD_CURVE_CALCULATION_CONFIG); if (yieldCurveCalculationConfigNames == null || yieldCurveCalculationConfigNames.size() != 1) { return null; } final Set<String> yieldCurveCalculationMethodNames = constraints.getValues(CreditInstrumentPropertyNamesAndValues.PROPERTY_YIELD_CURVE_CALCULATION_METHOD); if (yieldCurveCalculationMethodNames == null || yieldCurveCalculationMethodNames.size() != 1) { return null; } final FinancialSecurity security = (FinancialSecurity) target.getSecurity(); final ComputationTargetSpecification currencyTarget = ComputationTargetSpecification.of(FinancialSecurityUtils.getCurrency(target.getSecurity())); final String yieldCurveName = Iterables.getOnlyElement(yieldCurveNames); final String yieldCurveCalculationConfigName = Iterables.getOnlyElement(yieldCurveCalculationConfigNames); final String yieldCurveCalculationMethodName = Iterables.getOnlyElement(yieldCurveCalculationMethodNames); final CreditSecurityToIdentifierVisitor identifierVisitor = new CreditSecurityToIdentifierVisitor(OpenGammaCompilationContext.getSecuritySource(context)); final String spreadCurveName = security.accept(identifierVisitor).getUniqueId().getValue(); final ValueRequirement yieldCurveRequirement = YieldCurveFunctionUtils.getCurveRequirement(currencyTarget, yieldCurveName, yieldCurveCalculationConfigName, yieldCurveCalculationMethodName); final ValueProperties.Builder spreadCurveProperties = ValueProperties.builder() .with(ValuePropertyNames.CURVE, spreadCurveName); final Set<String> spreadCurveShift = constraints.getValues(PROPERTY_SPREAD_CURVE_SHIFT); if (spreadCurveShift != null && !spreadCurveShift.isEmpty()) { final Set<String> creditSpreadCurveShiftTypes = constraints.getValues(PROPERTY_SPREAD_CURVE_SHIFT_TYPE); if (creditSpreadCurveShiftTypes == null || creditSpreadCurveShiftTypes.size() != 1) { return null; } spreadCurveProperties.with(PROPERTY_SPREAD_CURVE_SHIFT, spreadCurveShift).with(PROPERTY_SPREAD_CURVE_SHIFT_TYPE, creditSpreadCurveShiftTypes); } final ValueRequirement creditSpreadCurveRequirement = new ValueRequirement(ValueRequirementNames.CREDIT_SPREAD_CURVE, ComputationTargetSpecification.NULL, spreadCurveProperties.get()); return Sets.newHashSet(yieldCurveRequirement, creditSpreadCurveRequirement); } @Override public Set<ValueSpecification> getResults(final FunctionCompilationContext context, final ComputationTarget target, final Map<ValueSpecification, ValueRequirement> inputs) { final ValueProperties.Builder propertiesBuilder = createValueProperties() .with(ValuePropertyNames.CURVE_CALCULATION_METHOD, ISDAFunctionConstants.ISDA_METHOD_NAME); for (final Map.Entry<ValueSpecification, ValueRequirement> entry : inputs.entrySet()) { final ValueSpecification spec = entry.getKey(); final ValueProperties.Builder inputPropertiesBuilder = spec.getProperties().copy(); inputPropertiesBuilder.withoutAny(ValuePropertyNames.FUNCTION); if (spec.getValueName().equals(ValueRequirementNames.YIELD_CURVE)) { propertiesBuilder.with(CreditInstrumentPropertyNamesAndValues.PROPERTY_YIELD_CURVE, inputPropertiesBuilder.get().getValues(ValuePropertyNames.CURVE)); inputPropertiesBuilder.withoutAny(ValuePropertyNames.CURVE); propertiesBuilder.with(CreditInstrumentPropertyNamesAndValues.PROPERTY_YIELD_CURVE_CALCULATION_CONFIG, inputPropertiesBuilder.get().getValues(ValuePropertyNames.CURVE_CALCULATION_CONFIG)); inputPropertiesBuilder.withoutAny(ValuePropertyNames.CURVE_CALCULATION_CONFIG); propertiesBuilder.with(CreditInstrumentPropertyNamesAndValues.PROPERTY_YIELD_CURVE_CALCULATION_METHOD, inputPropertiesBuilder.get().getValues(ValuePropertyNames.CURVE_CALCULATION_METHOD)); inputPropertiesBuilder.withoutAny(ValuePropertyNames.CURVE_CALCULATION_METHOD); } else if (spec.getValueName().equals(ValueRequirementNames.CREDIT_SPREAD_CURVE)) { propertiesBuilder.with(ValuePropertyNames.CURVE, inputPropertiesBuilder.get().getValues(ValuePropertyNames.CURVE)); inputPropertiesBuilder.withoutAny(ValuePropertyNames.CURVE); } final ValueProperties inputProperties = inputPropertiesBuilder.get(); if (!inputProperties.isEmpty()) { for (final String propertyName : inputProperties.getProperties()) { propertiesBuilder.with(propertyName, inputProperties.getValues(propertyName)); } } } final ValueProperties properties = propertiesBuilder.get(); final ComputationTargetSpecification targetSpec = target.toSpecification(); return Collections.singleton(new ValueSpecification(ValueRequirementNames.HAZARD_RATE_CURVE, targetSpec, properties)); } }