Rate ZeroInflationTermStructure::zeroRate(const Date &d, const Period& instObsLag, bool forceLinearInterpolation, bool extrapolate) const { Period useLag = instObsLag; if (instObsLag == Period(-1,Days)) { useLag = observationLag(); } Rate zeroRate; if (forceLinearInterpolation) { std::pair<Date,Date> dd = inflationPeriod(d-useLag, frequency()); dd.second = dd.second + Period(1,Days); Real dp = dd.second - dd.first; Real dt = d - dd.first; // if we are interpolating we only check the exact point // this prevents falling off the end at curve maturity InflationTermStructure::checkRange(d, extrapolate); Time t1 = timeFromReference(dd.first); Time t2 = timeFromReference(dd.second); Rate z1 = zeroRateImpl(t1); Rate z2 = zeroRateImpl(t2); zeroRate = z1 + (z2-z1) * (dt/dp); } else { if (indexIsInterpolated()) { InflationTermStructure::checkRange(d-useLag, extrapolate); Time t = timeFromReference(d-useLag); zeroRate = zeroRateImpl(t); } else { std::pair<Date,Date> dd = inflationPeriod(d-useLag, frequency()); InflationTermStructure::checkRange(dd.first, extrapolate); Time t = timeFromReference(dd.first); zeroRate = zeroRateImpl(t); } } if (hasSeasonality()) { zeroRate = seasonality()->correctZeroRate(d-useLag, zeroRate, *this); } return zeroRate; }
Rate ZeroInflationTermStructure::zeroRate(Time t, bool extrapolate) const { checkRange(t, extrapolate); return zeroRateImpl(t); }