theta, timeSteps, spaceSteps, timeGridBunching, spaceGridBunching, maxMoneyness, pdeDirection);
final Object pdeGridObject = inputs.getValue(gridRequirement);
if (pdeGridObject == null) {
throw new OpenGammaRuntimeException("PDE grid was null");
}
final PDEFullResults1D pdeGrid = (PDEFullResults1D) pdeGridObject;
final double[] gridTimes = pdeGrid.getGrid().getTimeNodes();
final double[] gridMoneyness = pdeGrid.getGrid().getSpaceNodes();
final CurrencyPairs currencyPairs = OpenGammaExecutionContext.getCurrencyPairsSource(executionContext).getCurrencyPairs(CurrencyPairs.DEFAULT_CURRENCY_PAIRS);
final CurrencyPair currencyPair = currencyPairs.getCurrencyPair(fxOption.getPutCurrency(), fxOption.getCallCurrency());
//TODO interpolate
///////////////////////////////
final double tau = getExpiry(fxOption, now);
final UnorderedCurrencyPair currencies = UnorderedCurrencyPair.of(fxOption.getCallCurrency(), fxOption.getPutCurrency());
final ValueRequirement forwardCurveRequirement = getForwardCurveRequirement(forwardCurveCalculationMethod, forwardCurveName, currencies);
final Object forwardCurveObject = inputs.getValue(forwardCurveRequirement);
if (forwardCurveObject == null) {
throw new OpenGammaRuntimeException("Forward curve was null");
}
final ForwardCurve forwardCurve = (ForwardCurve) forwardCurveObject;
final double forward = forwardCurve.getForward(tau);
final double moneyness = getStrike(fxOption, currencyPair) / forward;
final int timeIndex = SurfaceArrayUtils.getLowerBoundIndex(gridTimes, tau);
final int spaceIndex = SurfaceArrayUtils.getLowerBoundIndex(gridMoneyness, moneyness);
final double value1 = forward * pdeGrid.getFunctionValue(spaceIndex, timeIndex);
final double value2 = forward * pdeGrid.getFunctionValue(spaceIndex + 1, timeIndex);
final double m1 = pdeGrid.getSpaceValue(spaceIndex);
final double m2 = pdeGrid.getSpaceValue(spaceIndex + 1);
final double value = ((m2 - moneyness) * value1 + (moneyness - m1) * value2) / (m2 - m1);
///////////////////////////////
final ValueSpecification resultSpec = new ValueSpecification(desiredValue.getValueName(), target.toSpecification(), desiredValue.getConstraints());
return Collections.singleton(new ComputedValue(resultSpec, value));