@@ -103,6 +103,8 @@ CrossAssetModelBuilder::CrossAssetModelBuilder(
103103 marketObserver_->addObservable (c.second );
104104 // reset market observer's updated flag
105105 marketObserver_->hasUpdated (true );
106+ // register with market observer
107+ registerWith (marketObserver_);
106108}
107109
108110Handle<QuantExt::CrossAssetModel> CrossAssetModelBuilder::model () const {
@@ -244,9 +246,9 @@ void CrossAssetModelBuilder::buildModel() const {
244246 }
245247 auto builder = boost::dynamic_pointer_cast<LgmBuilder>(subBuilders_[CrossAssetModel::AssetType::IR][i]);
246248 lgmBuilder.push_back (builder);
249+ if (builder->requiresRecalibration ())
250+ recalibratedCurrencies.insert (builder->parametrization ()->currency ().code ());
247251 auto parametrization = builder->parametrization ();
248- if (builder->requiresRecalibration ())
249- recalibratedCurrencies.insert (parametrization->currency ().code ());
250252 if (dontCalibrate_)
251253 builder->freeze ();
252254 swaptionBaskets_[i] = builder->swaptionBasket ();
@@ -270,9 +272,9 @@ void CrossAssetModelBuilder::buildModel() const {
270272 }
271273 auto builder = boost::dynamic_pointer_cast<HwBuilder>(subBuilders_[CrossAssetModel::AssetType::IR][i]);
272274 hwBuilder.push_back (builder);
275+ if (builder->requiresRecalibration ())
276+ recalibratedCurrencies.insert (builder->parametrization ()->currency ().code ());
273277 auto parametrization = builder->parametrization ();
274- if (builder->requiresRecalibration ())
275- recalibratedCurrencies.insert (parametrization->currency ().code ());
276278 if (dontCalibrate_)
277279 builder->freeze ();
278280 swaptionBaskets_[i] = builder->swaptionBasket ();
@@ -543,8 +545,6 @@ void CrossAssetModelBuilder::buildModel() const {
543545 continue ;
544546 }
545547
546- std::cout << " calibrate fx " << fx->foreignCcy () << std::endl;
547-
548548 DLOG (" FX Calibration " << i);
549549
550550 // attach pricing engines to helpers
@@ -591,6 +591,7 @@ void CrossAssetModelBuilder::buildModel() const {
591591 }
592592 }
593593 }
594+ fxBuilder[i]->setCalibrationDone ();
594595 }
595596
596597 /* ************************
@@ -616,8 +617,8 @@ void CrossAssetModelBuilder::buildModel() const {
616617
617618 if (!eqBuilder[i]->requiresRecalibration () &&
618619 recalibratedCurrencies.find (eq->currency ()) == recalibratedCurrencies.end ()) {
619- DLOG (" EQ Calibration "
620- << i << " skipped, since neither eq builder nor ir model in eq ccy were recalibrated." );
620+ DLOG (" EQ Calibration " << i
621+ << " skipped, since neither eq builder nor ir model in eq ccy were recalibrated." );
621622 continue ;
622623 }
623624
@@ -664,6 +665,7 @@ void CrossAssetModelBuilder::buildModel() const {
664665 }
665666 }
666667 }
668+ eqBuilder[i]->setCalibrationDone ();
667669 }
668670
669671 /* ************************
@@ -729,10 +731,6 @@ void CrossAssetModelBuilder::buildModel() const {
729731 DLOG (" Relinked discounting curve for " << p->currency ().code () << " as final model curves" );
730732 }
731733
732- // play safe (although the cache of the model should be empty at
733- // this point from all what we know...)
734- model_->update ();
735-
736734 DLOG (" Building CrossAssetModel done" );
737735}
738736
0 commit comments