@@ -37,6 +37,8 @@ namespace QuantLib {
3737 optionDates_(nOptionTenors_),
3838 optionTimes_(nOptionTenors_),
3939 optionDatesAsReal_(nOptionTenors_),
40+ optionInterpolatorTimes_(nOptionTenors_ + 1 ),
41+ optionInterpolatorDatesAsReal_(nOptionTenors_ + 1 ),
4042 nSwapTenors_(swapTenors.size()),
4143 swapTenors_(swapTenors),
4244 swapLengths_(nSwapTenors_) {
@@ -47,14 +49,12 @@ namespace QuantLib {
4749 checkSwapTenors ();
4850 initializeSwapLengths ();
4951
50- optionInterpolator_= LinearInterpolation (optionTimes_ .begin (),
51- optionTimes_ .end (),
52- optionDatesAsReal_ .begin ());
52+ optionInterpolator_= LinearInterpolation (optionInterpolatorTimes_ .begin (),
53+ optionInterpolatorTimes_ .end (),
54+ optionInterpolatorDatesAsReal_ .begin ());
5355 optionInterpolator_.update ();
5456 optionInterpolator_.enableExtrapolation ();
55-
56- registerWith (Settings::instance ().evaluationDate ());
57- evaluationDate_ = Settings::instance ().evaluationDate ();
57+ cachedReferenceDate_ = referenceDate ();
5858 }
5959
6060 SwaptionVolatilityDiscrete::SwaptionVolatilityDiscrete (
@@ -70,6 +70,8 @@ namespace QuantLib {
7070 optionDates_(nOptionTenors_),
7171 optionTimes_(nOptionTenors_),
7272 optionDatesAsReal_(nOptionTenors_),
73+ optionInterpolatorTimes_(nOptionTenors_ + 1 ),
74+ optionInterpolatorDatesAsReal_(nOptionTenors_ + 1 ),
7375 nSwapTenors_(swapTenors.size()),
7476 swapTenors_(swapTenors),
7577 swapLengths_(nSwapTenors_) {
@@ -80,9 +82,9 @@ namespace QuantLib {
8082 checkSwapTenors ();
8183 initializeSwapLengths ();
8284
83- optionInterpolator_= LinearInterpolation (optionTimes_ .begin (),
84- optionTimes_ .end (),
85- optionDatesAsReal_ .begin ());
85+ optionInterpolator_= LinearInterpolation (optionInterpolatorTimes_ .begin (),
86+ optionInterpolatorTimes_ .end (),
87+ optionInterpolatorDatesAsReal_ .begin ());
8688 optionInterpolator_.update ();
8789 optionInterpolator_.enableExtrapolation ();
8890 }
@@ -100,6 +102,8 @@ namespace QuantLib {
100102 optionDates_(optionDates),
101103 optionTimes_(nOptionTenors_),
102104 optionDatesAsReal_(nOptionTenors_),
105+ optionInterpolatorTimes_(nOptionTenors_ + 1 ),
106+ optionInterpolatorDatesAsReal_(nOptionTenors_ + 1 ),
103107 nSwapTenors_(swapTenors.size()),
104108 swapTenors_(swapTenors),
105109 swapLengths_(nSwapTenors_) {
@@ -110,9 +114,9 @@ namespace QuantLib {
110114 checkSwapTenors ();
111115 initializeSwapLengths ();
112116
113- optionInterpolator_= LinearInterpolation (optionTimes_ .begin (),
114- optionTimes_ .end (),
115- optionDatesAsReal_ .begin ());
117+ optionInterpolator_= LinearInterpolation (optionInterpolatorTimes_ .begin (),
118+ optionInterpolatorTimes_ .end (),
119+ optionInterpolatorDatesAsReal_ .begin ());
116120 optionInterpolator_.update ();
117121 optionInterpolator_.enableExtrapolation ();
118122 }
@@ -152,17 +156,20 @@ namespace QuantLib {
152156 }
153157
154158 void SwaptionVolatilityDiscrete::initializeOptionDatesAndTimes () const {
159+ optionInterpolatorDatesAsReal_[0 ] = static_cast <Real>(referenceDate ().serialNumber ());
155160 for (Size i=0 ; i<nOptionTenors_; ++i) {
156161 optionDates_[i] = optionDateFromTenor (optionTenors_[i]);
157- optionDatesAsReal_[i] =
162+ optionDatesAsReal_[i] = optionInterpolatorDatesAsReal_[i + 1 ] =
158163 static_cast <Real>(optionDates_[i].serialNumber ());
159164 }
160165 initializeOptionTimes ();
161166 }
162167
163168 void SwaptionVolatilityDiscrete::initializeOptionTimes () const {
164- for (Size i=0 ; i<nOptionTenors_; ++i)
165- optionTimes_[i] = timeFromReference (optionDates_[i]);
169+ optionInterpolatorTimes_[0 ] = 0.0 ;
170+ for (Size i = 0 ; i < nOptionTenors_; ++i) {
171+ optionTimes_[i] = optionInterpolatorTimes_[i + 1 ] = timeFromReference (optionDates_[i]);
172+ }
166173 }
167174
168175 void SwaptionVolatilityDiscrete::initializeSwapLengths () const {
@@ -173,9 +180,8 @@ namespace QuantLib {
173180 void SwaptionVolatilityDiscrete::performCalculations () const {
174181 // recalculate dates if necessary...
175182 if (moving_) {
176- Date d = Settings::instance ().evaluationDate ();
177- if (evaluationDate_ != d) {
178- evaluationDate_ = d;
183+ if (cachedReferenceDate_ != referenceDate ()) {
184+ cachedReferenceDate_ = referenceDate ();
179185 initializeOptionDatesAndTimes ();
180186 initializeSwapLengths ();
181187 optionInterpolator_.update ();
0 commit comments