Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 24 additions & 24 deletions ALFI/ALFI/dist.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ namespace alfi::dist {
};

template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> uniform(SizeT n, Number a, Number b) {
Container<Number> uniform(SizeT n, const Number& a, const Number& b) {
if (n == 1)
return {(a+b)/2};
Container<Number> points(n);
Expand Down Expand Up @@ -63,7 +63,7 @@ namespace alfi::dist {
@return a container with \p n points distributed on the segment `[a, b]` according to the transform function
*/
template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> quadratic(SizeT n, Number a, Number b) {
Container<Number> quadratic(SizeT n, const Number& a, const Number& b) {
if (n == 1)
return {(a+b)/2};
Container<Number> points(n);
Expand Down Expand Up @@ -91,7 +91,7 @@ namespace alfi::dist {
@return a container with \p n points distributed on the segment `[a, b]` according to the transform function
*/
template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> cubic(SizeT n, Number a, Number b) {
Container<Number> cubic(SizeT n, const Number& a, const Number& b) {
if (n == 1)
return {(a+b)/2};
Container<Number> points(n);
Expand All @@ -104,7 +104,7 @@ namespace alfi::dist {
}

template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> chebyshev(SizeT n, Number a, Number b) {
Container<Number> chebyshev(SizeT n, const Number& a, const Number& b) {
if (n == 1)
return {(a+b)/2};
Container<Number> points(n);
Expand All @@ -116,12 +116,12 @@ namespace alfi::dist {
}

template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> chebyshev_stretched(SizeT n, Number a, Number b) {
Container<Number> chebyshev_stretched(SizeT n, const Number& a, const Number& b) {
return points::stretched<Number,Container>(chebyshev(n, a, b), a, b);
}

template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> chebyshev_augmented(SizeT n, Number a, Number b) {
Container<Number> chebyshev_augmented(SizeT n, const Number& a, const Number& b) {
if (n == 0) {
return {};
}
Expand All @@ -137,7 +137,7 @@ namespace alfi::dist {
}

template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> chebyshev_2(SizeT n, Number a, Number b) {
Container<Number> chebyshev_2(SizeT n, const Number& a, const Number& b) {
if (n == 1)
return {(a+b)/2};
Container<Number> points(n);
Expand All @@ -149,7 +149,7 @@ namespace alfi::dist {
}

template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> chebyshev_3(SizeT n, Number a, Number b) {
Container<Number> chebyshev_3(SizeT n, const Number& a, const Number& b) {
Container<Number> points(n);
for (SizeT i = 0; i < n; ++i) {
const Number x = 1 - std::cos(M_PI * static_cast<Number>(2*i) / static_cast<Number>(2*n - 1));
Expand All @@ -159,12 +159,12 @@ namespace alfi::dist {
}

template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> chebyshev_3_stretched(SizeT n, Number a, Number b) {
Container<Number> chebyshev_3_stretched(SizeT n, const Number& a, const Number& b) {
return points::stretched<Number,Container>(chebyshev_3(n, a, b), a, b);
}

template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> chebyshev_4(SizeT n, Number a, Number b) {
Container<Number> chebyshev_4(SizeT n, const Number& a, const Number& b) {
Container<Number> points(n);
for (SizeT i = 0; i < n; ++i) {
const Number x = 1 - std::cos(M_PI * static_cast<Number>(2*i + 1) / static_cast<Number>(2*n - 1));
Expand All @@ -174,12 +174,12 @@ namespace alfi::dist {
}

template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> chebyshev_4_stretched(SizeT n, Number a, Number b) {
Container<Number> chebyshev_4_stretched(SizeT n, const Number& a, const Number& b) {
return points::stretched<Number,Container>(chebyshev_4(n, a, b), a, b);
}

template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> chebyshev_ellipse(SizeT n, Number a, Number b, Number ratio) {
Container<Number> chebyshev_ellipse(SizeT n, const Number& a, const Number& b, const Number& ratio) {
Container<Number> points(n);
for (SizeT i = 0; i < n / 2; ++i) {
const Number theta = M_PI * (2 * static_cast<Number>(i) + 1) / (2 * static_cast<Number>(n));
Expand All @@ -193,12 +193,12 @@ namespace alfi::dist {
}

template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> chebyshev_ellipse_stretched(SizeT n, Number a, Number b, Number ratio) {
Container<Number> chebyshev_ellipse_stretched(SizeT n, const Number& a, const Number& b, const Number& ratio) {
return points::stretched<Number,Container>(chebyshev_ellipse(n, a, b, ratio), a, b);
}

template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> chebyshev_ellipse_augmented(SizeT n, Number a, Number b, Number ratio) {
Container<Number> chebyshev_ellipse_augmented(SizeT n, const Number& a, const Number& b, const Number& ratio) {
if (n == 0) {
return {};
}
Expand All @@ -214,7 +214,7 @@ namespace alfi::dist {
}

template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> chebyshev_ellipse_2(SizeT n, Number a, Number b, Number ratio) {
Container<Number> chebyshev_ellipse_2(SizeT n, const Number& a, const Number& b, const Number& ratio) {
Container<Number> points(n);
for (SizeT i = 0; i < n / 2; ++i) {
const Number theta = M_PI * static_cast<Number>(i) / (static_cast<Number>(n) - 1);
Expand All @@ -228,7 +228,7 @@ namespace alfi::dist {
}

template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> chebyshev_ellipse_3(SizeT n, Number a, Number b, Number ratio) {
Container<Number> chebyshev_ellipse_3(SizeT n, const Number& a, const Number& b, const Number& ratio) {
Container<Number> points(n);
for (SizeT i = 0; i < n; ++i) {
const Number theta = M_PI * static_cast<Number>(2*i) / static_cast<Number>(2*n - 1);
Expand All @@ -239,12 +239,12 @@ namespace alfi::dist {
}

template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> chebyshev_ellipse_3_stretched(SizeT n, Number a, Number b, Number ratio) {
Container<Number> chebyshev_ellipse_3_stretched(SizeT n, const Number& a, const Number& b, const Number& ratio) {
return points::stretched<Number,Container>(chebyshev_ellipse_3(n, a, b, ratio), a, b);
}

template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> chebyshev_ellipse_4(SizeT n, Number a, Number b, Number ratio) {
Container<Number> chebyshev_ellipse_4(SizeT n, const Number& a, const Number& b, const Number& ratio) {
Container<Number> points(n);
for (SizeT i = 0; i < n; ++i) {
const Number theta = M_PI * static_cast<Number>(2*i + 1) / static_cast<Number>(2*n - 1);
Expand All @@ -255,7 +255,7 @@ namespace alfi::dist {
}

template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> chebyshev_ellipse_4_stretched(SizeT n, Number a, Number b, Number ratio) {
Container<Number> chebyshev_ellipse_4_stretched(SizeT n, const Number& a, const Number& b, const Number& ratio) {
return points::stretched<Number,Container>(chebyshev_ellipse_4(n, a, b, ratio), a, b);
}

Expand Down Expand Up @@ -283,7 +283,7 @@ namespace alfi::dist {
@return a container with \p n points distributed on the interval `(a, b)` according to the transform function
*/
template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> logistic(SizeT n, Number a, Number b, Number steepness) {
Container<Number> logistic(SizeT n, const Number& a, const Number& b, const Number& steepness) {
if (n == 1)
return {(a+b)/2};
Container<Number> points(n);
Expand All @@ -296,7 +296,7 @@ namespace alfi::dist {
}

template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> logistic_stretched(SizeT n, Number a, Number b, Number steepness) {
Container<Number> logistic_stretched(SizeT n, const Number& a, const Number& b, const Number& steepness) {
if (n == 0)
return {};
if (n == 1)
Expand Down Expand Up @@ -338,7 +338,7 @@ namespace alfi::dist {
@return a container with \p n points distributed on the interval `(a, b)` according to the transform function
*/
template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> erf(SizeT n, Number a, Number b, Number steepness) {
Container<Number> erf(SizeT n, const Number& a, const Number& b, const Number& steepness) {
if (n == 0)
return {};
if (n == 1)
Expand All @@ -353,12 +353,12 @@ namespace alfi::dist {
}

template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> erf_stretched(SizeT n, Number a, Number b, Number steepness) {
Container<Number> erf_stretched(SizeT n, const Number& a, const Number& b, const Number& steepness) {
return points::stretched<Number,Container>(erf(n, a, b, steepness), a, b);
}

template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
Container<Number> of_type(Type type, SizeT n, Number a, Number b, Number parameter = NAN) {
Container<Number> of_type(Type type, SizeT n, const Number& a, const Number& b, const Number& parameter = NAN) {
switch (type) {
case Type::QUADRATIC:
return quadratic(n, a, b);
Expand Down
2 changes: 1 addition & 1 deletion ALFI/ALFI/misc.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ namespace alfi::misc {
const Container<Number>& Y,
const Container<Number>& xx,
dist::Type dist_type = dist::Type::GENERAL,
Number epsilon = std::numeric_limits<Number>::epsilon()
const Number& epsilon = std::numeric_limits<Number>::epsilon()
) {
if (X.size() != Y.size()) {
std::cerr << "Error in function " << __FUNCTION__
Expand Down
4 changes: 2 additions & 2 deletions ALFI/ALFI/poly.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
namespace alfi::poly {
template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
std::enable_if_t<!traits::has_size<Number>::value, Number>
val(const Container<Number>& coeffs, Number x) {
val(const Container<Number>& coeffs, const Number& x) {
Number result = 0;
for (const Number& c : coeffs) {
result = result * x + c;
Expand Down Expand Up @@ -187,7 +187,7 @@ namespace alfi::poly {
const Container<Number>& X,
const Container<Number>& Y,
const Container<Number>& xx,
Number epsilon = std::numeric_limits<Number>::epsilon()
const Number& epsilon = std::numeric_limits<Number>::epsilon()
) {
const auto nn = xx.size();

Expand Down
8 changes: 4 additions & 4 deletions ALFI/ALFI/ratf.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ namespace alfi::ratf {
*/
template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
std::enable_if_t<!traits::has_size<Number>::value, Number>
val_mul(const RationalFunction<Number, Container>& rf, Number x) {
val_mul(const RationalFunction<Number, Container>& rf, const Number& x) {
Number n = 0;
for (const auto& c : rf.first) {
n = n * x + c;
Expand Down Expand Up @@ -73,7 +73,7 @@ namespace alfi::ratf {
*/
template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
std::enable_if_t<!traits::has_size<Number>::value, Number>
val_div(const RationalFunction<Number, Container>& rf, Number x) {
val_div(const RationalFunction<Number, Container>& rf, const Number& x) {
const auto& numerator = rf.first;
const auto& denominator = rf.second;
Number n = 0;
Expand Down Expand Up @@ -116,7 +116,7 @@ namespace alfi::ratf {
*/
template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
std::enable_if_t<!traits::has_size<Number>::value, Number>
val(const RationalFunction<Number, Container>& rf, Number x) {
val(const RationalFunction<Number, Container>& rf, const Number& x) {
if (std::abs(x) <= 1) {
return val_mul(rf, x);
} else {
Expand Down Expand Up @@ -167,7 +167,7 @@ namespace alfi::ratf {
@return a pair `{numerator, denominator}` representing the Pade approximant; if an approximant does not exist, an empty pair is returned
*/
template <typename Number = DefaultNumber, template <typename, typename...> class Container = DefaultContainer>
RationalFunction<Number,Container> pade(Container<Number> P, SizeT n, SizeT m, Number epsilon = std::numeric_limits<Number>::epsilon()) {
RationalFunction<Number,Container> pade(Container<Number> P, SizeT n, SizeT m, const Number& epsilon = std::numeric_limits<Number>::epsilon()) {
if constexpr (std::is_signed_v<SizeT>) {
if (n < 0 || m < 0) {
return {{}, {}};
Expand Down
12 changes: 6 additions & 6 deletions ALFI/ALFI/spline/cubic.h
Original file line number Diff line number Diff line change
Expand Up @@ -527,25 +527,25 @@ namespace alfi::spline {
_coeffs = std::move(coeffs);
}

Number eval(Number x) const {
Number eval(const Number& x) const {
return eval(x, std::distance(_X.begin(), util::misc::first_leq_or_begin(_X.begin(), _X.end(), x)));
}
Number eval(Number x, SizeT segment) const {
Number eval(const Number& x, SizeT segment) const {
if (_coeffs.empty()) {
return NAN;
} else if (_coeffs.size() == 1) {
return _coeffs[0];
}
segment = std::clamp(segment, static_cast<SizeT>(0), static_cast<SizeT>(_X.size() - 2));
x = x - _X[segment];
return ((_coeffs[4*segment] * x + _coeffs[4*segment+1]) * x + _coeffs[4*segment+2]) * x + _coeffs[4*segment+3];
const Number x_seg = x - _X[segment];
return ((_coeffs[4*segment] * x_seg + _coeffs[4*segment+1]) * x_seg + _coeffs[4*segment+2]) * x_seg + _coeffs[4*segment+3];
}

Container<Number> eval(const Container<Number>& xx, bool sorted = true) const {
Container<Number> result(xx.size());
if (sorted) {
for (SizeT i = 0, i_x = 0; i < xx.size(); ++i) {
const Number x = xx[i];
const Number& x = xx[i];
while (i_x + 1 < _X.size() && x >= _X[i_x+1])
++i_x;
result[i] = eval(x, i_x);
Expand All @@ -558,7 +558,7 @@ namespace alfi::spline {
return result;
}

Number operator()(Number x) const {
Number operator()(const Number& x) const {
return eval(x);
}
Container<Number> operator()(const Container<Number>& xx) const {
Expand Down
12 changes: 6 additions & 6 deletions ALFI/ALFI/spline/linear.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,25 +76,25 @@ namespace alfi::spline {
_coeffs = std::move(coeffs);
}

Number eval(Number x) const {
Number eval(const Number& x) const {
return eval(x, std::distance(_X.begin(), util::misc::first_leq_or_begin(_X.begin(), _X.end(), x)));
}
Number eval(Number x, SizeT segment) const {
Number eval(const Number& x, SizeT segment) const {
if (_coeffs.empty()) {
return NAN;
} else if (_coeffs.size() == 1) {
return _coeffs[0];
}
segment = std::clamp(segment, static_cast<SizeT>(0), static_cast<SizeT>(_X.size() - 2));
x = x - _X[segment];
return _coeffs[2*segment] * x + _coeffs[2*segment+1];
const Number x_seg = x - _X[segment];
return _coeffs[2*segment] * x_seg + _coeffs[2*segment+1];
}

Container<Number> eval(const Container<Number>& xx, bool sorted = true) const {
Container<Number> result(xx.size());
if (sorted) {
for (SizeT i = 0, i_x = 0; i < xx.size(); ++i) {
const Number x = xx[i];
const Number& x = xx[i];
while (i_x + 1 < _X.size() && x >= _X[i_x+1])
++i_x;
result[i] = eval(x, i_x);
Expand All @@ -107,7 +107,7 @@ namespace alfi::spline {
return result;
}

Number operator()(Number x) const {
Number operator()(const Number& x) const {
return eval(x);
}
Container<Number> operator()(const Container<Number>& xx) const {
Expand Down
12 changes: 6 additions & 6 deletions ALFI/ALFI/spline/polyeqv.h
Original file line number Diff line number Diff line change
Expand Up @@ -161,10 +161,10 @@ namespace alfi::spline {
_coeffs = std::move(coeffs);
}

Number eval(Number x) const {
Number eval(const Number& x) const {
return eval(x, std::distance(_X.begin(), util::misc::first_leq_or_begin(_X.begin(), _X.end(), x)));
}
Number eval(Number x, SizeT segment) const {
Number eval(const Number& x, SizeT segment) const {
if (_coeffs.empty()) {
return NAN;
} else if (_coeffs.size() == 1) {
Expand All @@ -173,7 +173,7 @@ namespace alfi::spline {

segment = std::clamp(segment, static_cast<SizeT>(0), static_cast<SizeT>(_X.size() - 2));

x = x - _X[segment];
const Number x_seg = x - _X[segment];

const SizeT n = _X.size();

Expand All @@ -191,7 +191,7 @@ namespace alfi::spline {
}

for (SizeT i = 1; i < n; ++i) {
result *= x;
result *= x_seg;
Number current = _coeffs[segment*n+i];
if (std::isnan(current)) {
switch (_evaluation_type) {
Expand All @@ -215,7 +215,7 @@ namespace alfi::spline {
Container<Number> result(xx.size());
if (sorted) {
for (SizeT i = 0, i_x = 0; i < xx.size(); ++i) {
const Number x = xx[i];
const Number& x = xx[i];
while (i_x + 1 < _X.size() && x >= _X[i_x+1])
++i_x;
result[i] = eval(x, i_x);
Expand All @@ -228,7 +228,7 @@ namespace alfi::spline {
return result;
}

Number operator()(Number x) const {
Number operator()(const Number& x) const {
return eval(x);
}
Container<Number> operator()(const Container<Number>& xx) const {
Expand Down
Loading