/** * Gets the metadata of the parameter at the specified index. * <p> * If there is no specific parameter metadata, an empty instance will be returned. * * @param parameterIndex the zero-based index of the parameter to get * @return the metadata of the parameter * @throws IndexOutOfBoundsException if the index is invalid */ public default ParameterMetadata getParameterMetadata(int parameterIndex) { return getParameterMetadata().map(pm -> pm.get(parameterIndex)).orElse(ParameterMetadata.empty()); }
@Override public default ParameterMetadata getParameterMetadata(int parameterIndex) { return getMetadata().getParameterMetadata(parameterIndex); }
@Override public UnitParameterSensitivity zValueParameterSensitivity(double x, double y) { return getMetadata().getParameterMetadata().isPresent() ? UnitParameterSensitivity.of( getMetadata().getSurfaceName(), getMetadata().getParameterMetadata().get(), deformationFunction.apply(DoublesPair.of(x, y)).getDerivatives()) : UnitParameterSensitivity.of( getMetadata().getSurfaceName(), deformationFunction.apply(DoublesPair.of(x, y)).getDerivatives()); }
private void validateInputs( SurfaceMetadata metadata, DoubleArray xValues, DoubleArray yValues, DoubleArray zValues, SurfaceInterpolator interpolator) { ArgChecker.notNull(metadata, "metadata"); ArgChecker.notNull(xValues, "times"); ArgChecker.notNull(yValues, "values"); ArgChecker.notNull(interpolator, "interpolator"); if (xValues.size() < 2) { throw new IllegalArgumentException("Length of x-values must be at least 2"); } if (xValues.size() != yValues.size()) { throw new IllegalArgumentException("Length of x-values and y-values must match"); } if (xValues.size() != zValues.size()) { throw new IllegalArgumentException("Length of x-values and z-values must match"); } metadata.getParameterMetadata().ifPresent(params -> { if (xValues.size() != params.size()) { throw new IllegalArgumentException("Length of x-values and parameter metadata must match when metadata present"); } }); }
ParameterMetadata pm = metadata.getParameterMetadata(i); sorted.put(DoublesPair.of(xValues.get(i), yValues.get(i)), ObjDoublePair.of(pm, zValues.get(i))); this.boundInterpolator = interpolator.bind(this.xValues, this.yValues, this.zValues); this.parameterMetadata = IntStream.range(0, getParameterCount()) .mapToObj(i -> sortedMetadata.getParameterMetadata(i)) .collect(toImmutableList());
/** * Gets the metadata of the parameter at the specified index. * <p> * If there is no specific parameter metadata, {@link SimpleSurfaceParameterMetadata} will be created. * * @param parameterIndex the zero-based index of the parameter to get * @return the metadata of the parameter * @throws IndexOutOfBoundsException if the index is invalid */ @Override public default ParameterMetadata getParameterMetadata(int parameterIndex) { return getMetadata().getParameterMetadata().map(pm -> pm.get(parameterIndex)) .orElse(SimpleSurfaceParameterMetadata.of( getMetadata().getXValueType(), getXValues().get(parameterIndex), getMetadata().getYValueType(), getYValues().get(parameterIndex))); }
@ImmutableConstructor private InterpolatedNodalSurface( SurfaceMetadata metadata, DoubleArray xValues, DoubleArray yValues, DoubleArray zValues, SurfaceInterpolator interpolator) { validateInputs(metadata, xValues, yValues, zValues, interpolator); for (int i = 1; i < xValues.size(); i++) { if (xValues.get(i) < xValues.get(i - 1)) { throw new IllegalArgumentException("Array of x-values must be sorted"); } if (xValues.get(i) == xValues.get(i - 1) && yValues.get(i) <= yValues.get(i - 1)) { throw new IllegalArgumentException("Array of y-values must be sorted and unique within x-values"); } } this.metadata = metadata; this.xValues = xValues; this.yValues = yValues; this.zValues = zValues; this.interpolator = interpolator; this.boundInterpolator = interpolator.bind(xValues, yValues, zValues); this.parameterMetadata = IntStream.range(0, getParameterCount()) .mapToObj(i -> metadata.getParameterMetadata(i)) .collect(toImmutableList()); }
public void test_of_SurfaceMetadata() { InterpolatedNodalSurface test = InterpolatedNodalSurface.of(METADATA_ENTRIES, XVALUES, YVALUES, ZVALUES, INTERPOLATOR); assertThat(test.getName()).isEqualTo(SURFACE_NAME); assertThat(test.getParameterCount()).isEqualTo(SIZE); assertThat(test.getParameter(0)).isEqualTo(ZVALUES.get(0)); assertThat(test.getParameter(1)).isEqualTo(ZVALUES.get(1)); assertThat(test.getParameterMetadata(0)).isSameAs(METADATA_ENTRIES.getParameterMetadata().get().get(0)); assertThat(test.getParameterMetadata(1)).isSameAs(METADATA_ENTRIES.getParameterMetadata().get().get(1)); assertThat(test.withParameter(0, 2d)).isEqualTo( InterpolatedNodalSurface.of(METADATA_ENTRIES, XVALUES, YVALUES, ZVALUES.with(0, 2d), INTERPOLATOR)); assertThat(test.withPerturbation((i, v, m) -> v - 2d)).isEqualTo( InterpolatedNodalSurface.of(METADATA_ENTRIES, XVALUES, YVALUES, ZVALUES_BUMPED, INTERPOLATOR)); assertThat(test.getInterpolator()).isEqualTo(INTERPOLATOR); assertThat(test.getMetadata()).isEqualTo(METADATA_ENTRIES); assertThat(test.getXValues()).isEqualTo(XVALUES); assertThat(test.getYValues()).isEqualTo(YVALUES); assertThat(test.getZValues()).isEqualTo(ZVALUES); }
if (capFloorData.getDataType().equals(NORMAL_VOLATILITY)) { // correct initial surface metadata = Surfaces.blackVolatilityByExpiryStrike(bsDefinition.getName().getName(), bsDefinition.getDayCount()) .withParameterMetadata(metadata.getParameterMetadata().get()); initialVol = DoubleArray.of(nTotal, n -> volList.get(n) / (ratesProvider.iborIndexRates(index).rate(capList.get(n).getFinalPeriod().getIborRate().getObservation()) +
CurrencyParameterSensitivity.of( surfaceMetadata.getSurfaceName(), surfaceMetadata.getParameterMetadata().get(), EUR, DoubleArray.copyOf(sensi)));
CurrencyParameterSensitivity.of( surfaceMetadata.getSurfaceName(), surfaceMetadata.getParameterMetadata().get(), USD, DoubleArray.copyOf(sensi)));
Optional<List<ParameterMetadata>> alphaParameterMetadataOption = alphaMetadata.getParameterMetadata(); assertTrue(alphaParameterMetadataOption.isPresent()); List<ParameterMetadata> alphaParameterMetadata = alphaParameterMetadataOption.get(); List<DoubleArray> alphaJacobian = calibrated.getDataSensitivityAlpha().get(); SurfaceMetadata rhoMetadata = calibrated.getParameters().getRhoSurface().getMetadata(); Optional<List<ParameterMetadata>> rhoParameterMetadataOption = rhoMetadata.getParameterMetadata(); assertTrue(rhoParameterMetadataOption.isPresent()); List<ParameterMetadata> rhoParameterMetadata = rhoParameterMetadataOption.get(); List<DoubleArray> rhoJacobian = calibrated.getDataSensitivityRho().get(); SurfaceMetadata nuMetadata = calibrated.getParameters().getNuSurface().getMetadata(); Optional<List<ParameterMetadata>> nuParameterMetadataOption = nuMetadata.getParameterMetadata(); assertTrue(nuParameterMetadataOption.isPresent()); List<ParameterMetadata> nuParameterMetadata = nuParameterMetadataOption.get();
Optional<List<ParameterMetadata>> alphaParameterMetadataOption = alphaMetadata.getParameterMetadata(); assertTrue(alphaParameterMetadataOption.isPresent()); List<ParameterMetadata> alphaParameterMetadata = alphaParameterMetadataOption.get(); List<DoubleArray> alphaJacobian = calibrated.getDataSensitivityAlpha().get(); SurfaceMetadata rhoMetadata = calibrated.getParameters().getRhoSurface().getMetadata(); Optional<List<ParameterMetadata>> rhoParameterMetadataOption = rhoMetadata.getParameterMetadata(); assertTrue(rhoParameterMetadataOption.isPresent()); List<ParameterMetadata> rhoParameterMetadata = rhoParameterMetadataOption.get(); List<DoubleArray> rhoJacobian = calibrated.getDataSensitivityRho().get(); SurfaceMetadata nuMetadata = calibrated.getParameters().getNuSurface().getMetadata(); Optional<List<ParameterMetadata>> nuParameterMetadataOption = nuMetadata.getParameterMetadata(); assertTrue(nuParameterMetadataOption.isPresent()); List<ParameterMetadata> nuParameterMetadata = nuParameterMetadataOption.get();