com.opengamma.financial.analytics.model.curve.forward.InstantaneousForwardCurveFunction.java Source code

Java tutorial

Introduction

Here is the source code for com.opengamma.financial.analytics.model.curve.forward.InstantaneousForwardCurveFunction.java

Source

/**
 * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
 *
 * Please see distribution for license.
 */
package com.opengamma.financial.analytics.model.curve.forward;

import static com.opengamma.engine.value.ValuePropertyNames.CURVE;
import static com.opengamma.engine.value.ValuePropertyNames.CURVE_CONSTRUCTION_CONFIG;
import static com.opengamma.engine.value.ValueRequirementNames.INSTANTANEOUS_FORWARD_CURVE;
import static com.opengamma.engine.value.ValueRequirementNames.YIELD_CURVE;
import static com.opengamma.financial.analytics.model.curve.CurveCalculationPropertyNamesAndValues.PROPERTY_CURVE_TYPE;

import java.util.Collections;
import java.util.Set;

import com.google.common.collect.Iterables;
import com.opengamma.analytics.financial.model.interestrate.curve.YieldAndDiscountCurve;
import com.opengamma.analytics.math.curve.NodalDoublesCurve;
import com.opengamma.engine.ComputationTarget;
import com.opengamma.engine.function.AbstractFunction;
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.ValueRequirement;
import com.opengamma.engine.value.ValueSpecification;
import com.opengamma.util.async.AsynchronousExecution;

/**
 *
 */
public class InstantaneousForwardCurveFunction extends AbstractFunction.NonCompiledInvoker {

    @Override
    public Set<ComputedValue> execute(final FunctionExecutionContext executionContext, final FunctionInputs inputs,
            final ComputationTarget target, final Set<ValueRequirement> desiredValues)
            throws AsynchronousExecution {
        final YieldAndDiscountCurve curve = (YieldAndDiscountCurve) inputs.getValue(YIELD_CURVE);
        final int n = 1000;
        final double[] xData = new double[n];
        final double[] yData = new double[n];
        for (int i = 0; i < n; i++) {
            final double t = i / 40.;
            xData[i] = t;
            yData[i] = curve.getForwardRate(t);
        }
        final NodalDoublesCurve forwardCurve = NodalDoublesCurve.from(xData, yData);
        final ValueProperties properties = Iterables.getOnlyElement(desiredValues).getConstraints();
        final ValueSpecification spec = new ValueSpecification(INSTANTANEOUS_FORWARD_CURVE,
                target.toSpecification(), properties);
        return Collections.singleton(new ComputedValue(spec, forwardCurve));
    }

    @Override
    public ComputationTargetType getTargetType() {
        return ComputationTargetType.NULL;
    }

    @Override
    public Set<ValueSpecification> getResults(final FunctionCompilationContext context,
            final ComputationTarget target) {
        final ValueProperties properties = createValueProperties().withAny(CURVE).withAny(PROPERTY_CURVE_TYPE)
                .withAny(CURVE_CONSTRUCTION_CONFIG).get();
        return Collections.singleton(
                new ValueSpecification(INSTANTANEOUS_FORWARD_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> curveNames = constraints.getValues(CURVE);
        if (curveNames == null || curveNames.size() != 1) {
            return null;
        }
        final Set<String> curveTypes = constraints.getValues(PROPERTY_CURVE_TYPE);
        if (curveTypes == null || curveTypes.size() != 1) {
            return null;
        }
        final Set<String> curveCalculationConfiguration = constraints.getValues(CURVE_CONSTRUCTION_CONFIG);
        if (curveCalculationConfiguration == null || curveCalculationConfiguration.size() != 1) {
            return null;
        }
        final ValueProperties curveProperties = ValueProperties.with(CURVE, curveNames)
                .with(PROPERTY_CURVE_TYPE, curveTypes)
                .with(CURVE_CONSTRUCTION_CONFIG, curveCalculationConfiguration).get();
        return Collections.singleton(new ValueRequirement(YIELD_CURVE, target.toSpecification(), curveProperties));
    }

}