14 static Container<Number>
compute_coeffs(
const Container<Number>&
X,
const Container<Number>& Y) {
15 if (
X.size() != Y.size()) {
16 std::cerr <<
"Error in function " << __FUNCTION__
17 <<
": Vectors X (of size " <<
X.size()
18 <<
") and Y (of size " << Y.size()
19 <<
") are not the same size. Returning an empty array..." << std::endl;
23 const auto n =
X.size();
31 return {(Y[1] - Y[0]) / (
X[1] -
X[0]), Y[0]};
37 coeffs.resize(2 * (n - 1));
39 for (
SizeT i = 0; i < n - 1; ++i) {
40 coeffs[2*i] = (Y[i+1] - Y[i]) / (
X[i+1] -
X[i]);
49 template <
typename ContainerXType>
60 template <
typename ContainerXType>
61 void construct(ContainerXType&&
X,
const Container<Number>& Y) {
62 if (
X.size() != Y.size()) {
63 std::cerr <<
"Error in function " << __FUNCTION__
64 <<
": Vectors X (of size " <<
X.size()
65 <<
") and Y (of size " << Y.size()
66 <<
") are not the same size. Doing nothing..." << std::endl;
70 if (
coeffs.empty() && !
X.empty()) {
71 std::cerr <<
"Error in function " << __FUNCTION__
72 <<
": failed to construct coefficients. Not changing the object..." << std::endl;
75 _X = std::forward<ContainerXType>(
X);
76 _coeffs = std::move(
coeffs);
79 Number
eval(Number x)
const {
83 if (_coeffs.empty()) {
85 }
else if (_coeffs.size() == 1) {
93 Container<Number>
eval(
const Container<Number>& xx,
bool sorted =
true)
const {
94 Container<Number> result(xx.size());
96 for (
SizeT i = 0, i_x = 0; i < xx.size(); ++i) {
97 const Number x = xx[i];
98 while (i_x + 1 < _X.size() && x >= _X[i_x+1])
100 result[i] =
eval(x, i_x);
103 for (
SizeT i = 0; i < xx.size(); ++i) {
104 result[i] =
eval(xx[i]);
113 Container<Number>
operator()(
const Container<Number>& xx)
const {
117 const Container<Number>&
X() const & {
120 Container<Number>&&
X() && {
121 return std::move(_X);
124 const Container<Number>&
coeffs() const & {
128 return std::move(_coeffs);
132 return {2*index, 2*(index+1)};
136 Container<Number> _X = {};
137 Container<Number> _coeffs = {};
Number operator()(Number x) const
Definition linear.h:110
const Container< Number > & coeffs() const &
Definition linear.h:124
LinearSpline(const LinearSpline &other)=default
void construct(ContainerXType &&X, const Container< Number > &Y)
Definition linear.h:61
LinearSpline(LinearSpline &&other) noexcept=default
LinearSpline & operator=(const LinearSpline &other)=default
static Container< Number > compute_coeffs(const Container< Number > &X, const Container< Number > &Y)
Definition linear.h:14
const Container< Number > & X() const &
Definition linear.h:117
Container< Number > && coeffs() &&
Definition linear.h:127
LinearSpline & operator=(LinearSpline &&other) noexcept=default
LinearSpline(ContainerXType &&X, const Container< Number > &Y)
Definition linear.h:50
Container< Number > operator()(const Container< Number > &xx) const
Definition linear.h:113
Container< Number > eval(const Container< Number > &xx, bool sorted=true) const
Definition linear.h:93
Container< Number > && X() &&
Definition linear.h:120
Number eval(Number x, SizeT segment) const
Definition linear.h:82
static std::pair< SizeT, SizeT > segment(SizeT index)
Definition linear.h:131
Number eval(Number x) const
Definition linear.h:79
Iterator first_leq_or_begin(Iterator begin, Iterator end, const T &value)
Definition misc.h:27
ALFI_DEFAULT_NUMBER DefaultNumber
Definition config.h:17
ALFI_SIZE_TYPE SizeT
Definition config.h:22
ALFI_DEFAULT_CONTAINER< Number > DefaultContainer
Definition config.h:20