Class xlifepp::MultiVecTraits#

template<class ScalarType, class MV>
class MultiVecTraits#

Collaboration diagram for xlifepp::MultiVecTraits:

digraph { graph [bgcolor="#00000000"] node [shape=rectangle style=filled fillcolor="#FFFFFF" font=Helvetica padding=2] edge [color="#1414CE"] "1" [label="xlifepp::MultiVecTraits< ScalarType, MV >" tooltip="xlifepp::MultiVecTraits< ScalarType, MV >" fillcolor="#BFBFBF"] }

Traits class which defines basic operations on multivectors.

This traits class tells xlifepp’s solvers how to perform multivector operations for the multivector type MV. These operations include creating copies or views, finding the number of rows or columns (i.e., vectors) in a given multivector, and computing inner products, norms, and vector sums. (xlifepp’s solvers use the OperatorTraits traits class to apply operators to multivectors.)

xlifepp gives users two different ways to tell its solvers how to compute with multivectors of a given type MV. The first and preferred way is for users to specialize MultiVecTraits, this traits class, for their given MV type. The second way is for users to make their multivector type (or a wrapper thereof) inherit from MultiVec. This works because xlifepp provides a specialization of MultiVecTraits for MultiVec. Specializing MultiVecTraits is more flexible because it does not require a multivector type to inherit from MultiVec; this is possible even if you do not have control over the interface of a class.

If you have a different multivector type MV that you would like to use with xlifepp, and if that type does not inherit from MultiVec, then you must implement a specialization of MultiVecTraits for MV. Otherwise, this traits class will report a compile-time error (relating to UndefinedMultiVecTraits). Specializing MultiVecTraits for your MV type is not hard.

Template Parameters:
  • ScalarType – The type of the entries in the multivectors.

  • MV – The type of the multivectors themselves.

Creation methods

static inline SmartPtr<MV> clone(const MV &mv, const int numvecs)#

Creates a new empty MV containing numvecs columns.

Returns:

Reference-counted pointer to the new multivector of type MV.

static inline SmartPtr<MV> cloneCopy(const MV &mv)#

Creates a new MV and copies contents of mv into the new vector (deep copy).

Returns:

Reference-counted pointer to the new multivector of type MV.

static inline SmartPtr<MV> cloneCopy(const MV &mv, const std::vector<int> &index)#

Creates a new MV and copies the selected contents of mv into the new vector (deep copy).

The copied vectors from mv are indicated by the index.size() indices in index.

Returns:

Reference-counted pointer to the new multivector of type MV.

static inline SmartPtr<MV> cloneViewNonConst(MV &mv, const std::vector<int> &index)#

Creates a new MV that shares the selected contents of mv (shallow copy).

The index of the numvecs vectors shallow copied from mv are indicated by the indices given in index.

Returns:

Reference-counted pointer to the new multivector of type MV.

static inline SmartPtr<const MV> cloneView(const MV &mv, const std::vector<int> &index)#

Creates a new const MV that shares the selected contents of mv (shallow copy).

The index of the numvecs vectors shallow copied from mv are indicated by the indices given in index.

Returns:

Reference-counted pointer to the new const multivector of type MV.

Attribute methods

static inline int getVecLength(const MV &mv)#

Obtain the vector length of mv.

static inline int getNumberVecs(const MV &mv)#

Obtain the number of vectors in mv.

Update methods

static inline void mvTimesMatAddMv(const ScalarType alpha, const MV &A, const MatrixEigenDense<ScalarType> &B, const ScalarType beta, MV &mv)#

Update mv with \( \alpha AB + \beta mv \).

static inline void mvAddMv(const ScalarType alpha, const MV &A, const ScalarType beta, const MV &B, MV &mv)#

Replace mv with \(\alpha A + \beta B\).

static inline void mvScale(MV &mv, const ScalarType alpha)#

Scale each element of the vectors in mv with alpha.

static inline void mvScale(MV &mv, const std::vector<ScalarType> &alpha)#

Scale each element of the i-th vector in mv with alpha[i].

static inline void mvTransMv(const ScalarType alpha, const MV &A, const MV &mv, MatrixEigenDense<ScalarType> &B)#

Compute a dense matrix B through the matrix-matrix multiply \( \alpha A^Hmv \).

static inline void mvDot(const MV &mv, const MV &A, std::vector<ScalarType> &b)#

Compute a vector b where the components are the individual dot-products of the i-th columns of A and mv, i.e.

\(b[i] = A[i]^Hmv[i]\).

Norm method

static inline void mvNorm(const MV &mv, std::vector<typename NumTraits<ScalarType>::magnitudeType> &normvec)#

Compute the 2-norm of each individual vector of mv.

Upon return, normvec[i] holds the value of \(||mv_i||_2\), the i-th column of mv.

Initialization methods

static inline void setBlock(const MV &A, const std::vector<int> &index, MV &mv)#

Copy the vectors in A to a set of vectors in mv indicated by the indices given in index.

The numvecs vectors in A are copied to a subset of vectors in mv indicated by the indices given in index, i.e. mv[index[i]] = A[i].

static inline void assign(const MV &A, MV &mv)#

mv := A assign (deep copy) A into mv.

static inline void mvRandom(MV &mv)#

Replace the vectors in mv with random vectors.

static inline void mvInit(MV &mv, const ScalarType alpha = NumTraits<ScalarType>::zero())#

Replace each element of the vectors in mv with alpha.

Print method

static inline void mvPrint(const MV &mv, std::ostream &os)#

Print the mv multi-vector to the os output stream.