@Override public UnitParameterSensitivity yValueParameterSensitivity(double x) { return createParameterSensitivity(sensitivityFunction.apply(parameters, x)); }
/** * Restricted copy constructor. * @param beanToCopy the bean to copy from, not null */ private Builder(ParameterizedFunctionalCurve beanToCopy) { this.metadata = beanToCopy.getMetadata(); this.parameters = beanToCopy.getParameters(); this.valueFunction = beanToCopy.getValueFunction(); this.derivativeFunction = beanToCopy.getDerivativeFunction(); this.sensitivityFunction = beanToCopy.getSensitivityFunction(); }
@Override public CurrencyParameterSensitivity createParameterSensitivity(Currency currency, DoubleArray sensitivities) { return CurrencyParameterSensitivity.of(getName(), parameterMetadata, currency, sensitivities); }
public void test_of() { ParameterizedFunctionalCurve test = ParameterizedFunctionalCurve.of( METADATA, PARAMETERS, VALUE_FUNCTION, DERIVATIVE_FUNCTION, SENSITIVITY_FUNCTION); assertEquals(test.getValueFunction(), VALUE_FUNCTION); assertEquals(test.getDerivativeFunction(), DERIVATIVE_FUNCTION); assertEquals(test.getSensitivityFunction(), SENSITIVITY_FUNCTION); assertEquals(test.getMetadata(), METADATA); assertEquals(test.getName(), METADATA.getCurveName()); assertEquals(test.getParameter(2), PARAMETERS.get(2)); assertEquals(test.getParameterCount(), PARAMETERS.size()); assertEquals(test.getParameterMetadata(1), METADATA.getParameterMetadata(1)); assertEquals(test.getParameters(), PARAMETERS); }
@Override public ParameterizedFunctionalCurve withPerturbation(ParameterPerturbation perturbation) { int size = parameters.size(); DoubleArray perturbedValues = DoubleArray.of( size, i -> perturbation.perturbParameter(i, parameters.get(i), getParameterMetadata(i))); return withParameters(perturbedValues); }
@ImmutableConstructor private ParameterizedFunctionalCurve( CurveMetadata metadata, DoubleArray parameters, BiFunction<DoubleArray, Double, Double> valueFunction, BiFunction<DoubleArray, Double, Double> derivativeFunction, BiFunction<DoubleArray, Double, DoubleArray> sensitivityFunction) { JodaBeanUtils.notNull(metadata, "metadata"); JodaBeanUtils.notNull(parameters, "parameters"); JodaBeanUtils.notNull(valueFunction, "valueFunction"); JodaBeanUtils.notNull(derivativeFunction, "derivativeFunction"); JodaBeanUtils.notNull(sensitivityFunction, "sensitivityFunction"); this.metadata = metadata; this.parameters = parameters; this.valueFunction = valueFunction; this.derivativeFunction = derivativeFunction; this.sensitivityFunction = sensitivityFunction; this.parameterMetadata = IntStream.range(0, getParameterCount()) .mapToObj(i -> getParameterMetadata(i)) .collect(toImmutableList()); }
public void test_sensitivities() { ParameterizedFunctionalCurve test = ParameterizedFunctionalCurve.of( METADATA, PARAMETERS, VALUE_FUNCTION, DERIVATIVE_FUNCTION, SENSITIVITY_FUNCTION); DoubleArray sensiVal = DoubleArray.of(1d, 2d, 3d); assertEquals(test.createParameterSensitivity(sensiVal), UnitParameterSensitivity.of(METADATA.getCurveName(), METADATA.getParameterMetadata().get(), sensiVal)); assertEquals(test.createParameterSensitivity(USD, sensiVal), CurrencyParameterSensitivity.of(METADATA.getCurveName(), METADATA.getParameterMetadata().get(), USD, sensiVal)); }
/** * Obtains an instance. * * @param metadata the metadata * @param parameters the parameters * @param valueFunction the value function * @param derivativeFunction the derivative function * @param sensitivityFunction the parameter sensitivity function * @return the instance */ public static ParameterizedFunctionalCurve of( CurveMetadata metadata, DoubleArray parameters, BiFunction<DoubleArray, Double, Double> valueFunction, BiFunction<DoubleArray, Double, Double> derivativeFunction, BiFunction<DoubleArray, Double, DoubleArray> sensitivityFunction) { return ParameterizedFunctionalCurve.builder() .metadata(metadata) .parameters(parameters) .valueFunction(valueFunction) .derivativeFunction(derivativeFunction) .sensitivityFunction(sensitivityFunction) .build(); }
public void test_curve() { ParameterizedFunctionalCurveDefinition test = ParameterizedFunctionalCurveDefinition.builder() .dayCount(ACT_365F) .valueFunction(VALUE_FUNCTION) .derivativeFunction(DERIVATIVE_FUNCTION) .sensitivityFunction(SENSITIVITY_FUNCTION) .initialGuess(INITIAL_PARAMS) .name(CURVE_NAME) .nodes(NODES) .parameterMetadata(PARAM_METADATA) .xValueType(ValueType.YEAR_FRACTION) .yValueType(ValueType.ZERO_RATE) .build(); DefaultCurveMetadata metadata = DefaultCurveMetadata.builder() .curveName(CURVE_NAME) .xValueType(ValueType.YEAR_FRACTION) .yValueType(ValueType.ZERO_RATE) .dayCount(ACT_365F) .parameterMetadata(PARAM_METADATA) .build(); DoubleArray parameters = DoubleArray.of(1d, 1.5d, -0.5d); ParameterizedFunctionalCurve expected = ParameterizedFunctionalCurve.builder() .metadata(metadata) .valueFunction(VALUE_FUNCTION) .derivativeFunction(DERIVATIVE_FUNCTION) .sensitivityFunction(SENSITIVITY_FUNCTION) .parameters(parameters) .build(); assertEquals(test.curve(VAL_DATE, metadata, parameters), expected); }
@Override protected Object propertyGet(Bean bean, String propertyName, boolean quiet) { switch (propertyName.hashCode()) { case -450004177: // metadata return ((ParameterizedFunctionalCurve) bean).getMetadata(); case 458736106: // parameters return ((ParameterizedFunctionalCurve) bean).getParameters(); case 636119145: // valueFunction return ((ParameterizedFunctionalCurve) bean).getValueFunction(); case 1663351423: // derivativeFunction return ((ParameterizedFunctionalCurve) bean).getDerivativeFunction(); case -1353652329: // sensitivityFunction return ((ParameterizedFunctionalCurve) bean).getSensitivityFunction(); } return super.propertyGet(bean, propertyName, quiet); }
@Override public UnitParameterSensitivity createParameterSensitivity(DoubleArray sensitivities) { return UnitParameterSensitivity.of(getName(), parameterMetadata, sensitivities); }