25 #include <queso/GaussianVectorRV.h>
26 #include <queso/GslVector.h>
27 #include <queso/GslMatrix.h>
32 template<
class V,
class M>
36 const V& lawExpVector,
37 const V& lawVarVector)
39 BaseVectorRV<V,M>(((std::string)(prefix)+
"gau").c_str(),imageSet)
49 "GaussianVectorRV<V,M>::constructor() [1]",
50 "Covariance matrix is not symmetric positive definite.");
57 V cholDiag(lawVarVector);
59 M lowerCholLawCovMatrix(cholDiag);
60 lowerCholLawCovMatrix.zeroUpper(
false);
65 lowerCholLawCovMatrix);
78 template<
class V,
class M>
82 const V& lawExpVector,
83 const M& lawCovMatrix)
85 BaseVectorRV<V,M>(((std::string)(prefix)+
"gau").c_str(),imageSet)
98 M lowerCholLawCovMatrix(lawCovMatrix);
99 int iRC = lowerCholLawCovMatrix.chol();
100 lowerCholLawCovMatrix.zeroUpper(
false);
102 std::cerr <<
"In GaussianVectorRV<V,M>::constructor() [2]: chol failed, will use svd\n";
104 *
m_env.
subDisplayFile() <<
"In GaussianVectorRV<V,M>::constructor() [2]: chol failed; will use svd; lawCovMatrix contents are\n";
108 M matU (lawCovMatrix);
109 M matVt(
m_imageSet.vectorSpace().zeroVector());
110 V vecS (
m_imageSet.vectorSpace().zeroVector());
111 iRC = lawCovMatrix.svd(matU,vecS,matVt);
114 "GaussianVectorRV<V,M>::constructor() [2]",
115 "Cholesky decomposition of covariance matrix failed.");
129 lowerCholLawCovMatrix);
143 template<
class V,
class M>
153 template<
class V,
class M>
163 template<
class V,
class M>
170 M newLowerCholLawCovMatrix(newLawCovMatrix);
171 int iRC = newLowerCholLawCovMatrix.chol();
172 newLowerCholLawCovMatrix.zeroUpper(
false);
174 std::cerr <<
"In GaussianVectorRV<V,M>::updateLawCovMatrix(): chol failed, will use svd\n";
175 if (m_env.subDisplayFile()) {
176 *m_env.subDisplayFile() <<
"In GaussianVectorRV<V,M>::updateLawCovMatrix(): chol failed; will use svd; newLawCovMatrix contents are\n";
177 *m_env.subDisplayFile() << newLawCovMatrix;
178 *m_env.subDisplayFile() << std::endl;
180 M matU (newLawCovMatrix);
181 M matVt(m_imageSet.vectorSpace().zeroVector());
182 V vecS (m_imageSet.vectorSpace().zeroVector());
183 iRC = newLawCovMatrix.svd(matU,vecS,matVt);
186 "GaussianVectorRV<V,M>::updateLawCovMatrix()",
187 "Cholesky decomposition of covariance matrix failed.");
200 template <
class V,
class M>
204 os <<
"GaussianVectorRV<V,M>::print() says, 'Please implement me.'" << std::endl;
212 template<
class V,
class M>
223 M& sigmaMat11_cond_on_2)
226 unsigned int dim1 = muVec1.sizeLocal();
227 unsigned int dim2 = muVec2.sizeLocal();
231 "ComputeConditionalGaussianVectorRV()",
232 "invalid sigmaMat11");
236 "ComputeConditionalGaussianVectorRV()",
237 "invalid sigmaMat12");
241 "ComputeConditionalGaussianVectorRV()",
242 "invalid sigmaMat21");
246 "ComputeConditionalGaussianVectorRV()",
247 "invalid sigmaMat22");
250 M mat_tt(sigmaMat12);
252 mat_tt.fillWithTranspose(0,0,sigmaMat21,
true,
true);
253 double auxNorm = (mat_tt - sigmaMat12).normFrob();
254 if (auxNorm >= 1.e-12) {
256 *env.
subDisplayFile() <<
"In ComputeConditionalGaussianVectorRV()"
257 <<
": WARNING, ||sigmaMat21^T - sigmaMat12||_2 = " << auxNorm
263 "ComputeConditionalGaussianVectorRV()",
264 "sigmaMat12 and sigmaMat21 are not transpose of each other");
268 "ComputeConditionalGaussianVectorRV()",
269 "invalid sampleVec2");
273 "ComputeConditionalGaussianVectorRV()",
274 "invalid muVec1_cond_on_2");
276 UQ_FATAL_TEST_MACRO((sigmaMat11_cond_on_2.numRowsLocal() != dim1) || (sigmaMat11_cond_on_2.numCols() != dim1),
278 "ComputeConditionalGaussianVectorRV()",
279 "invalid sigmaMat11_cond_on_2");
281 muVec1_cond_on_2 = muVec1 + sigmaMat12 * sigmaMat22.invertMultiply(sampleVec2 - muVec2);
282 sigmaMat11_cond_on_2 = sigmaMat11 - sigmaMat12 * sigmaMat22.invertMultiply(sigmaMat21);
A class for handling Gaussian joint PDFs.
const BaseVectorCdf< V, M > * m_unifiedCdf
void updateLawExpVector(const V &newLawExpVector)
Updates the vector that contains the mean values.
A templated base class for handling vector RV.
int worldRank() const
Returns the process world rank.
void updateLawCovMatrix(const M &newLawCovMatrix)
Updates the covariance matrix.
std::ofstream * subDisplayFile() const
Access function for m_subDisplayFile (displays file on stream).
const BaseEnvironment & m_env
Class for matrix operations using GSL library.
This (virtual) class sets up the environment underlying the use of the QUESO library by an executable...
const VectorSet< V, M > & m_imageSet
const BaseVectorCdf< V, M > * m_subCdf
BaseVectorRealizer< V, M > * m_realizer
#define UQ_FATAL_TEST_MACRO(test, givenRank, where, what)
A templated class for handling sets.
const BaseVectorMdf< V, M > * m_mdf
GaussianVectorRV(const char *prefix, const VectorSet< V, M > &imageSet, const V &lawExpVector, const V &lawVarVector)
Constructor.
void ComputeConditionalGaussianVectorRV(const V &muVec1, const V &muVec2, const M &sigmaMat11, const M &sigmaMat12, const M &sigmaMat21, const M &sigmaMat22, const V &sampleVec2, V &muVec1_cond_on_2, M &sigmaMat11_cond_on_2)
A class representing a Gaussian vector RV.
BaseJointPdf< V, M > * m_pdf
void print(std::ostream &os) const
TODO: Prints the vector RV.
unsigned int displayVerbosity() const
virtual ~GaussianVectorRV()
Virtual destructor.
Class for vector operations using GSL library.
A class for handling sampling from Gaussian probability density distributions.