/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.covariance; import java.util.Collections; import java.util.Map; import java.util.Set; import com.google.common.collect.ImmutableSet; 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.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; /** * Acts on a target of {@link ComputationTarget#NULL} to mean the view's portfolio. This is a convenience function to allow this to be more easily added as a specific requirement to a view. */ public class DefaultTargetCovarianceMatrixFunction extends AbstractFunction.NonCompiledInvoker { // CompiledFunctionDefinition @Override public ComputationTargetType getTargetType() { return ComputationTargetType.NULL; } @Override public boolean canApplyTo(final FunctionCompilationContext context, final ComputationTarget target) { return context.getPortfolio() != null; } @Override public Set<ValueSpecification> getResults(final FunctionCompilationContext context, final ComputationTarget target) { return ImmutableSet.of(new ValueSpecification(ValueRequirementNames.COVARIANCE_MATRIX, ComputationTargetSpecification.NULL, ValueProperties.all()), new ValueSpecification(ValueRequirementNames.CORRELATION_MATRIX, ComputationTargetSpecification.NULL, ValueProperties.all())); } @Override public Set<ValueRequirement> getRequirements(final FunctionCompilationContext context, final ComputationTarget target, final ValueRequirement desiredValue) { return Collections.singleton(new ValueRequirement(desiredValue.getValueName(), new ComputationTargetSpecification(ComputationTargetType.PORTFOLIO, context.getPortfolio() .getUniqueId()), desiredValue.getConstraints().withoutAny(ValuePropertyNames.FUNCTION))); } @Override public Set<ValueSpecification> getResults(final FunctionCompilationContext context, final ComputationTarget target, final Map<ValueSpecification, ValueRequirement> inputs) { final ValueSpecification input = inputs.keySet().iterator().next(); final ValueProperties.Builder properties = createValueProperties(); for (String property : input.getProperties().getProperties()) { if (!ValuePropertyNames.FUNCTION.equals(property)) { final Set<String> values = input.getProperties().getValues(property); if (values.isEmpty()) { properties.withAny(property); } else { properties.with(property, values); } } } return Collections.singleton(new ValueSpecification(input.getValueName(), ComputationTargetSpecification.NULL, properties.get())); } // FunctionInvoker @Override public Set<ComputedValue> execute(final FunctionExecutionContext context, final FunctionInputs inputs, final ComputationTarget target, final Set<ValueRequirement> desiredValues) { final ValueRequirement desiredValue = desiredValues.iterator().next(); final Object value = inputs.getValue(desiredValue.getValueName()); final ValueRequirement resultReq = desiredValues.iterator().next(); final ValueSpecification resultSpec = new ValueSpecification(desiredValue.getValueName(), ComputationTargetSpecification.NULL, resultReq.getConstraints()); return Collections.singleton(new ComputedValue(resultSpec, value)); } }