25#ifndef quantlib_interpolation2D_hpp
26#define quantlib_interpolation2D_hpp
28#include <ql/math/interpolations/extrapolation.hpp>
29#include <ql/math/comparison.hpp>
30#include <ql/math/matrix.hpp>
31#include <ql/errors.hpp>
32#include <ql/types.hpp>
56 virtual std::vector<Real>
xValues()
const = 0;
60 virtual std::vector<Real>
yValues()
const = 0;
86 template <
class I1,
class I2,
class M>
90 const I2& yBegin,
const I2& yEnd,
95 "not enough x points to interpolate: at least 2 "
98 "not enough y points to interpolate: at least 2 "
109#if defined(QL_EXTRA_SAFETY_CHECKS)
111 QL_REQUIRE(*j > *i,
"unsorted x values");
114 bool xIsInrange = (x >= x1 && x <= x2) ||
117 if (!xIsInrange)
return false;
119 #if defined(QL_EXTRA_SAFETY_CHECKS)
121 QL_REQUIRE(*l > *k,
"unsorted y values");
124 return (y >= y1 && y <= y2) ||
close(y,y1) ||
close(y,y2);
129#if defined(QL_EXTRA_SAFETY_CHECKS)
131 QL_REQUIRE(*j > *i,
"unsorted x values");
135 else if (x > *(
xEnd_-1))
141#if defined(QL_EXTRA_SAFETY_CHECKS)
143 QL_REQUIRE(*l > *k,
"unsorted y values");
147 else if (y > *(
yEnd_-1))
159 bool allowExtrapolation =
false)
const {
161 return impl_->value(x,y);
164 return impl_->xMin();
167 return impl_->xMax();
170 return impl_->xValues();
173 return impl_->locateX(x);
176 return impl_->yMin();
179 return impl_->yMax();
182 return impl_->yValues();
185 return impl_->locateY(y);
188 return impl_->zData();
191 return impl_->isInRange(x,y);
199 impl_->isInRange(x,y),
200 "interpolation range is ["
204 <<
"]: extrapolation at ("
205 << x <<
", " << y <<
") not allowed");
abstract base class for 2-D interpolation implementations
virtual Size locateX(Real x) const =0
virtual void calculate()=0
virtual const Matrix & zData() const =0
virtual bool isInRange(Real x, Real y) const =0
virtual Real yMin() const =0
virtual Size locateY(Real y) const =0
virtual Real xMin() const =0
virtual std::vector< Real > yValues() const =0
virtual Real value(Real x, Real y) const =0
virtual Real xMax() const =0
virtual std::vector< Real > xValues() const =0
virtual Real yMax() const =0
basic template implementation
Size locateX(Real x) const override
Real yMin() const override
const Matrix & zData() const override
Size locateY(Real y) const override
templateImpl(const I1 &xBegin, const I1 &xEnd, const I2 &yBegin, const I2 &yEnd, const M &zData)
Real xMax() const override
std::vector< Real > xValues() const override
std::vector< Real > yValues() const override
Real yMax() const override
Real xMin() const override
bool isInRange(Real x, Real y) const override
base class for 2-D interpolations.
std::vector< Real > xValues() const
QL_DEPRECATED typedef Real second_argument_type
void checkRange(Real x, Real y, bool extrapolate) const
std::vector< Real > yValues() const
bool isInRange(Real x, Real y) const
const Matrix & zData() const
Size locateY(Real y) const
Size locateX(Real x) const
Interpolation2D()=default
QL_DEPRECATED typedef Real first_argument_type
QL_DEPRECATED typedef Real result_type
ext::shared_ptr< Impl > impl_
Real operator()(Real x, Real y, bool allowExtrapolation=false) const
Matrix used in linear algebra.
std::size_t Size
size of a container
bool close(const Quantity &m1, const Quantity &m2, Size n)