queso-0.51.1
HessianCovMatricesTKGroup.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,2009,2010,2011,2012,2013 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/HessianCovMatricesTKGroup.h>
26 #include <queso/GslVector.h>
27 #include <queso/GslMatrix.h>
28 
29 namespace QUESO {
30 
31 // Default constructor ------------------------------
32 template<class V, class M>
34  const char* prefix,
35  const VectorSpace<V,M>& vectorSpace,
36  const std::vector<double>& scales,
37  const ScalarFunctionSynchronizer<V,M>& targetPdfSynchronizer)
38  :
39  BaseTKGroup<V,M>(prefix,vectorSpace,scales),
40  m_targetPdfSynchronizer(targetPdfSynchronizer),
41  m_originalNewtonSteps (scales.size()+1,NULL), // Yes, +1
42  m_originalCovMatrices (scales.size()+1,NULL) // Yes, +1
43 {
44  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 5)) {
45  *m_env.subDisplayFile() << "Entering HessianCovMatricesTKGroup<V,M>::constructor()"
46  << std::endl;
47  }
48 
49  m_rvs.resize(scales.size()+1,NULL); // Yes, +1 (IMPORTANT: overwrite initialization done by BaseTKGroup<V,M>)
50 
51  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 5)) {
52  *m_env.subDisplayFile() << "In HessianCovMatricesTKGroup<V,M>::constructor()"
53  << ": m_scales.size() = " << m_scales.size()
54  << ", m_preComputingPositions.size() = " << m_preComputingPositions.size()
55  << ", m_rvs.size() = " << m_rvs.size()
56  << ", m_originalNewtonSteps.size() = " << m_originalNewtonSteps.size()
57  << ", m_originalCovMatrices.size() = " << m_originalCovMatrices.size()
58  << std::endl;
59  }
60 
61  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 5)) {
62  *m_env.subDisplayFile() << "Leaving HessianCovMatricesTKGroup<V,M>::constructor()"
63  << std::endl;
64  }
65 }
66 // Destructor ---------------------------------------
67 template<class V, class M>
69 {
70 }
71 // Math/Stats methods--------------------------------
72 template<class V, class M>
73 bool
75 {
76  return false;
77 }
78 //---------------------------------------------------
79 template<class V, class M>
81 HessianCovMatricesTKGroup<V,M>::rv(unsigned int stageId) const
82 {
83  UQ_FATAL_TEST_MACRO(m_rvs.size() <= stageId,
84  m_env.worldRank(),
85  "HessianCovMatricesTKGroup<V,M>::rv1()",
86  "m_rvs.size() <= stageId");
87 
88  UQ_FATAL_TEST_MACRO(m_rvs[stageId] == NULL,
89  m_env.worldRank(),
90  "HessianCovMatricesTKGroup<V,M>::rv1()",
91  "m_rvs[stageId] == NULL");
92 
93  UQ_FATAL_TEST_MACRO(m_preComputingPositions.size() <= stageId,
94  m_env.worldRank(),
95  "HessianCovMatricesTKGroup<V,M>::rv1()",
96  "m_preComputingPositions.size() <= stageId");
97 
98  UQ_FATAL_TEST_MACRO(m_preComputingPositions[stageId] == NULL,
99  m_env.worldRank(),
100  "HessianCovMatricesTKGroup<V,M>::rv1()",
101  "m_preComputingPositions[stageId] == NULL");
102 
103  GaussianVectorRV<V, M> * gaussian_rv =
104  dynamic_cast<GaussianVectorRV<V, M> * >(m_rvs[stageId]);
105 
106  gaussian_rv->updateLawExpVector(*m_preComputingPositions[stageId] + *m_originalNewtonSteps[stageId]);
107 
108  if ((m_env.subDisplayFile() ) &&
109  (m_env.displayVerbosity() >= 10)) {
110  *m_env.subDisplayFile() << "In HessianCovMatrixTKGroup<V,M>::rv1()"
111  << ", stageId = " << stageId
112  << ": about to call m_rvs[stageId]->updateLawCovMatrix()"
113  << ", covMatrix = \n" << *m_originalCovMatrices[stageId] // FIX ME: might demand parallelism
114  << std::endl;
115  }
116 
117  gaussian_rv->updateLawCovMatrix(*m_originalCovMatrices[stageId]);
118 
119  return *gaussian_rv;
120 }
121 //---------------------------------------------------
122 template<class V, class M>
124 HessianCovMatricesTKGroup<V,M>::rv(const std::vector<unsigned int>& stageIds)
125 {
126  UQ_FATAL_TEST_MACRO(m_rvs.size() <= stageIds[0],
127  m_env.worldRank(),
128  "HessianCovMatricesTKGroup<V,M>::rv2()",
129  "m_rvs.size() <= stageIds[0]");
130 
131  UQ_FATAL_TEST_MACRO(m_rvs[stageIds[0]] == NULL,
132  m_env.worldRank(),
133  "HessianCovMatricesTKGroup<V,M>::rv2()",
134  "m_rvs[stageIds[0]] == NULL");
135 
136  UQ_FATAL_TEST_MACRO(m_preComputingPositions.size() <= stageIds[0],
137  m_env.worldRank(),
138  "HessianCovMatricesTKGroup<V,M>::rv2()",
139  "m_preComputingPositions.size() <= stageIds[0]");
140 
141  UQ_FATAL_TEST_MACRO(m_preComputingPositions[stageIds[0]] == NULL,
142  m_env.worldRank(),
143  "HessianCovMatricesTKGroup<V,M>::rv2()",
144  "m_preComputingPositions[stageIds[0]] == NULL");
145 
146  double factor = 1./m_scales[stageIds.size()-1]/m_scales[stageIds.size()-1];
147 
148  GaussianVectorRV<V, M> * gaussian_rv =
149  dynamic_cast<GaussianVectorRV<V, M> * >(m_rvs[stageIds[0]]);
150 
151  gaussian_rv->updateLawExpVector(*m_preComputingPositions[stageIds[0]] + factor*(*m_originalNewtonSteps[stageIds[0]]));
152 
153  if ((m_env.subDisplayFile() ) &&
154  (m_env.displayVerbosity() >= 10)) {
155  *m_env.subDisplayFile() << "In HessianCovMatrixTKGroup<V,M>::rv2()"
156  << ", stageIds.size() = " << stageIds.size()
157  << ", stageIds[0] = " << stageIds[0]
158  << ", factor = " << factor
159  << ": about to call m_rvs[stageIds[0]]->updateLawCovVector()"
160  << ", covMatrix = \n" << factor*(*m_originalCovMatrices[stageIds[0]]) // FIX ME: might demand parallelism
161  << std::endl;
162  }
163  gaussian_rv->updateLawCovMatrix(factor*(*m_originalCovMatrices[stageIds[0]]));
164 
165  return *gaussian_rv;
166 }
167 // Misc methods--------------------------------------
168 template<class V, class M>
169 bool
170 HessianCovMatricesTKGroup<V,M>::setPreComputingPosition(const V& position, unsigned int stageId)
171 {
172  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 5)) {
173  *m_env.subDisplayFile() << "Entering HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()"
174  << ": position = " << position
175  << ", stageId = " << stageId
176  << std::endl;
177  }
178 
179  bool validPreComputingPosition = true;
180 
181  // Verify consistency of sizes
182  UQ_FATAL_TEST_MACRO(m_preComputingPositions.size() <= stageId,
183  m_env.worldRank(),
184  "HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()",
185  "m_preComputingPositions.size() <= stageId");
186 
187  UQ_FATAL_TEST_MACRO(m_preComputingPositions.size() != m_rvs.size(),
188  m_env.worldRank(),
189  "HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()",
190  "m_preComputingPositions.size() != m_rvs.size()");
191 
192  UQ_FATAL_TEST_MACRO(m_preComputingPositions.size() != m_originalNewtonSteps.size(),
193  m_env.worldRank(),
194  "HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()",
195  "m_preComputingPositions.size() != m_originalNewtonSteps.size()");
196 
197  UQ_FATAL_TEST_MACRO(m_preComputingPositions.size() != m_originalCovMatrices.size(),
198  m_env.worldRank(),
199  "HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()",
200  "m_preComputingPositions.size() != m_originalCovMatrices.size()");
201 
202  // Verify data is not null
203  UQ_FATAL_TEST_MACRO(m_preComputingPositions[stageId] != NULL,
204  m_env.worldRank(),
205  "HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()",
206  "m_preComputingPositions[stageId] != NULL");
207 
208  UQ_FATAL_TEST_MACRO(m_rvs[stageId] != NULL,
209  m_env.worldRank(),
210  "HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()",
211  "m_rvs[stageId] != NULL");
212 
213  UQ_FATAL_TEST_MACRO(m_originalNewtonSteps[stageId] != NULL,
214  m_env.worldRank(),
215  "HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()",
216  "m_originalNewtonSteps[stageId] != NULL");
217 
218  UQ_FATAL_TEST_MACRO(m_originalCovMatrices[stageId] != NULL,
219  m_env.worldRank(),
220  "HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()",
221  "m_originalCovMatrices[stageId] != NULL");
222 
224 
225  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 5)) {
226  *m_env.subDisplayFile() << "In HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()"
227  << ", position = " << position
228  << ", stageId = " << stageId
229  << ": m_originalNewtonSteps.size() = " << m_originalNewtonSteps.size()
230  << ", m_originalCovMatrices.size() = " << m_originalCovMatrices.size()
231  << ", m_preComputingPositions.size() = " << m_preComputingPositions.size()
232  << ", m_rvs.size() = " << m_rvs.size()
233  << std::endl;
234  }
235 
236  if (m_targetPdfSynchronizer.domainSet().contains(position)) {
237  M* tmpHessian = m_vectorSpace->newMatrix();
238  M* tmpCovMat = m_vectorSpace->newMatrix();
239  V* tmpGrad = m_vectorSpace->newVector();
240 
241  double logPrior = 0.;
242  double logLikelihood = 0.;
243  double logTarget = 0.;
244  logTarget = m_targetPdfSynchronizer.callFunction(&position, // Might demand parallel environment
245  NULL,
246  tmpGrad,
247  tmpHessian,
248  NULL,
249  &logPrior,
250  &logLikelihood);
251  if (logTarget) {}; // just to remove compiler warning
252 
253  // IMPORTANT: covariance matrix = (Hessian)^{-1} !!!
254  V unitVector(m_vectorSpace->zeroVector());
255  V multVector(m_vectorSpace->zeroVector());
256  for (unsigned int j = 0; j < tmpHessian->numCols(); ++j) {
257  if (j > 0) unitVector[j-1] = 0.;
258  unitVector[j] = 1.;
259  tmpHessian->invertMultiply(unitVector, multVector);
260  for (unsigned int i = 0; i < tmpHessian->numRowsLocal(); ++i) {
261  (*tmpCovMat)(i,j) = multVector[i];
262  }
263  }
264  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 5)) {
265  *m_env.subDisplayFile() << "In HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()"
266  << ", position = " << position
267  << ", stageId = " << stageId
268  << ":\n H = " << *tmpHessian
269  << "\n H^{-1} = " << *tmpCovMat
270  << "\n H*H^{-1} = " << (*tmpHessian)*(*tmpCovMat)
271  << "\n H^{-1}*H = " << (*tmpCovMat)*(*tmpHessian)
272  << std::endl;
273  }
274 
275  // Force covariance matrix to be symmetric, as the Hessian (supposedly) is
276  *tmpCovMat = .5*((*tmpCovMat) + tmpCovMat->transpose());
277 
278  // Test if covariance matrix is positive definite
279  M lowerChol(*tmpCovMat);
280  if ((m_env.subDisplayFile() ) &&
281  (m_env.displayVerbosity() >= 10)) {
282  *m_env.subDisplayFile() << "In HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()"
283  << ", position = " << position
284  << ", stageId = " << stageId
285  << ": calling lowerChol.chol()"
286  << ", lowerChol = " << lowerChol
287  << std::endl;
288  }
289  int iRC = lowerChol.chol();
290  if (iRC) {
291  std::cerr << "In HessianCovMatricesTKGroup<V,M>::setPreComputingPosition(): chol failed\n";
292  }
293  if ((m_env.subDisplayFile() ) &&
294  (m_env.displayVerbosity() >= 10)) {
295  *m_env.subDisplayFile() << "In HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()"
296  << ", position = " << position
297  << ", stageId = " << stageId
298  << ": got lowerChol.chol() with iRC = " << iRC
299  << std::endl;
300  }
301 
302  bool covIsPositiveDefinite = !iRC;
303 
304  if (covIsPositiveDefinite) {
305  //UQ_FATAL_TEST_MACRO(stageId >= m_scales.size(),
306  // m_env.worldRank(),
307  // "HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()",
308  // "stageId is too large for m_scales");
309  //double factor = 1./m_scales[stageId]/m_scales[stageId];
310  //*tmpCovMat *= factor;
311 
312  m_originalNewtonSteps[stageId] = new V(-1.*(*tmpCovMat)*(*tmpGrad));
313  m_originalCovMatrices[stageId] = new M(*tmpCovMat);
314 
315  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 5)) {
316  *m_env.subDisplayFile() << "In HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()"
317  << ", position = " << position
318  << ", stageId = " << stageId
319  << ", about to instantiate a Gaussian RV"
320  << ": tmpHessian = " << *tmpHessian
321  << ", preComputingPos = " << *m_preComputingPositions[stageId]
322  << ", tmpCovMat = " << *tmpCovMat
323  << ", tmpGrad = " << *tmpGrad
324  << ", preComputedPos = " << *m_preComputingPositions[stageId] + *m_originalNewtonSteps[stageId]
325  //<< ", factor = " << factor
326  //<< ", rvCov = " << factor*(*tmpCovMat)
327  << std::endl;
328  }
329  m_rvs[stageId] = new GaussianVectorRV<V,M>(m_prefix.c_str(),
330  *m_vectorSpace,
331  *m_preComputingPositions[stageId] + *m_originalNewtonSteps[stageId],
332  *m_originalCovMatrices[stageId]);
333  }
334  else {
335  validPreComputingPosition = false;
336  }
337 
338  delete tmpGrad;
339  delete tmpCovMat;
340  delete tmpHessian;
341  }
342  else {
343  validPreComputingPosition = false;
344  }
345 
346  if (validPreComputingPosition == false) {
347  // Put "default" values on variables
348  V tmpGrad (m_vectorSpace->zeroVector());
349  M tmpCovMat(tmpGrad,1.); // = identity matrix
350  m_originalNewtonSteps[stageId] = new V(-1.*tmpCovMat*tmpGrad);
351  m_originalCovMatrices[stageId] = new M(tmpCovMat);
352  m_rvs[stageId] = new GaussianVectorRV<V,M>(m_prefix.c_str(),
353  *m_vectorSpace,
354  *m_preComputingPositions[stageId],
355  tmpCovMat);
356  }
357 
358  if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 5)) {
359  *m_env.subDisplayFile() << "Leaving HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()"
360  << ": position = " << position
361  << ", stageId = " << stageId
362  << std::endl;
363  }
364 
365  return validPreComputingPosition;
366 }
367 //---------------------------------------------------
368 template<class V, class M>
369 void
371 {
372  UQ_FATAL_TEST_MACRO(m_preComputingPositions.size() != m_originalNewtonSteps.size(),
373  m_env.worldRank(),
374  "HessianCovMatricesTKGroup<V,M>::clearPreComputingPositions()",
375  "m_preComputingPositions.size() != m_originalNewtonSteps.size()");
376 
377  UQ_FATAL_TEST_MACRO(m_preComputingPositions.size() != m_originalCovMatrices.size(),
378  m_env.worldRank(),
379  "HessianCovMatricesTKGroup<V,M>::clearPreComputingPositions()",
380  "m_preComputingPositions.size() != m_originalCovMatrices.size()");
381 
383 
384  // RVs are not deleted in base class because the cov matrices are constant in the case of scaledTK class
385  for (unsigned int i = 0; i < m_rvs.size(); ++i) {
386  if (m_rvs[i]) {
387  delete m_rvs[i];
388  m_rvs[i] = NULL;
389  }
390  }
391 
392  for (unsigned int i = 0; i < m_originalNewtonSteps.size(); ++i) {
393  if (m_originalNewtonSteps[i]) {
394  delete m_originalNewtonSteps[i];
395  m_originalNewtonSteps[i] = NULL;
396  }
397  }
398 
399  for (unsigned int i = 0; i < m_originalCovMatrices.size(); ++i) {
400  if (m_originalCovMatrices[i]) {
401  delete m_originalCovMatrices[i];
402  m_originalCovMatrices[i] = NULL;
403  }
404  }
405 
406  return;
407 }
408 // I/O methods---------------------------------------
409 template<class V, class M>
410 void
412 {
414  return;
415 }
416 
417 } // End namespace QUESO
418 
std::vector< BaseVectorRV< V, M > * > m_rvs
Definition: TKGroup.h:104
std::vector< double > m_scales
Definition: TKGroup.h:102
This class allows the representation of a transition kernel with Hessians.
std::ofstream * subDisplayFile() const
Access function for m_subDisplayFile (displays file on stream).
Definition: Environment.C:305
virtual void print(std::ostream &os) const
TODO: Prints the transition kernel.
Definition: TKGroup.C:135
void clearPreComputingPositions()
Clears the pre-computing positions m_preComputingPositions[stageId].
const GaussianVectorRV< V, M > & rv(unsigned int stageId) const
Gaussian increment property to construct a transition kernel.
virtual void clearPreComputingPositions()
Clears the pre-computing positions m_preComputingPositions[stageId].
Definition: TKGroup.C:121
const BaseEnvironment & m_env
Definition: TKGroup.h:99
This base class allows the representation of a transition kernel.
Definition: TKGroup.h:49
void updateLawExpVector(const V &newLawExpVector)
Updates the vector that contains the mean values.
void print(std::ostream &os) const
TODO: Prints the transition kernel.
HessianCovMatricesTKGroup(const char *prefix, const VectorSpace< V, M > &vectorSpace, const std::vector< double > &scales, const ScalarFunctionSynchronizer< V, M > &targetPdfSynchronizer)
Default constructor.
A templated class for synchronizing the calls of scalar functions (BaseScalarFunction and derived cla...
A class representing a vector space.
Definition: VectorSet.h:46
bool setPreComputingPosition(const V &position, unsigned int stageId)
Sets the pre-computing positions m_preComputingPositions[stageId] with a new vector of size position...
unsigned int displayVerbosity() const
Definition: Environment.C:436
#define UQ_FATAL_TEST_MACRO(test, givenRank, where, what)
Definition: Defines.h:223
virtual bool setPreComputingPosition(const V &position, unsigned int stageId)
Sets the pre-computing positions m_preComputingPositions[stageId] with a new vector of size position...
Definition: TKGroup.C:102
void updateLawCovMatrix(const M &newLawCovMatrix)
Updates the covariance matrix.
bool symmetric() const
Whether or not the matrix is symmetric. Always &#39;false&#39;.
std::vector< const V * > m_preComputingPositions
Definition: TKGroup.h:103
A class representing a Gaussian vector RV.

Generated on Thu Apr 23 2015 19:26:15 for queso-0.51.1 by  doxygen 1.8.5