Logo
Fully annotated reference manual - version 1.8.12
Loading...
Searching...
No Matches
Classes | Public Types | Public Member Functions | Private Attributes | Friends | List of all members
DependencyGraph Class Reference

#include <ored/marketdata/dependencygraph.hpp>

+ Collaboration diagram for DependencyGraph:

Classes

struct  Node
 

Public Types

using Graph = boost::directed_graph< Node >
 
using IndexMap = boost::property_map< Graph, boost::vertex_index_t >::type
 
using Vertex = boost::graph_traits< Graph >::vertex_descriptor
 
using VertexIterator = boost::graph_traits< Graph >::vertex_iterator
 

Public Member Functions

 DependencyGraph (const Date &asof, const QuantLib::ext::shared_ptr< TodaysMarketParameters > &params, const QuantLib::ext::shared_ptr< const CurveConfigurations > &curveConfigs, const IborFallbackConfig &iborFallbackConfig=IborFallbackConfig::defaultConfig())
 
void buildDependencyGraph (const std::string &configuration, std::map< std::string, std::string > &buildErrors)
 
std::map< std::string, Graphdependencies ()
 

Private Attributes

std::map< std::string, Graphdependencies_
 
const Date asof_
 
const QuantLib::ext::shared_ptr< TodaysMarketParametersparams_
 
const QuantLib::ext::shared_ptr< const CurveConfigurationscurveConfigs_
 
const IborFallbackConfig iborFallbackConfig_
 

Friends

std::ostream & operator<< (std::ostream &o, const Node &n)
 

Detailed Description

Definition at line 78 of file dependencygraph.hpp.

Member Typedef Documentation

◆ Graph

using Graph = boost::directed_graph<Node>

Definition at line 103 of file dependencygraph.hpp.

◆ IndexMap

using IndexMap = boost::property_map<Graph, boost::vertex_index_t>::type

Definition at line 104 of file dependencygraph.hpp.

◆ Vertex

using Vertex = boost::graph_traits<Graph>::vertex_descriptor

Definition at line 105 of file dependencygraph.hpp.

◆ VertexIterator

using VertexIterator = boost::graph_traits<Graph>::vertex_iterator

Definition at line 106 of file dependencygraph.hpp.

Constructor & Destructor Documentation

◆ DependencyGraph()

DependencyGraph ( const Date &  asof,
const QuantLib::ext::shared_ptr< TodaysMarketParameters > &  params,
const QuantLib::ext::shared_ptr< const CurveConfigurations > &  curveConfigs,
const IborFallbackConfig iborFallbackConfig = IborFallbackConfig::defaultConfig() 
)
Parameters
asofThe asof date of the T0 market instance
paramsDescription of the market composition
curveConfigsDescription of curve compositions
iborFallbackConfigIbor fallback config

Definition at line 81 of file dependencygraph.hpp.

90 : asof_(asof), params_(params), curveConfigs_(curveConfigs),
91 iborFallbackConfig_(iborFallbackConfig){};
const QuantLib::ext::shared_ptr< const CurveConfigurations > curveConfigs_
const QuantLib::ext::shared_ptr< TodaysMarketParameters > params_
const IborFallbackConfig iborFallbackConfig_
vector< string > curveConfigs

Member Function Documentation

◆ buildDependencyGraph()

void buildDependencyGraph ( const std::string &  configuration,
std::map< std::string, std::string > &  buildErrors 
)

Definition at line 37 of file dependencygraph.cpp.

38 {
39
40 LOG("Build dependency graph for TodaysMarket configuration " << configuration);
41
42 Graph& g = dependencies_[configuration];
43 IndexMap index = QuantLib::ext::get(boost::vertex_index, g);
44 QuantLib::ext::shared_ptr<Conventions> conventions = InstrumentConventions::instance().conventions();
45
46 // add the vertices
47 std::set<MarketObject> t = getMarketObjectTypes(); // from todaysmarket parameter
48
49 for (auto const& o : t) {
50 auto mapping = params_->mapping(o, configuration);
51 for (auto const& m : mapping) {
52 Vertex v = boost::add_vertex(g);
53 QuantLib::ext::shared_ptr<CurveSpec> spec;
54 // swap index curves do not have a spec
56 spec = parseCurveSpec(m.second);
57 // add the vertex to the dependency graph
58 g[v] = {o, m.first, m.second, spec, false};
59 TLOG("add vertex # " << index[v] << ": " << g[v]);
60 }
61 }
62
63 // add the dependencies based on the required curve ids stored in the curve configs; notice that no dependencies
64 // to FXSpots are stored in the configs, these are not needed because a complete FXTriangulation object is created
65 // upfront that is passed to all curve builders which require it.
66
67 VertexIterator v, vend, w, wend;
68
69 for (std::tie(v, vend) = boost::vertices(g); v != vend; ++v) {
70 if (g[*v].curveSpec) {
71 for (auto const& r :
72 curveConfigs_->requiredCurveIds(g[*v].curveSpec->baseType(), g[*v].curveSpec->curveConfigID())) {
73 for (auto const& cId : r.second) {
74 // avoid self reference
75 if (r.first == g[*v].curveSpec->baseType() && cId == g[*v].curveSpec->curveConfigID())
76 continue;
77 bool found = false;
78 for (std::tie(w, wend) = boost::vertices(g); w != wend; ++w) {
79 if (*w != *v && g[*w].curveSpec && r.first == g[*w].curveSpec->baseType() &&
80 cId == g[*w].curveSpec->curveConfigID()) {
81 g.add_edge(*v, *w);
82 TLOG("add edge from vertex #" << index[*v] << " " << g[*v] << " to #" << index[*w] << " "
83 << g[*w]);
84 found = true;
85 // it is enough to insert one dependency
86 break;
87 }
88 }
89 if (!found)
90 buildErrors[g[*v].mapping] = "did not find required curve id " + cId + " of type " +
91 ore::data::to_string(r.first) + " (required from " +
93 ") in dependency graph for configuration " + configuration;
94 }
95 }
96 }
97 }
98
99 // add additional dependencies that are not captured in the curve config dependencies
100 // it is a bit unfortunate that we have to handle these exceptions here, we should rather strive to have all
101 // dependencies in the curve configurations
102
103 for (std::tie(v, vend) = boost::vertices(g); v != vend; ++v) {
104
105 // 1 CapFloorVolatility depends on underlying index curve(s)
106
107 if (g[*v].obj == MarketObject::CapFloorVol &&
108 curveConfigs_->hasCapFloorVolCurveConfig(g[*v].curveSpec->curveConfigID())) {
109 std::set<string> indices;
110 if(!curveConfigs_->capFloorVolCurveConfig(g[*v].curveSpec->curveConfigID())->index().empty())
111 indices.insert(curveConfigs_->capFloorVolCurveConfig(g[*v].curveSpec->curveConfigID())->index());
112 if(!curveConfigs_->capFloorVolCurveConfig(g[*v].curveSpec->curveConfigID())->proxySourceIndex().empty())
113 indices.insert(curveConfigs_->capFloorVolCurveConfig(g[*v].curveSpec->curveConfigID())->proxySourceIndex());
114 if(!curveConfigs_->capFloorVolCurveConfig(g[*v].curveSpec->curveConfigID())->proxyTargetIndex().empty())
115 indices.insert(curveConfigs_->capFloorVolCurveConfig(g[*v].curveSpec->curveConfigID())->proxyTargetIndex());
116 for (auto const& ind : indices) {
117 bool found = false;
118 for (std::tie(w, wend) = boost::vertices(g); w != wend; ++w) {
119 if (*w != *v && g[*w].obj == MarketObject::IndexCurve && g[*w].name == ind) {
120 g.add_edge(*v, *w);
121 TLOG("add edge from vertex #" << index[*v] << " " << g[*v] << " to #" << index[*w] << " "
122 << g[*w]);
123 found = true;
124 // there should be only one dependency, in any case it is enough to insert one
125 break;
126 }
127 }
128 if (!found)
129 buildErrors[g[*v].mapping] = "did not find required ibor index " + ind + " (required from " +
130 ore::data::to_string(g[*v]) +
131 ") in dependency graph for configuration " + configuration;
132 }
133 }
134
135 // 2 Correlation depends on underlying swap indices (if CMS Spread Correlations are calibrated to prices)
136
137 if (g[*v].obj == MarketObject::Correlation &&
138 curveConfigs_->hasCorrelationCurveConfig(g[*v].curveSpec->curveConfigID())) {
139 auto config = curveConfigs_->correlationCurveConfig(g[*v].curveSpec->curveConfigID());
140 if (config->correlationType() == CorrelationCurveConfig::CorrelationType::CMSSpread &&
141 config->quoteType() == MarketDatum::QuoteType::PRICE) {
142 bool found1 = config->index1().empty(), found2 = config->index2().empty();
143 for (std::tie(w, wend) = boost::vertices(g); w != wend; ++w) {
144 if (*w != *v) {
145 if (g[*w].name == config->index1()) {
146 g.add_edge(*v, *w);
147 found1 = true;
148 TLOG("add edge from vertex #" << index[*v] << " " << g[*v] << " to #" << index[*w] << " "
149 << g[*w]);
150 }
151 if (g[*w].name == config->index1()) {
152 g.add_edge(*v, *w);
153 found2 = true;
154 TLOG("add edge from vertex #" << index[*v] << " " << g[*v] << " to #" << index[*w] << " "
155 << g[*w]);
156 }
157 }
158 // there should be only one dependency, in any case it is enough to insert one
159 if (found1 && found2)
160 break;
161 }
162 if (!found1)
163 buildErrors[g[*v].mapping] = "did not find required swap index " + config->index1() +
164 " (required from " + ore::data::to_string(g[*v]) +
165 ") in dependency graph for configuration " + configuration;
166 if (!found2)
167 buildErrors[g[*v].mapping] = "did not find required swap index " + config->index2() +
168 " (required from " + ore::data::to_string(g[*v]) +
169 ") in dependency graph for configuration " + configuration;
170 }
171 }
172
173 // 3 SwaptionVolatility depends on underlying swap indices
174
175 if (g[*v].obj == MarketObject::SwaptionVol &&
176 curveConfigs_->hasSwaptionVolCurveConfig(g[*v].curveSpec->curveConfigID())) {
177 auto config = curveConfigs_->swaptionVolCurveConfig(g[*v].curveSpec->curveConfigID());
178 std::set<std::string> indexBases;
179 if (!config->shortSwapIndexBase().empty())
180 indexBases.insert(config->shortSwapIndexBase());
181 if (!config->swapIndexBase().empty())
182 indexBases.insert(config->swapIndexBase());
183 if (!config->proxySourceShortSwapIndexBase().empty())
184 indexBases.insert(config->proxySourceShortSwapIndexBase());
185 if (!config->proxySourceSwapIndexBase().empty())
186 indexBases.insert(config->proxySourceSwapIndexBase());
187 if (!config->proxyTargetShortSwapIndexBase().empty())
188 indexBases.insert(config->proxyTargetShortSwapIndexBase());
189 if (!config->proxyTargetSwapIndexBase().empty())
190 indexBases.insert(config->proxyTargetSwapIndexBase());
191 for (auto const& indexBase : indexBases) {
192 bool found = false;
193 for (std::tie(w, wend) = boost::vertices(g); w != wend; ++w) {
194 if (*w != *v) {
195 if (g[*w].name == indexBase) {
196 g.add_edge(*v, *w);
197 found = true;
198 TLOG("add edge from vertex #" << index[*v] << " " << g[*v] << " to #" << index[*w] << " "
199 << g[*w]);
200 }
201 }
202 // there should be only one dependency, in any case it is enough to insert one
203 if (found)
204 break;
205 }
206 if (!found)
207 buildErrors[g[*v].mapping] = "did not find required swap index " + indexBase + " (required from " +
208 ore::data::to_string(g[*v]) +
209 ") in dependency graph for configuration " + configuration;
210 }
211 }
212
213 // 4 Swap Indices depend on underlying ibor and discount indices
214
215 if (g[*v].obj == MarketObject::SwapIndexCurve) {
216 bool foundIbor = false, foundDiscount = false;
217 std::string swapIndex = g[*v].name;
218 auto swapCon = QuantLib::ext::dynamic_pointer_cast<data::SwapIndexConvention>(conventions->get(swapIndex));
219 QL_REQUIRE(swapCon, "Did not find SwapIndexConvention for " << swapIndex);
220 auto con = QuantLib::ext::dynamic_pointer_cast<data::IRSwapConvention>(conventions->get(swapCon->conventions()));
221 auto conOisComp =
222 QuantLib::ext::dynamic_pointer_cast<data::OisConvention>(conventions->get(swapCon->conventions()));
223 auto conOisAvg =
224 QuantLib::ext::dynamic_pointer_cast<data::AverageOisConvention>(conventions->get(swapCon->conventions()));
225 std::string indexName;
226 if(con)
227 indexName = con->indexName();
228 else if(conOisComp)
229 indexName = conOisComp->indexName();
230 else if(conOisAvg)
231 indexName = conOisAvg->indexName();
232 else {
233 QL_FAIL("DependencyGraph: internal errors, expected IRSwapConvention, OisConvention, "
234 "AverageOisConvention for '"
235 << swapCon->conventions() << "' from conventions for swap index '" << swapIndex << "'");
236 }
237 std::string discountIndex = g[*v].mapping;
238 if (isGenericIborIndex(indexName))
239 foundIbor = true;
240 for (std::tie(w, wend) = boost::vertices(g); w != wend; ++w) {
241 if (*w != *v) {
242 if (g[*w].obj == MarketObject::IndexCurve || g[*w].obj == MarketObject::YieldCurve) {
243 if (g[*w].name == discountIndex) {
244 g.add_edge(*v, *w);
245 foundDiscount = true;
246 TLOG("add edge from vertex #" << index[*v] << " " << g[*v] << " to #" << index[*w] << " "
247 << g[*w]);
248 }
249 if (g[*w].name == indexName) {
250 g.add_edge(*v, *w);
251 foundIbor = true;
252 TLOG("add edge from vertex #" << index[*v] << " " << g[*v] << " to #" << index[*w] << " "
253 << g[*w]);
254 }
255 }
256 }
257 // there should be only one dependency, in any case it is enough to insert one
258 if (foundDiscount && foundIbor)
259 break;
260 }
261 if (!foundIbor)
262 buildErrors[g[*v].mapping] = "did not find required ibor/ois index " + indexName + " (required from " +
263 ore::data::to_string(g[*v]) + ") in dependency graph for configuration " +
264 configuration;
265 if (!foundDiscount)
266 buildErrors[g[*v].mapping] = "did not find required discount index " + discountIndex +
267 " (required from " + ore::data::to_string(g[*v]) +
268 ") in dependency graph for configuration " + configuration;
269 }
270
272 if (curveConfigs_->hasYieldCurveConfig(g[*v].curveSpec->curveConfigID())) {
273 QuantLib::ext::shared_ptr<YieldCurveConfig> config =
274 curveConfigs_->yieldCurveConfig(g[*v].curveSpec->curveConfigID());
275 vector<QuantLib::ext::shared_ptr<YieldCurveSegment>> segments = config->curveSegments();
276 for (auto s : segments) {
277 if (auto ccSegment = QuantLib::ext::dynamic_pointer_cast<CrossCcyYieldCurveSegment>(s)) {
278 if (ccSegment->foreignDiscountCurveID() == "") {
279 // find the foreign ccy
280 std::string ccy = config->currency();
281 std::string spot = ccSegment->spotRateID();
282 std::string foreignCcy;
283 auto spotDatum = parseMarketDatum(Date(), spot, Real());
284 if (auto fxq = QuantLib::ext::dynamic_pointer_cast<FXSpotQuote>(spotDatum))
285 foreignCcy = ccy == fxq->unitCcy() ? fxq->ccy() : fxq->unitCcy();
286
287 for (std::tie(w, wend) = boost::vertices(g); w != wend; ++w) {
288 if (*w != *v) {
289 if (g[*w].obj == MarketObject::DiscountCurve && g[*w].name == foreignCcy) {
290 g.add_edge(*v, *w);
291 TLOG("add edge from vertex #" << index[*v] << " " << g[*v] << " to #"
292 << index[*w] << " " << g[*w]);
293 }
294 }
295 }
296 }
297 }
298 }
299 }
300 }
301
302 // 5 Equity Vol depends on spot, discount, div
303
304 if (g[*v].obj == MarketObject::EquityVol) {
305 bool foundDiscount = false, foundEqCurve = false;
306 std::string eqName = g[*v].name;
307 auto eqVolSpec = QuantLib::ext::dynamic_pointer_cast<EquityVolatilityCurveSpec>(g[*v].curveSpec);
308 QL_REQUIRE(eqVolSpec, "could not cast to EquityVolatilityCurveSpec");
309 std::string ccy = eqVolSpec->ccy();
310 for (std::tie(w, wend) = boost::vertices(g); w != wend; ++w) {
311 if (*w != *v) {
312 if (g[*w].obj == MarketObject::DiscountCurve && g[*w].name == ccy) {
313 g.add_edge(*v, *w);
314 foundDiscount = true;
315 TLOG("add edge from vertex #" << index[*v] << " " << g[*v] << " to #" << index[*w] << " "
316 << g[*w]);
317 }
318 if (g[*w].obj == MarketObject::EquityCurve && g[*w].name == eqName) {
319 g.add_edge(*v, *w);
320 foundEqCurve = true;
321 TLOG("add edge from vertex #" << index[*v] << " " << g[*v] << " to #" << index[*w] << " "
322 << g[*w]);
323 }
324 }
325 // there should be only one dependency, in any case it is enough to insert one
326 if (foundDiscount && foundEqCurve)
327 break;
328 }
329 if (!foundDiscount)
330 buildErrors[g[*v].mapping] = "did not find required discount curve " + ccy + " (required from " +
331 ore::data::to_string(g[*v]) + ") in dependency graph for configuration " +
332 configuration;
333 if (!foundEqCurve)
334 buildErrors[g[*v].mapping] = "did not find required equity curve " + eqName + " (required from " +
335 ore::data::to_string(g[*v]) + ") in dependency graph for configuration " +
336 configuration;
337 }
338
339 // 6 Commodity Vol depends on price, discount
340
342 bool foundDiscount = false, foundCommCurve = false;
343 std::string commName = g[*v].name;
344 auto commVolSpec = QuantLib::ext::dynamic_pointer_cast<CommodityVolatilityCurveSpec>(g[*v].curveSpec);
345 QL_REQUIRE(commVolSpec, "could not cast to CommodityVolatilityCurveSpec");
346 std::string ccy = commVolSpec->currency();
347 for (std::tie(w, wend) = boost::vertices(g); w != wend; ++w) {
348 if (*w != *v) {
349 if (g[*w].obj == MarketObject::DiscountCurve && g[*w].name == ccy) {
350 g.add_edge(*v, *w);
351 foundDiscount = true;
352 TLOG("add edge from vertex #" << index[*v] << " " << g[*v] << " to #" << index[*w] << " "
353 << g[*w]);
354 }
355 if (g[*w].obj == MarketObject::CommodityCurve && g[*w].name == commName) {
356 g.add_edge(*v, *w);
357 foundCommCurve = true;
358 TLOG("add edge from vertex #" << index[*v] << " " << g[*v] << " to #" << index[*w] << " "
359 << g[*w]);
360 }
361 }
362 // there should be only one dependency, in any case it is enough to insert one
363 if (foundDiscount && foundCommCurve)
364 break;
365 }
366 if (!foundDiscount)
367 buildErrors[g[*v].mapping] = "did not find required discount curve " + ccy + " (required from " +
368 ore::data::to_string(g[*v]) + ") in dependency graph for configuration " +
369 configuration;
370 if (!foundCommCurve)
371 buildErrors[g[*v].mapping] = "did not find required commodity curve " + commName + " (required from " +
372 ore::data::to_string(g[*v]) + ") in dependency graph for configuration " +
373 configuration;
374 }
375
376 // 7 Ibor fallback handling: an ibor index to replace depends on the fallback rfr index
377
378 if (g[*v].obj == MarketObject::IndexCurve) {
379 if (iborFallbackConfig_.isIndexReplaced(g[*v].name, asof_)) {
380 bool foundRfrIndex = false;
381 for (std::tie(w, wend) = boost::vertices(g); w != wend; ++w) {
382 if (*w != *v) {
383 if (g[*w].obj == MarketObject::IndexCurve &&
384 g[*w].name == iborFallbackConfig_.fallbackData(g[*v].name).rfrIndex) {
385 g.add_edge(*v, *w);
386 foundRfrIndex = true;
387 TLOG("add edge from vertex #" << index[*v] << " " << g[*v] << " to #" << index[*w] << " "
388 << g[*w]);
389 }
390 }
391 if (foundRfrIndex)
392 break;
393 }
394 if (!foundRfrIndex)
395 buildErrors[g[*v].mapping] = "did not find required rfr index '" +
397 "' for replaced ibor index '" + g[*v].name +
398 "', is the rfr index configured in todays market parameters?";
399 }
400 }
401
402 // 8 FX curve depends on discount
403
404 if (g[*v].obj == MarketObject::FXSpot) {
405 bool foundDiscount1 = false, foundDiscount2 = false;
406 std::string fxName = g[*v].name;
407 auto fxSpec = QuantLib::ext::dynamic_pointer_cast<FXSpotSpec>(g[*v].curveSpec);
408 QL_REQUIRE(fxSpec, "could not cast to FXSpotSpec");
409 std::string ccy1 = fxSpec->unitCcy();
410 std::string ccy2 = fxSpec->ccy();
411 for (std::tie(w, wend) = boost::vertices(g); w != wend; ++w) {
412 if (*w != *v) {
413 if (g[*w].obj == MarketObject::DiscountCurve && (g[*w].name == ccy1 || g[*w].name == ccy2)) {
414 g.add_edge(*v, *w);
415 if (g[*w].name == ccy1)
416 foundDiscount1 = true;
417 if (g[*w].name == ccy2)
418 foundDiscount2 = true;
419 TLOG("add edge from vertex #" << index[*v] << " " << g[*v] << " to #" << index[*w] << " "
420 << g[*w]);
421 }
422 }
423 // there should be only one dependency, in any case it is enough to insert one
424 if (foundDiscount1 && foundDiscount2)
425 break;
426 }
427 if (!foundDiscount1)
428 buildErrors[g[*v].mapping] = "did not find required discount curve " + ccy1 + " (required from " +
429 ore::data::to_string(g[*v]) + ") in dependency graph for configuration " +
430 configuration;
431 if (!foundDiscount2)
432 buildErrors[g[*v].mapping] = "did not find required discount curve " + ccy2 + " (required from " +
433 ore::data::to_string(g[*v]) + ") in dependency graph for configuration " +
434 configuration;
435 }
436 }
437
438 DLOG("Dependency graph built with " << boost::num_vertices(g) << " vertices, " << boost::num_edges(g) << " edges.");
439
440} // TodaysMarket::buildDependencyGraph
boost::graph_traits< Graph >::vertex_iterator VertexIterator
boost::property_map< Graph, boost::vertex_index_t >::type IndexMap
boost::directed_graph< Node > Graph
std::map< std::string, Graph > dependencies_
boost::graph_traits< Graph >::vertex_descriptor Vertex
const FallbackData & fallbackData(const string &iborIndex) const
bool isIndexReplaced(const string &iborIndex, const QuantLib::Date &asof=QuantLib::Date::maxDate()) const
QuantLib::ext::shared_ptr< CurveSpec > parseCurveSpec(const string &s)
function to convert a string into a curve spec
QuantLib::ext::shared_ptr< MarketDatum > parseMarketDatum(const Date &asof, const string &datumName, const Real &value)
Function to parse a market datum.
bool isGenericIborIndex(const string &indexName)
Return true if the indexName is that of a generic ibor index, otherwise false.
#define LOG(text)
Logging Macro (Level = Notice)
Definition: log.hpp:552
#define DLOG(text)
Logging Macro (Level = Debug)
Definition: log.hpp:554
#define TLOG(text)
Logging Macro (Level = Data)
Definition: log.hpp:556
std::string to_string(const LocationInfo &l)
Definition: ast.cpp:28
std::set< MarketObject > getMarketObjectTypes()
string name
MarketObject obj
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dependencies()

std::map< std::string, Graph > dependencies ( )

Definition at line 112 of file dependencygraph.hpp.

112{ return dependencies_; }
+ Here is the caller graph for this function:

Friends And Related Function Documentation

◆ operator<<

std::ostream & operator<< ( std::ostream &  o,
const Node n 
)
friend

Definition at line 949 of file todaysmarket.cpp.

949 {
950 return o << n.obj << "(" << n.name << "," << n.mapping << ")";
951}

Member Data Documentation

◆ dependencies_

std::map<std::string, Graph> dependencies_
private

Definition at line 118 of file dependencygraph.hpp.

◆ asof_

const Date asof_
private

Definition at line 120 of file dependencygraph.hpp.

◆ params_

const QuantLib::ext::shared_ptr<TodaysMarketParameters> params_
private

Definition at line 121 of file dependencygraph.hpp.

◆ curveConfigs_

const QuantLib::ext::shared_ptr<const CurveConfigurations> curveConfigs_
private

Definition at line 122 of file dependencygraph.hpp.

◆ iborFallbackConfig_

const IborFallbackConfig iborFallbackConfig_
private

Definition at line 123 of file dependencygraph.hpp.