/**
* Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.examples.finance.credit.harness;
import java.time.LocalDate;
import java.util.List;
import java.util.stream.Collectors;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.util.concurrent.MoreExecutors;
import com.opengamma.strata.basics.ReferenceData;
import com.opengamma.strata.basics.currency.Currency;
import com.opengamma.strata.basics.currency.CurrencyAmount;
import com.opengamma.strata.calc.CalculationRules;
import com.opengamma.strata.calc.CalculationRunner;
import com.opengamma.strata.calc.Column;
import com.opengamma.strata.calc.Measure;
import com.opengamma.strata.calc.Results;
import com.opengamma.strata.collect.array.DoubleArray;
import com.opengamma.strata.collect.result.Result;
import com.opengamma.strata.data.MarketData;
import com.opengamma.strata.examples.marketdata.ExampleMarketData;
import com.opengamma.strata.examples.marketdata.ExampleMarketDataBuilder;
import com.opengamma.strata.market.param.CurrencyParameterSensitivities;
import com.opengamma.strata.measure.StandardComponents;
import com.opengamma.strata.product.Trade;
public class TestCalculator implements Calculator {
private static final ReferenceData REF_DATA = ReferenceData.standard();
private TestCalculator() {
}
@Override
public double calculateScalarValue(LocalDate valuationDate, TradeSource tradeSource, Measure measure) {
Result<?> result = calculateResults(valuationDate, tradeSource, ImmutableList.of(measure)).getCells().get(0);
if (result.getValue() instanceof CurrencyAmount) {
CurrencyAmount value = (CurrencyAmount) result.getValue();
return value.getAmount();
} else if (result.getValue() instanceof Double) {
Double value = (Double) result.getValue();
return value;
} else {
throw new IllegalStateException("Expecting a CurrencyAmount, found " + result.getValue());
}
}
@Override
public DoubleArray calculateVectorValue(
LocalDate valuationDate, TradeSource tradeSource, Measure measure) {
Result<?> result = calculateResults(valuationDate, tradeSource, ImmutableList.of(measure)).getCells().get(0);
Preconditions.checkArgument(
result.getValue() instanceof CurrencyParameterSensitivities,
"Expecting a vector CurrencyParameterSensitivities, found " + result.getValue());
CurrencyParameterSensitivities value = (CurrencyParameterSensitivities) result.getValue();
Preconditions.checkArgument(value.getSensitivities().size() == 1);
return value.getSensitivities().get(0).getSensitivity();
}
@Override
public Results calculateResults(LocalDate valuationDate, TradeSource tradeSource, List<Measure> measures) {
// use the built-in example market data
ExampleMarketDataBuilder marketDataBuilder = ExampleMarketData.builder();
// the complete set of rules for calculating measures
CalculationRules rules = CalculationRules.of(StandardComponents.calculationFunctions(), Currency.USD);
MarketData marketData = marketDataBuilder.buildSnapshot(valuationDate);
List<Column> columns = measures.stream().map(Column::of).collect(Collectors.toList());
// create the engine and calculate the results
ImmutableList<Trade> trades = ImmutableList.of(tradeSource.apply());
// using the direct executor means there is no need to close/shutdown the runner
CalculationRunner runner = CalculationRunner.of(MoreExecutors.newDirectExecutorService());
return runner.calculate(rules, trades, columns, marketData, REF_DATA);
}
public static Calculator of() {
return new TestCalculator();
}
}