20 explicit Fraction(Number fraction) :
f(std::move(fraction)) {}
24 Proportion(Number left, Number right) :
l(std::move(left)),
r(std::move(right)) {}
38 template <
typename ContainerXType,
typename ContainerYType>
40 construct(std::forward<ContainerXType>(
X), std::forward<ContainerYType>(
Y),
type);
49 template <
typename ContainerXType,
typename ContainerYType>
51 if (
X.size() !=
Y.size()) {
52 std::cerr <<
"Error in function " << __FUNCTION__
53 <<
": Vectors X (of size " <<
X.size()
54 <<
") and Y (of size " <<
Y.size()
55 <<
") are not the same size. Doing nothing..." << std::endl;
59 _X = std::forward<ContainerXType>(
X);
60 _Y = std::forward<ContainerYType>(
Y);
63 Number
eval(Number x)
const {
69 }
else if (_Y.size() == 1) {
72 segment = std::clamp(segment,
static_cast<SizeT>(0),
static_cast<SizeT>(_X.size() - 2));
73 if (x <= _X[segment]) {
76 if (x >= _X[segment+1]) {
80 [&](
const typename Types::Left&) {
return _Y[segment]; },
81 [&](
const typename Types::Middle&) {
return (_Y[segment] + _Y[segment+1]) / 2; },
82 [&](
const typename Types::Right&) {
return _Y[segment+1]; },
83 [&](
const typename Types::Fraction& f) {
return _Y[segment] + f.f*(_Y[segment+1] - _Y[segment]); },
84 [&](
const typename Types::Proportion& p) {
return (p.r*_Y[segment] + p.l*_Y[segment+1]) / (p.l + p.r); },
88 Container<Number>
eval(
const Container<Number>& xx,
bool sorted =
true)
const {
89 Container<Number> result(xx.size());
91 for (
SizeT i = 0, i_x = 0; i < xx.size(); ++i) {
92 const Number x = xx[i];
93 while (i_x + 1 < _X.size() && x >= _X[i_x+1])
95 result[i] =
eval(x, i_x);
98 for (
SizeT i = 0; i < xx.size(); ++i) {
99 result[i] =
eval(xx[i]);
108 Container<Number>
operator()(
const Container<Number>& xx)
const {
116 const Container<Number>&
X() const & {
119 Container<Number>&&
X() && {
120 return std::move(_X);
123 const Container<Number>&
Y() const & {
126 Container<Number>&&
Y() && {
127 return std::move(_Y);
132 Container<Number> _X = {};
133 Container<Number> _Y = {};
Number eval(Number x, SizeT segment) const
Definition step.h:66
Number eval(Number x) const
Definition step.h:63
std::variant< typename Types::Left, typename Types::Middle, typename Types::Right, typename Types::Fraction, typename Types::Proportion > Type
Definition step.h:30
Container< Number > eval(const Container< Number > &xx, bool sorted=true) const
Definition step.h:88
const Container< Number > & Y() const &
Definition step.h:123
Container< Number > operator()(const Container< Number > &xx) const
Definition step.h:108
StepSpline(ContainerXType &&X, ContainerYType &&Y, Type type=typename Types::Default{})
Definition step.h:39
void construct(ContainerXType &&X, ContainerYType &&Y, Type type=typename Types::Default{})
Definition step.h:50
Container< Number > && Y() &&
Definition step.h:126
Type type() const
Definition step.h:112
Number operator()(Number x) const
Definition step.h:105
StepSpline(const StepSpline &other)=default
const Container< Number > & X() const &
Definition step.h:116
StepSpline(StepSpline &&other) noexcept=default
StepSpline & operator=(const StepSpline &other)=default
StepSpline & operator=(StepSpline &&other) noexcept=default
Container< Number > && X() &&
Definition step.h:119
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
Number f
Definition step.h:21
Fraction(Number fraction)
Definition step.h:20
Number r
Definition step.h:25
Proportion(Number left, Number right)
Definition step.h:24
Number l
Definition step.h:25
Left Default
Definition step.h:27