CMP++: Uncertainty Quantification & Bayesian Calibration
Loading...
Searching...
No Matches
cmp::PolynomialExpansion< Basis > Class Template Reference

Implements multi-dimensional Polynomial Chaos Expansion (PCE) for spectral surrogate modeling. More...

#include <poly.h>

Collaboration diagram for cmp::PolynomialExpansion< Basis >:

Public Member Functions

 PolynomialExpansion ()=default
 
void set (size_t dimension, size_t totalDegree, const Eigen::VectorXd &p1, const Eigen::VectorXd &p2, double q=1.0)
 
void fit (const Eigen::Ref< const Eigen::MatrixXd > &samples, const Eigen::Ref< const Eigen::VectorXd > &values)
 
double getAnalyticalMean () const
 
double getAnalyticalVariance () const
 
Eigen::VectorXd getSobolMainIndices () const
 
Eigen::VectorXd predictBatch (const Eigen::Ref< const Eigen::MatrixXd > &X) const
 
std::pair< double, doublepredict (const Eigen::Ref< const Eigen::VectorXd > &x) const
 
std::pair< double, doublepredictWithObs (const Eigen::Ref< const Eigen::VectorXd > &x, const double &yObs) const
 
std::pair< double, doublepredictLOO (const size_t &i) const
 
Eigen::VectorXd computeBasisRow (const Eigen::Ref< const Eigen::VectorXd > &x) const
 
void save (const std::string &filename) const
 
void load (const std::string &filename)
 
size_t getNumBasisFunctions () const
 
void project (const std::function< double(const Eigen::VectorXd &)> &model, int pointsPerDim)
 

Private Member Functions

Eigen::MatrixXd computeDesignMatrix (const Eigen::Ref< const Eigen::MatrixXd > &X) const
 
template<typename MatrixType >
void writeEigenMatrix (std::ofstream &out, const MatrixType &mat) const
 
template<typename MatrixType >
void readEigenMatrix (std::ifstream &in, MatrixType &mat)
 

Private Attributes

MultiIndex multiIndex_
 Multi-index set defining the active polynomial terms.
 
Eigen::VectorXd coefficients_
 Estimated expansion coefficients vector.
 
Eigen::MatrixXd normalMatrixInverse_
 Precomputed inverse normal matrix (A^T A)^-1.
 
Eigen::MatrixXd xObs_
 Training input data in canonical space.
 
Eigen::VectorXd yObs_
 Training target response values.
 
double residualVariance_ = 0.0
 Running residual variance.
 
Eigen::VectorXd p1_
 Mapping boundary lower limits/means.
 
Eigen::VectorXd p2_
 Mapping boundary upper limits/std devs.
 

Detailed Description

template<typename Basis>
class cmp::PolynomialExpansion< Basis >

Implements multi-dimensional Polynomial Chaos Expansion (PCE) for spectral surrogate modeling.

Template Parameters
BasisThe orthogonal polynomial basis type (e.g., HermiteBasis for Gaussians, LegendreBasis for Uniforms).

Mathematical Foundations

Polynomial Chaos Expansion represents a stochastic model output \(Y = f(\mathbf{X})\) as a spectral expansion of multivariate orthogonal polynomials mapping canonical variables \(\boldsymbol{\xi}\):

\[ Y \approx \sum_{j=0}^{P-1} c_j \Psi_j(\boldsymbol{\xi}) \]

The multivariate polynomials \(\Psi_j(\boldsymbol{\xi})\) are tensor products of univariate orthogonal polynomials:

\[ \Psi_j(\boldsymbol{\xi}) = \prod_{i=1}^d \psi_{\alpha_i^{(j)}}(\xi_i) \]

where \(\boldsymbol{\alpha}^{(j)} = (\alpha_1^{(j)}, \dots, \alpha_d^{(j)})\) is the multi-index of polynomial degrees.

Uni-dimensional orthogonal bases satisfy:

\[ \int_{\Omega} \psi_k(x) \psi_l(x) w(x) dx = \gamma_k \delta_{kl} \]

where \(w(x)\) is the probability density function (PDF) weight of the canonical distribution.

Implementation Algorithms

  1. Canonical Mapping: Physical samples \(\mathbf{x}\) are mapped to canonical space \(\boldsymbol{\xi}\) using the basis-specific mappings (mapToCanonical).
  2. Design Matrix Construction: Computes the regression matrix \(\mathbf{A} \in \mathbb{R}^{N \times P}\) where:

    \[ A_{ij} = \Psi_j(\boldsymbol{\xi}^{(i)}) \]

  3. Ordinary Least Squares (OLS) Regression: The expansion coefficients \(\mathbf{c}\) are found by solving the linear least-squares problem \(\mathbf{A}\mathbf{c} \approx \mathbf{y}\):

    \[ \mathbf{c} = \left(\mathbf{A}^T \mathbf{A}\right)^{-1} \mathbf{A}^T \mathbf{y} \]

    We solve this system robustly using Column-Pivoted Householder QR decomposition (ColPivHouseholderQR).

Constraints & Invariants

  • Sample Size: The number of samples \(N\) must satisfy \(N > P\) (where \(P = \text{multiIndex\_.size()}\)) to avoid an underdetermined system and severe overfitting.
  • Parameter Ranges: Bounding parameter vectors (e.g., mean/standard deviation or lower/upper bounds) must match the dimensionality of the input space.

Constructor & Destructor Documentation

◆ PolynomialExpansion()

template<typename Basis >
cmp::PolynomialExpansion< Basis >::PolynomialExpansion ( )
default

Member Function Documentation

◆ computeBasisRow()

template<typename Basis >
Eigen::VectorXd cmp::PolynomialExpansion< Basis >::computeBasisRow ( const Eigen::Ref< const Eigen::VectorXd > &  x) const
inline

◆ computeDesignMatrix()

template<typename Basis >
Eigen::MatrixXd cmp::PolynomialExpansion< Basis >::computeDesignMatrix ( const Eigen::Ref< const Eigen::MatrixXd > &  X) const
inlineprivate

◆ fit()

template<typename Basis >
void cmp::PolynomialExpansion< Basis >::fit ( const Eigen::Ref< const Eigen::MatrixXd > &  samples,
const Eigen::Ref< const Eigen::VectorXd > &  values 
)
inline

◆ getAnalyticalMean()

template<typename Basis >
double cmp::PolynomialExpansion< Basis >::getAnalyticalMean ( ) const
inline

◆ getAnalyticalVariance()

template<typename Basis >
double cmp::PolynomialExpansion< Basis >::getAnalyticalVariance ( ) const
inline

◆ getNumBasisFunctions()

template<typename Basis >
size_t cmp::PolynomialExpansion< Basis >::getNumBasisFunctions ( ) const
inline

◆ getSobolMainIndices()

template<typename Basis >
Eigen::VectorXd cmp::PolynomialExpansion< Basis >::getSobolMainIndices ( ) const
inline

◆ load()

template<typename Basis >
void cmp::PolynomialExpansion< Basis >::load ( const std::string &  filename)
inline

◆ predict()

template<typename Basis >
std::pair< double, double > cmp::PolynomialExpansion< Basis >::predict ( const Eigen::Ref< const Eigen::VectorXd > &  x) const
inline

◆ predictBatch()

template<typename Basis >
Eigen::VectorXd cmp::PolynomialExpansion< Basis >::predictBatch ( const Eigen::Ref< const Eigen::MatrixXd > &  X) const
inline

◆ predictLOO()

template<typename Basis >
std::pair< double, double > cmp::PolynomialExpansion< Basis >::predictLOO ( const size_t i) const
inline

◆ predictWithObs()

template<typename Basis >
std::pair< double, double > cmp::PolynomialExpansion< Basis >::predictWithObs ( const Eigen::Ref< const Eigen::VectorXd > &  x,
const double yObs 
) const
inline

◆ project()

template<typename Basis >
void cmp::PolynomialExpansion< Basis >::project ( const std::function< double(const Eigen::VectorXd &)> &  model,
int  pointsPerDim 
)
inline

◆ readEigenMatrix()

template<typename Basis >
template<typename MatrixType >
void cmp::PolynomialExpansion< Basis >::readEigenMatrix ( std::ifstream &  in,
MatrixType mat 
)
inlineprivate

◆ save()

template<typename Basis >
void cmp::PolynomialExpansion< Basis >::save ( const std::string &  filename) const
inline

◆ set()

template<typename Basis >
void cmp::PolynomialExpansion< Basis >::set ( size_t  dimension,
size_t  totalDegree,
const Eigen::VectorXd &  p1,
const Eigen::VectorXd &  p2,
double  q = 1.0 
)
inline

◆ writeEigenMatrix()

template<typename Basis >
template<typename MatrixType >
void cmp::PolynomialExpansion< Basis >::writeEigenMatrix ( std::ofstream &  out,
const MatrixType mat 
) const
inlineprivate

Member Data Documentation

◆ coefficients_

template<typename Basis >
Eigen::VectorXd cmp::PolynomialExpansion< Basis >::coefficients_
private

Estimated expansion coefficients vector.

◆ multiIndex_

template<typename Basis >
MultiIndex cmp::PolynomialExpansion< Basis >::multiIndex_
private

Multi-index set defining the active polynomial terms.

◆ normalMatrixInverse_

template<typename Basis >
Eigen::MatrixXd cmp::PolynomialExpansion< Basis >::normalMatrixInverse_
private

Precomputed inverse normal matrix (A^T A)^-1.

◆ p1_

template<typename Basis >
Eigen::VectorXd cmp::PolynomialExpansion< Basis >::p1_
private

Mapping boundary lower limits/means.

◆ p2_

template<typename Basis >
Eigen::VectorXd cmp::PolynomialExpansion< Basis >::p2_
private

Mapping boundary upper limits/std devs.

◆ residualVariance_

template<typename Basis >
double cmp::PolynomialExpansion< Basis >::residualVariance_ = 0.0
private

Running residual variance.

◆ xObs_

template<typename Basis >
Eigen::MatrixXd cmp::PolynomialExpansion< Basis >::xObs_
private

Training input data in canonical space.

◆ yObs_

template<typename Basis >
Eigen::VectorXd cmp::PolynomialExpansion< Basis >::yObs_
private

Training target response values.


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