/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.ircurve; import java.util.Collections; import java.util.Set; import org.threeten.bp.Instant; import com.google.common.collect.ImmutableSet; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.core.marketdatasnapshot.SnapshotDataBundle; import com.opengamma.engine.ComputationTarget; import com.opengamma.engine.ComputationTargetSpecification; import com.opengamma.engine.function.AbstractFunction; import com.opengamma.engine.function.CompiledFunctionDefinition; import com.opengamma.engine.function.FunctionCompilationContext; import com.opengamma.engine.function.FunctionExecutionContext; import com.opengamma.engine.function.FunctionInputs; import com.opengamma.engine.target.ComputationTargetType; import com.opengamma.engine.value.ComputedValue; 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.OpenGammaExecutionContext; import com.opengamma.util.money.Currency; import com.opengamma.util.tuple.Triple; /** * Function to produce {@link InterpolatedYieldCurveSpecificationWithSecurities} and {@link YieldCurveData} values for a * named curve/currency pair. An instance must be created and put into the repository for each curve * definition to be made available to downstream functions which can reference the required curves using property * constraints. */ public class YieldCurveDataFunction extends AbstractFunction { private final YieldCurveFunctionHelper _helper; private final String _curveDefinitionName; private final ComputationTargetSpecification _targetSpec; private ValueSpecification _curveSpec; private ValueSpecification _curveDataSpec; public YieldCurveDataFunction(final String currency, final String curveDefinitionName) { this(Currency.of(currency), curveDefinitionName); } public YieldCurveDataFunction(final Currency currency, final String curveDefinitionName) { _helper = new YieldCurveFunctionHelper(currency, curveDefinitionName); _curveDefinitionName = curveDefinitionName; _targetSpec = ComputationTargetSpecification.of(currency); } @Override public void init(final FunctionCompilationContext context) { _helper.init(context, this); ValueProperties properties = createValueProperties().with(ValuePropertyNames.CURVE, _curveDefinitionName).get(); _curveSpec = new ValueSpecification(ValueRequirementNames.YIELD_CURVE_SPEC, _targetSpec, properties); _curveDataSpec = new ValueSpecification(ValueRequirementNames.YIELD_CURVE_DATA, _targetSpec, properties); } private final class CompiledImpl extends AbstractFunction.AbstractInvokingCompiledFunction { private final InterpolatedYieldCurveSpecification _curveSpecification; private CompiledImpl(final Instant earliest, final Instant latest, final InterpolatedYieldCurveSpecification curveSpecification) { super(earliest, latest); _curveSpecification = curveSpecification; } @Override public ComputationTargetType getTargetType() { return ComputationTargetType.CURRENCY; } @Override public boolean canApplyTo(final FunctionCompilationContext context, final ComputationTarget target) { return _helper.getCurrency().equals(target.getValue()); } @Override public Set<ValueSpecification> getResults(final FunctionCompilationContext context, final ComputationTarget target) { return ImmutableSet.of(_curveSpec, _curveDataSpec); } @Override public Set<ValueRequirement> getRequirements(final FunctionCompilationContext context, final ComputationTarget target, final ValueRequirement desiredValue) { return Collections.singleton(_helper.getMarketDataValueRequirement()); } @Override public Set<ComputedValue> execute(final FunctionExecutionContext executionContext, final FunctionInputs inputs, final ComputationTarget target, final Set<ValueRequirement> desiredValues) { try { final FixedIncomeStripIdentifierAndMaturityBuilder builder = new FixedIncomeStripIdentifierAndMaturityBuilder(OpenGammaExecutionContext.getRegionSource(executionContext), OpenGammaExecutionContext.getConventionBundleSource(executionContext), executionContext.getSecuritySource(), OpenGammaExecutionContext.getHolidaySource(executionContext)); final SnapshotDataBundle marketData = _helper.getMarketDataMap(inputs); final InterpolatedYieldCurveSpecificationWithSecurities curveSpecificationWithSecurities = builder.resolveToSecurity(_curveSpecification, marketData); YieldCurveData curveData = new YieldCurveData(curveSpecificationWithSecurities, marketData.getDataPoints()); return ImmutableSet.of(new ComputedValue(_curveSpec, curveSpecificationWithSecurities), new ComputedValue(_curveDataSpec, curveData)); } catch (final OpenGammaRuntimeException e) { throw new OpenGammaRuntimeException("Error in constructing " + _helper.getCurveName() + "_" + _helper.getCurrency() + ": " + e.getMessage()); } } } @SuppressWarnings("synthetic-access") @Override public CompiledFunctionDefinition compile(final FunctionCompilationContext context, final Instant atInstant) { _helper.init(context, this); Triple<Instant, Instant, InterpolatedYieldCurveSpecification> compile = _helper.compile(context, atInstant, this); return new CompiledImpl(compile.getFirst(), compile.getSecond(), compile.getThird()); } }