Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
34028cf
Change integrate function parameter to rvalue reference
alexandrehoffmann Jul 24, 2026
14f34a9
Change function parameter type to rvalue reference
alexandrehoffmann Jul 24, 2026
ac6d11c
Change function parameter from const& to &&
alexandrehoffmann Jul 24, 2026
fe08501
Change integrate function parameter to rvalue reference
alexandrehoffmann Jul 24, 2026
0a17d59
Change function parameter type from const& to &&
alexandrehoffmann Jul 24, 2026
8d3f3fd
Change Function parameter to rvalue reference
alexandrehoffmann Jul 24, 2026
b8670f9
Change function parameter types to rvalue references
alexandrehoffmann Jul 24, 2026
30a2fcf
Change function parameter from const reference to rvalue reference
alexandrehoffmann Jul 24, 2026
fac7039
Change function parameter types to rvalue references
alexandrehoffmann Jul 24, 2026
b0991c6
Change Function parameter to rvalue reference in methods
alexandrehoffmann Jul 24, 2026
d2d4f51
Change function parameter from const& to &&
alexandrehoffmann Jul 24, 2026
256d392
Change function parameter from const& to &&
alexandrehoffmann Jul 24, 2026
6b193a4
Change function parameter types to rvalue references
alexandrehoffmann Jul 24, 2026
5054a53
Change function parameter from const& to &&
alexandrehoffmann Jul 24, 2026
e45d8b5
Fix inner_product range in GaussLaguerreQuadrature
alexandrehoffmann Jul 24, 2026
7cfb75e
Fix lambda capture in GaussLaguerreQuadrature methods
alexandrehoffmann Jul 24, 2026
e86d628
Fix inner_product call to use fx.begin()
alexandrehoffmann Jul 24, 2026
740eb24
Refactor integration logic for clarity and safety
alexandrehoffmann Jul 24, 2026
94f9aab
Use std::forward in estimateIntegral function
alexandrehoffmann Jul 24, 2026
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
18 changes: 9 additions & 9 deletions include/LNIT/AdaptiveQuadratures/AdaptiveQuadratureBase.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ class AdaptiveQuadratureBase
*
* @return Pair (integral, estimated error).
*/
template<class Function> constexpr std::pair<LongScalar, LongScalar> estimateIntegral(const Function& f, const Scalar& xmin, const Scalar& xmax) { return derived().estimateIntegralImpl(f, xmin, xmax); }
template<class Function> constexpr std::pair<LongScalar, LongScalar> estimateIntegral(Function&& f, const Scalar& xmin, const Scalar& xmax) { return derived().estimateIntegralImpl(std::forward<Function>(f), xmin, xmax); }

/**
* @brief Perform adaptive quadrature on [xmin, xmax].
Expand All @@ -75,9 +75,9 @@ class AdaptiveQuadratureBase
* @param xmax Upper bound of interval.
* @return Approximation of the integral.
*/
template<class Function> LongScalar integrate(const Function& f, const Scalar& xmin, const Scalar& xmax);
template<class Function> LongScalar integrate(Function&& f, const Scalar& xmin, const Scalar& xmax);

template<class Function> LongScalar integrateWithHints(const Function& f, const std::span<const Scalar> mu, const Scalar& sigma);
template<class Function> LongScalar integrateWithHints(Function&& f, const std::span<const Scalar> mu, const Scalar& sigma);

/**
* @brief Perform adaptive quadrature on (-inf, xmax].
Expand All @@ -94,7 +94,7 @@ class AdaptiveQuadratureBase
* @param xmax Upper bound of interval.
* @return Approximation of the integral.
*/
template<class Function> LongScalar integrateLeftInfinite(const Function& f, const Scalar& xmax);
template<class Function> LongScalar integrateLeftInfinite(Function&& f, const Scalar& xmax);

/**
* @brief Perform adaptive quadrature on [xmin, inf).
Expand All @@ -111,7 +111,7 @@ class AdaptiveQuadratureBase
* @param xmax Upper bound of interval.
* @return Approximation of the integral.
*/
template<class Function> LongScalar integrateRightInfinite(const Function& f, const Scalar& xmin);
template<class Function> LongScalar integrateRightInfinite(Function&& f, const Scalar& xmin);

/**
* @brief Perform adaptive quadrature on (-inf, inf).
Expand All @@ -126,7 +126,7 @@ class AdaptiveQuadratureBase
* \f]
* Finally addapt the quadrature over [xmin, xmax].
*/
template<class Function> LongScalar integrate(const Function& f);
template<class Function> LongScalar integrate(Function&& f);

/**
* @brief Perform adaptive quadrature on (-inf, inf) using a coordinate-remapping technique.
Expand All @@ -141,9 +141,9 @@ class AdaptiveQuadratureBase
* \int_{-1}^{1} f(x(t))\frac{1 + t^2}{(1 - t^2)^2} dt.
* \f]
*/
template<class Function> LongScalar remapAndIntegrate(const Function& f);
template<class Function> LongScalar remapAndIntegrate(Function&& f);

template<class Function> std::invoke_result_t<Function, Scalar> integrateWithoutAdaptation(const Function& f) const;
template<class Function> std::invoke_result_t<Function, Scalar> integrateWithoutAdaptation(Function&& f) const;

constexpr Size getMaxIt() const { return m_maxIt; } ///< @brief Maximum iterations allowed.
constexpr Size getNits() const { return m_it; } ///< @brief Number of iterations performed.
Expand All @@ -170,7 +170,7 @@ class AdaptiveQuadratureBase

constexpr std::span<const Interval> getSubIntervals() const { return m_intervals; }
private:
template<class Function> LongScalar adaptQuadrature(const Function& func);
template<class Function> LongScalar adaptQuadrature(Function&& func);

std::vector<Interval> m_intervals;
std::vector<LongScalar> m_subIntergrals;
Expand Down
56 changes: 33 additions & 23 deletions include/LNIT/AdaptiveQuadratures/AdaptiveQuadratureBase_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <algorithm>
#include <ranges>
#include <cmath>
#include <utility>

#include <fmt/core.h>

Expand All @@ -28,7 +29,7 @@ AdaptiveQuadratureBase<Derived>::AdaptiveQuadratureBase(const Size& maxIt, const
}

template<class Derived> template<class Function>
auto AdaptiveQuadratureBase<Derived>::adaptQuadrature(const Function& f) -> LongScalar
auto AdaptiveQuadratureBase<Derived>::adaptQuadrature(Function&& f) -> LongScalar
{
using std::abs;
using std::isfinite;
Expand Down Expand Up @@ -72,7 +73,7 @@ auto AdaptiveQuadratureBase<Derived>::adaptQuadrature(const Function& f) -> Long
}

template<class Derived> template<class Function>
auto AdaptiveQuadratureBase<Derived>::integrate(const Function& f, const Scalar& xmin, const Scalar& xmax) -> LongScalar
auto AdaptiveQuadratureBase<Derived>::integrate(Function&& f, const Scalar& xmin, const Scalar& xmax) -> LongScalar
{
using std::ceil;

Expand Down Expand Up @@ -102,11 +103,11 @@ auto AdaptiveQuadratureBase<Derived>::integrate(const Function& f, const Scalar&
}

if (m_out) { fmt::print(m_out, "#NumericalIntegrator adapting quadrature over [{}, {}]\n", xmin, xmax); }
return adaptQuadrature(f);
return adaptQuadrature(std::forward<Function>(f));
Comment thread
alexandrehoffmann marked this conversation as resolved.
}

template<class Derived> template<class Function>
auto AdaptiveQuadratureBase<Derived>::integrateWithHints(const Function& f, const std::span<const Scalar> mu, const Scalar& sigma) -> LongScalar
auto AdaptiveQuadratureBase<Derived>::integrateWithHints(Function&& f, const std::span<const Scalar> mu, const Scalar& sigma) -> LongScalar
{
using std::abs;
using std::isfinite;
Expand Down Expand Up @@ -182,11 +183,11 @@ auto AdaptiveQuadratureBase<Derived>::integrateWithHints(const Function& f, cons
}

if (m_out) { fmt::print(m_out, "#NumericalIntegrator adapting quadrature over {}\n", m_intervals); }
return adaptQuadrature(f);
return adaptQuadrature(std::forward<Function>(f));
}

template<class Derived> template<class Function>
auto AdaptiveQuadratureBase<Derived>::integrateLeftInfinite(const Function& f, const Scalar& xmax) -> LongScalar
auto AdaptiveQuadratureBase<Derived>::integrateLeftInfinite(Function&& f, const Scalar& xmax) -> LongScalar
{
using std::isfinite;
using std::abs;
Expand All @@ -200,11 +201,15 @@ auto AdaptiveQuadratureBase<Derived>::integrateLeftInfinite(const Function& f, c
xmin *= 2;
leftIntegral = gLaguerreQuad.integrateLeftInfinite(f, xmin);
}
return isfinite(leftIntegral) ? integrate(f, xmin, xmax) : NumTraits<LongScalar>::NaN;
const LongScalar ret = isfinite(leftIntegral)
? integrate(std::forward<Function>(f), xmin, xmax)
: NumTraits<LongScalar>::NaN;

return ret;
}

template<class Derived> template<class Function>
auto AdaptiveQuadratureBase<Derived>::integrateRightInfinite(const Function& f, const Scalar& xmin) -> LongScalar
auto AdaptiveQuadratureBase<Derived>::integrateRightInfinite(Function&& f, const Scalar& xmin) -> LongScalar
{
using std::isfinite;
using std::abs;
Expand All @@ -218,11 +223,15 @@ auto AdaptiveQuadratureBase<Derived>::integrateRightInfinite(const Function& f,
xmax *= 2;
rightIntegral = gLaguerreQuad.integrateRightInfinite(f, xmax);
}
return isfinite(rightIntegral) ? integrate(f, xmin, xmax) : NumTraits<LongScalar>::NaN;
const LongScalar ret = isfinite(rightIntegral)
? integrate(std::forward<Function>(f), xmin, xmax)
: NumTraits<LongScalar>::NaN;

return ret;
}

template<class Derived> template<class Function>
auto AdaptiveQuadratureBase<Derived>::integrate(const Function& f) -> LongScalar
auto AdaptiveQuadratureBase<Derived>::integrate(Function&& f) -> LongScalar
{
using std::isfinite;
using std::abs;
Expand All @@ -237,31 +246,32 @@ auto AdaptiveQuadratureBase<Derived>::integrate(const Function& f) -> LongScalar
leftIntegral = gLaguerreQuad.integrateLeftInfinite(f, xmin);
}

return isfinite(leftIntegral) ? integrateRightInfinite(f, xmin) : NumTraits<LongScalar>::NaN;
const LongScalar ret = isfinite(leftIntegral)
? integrateRightInfinite(std::forward<Function>(f), xmin)
: NumTraits<LongScalar>::NaN;

return ret;
}

template<class Derived> template<class Function>
auto AdaptiveQuadratureBase<Derived>::remapAndIntegrate(const Function& f) -> LongScalar
auto AdaptiveQuadratureBase<Derived>::remapAndIntegrate(Function&& f) -> LongScalar
{
using std::isnan;

constexpr Scalar eps = {};

const auto fref = [&f](const Scalar t) -> LongScalar
return integrate([&f](const Scalar t) -> LongScalar
{
const LongScalar fx = f(t / (1 - t*t));
const Scalar dxdt = (1 + t*t) / ((1 - t*t)*(1 - t*t));

return isnan(fx*dxdt)
const LongScalar fx = f(t / (1 - t*t));
const Scalar dxdt = (1 + t*t) / ((1 - t*t)*(1 - t*t));
const LongScalar ret = isnan(fx*dxdt)
? LongScalar{}
: fx*dxdt;
};

return integrate(fref, -1, 1);
return ret;
}, -1, 1);
}

template<class Derived> template<class Function>
auto AdaptiveQuadratureBase<Derived>::integrateWithoutAdaptation(const Function& f) const -> std::invoke_result_t<Function, Scalar>
auto AdaptiveQuadratureBase<Derived>::integrateWithoutAdaptation(Function&& f) const -> std::invoke_result_t<Function, Scalar>
{
const auto localIntegrals = m_intervals | std::views::transform([&self = derived(), &f](const Interval& interval) -> std::invoke_result_t<Function, Scalar>
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@ class ClenshawCurtisAdaptiveQuadrature : public AdaptiveQuadratureBase< Clenshaw
* @param xmax Upper bound.
* @return Pair (integral, estimated error).
*/
template<class Function> constexpr std::pair<LongScalar, LongScalar> estimateIntegralImpl(const Function& f, const Scalar& xmin, const Scalar& xmax);
template<class Function> constexpr std::pair<LongScalar, LongScalar> estimateIntegralImpl(Function&& f, const Scalar& xmin, const Scalar& xmax);

template<class Function> constexpr std::invoke_result_t<Function, Scalar> integrateImpl(const Function& f, const Scalar& xmin, const Scalar& xmax) const;
template<class Function> constexpr std::invoke_result_t<Function, Scalar> integrateImpl(Function&& f, const Scalar& xmin, const Scalar& xmax) const;

constexpr Scalar getMaxDeltaXImpl(const Scalar& xmin, const Scalar& xmax) const { return (xmax - xmin)*misc::maxDiff(std::span{s_xi}); }
private:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ extern template class ClenshawCurtisAdaptiveQuadrature<long double, long double>
//// method implementations ////

template<typename T, typename TT> template<class Function>
constexpr auto ClenshawCurtisAdaptiveQuadrature<T,TT>::estimateIntegralImpl(const Function& f, const Scalar& xmin, const Scalar& xmax) -> std::pair<LongScalar, LongScalar>
constexpr auto ClenshawCurtisAdaptiveQuadrature<T,TT>::estimateIntegralImpl(Function&& f, const Scalar& xmin, const Scalar& xmax) -> std::pair<LongScalar, LongScalar>
{
using std::abs;

Expand Down Expand Up @@ -52,7 +52,7 @@ constexpr auto ClenshawCurtisAdaptiveQuadrature<T,TT>::estimateIntegralImpl(cons
}

template<typename T, typename TT> template<class Function>
constexpr auto ClenshawCurtisAdaptiveQuadrature<T,TT>::integrateImpl(const Function& f, const Scalar& xmin, const Scalar& xmax) const -> std::invoke_result_t<Function, Scalar>
constexpr auto ClenshawCurtisAdaptiveQuadrature<T,TT>::integrateImpl(Function&& f, const Scalar& xmin, const Scalar& xmax) const -> std::invoke_result_t<Function, Scalar>
{
const auto fx = s_xi | std::views::transform([&f, &xmin, &xmax](const Scalar& xi) -> std::invoke_result_t<Function, Scalar>
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,9 @@ class ClenshawCurtisHybridAdaptiveQuadrature : public AdaptiveQuadratureBase< Cl
* @param xmax Upper bound.
* @return Pair (integral, estimated error).
*/
template<class Function> constexpr std::pair<LongScalar, LongScalar> estimateIntegralImpl(const Function& f, const Scalar& xmin, const Scalar& xmax);
template<class Function> constexpr std::pair<LongScalar, LongScalar> estimateIntegralImpl(Function&& f, const Scalar& xmin, const Scalar& xmax);

template<class Function> constexpr std::invoke_result_t<Function, Scalar> integrateImpl(const Function& f, const Scalar& xmin, const Scalar& xmax) const;
template<class Function> constexpr std::invoke_result_t<Function, Scalar> integrateImpl(Function&& f, const Scalar& xmin, const Scalar& xmax) const;

constexpr Scalar getMaxDeltaXImpl(const Scalar& xmin, const Scalar& xmax) const { return (xmax - xmin)*misc::maxDiff(std::span{s_xi}); }
private:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ extern template class ClenshawCurtisHybridAdaptiveQuadrature<long double, long d
//// method implementations ////

template<typename T, typename TT> template<class Function>
constexpr auto ClenshawCurtisHybridAdaptiveQuadrature<T,TT>::estimateIntegralImpl(const Function& f, const Scalar& xmin, const Scalar& xmax) -> std::pair<LongScalar, LongScalar>
constexpr auto ClenshawCurtisHybridAdaptiveQuadrature<T,TT>::estimateIntegralImpl(Function&& f, const Scalar& xmin, const Scalar& xmax) -> std::pair<LongScalar, LongScalar>
{
using std::abs;

Expand All @@ -38,7 +38,7 @@ constexpr auto ClenshawCurtisHybridAdaptiveQuadrature<T,TT>::estimateIntegralImp
}

template<typename T, typename TT> template<class Function>
constexpr auto ClenshawCurtisHybridAdaptiveQuadrature<T,TT>::integrateImpl(const Function& f, const Scalar& xmin, const Scalar& xmax) const -> std::invoke_result_t<Function, Scalar>
constexpr auto ClenshawCurtisHybridAdaptiveQuadrature<T,TT>::integrateImpl(Function&& f, const Scalar& xmin, const Scalar& xmax) const -> std::invoke_result_t<Function, Scalar>
{
const auto fx = s_xi | std::views::transform([&f, &xmin, &xmax](const Scalar& xi) -> std::invoke_result_t<Function, Scalar>
{
Expand Down
4 changes: 2 additions & 2 deletions include/LNIT/AdaptiveQuadratures/GLCCAdaptiveQuadrature.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@ class GLCCAdaptiveQuadrature : public AdaptiveQuadratureBase< GLCCAdaptiveQuadra
* @param xmax Upper bound.
* @return Pair (integral, estimated error).
*/
template<class Function> constexpr std::pair<LongScalar, LongScalar> estimateIntegralImpl(const Function& f, const Scalar& xmin, const Scalar& xmax) const;
template<class Function> constexpr std::pair<LongScalar, LongScalar> estimateIntegralImpl(Function&& f, const Scalar& xmin, const Scalar& xmax) const;

template<class Function> constexpr std::invoke_result_t<Function, Scalar> integrateImpl(const Function& f, const Scalar& xmin, const Scalar& xmax) const;
template<class Function> constexpr std::invoke_result_t<Function, Scalar> integrateImpl(Function&& f, const Scalar& xmin, const Scalar& xmax) const;

constexpr Scalar getMaxDeltaXImpl(const Scalar xmin, const Scalar xmax) const { return (xmax - xmin)*misc::maxDiff(std::span{s_xi_cc}); }
private:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ extern template class GLCCAdaptiveQuadrature<long double, long double>;
//// method implementations ////

template<typename T, typename TT> template<class Function>
constexpr auto GLCCAdaptiveQuadrature<T,TT>::estimateIntegralImpl(const Function& f, const Scalar& xmin, const Scalar& xmax) const -> std::pair<LongScalar, LongScalar>
constexpr auto GLCCAdaptiveQuadrature<T,TT>::estimateIntegralImpl(Function&& f, const Scalar& xmin, const Scalar& xmax) const -> std::pair<LongScalar, LongScalar>
{
using std::abs;

Expand All @@ -43,7 +43,7 @@ constexpr auto GLCCAdaptiveQuadrature<T,TT>::estimateIntegralImpl(const Function
}

template<typename T, typename TT> template<class Function>
constexpr auto GLCCAdaptiveQuadrature<T,TT>::integrateImpl(const Function& f, const Scalar& xmin, const Scalar& xmax) const -> std::invoke_result_t<Function, Scalar>
constexpr auto GLCCAdaptiveQuadrature<T,TT>::integrateImpl(Function&& f, const Scalar& xmin, const Scalar& xmax) const -> std::invoke_result_t<Function, Scalar>
{
const auto fx = s_xi_gl | std::views::transform([&f, &xmin, &xmax](const Scalar& xi) -> std::invoke_result_t<Function, Scalar>
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ class GaussLegendreAdaptiveQuadrature : public AdaptiveQuadratureBase< GaussLege
* @param xmax Upper bound.
* @return Pair (integral, estimated error).
*/
template<class Function> constexpr std::pair<LongScalar, LongScalar> estimateIntegralImpl(const Function& f, const Scalar& xmin, const Scalar& xmax);
template<class Function> constexpr std::pair<LongScalar, LongScalar> estimateIntegralImpl(Function&& f, const Scalar& xmin, const Scalar& xmax);

template<class Function> constexpr std::invoke_result_t<Function, Scalar> integrateImpl(const Function& f, const Scalar& xmin, const Scalar& xmax) const;
template<class Function> constexpr std::invoke_result_t<Function, Scalar> integrateImpl(Function&& f, const Scalar& xmin, const Scalar& xmax) const;

inline constexpr Scalar getMaxDeltaXImpl(const Scalar xmin, const Scalar xmax) const { return (xmax - xmin)*misc::maxDiff(std::span{s_xi}); }
private:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ extern template class GaussLegendreAdaptiveQuadrature<long double, long double>;
//// method implementations ////

template<typename T, typename TT> template<class Function>
constexpr auto GaussLegendreAdaptiveQuadrature<T,TT>::estimateIntegralImpl(const Function& f, const Scalar& xmin, const Scalar& xmax) -> std::pair<LongScalar, LongScalar>
constexpr auto GaussLegendreAdaptiveQuadrature<T,TT>::estimateIntegralImpl(Function&& f, const Scalar& xmin, const Scalar& xmax) -> std::pair<LongScalar, LongScalar>
{
using std::abs;

Expand All @@ -43,7 +43,7 @@ constexpr auto GaussLegendreAdaptiveQuadrature<T,TT>::estimateIntegralImpl(const
}

template<typename T, typename TT> template<class Function>
constexpr auto GaussLegendreAdaptiveQuadrature<T,TT>::integrateImpl(const Function& f, const Scalar& xmin, const Scalar& xmax) const -> std::invoke_result_t<Function, Scalar>
constexpr auto GaussLegendreAdaptiveQuadrature<T,TT>::integrateImpl(Function&& f, const Scalar& xmin, const Scalar& xmax) const -> std::invoke_result_t<Function, Scalar>
{
const auto fx = s_xi | std::views::transform([&f, &xmin, &xmax](const Scalar& xi) -> std::invoke_result_t<Function, Scalar>
{
Expand Down
2 changes: 1 addition & 1 deletion include/LNIT/GaussHermiteQuadrature.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class GaussHermiteQuadrature

constexpr GaussHermiteQuadrature() {} ///< @brief Default constructor.

template<class Function> constexpr LongScalar integrate(const Function& f) const;
template<class Function> constexpr LongScalar integrate(Function&& f) const;
private:
static constexpr std::array<Scalar, 66> s_wi = {
Scalar(0.72500244352094499799), Scalar(0.55908539234713480356), Scalar(0.48645731979545141956), Scalar(0.44287166385270444111), Scalar(0.41289257970879246181),
Expand Down
4 changes: 2 additions & 2 deletions include/LNIT/GaussHermiteQuadrature_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,14 @@ extern template class GaussHermiteQuadrature<long double, long double>;
//// method implementations ////

template<typename Scalar, typename LongScalar> template<class Function>
constexpr LongScalar GaussHermiteQuadrature<Scalar, LongScalar>::integrate(const Function& f) const
constexpr LongScalar GaussHermiteQuadrature<Scalar, LongScalar>::integrate(Function&& f) const
{
const auto fx = s_xi | std::views::transform([&f](const Scalar& x) -> LongScalar
{
return f(x);
});

return std::inner_product(s_wi.begin(), s_wi.end(), fx.end(), LongScalar{});
return std::inner_product(s_wi.begin(), s_wi.end(), fx.begin(), LongScalar{});
}

} // namespace LNIT
Expand Down
4 changes: 2 additions & 2 deletions include/LNIT/GaussLaguerreQuadrature.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class GaussLaguerreQuadrature
* @param a Upper bound of integration (default = 0).
* @return Approximated integral value.
*/
template<class Function> constexpr LongScalar integrateLeftInfinite (const Function& f, const Scalar& a = Scalar{}) const;
template<class Function> constexpr LongScalar integrateLeftInfinite (Function&& f, const Scalar& a = Scalar{}) const;
/**
* @brief Approximate integral over the right semi-infinite interval.
*
Expand All @@ -53,7 +53,7 @@ class GaussLaguerreQuadrature
* @param a Lower bound of integration (default = 0).
* @return Approximated integral value.
*/
template<class Function> constexpr LongScalar integrateRightInfinite (const Function& f, const Scalar& a = Scalar{}) const;
template<class Function> constexpr LongScalar integrateRightInfinite (Function&& f, const Scalar& a = Scalar{}) const;
private:
static constexpr std::array<Scalar, 33> s_wi = {
Scalar(0.11077730587320757274), Scalar(0.25810528128189475158), Scalar(0.40622176868437369247), Scalar(0.55526230959922306292), Scalar(0.70555738765958285661),
Expand Down
Loading
Loading