@@ -59,38 +59,39 @@ SensitivityRecord DecomposedSensitivityStream::next() {
5959std::vector<SensitivityRecord> DecomposedSensitivityStream::decompose (const SensitivityRecord& record) const {
6060 std::vector<SensitivityRecord> results;
6161
62- bool tradeIdValidSurvival =
62+ bool tradeMarkedForDecompositionDefaultRisk =
6363 defaultRiskDecompositionWeights_.find (record.tradeId ) != defaultRiskDecompositionWeights_.end ();
64- bool tradeIdValid = eqComDecompositionTradeIds_.find (record.tradeId ) != eqComDecompositionTradeIds_.end ();
64+ bool tradeMarkedForDecomposition =
65+ eqComDecompositionTradeIds_.find (record.tradeId ) != eqComDecompositionTradeIds_.end ();
6566 bool isNotCrossGamma = record.isCrossGamma () == false ;
6667 bool isSurvivalProbSensi = record.key_1 .keytype == RiskFactorKey::KeyType::SurvivalProbability;
6768 bool isEquitySpotSensi = record.key_1 .keytype == RiskFactorKey::KeyType::EquitySpot;
6869 bool isCommoditySpotSensi = record.key_1 .keytype == RiskFactorKey::KeyType::CommodityCurve;
6970
70- bool hasEquityIndexRefData =
71- refDataManager_ != nullptr && refDataManager_->hasData (" EquityIndex" , record.key_1 .name );
72- bool hasCurrencyHedgedIndexRefData =
73- refDataManager_ != nullptr && refDataManager_->hasData (" CurrencyHedgedEquityIndex" , record.key_1 .name );
74- bool hasCommodityRefData =
75- refDataManager_ != nullptr && refDataManager_->hasData (" CommodityIndex" , record.key_1 .name );
71+ bool decomposeEquitySpot = tradeMarkedForDecomposition && isEquitySpotSensi && refDataManager_ != nullptr &&
72+ refDataManager_->hasData (" EquityIndex" , record.key_1 .name );
73+ bool decomposeCurrencyHedgedSpot = tradeMarkedForDecomposition && isEquitySpotSensi && refDataManager_ != nullptr &&
74+ refDataManager_->hasData (" CurrencyHedgedEquityIndex" , record.key_1 .name );
75+ bool decomposeCommoditySpot = tradeMarkedForDecomposition && (isCommoditySpotSensi || isEquitySpotSensi) &&
76+ refDataManager_ != nullptr &&
77+ refDataManager_->hasData (" CommodityIndex" , record.key_1 .name );
7678
7779 try {
78- if (isSurvivalProbSensi && tradeIdValidSurvival && isNotCrossGamma) {
80+ if (tradeMarkedForDecompositionDefaultRisk && isSurvivalProbSensi && isNotCrossGamma) {
7981 return decomposeSurvivalProbability (record);
80- } else if (isEquitySpotSensi && tradeIdValid && hasEquityIndexRefData && isNotCrossGamma) {
82+ } else if (decomposeEquitySpot && isNotCrossGamma) {
8183 auto decompResults =
8284 indexDecomposition (record.delta , record.key_1 .name , ore::data::CurveSpec::CurveType::Equity);
8385 return sensitivityRecords (decompResults.spotRisk , decompResults.fxRisk , decompResults.indexCurrency ,
8486 record);
85- } else if (isEquitySpotSensi && tradeIdValid && hasCurrencyHedgedIndexRefData && isNotCrossGamma) {
87+ } else if (decomposeCurrencyHedgedSpot && isNotCrossGamma) {
8688 return decomposeCurrencyHedgedIndexRisk (record);
87- } else if ((isEquitySpotSensi || isCommoditySpotSensi) && tradeIdValid && hasCommodityRefData &&
88- isNotCrossGamma) {
89+ } else if (decomposeCommoditySpot && isNotCrossGamma) {
8990 auto decompResults =
9091 indexDecomposition (record.delta , record.key_1 .name , ore::data::CurveSpec::CurveType::Commodity);
9192 return sensitivityRecords (decompResults.spotRisk , decompResults.fxRisk , decompResults.indexCurrency ,
9293 record);
93- } else if ((isEquitySpotSensi || isCommoditySpotSensi) && tradeIdValid && isNotCrossGamma) {
94+ } else if (tradeMarkedForDecomposition && (isCommoditySpotSensi || isEquitySpotSensi) && isNotCrossGamma) {
9495 auto subFields = std::map<std::string, std::string>({{" tradeId" , record.tradeId }});
9596 StructuredAnalyticsErrorMessage (
9697 " Sensitivity Decomposition" , " Index decomposition failed" ,
0 commit comments