26#ifndef quantlib_interpolation_hpp
27#define quantlib_interpolation_hpp
29#include <ql/math/interpolations/extrapolation.hpp>
30#include <ql/math/comparison.hpp>
31#include <ql/errors.hpp>
64 virtual std::vector<Real>
xValues()
const = 0;
65 virtual std::vector<Real>
yValues()
const = 0;
87 template <
class I1,
class I2>
91 const int requiredPoints = 2)
93 QL_REQUIRE(
static_cast<int>(
xEnd_-
xBegin_) >= requiredPoints,
94 "not enough points to interpolate: at least " <<
96 " required, " <<
static_cast<int>(
xEnd_-
xBegin_)<<
" provided");
105#if defined(QL_EXTRA_SAFETY_CHECKS)
107 QL_REQUIRE(*j > *i,
"unsorted x values");
110 return (x >= x1 && x <= x2) ||
close(x,x1) ||
close(x,x2);
115 #if defined(QL_EXTRA_SAFETY_CHECKS)
117 QL_REQUIRE(*j > *i,
"unsorted x values");
121 else if (x > *(
xEnd_-1))
135 return impl_->value(x);
139 return impl_->primitive(x);
143 return impl_->derivative(x);
147 return impl_->secondDerivative(x);
150 return impl_->xMin();
153 return impl_->xMax();
156 return impl_->isInRange(x);
165 "interpolation range is ["
167 <<
"]: extrapolation at " << x <<
" not allowed");
abstract base class for interpolation implementations
virtual Real secondDerivative(Real) const =0
virtual Real value(Real) const =0
virtual Real xMin() const =0
virtual std::vector< Real > yValues() const =0
virtual Real xMax() const =0
virtual std::vector< Real > xValues() const =0
virtual bool isInRange(Real) const =0
virtual Real derivative(Real) const =0
virtual Real primitive(Real) const =0
basic template implementation
Real xMax() const override
std::vector< Real > xValues() const override
Size locate(Real x) const
std::vector< Real > yValues() const override
templateImpl(const I1 &xBegin, const I1 &xEnd, const I2 &yBegin, const int requiredPoints=2)
bool isInRange(Real x) const override
Real xMin() const override
base class for 1-D interpolations.
Real secondDerivative(Real x, bool allowExtrapolation=false) const
Real derivative(Real x, bool allowExtrapolation=false) const
~Interpolation() override=default
QL_DEPRECATED typedef Real argument_type
QL_DEPRECATED typedef Real result_type
ext::shared_ptr< Impl > impl_
Real operator()(Real x, bool allowExtrapolation=false) const
Real primitive(Real x, bool allowExtrapolation=false) const
void checkRange(Real x, bool extrapolate) const
bool isInRange(Real x) const
std::size_t Size
size of a container
bool close(const Quantity &m1, const Quantity &m2, Size n)