queso-0.55.0
Protected Attributes | List of all members
QUESO::GaussianJointPdf< V, M > Class Template Reference

A class for handling Gaussian joint PDFs. More...

#include <GaussianJointPdf.h>

Inheritance diagram for QUESO::GaussianJointPdf< V, M >:
Inheritance graph
[legend]
Collaboration diagram for QUESO::GaussianJointPdf< V, M >:
Collaboration graph
[legend]

Public Member Functions

Constructor/Destructor methods
 GaussianJointPdf (const char *prefix, const VectorSet< V, M > &domainSet, const V &lawExpVector, const V &lawVarVector)
 Constructor. More...
 
 GaussianJointPdf (const char *prefix, const VectorSet< V, M > &domainSet, const V &lawExpVector, const M &lawCovMatrix)
 Constructor. More...
 
 ~GaussianJointPdf ()
 Destructor. More...
 
Math methods
double actualValue (const V &domainVector, const V *domainDirection, V *gradVector, M *hessianMatrix, V *hessianEffect) const
 Actual value of the Gaussian PDF: More...
 
double lnValue (const V &domainVector, const V *domainDirection, V *gradVector, M *hessianMatrix, V *hessianEffect) const
 Logarithm of the value of the Gaussian PDF (scalar function). More...
 
double computeLogOfNormalizationFactor (unsigned int numSamples, bool updateFactorInternally) const
 Computes the logarithm of the normalization factor. More...
 
void updateLawExpVector (const V &newLawExpVector)
 Updates the mean with the new value newLawExpVector. More...
 
void updateLawCovMatrix (const M &newLawCovMatrix)
 Updates the lower triangular matrix from Cholesky decomposition of the covariance matrix to the new value newLowerCholLawCovMatrix. More...
 
const M & lawCovMatrix () const
 Returns the covariance matrix; access to protected attribute m_lawCovMatrix. More...
 
const V & lawExpVector () const
 Access to the vector of mean values and private attribute: m_lawExpVector. More...
 
const V & lawVarVector () const
 Access to the vector of variance values and private attribute: m_lawVarVector. More...
 
- Public Member Functions inherited from QUESO::BaseJointPdf< V, M >
 BaseJointPdf (const char *prefix, const VectorSet< V, M > &domainSet)
 Default constructor. More...
 
virtual ~BaseJointPdf ()
 Destructor. More...
 
virtual void setNormalizationStyle (unsigned int value) const
 Sets a value to be used in the normalization style (stored in the protected attribute m_normalizationStyle.) More...
 
void setLogOfNormalizationFactor (double value) const
 Sets a logarithmic value to be used in the normalization factor (stored in the protected attribute m_normalizationStyle.) More...
 
- Public Member Functions inherited from QUESO::BaseScalarFunction< V, M >
 BaseScalarFunction (const char *prefix, const VectorSet< V, M > &domainSet)
 Default constructor. More...
 
virtual ~BaseScalarFunction ()
 Destructor. More...
 
const VectorSet< V, M > & domainSet () const
 Access to the protected attribute m_domainSet: domain set of the scalar function. More...
 

Protected Attributes

V * m_lawExpVector
 
V * m_lawVarVector
 
bool m_diagonalCovMatrix
 
const M * m_lawCovMatrix
 
- Protected Attributes inherited from QUESO::BaseJointPdf< V, M >
unsigned int m_normalizationStyle
 
double m_logOfNormalizationFactor
 
- Protected Attributes inherited from QUESO::BaseScalarFunction< V, M >
const BaseEnvironmentm_env
 
std::string m_prefix
 
const VectorSet< V, M > & m_domainSet
 Domain set of the scalar function. More...
 

Additional Inherited Members

- Protected Member Functions inherited from QUESO::BaseJointPdf< V, M >
double commonComputeLogOfNormalizationFactor (unsigned int numSamples, bool updateFactorInternally) const
 Common method (to the derived classes) to compute the logarithm of the normalization factor. More...
 

Detailed Description

template<class V = GslVector, class M = GslMatrix>
class QUESO::GaussianJointPdf< V, M >

A class for handling Gaussian joint PDFs.

This class allows the mathematical definition of a Gaussian Joint PDF.

Definition at line 52 of file GaussianJointPdf.h.

Constructor & Destructor Documentation

template<class V , class M >
QUESO::GaussianJointPdf< V, M >::GaussianJointPdf ( const char *  prefix,
const VectorSet< V, M > &  domainSet,
const V &  lawExpVector,
const V &  lawVarVector 
)

Constructor.

Constructs a new object, given a prefix and the domain of the PDF, a vector of mean values, lawExpVector, and a vector of covariance values lawVarVector (an alternative representation for a diagonal covariance matrix).

Definition at line 33 of file GaussianJointPdf.C.

References QUESO::BaseEnvironment::displayVerbosity(), QUESO::GaussianJointPdf< V, M >::lawExpVector(), QUESO::GaussianJointPdf< V, M >::lawVarVector(), QUESO::BaseScalarFunction< V, M >::m_env, QUESO::BaseScalarFunction< V, M >::m_prefix, and QUESO::BaseEnvironment::subDisplayFile().

38  :
39  BaseJointPdf<V,M>(((std::string)(prefix)+"gau").c_str(),domainSet),
42  m_diagonalCovMatrix(true),
43  m_lawCovMatrix (m_domainSet.vectorSpace().newDiagMatrix(lawVarVector))
44 {
45 
46  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 54)) {
47  *m_env.subDisplayFile() << "Entering GaussianJointPdf<V,M>::constructor() [1]"
48  << ": prefix = " << m_prefix
49  << std::endl;
50  }
51 
52  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 55)) {
53  *m_env.subDisplayFile() << "In GaussianJointPdf<V,M>::constructor()"
54  //<< ", prefix = " << m_prefix
55  << ": meanVector = " << this->lawExpVector()
56  << ", Variances = " << this->lawVarVector()
57  << std::endl;
58  }
59 
60  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 54)) {
61  *m_env.subDisplayFile() << "Leaving GaussianJointPdf<V,M>::constructor() [1]"
62  << ": prefix = " << m_prefix
63  << std::endl;
64  }
65 }
unsigned int displayVerbosity() const
Definition: Environment.C:400
const V & lawVarVector() const
Access to the vector of variance values and private attribute: m_lawVarVector.
const VectorSet< V, M > & m_domainSet
Domain set of the scalar function.
const V & lawExpVector() const
Access to the vector of mean values and private attribute: m_lawExpVector.
const BaseEnvironment & m_env
const VectorSet< V, M > & domainSet() const
Access to the protected attribute m_domainSet: domain set of the scalar function. ...
std::ofstream * subDisplayFile() const
Access function for m_subDisplayFile (displays file on stream).
Definition: Environment.C:278
template<class V , class M >
QUESO::GaussianJointPdf< V, M >::GaussianJointPdf ( const char *  prefix,
const VectorSet< V, M > &  domainSet,
const V &  lawExpVector,
const M &  lawCovMatrix 
)

Constructor.

Constructs a new object, given a prefix and the image set of the vector realizer, a vector of mean values, lawExpVector, and a covariance matrix, lawCovMatrix.

Definition at line 68 of file GaussianJointPdf.C.

References QUESO::BaseEnvironment::displayVerbosity(), QUESO::GaussianJointPdf< V, M >::lawExpVector(), QUESO::BaseScalarFunction< V, M >::m_env, QUESO::BaseScalarFunction< V, M >::m_prefix, and QUESO::BaseEnvironment::subDisplayFile().

73  :
74  BaseJointPdf<V,M>(((std::string)(prefix)+"gau").c_str(),domainSet),
76  m_lawVarVector (domainSet.vectorSpace().newVector(INFINITY)), // FIX ME
77  m_diagonalCovMatrix(false),
79 {
80  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 54)) {
81  *m_env.subDisplayFile() << "Entering GaussianJointPdf<V,M>::constructor() [2]"
82  << ": prefix = " << m_prefix
83  << std::endl;
84  }
85 
86  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 55)) {
87  *m_env.subDisplayFile() << "In GaussianJointPdf<V,M>::constructor()"
88  //<< ", prefix = " << m_prefix
89  << ": meanVector = " << this->lawExpVector()
90  << ", Covariance Matrix = " << lawCovMatrix
91  << std::endl;
92  }
93 
94  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 54)) {
95  *m_env.subDisplayFile() << "Leaving GaussianJointPdf<V,M>::constructor() [2]"
96  << ": prefix = " << m_prefix
97  << std::endl;
98  }
99 }
unsigned int displayVerbosity() const
Definition: Environment.C:400
const M & lawCovMatrix() const
Returns the covariance matrix; access to protected attribute m_lawCovMatrix.
const V & lawExpVector() const
Access to the vector of mean values and private attribute: m_lawExpVector.
const BaseEnvironment & m_env
const VectorSet< V, M > & domainSet() const
Access to the protected attribute m_domainSet: domain set of the scalar function. ...
std::ofstream * subDisplayFile() const
Access function for m_subDisplayFile (displays file on stream).
Definition: Environment.C:278
template<class V , class M >
QUESO::GaussianJointPdf< V, M >::~GaussianJointPdf ( )

Destructor.

Definition at line 102 of file GaussianJointPdf.C.

103 {
104  delete m_lawCovMatrix;
105  delete m_lawVarVector;
106  delete m_lawExpVector;
107 }

Member Function Documentation

template<class V , class M >
double QUESO::GaussianJointPdf< V, M >::actualValue ( const V &  domainVector,
const V *  domainDirection,
V *  gradVector,
M *  hessianMatrix,
V *  hessianEffect 
) const
virtual

Actual value of the Gaussian PDF:

This method calls lnValue() and applies the exponential to it.

Implements QUESO::BaseJointPdf< V, M >.

Definition at line 125 of file GaussianJointPdf.C.

References queso_require_equal_to_msg, and queso_require_msg.

131 {
132  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 55)) {
133  *m_env.subDisplayFile() << "Entering GaussianJointPdf<V,M>::actualValue()"
134  << ", meanVector = " << *m_lawExpVector
135  << ", lawCovMatrix = " << *m_lawCovMatrix
136  << ": domainVector = " << domainVector
137  << std::endl;
138  }
139 
140  queso_require_equal_to_msg(domainVector.sizeLocal(), this->m_domainSet.vectorSpace().dimLocal(), "invalid input");
141 
142  queso_require_msg(!(hessianMatrix || hessianEffect), "incomplete code for gradVector, hessianMatrix and hessianEffect calculations");
143 
144  double returnValue = 0.;
145 
146  if (this->m_domainSet.contains(domainVector) == false) {
147  // What should the gradient be here?
148  returnValue = 0.;
149  }
150  else {
151  // Already normalised (so the gradient will have the normalisation constant
152  // in it)
153  returnValue = std::exp(this->lnValue(domainVector,domainDirection,gradVector,hessianMatrix,hessianEffect));
154 
155  if (gradVector) {
156  (*gradVector) *= returnValue;
157  }
158  }
159 
160  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 55)) {
161  *m_env.subDisplayFile() << "Leaving GaussianJointPdf<V,M>::actualValue()"
162  << ", meanVector = " << *m_lawExpVector
163  << ", lawCovMatrix = " << *m_lawCovMatrix
164  << ": domainVector = " << domainVector
165  << ", returnValue = " << returnValue
166  << std::endl;
167  }
168 
169  return returnValue;
170 }
unsigned int displayVerbosity() const
Definition: Environment.C:400
double lnValue(const V &domainVector, const V *domainDirection, V *gradVector, M *hessianMatrix, V *hessianEffect) const
Logarithm of the value of the Gaussian PDF (scalar function).
const VectorSet< V, M > & m_domainSet
Domain set of the scalar function.
#define queso_require_msg(asserted, msg)
Definition: asserts.h:69
#define queso_require_equal_to_msg(expr1, expr2, msg)
Definition: asserts.h:85
const BaseEnvironment & m_env
std::ofstream * subDisplayFile() const
Access function for m_subDisplayFile (displays file on stream).
Definition: Environment.C:278
template<class V , class M >
double QUESO::GaussianJointPdf< V, M >::computeLogOfNormalizationFactor ( unsigned int  numSamples,
bool  updateFactorInternally 
) const
virtual

Computes the logarithm of the normalization factor.

This routine calls BaseJointPdf::commonComputeLogOfNormalizationFactor().

Implements QUESO::BaseJointPdf< V, M >.

Definition at line 274 of file GaussianJointPdf.C.

References QUESO::BaseJointPdf< V, M >::commonComputeLogOfNormalizationFactor().

275 {
276  double value = 0.;
277 
278  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 2)) {
279  *m_env.subDisplayFile() << "Entering GaussianJointPdf<V,M>::computeLogOfNormalizationFactor()"
280  << std::endl;
281  }
282  value = BaseJointPdf<V,M>::commonComputeLogOfNormalizationFactor(numSamples, updateFactorInternally);
283  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 2)) {
284  *m_env.subDisplayFile() << "Leaving GaussianJointPdf<V,M>::computeLogOfNormalizationFactor()"
285  << ", m_logOfNormalizationFactor = " << m_logOfNormalizationFactor
286  << std::endl;
287  }
288 
289  return value;
290 }
unsigned int displayVerbosity() const
Definition: Environment.C:400
double m_logOfNormalizationFactor
Definition: JointPdf.h:100
double commonComputeLogOfNormalizationFactor(unsigned int numSamples, bool updateFactorInternally) const
Common method (to the derived classes) to compute the logarithm of the normalization factor...
Definition: JointPdf.C:77
const BaseEnvironment & m_env
std::ofstream * subDisplayFile() const
Access function for m_subDisplayFile (displays file on stream).
Definition: Environment.C:278
template<class V , class M >
const M & QUESO::GaussianJointPdf< V, M >::lawCovMatrix ( ) const

Returns the covariance matrix; access to protected attribute m_lawCovMatrix.

Definition at line 314 of file GaussianJointPdf.C.

Referenced by QUESO::ScaledCovMatrixTKGroup< V, M >::setPreComputingPosition().

315 {
316  return *m_lawCovMatrix;
317 }
template<class V , class M >
const V & QUESO::GaussianJointPdf< V, M >::lawExpVector ( ) const

Access to the vector of mean values and private attribute: m_lawExpVector.

Definition at line 111 of file GaussianJointPdf.C.

Referenced by QUESO::GaussianJointPdf< V, M >::GaussianJointPdf().

112 {
113  return *m_lawExpVector;
114 }
template<class V , class M >
const V & QUESO::GaussianJointPdf< V, M >::lawVarVector ( ) const

Access to the vector of variance values and private attribute: m_lawVarVector.

Definition at line 118 of file GaussianJointPdf.C.

Referenced by QUESO::GaussianJointPdf< V, M >::GaussianJointPdf().

119 {
120  return *m_lawVarVector;
121 }
template<class V , class M >
double QUESO::GaussianJointPdf< V, M >::lnValue ( const V &  domainVector,
const V *  domainDirection,
V *  gradVector,
M *  hessianMatrix,
V *  hessianEffect 
) const
virtual

Logarithm of the value of the Gaussian PDF (scalar function).

The ln(value) comes from a summation of the Gaussian density:

\[ lnValue =- \sum_i \frac{1}{\sqrt{|covMatrix|} \sqrt{2 \pi}} exp(-\frac{(domainVector_i - lawExpVector_i)* covMatrix^{-1}* (domainVector_i - lawExpVector_i) }{2}, \]

where the $ covMatrix $ may recovered via this->lawVarVector(), in case of diagonal matrices or via this->m_lawCovMatrix, otherwise.

Implements QUESO::BaseJointPdf< V, M >.

Definition at line 174 of file GaussianJointPdf.C.

References queso_require_msg.

180 {
181  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 55)) {
182  *m_env.subDisplayFile() << "Entering GaussianJointPdf<V,M>::lnValue()"
183  << ", meanVector = " << *m_lawExpVector
184  << ", lawCovMatrix = " << *m_lawCovMatrix
185  << ": domainVector = " << domainVector
186  << std::endl;
187  }
188 
189  queso_require_msg(!(domainDirection || hessianMatrix || hessianEffect), "incomplete code for gradVector, hessianMatrix and hessianEffect calculations");
190 
191  double returnValue = 0.;
192 
193  double lnDeterminant = 0.;
194  if (this->m_domainSet.contains(domainVector) == false) {
195  // What should the gradient be here?
196  returnValue = -INFINITY;
197  }
198  else {
199  V diffVec(domainVector - this->lawExpVector());
200  if (m_diagonalCovMatrix) {
201  returnValue = ((diffVec*diffVec)/this->lawVarVector()).sumOfComponents();
202 
203  // Compute the gradient of log of the pdf.
204  // The log of a Gaussian pdf is:
205  // f(x) = - 1/2 (x - \mu)^T \Sigma^{-1} (x - \mu)
206  // Therefore
207  // \frac{df}{dx}(x) = - (x - \mu)^T \Sigma^{-1}
208  // = - (\Sigma^{-1}^T (x - \mu))^T
209  // = - (\Sigma^{-1} (x - \mu))^T
210  // = - \Sigma^{-1} (x - \mu) (row/column vector doesn't matter)
211  //
212  // So if \Sigma is diagonal we have a component-wise product of two
213  // vectors (x - \mu) and the diagonal elements of \Sigma^{-1}
214  if (gradVector) {
215  (*gradVector) = diffVec; // Copy
216  (*gradVector) /= this->lawVarVector();
217  (*gradVector) *= -1.0;
218  }
219 
220  if (m_normalizationStyle == 0) {
221  unsigned int iMax = this->lawVarVector().sizeLocal();
222  for (unsigned int i = 0; i < iMax; ++i) {
223  lnDeterminant += std::log(this->lawVarVector()[i]);
224  }
225  }
226  }
227  else {
228  V tmpVec = this->m_lawCovMatrix->invertMultiply(diffVec);
229  returnValue = (diffVec*tmpVec).sumOfComponents();
230 
231  // Compute the gradient of log of the pdf.
232  // The log of a Gaussian pdf is:
233  // f(x) = - 1/2 (x - \mu)^T \Sigma^{-1} (x - \mu)
234  // Therefore
235  // \frac{df}{dx}(x) = - (x - \mu)^T \Sigma^{-1}
236  // = - (\Sigma^{-1}^T (x - \mu))^T
237  // = - (\Sigma^{-1} (x - \mu))^T
238  // = - \Sigma^{-1} (x - \mu) (row/column vector doesn't matter)
239  if (gradVector) {
240  (*gradVector) = tmpVec;
241  (*gradVector) *= -1.0;
242  }
243 
244  if (m_normalizationStyle == 0) {
245  lnDeterminant = this->m_lawCovMatrix->lnDeterminant();
246  }
247  }
248  if (m_normalizationStyle == 0) {
249  returnValue += ((double) this->lawVarVector().sizeLocal()) * std::log(2*M_PI); // normalization of pdf
250  returnValue += lnDeterminant; // normalization of pdf
251  }
252  returnValue *= -0.5;
253  }
254  returnValue += m_logOfNormalizationFactor;
255 
256  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 99)) {
257  *m_env.subDisplayFile() << "Leaving GaussianJointPdf<V,M>::lnValue()"
258  << ", m_normalizationStyle = " << m_normalizationStyle
259  << ", m_diagonalCovMatrix = " << m_diagonalCovMatrix
260  << ", m_logOfNormalizationFactor = " << m_logOfNormalizationFactor
261  << ", lnDeterminant = " << lnDeterminant
262  << ", meanVector = " << *m_lawExpVector
263  << ", lawCovMatrix = " << *m_lawCovMatrix
264  << ": domainVector = " << domainVector
265  << ", returnValue = " << returnValue
266  << std::endl;
267  }
268 
269  return returnValue;
270 }
unsigned int displayVerbosity() const
Definition: Environment.C:400
const V & lawVarVector() const
Access to the vector of variance values and private attribute: m_lawVarVector.
unsigned int m_normalizationStyle
Definition: JointPdf.h:99
double m_logOfNormalizationFactor
Definition: JointPdf.h:100
const VectorSet< V, M > & m_domainSet
Domain set of the scalar function.
#define queso_require_msg(asserted, msg)
Definition: asserts.h:69
const V & lawExpVector() const
Access to the vector of mean values and private attribute: m_lawExpVector.
const BaseEnvironment & m_env
std::ofstream * subDisplayFile() const
Access function for m_subDisplayFile (displays file on stream).
Definition: Environment.C:278
template<class V , class M >
void QUESO::GaussianJointPdf< V, M >::updateLawCovMatrix ( const M &  newLawCovMatrix)

Updates the lower triangular matrix from Cholesky decomposition of the covariance matrix to the new value newLowerCholLawCovMatrix.

This method deletes old expected values (allocated at construction or last call to this method).

Definition at line 304 of file GaussianJointPdf.C.

305 {
306  // delete old expected values (allocated at construction or last call to this function)
307  delete m_lawCovMatrix;
308  m_lawCovMatrix = new M(newLawCovMatrix);
309  return;
310 }
template<class V , class M >
void QUESO::GaussianJointPdf< V, M >::updateLawExpVector ( const V &  newLawExpVector)

Updates the mean with the new value newLawExpVector.

This method deletes old expected values (allocated at construction or last call to this method).

Definition at line 294 of file GaussianJointPdf.C.

295 {
296  // delete old expected values (allocated at construction or last call to this function)
297  delete m_lawExpVector;
298  m_lawExpVector = new V(newLawExpVector);
299  return;
300 }

Member Data Documentation

template<class V = GslVector, class M = GslMatrix>
bool QUESO::GaussianJointPdf< V, M >::m_diagonalCovMatrix
protected

Definition at line 118 of file GaussianJointPdf.h.

template<class V = GslVector, class M = GslMatrix>
const M* QUESO::GaussianJointPdf< V, M >::m_lawCovMatrix
protected

Definition at line 119 of file GaussianJointPdf.h.

template<class V = GslVector, class M = GslMatrix>
V* QUESO::GaussianJointPdf< V, M >::m_lawExpVector
protected

Definition at line 116 of file GaussianJointPdf.h.

template<class V = GslVector, class M = GslMatrix>
V* QUESO::GaussianJointPdf< V, M >::m_lawVarVector
protected

Definition at line 117 of file GaussianJointPdf.h.


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

Generated on Fri Jun 17 2016 14:17:45 for queso-0.55.0 by  doxygen 1.8.5