/**
* Copyright (C) 2016 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.market.param;
import static com.opengamma.strata.basics.currency.Currency.USD;
import static com.opengamma.strata.collect.TestHelper.assertThrowsIllegalArg;
import static com.opengamma.strata.collect.TestHelper.coverBeanEquals;
import static com.opengamma.strata.collect.TestHelper.coverImmutableBean;
import static org.testng.Assert.assertEquals;
import java.util.List;
import java.util.Optional;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.opengamma.strata.collect.array.DoubleArray;
import com.opengamma.strata.data.MarketDataName;
import com.opengamma.strata.market.curve.CurveName;
/**
* Test {@link UnitParameterSensitivities}.
*/
@Test
public class UnitParameterSensitivitiesTest {
private static final double FACTOR1 = 3.14;
private static final DoubleArray VECTOR1 = DoubleArray.of(100, 200, 300, 123);
private static final DoubleArray VECTOR2 = DoubleArray.of(1000, 250, 321, 123);
private static final DoubleArray VECTOR_ZERO = DoubleArray.of(0, 0, 0, 0);
private static final DoubleArray TOTAL_USD = DoubleArray.of(1100, 450, 621, 246);
private static final DoubleArray VECTOR3 = DoubleArray.of(1000, 250, 321, 123, 321);
private static final MarketDataName<?> NAME0 = CurveName.of("NAME-0");
private static final MarketDataName<?> NAME1 = CurveName.of("NAME-1");
private static final MarketDataName<?> NAME2 = CurveName.of("NAME-2");
private static final MarketDataName<?> NAME3 = CurveName.of("NAME-3");
private static final List<ParameterMetadata> METADATA0 = ParameterMetadata.listOfEmpty(4);
private static final List<ParameterMetadata> METADATA1 = ParameterMetadata.listOfEmpty(4);
private static final List<ParameterMetadata> METADATA2 = ParameterMetadata.listOfEmpty(5);
private static final List<ParameterMetadata> METADATA3 = ParameterMetadata.listOfEmpty(4);
private static final UnitParameterSensitivity ENTRY1 =
UnitParameterSensitivity.of(NAME1, METADATA1, VECTOR1);
private static final UnitParameterSensitivity ENTRY2 =
UnitParameterSensitivity.of(NAME1, METADATA1, VECTOR2);
private static final UnitParameterSensitivity ENTRY_TOTAL_1_2 =
UnitParameterSensitivity.of(NAME1, METADATA1, TOTAL_USD);
private static final UnitParameterSensitivity ENTRY_SMALL =
UnitParameterSensitivity.of(NAME1, ParameterMetadata.listOfEmpty(1), DoubleArray.of(100d));
private static final UnitParameterSensitivity ENTRY3 =
UnitParameterSensitivity.of(NAME2, METADATA2, VECTOR3);
private static final UnitParameterSensitivity ENTRY_ZERO0 =
UnitParameterSensitivity.of(NAME0, METADATA0, VECTOR_ZERO);
private static final UnitParameterSensitivity ENTRY_ZERO3 =
UnitParameterSensitivity.of(NAME3, METADATA3, VECTOR_ZERO);
private static final UnitParameterSensitivity ENTRY_COMBINED =
UnitParameterSensitivity.combine(NAME3, ENTRY1, ENTRY3);
private static final UnitParameterSensitivities SENSI_1 = UnitParameterSensitivities.of(ENTRY1);
private static final UnitParameterSensitivities SENSI_2 =
UnitParameterSensitivities.of(ImmutableList.of(ENTRY2, ENTRY3));
private static final double TOLERENCE_CMP = 1.0E-8;
//-------------------------------------------------------------------------
public void test_empty() {
UnitParameterSensitivities test = UnitParameterSensitivities.empty();
assertEquals(test.size(), 0);
assertEquals(test.getSensitivities().size(), 0);
}
public void test_of_single() {
UnitParameterSensitivities test = UnitParameterSensitivities.of(ENTRY1);
assertEquals(test.size(), 1);
assertEquals(test.getSensitivities(), ImmutableList.of(ENTRY1));
}
public void test_of_array_none() {
UnitParameterSensitivities test = UnitParameterSensitivities.of();
assertEquals(test.size(), 0);
}
public void test_of_list_none() {
ImmutableList<UnitParameterSensitivity> list = ImmutableList.of();
UnitParameterSensitivities test = UnitParameterSensitivities.of(list);
assertEquals(test.size(), 0);
}
public void test_of_list_notNormalized() {
ImmutableList<UnitParameterSensitivity> list = ImmutableList.of(ENTRY1, ENTRY3);
UnitParameterSensitivities test = UnitParameterSensitivities.of(list);
assertEquals(test.size(), 2);
assertEquals(test.getSensitivities(), ImmutableList.of(ENTRY1, ENTRY3));
}
public void test_of_list_normalized() {
ImmutableList<UnitParameterSensitivity> list = ImmutableList.of(ENTRY1, ENTRY2);
UnitParameterSensitivities test = UnitParameterSensitivities.of(list);
assertEquals(test.size(), 1);
assertEquals(test.getSensitivities(), ImmutableList.of(ENTRY_TOTAL_1_2));
}
//-------------------------------------------------------------------------
public void test_getSensitivity() {
UnitParameterSensitivities test = UnitParameterSensitivities.of(ENTRY1);
assertEquals(test.getSensitivity(NAME1), ENTRY1);
assertThrowsIllegalArg(() -> test.getSensitivity(NAME0));
}
public void test_findSensitivity() {
UnitParameterSensitivities test = UnitParameterSensitivities.of(ENTRY1);
assertEquals(test.findSensitivity(NAME1), Optional.of(ENTRY1));
assertEquals(test.findSensitivity(NAME0), Optional.empty());
}
//-------------------------------------------------------------------------
public void test_combinedWith_one_notNormalized() {
UnitParameterSensitivities test = SENSI_1.combinedWith(ENTRY3);
assertEquals(test.getSensitivities(), ImmutableList.of(ENTRY1, ENTRY3));
}
public void test_combinedWith_one_normalized() {
UnitParameterSensitivities test = SENSI_1.combinedWith(ENTRY2);
assertEquals(test.getSensitivities(), ImmutableList.of(ENTRY_TOTAL_1_2));
}
public void test_combinedWith_one_sizeMismatch() {
assertThrowsIllegalArg(() -> SENSI_1.combinedWith(ENTRY_SMALL));
}
public void test_combinedWith_other() {
UnitParameterSensitivities test = SENSI_1.combinedWith(SENSI_2);
assertEquals(test.getSensitivities(), ImmutableList.of(ENTRY_TOTAL_1_2, ENTRY3));
}
public void test_combinedWith_otherEmpty() {
UnitParameterSensitivities test = SENSI_1.combinedWith(UnitParameterSensitivities.empty());
assertEquals(test, SENSI_1);
}
public void test_combinedWith_empty() {
UnitParameterSensitivities test = UnitParameterSensitivities.empty().combinedWith(SENSI_1);
assertEquals(test, SENSI_1);
}
//-------------------------------------------------------------------------
public void test_multipliedBy_currency() {
CurrencyParameterSensitivities multiplied = SENSI_2.multipliedBy(USD, FACTOR1);
assertEquals(multiplied.size(), 2);
DoubleArray test1 = multiplied.getSensitivity(NAME1, USD).getSensitivity();
for (int i = 0; i < VECTOR1.size(); i++) {
assertEquals(test1.get(i), VECTOR2.get(i) * FACTOR1);
}
DoubleArray test2 = multiplied.getSensitivity(NAME2, USD).getSensitivity();
for (int i = 0; i < VECTOR1.size(); i++) {
assertEquals(test2.get(i), VECTOR3.get(i) * FACTOR1);
}
}
public void test_multipliedBy() {
UnitParameterSensitivities multiplied = SENSI_1.multipliedBy(FACTOR1);
DoubleArray test = multiplied.getSensitivities().get(0).getSensitivity();
for (int i = 0; i < VECTOR1.size(); i++) {
assertEquals(test.get(i), VECTOR1.get(i) * FACTOR1);
}
}
public void test_mapSensitivities() {
UnitParameterSensitivities multiplied = SENSI_1.mapSensitivities(a -> 1 / a);
DoubleArray test = multiplied.getSensitivities().get(0).getSensitivity();
for (int i = 0; i < VECTOR1.size(); i++) {
assertEquals(test.get(i), 1 / VECTOR1.get(i));
}
}
public void test_multipliedBy_vs_combinedWith() {
UnitParameterSensitivities multiplied = SENSI_2.multipliedBy(2d);
UnitParameterSensitivities added = SENSI_2.combinedWith(SENSI_2);
assertEquals(multiplied, added);
}
//-------------------------------------------------------------------------
public void test_split() {
UnitParameterSensitivities test = UnitParameterSensitivities.of(ENTRY_COMBINED).split();
assertEquals(test, UnitParameterSensitivities.of(ENTRY1, ENTRY3));
}
public void test_split_noSplit() {
UnitParameterSensitivities test = SENSI_1.split();
assertEquals(test, SENSI_1);
}
//-------------------------------------------------------------------------
public void test_equalWithTolerance() {
UnitParameterSensitivities sensUsdTotal = UnitParameterSensitivities.of(ENTRY_TOTAL_1_2);
UnitParameterSensitivities sensEur = UnitParameterSensitivities.of(ENTRY3);
UnitParameterSensitivities sens1plus2 = SENSI_1.combinedWith(ENTRY2);
UnitParameterSensitivities sensZeroA = UnitParameterSensitivities.of(ENTRY_ZERO3);
UnitParameterSensitivities sensZeroB = UnitParameterSensitivities.of(ENTRY_ZERO0);
UnitParameterSensitivities sens1plus2plus0a = SENSI_1.combinedWith(ENTRY2).combinedWith(ENTRY_ZERO0);
UnitParameterSensitivities sens1plus2plus0b = SENSI_1.combinedWith(ENTRY2).combinedWith(ENTRY_ZERO3);
UnitParameterSensitivities sens1plus2plus0 = SENSI_1
.combinedWith(ENTRY2).combinedWith(ENTRY_ZERO0).combinedWith(ENTRY_ZERO3);
UnitParameterSensitivities sens2plus0 = SENSI_2.combinedWith(sensZeroA);
assertEquals(SENSI_1.equalWithTolerance(sensZeroA, TOLERENCE_CMP), false);
assertEquals(SENSI_1.equalWithTolerance(SENSI_1, TOLERENCE_CMP), true);
assertEquals(SENSI_1.equalWithTolerance(SENSI_2, TOLERENCE_CMP), false);
assertEquals(SENSI_1.equalWithTolerance(sensUsdTotal, TOLERENCE_CMP), false);
assertEquals(SENSI_1.equalWithTolerance(sensEur, TOLERENCE_CMP), false);
assertEquals(SENSI_1.equalWithTolerance(sens1plus2, TOLERENCE_CMP), false);
assertEquals(SENSI_1.equalWithTolerance(sens2plus0, TOLERENCE_CMP), false);
assertEquals(SENSI_2.equalWithTolerance(sensZeroA, TOLERENCE_CMP), false);
assertEquals(SENSI_2.equalWithTolerance(SENSI_1, TOLERENCE_CMP), false);
assertEquals(SENSI_2.equalWithTolerance(SENSI_2, TOLERENCE_CMP), true);
assertEquals(SENSI_2.equalWithTolerance(sensUsdTotal, TOLERENCE_CMP), false);
assertEquals(SENSI_2.equalWithTolerance(sensEur, TOLERENCE_CMP), false);
assertEquals(SENSI_2.equalWithTolerance(sens1plus2, TOLERENCE_CMP), false);
assertEquals(SENSI_2.equalWithTolerance(sens2plus0, TOLERENCE_CMP), true);
assertEquals(sensZeroA.equalWithTolerance(sensZeroA, TOLERENCE_CMP), true);
assertEquals(sensZeroA.equalWithTolerance(SENSI_1, TOLERENCE_CMP), false);
assertEquals(sensZeroA.equalWithTolerance(SENSI_2, TOLERENCE_CMP), false);
assertEquals(sensZeroA.equalWithTolerance(sensUsdTotal, TOLERENCE_CMP), false);
assertEquals(sensZeroA.equalWithTolerance(sensEur, TOLERENCE_CMP), false);
assertEquals(sensZeroA.equalWithTolerance(sens1plus2, TOLERENCE_CMP), false);
assertEquals(sensZeroA.equalWithTolerance(sens2plus0, TOLERENCE_CMP), false);
assertEquals(sensZeroA.equalWithTolerance(sensZeroB, TOLERENCE_CMP), true);
assertEquals(sensZeroB.equalWithTolerance(sensZeroB, TOLERENCE_CMP), true);
assertEquals(sensZeroB.equalWithTolerance(SENSI_1, TOLERENCE_CMP), false);
assertEquals(sensZeroB.equalWithTolerance(SENSI_2, TOLERENCE_CMP), false);
assertEquals(sensZeroB.equalWithTolerance(sensUsdTotal, TOLERENCE_CMP), false);
assertEquals(sensZeroB.equalWithTolerance(sensEur, TOLERENCE_CMP), false);
assertEquals(sensZeroB.equalWithTolerance(sens1plus2, TOLERENCE_CMP), false);
assertEquals(sensZeroB.equalWithTolerance(sens2plus0, TOLERENCE_CMP), false);
assertEquals(sensZeroB.equalWithTolerance(sensZeroA, TOLERENCE_CMP), true);
assertEquals(sens1plus2.equalWithTolerance(sens1plus2, TOLERENCE_CMP), true);
assertEquals(sens1plus2.equalWithTolerance(sens1plus2plus0a, TOLERENCE_CMP), true);
assertEquals(sens1plus2.equalWithTolerance(sens1plus2plus0b, TOLERENCE_CMP), true);
assertEquals(sens1plus2plus0a.equalWithTolerance(sens1plus2, TOLERENCE_CMP), true);
assertEquals(sens1plus2plus0a.equalWithTolerance(sens1plus2plus0, TOLERENCE_CMP), true);
assertEquals(sens1plus2plus0a.equalWithTolerance(sens1plus2plus0a, TOLERENCE_CMP), true);
assertEquals(sens1plus2plus0a.equalWithTolerance(sens1plus2plus0b, TOLERENCE_CMP), true);
assertEquals(sens1plus2plus0b.equalWithTolerance(sens1plus2, TOLERENCE_CMP), true);
assertEquals(sens1plus2plus0b.equalWithTolerance(sens1plus2plus0, TOLERENCE_CMP), true);
assertEquals(sens1plus2plus0b.equalWithTolerance(sens1plus2plus0a, TOLERENCE_CMP), true);
assertEquals(sens1plus2plus0b.equalWithTolerance(sens1plus2plus0b, TOLERENCE_CMP), true);
assertEquals(sens2plus0.equalWithTolerance(sens2plus0, TOLERENCE_CMP), true);
assertEquals(sensZeroA.equalWithTolerance(UnitParameterSensitivities.empty(), TOLERENCE_CMP), true);
assertEquals(UnitParameterSensitivities.empty().equalWithTolerance(sensZeroA, TOLERENCE_CMP), true);
}
//-------------------------------------------------------------------------
public void coverage() {
coverImmutableBean(UnitParameterSensitivities.empty());
coverImmutableBean(SENSI_1);
coverBeanEquals(SENSI_1, SENSI_2);
}
}