LSST Applications  21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
Public Types | Public Member Functions | List of all members
lsst::geom::polynomials::ScaledBasis2d< Nested > Class Template Reference

A 2-d basis that transforms all input points before evaluating nested basis. More...

#include <ScaledBasis2d.h>

Public Types

using Function = Function2d< ScaledBasis2d >
 A Function2d object that uses this basis. More...
 
using Scaled = ScaledBasis2d< Nested >
 The type returned by scale(). More...
 
using Workspace = typename Nested::Workspace
 The type returned by makeWorkspace(). More...
 
using IndexRange = typename Nested::IndexRange
 The type returned by getIndices(). More...
 

Public Member Functions

 ScaledBasis2d (Nested const &nested, Scaling2d const &scaling)
 Construct a scaled basis from a nested basis and a scaling transform. More...
 
 ScaledBasis2d (std::size_t order, Box2D const &box)
 Construct a basis that remaps the given box to [-1, 1]x[-1, 1] before evaluating the nested polynomials polynomials. More...
 
 ScaledBasis2d (ScaledBasis2d const &)=default
 Default copy constructor. More...
 
 ScaledBasis2d (ScaledBasis2d &&)=default
 Default move constructor. More...
 
ScaledBasis2doperator= (ScaledBasis2d const &)=default
 Default copy assignment. More...
 
ScaledBasis2doperator= (ScaledBasis2d &&)=default
 Default move assignment. More...
 
Nested const & getNested () const noexcept
 Return the nested basis. More...
 
Scaling2d const & getScaling () const noexcept
 Return the scaling transform. More...
 
std::size_t getOrder () const
 Return the order of the basis. More...
 
std::size_t size () const
 Return the number of elements in the basis. More...
 
Scaled scaled (Scaling2d const &first) const
 Return a scaled basis that delegates to a copy of this. More...
 
int index (int x, int y) const
 Return the flattened index of the basis function with the given x and y orders. More...
 
IndexRange getIndices () const
 Return a range of iterators that dereference to Index2d. More...
 
Workspace makeWorkspace () const
 Allocate a workspace that can be passed to sumWith() and fill() to avoid repeated memory allocations. More...
 
template<typename Vector >
double sumWith (geom::Point2D const &point, Vector const &coefficients, SumMode mode=SumMode::FAST) const
 Evaluate a basis expansion with the given coefficients. More...
 
template<typename Vector >
double sumWith (geom::Point2D const &point, Vector const &coefficients, Workspace &workspace, SumMode mode=SumMode::FAST) const
 Evaluate a basis expansion with the given coefficients (external workspace version). More...
 
template<typename Vector >
void fill (geom::Point2D const &point, Vector &&basis) const
 Evaluate the basis at a given point. More...
 
template<typename Vector >
void fill (geom::Point2D const &point, Vector &&basis, Workspace &workspace) const
 Evaluate the basis at a given point (external workspace version). More...
 

Detailed Description

template<typename Nested>
class lsst::geom::polynomials::ScaledBasis2d< Nested >

A 2-d basis that transforms all input points before evaluating nested basis.

If the nested basis is defined by basis functions \(B_m(x)B_n(y)\), the scaled basis functions are \(B_m(U(x))B_n(V(y))\), where \(U(x)\) and \(V(y)\) together represent the scaling transform.

Both the nested basis and ScaledBasis2d itself are models of the Basis2d concept.

Definition at line 43 of file ScaledBasis2d.h.

Member Typedef Documentation

◆ Function

template<typename Nested >
using lsst::geom::polynomials::ScaledBasis2d< Nested >::Function = Function2d<ScaledBasis2d>

A Function2d object that uses this basis.

Definition at line 47 of file ScaledBasis2d.h.

◆ IndexRange

template<typename Nested >
using lsst::geom::polynomials::ScaledBasis2d< Nested >::IndexRange = typename Nested::IndexRange

The type returned by getIndices().

Definition at line 56 of file ScaledBasis2d.h.

◆ Scaled

template<typename Nested >
using lsst::geom::polynomials::ScaledBasis2d< Nested >::Scaled = ScaledBasis2d<Nested>

The type returned by scale().

Definition at line 50 of file ScaledBasis2d.h.

◆ Workspace

template<typename Nested >
using lsst::geom::polynomials::ScaledBasis2d< Nested >::Workspace = typename Nested::Workspace

The type returned by makeWorkspace().

Definition at line 53 of file ScaledBasis2d.h.

Constructor & Destructor Documentation

◆ ScaledBasis2d() [1/4]

template<typename Nested >
lsst::geom::polynomials::ScaledBasis2d< Nested >::ScaledBasis2d ( Nested const &  nested,
Scaling2d const &  scaling 
)
inlineexplicit

Construct a scaled basis from a nested basis and a scaling transform.

Definition at line 59 of file ScaledBasis2d.h.

59  :
60  _nested(nested),
61  _scaling(scaling)
62  {}
table::Key< double > scaling
table::Key< int > nested

◆ ScaledBasis2d() [2/4]

template<typename Nested >
lsst::geom::polynomials::ScaledBasis2d< Nested >::ScaledBasis2d ( std::size_t  order,
Box2D const &  box 
)
inline

Construct a basis that remaps the given box to [-1, 1]x[-1, 1] before evaluating the nested polynomials polynomials.

Parameters
[in]orderMaximum order of the basis (inclusive).
[in]boxBox to be mapped to [-1, 1]x[-1, 1].

This constructor is particularly useful for Chebyshev polynomials, for which most of the special functions of the basis are only active when the domain is limited to [-1, 1].

This signature requires that Nested(order) be a valid constructor.

Definition at line 77 of file ScaledBasis2d.h.

77  :
78  _nested(order),
79  _scaling(makeUnitRangeScaling2d(box))
80  {}
Scaling2d makeUnitRangeScaling2d(geom::Box2D const &box)
Return a Scaling1d that maps the given box to [-1, 1]x[-1, 1].
Definition: Scaling2d.h:112
table::Key< int > order

◆ ScaledBasis2d() [3/4]

template<typename Nested >
lsst::geom::polynomials::ScaledBasis2d< Nested >::ScaledBasis2d ( ScaledBasis2d< Nested > const &  )
default

Default copy constructor.

◆ ScaledBasis2d() [4/4]

template<typename Nested >
lsst::geom::polynomials::ScaledBasis2d< Nested >::ScaledBasis2d ( ScaledBasis2d< Nested > &&  )
default

Default move constructor.

Member Function Documentation

◆ fill() [1/2]

template<typename Nested >
template<typename Vector >
void lsst::geom::polynomials::ScaledBasis2d< Nested >::fill ( geom::Point2D const &  point,
Vector &&  basis 
) const
inline

Evaluate the basis at a given point.

Parameters
[in]pointPoint at which to evaluate the basis functions.
[out]basisFlattened output 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 186 of file ScaledBasis2d.h.

186  {
187  return getNested().fill(getScaling().applyForward(point),
188  std::forward<Vector>(basis));
189  }
Nested const & getNested() const noexcept
Return the nested basis.
Definition: ScaledBasis2d.h:95
Scaling2d const & getScaling() const noexcept
Return the scaling transform.
Definition: ScaledBasis2d.h:98
table::Key< table::Array< double > > basis
Definition: PsfexPsf.cc:361

◆ fill() [2/2]

template<typename Nested >
template<typename Vector >
void lsst::geom::polynomials::ScaledBasis2d< Nested >::fill ( geom::Point2D const &  point,
Vector &&  basis,
Workspace workspace 
) const
inline

Evaluate the basis at a given point (external workspace version).

Definition at line 193 of file ScaledBasis2d.h.

193  {
194  return getNested().fill(getScaling().applyForward(point),
195  std::forward<Vector>(basis),
196  workspace);
197  }

◆ getIndices()

template<typename Nested >
IndexRange lsst::geom::polynomials::ScaledBasis2d< Nested >::getIndices ( ) const
inline

Return a range of iterators that dereference to Index2d.

This is the recommended way to interpret the packed coefficients and basis functions utilized by PackedBasis2d; for example,

// Evaluate basis functions at a point.
geom::Point2D point(x, y);
std::vector<double> values(basis.size());
basis.fill(point, values);
// Iterate over tuples of flattened indices and x and y orders.
for (auto const & index : basis.getIndices()) {
double a = values[index.flat];
// standard polynomial basis functions are just powers
double b = std::pow(point.getX(), index.nx)*std::pow(point.getY(), index.ny)];
}
double x
int y
Definition: SpanSet.cc:48
table::Key< int > b
table::Key< int > a
int index(int x, int y) const
Return the flattened index of the basis function with the given x and y orders.
PackedBasis2d< PolynomialBasis1d, packing > PolynomialBasis2d
A Basis2d for standard polynomials, templated on packing order.
Angle abs(Angle const &a)
Definition: Angle.h:106
T pow(T... args)

Definition at line 139 of file ScaledBasis2d.h.

139 { return getNested().getIndices(); }

◆ getNested()

template<typename Nested >
Nested const& lsst::geom::polynomials::ScaledBasis2d< Nested >::getNested ( ) const
inlinenoexcept

Return the nested basis.

Definition at line 95 of file ScaledBasis2d.h.

95 { return _nested; }

◆ getOrder()

template<typename Nested >
std::size_t lsst::geom::polynomials::ScaledBasis2d< Nested >::getOrder ( ) const
inline

Return the order of the basis.

Definition at line 101 of file ScaledBasis2d.h.

101 { return getNested().getOrder(); }

◆ getScaling()

template<typename Nested >
Scaling2d const& lsst::geom::polynomials::ScaledBasis2d< Nested >::getScaling ( ) const
inlinenoexcept

Return the scaling transform.

Definition at line 98 of file ScaledBasis2d.h.

98 { return _scaling; }

◆ index()

template<typename Nested >
int lsst::geom::polynomials::ScaledBasis2d< Nested >::index ( int  x,
int  y 
) const
inline

Return the flattened index of the basis function with the given x and y orders.

Definition at line 117 of file ScaledBasis2d.h.

117 { return getNested().index(x, y); }

◆ makeWorkspace()

template<typename Nested >
Workspace lsst::geom::polynomials::ScaledBasis2d< Nested >::makeWorkspace ( ) const
inline

Allocate a workspace that can be passed to sumWith() and fill() to avoid repeated memory allocations.

Definition at line 142 of file ScaledBasis2d.h.

142 { return getNested().makeWorkspace();}

◆ operator=() [1/2]

template<typename Nested >
ScaledBasis2d& lsst::geom::polynomials::ScaledBasis2d< Nested >::operator= ( ScaledBasis2d< Nested > &&  )
default

Default move assignment.

◆ operator=() [2/2]

template<typename Nested >
ScaledBasis2d& lsst::geom::polynomials::ScaledBasis2d< Nested >::operator= ( ScaledBasis2d< Nested > const &  )
default

Default copy assignment.

◆ scaled()

template<typename Nested >
Scaled lsst::geom::polynomials::ScaledBasis2d< Nested >::scaled ( Scaling2d const &  first) const
inline

Return a scaled basis that delegates to a copy of this.

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 112 of file ScaledBasis2d.h.

112  {
113  return getNested().scaled(first.then(getScaling()));
114  }

◆ size()

template<typename Nested >
std::size_t lsst::geom::polynomials::ScaledBasis2d< Nested >::size ( ) const
inline

Return the number of elements in the basis.

Definition at line 104 of file ScaledBasis2d.h.

104 { return getNested().size(); }

◆ sumWith() [1/2]

template<typename Nested >
template<typename Vector >
double lsst::geom::polynomials::ScaledBasis2d< Nested >::sumWith ( geom::Point2D const &  point,
Vector const &  coefficients,
SumMode  mode = SumMode::FAST 
) const
inline

Evaluate a basis expansion with the given coefficients.

If the 1-d basis elements are \(B_n(x)\) and the given coefficients are a vector \(a_{p, q}\), this computes

\[ \sum_{p = 0, q = 0}^{p + q \le N} a_{p,q} B_{p}(x) B_{q}(y) \]

Parameters
[in]pointPoint at which to evaluate the expansion.
[in]coefficientsFlattened coefficients 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 163 of file ScaledBasis2d.h.

164  {
165  return getNested().sumWith(getScaling().applyForward(point), coefficients, mode);
166  }
ndarray::Array< double const, 2, 2 > coefficients

◆ sumWith() [2/2]

template<typename Nested >
template<typename Vector >
double lsst::geom::polynomials::ScaledBasis2d< Nested >::sumWith ( geom::Point2D const &  point,
Vector const &  coefficients,
Workspace workspace,
SumMode  mode = SumMode::FAST 
) const
inline

Evaluate a basis expansion with the given coefficients (external workspace version).

Definition at line 170 of file ScaledBasis2d.h.

171  {
172  return getNested().sumWith(getScaling().applyForward(point), coefficients, workspace, mode);
173  }

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