Skip to content

Commit c0f81c8

Browse files
damienbarkerjenkins
authored andcommitted
Merge branch 'QPR-13360' into 'master'
QPR-13360 overhaul market dependency graph building Closes QPR-13360 See merge request qs/oreplus!2749
1 parent a49fd19 commit c0f81c8

42 files changed

Lines changed: 312 additions & 240 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

ORE-SWIG/OREData-SWIG/SWIG/ored_utilities.i

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ using ore::data::CurveConfigurations;
3636
using ore::data::MarketObject;
3737

3838
%}
39-
void addMarketObjectDependencies(
40-
std::map<std::string, std::map<MarketObject, std::set<std::string>>>* objects,
41-
const ext::shared_ptr<CurveConfigurations>& curveConfigs, const std::string& baseCcy,
42-
const std::string& baseCcyDiscountCurve);
39+
void addMarketObjectDependencies(std::map<std::string, std::map<MarketObject, std::set<std::string>>>* objects,
40+
const ext::shared_ptr<CurveConfigurations>& curveConfigs, const std::string& baseCcy,
41+
const std::string& baseCcyDiscountCurve,
42+
const IborFallbackConfig& iborFallbackConfig = IborFallbackConfig::defaultConfig());
4343

4444
std::string marketObjectToCurveSpec(const MarketObject& mo, const std::string& name, const std::string& baseCcy,
4545
const ext::shared_ptr<CurveConfigurations>& curveConfigs);
@@ -60,4 +60,4 @@ std::set<std::string> getCollateralisedDiscountCcy(const std::string& ccy,
6060

6161
const bool isCollateralCurve(const std::string& id, std::vector<std::string>& tokens);
6262

63-
#endif
63+
#endif

OREAnalytics/orea/app/portfolioanalyser.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,14 @@ using std::vector;
2828
namespace ore {
2929
namespace analytics {
3030

31-
PortfolioAnalyser::PortfolioAnalyser(const QuantLib::ext::shared_ptr<Portfolio>& p, const QuantLib::ext::shared_ptr<EngineData>& ed,
32-
const string& baseCcy,
31+
PortfolioAnalyser::PortfolioAnalyser(const QuantLib::ext::shared_ptr<Portfolio>& p,
32+
const QuantLib::ext::shared_ptr<EngineData>& ed, const string& baseCcy,
3333
const QuantLib::ext::shared_ptr<CurveConfigurations>& curveConfigs,
3434
const QuantLib::ext::shared_ptr<ReferenceDataManager>& referenceData,
3535
const IborFallbackConfig& iborFallbackConfig,
3636
bool recordSecuritySpecificCreditCurves, const std::string& baseCcyDiscountCurve)
37-
: portfolio_(p), baseCcy_(baseCcy), curveConfigs_(curveConfigs), baseCcyDiscountCurve_(baseCcyDiscountCurve) {
37+
: portfolio_(p), baseCcy_(baseCcy), curveConfigs_(curveConfigs), iborFallbackConfig_(iborFallbackConfig),
38+
baseCcyDiscountCurve_(baseCcyDiscountCurve) {
3839

3940
QL_REQUIRE(portfolio_ != nullptr, "PortfolioAnalyser: portfolio is null");
4041

@@ -109,7 +110,7 @@ PortfolioAnalyser::PortfolioAnalyser(const QuantLib::ext::shared_ptr<Portfolio>&
109110

110111
void PortfolioAnalyser::addDependencies() {
111112
DLOG("Start adding dependent curves");
112-
ore::data::addMarketObjectDependencies(&marketObjects_, curveConfigs_, baseCcy_, baseCcyDiscountCurve_);
113+
ore::data::addMarketObjectDependencies(&marketObjects_, curveConfigs_, baseCcy_, baseCcyDiscountCurve_, iborFallbackConfig_);
113114
DLOG("Finished adding dependent curves");
114115
}
115116

OREAnalytics/orea/app/portfolioanalyser.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ class PortfolioAnalyser {
106106
std::map<ore::data::AssetClass, std::set<std::string>> underlyingIndices_;
107107
std::string baseCcy_;
108108
QuantLib::ext::shared_ptr<ore::data::CurveConfigurations> curveConfigs_;
109+
ore::data::IborFallbackConfig iborFallbackConfig_;
109110
std::string baseCcyDiscountCurve_;
110111
};
111112

OREData/ored/configuration/basecorrelationcurveconfig.cpp

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ BaseCorrelationCurveConfig::BaseCorrelationCurveConfig(
3434
const QuantLib::ext::shared_ptr<ReferenceDataManager>& refDataManager)
3535
: settlementDays_(0), businessDayConvention_(Following), extrapolate_(true), adjustForLosses_(true),
3636
quoteTypes_({MarketDatum::QuoteType::BASE_CORRELATION}), indexSpread_(Null<Real>()),
37-
calibrateConstituentsToIndexSpread_(false), useAssumedRecovery_(false), refDataManager_(refDataManager) {}
37+
calibrateConstituentsToIndexSpread_(false), useAssumedRecovery_(false), refDataManager_(refDataManager) {
38+
populateRequiredIds();
39+
}
3840

3941
BaseCorrelationCurveConfig::BaseCorrelationCurveConfig(
4042
const string& curveID, const string& curveDescription, const vector<string>& detachmentPoints,
@@ -58,6 +60,7 @@ BaseCorrelationCurveConfig::BaseCorrelationCurveConfig(
5860
QL_REQUIRE(quoteType == MarketDatum::QuoteType::BASE_CORRELATION || quoteType == MarketDatum::QuoteType::PRICE,
5961
"Invalid quote type" << quoteType << " in BaseCorrelationCurveConfig");
6062
}
63+
populateRequiredIds();
6164
}
6265

6366
void addPriceQuotes(vector<string>& quotes, const std::string& quoteName, const std::string& term,
@@ -93,18 +96,7 @@ void addBaseCorrelationQuotes(vector<string>& quotes, const std::string& quoteNa
9396
}
9497
}
9598

96-
set<string> BaseCorrelationCurveConfig::requiredCurveIds(const CurveSpec::CurveType& curveType) const {
97-
auto rci = requiredCurveIds();
98-
static const set<string> empty;
99-
auto r = rci.find(curveType);
100-
if (r == rci.end())
101-
return empty;
102-
else
103-
return r->second;
104-
}
105-
106-
map<CurveSpec::CurveType, set<string>> BaseCorrelationCurveConfig::requiredCurveIds() const {
107-
auto rci = CurveConfig::requiredCurveIds();
99+
void BaseCorrelationCurveConfig::populateRequiredIds() const {
108100
if (hasQuoteTypePrice() && refDataManager_) {
109101
if (refDataManager_->hasData(CreditIndexReferenceDatum::TYPE, curveID_)) {
110102
auto crd = QuantLib::ext::dynamic_pointer_cast<CreditIndexReferenceDatum>(
@@ -135,10 +127,9 @@ map<CurveSpec::CurveType, set<string>> BaseCorrelationCurveConfig::requiredCurve
135127
}
136128
}
137129
for (const auto& c : constituentCurves)
138-
rci[CurveSpec::CurveType::Default].insert(c);
130+
requiredCurveIds_[CurveSpec::CurveType::Default].insert(c);
139131
}
140132
}
141-
return rci;
142133
}
143134

144135
const vector<string>& BaseCorrelationCurveConfig::quotes() {

OREData/ored/configuration/basecorrelationcurveconfig.hpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,8 @@ class BaseCorrelationCurveConfig : public CurveConfig {
120120
bool& extrapolate() { return extrapolate_; }
121121
QuantLib::Period& indexTerm() { return indexTerm_; }
122122
//@}
123-
124-
set<string> requiredCurveIds(const CurveSpec::CurveType& curveType) const override;
125-
map<CurveSpec::CurveType, set<string>> requiredCurveIds() const override;
123+
124+
void populateRequiredIds() const override;
126125

127126
private:
128127
vector<string> detachmentPoints_;

OREData/ored/configuration/capfloorvolcurveconfig.cpp

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,6 @@ CapFloorVolatilityCurveConfig::CapFloorVolatilityCurveConfig(
8080
// Check that we have a valid configuration
8181
validate();
8282

83-
// Populate required curve ids
84-
populateRequiredCurveIds();
85-
8683
// Populate quotes
8784
populateQuotes();
8885
}
@@ -94,9 +91,7 @@ CapFloorVolatilityCurveConfig::CapFloorVolatilityCurveConfig(
9491
: CurveConfig(curveID, curveDescription), proxySourceCurveId_(proxySourceCurveId),
9592
proxySourceIndex_(proxySourceIndex), proxyTargetIndex_(proxyTargetIndex),
9693
proxySourceRateComputationPeriod_(proxySourceRateComputationPeriod),
97-
proxyTargetRateComputationPeriod_(proxyTargetRateComputationPeriod) {
98-
populateRequiredCurveIds();
99-
}
94+
proxyTargetRateComputationPeriod_(proxyTargetRateComputationPeriod) {}
10095

10196
void CapFloorVolatilityCurveConfig::fromXML(XMLNode* node) {
10297

@@ -123,8 +118,6 @@ void CapFloorVolatilityCurveConfig::fromXML(XMLNode* node) {
123118
parsePeriod(XMLUtils::getChildValue(target, "RateComputationPeriod", false, "0D"));
124119
onCapSettlementDays_ = parseInteger(XMLUtils::getChildValue(target, "ONCapSettlementDays", false, "0"));
125120

126-
populateRequiredCurveIds();
127-
128121
} else {
129122
// read in quote-based config
130123

@@ -239,9 +232,6 @@ void CapFloorVolatilityCurveConfig::fromXML(XMLNode* node) {
239232
// Populate quotes
240233
populateQuotes();
241234

242-
// Populate required curve ids
243-
populateRequiredCurveIds();
244-
245235
// Output vol type
246236
string outVolType = XMLUtils::getChildValue(node, "OutputVolatilityType", false);
247237
if (outVolType.empty())
@@ -340,18 +330,18 @@ string CapFloorVolatilityCurveConfig::toString(VolatilityType type) const {
340330
return volatilityTypeMap.right.at(type);
341331
}
342332

343-
void CapFloorVolatilityCurveConfig::populateRequiredCurveIds() {
333+
void CapFloorVolatilityCurveConfig::populateRequiredIds() const {
344334
if (!discountCurve().empty())
345335
requiredCurveIds_[CurveSpec::CurveType::Yield].insert(parseCurveSpec(discountCurve())->curveConfigID());
346336
if (!index_.empty())
347-
requiredCurveIds_[CurveSpec::CurveType::Yield].insert(index_);
337+
requiredNames_[std::make_pair(MarketObject::IndexCurve, std::string())].insert(index_);
348338
if (!proxySourceCurveId_.empty())
349339
requiredCurveIds_[CurveSpec::CurveType::CapFloorVolatility].insert(
350340
parseCurveSpec(proxySourceCurveId_)->curveConfigID());
351341
if (!proxySourceIndex_.empty())
352-
requiredCurveIds_[CurveSpec::CurveType::Yield].insert(proxySourceIndex_);
342+
requiredNames_[std::make_pair(MarketObject::IndexCurve, std::string())].insert(proxySourceIndex_);
353343
if (!proxyTargetIndex_.empty())
354-
requiredCurveIds_[CurveSpec::CurveType::Yield].insert(proxyTargetIndex_);
344+
requiredNames_[std::make_pair(MarketObject::IndexCurve, std::string())].insert(proxyTargetIndex_);
355345
}
356346

357347
string CapFloorVolatilityCurveConfig::indexTenor() const {

OREData/ored/configuration/capfloorvolcurveconfig.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ class CapFloorVolatilityCurveConfig : public CurveConfig {
168168
ReportConfig reportConfig_;
169169

170170
//! Populate required curve ids
171-
void populateRequiredCurveIds();
171+
void populateRequiredIds() const override;
172172

173173
//! Populate the quotes vector
174174
void populateQuotes();

OREData/ored/configuration/cdsvolcurveconfig.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ CDSVolatilityCurveConfig::CDSVolatilityCurveConfig(const string& curveId, const
4444
"CDSVolatilityCurveConfig: " << curveId
4545
<< " specifies different number of terms / curves (built via constructor)");
4646
populateQuotes();
47-
populateRequiredCurveIds();
4847
}
4948

5049
const QuantLib::ext::shared_ptr<VolatilityConfig>& CDSVolatilityCurveConfig::volatilityConfig() const {
@@ -156,7 +155,6 @@ void CDSVolatilityCurveConfig::fromXML(XMLNode* node) {
156155
strikeFactor_ = parseReal(XMLUtils::getNodeValue(n));
157156

158157
populateQuotes();
159-
populateRequiredCurveIds();
160158
}
161159

162160
XMLNode* CDSVolatilityCurveConfig::toXML(XMLDocument& doc) const {
@@ -223,7 +221,7 @@ void CDSVolatilityCurveConfig::populateQuotes() {
223221
}
224222
}
225223

226-
void CDSVolatilityCurveConfig::populateRequiredCurveIds() {
224+
void CDSVolatilityCurveConfig::populateRequiredIds() const {
227225
if (auto vc = QuantLib::ext::dynamic_pointer_cast<CDSProxyVolatilityConfig>(volatilityConfig_)) {
228226
requiredCurveIds_[CurveSpec::CurveType::CDSVolatility].insert(vc->cdsVolatilityCurve());
229227
}

OREData/ored/configuration/cdsvolcurveconfig.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class CDSVolatilityCurveConfig : public CurveConfig {
7979
void populateQuotes();
8080

8181
//! Populate required curve ids
82-
void populateRequiredCurveIds();
82+
void populateRequiredIds() const override;
8383

8484
//! Give back the quote stem used in construction of the quote strings
8585
std::string quoteStem() const;

OREData/ored/configuration/commoditycurveconfig.cpp

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -174,9 +174,7 @@ CommodityCurveConfig::CommodityCurveConfig(const string& curveId, const string&
174174
bool extrapolation)
175175
: CurveConfig(curveId, curveDescription), type_(Type::CrossCurrency), currency_(currency),
176176
basePriceCurveId_(basePriceCurveId), baseYieldCurveId_(baseYieldCurveId), yieldCurveId_(yieldCurveId),
177-
extrapolation_(extrapolation), addBasis_(true), monthOffset_(0), averageBase_(true), priceAsHistFixing_(true) {
178-
populateRequiredCurveIds();
179-
}
177+
extrapolation_(extrapolation), addBasis_(true), monthOffset_(0), averageBase_(true), priceAsHistFixing_(true) {}
180178

181179
CommodityCurveConfig::CommodityCurveConfig(const string& curveId, const string& curveDescription,
182180
const string& currency, const string& basePriceCurveId,
@@ -187,9 +185,7 @@ CommodityCurveConfig::CommodityCurveConfig(const string& curveId, const string&
187185
: CurveConfig(curveId, curveDescription), type_(Type::Basis), fwdQuotes_(basisQuotes), currency_(currency),
188186
dayCountId_(dayCountId), interpolationMethod_(interpolationMethod), basePriceCurveId_(basePriceCurveId),
189187
extrapolation_(extrapolation), conventionsId_(basisConventionsId), baseConventionsId_(baseConventionsId),
190-
addBasis_(addBasis), monthOffset_(monthOffset), averageBase_(averageBase), priceAsHistFixing_(true) {
191-
populateRequiredCurveIds();
192-
}
188+
addBasis_(addBasis), monthOffset_(monthOffset), averageBase_(averageBase), priceAsHistFixing_(true) {}
193189

194190
CommodityCurveConfig::CommodityCurveConfig(const string& curveId, const string& curveDescription,
195191
const string& currency, const vector<PriceSegment>& priceSegments,
@@ -263,8 +259,6 @@ void CommodityCurveConfig::fromXML(XMLNode* node) {
263259
}
264260

265261
extrapolation_ = XMLUtils::getChildValueAsBool(node, "Extrapolation");
266-
267-
populateRequiredCurveIds();
268262
}
269263

270264
XMLNode* CommodityCurveConfig::toXML(XMLDocument& doc) const {
@@ -325,7 +319,7 @@ XMLNode* CommodityCurveConfig::toXML(XMLDocument& doc) const {
325319
return node;
326320
}
327321

328-
void CommodityCurveConfig::populateRequiredCurveIds() {
322+
void CommodityCurveConfig::populateRequiredIds() const {
329323
if (!baseYieldCurveId().empty())
330324
requiredCurveIds_[CurveSpec::CurveType::Yield].insert(baseYieldCurveId());
331325
if (!yieldCurveId().empty())

0 commit comments

Comments
 (0)