LSST Applications g0f08755f38+9c285cab97,g1635faa6d4+13f3999e92,g1653933729+a8ce1bb630,g1a0ca8cf93+bf6eb00ceb,g28da252d5a+0829b12dee,g29321ee8c0+5700dc9eac,g2bbee38e9b+9634bc57db,g2bc492864f+9634bc57db,g2cdde0e794+c2c89b37c4,g3156d2b45e+41e33cbcdc,g347aa1857d+9634bc57db,g35bb328faa+a8ce1bb630,g3a166c0a6a+9634bc57db,g3e281a1b8c+9f2c4e2fc3,g414038480c+077ccc18e7,g41af890bb2+fde0dd39b6,g5fbc88fb19+17cd334064,g781aacb6e4+a8ce1bb630,g80478fca09+55a9465950,g82479be7b0+d730eedb7d,g858d7b2824+9c285cab97,g9125e01d80+a8ce1bb630,g9726552aa6+10f999ec6a,ga5288a1d22+2a84bb7594,gacf8899fa4+c69c5206e8,gae0086650b+a8ce1bb630,gb58c049af0+d64f4d3760,gc28159a63d+9634bc57db,gcf0d15dbbd+4b7d09cae4,gda3e153d99+9c285cab97,gda6a2b7d83+4b7d09cae4,gdaeeff99f8+1711a396fd,ge2409df99d+5e831397f4,ge79ae78c31+9634bc57db,gf0baf85859+147a0692ba,gf3967379c6+41c94011de,gf3fb38a9a8+8f07a9901b,gfb92a5be7c+9c285cab97,w.2024.46
LSST Data Management Base Package
Loading...
Searching...
No Matches
Public Types | Public Member Functions | List of all members
lsst::geom::polynomials::RecurrenceBasis1d< Recurrence > Class Template Reference

A basis for 1-d series expansions defined by a recurrence relation. More...

#include <RecurrenceBasis1d.h>

Public Types

using Function = Function1d<RecurrenceBasis1d>
 A Function1d object that uses this basis.
 
using Scaled = ScaledBasis1d<RecurrenceBasis1d>
 The type returned by scale().
 

Public Member Functions

 RecurrenceBasis1d (std::size_t order) noexcept
 Construct a basis with the given order (inclusive).
 
 RecurrenceBasis1d (RecurrenceBasis1d const &)=default
 Default copy constructor.
 
 RecurrenceBasis1d (RecurrenceBasis1d &&)=default
 Default move constructor.
 
RecurrenceBasis1doperator= (RecurrenceBasis1d const &)=default
 Default copy assignment.
 
RecurrenceBasis1doperator= (RecurrenceBasis1d &&)=default
 Default move assignment.
 
std::size_t getOrder () const noexcept
 Return the order of the basis.
 
std::size_t size () const noexcept
 Return the number of elements in the basis.
 
Scaled scaled (Scaling1d const &scaling) const noexcept
 Return a scaled basis with the same order and recurrence.
 
template<typename Vector >
double sumWith (double x, Vector const &coefficients, SumMode mode=SumMode::FAST) const
 Evaluate a basis expansion with the given coefficients.
 
template<typename Vector >
void fill (double x, Vector &&basis) const
 Evaluate the basis at a given point.
 

Detailed Description

template<typename Recurrence>
class lsst::geom::polynomials::RecurrenceBasis1d< Recurrence >

A basis for 1-d series expansions defined by a recurrence relation.

The recurrence relations utilized by RecurrenceBasis1d must have the following form:

\[ B_{n+1}(x) = R(x, n, B_n(x), B_{n-1}(x)) \]

with explicit expressions for \(B_0(x)\) and \(B_1(x)\) also given. This includes all special polynomials (e.g. Chebyshev, Legendre, Hermite, Laguerre) and products of special polynomials with their natural weight functions (e.g. Gauss-Hermite functions). The template parameter must be a model of the Recurrence concept.

RecurrenceBasis1d is a model of the Basis1d concept.

Definition at line 85 of file RecurrenceBasis1d.h.

Member Typedef Documentation

◆ Function

A Function1d object that uses this basis.

Definition at line 89 of file RecurrenceBasis1d.h.

◆ Scaled

The type returned by scale().

Definition at line 92 of file RecurrenceBasis1d.h.

Constructor & Destructor Documentation

◆ RecurrenceBasis1d() [1/3]

template<typename Recurrence >
lsst::geom::polynomials::RecurrenceBasis1d< Recurrence >::RecurrenceBasis1d ( std::size_t order)
inlineexplicitnoexcept

Construct a basis with the given order (inclusive).

Definition at line 95 of file RecurrenceBasis1d.h.

95 :
96 _order(order)
97 {}
table::Key< int > order

◆ RecurrenceBasis1d() [2/3]

template<typename Recurrence >
lsst::geom::polynomials::RecurrenceBasis1d< Recurrence >::RecurrenceBasis1d ( RecurrenceBasis1d< Recurrence > const & )
default

Default copy constructor.

◆ RecurrenceBasis1d() [3/3]

template<typename Recurrence >
lsst::geom::polynomials::RecurrenceBasis1d< Recurrence >::RecurrenceBasis1d ( RecurrenceBasis1d< Recurrence > && )
default

Default move constructor.

Member Function Documentation

◆ fill()

template<typename Recurrence >
template<typename Vector >
void lsst::geom::polynomials::RecurrenceBasis1d< Recurrence >::fill ( double x,
Vector && basis ) const
inline

Evaluate the basis at a given point.

Parameters
[in]xPoint at which to evaluate the basis functions.
[out]basisOutput vector. See Basis1d::fill more information.
Exception Safety
Does not throw unless coefficients[n] does, and provides basic exception safety if it does.

Definition at line 187 of file RecurrenceBasis1d.h.

187 {
188 std::forward<Vector>(basis)[0] = Recurrence::getB0(x);
189 if (_order > 0u) {
190 std::forward<Vector>(basis)[1] = Recurrence::getB1(x);
191 for (std::size_t n = 2; n <= _order; ++n) {
192 std::forward<Vector>(basis)[n] = Recurrence::next(
193 x, n,
194 std::forward<Vector>(basis)[n - 1],
195 std::forward<Vector>(basis)[n - 2]
196 );
197 }
198 }
199 }
table::Key< table::Array< double > > basis
Definition PsfexPsf.cc:365
static double getB1(double x)
Return the first element of the basis, .
static double next(double x, std::size_t n, double current, double previous)
Return the next element in the recurrence.
static double getB0(double x)
Return the zeroth element of the basis, .

◆ getOrder()

template<typename Recurrence >
std::size_t lsst::geom::polynomials::RecurrenceBasis1d< Recurrence >::getOrder ( ) const
inlinenoexcept

Return the order of the basis.

Definition at line 112 of file RecurrenceBasis1d.h.

112{ return _order; }

◆ operator=() [1/2]

Default move assignment.

◆ operator=() [2/2]

Default copy assignment.

◆ scaled()

template<typename Recurrence >
Scaled lsst::geom::polynomials::RecurrenceBasis1d< Recurrence >::scaled ( Scaling1d const & scaling) const
inlinenoexcept

Return a scaled basis with the same order and recurrence.

The scaled basis will transform all points by the given scaling before evaluating the basis functions in the same way as this.

Definition at line 123 of file RecurrenceBasis1d.h.

123 {
124 return Scaled(*this, scaling);
125 }
table::Key< double > scaling
ScaledBasis1d< RecurrenceBasis1d > Scaled
The type returned by scale().

◆ size()

template<typename Recurrence >
std::size_t lsst::geom::polynomials::RecurrenceBasis1d< Recurrence >::size ( ) const
inlinenoexcept

Return the number of elements in the basis.

Definition at line 115 of file RecurrenceBasis1d.h.

115{ return _order + 1; }

◆ sumWith()

template<typename Recurrence >
template<typename Vector >
double lsst::geom::polynomials::RecurrenceBasis1d< Recurrence >::sumWith ( double x,
Vector const & coefficients,
SumMode mode = SumMode::FAST ) const
inline

Evaluate a basis expansion with the given coefficients.

If the basis elements are \(B_n(x)\) and the given coefficients are a vector \(a_n\), this computes

\[ \sum_{n = 0}^{n \le N} a_n B_n(x) \]

Parameters
[in]xPoint at which to evaluate the expansion.
[in]coefficientsCoefficients vector. See Basis1d::sumWith for more information.
[in]modeEnum indicating the tradeoff to make between speed and numerical precision.
Exception Safety
Does not throw unless coefficients[n] does, and provides the same exception safety as it if it does.

Definition at line 146 of file RecurrenceBasis1d.h.

146 {
147 // This universal lambda lets us effectively template most of the
148 // implementation of this function on double vs. SafeSum<double>
149 // without having to define an external template.
150 auto accumulate = [x, coefficients, this](auto & sum) {
151 double previous = Recurrence::getB0(x);
152 if (_order > 0u) {
153 double current = Recurrence::getB1(x);
154 sum += coefficients[1]*current;
155 for (std::size_t n = 2; n <= _order; ++n) {
156 double next = Recurrence::next(x, n, current, previous);
157 sum += coefficients[n]*next;
158 previous = current;
159 current = next;
160 }
161 }
162 };
163 double result = 0.0;
164 if (mode == SumMode::FAST) {
165 double z = Recurrence::getB0(x)*coefficients[0];
166 accumulate(z);
167 result = z;
168 } else {
169 SafeSum<double> z(Recurrence::getB0(x)*coefficients[0]);
170 accumulate(z);
171 result = static_cast<double>(z);
172 }
173 return result;
174 }
py::object result
Definition _schema.cc:429
ndarray::Array< double const, 2, 2 > coefficients
double z
Definition Match.cc:44
T accumulate(T... args)
@ FAST
Summation using regular floating-point addition.
T next(T... args)

The documentation for this class was generated from the following file: