queso-0.53.0
GaussianJointPdf.C
Go to the documentation of this file.
1 //-----------------------------------------------------------------------bl-
2 //--------------------------------------------------------------------------
3 //
4 // QUESO - a library to support the Quantification of Uncertainty
5 // for Estimation, Simulation and Optimization
6 //
7 // Copyright (C) 2008-2015 The PECOS Development Team
8 //
9 // This library is free software; you can redistribute it and/or
10 // modify it under the terms of the Version 2.1 GNU Lesser General
11 // Public License as published by the Free Software Foundation.
12 //
13 // This library is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 // Lesser General Public License for more details.
17 //
18 // You should have received a copy of the GNU Lesser General Public
19 // License along with this library; if not, write to the Free Software
20 // Foundation, Inc. 51 Franklin Street, Fifth Floor,
21 // Boston, MA 02110-1301 USA
22 //
23 //-----------------------------------------------------------------------el-
24 
25 #include <queso/GaussianJointPdf.h>
26 #include <queso/GslVector.h>
27 #include <queso/GslMatrix.h>
28 
29 namespace QUESO {
30 
31 // Constructor -------------------------------------
32 template<class V,class M>
34  const char* prefix,
35  const VectorSet<V,M>& domainSet,
36  const V& lawExpVector,
37  const V& lawVarVector)
38  :
39  BaseJointPdf<V,M>(((std::string)(prefix)+"gau").c_str(),domainSet),
40  m_lawExpVector (new V(lawExpVector)),
41  m_lawVarVector (new V(lawVarVector)),
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 }
66 // Constructor -------------------------------------
67 template<class V,class M>
69  const char* prefix,
70  const VectorSet<V,M>& domainSet,
71  const V& lawExpVector,
72  const M& lawCovMatrix)
73  :
74  BaseJointPdf<V,M>(((std::string)(prefix)+"gau").c_str(),domainSet),
75  m_lawExpVector (new V(lawExpVector)),
76  m_lawVarVector (domainSet.vectorSpace().newVector(INFINITY)), // FIX ME
77  m_diagonalCovMatrix(false),
78  m_lawCovMatrix (new M(lawCovMatrix))
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 }
100 // Destructor --------------------------------------
101 template<class V,class M>
103 {
104  delete m_lawCovMatrix;
105  delete m_lawVarVector;
106  delete m_lawExpVector;
107 }
108 // Math methods-------------------------------------
109 template <class V, class M>
110 const V&
112 {
113  return *m_lawExpVector;
114 }
115 //--------------------------------------------------
116 template <class V, class M>
117 const V&
119 {
120  return *m_lawVarVector;
121 }
122 //--------------------------------------------------
123 template<class V, class M>
124 double
126  const V& domainVector,
127  const V* domainDirection,
128  V* gradVector,
129  M* hessianMatrix,
130  V* hessianEffect) const
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(!(gradVector || hessianMatrix || hessianEffect), "incomplete code for gradVector, hessianMatrix and hessianEffect calculations");
143 
144  double returnValue = 0.;
145 
146  if (this->m_domainSet.contains(domainVector) == false) { // prudenci 2011-Oct-04
147  returnValue = 0.;
148  }
149  else {
150  returnValue = std::exp(this->lnValue(domainVector,domainDirection,gradVector,hessianMatrix,hessianEffect));
151  }
152  //returnValue *= exp(m_logOfNormalizationFactor); // No need, because 'lnValue()' is called right above [PDF-03]
153 
154  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 55)) {
155  *m_env.subDisplayFile() << "Leaving GaussianJointPdf<V,M>::actualValue()"
156  << ", meanVector = " << *m_lawExpVector
157  << ", lawCovMatrix = " << *m_lawCovMatrix
158  << ": domainVector = " << domainVector
159  << ", returnValue = " << returnValue
160  << std::endl;
161  }
162 
163  return returnValue;
164 }
165 //--------------------------------------------------
166 template<class V, class M>
167 double
169  const V& domainVector,
170  const V* domainDirection,
171  V* gradVector,
172  M* hessianMatrix,
173  V* hessianEffect) const
174 {
175  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 55)) {
176  *m_env.subDisplayFile() << "Entering GaussianJointPdf<V,M>::lnValue()"
177  << ", meanVector = " << *m_lawExpVector
178  << ", lawCovMatrix = " << *m_lawCovMatrix
179  << ": domainVector = " << domainVector
180  << std::endl;
181  }
182 
183  queso_require_msg(!(gradVector || hessianMatrix || hessianEffect), "incomplete code for gradVector, hessianMatrix and hessianEffect calculations");
184 
185  if (domainDirection) {}; // just to remove compiler warning
186 
187  double returnValue = 0.;
188 
189  double lnDeterminant = 0.;
190  if (this->m_domainSet.contains(domainVector) == false) { // prudenci 2011-Oct-04
191  returnValue = -INFINITY;
192  }
193  else {
194  V diffVec(domainVector - this->lawExpVector());
195  if (m_diagonalCovMatrix) {
196  returnValue = ((diffVec*diffVec)/this->lawVarVector()).sumOfComponents();
197  if (m_normalizationStyle == 0) {
198  unsigned int iMax = this->lawVarVector().sizeLocal();
199  for (unsigned int i = 0; i < iMax; ++i) {
200  lnDeterminant += log(this->lawVarVector()[i]);
201  }
202  }
203  }
204  else {
205  V tmpVec = this->m_lawCovMatrix->invertMultiply(diffVec);
206  returnValue = (diffVec*tmpVec).sumOfComponents();
207  if (m_normalizationStyle == 0) {
208  lnDeterminant = this->m_lawCovMatrix->lnDeterminant();
209  }
210  }
211  if (m_normalizationStyle == 0) {
212  returnValue += ((double) this->lawVarVector().sizeLocal()) * log(2*M_PI); // normalization of pdf
213  returnValue += lnDeterminant; // normalization of pdf
214  }
215  returnValue *= -0.5;
216  }
217  returnValue += m_logOfNormalizationFactor; // [PDF-03]
218 
219  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 99)) {
220  *m_env.subDisplayFile() << "Leaving GaussianJointPdf<V,M>::lnValue()"
221  << ", m_normalizationStyle = " << m_normalizationStyle
222  << ", m_diagonalCovMatrix = " << m_diagonalCovMatrix
223  << ", m_logOfNormalizationFactor = " << m_logOfNormalizationFactor
224  << ", lnDeterminant = " << lnDeterminant
225  << ", meanVector = " << *m_lawExpVector
226  << ", lawCovMatrix = " << *m_lawCovMatrix
227  << ": domainVector = " << domainVector
228  << ", returnValue = " << returnValue
229  << std::endl;
230  }
231 
232  return returnValue;
233 }
234 //--------------------------------------------------
235 template<class V, class M>
236 double
237 GaussianJointPdf<V,M>::computeLogOfNormalizationFactor(unsigned int numSamples, bool updateFactorInternally) const
238 {
239  double value = 0.;
240 
241  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 2)) {
242  *m_env.subDisplayFile() << "Entering GaussianJointPdf<V,M>::computeLogOfNormalizationFactor()"
243  << std::endl;
244  }
245  value = BaseJointPdf<V,M>::commonComputeLogOfNormalizationFactor(numSamples, updateFactorInternally);
246  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 2)) {
247  *m_env.subDisplayFile() << "Leaving GaussianJointPdf<V,M>::computeLogOfNormalizationFactor()"
248  << ", m_logOfNormalizationFactor = " << m_logOfNormalizationFactor
249  << std::endl;
250  }
251 
252  return value;
253 }
254 //--------------------------------------------------
255 template<class V, class M>
256 void
258 {
259  // delete old expected values (allocated at construction or last call to this function)
260  delete m_lawExpVector;
261  m_lawExpVector = new V(newLawExpVector);
262  return;
263 }
264 
265 template<class V, class M>
266 void
268 {
269  // delete old expected values (allocated at construction or last call to this function)
270  delete m_lawCovMatrix;
271  m_lawCovMatrix = new M(newLawCovMatrix);
272  return;
273 }
274 
275 template<class V, class M>
276 const M&
278 {
279  return *m_lawCovMatrix;
280 }
281 
282 } // End namespace QUESO
283 
const V & lawExpVector() const
Access to the vector of mean values and private attribute: m_lawExpVector.
unsigned int displayVerbosity() const
Definition: Environment.C:396
A templated class for handling sets.
Definition: VectorSet.h:52
double computeLogOfNormalizationFactor(unsigned int numSamples, bool updateFactorInternally) const
Computes the logarithm of the normalization factor.
A templated (base) class for handling joint PDFs.
Definition: JointPdf.h:56
void updateLawCovMatrix(const M &newLawCovMatrix)
Updates the lower triangular matrix from Cholesky decomposition of the covariance matrix to the new v...
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
A class for handling Gaussian joint PDFs.
#define queso_require_equal_to_msg(expr1, expr2, msg)
Definition: asserts.h:85
~GaussianJointPdf()
Destructor.
const BaseEnvironment & m_env
#define queso_require_msg(asserted, msg)
Definition: asserts.h:69
std::ofstream * subDisplayFile() const
Access function for m_subDisplayFile (displays file on stream).
Definition: Environment.C:274
GaussianJointPdf(const char *prefix, const VectorSet< V, M > &domainSet, const V &lawExpVector, const V &lawVarVector)
Constructor.
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 V & lawVarVector() const
Access to the vector of variance values and private attribute: m_lawVarVector.
double actualValue(const V &domainVector, const V *domainDirection, V *gradVector, M *hessianMatrix, V *hessianEffect) const
Actual value of the Gaussian PDF:
const M & lawCovMatrix() const
Returns the covariance matrix; access to protected attribute m_lawCovMatrix.
void updateLawExpVector(const V &newLawExpVector)
Updates the mean with the new value newLawExpVector.

Generated on Thu Jun 11 2015 13:52:32 for queso-0.53.0 by  doxygen 1.8.5