25 #include <queso/HessianCovMatricesTKGroup.h>
26 #include <queso/GslVector.h>
27 #include <queso/GslMatrix.h>
32 template<
class V,
class M>
36 const std::vector<double>& scales,
40 m_targetPdfSynchronizer(targetPdfSynchronizer),
41 m_originalNewtonSteps (scales.size()+1,NULL),
42 m_originalCovMatrices (scales.size()+1,NULL)
49 m_rvs.resize(scales.size()+1,NULL);
53 <<
": m_scales.size() = " <<
m_scales.size()
55 <<
", m_rvs.size() = " <<
m_rvs.size()
67 template<
class V,
class M>
72 template<
class V,
class M>
79 template<
class V,
class M>
85 "HessianCovMatricesTKGroup<V,M>::rv1()",
86 "m_rvs.size() <= stageId");
90 "HessianCovMatricesTKGroup<V,M>::rv1()",
91 "m_rvs[stageId] == NULL");
95 "HessianCovMatricesTKGroup<V,M>::rv1()",
96 "m_preComputingPositions.size() <= stageId");
100 "HessianCovMatricesTKGroup<V,M>::rv1()",
101 "m_preComputingPositions[stageId] == NULL");
103 m_rvs[stageId]->updateLawExpVector(*m_preComputingPositions[stageId] + *m_originalNewtonSteps[stageId]);
104 if ((m_env.subDisplayFile() ) &&
105 (m_env.displayVerbosity() >= 10)) {
106 *m_env.subDisplayFile() <<
"In HessianCovMatrixTKGroup<V,M>::rv1()"
107 <<
", stageId = " << stageId
108 <<
": about to call m_rvs[stageId]->updateLawCovMatrix()"
109 <<
", covMatrix = \n" << *m_originalCovMatrices[stageId]
112 m_rvs[stageId]->updateLawCovMatrix(*m_originalCovMatrices[stageId]);
114 return *m_rvs[stageId];
117 template<
class V,
class M>
123 "HessianCovMatricesTKGroup<V,M>::rv2()",
124 "m_rvs.size() <= stageIds[0]");
128 "HessianCovMatricesTKGroup<V,M>::rv2()",
129 "m_rvs[stageIds[0]] == NULL");
133 "HessianCovMatricesTKGroup<V,M>::rv2()",
134 "m_preComputingPositions.size() <= stageIds[0]");
138 "HessianCovMatricesTKGroup<V,M>::rv2()",
139 "m_preComputingPositions[stageIds[0]] == NULL");
141 double factor = 1./m_scales[stageIds.size()-1]/m_scales[stageIds.size()-1];
143 m_rvs[stageIds[0]]->updateLawExpVector(*m_preComputingPositions[stageIds[0]] + factor*(*m_originalNewtonSteps[stageIds[0]]));
144 if ((m_env.subDisplayFile() ) &&
145 (m_env.displayVerbosity() >= 10)) {
146 *m_env.subDisplayFile() <<
"In HessianCovMatrixTKGroup<V,M>::rv2()"
147 <<
", stageIds.size() = " << stageIds.size()
148 <<
", stageIds[0] = " << stageIds[0]
149 <<
", factor = " << factor
150 <<
": about to call m_rvs[stageIds[0]]->updateLawCovVector()"
151 <<
", covMatrix = \n" << factor*(*m_originalCovMatrices[stageIds[0]])
154 m_rvs[stageIds[0]]->updateLawCovMatrix(factor*(*m_originalCovMatrices[stageIds[0]]));
156 return *m_rvs[stageIds[0]];
159 template<
class V,
class M>
163 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 5)) {
164 *m_env.subDisplayFile() <<
"Entering HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()"
165 <<
": position = " << position
166 <<
", stageId = " << stageId
170 bool validPreComputingPosition =
true;
175 "HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()",
176 "m_preComputingPositions.size() <= stageId");
180 "HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()",
181 "m_preComputingPositions.size() != m_rvs.size()");
185 "HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()",
186 "m_preComputingPositions.size() != m_originalNewtonSteps.size()");
190 "HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()",
191 "m_preComputingPositions.size() != m_originalCovMatrices.size()");
196 "HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()",
197 "m_preComputingPositions[stageId] != NULL");
201 "HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()",
202 "m_rvs[stageId] != NULL");
206 "HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()",
207 "m_originalNewtonSteps[stageId] != NULL");
211 "HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()",
212 "m_originalCovMatrices[stageId] != NULL");
216 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 5)) {
217 *m_env.subDisplayFile() <<
"In HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()"
218 <<
", position = " << position
219 <<
", stageId = " << stageId
220 <<
": m_originalNewtonSteps.size() = " << m_originalNewtonSteps.size()
221 <<
", m_originalCovMatrices.size() = " << m_originalCovMatrices.size()
222 <<
", m_preComputingPositions.size() = " << m_preComputingPositions.size()
223 <<
", m_rvs.size() = " << m_rvs.size()
227 if (m_targetPdfSynchronizer.domainSet().contains(position)) {
228 M* tmpHessian = m_vectorSpace->newMatrix();
229 M* tmpCovMat = m_vectorSpace->newMatrix();
230 V* tmpGrad = m_vectorSpace->newVector();
232 double logPrior = 0.;
233 double logLikelihood = 0.;
234 double logTarget = 0.;
235 logTarget = m_targetPdfSynchronizer.callFunction(&position,
245 V unitVector(m_vectorSpace->zeroVector());
246 V multVector(m_vectorSpace->zeroVector());
247 for (
unsigned int j = 0; j < tmpHessian->numCols(); ++j) {
248 if (j > 0) unitVector[j-1] = 0.;
250 tmpHessian->invertMultiply(unitVector, multVector);
251 for (
unsigned int i = 0; i < tmpHessian->numRowsLocal(); ++i) {
252 (*tmpCovMat)(i,j) = multVector[i];
255 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 5)) {
256 *m_env.subDisplayFile() <<
"In HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()"
257 <<
", position = " << position
258 <<
", stageId = " << stageId
259 <<
":\n H = " << *tmpHessian
260 <<
"\n H^{-1} = " << *tmpCovMat
261 <<
"\n H*H^{-1} = " << (*tmpHessian)*(*tmpCovMat)
262 <<
"\n H^{-1}*H = " << (*tmpCovMat)*(*tmpHessian)
267 *tmpCovMat = .5*((*tmpCovMat) + tmpCovMat->transpose());
270 M lowerChol(*tmpCovMat);
271 if ((m_env.subDisplayFile() ) &&
272 (m_env.displayVerbosity() >= 10)) {
273 *m_env.subDisplayFile() <<
"In HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()"
274 <<
", position = " << position
275 <<
", stageId = " << stageId
276 <<
": calling lowerChol.chol()"
277 <<
", lowerChol = " << lowerChol
280 int iRC = lowerChol.chol();
282 std::cerr <<
"In HessianCovMatricesTKGroup<V,M>::setPreComputingPosition(): chol failed\n";
284 if ((m_env.subDisplayFile() ) &&
285 (m_env.displayVerbosity() >= 10)) {
286 *m_env.subDisplayFile() <<
"In HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()"
287 <<
", position = " << position
288 <<
", stageId = " << stageId
289 <<
": got lowerChol.chol() with iRC = " << iRC
293 bool covIsPositiveDefinite = !iRC;
295 if (covIsPositiveDefinite) {
303 m_originalNewtonSteps[stageId] =
new V(-1.*(*tmpCovMat)*(*tmpGrad));
304 m_originalCovMatrices[stageId] =
new M(*tmpCovMat);
306 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 5)) {
307 *m_env.subDisplayFile() <<
"In HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()"
308 <<
", position = " << position
309 <<
", stageId = " << stageId
310 <<
", about to instantiate a Gaussian RV"
311 <<
": tmpHessian = " << *tmpHessian
312 <<
", preComputingPos = " << *m_preComputingPositions[stageId]
313 <<
", tmpCovMat = " << *tmpCovMat
314 <<
", tmpGrad = " << *tmpGrad
315 <<
", preComputedPos = " << *m_preComputingPositions[stageId] + *m_originalNewtonSteps[stageId]
322 *m_preComputingPositions[stageId] + *m_originalNewtonSteps[stageId],
323 *m_originalCovMatrices[stageId]);
326 validPreComputingPosition =
false;
334 validPreComputingPosition =
false;
337 if (validPreComputingPosition ==
false) {
339 V tmpGrad (m_vectorSpace->zeroVector());
340 M tmpCovMat(tmpGrad,1.);
341 m_originalNewtonSteps[stageId] =
new V(-1.*tmpCovMat*tmpGrad);
342 m_originalCovMatrices[stageId] =
new M(tmpCovMat);
345 *m_preComputingPositions[stageId],
349 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 5)) {
350 *m_env.subDisplayFile() <<
"Leaving HessianCovMatricesTKGroup<V,M>::setPreComputingPosition()"
351 <<
": position = " << position
352 <<
", stageId = " << stageId
356 return validPreComputingPosition;
359 template<
class V,
class M>
365 "HessianCovMatricesTKGroup<V,M>::clearPreComputingPositions()",
366 "m_preComputingPositions.size() != m_originalNewtonSteps.size()");
370 "HessianCovMatricesTKGroup<V,M>::clearPreComputingPositions()",
371 "m_preComputingPositions.size() != m_originalCovMatrices.size()");
376 for (
unsigned int i = 0; i < m_rvs.size(); ++i) {
383 for (
unsigned int i = 0; i < m_originalNewtonSteps.size(); ++i) {
384 if (m_originalNewtonSteps[i]) {
385 delete m_originalNewtonSteps[i];
386 m_originalNewtonSteps[i] = NULL;
390 for (
unsigned int i = 0; i < m_originalCovMatrices.size(); ++i) {
391 if (m_originalCovMatrices[i]) {
392 delete m_originalCovMatrices[i];
393 m_originalCovMatrices[i] = NULL;
400 template<
class V,
class M>
std::vector< M * > m_originalCovMatrices
void clearPreComputingPositions()
Clears the pre-computing positions m_preComputingPositions[stageId].
virtual void clearPreComputingPositions()
Clears the pre-computing positions m_preComputingPositions[stageId].
A class representing a vector space.
std::ofstream * subDisplayFile() const
Access function for m_subDisplayFile (displays file on stream).
void print(std::ostream &os) const
TODO: Prints the transition kernel.
std::vector< const V * > m_preComputingPositions
const GaussianVectorRV< V, M > & rv(unsigned int stageId)
Gaussian increment property to construct a transition kernel.
virtual bool setPreComputingPosition(const V &position, unsigned int stageId)
Sets the pre-computing positions m_preComputingPositions[stageId] with a new vector of size position...
virtual void print(std::ostream &os) const
TODO: Prints the transition kernel.
std::vector< GaussianVectorRV< V, M > * > m_rvs
#define UQ_FATAL_TEST_MACRO(test, givenRank, where, what)
bool setPreComputingPosition(const V &position, unsigned int stageId)
Sets the pre-computing positions m_preComputingPositions[stageId] with a new vector of size position...
~HessianCovMatricesTKGroup()
Destructor.
std::vector< V * > m_originalNewtonSteps
This base class allows the representation of a transition kernel.
bool symmetric() const
Whether or not the matrix is symmetric. Always 'false'.
This class allows the representation of a transition kernel with Hessians.
A class representing a Gaussian vector RV.
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...
unsigned int displayVerbosity() const
std::vector< double > m_scales
const BaseEnvironment & m_env