@@ -36,25 +36,26 @@ namespace QuantLib {
3636 optionTenors_(optionTenors),
3737 optionDates_(nOptionTenors_),
3838 optionTimes_(nOptionTenors_),
39- optionDatesAsReal_(nOptionTenors_),
39+ optionInterpolatorTimes_(nOptionTenors_ + 1 ),
40+ optionInterpolatorDatesAsReal_(nOptionTenors_ + 1 ),
4041 nSwapTenors_(swapTenors.size()),
4142 swapTenors_(swapTenors),
4243 swapLengths_(nSwapTenors_) {
4344
4445 checkOptionTenors ();
46+ evaluationDate_ = Settings::instance ().evaluationDate ();
4547 initializeOptionDatesAndTimes ();
4648
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 ();
5557
5658 registerWith (Settings::instance ().evaluationDate ());
57- evaluationDate_ = Settings::instance ().evaluationDate ();
5859 }
5960
6061 SwaptionVolatilityDiscrete::SwaptionVolatilityDiscrete (
@@ -69,7 +70,8 @@ namespace QuantLib {
6970 optionTenors_(optionTenors),
7071 optionDates_(nOptionTenors_),
7172 optionTimes_(nOptionTenors_),
72- 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 }
@@ -99,7 +101,8 @@ namespace QuantLib {
99101 optionTenors_(nOptionTenors_),
100102 optionDates_(optionDates),
101103 optionTimes_(nOptionTenors_),
102- optionDatesAsReal_(nOptionTenors_),
104+ optionInterpolatorTimes_(nOptionTenors_ + 1 ),
105+ optionInterpolatorDatesAsReal_(nOptionTenors_ + 1 ),
103106 nSwapTenors_(swapTenors.size()),
104107 swapTenors_(swapTenors),
105108 swapLengths_(nSwapTenors_) {
@@ -110,9 +113,9 @@ namespace QuantLib {
110113 checkSwapTenors ();
111114 initializeSwapLengths ();
112115
113- optionInterpolator_= LinearInterpolation (optionTimes_ .begin (),
114- optionTimes_ .end (),
115- optionDatesAsReal_ .begin ());
116+ optionInterpolator_= LinearInterpolation (optionInterpolatorTimes_ .begin (),
117+ optionInterpolatorTimes_ .end (),
118+ optionInterpolatorDatesAsReal_ .begin ());
116119 optionInterpolator_.update ();
117120 optionInterpolator_.enableExtrapolation ();
118121 }
@@ -152,17 +155,20 @@ namespace QuantLib {
152155 }
153156
154157 void SwaptionVolatilityDiscrete::initializeOptionDatesAndTimes () const {
158+ optionInterpolatorDatesAsReal_[0 ] = static_cast <Real>(evaluationDate_.serialNumber ());
155159 for (Size i=0 ; i<nOptionTenors_; ++i) {
156160 optionDates_[i] = optionDateFromTenor (optionTenors_[i]);
157- optionDatesAsReal_[i ] =
161+ optionInterpolatorDatesAsReal_[i + 1 ] =
158162 static_cast <Real>(optionDates_[i].serialNumber ());
159163 }
160164 initializeOptionTimes ();
161165 }
162166
163167 void SwaptionVolatilityDiscrete::initializeOptionTimes () const {
164- for (Size i=0 ; i<nOptionTenors_; ++i)
165- optionTimes_[i] = timeFromReference (optionDates_[i]);
168+ optionInterpolatorTimes_[0 ] = 0.0 ;
169+ for (Size i = 0 ; i < nOptionTenors_; ++i) {
170+ optionTimes_[i] = optionInterpolatorTimes_[i + 1 ] = timeFromReference (optionDates_[i]);
171+ }
166172 }
167173
168174 void SwaptionVolatilityDiscrete::initializeSwapLengths () const {
0 commit comments