/** * 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.financial.analytics.model.volatility.local.PDEPropertyNamesAndValues.PROPERTY_CENTRE_MONEYNESS; import static com.opengamma.financial.analytics.model.volatility.local.PDEPropertyNamesAndValues.PROPERTY_DISCOUNTING_CURVE_NAME; import static com.opengamma.financial.analytics.model.volatility.local.PDEPropertyNamesAndValues.PROPERTY_MAX_MONEYNESS; import static com.opengamma.financial.analytics.model.volatility.local.PDEPropertyNamesAndValues.PROPERTY_MAX_PROXY_DELTA; import static com.opengamma.financial.analytics.model.volatility.local.PDEPropertyNamesAndValues.PROPERTY_NUMBER_SPACE_STEPS; import static com.opengamma.financial.analytics.model.volatility.local.PDEPropertyNamesAndValues.PROPERTY_NUMBER_TIME_STEPS; import static com.opengamma.financial.analytics.model.volatility.local.PDEPropertyNamesAndValues.PROPERTY_PDE_DIRECTION; import static com.opengamma.financial.analytics.model.volatility.local.PDEPropertyNamesAndValues.PROPERTY_SPACE_DIRECTION_INTERPOLATOR; import static com.opengamma.financial.analytics.model.volatility.local.PDEPropertyNamesAndValues.PROPERTY_SPACE_STEPS_BUNCHING; import static com.opengamma.financial.analytics.model.volatility.local.PDEPropertyNamesAndValues.PROPERTY_THETA; import static com.opengamma.financial.analytics.model.volatility.local.PDEPropertyNamesAndValues.PROPERTY_TIME_STEP_BUNCHING; import java.util.Collections; import java.util.Set; import com.opengamma.engine.value.ValueProperties; import com.opengamma.engine.value.ValuePropertyNames; import com.opengamma.engine.value.ValueRequirement; import com.opengamma.financial.analytics.model.volatility.surface.black.BlackVolatilitySurfacePropertyUtils; /** * */ public class PDEFunctionUtils { public static Set<ValueRequirement> ensureForwardPDEFunctionProperties(final ValueProperties constraints) { final Set<String> thetas = constraints.getValues(PROPERTY_THETA); if (thetas == null || thetas.size() != 1) { return null; } final Set<String> nTimeSteps = constraints.getValues(PROPERTY_NUMBER_TIME_STEPS); if (nTimeSteps == null || nTimeSteps.size() != 1) { return null; } final Set<String> nSpaceSteps = constraints.getValues(PROPERTY_NUMBER_SPACE_STEPS); if (nSpaceSteps == null || nSpaceSteps.size() != 1) { return null; } final Set<String> timeStepBunchings = constraints.getValues(PROPERTY_TIME_STEP_BUNCHING); if (timeStepBunchings == null || timeStepBunchings.size() != 1) { return null; } final Set<String> spaceStepBunchings = constraints.getValues(PROPERTY_SPACE_STEPS_BUNCHING); if (spaceStepBunchings == null || spaceStepBunchings.size() != 1) { return null; } final Set<String> maxProxyDeltas = constraints.getValues(PROPERTY_MAX_PROXY_DELTA); if (maxProxyDeltas == null || maxProxyDeltas.size() != 1) { return null; } final Set<String> centreMoneynesses = constraints.getValues(PROPERTY_CENTRE_MONEYNESS); if (centreMoneynesses == null || centreMoneynesses.size() != 1) { return null; } final Set<String> directions = constraints.getValues(PROPERTY_PDE_DIRECTION); if (directions == null || directions.size() != 1) { return null; } final Set<String> interpolatorNames = constraints.getValues(PROPERTY_SPACE_DIRECTION_INTERPOLATOR); if (interpolatorNames == null || interpolatorNames.size() != 1) { return null; } final Set<String> discountingCurveNames = constraints.getValues(PROPERTY_DISCOUNTING_CURVE_NAME); if (discountingCurveNames == null || discountingCurveNames.size() != 1) { return null; } final Set<String> discountingCurveCalculationConfigs = constraints.getValues(ValuePropertyNames.CURVE_CALCULATION_CONFIG); if (discountingCurveCalculationConfigs == null || discountingCurveCalculationConfigs.size() != 1) { return null; } return Collections.emptySet(); } public static ValueProperties.Builder addForwardPDEProperties(final ValueProperties properties) { return properties.copy() .withAny(PROPERTY_CENTRE_MONEYNESS) .withAny(PROPERTY_DISCOUNTING_CURVE_NAME) .withAny(ValuePropertyNames.CURVE_CALCULATION_CONFIG) .withAny(PROPERTY_MAX_PROXY_DELTA) .withAny(PROPERTY_NUMBER_SPACE_STEPS) .withAny(PROPERTY_NUMBER_TIME_STEPS) .with(PROPERTY_PDE_DIRECTION, PDEPropertyNamesAndValues.FORWARDS) .withAny(PROPERTY_SPACE_DIRECTION_INTERPOLATOR) .withAny(PROPERTY_SPACE_STEPS_BUNCHING) .withAny(PROPERTY_THETA) .withAny(PROPERTY_TIME_STEP_BUNCHING); } public static ValueProperties.Builder addForwardPDEProperties(final ValueProperties properties, final ValueRequirement desiredValue) { return properties.copy() .with(PROPERTY_CENTRE_MONEYNESS, desiredValue.getConstraint(PROPERTY_CENTRE_MONEYNESS)) .with(PROPERTY_DISCOUNTING_CURVE_NAME, desiredValue.getConstraint(PROPERTY_DISCOUNTING_CURVE_NAME)) .with(ValuePropertyNames.CURVE_CALCULATION_CONFIG, desiredValue.getConstraint(ValuePropertyNames.CURVE_CALCULATION_CONFIG)) .with(PROPERTY_MAX_PROXY_DELTA, desiredValue.getConstraint(PROPERTY_MAX_PROXY_DELTA)) .with(PROPERTY_NUMBER_SPACE_STEPS, desiredValue.getConstraint(PROPERTY_NUMBER_SPACE_STEPS)) .with(PROPERTY_NUMBER_TIME_STEPS, desiredValue.getConstraint(PROPERTY_NUMBER_TIME_STEPS)) .with(PROPERTY_PDE_DIRECTION, desiredValue.getConstraint(PROPERTY_PDE_DIRECTION)) .with(PROPERTY_SPACE_DIRECTION_INTERPOLATOR, desiredValue.getConstraint(PROPERTY_SPACE_DIRECTION_INTERPOLATOR)) .with(PROPERTY_SPACE_STEPS_BUNCHING, desiredValue.getConstraint(PROPERTY_SPACE_STEPS_BUNCHING)) .with(PROPERTY_THETA, desiredValue.getConstraint(PROPERTY_THETA)) .with(PROPERTY_TIME_STEP_BUNCHING, desiredValue.getConstraint(PROPERTY_TIME_STEP_BUNCHING)); } public static Set<ValueRequirement> ensureBackwardPDEFunctionProperties(final ValueProperties constraints) { final Set<ValueRequirement> blackSurfaceRequirements = BlackVolatilitySurfacePropertyUtils.ensureAllBlackSurfaceProperties(constraints); if (blackSurfaceRequirements == null) { return null; } final Set<ValueRequirement> localSurfaceRequirements = LocalVolatilitySurfaceUtils.ensureDupireLocalVolatilitySurfaceProperties(constraints); if (localSurfaceRequirements == null) { return null; } final Set<String> thetas = constraints.getValues(PROPERTY_THETA); if (thetas == null || thetas.size() != 1) { return null; } final Set<String> nTimeSteps = constraints.getValues(PROPERTY_NUMBER_TIME_STEPS); if (nTimeSteps == null || nTimeSteps.size() != 1) { return null; } final Set<String> nSpaceSteps = constraints.getValues(PROPERTY_NUMBER_SPACE_STEPS); if (nSpaceSteps == null || nSpaceSteps.size() != 1) { return null; } final Set<String> timeStepBunchings = constraints.getValues(PROPERTY_TIME_STEP_BUNCHING); if (timeStepBunchings == null || timeStepBunchings.size() != 1) { return null; } final Set<String> spaceStepBunchings = constraints.getValues(PROPERTY_SPACE_STEPS_BUNCHING); if (spaceStepBunchings == null || spaceStepBunchings.size() != 1) { return null; } final Set<String> maxMoneynesses = constraints.getValues(PROPERTY_MAX_MONEYNESS); if (maxMoneynesses == null || maxMoneynesses.size() != 1) { return null; } final Set<String> directions = constraints.getValues(PROPERTY_PDE_DIRECTION); if (directions == null || directions.size() != 1) { return null; } final Set<String> interpolatorNames = constraints.getValues(PROPERTY_SPACE_DIRECTION_INTERPOLATOR); if (interpolatorNames == null || interpolatorNames.size() != 1) { return null; } final Set<String> discountingCurveNames = constraints.getValues(PROPERTY_DISCOUNTING_CURVE_NAME); if (discountingCurveNames == null || discountingCurveNames.size() != 1) { return null; } final Set<String> discountingCurveCalculationConfigs = constraints.getValues(ValuePropertyNames.CURVE_CALCULATION_CONFIG); if (discountingCurveCalculationConfigs == null || discountingCurveCalculationConfigs.size() != 1) { return null; } return Collections.emptySet(); } public static ValueProperties.Builder addBackwardPDEProperties(final ValueProperties properties) { return properties.copy() .withAny(PROPERTY_DISCOUNTING_CURVE_NAME) .withAny(ValuePropertyNames.CURVE_CALCULATION_CONFIG) .withAny(PROPERTY_MAX_MONEYNESS) .withAny(PROPERTY_NUMBER_SPACE_STEPS) .withAny(PROPERTY_NUMBER_TIME_STEPS) .with(PROPERTY_PDE_DIRECTION, PDEPropertyNamesAndValues.BACKWARDS) .withAny(PROPERTY_SPACE_DIRECTION_INTERPOLATOR) .withAny(PROPERTY_SPACE_STEPS_BUNCHING) .withAny(PROPERTY_THETA) .withAny(PROPERTY_TIME_STEP_BUNCHING); } public static ValueProperties.Builder addBackwardPDEProperties(final ValueProperties properties, final ValueRequirement desiredValue) { return properties.copy() .with(PROPERTY_DISCOUNTING_CURVE_NAME, desiredValue.getConstraint(PROPERTY_DISCOUNTING_CURVE_NAME)) .with(ValuePropertyNames.CURVE_CALCULATION_CONFIG, desiredValue.getConstraint(ValuePropertyNames.CURVE_CALCULATION_CONFIG)) .with(PROPERTY_MAX_MONEYNESS, desiredValue.getConstraint(PROPERTY_MAX_MONEYNESS)) .with(PROPERTY_NUMBER_SPACE_STEPS, desiredValue.getConstraint(PROPERTY_NUMBER_SPACE_STEPS)) .with(PROPERTY_NUMBER_TIME_STEPS, desiredValue.getConstraint(PROPERTY_NUMBER_TIME_STEPS)) .with(PROPERTY_PDE_DIRECTION, desiredValue.getConstraint(PROPERTY_PDE_DIRECTION)) .with(PROPERTY_SPACE_DIRECTION_INTERPOLATOR, desiredValue.getConstraint(PROPERTY_SPACE_DIRECTION_INTERPOLATOR)) .with(PROPERTY_SPACE_STEPS_BUNCHING, desiredValue.getConstraint(PROPERTY_SPACE_STEPS_BUNCHING)) .with(PROPERTY_THETA, desiredValue.getConstraint(PROPERTY_THETA)) .with(PROPERTY_TIME_STEP_BUNCHING, desiredValue.getConstraint(PROPERTY_TIME_STEP_BUNCHING)); } }