25 #include <queso/MetropolisHastingsSG.h>
26 #include <queso/GslVector.h>
27 #include <queso/GslMatrix.h>
29 #include <queso/HessianCovMatricesTKGroup.h>
30 #include <queso/ScaledCovMatrixTKGroup.h>
118 "MHRawChainInfoStruct::mpiSum()",
119 "failed MPI.Allreduce() for sum of doubles");
122 "MHRawChainInfoStruct::mpiSum()",
123 "failed MPI.Allreduce() for sum of unsigned ints");
129 template<
class P_V,
class P_M>
137 m_env (sourceRv.env()),
138 m_vectorSpace (sourceRv.imageSet().vectorSpace()),
139 m_targetPdf (sourceRv.pdf()),
140 m_initialPosition (initialPosition),
141 m_initialProposalCovMatrix (m_vectorSpace.zeroVector()),
142 m_nullInputProposalCovMatrix(inputProposalCovMatrix == NULL),
143 m_numDisabledParameters (0),
144 m_parameterEnabledStatus (m_vectorSpace.dimLocal(),
true),
147 m_positionIdForDebugging (0),
148 m_stageIdForDebugging (0),
149 m_idsOfUniquePositions (0),
151 m_alphaQuotients (0),
154 m_lastAdaptedCovMatrix (NULL),
155 m_numPositionsNotSubWritten (0),
156 #ifdef QUESO_USES_SEQUENCE_STATISTICAL_OPTIONS
157 m_alternativeOptionsValues (NULL,NULL),
159 m_alternativeOptionsValues (),
163 if (inputProposalCovMatrix != NULL) {
164 m_initialProposalCovMatrix = *inputProposalCovMatrix;
166 if (alternativeOptionsValues) m_alternativeOptionsValues = *alternativeOptionsValues;
167 if (m_env.optionsInputFileName() ==
"") {
172 m_optionsObj->scanOptionsValues();
175 if ((m_env.subDisplayFile() ) &&
176 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
177 *m_env.subDisplayFile() <<
"Entering MetropolisHastingsSG<P_V,P_M>::constructor(1)"
178 <<
": prefix = " << prefix
179 <<
", alternativeOptionsValues = " << alternativeOptionsValues
180 <<
", m_env.optionsInputFileName() = " << m_env.optionsInputFileName()
181 <<
", m_initialProposalCovMatrix = " << m_initialProposalCovMatrix
185 UQ_FATAL_TEST_MACRO(sourceRv.imageSet().vectorSpace().dimLocal() != initialPosition.sizeLocal(),
187 "MetropolisHastingsSG<P_V,P_M>::constructor(1)",
188 "'sourceRv' and 'initialPosition' should have equal dimensions");
190 if (inputProposalCovMatrix) {
191 UQ_FATAL_TEST_MACRO(sourceRv.imageSet().vectorSpace().dimLocal() != inputProposalCovMatrix->numRowsLocal(),
193 "MetropolisHastingsSG<P_V,P_M>::constructor(1)",
194 "'sourceRv' and 'inputProposalCovMatrix' should have equal dimensions");
195 UQ_FATAL_TEST_MACRO(inputProposalCovMatrix->numCols() != inputProposalCovMatrix->numRowsGlobal(),
197 "MetropolisHastingsSG<P_V,P_M>::constructor(1)",
198 "'inputProposalCovMatrix' should be a square matrix");
203 if ((m_env.subDisplayFile() ) &&
204 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
205 *m_env.subDisplayFile() <<
"Leaving MetropolisHastingsSG<P_V,P_M>::constructor(1)"
210 template<
class P_V,
class P_M>
214 const P_V& initialPosition,
215 const P_M* inputProposalCovMatrix)
217 m_env (sourceRv.env()),
218 m_vectorSpace (sourceRv.imageSet().vectorSpace()),
219 m_targetPdf (sourceRv.pdf()),
220 m_initialPosition (initialPosition),
221 m_initialProposalCovMatrix (m_vectorSpace.zeroVector()),
222 m_nullInputProposalCovMatrix(inputProposalCovMatrix == NULL),
223 m_numDisabledParameters (0),
224 m_parameterEnabledStatus (m_vectorSpace.dimLocal(),true),
227 m_positionIdForDebugging (0),
228 m_stageIdForDebugging (0),
229 m_idsOfUniquePositions (0),
231 m_alphaQuotients (0),
234 m_lastAdaptedCovMatrix (NULL),
235 #ifdef QUESO_USES_SEQUENCE_STATISTICAL_OPTIONS
236 m_alternativeOptionsValues (NULL,NULL),
238 m_alternativeOptionsValues (),
242 if (inputProposalCovMatrix != NULL) {
266 template<
class P_V,
class P_M>
274 if (m_lastAdaptedCovMatrix)
delete m_lastAdaptedCovMatrix;
275 if (m_lastMean)
delete m_lastMean;
277 m_rawChainInfo.reset();
278 m_alphaQuotients.clear();
279 m_logTargets.clear();
280 m_numDisabledParameters = 0;
281 m_parameterEnabledStatus.clear();
282 m_positionIdForDebugging = 0;
283 m_stageIdForDebugging = 0;
284 m_idsOfUniquePositions.clear();
286 if (m_tk )
delete m_tk;
287 if (m_targetPdfSynchronizer)
delete m_targetPdfSynchronizer;
288 if (m_optionsObj )
delete m_optionsObj;
297 template<
class P_V,
class P_M>
304 if ((m_env.subDisplayFile() ) &&
305 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
306 *m_env.subDisplayFile() <<
"Entering MetropolisHastingsSG<P_V,P_M>::commonConstructor()"
310 if (m_optionsObj->m_ov.m_initialPositionDataInputFileName !=
".") {
311 std::set<unsigned int> tmpSet;
312 tmpSet.insert(m_env.subId());
313 m_initialPosition.subReadContents((m_optionsObj->m_ov.m_initialPositionDataInputFileName+
"_sub"+m_env.subIdString()),
314 m_optionsObj->m_ov.m_initialPositionDataInputFileType,
316 if ((m_env.subDisplayFile() ) &&
317 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
318 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::commonConstructor()"
319 <<
": just read initial position contents = " << m_initialPosition
324 if (m_optionsObj->m_ov.m_parameterDisabledSet.size() > 0) {
325 for (std::set<unsigned int>::iterator setIt = m_optionsObj->m_ov.m_parameterDisabledSet.begin(); setIt != m_optionsObj->m_ov.m_parameterDisabledSet.end(); ++setIt) {
326 unsigned int paramId = *setIt;
327 if (paramId < m_vectorSpace.dimLocal()) {
328 m_numDisabledParameters++;
329 m_parameterEnabledStatus[paramId] =
false;
334 std::vector<double> drScalesAll(m_optionsObj->m_ov.m_drScalesForExtraStages.size()+1,1.);
335 for (
unsigned int i = 1; i < (m_optionsObj->m_ov.m_drScalesForExtraStages.size()+1); ++i) {
336 drScalesAll[i] = m_optionsObj->m_ov.m_drScalesForExtraStages[i-1];
338 if (m_optionsObj->m_ov.m_tkUseLocalHessian) {
342 *m_targetPdfSynchronizer);
343 if ((m_env.subDisplayFile() ) &&
344 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
345 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::commonConstructor()"
346 <<
": just instantiated a 'HessianCovMatrices' TK class"
351 if (m_optionsObj->m_ov.m_initialProposalCovMatrixDataInputFileName !=
".") {
352 std::set<unsigned int> tmpSet;
353 tmpSet.insert(m_env.subId());
354 m_initialProposalCovMatrix.subReadContents((m_optionsObj->m_ov.m_initialProposalCovMatrixDataInputFileName+
"_sub"+m_env.subIdString()),
355 m_optionsObj->m_ov.m_initialProposalCovMatrixDataInputFileType,
357 if ((m_env.subDisplayFile() ) &&
358 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
359 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::commonConstructor()"
360 <<
": just read initial proposal cov matrix contents = " << m_initialProposalCovMatrix
367 "MetropolisHastingsSG<P_V,P_M>::commonConstructor()",
368 "proposal cov matrix should have been passed by user, since, according to the input algorithm options, local Hessians will not be used in the proposal");
374 m_initialProposalCovMatrix);
375 if ((m_env.subDisplayFile() ) &&
376 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
377 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::commonConstructor()"
378 <<
": just instantiated a 'ScaledCovMatrix' TK class"
383 if ((m_env.subDisplayFile() ) &&
384 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
385 *m_env.subDisplayFile() <<
"Leaving MetropolisHastingsSG<P_V,P_M>::commonConstructor()"
391 template<
class P_V,
class P_M>
396 unsigned int xStageId,
397 unsigned int yStageId,
398 double* alphaQuotientPtr)
400 double alphaQuotient = 0.;
405 ( (boost::math::isnan)(x.
logTarget()) )) {
406 std::cerr <<
"WARNING In MetropolisHastingsSG<P_V,P_M>::alpha(x,y)"
407 <<
", worldRank " << m_env.worldRank()
408 <<
", fullRank " << m_env.fullRank()
409 <<
", subEnvironment " << m_env.subId()
410 <<
", subRank " << m_env.subRank()
411 <<
", inter0Rank " << m_env.inter0Rank()
412 <<
", positionId = " << m_positionIdForDebugging
413 <<
", stageId = " << m_stageIdForDebugging
419 else if ((y.
logTarget() == -INFINITY ) ||
421 ( (boost::math::isnan)(y.
logTarget()) )) {
422 std::cerr <<
"WARNING In MetropolisHastingsSG<P_V,P_M>::alpha(x,y)"
423 <<
", worldRank " << m_env.worldRank()
424 <<
", fullRank " << m_env.fullRank()
425 <<
", subEnvironment " << m_env.subId()
426 <<
", subRank " << m_env.subRank()
427 <<
", inter0Rank " << m_env.inter0Rank()
428 <<
", positionId = " << m_positionIdForDebugging
429 <<
", stageId = " << m_stageIdForDebugging
437 if (m_tk->symmetric()) {
438 alphaQuotient = std::exp(yLogTargetToUse - x.
logTarget());
439 if ((m_env.subDisplayFile() ) &&
440 (m_env.displayVerbosity() >= 3 ) &&
441 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
442 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::alpha(x,y)"
443 <<
": symmetric proposal case"
446 <<
", yLogTargetToUse = " << yLogTargetToUse
448 <<
", alpha = " << alphaQuotient
453 #ifdef QUESO_EXPECTS_LN_LIKELIHOOD_INSTEAD_OF_MINUS_2_LN
454 double qyx = m_tk->rv(yStageId).pdf().lnValue(x.
vecValues(),NULL,NULL,NULL,NULL);
456 double qyx = -.5 * m_tk->rv(yStageId).pdf().lnValue(x.
vecValues(),NULL,NULL,NULL,NULL);
458 if ((m_env.subDisplayFile() ) &&
459 (m_env.displayVerbosity() >= 10 ) &&
460 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
462 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::alpha(x,y)"
468 #ifdef QUESO_EXPECTS_LN_LIKELIHOOD_INSTEAD_OF_MINUS_2_LN
469 double qxy = m_tk->rv(xStageId).pdf().lnValue(y.
vecValues(),NULL,NULL,NULL,NULL);
471 double qxy = -.5 * m_tk->rv(xStageId).pdf().lnValue(y.
vecValues(),NULL,NULL,NULL,NULL);
473 if ((m_env.subDisplayFile() ) &&
474 (m_env.displayVerbosity() >= 10 ) &&
475 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
477 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::alpha(x,y)"
483 alphaQuotient = std::exp(yLogTargetToUse +
487 if ((m_env.subDisplayFile() ) &&
488 (m_env.displayVerbosity() >= 3 ) &&
489 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
490 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::alpha(x,y)"
491 <<
": asymmetric proposal case"
492 <<
", xStageId = " << xStageId
493 <<
", yStageId = " << yStageId
496 <<
", yLogTargetToUse = " << yLogTargetToUse
497 <<
", q(y,x) = " << qyx
499 <<
", q(x,y) = " << qxy
500 <<
", alpha = " << alphaQuotient
507 if ((m_env.subDisplayFile() ) &&
508 (m_env.displayVerbosity() >= 10 ) &&
509 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
510 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::alpha(x,y)"
516 if (alphaQuotientPtr != NULL) *alphaQuotientPtr = alphaQuotient;
518 return std::min(1.,alphaQuotient);
521 template<
class P_V,
class P_M>
525 const std::vector<unsigned int >& inputTKStageIds)
527 unsigned int inputSize = inputPositionsData.size();
528 if ((m_env.subDisplayFile() ) &&
529 (m_env.displayVerbosity() >= 10 ) &&
530 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
531 *m_env.subDisplayFile() <<
"Entering MetropolisHastingsSG<P_V,P_M>::alpha(vec)"
532 <<
", inputSize = " << inputSize
537 "MetropolisHastingsSG<P_V,P_M>::alpha(vec)",
538 "inputPositionsData has size < 2");
541 if (inputPositionsData[0 ]->outOfTargetSupport())
return 0.;
542 if (inputPositionsData[inputSize-1]->outOfTargetSupport())
return 0.;
544 if ((inputPositionsData[0]->logTarget() == -INFINITY ) ||
545 (inputPositionsData[0]->logTarget() == INFINITY ) ||
546 ( (boost::math::isnan)(inputPositionsData[0]->logTarget()) )) {
547 std::cerr <<
"WARNING In MetropolisHastingsSG<P_V,P_M>::alpha(vec)"
548 <<
", worldRank " << m_env.worldRank()
549 <<
", fullRank " << m_env.fullRank()
550 <<
", subEnvironment " << m_env.subId()
551 <<
", subRank " << m_env.subRank()
552 <<
", inter0Rank " << m_env.inter0Rank()
553 <<
", positionId = " << m_positionIdForDebugging
554 <<
", stageId = " << m_stageIdForDebugging
555 <<
": inputSize = " << inputSize
556 <<
", inputPositionsData[0]->logTarget() = " << inputPositionsData[0]->logTarget()
557 <<
", [0]->values() = " << inputPositionsData[0]->vecValues()
558 <<
", [inputSize - 1]->values() = " << inputPositionsData[inputSize-1]->vecValues()
562 else if ((inputPositionsData[inputSize - 1]->logTarget() == -INFINITY ) ||
563 (inputPositionsData[inputSize - 1]->logTarget() == INFINITY ) ||
564 ( (boost::math::isnan)(inputPositionsData[inputSize - 1]->logTarget()) )) {
565 std::cerr <<
"WARNING In MetropolisHastingsSG<P_V,P_M>::alpha(vec)"
566 <<
", worldRank " << m_env.worldRank()
567 <<
", fullRank " << m_env.fullRank()
568 <<
", subEnvironment " << m_env.subId()
569 <<
", subRank " << m_env.subRank()
570 <<
", inter0Rank " << m_env.inter0Rank()
571 <<
", positionId = " << m_positionIdForDebugging
572 <<
", stageId = " << m_stageIdForDebugging
573 <<
": inputSize = " << inputSize
574 <<
", inputPositionsData[inputSize - 1]->logTarget() = " << inputPositionsData[inputSize-1]->logTarget()
575 <<
", [0]->values() = " << inputPositionsData[0]->vecValues()
576 <<
", [inputSize - 1]->values() = " << inputPositionsData[inputSize-1]->vecValues()
582 if (inputSize == 2)
return this->alpha(*(inputPositionsData[0 ]),
583 *(inputPositionsData[inputSize - 1]),
585 inputTKStageIds[inputSize-1]);
588 std::vector<MarkovChainPositionData<P_V>*> positionsData (inputSize,NULL);
589 std::vector<MarkovChainPositionData<P_V>*> backwardPositionsData (inputSize,NULL);
591 std::vector<unsigned int > tkStageIds (inputSize,0);
592 std::vector<unsigned int > backwardTKStageIds (inputSize,0);
594 std::vector<unsigned int > tkStageIdsLess1(inputSize,0);
595 std::vector<unsigned int > backwardTKStageIdsLess1(inputSize,0);
597 for (
unsigned int i = 0; i < inputSize; ++i) {
598 positionsData [i] = inputPositionsData[i];
599 backwardPositionsData [i] = inputPositionsData[inputSize-i-1];
601 tkStageIds [i] = inputTKStageIds [i];
602 backwardTKStageIds [i] = inputTKStageIds [inputSize-i-1];
604 tkStageIdsLess1[i] = inputTKStageIds [i];
605 backwardTKStageIdsLess1[i] = inputTKStageIds [inputSize-i-1];
608 tkStageIdsLess1.pop_back();
609 backwardTKStageIdsLess1.pop_back();
612 double logNumerator = 0.;
613 double logDenominator = 0.;
614 double alphasNumerator = 1.;
615 double alphasDenominator = 1.;
618 const P_V& _lastTKPosition = m_tk->preComputingPosition( tkStageIds[inputSize-1]);
619 const P_V& _lastBackwardTKPosition = m_tk->preComputingPosition(backwardTKStageIds[inputSize-1]);
621 #ifdef QUESO_EXPECTS_LN_LIKELIHOOD_INSTEAD_OF_MINUS_2_LN
622 double numContrib = m_tk->rv(backwardTKStageIdsLess1).pdf().lnValue(_lastBackwardTKPosition,NULL,NULL,NULL,NULL);
623 double denContrib = m_tk->rv( tkStageIdsLess1).pdf().lnValue(_lastTKPosition ,NULL,NULL,NULL,NULL);
625 double numContrib = -.5 * m_tk->rv(backwardTKStageIdsLess1).pdf().lnValue(_lastBackwardTKPosition,NULL,NULL,NULL,NULL);
626 double denContrib = -.5 * m_tk->rv( tkStageIdsLess1).pdf().lnValue(_lastTKPosition ,NULL,NULL,NULL,NULL);
628 if ((m_env.subDisplayFile() ) &&
629 (m_env.displayVerbosity() >= 10 ) &&
630 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
631 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::alpha(vec)"
632 <<
", inputSize = " << inputSize
634 <<
": numContrib = " << numContrib
635 <<
", denContrib = " << denContrib
638 logNumerator += numContrib;
639 logDenominator += denContrib;
641 for (
unsigned int i = 0; i < (inputSize-2); ++i) {
642 positionsData.pop_back();
643 backwardPositionsData.pop_back();
645 const P_V& lastTKPosition = m_tk->preComputingPosition( tkStageIds[inputSize-2-i]);
646 const P_V& lastBackwardTKPosition = m_tk->preComputingPosition(backwardTKStageIds[inputSize-2-i]);
648 tkStageIds.pop_back();
649 backwardTKStageIds.pop_back();
651 tkStageIdsLess1.pop_back();
652 backwardTKStageIdsLess1.pop_back();
654 #ifdef QUESO_EXPECTS_LN_LIKELIHOOD_INSTEAD_OF_MINUS_2_LN
655 numContrib = m_tk->rv(backwardTKStageIdsLess1).pdf().lnValue(lastBackwardTKPosition,NULL,NULL,NULL,NULL);
656 denContrib = m_tk->rv( tkStageIdsLess1).pdf().lnValue(lastTKPosition ,NULL,NULL,NULL,NULL);
658 numContrib = -.5 * m_tk->rv(backwardTKStageIdsLess1).pdf().lnValue(lastBackwardTKPosition,NULL,NULL,NULL,NULL);
659 denContrib = -.5 * m_tk->rv( tkStageIdsLess1).pdf().lnValue(lastTKPosition ,NULL,NULL,NULL,NULL);
661 if ((m_env.subDisplayFile() ) &&
662 (m_env.displayVerbosity() >= 10 ) &&
663 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
664 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::alpha(vec)"
665 <<
", inputSize = " << inputSize
666 <<
", in loop, i = " << i
667 <<
": numContrib = " << numContrib
668 <<
", denContrib = " << denContrib
671 logNumerator += numContrib;
672 logDenominator += denContrib;
674 alphasNumerator *= (1. - this->alpha(backwardPositionsData,backwardTKStageIds));
675 alphasDenominator *= (1. - this->alpha( positionsData, tkStageIds));
678 double numeratorLogTargetToUse = backwardPositionsData[0]->logTarget();
679 numContrib = numeratorLogTargetToUse;
680 denContrib = positionsData[0]->logTarget();
681 if ((m_env.subDisplayFile() ) &&
682 (m_env.displayVerbosity() >= 10 ) &&
683 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
684 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::alpha(vec)"
685 <<
", inputSize = " << inputSize
687 <<
": numContrib = " << numContrib
688 <<
", denContrib = " << denContrib
691 logNumerator += numContrib;
692 logDenominator += denContrib;
694 if ((m_env.subDisplayFile() ) &&
695 (m_env.displayVerbosity() >= 10 ) &&
696 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
697 *m_env.subDisplayFile() <<
"Leaving MetropolisHastingsSG<P_V,P_M>::alpha(vec)"
698 <<
", inputSize = " << inputSize
699 <<
": alphasNumerator = " << alphasNumerator
700 <<
", alphasDenominator = " << alphasDenominator
701 <<
", logNumerator = " << logNumerator
702 <<
", logDenominator = " << logDenominator
707 return std::min(1.,(alphasNumerator/alphasDenominator)*std::exp(logNumerator-logDenominator));
710 template<
class P_V,
class P_M>
716 if (alpha <= 0. ) result =
false;
717 else if (alpha >= 1. ) result =
true;
718 else if (alpha >= m_env.rngObject()->uniformSample()) result =
true;
724 template<
class P_V,
class P_M>
728 std::ofstream& ofsvar)
const
730 if ((m_env.subDisplayFile() ) &&
731 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
732 *m_env.subDisplayFile() <<
"\n"
733 <<
"\n-----------------------------------------------------"
734 <<
"\n Writing more information about the Markov chain " << workingChain.
name() <<
" to output file ..."
735 <<
"\n-----------------------------------------------------"
742 if (m_optionsObj->m_ov.m_rawChainGenerateExtra) {
744 ofsvar << m_optionsObj->m_prefix <<
"logTargets_sub" << m_env.subIdString() <<
" = zeros(" << m_logTargets.size()
748 ofsvar << m_optionsObj->m_prefix <<
"logTargets_sub" << m_env.subIdString() <<
" = [";
749 for (
unsigned int i = 0; i < m_logTargets.size(); ++i) {
750 ofsvar << m_logTargets[i]
756 ofsvar << m_optionsObj->m_prefix <<
"alphaQuotients_sub" << m_env.subIdString() <<
" = zeros(" << m_alphaQuotients.size()
760 ofsvar << m_optionsObj->m_prefix <<
"alphaQuotients_sub" << m_env.subIdString() <<
" = [";
761 for (
unsigned int i = 0; i < m_alphaQuotients.size(); ++i) {
762 ofsvar << m_alphaQuotients[i]
769 ofsvar << m_optionsObj->m_prefix <<
"rejected = " << (double) m_rawChainInfo.numRejections/(
double) (workingChain.
subSequenceSize()-1)
775 ofsvar << m_optionsObj->m_prefix <<
"componentNames = {";
776 m_vectorSpace.printComponentsNames(ofsvar,
false);
780 ofsvar << m_optionsObj->m_prefix <<
"outTargetSupport = " << (double) m_rawChainInfo.numOutOfTargetSupport/(
double) (workingChain.
subSequenceSize()-1)
785 ofsvar << m_optionsObj->m_prefix <<
"runTime = " << m_rawChainInfo.runTime
790 if ((m_env.subDisplayFile() ) &&
791 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
792 *m_env.subDisplayFile() <<
"\n-----------------------------------------------------"
793 <<
"\n Finished writing more information about the Markov chain " << workingChain.
name()
794 <<
"\n-----------------------------------------------------"
809 template <
class P_V,
class P_M>
816 if ((m_env.subDisplayFile() ) &&
817 (m_env.displayVerbosity() >= 5 ) &&
818 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
819 *m_env.subDisplayFile() <<
"Entering MetropolisHastingsSG<P_V,P_M>::generateSequence()..."
825 "MetropolisHastingsSG<P_V,P_M>::generateSequence()",
826 "'m_vectorSpace' and 'workingChain' are related to vector spaces of different dimensions");
829 MiscCheckTheParallelEnvironment<P_V,P_V>(m_initialPosition,
832 P_V valuesOf1stPosition(m_initialPosition);
835 workingChain.
setName(m_optionsObj->m_prefix +
"rawChain");
841 generateFullChain(valuesOf1stPosition,
842 m_optionsObj->m_ov.m_rawChainSize,
844 workingLogLikelihoodValues,
845 workingLogTargetValues);
848 readFullChain(m_optionsObj->m_ov.m_rawChainDataInputFileName,
849 m_optionsObj->m_ov.m_rawChainDataInputFileType,
850 m_optionsObj->m_ov.m_rawChainSize,
857 if ((m_env.subDisplayFile() ) &&
858 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
859 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
860 <<
", prefix = " << m_optionsObj->m_prefix
861 <<
", chain name = " << workingChain.
name()
862 <<
": about to try to open generic output file '" << m_optionsObj->m_ov.m_dataOutputFileName
864 <<
"', subId = " << m_env.subId()
865 <<
", subenv is allowed to write (1/true or 0/false) = " << (m_optionsObj->m_ov.m_dataOutputAllowedSet.find(m_env.subId()) != m_optionsObj->m_ov.m_dataOutputAllowedSet.end())
871 m_env.openOutputFile(m_optionsObj->m_ov.m_dataOutputFileName,
873 m_optionsObj->m_ov.m_dataOutputAllowedSet,
877 if ((m_env.subDisplayFile() ) &&
878 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
879 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
880 <<
", prefix = " << m_optionsObj->m_prefix
881 <<
", raw chain name = " << workingChain.
name()
882 <<
": returned from opening generic output file '" << m_optionsObj->m_ov.m_dataOutputFileName
884 <<
"', subId = " << m_env.subId()
894 (m_optionsObj->m_ov.m_totallyMute ==
false )) {
897 if ((m_env.subDisplayFile() ) &&
898 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
899 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
900 <<
", prefix = " << m_optionsObj->m_prefix
901 <<
", raw chain name = " << workingChain.
name()
902 <<
": about to try to write raw sub chain output file '" << m_optionsObj->m_ov.m_rawChainDataOutputFileName
903 <<
"." << m_optionsObj->m_ov.m_rawChainDataOutputFileType
904 <<
"', subId = " << m_env.subId()
905 <<
", subenv is allowed to write 1/true or 0/false) = " << (m_optionsObj->m_ov.m_rawChainDataOutputAllowedSet.find(m_env.subId()) != m_optionsObj->m_ov.m_rawChainDataOutputAllowedSet.end())
910 if ((m_numPositionsNotSubWritten > 0 ) &&
911 (m_optionsObj->m_ov.m_rawChainDataOutputFileName !=
".")) {
912 workingChain.
subWriteContents(m_optionsObj->m_ov.m_rawChainSize - m_numPositionsNotSubWritten,
913 m_numPositionsNotSubWritten,
914 m_optionsObj->m_ov.m_rawChainDataOutputFileName,
915 m_optionsObj->m_ov.m_rawChainDataOutputFileType,
916 m_optionsObj->m_ov.m_rawChainDataOutputAllowedSet);
917 if ((m_env.subDisplayFile() ) &&
918 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
919 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
920 <<
": just wrote (per period request) remaining " << m_numPositionsNotSubWritten <<
" chain positions "
921 <<
", " << m_optionsObj->m_ov.m_rawChainSize - m_numPositionsNotSubWritten <<
" <= pos <= " << m_optionsObj->m_ov.m_rawChainSize - 1
925 if (workingLogLikelihoodValues) {
926 workingLogLikelihoodValues->
subWriteContents(m_optionsObj->m_ov.m_rawChainSize - m_numPositionsNotSubWritten,
927 m_numPositionsNotSubWritten,
928 m_optionsObj->m_ov.m_rawChainDataOutputFileName +
"_likelihood",
929 m_optionsObj->m_ov.m_rawChainDataOutputFileType,
930 m_optionsObj->m_ov.m_rawChainDataOutputAllowedSet);
933 if (workingLogTargetValues) {
934 workingLogTargetValues->
subWriteContents(m_optionsObj->m_ov.m_rawChainSize - m_numPositionsNotSubWritten,
935 m_numPositionsNotSubWritten,
936 m_optionsObj->m_ov.m_rawChainDataOutputFileName +
"_target",
937 m_optionsObj->m_ov.m_rawChainDataOutputFileType,
938 m_optionsObj->m_ov.m_rawChainDataOutputAllowedSet);
941 m_numPositionsNotSubWritten = 0;
945 if (workingLogLikelihoodValues) {
951 "MetropolisHastingsSG<P_V,P_M>::generateSequence()",
952 "rawSubMLEpositions.subSequenceSize() = 0");
954 if ((m_env.subDisplayFile() ) &&
955 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
956 P_V tmpVec(m_vectorSpace.zeroVector());
958 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
959 <<
": just computed MLE"
960 <<
", rawSubMLEvalue = " << rawSubMLEvalue
961 <<
", rawSubMLEpositions.subSequenceSize() = " << rawSubMLEpositions.
subSequenceSize()
962 <<
", rawSubMLEpositions[0] = " << tmpVec
968 if (workingLogTargetValues) {
974 "MetropolisHastingsSG<P_V,P_M>::generateSequence()",
975 "rawSubMAPpositions.subSequenceSize() = 0");
977 if ((m_env.subDisplayFile() ) &&
978 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
979 P_V tmpVec(m_vectorSpace.zeroVector());
981 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
982 <<
": just computed MAP"
983 <<
", rawSubMAPvalue = " << rawSubMAPvalue
984 <<
", rawSubMAPpositions.subSequenceSize() = " << rawSubMAPpositions.
subSequenceSize()
985 <<
", rawSubMAPpositions[0] = " << tmpVec
990 if ((m_env.subDisplayFile() ) &&
991 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
992 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
993 <<
", prefix = " << m_optionsObj->m_prefix
994 <<
", raw chain name = " << workingChain.
name()
995 <<
": returned from writing raw sub chain output file '" << m_optionsObj->m_ov.m_rawChainDataOutputFileName
996 <<
"." << m_optionsObj->m_ov.m_rawChainDataOutputFileType
997 <<
"', subId = " << m_env.subId()
1002 if ((m_env.subDisplayFile() ) &&
1003 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1004 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1005 <<
", prefix = " << m_optionsObj->m_prefix
1006 <<
", raw chain name = " << workingChain.
name()
1007 <<
": about to try to write raw unified chain output file '" << m_optionsObj->m_ov.m_rawChainDataOutputFileName
1008 <<
"." << m_optionsObj->m_ov.m_rawChainDataOutputFileType
1009 <<
"', subId = " << m_env.subId()
1015 m_optionsObj->m_ov.m_rawChainDataOutputFileType);
1016 if ((m_env.subDisplayFile() ) &&
1017 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1018 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1019 <<
", prefix = " << m_optionsObj->m_prefix
1020 <<
", raw chain name = " << workingChain.
name()
1021 <<
": returned from writing raw unified chain output file '" << m_optionsObj->m_ov.m_rawChainDataOutputFileName
1022 <<
"." << m_optionsObj->m_ov.m_rawChainDataOutputFileType
1023 <<
"', subId = " << m_env.subId()
1027 if (workingLogLikelihoodValues) {
1028 workingLogLikelihoodValues->
unifiedWriteContents(m_optionsObj->m_ov.m_rawChainDataOutputFileName +
"_likelihood",
1029 m_optionsObj->m_ov.m_rawChainDataOutputFileType);
1032 if (workingLogTargetValues) {
1033 workingLogTargetValues->
unifiedWriteContents(m_optionsObj->m_ov.m_rawChainDataOutputFileName +
"_target",
1034 m_optionsObj->m_ov.m_rawChainDataOutputFileType);
1038 if (workingLogLikelihoodValues) {
1041 rawUnifiedMLEpositions);
1044 "MetropolisHastingsSG<P_V,P_M>::generateSequence()",
1045 "rawUnifiedMLEpositions.subSequenceSize() = 0");
1047 if ((m_env.subDisplayFile() ) &&
1048 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1049 P_V tmpVec(m_vectorSpace.zeroVector());
1051 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1052 <<
": just computed MLE"
1053 <<
", rawUnifiedMLEvalue = " << rawUnifiedMLEvalue
1054 <<
", rawUnifiedMLEpositions.subSequenceSize() = " << rawUnifiedMLEpositions.
subSequenceSize()
1055 <<
", rawUnifiedMLEpositions[0] = " << tmpVec
1061 if (workingLogTargetValues) {
1064 rawUnifiedMAPpositions);
1068 "MetropolisHastingsSG<P_V,P_M>::generateSequence()",
1069 "rawUnifiedMAPpositions.subSequenceSize() = 0");
1071 if ((m_env.subDisplayFile() ) &&
1072 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1073 P_V tmpVec(m_vectorSpace.zeroVector());
1075 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1076 <<
": just computed MAP"
1077 <<
", rawUnifiedMAPvalue = " << rawUnifiedMAPvalue
1078 <<
", rawUnifiedMAPpositions.subSequenceSize() = " << rawUnifiedMAPpositions.
subSequenceSize()
1079 <<
", rawUnifiedMAPpositions[0] = " << tmpVec
1086 if ((genericFilePtrSet.
ofsVar ) &&
1087 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1089 iRC = writeInfo(workingChain,
1090 *genericFilePtrSet.
ofsVar);
1093 "MetropolisHastingsSG<P_V,P_M>::generateSequence()",
1094 "improper writeInfo() return");
1097 #ifdef QUESO_USES_SEQUENCE_STATISTICAL_OPTIONS
1098 if (m_optionsObj->m_ov.m_rawChainComputeStats) {
1099 workingChain.computeStatistics(*m_optionsObj->m_rawChainStatisticalOptionsObj,
1100 genericFilePtrSet.
ofsVar);
1110 if (m_optionsObj->m_ov.m_filteredChainGenerate) {
1112 unsigned int filterInitialPos = (
unsigned int) (m_optionsObj->m_ov.m_filteredChainDiscardedPortion * (
double) workingChain.
subSequenceSize());
1113 unsigned int filterSpacing = m_optionsObj->m_ov.m_filteredChainLag;
1114 if (filterSpacing == 0) {
1121 workingChain.
filter(filterInitialPos,
1123 workingChain.
setName(m_optionsObj->m_prefix +
"filtChain");
1125 if (workingLogLikelihoodValues) workingLogLikelihoodValues->
filter(filterInitialPos,
1128 if (workingLogTargetValues) workingLogTargetValues->
filter(filterInitialPos,
1132 if ((m_env.subDisplayFile() ) &&
1133 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1134 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1135 <<
", prefix = " << m_optionsObj->m_prefix
1136 <<
": checking necessity of opening output files for filtered chain " << workingChain.
name()
1143 (m_optionsObj->m_ov.m_totallyMute ==
false )) {
1146 m_optionsObj->m_ov.m_filteredChainDataOutputFileName,
1147 m_optionsObj->m_ov.m_filteredChainDataOutputFileType,
1148 m_optionsObj->m_ov.m_filteredChainDataOutputAllowedSet);
1149 if ((m_env.subDisplayFile() ) &&
1150 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1151 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1152 <<
", prefix = " << m_optionsObj->m_prefix
1153 <<
": closed sub output file '" << m_optionsObj->m_ov.m_filteredChainDataOutputFileName
1154 <<
"' for filtered chain " << workingChain.
name()
1158 if (workingLogLikelihoodValues) {
1161 m_optionsObj->m_ov.m_filteredChainDataOutputFileName +
"_likelihood",
1162 m_optionsObj->m_ov.m_filteredChainDataOutputFileType,
1163 m_optionsObj->m_ov.m_filteredChainDataOutputAllowedSet);
1166 if (workingLogTargetValues) {
1169 m_optionsObj->m_ov.m_filteredChainDataOutputFileName +
"_target",
1170 m_optionsObj->m_ov.m_filteredChainDataOutputFileType,
1171 m_optionsObj->m_ov.m_filteredChainDataOutputAllowedSet);
1179 (m_optionsObj->m_ov.m_totallyMute == false )) {
1181 m_optionsObj->m_ov.m_filteredChainDataOutputFileType);
1182 if ((m_env.subDisplayFile() ) &&
1183 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1184 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1185 <<
", prefix = " << m_optionsObj->m_prefix
1186 <<
": closed unified output file '" << m_optionsObj->m_ov.m_filteredChainDataOutputFileName
1187 <<
"' for filtered chain " << workingChain.
name()
1191 if (workingLogLikelihoodValues) {
1192 workingLogLikelihoodValues->
unifiedWriteContents(m_optionsObj->m_ov.m_filteredChainDataOutputFileName +
"_likelihood",
1193 m_optionsObj->m_ov.m_filteredChainDataOutputFileType);
1196 if (workingLogTargetValues) {
1197 workingLogTargetValues->
unifiedWriteContents(m_optionsObj->m_ov.m_filteredChainDataOutputFileName +
"_target",
1198 m_optionsObj->m_ov.m_filteredChainDataOutputFileType);
1205 #ifdef QUESO_USES_SEQUENCE_STATISTICAL_OPTIONS
1206 if (m_optionsObj->m_ov.m_filteredChainComputeStats) {
1207 workingChain.computeStatistics(*m_optionsObj->m_filteredChainStatisticalOptionsObj,
1208 genericFilePtrSet.
ofsVar);
1216 if (genericFilePtrSet.
ofsVar) {
1218 delete genericFilePtrSet.
ofsVar;
1219 if ((m_env.subDisplayFile() ) &&
1220 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1221 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1222 <<
", prefix = " << m_optionsObj->m_prefix
1223 <<
": closed generic output file '" << m_optionsObj->m_ov.m_dataOutputFileName
1224 <<
"' (chain name is " << workingChain.
name()
1230 if ((m_env.subDisplayFile() ) &&
1231 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1232 *m_env.subDisplayFile() << std::endl;
1237 if ((m_env.subDisplayFile() ) &&
1238 (m_env.displayVerbosity() >= 5 ) &&
1239 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1240 *m_env.subDisplayFile() <<
"Leaving MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1248 template<
class P_V,
class P_M>
1252 info = m_rawChainInfo;
1256 template <
class P_V,
class P_M>
1259 const std::string& inputFileName,
1260 const std::string& inputFileType,
1261 unsigned int chainSize,
1268 template <
class P_V,
class P_M>
1271 const P_V& valuesOf1stPosition,
1272 unsigned int chainSize,
1279 if ((m_env.subDisplayFile() ) &&
1280 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1281 *m_env.subDisplayFile() <<
"Starting the generation of Markov chain " << workingChain.
name()
1282 <<
", with " << chainSize
1288 struct timeval timevalChain;
1289 struct timeval timevalCandidate;
1290 struct timeval timevalTarget;
1291 struct timeval timevalMhAlpha;
1292 struct timeval timevalDrAlpha;
1293 struct timeval timevalDR;
1294 struct timeval timevalAM;
1296 m_positionIdForDebugging = 0;
1297 m_stageIdForDebugging = 0;
1299 m_rawChainInfo.reset();
1301 iRC = gettimeofday(&timevalChain, NULL);
1303 if ((m_env.subDisplayFile() ) &&
1304 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1305 *m_env.subDisplayFile() <<
"\nIn MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1306 <<
": contents of initial position are:";
1307 *m_env.subDisplayFile() << valuesOf1stPosition;
1308 *m_env.subDisplayFile() <<
"\nIn MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1309 <<
": targetPdf.domaintSet() info is:"
1310 << m_targetPdf.domainSet();
1311 *m_env.subDisplayFile() << std::endl;
1314 bool outOfTargetSupport = !m_targetPdf.domainSet().contains(valuesOf1stPosition);
1315 if ((m_env.subDisplayFile()) &&
1316 (outOfTargetSupport )) {
1317 *m_env.subDisplayFile() <<
"ERROR: In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1318 <<
": contents of initial position are:\n";
1319 *m_env.subDisplayFile() << valuesOf1stPosition;
1320 *m_env.subDisplayFile() <<
"\nERROR: In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1321 <<
": targetPdf.domaintSet() info is:\n"
1322 << m_targetPdf.domainSet();
1323 *m_env.subDisplayFile() << std::endl;
1327 "MetropolisHastingsSG<P_V,P_M>::generateFullChain()",
1328 "initial position should not be out of target pdf support");
1329 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) iRC = gettimeofday(&timevalTarget, NULL);
1330 double logPrior = 0.;
1331 double logLikelihood = 0.;
1332 #ifdef QUESO_EXPECTS_LN_LIKELIHOOD_INSTEAD_OF_MINUS_2_LN
1333 double logTarget = m_targetPdfSynchronizer->callFunction(&valuesOf1stPosition,NULL,NULL,NULL,NULL,&logPrior,&logLikelihood);
1335 double logTarget = -0.5 * m_targetPdfSynchronizer->callFunction(&valuesOf1stPosition,NULL,NULL,NULL,NULL,&logPrior,&logLikelihood);
1337 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) m_rawChainInfo.targetRunTime +=
MiscGetEllapsedSeconds(&timevalTarget);
1338 m_rawChainInfo.numTargetCalls++;
1339 if ((m_env.subDisplayFile() ) &&
1340 (m_env.displayVerbosity() >= 3 ) &&
1341 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1342 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1343 <<
": just returned from likelihood() for initial chain position"
1344 <<
", m_rawChainInfo.numTargetCalls = " << m_rawChainInfo.numTargetCalls
1345 <<
", logPrior = " << logPrior
1346 <<
", logLikelihood = " << logLikelihood
1347 <<
", logTarget = " << logTarget
1353 valuesOf1stPosition,
1358 P_V gaussianVector(m_vectorSpace.zeroVector());
1359 P_V tmpVecValues(m_vectorSpace.zeroVector());
1366 m_numPositionsNotSubWritten = 0;
1367 if (workingLogLikelihoodValues) workingLogLikelihoodValues->
resizeSequence(chainSize);
1368 if (workingLogTargetValues ) workingLogTargetValues->
resizeSequence (chainSize);
1369 if (
true) m_idsOfUniquePositions.resize(chainSize,0);
1370 if (m_optionsObj->m_ov.m_rawChainGenerateExtra) {
1371 m_logTargets.resize (chainSize,0.);
1372 m_alphaQuotients.resize(chainSize,0.);
1375 unsigned int uniquePos = 0;
1377 m_numPositionsNotSubWritten++;
1378 if ((m_optionsObj->m_ov.m_rawChainDataOutputPeriod > 0 ) &&
1379 (((0+1) % m_optionsObj->m_ov.m_rawChainDataOutputPeriod) == 0 ) &&
1380 (m_optionsObj->m_ov.m_rawChainDataOutputFileName !=
".")) {
1381 workingChain.
subWriteContents(0 + 1 - m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
1382 m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
1383 m_optionsObj->m_ov.m_rawChainDataOutputFileName,
1384 m_optionsObj->m_ov.m_rawChainDataOutputFileType,
1385 m_optionsObj->m_ov.m_rawChainDataOutputAllowedSet);
1386 if ((m_env.subDisplayFile() ) &&
1387 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1388 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1389 <<
": just wrote (per period request) " << m_numPositionsNotSubWritten <<
" chain positions "
1390 <<
", " << 0 + 1 - m_optionsObj->m_ov.m_rawChainDataOutputPeriod <<
" <= pos <= " << 0
1394 if (workingLogLikelihoodValues) {
1395 workingLogLikelihoodValues->
subWriteContents(0 + 1 - m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
1396 m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
1397 m_optionsObj->m_ov.m_rawChainDataOutputFileName +
"_likelihood",
1398 m_optionsObj->m_ov.m_rawChainDataOutputFileType,
1399 m_optionsObj->m_ov.m_rawChainDataOutputAllowedSet);
1402 if (workingLogTargetValues) {
1403 workingLogTargetValues->
subWriteContents(0 + 1 - m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
1404 m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
1405 m_optionsObj->m_ov.m_rawChainDataOutputFileName +
"_target",
1406 m_optionsObj->m_ov.m_rawChainDataOutputFileType,
1407 m_optionsObj->m_ov.m_rawChainDataOutputAllowedSet);
1410 m_numPositionsNotSubWritten = 0;
1413 if (workingLogLikelihoodValues) (*workingLogLikelihoodValues)[0] = currentPositionData.
logLikelihood();
1414 if (workingLogTargetValues ) (*workingLogTargetValues )[0] = currentPositionData.
logTarget();
1415 if (
true) m_idsOfUniquePositions[uniquePos++] = 0;
1416 if (m_optionsObj->m_ov.m_rawChainGenerateExtra) {
1417 m_logTargets [0] = currentPositionData.
logTarget();
1418 m_alphaQuotients[0] = 1.;
1422 if ((m_env.subDisplayFile() ) &&
1423 (m_env.displayVerbosity() >= 10 ) &&
1424 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1425 *m_env.subDisplayFile() <<
"\n"
1426 <<
"\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
1436 if ((m_env.numSubEnvironments() < (
unsigned int) m_env.fullComm().NumProc()) &&
1437 (m_initialPosition.numOfProcsForStorage() == 1 ) &&
1438 (m_env.subRank() != 0 )) {
1441 aux = m_targetPdfSynchronizer->callFunction(NULL,
1449 for (
unsigned int positionId = 1; positionId < workingChain.
subSequenceSize(); ++positionId) {
1453 m_rawChainInfo.numRejections++;
1456 else for (
unsigned int positionId = 1; positionId < workingChain.
subSequenceSize(); ++positionId) {
1461 m_positionIdForDebugging = positionId;
1462 if ((m_env.subDisplayFile() ) &&
1463 (m_env.displayVerbosity() >= 3 ) &&
1464 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1465 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1466 <<
": beginning chain position of id = " << positionId
1467 <<
", m_optionsObj->m_ov.m_drMaxNumExtraStages = " << m_optionsObj->m_ov.m_drMaxNumExtraStages
1470 unsigned int stageId = 0;
1471 m_stageIdForDebugging = stageId;
1473 m_tk->clearPreComputingPositions();
1475 if ((m_env.subDisplayFile() ) &&
1476 (m_env.displayVerbosity() >= 5 ) &&
1477 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1478 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1479 <<
": about to set TK pre computing position of local id " << 0
1480 <<
", values = " << currentPositionData.
vecValues()
1483 bool validPreComputingPosition = m_tk->setPreComputingPosition(currentPositionData.
vecValues(),0);
1484 if ((m_env.subDisplayFile() ) &&
1485 (m_env.displayVerbosity() >= 5 ) &&
1486 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1487 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1488 <<
": returned from setting TK pre computing position of local id " << 0
1489 <<
", values = " << currentPositionData.
vecValues()
1490 <<
", valid = " << validPreComputingPosition
1495 "MetropolisHastingsSG<P_V,P_M>::generateFullChain()",
1496 "initial position should not be an invalid pre computing position");
1503 bool keepGeneratingCandidates =
true;
1504 while (keepGeneratingCandidates) {
1505 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) iRC = gettimeofday(&timevalCandidate, NULL);
1506 m_tk->rv(0).realizer().realization(tmpVecValues);
1507 if (m_numDisabledParameters > 0) {
1508 for (
unsigned int paramId = 0; paramId < m_vectorSpace.dimLocal(); ++paramId) {
1509 if (m_parameterEnabledStatus[paramId] ==
false) {
1510 tmpVecValues[paramId] = m_initialPosition[paramId];
1514 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) m_rawChainInfo.candidateRunTime +=
MiscGetEllapsedSeconds(&timevalCandidate);
1516 outOfTargetSupport = !m_targetPdf.domainSet().contains(tmpVecValues);
1518 bool displayDetail = (m_env.displayVerbosity() >= 10) || m_optionsObj->m_ov.m_displayCandidates;
1519 if ((m_env.subDisplayFile() ) &&
1521 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1522 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1523 <<
": for chain position of id = " << positionId
1524 <<
", candidate = " << tmpVecValues
1525 <<
", outOfTargetSupport = " << outOfTargetSupport
1529 if (m_optionsObj->m_ov.m_putOutOfBoundsInChain) keepGeneratingCandidates =
false;
1530 else keepGeneratingCandidates = outOfTargetSupport;
1533 if ((m_env.subDisplayFile() ) &&
1534 (m_env.displayVerbosity() >= 5 ) &&
1535 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1536 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1537 <<
": about to set TK pre computing position of local id " << stageId+1
1538 <<
", values = " << tmpVecValues
1541 validPreComputingPosition = m_tk->setPreComputingPosition(tmpVecValues,stageId+1);
1542 if ((m_env.subDisplayFile() ) &&
1543 (m_env.displayVerbosity() >= 5 ) &&
1544 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1545 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1546 <<
": returned from setting TK pre computing position of local id " << stageId+1
1547 <<
", values = " << tmpVecValues
1548 <<
", valid = " << validPreComputingPosition
1552 if (outOfTargetSupport) {
1553 m_rawChainInfo.numOutOfTargetSupport++;
1554 logPrior = -INFINITY;
1555 logLikelihood = -INFINITY;
1556 logTarget = -INFINITY;
1559 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) iRC = gettimeofday(&timevalTarget, NULL);
1560 #ifdef QUESO_EXPECTS_LN_LIKELIHOOD_INSTEAD_OF_MINUS_2_LN
1561 logTarget = m_targetPdfSynchronizer->callFunction(&tmpVecValues,NULL,NULL,NULL,NULL,&logPrior,&logLikelihood);
1563 logTarget = -0.5 * m_targetPdfSynchronizer->callFunction(&tmpVecValues,NULL,NULL,NULL,NULL,&logPrior,&logLikelihood);
1565 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) m_rawChainInfo.targetRunTime +=
MiscGetEllapsedSeconds(&timevalTarget);
1566 m_rawChainInfo.numTargetCalls++;
1567 if ((m_env.subDisplayFile() ) &&
1568 (m_env.displayVerbosity() >= 3 ) &&
1569 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1570 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1571 <<
": just returned from likelihood() for chain position of id " << positionId
1572 <<
", m_rawChainInfo.numTargetCalls = " << m_rawChainInfo.numTargetCalls
1573 <<
", logPrior = " << logPrior
1574 <<
", logLikelihood = " << logLikelihood
1575 <<
", logTarget = " << logTarget
1579 currentCandidateData.set(tmpVecValues,
1584 if ((m_env.subDisplayFile() ) &&
1585 (m_env.displayVerbosity() >= 10 ) &&
1586 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1587 *m_env.subDisplayFile() <<
"\n"
1588 <<
"\n-----------------------------------------------------------\n"
1592 bool accept =
false;
1593 double alphaFirstCandidate = 0.;
1594 if (outOfTargetSupport) {
1595 if (m_optionsObj->m_ov.m_rawChainGenerateExtra) {
1596 m_alphaQuotients[positionId] = 0.;
1600 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) iRC = gettimeofday(&timevalMhAlpha, NULL);
1601 if (m_optionsObj->m_ov.m_rawChainGenerateExtra) {
1602 alphaFirstCandidate = this->alpha(currentPositionData,currentCandidateData,0,1,&m_alphaQuotients[positionId]);
1605 alphaFirstCandidate = this->alpha(currentPositionData,currentCandidateData,0,1,NULL);
1607 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) m_rawChainInfo.mhAlphaRunTime +=
MiscGetEllapsedSeconds(&timevalMhAlpha);
1608 if ((m_env.subDisplayFile() ) &&
1609 (m_env.displayVerbosity() >= 10 ) &&
1610 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1611 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1612 <<
": for chain position of id = " << positionId
1615 accept = acceptAlpha(alphaFirstCandidate);
1618 bool displayDetail = (m_env.displayVerbosity() >= 10) || m_optionsObj->m_ov.m_displayCandidates;
1619 if ((m_env.subDisplayFile() ) &&
1621 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1622 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1623 <<
": for chain position of id = " << positionId
1624 <<
", outOfTargetSupport = " << outOfTargetSupport
1625 <<
", alpha = " << alphaFirstCandidate
1626 <<
", accept = " << accept
1627 <<
", currentCandidateData.vecValues() = ";
1628 *m_env.subDisplayFile() << currentCandidateData.vecValues();
1629 *m_env.subDisplayFile() <<
"\n"
1630 <<
"\n curLogTarget = " << currentPositionData.
logTarget()
1632 <<
"\n canLogTarget = " << currentCandidateData.logTarget()
1636 if ((m_env.subDisplayFile() ) &&
1637 (m_env.displayVerbosity() >= 10 ) &&
1638 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1639 *m_env.subDisplayFile() <<
"\n"
1640 <<
"\n-----------------------------------------------------------\n"
1650 std::vector<MarkovChainPositionData<P_V>*> drPositionsData(stageId+2,NULL);
1651 std::vector<unsigned int> tkStageIds (stageId+2,0);
1652 if ((accept ==
false) &&
1653 (outOfTargetSupport ==
false) &&
1654 (m_optionsObj->m_ov.m_drMaxNumExtraStages > 0 )) {
1655 if ((m_optionsObj->m_ov.m_drDuringAmNonAdaptiveInt ==
false ) &&
1656 (m_optionsObj->m_ov.m_tkUseLocalHessian ==
false ) &&
1657 (m_optionsObj->m_ov.m_amInitialNonAdaptInterval > 0 ) &&
1658 (m_optionsObj->m_ov.m_amAdaptInterval > 0 ) &&
1659 (positionId <= m_optionsObj->m_ov.m_amInitialNonAdaptInterval)) {
1663 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) iRC = gettimeofday(&timevalDR, NULL);
1671 while ((validPreComputingPosition ==
true ) &&
1672 (accept == false ) &&
1673 (stageId < m_optionsObj->m_ov.m_drMaxNumExtraStages)) {
1674 if ((m_env.subDisplayFile() ) &&
1675 (m_env.displayVerbosity() >= 10 ) &&
1676 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1677 *m_env.subDisplayFile() <<
"\n"
1678 <<
"\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-"
1682 m_rawChainInfo.numDRs++;
1684 m_stageIdForDebugging = stageId;
1685 if ((m_env.subDisplayFile() ) &&
1686 (m_env.displayVerbosity() >= 10 ) &&
1687 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1688 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1689 <<
": for chain position of id = " << positionId
1690 <<
", beginning stageId = " << stageId
1694 keepGeneratingCandidates =
true;
1695 while (keepGeneratingCandidates) {
1696 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) iRC = gettimeofday(&timevalCandidate, NULL);
1697 m_tk->rv(tkStageIds).realizer().realization(tmpVecValues);
1698 if (m_numDisabledParameters > 0) {
1699 for (
unsigned int paramId = 0; paramId < m_vectorSpace.dimLocal(); ++paramId) {
1700 if (m_parameterEnabledStatus[paramId] ==
false) {
1701 tmpVecValues[paramId] = m_initialPosition[paramId];
1705 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) m_rawChainInfo.candidateRunTime +=
MiscGetEllapsedSeconds(&timevalCandidate);
1707 outOfTargetSupport = !m_targetPdf.domainSet().contains(tmpVecValues);
1709 if (m_optionsObj->m_ov.m_putOutOfBoundsInChain) keepGeneratingCandidates =
false;
1710 else keepGeneratingCandidates = outOfTargetSupport;
1713 if ((m_env.subDisplayFile() ) &&
1714 (m_env.displayVerbosity() >= 5 ) &&
1715 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1716 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1717 <<
": about to set TK pre computing position of local id " << stageId+1
1718 <<
", values = " << tmpVecValues
1721 validPreComputingPosition = m_tk->setPreComputingPosition(tmpVecValues,stageId+1);
1722 if ((m_env.subDisplayFile() ) &&
1723 (m_env.displayVerbosity() >= 5 ) &&
1724 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1725 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1726 <<
": returned from setting TK pre computing position of local id " << stageId+1
1727 <<
", values = " << tmpVecValues
1728 <<
", valid = " << validPreComputingPosition
1732 if (outOfTargetSupport) {
1733 m_rawChainInfo.numOutOfTargetSupportInDR++;
1734 logPrior = -INFINITY;
1735 logLikelihood = -INFINITY;
1736 logTarget = -INFINITY;
1739 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) iRC = gettimeofday(&timevalTarget, NULL);
1740 #ifdef QUESO_EXPECTS_LN_LIKELIHOOD_INSTEAD_OF_MINUS_2_LN
1741 logTarget = m_targetPdfSynchronizer->callFunction(&tmpVecValues,NULL,NULL,NULL,NULL,&logPrior,&logLikelihood);
1743 logTarget = -0.5 * m_targetPdfSynchronizer->callFunction(&tmpVecValues,NULL,NULL,NULL,NULL,&logPrior,&logLikelihood);
1745 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) m_rawChainInfo.targetRunTime +=
MiscGetEllapsedSeconds(&timevalTarget);
1746 m_rawChainInfo.numTargetCalls++;
1747 if ((m_env.subDisplayFile() ) &&
1748 (m_env.displayVerbosity() >= 3 ) &&
1749 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1750 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1751 <<
": just returned from likelihood() for chain position of id " << positionId
1752 <<
", m_rawChainInfo.numTargetCalls = " << m_rawChainInfo.numTargetCalls
1753 <<
", stageId = " << stageId
1754 <<
", logPrior = " << logPrior
1755 <<
", logLikelihood = " << logLikelihood
1756 <<
", logTarget = " << logTarget
1760 currentCandidateData.set(tmpVecValues,
1766 tkStageIds.push_back (stageId+1);
1768 double alphaDR = 0.;
1769 if (outOfTargetSupport ==
false) {
1770 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) iRC = gettimeofday(&timevalDrAlpha, NULL);
1771 alphaDR = this->alpha(drPositionsData,tkStageIds);
1772 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) m_rawChainInfo.drAlphaRunTime +=
MiscGetEllapsedSeconds(&timevalDrAlpha);
1773 accept = acceptAlpha(alphaDR);
1776 displayDetail = (m_env.displayVerbosity() >= 10) || m_optionsObj->m_ov.m_displayCandidates;
1777 if ((m_env.subDisplayFile() ) &&
1779 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1780 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1781 <<
": for chain position of id = " << positionId
1782 <<
" and stageId = " << stageId
1783 <<
", outOfTargetSupport = " << outOfTargetSupport
1784 <<
", alpha = " << alphaDR
1785 <<
", accept = " << accept
1786 <<
", currentCandidateData.vecValues() = ";
1787 *m_env.subDisplayFile() << currentCandidateData.vecValues();
1788 *m_env.subDisplayFile() << std::endl;
1792 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) m_rawChainInfo.drRunTime +=
MiscGetEllapsedSeconds(&timevalDR);
1796 for (
unsigned int i = 0; i < drPositionsData.size(); ++i) {
1797 if (drPositionsData[i])
delete drPositionsData[i];
1806 if (
true) m_idsOfUniquePositions[uniquePos++] = positionId;
1807 currentPositionData = currentCandidateData;
1811 m_rawChainInfo.numRejections++;
1813 m_numPositionsNotSubWritten++;
1814 if ((m_optionsObj->m_ov.m_rawChainDataOutputPeriod > 0 ) &&
1815 (((positionId+1) % m_optionsObj->m_ov.m_rawChainDataOutputPeriod) == 0 ) &&
1816 (m_optionsObj->m_ov.m_rawChainDataOutputFileName !=
".")) {
1817 if ((m_env.subDisplayFile() ) &&
1818 (m_env.displayVerbosity() >= 10 ) &&
1819 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1820 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1821 <<
", for chain position of id = " << positionId
1822 <<
": about to write (per period request) " << m_numPositionsNotSubWritten <<
" chain positions "
1823 <<
", " << positionId + 1 - m_optionsObj->m_ov.m_rawChainDataOutputPeriod <<
" <= pos <= " << positionId
1826 workingChain.
subWriteContents(positionId + 1 - m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
1827 m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
1828 m_optionsObj->m_ov.m_rawChainDataOutputFileName,
1829 m_optionsObj->m_ov.m_rawChainDataOutputFileType,
1830 m_optionsObj->m_ov.m_rawChainDataOutputAllowedSet);
1831 if ((m_env.subDisplayFile() ) &&
1832 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1833 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1834 <<
", for chain position of id = " << positionId
1835 <<
": just wrote (per period request) " << m_numPositionsNotSubWritten <<
" chain positions "
1836 <<
", " << positionId + 1 - m_optionsObj->m_ov.m_rawChainDataOutputPeriod <<
" <= pos <= " << positionId
1840 if (workingLogLikelihoodValues) {
1841 workingLogLikelihoodValues->
subWriteContents(0 + 1 - m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
1842 m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
1843 m_optionsObj->m_ov.m_rawChainDataOutputFileName +
"_likelihood",
1844 m_optionsObj->m_ov.m_rawChainDataOutputFileType,
1845 m_optionsObj->m_ov.m_rawChainDataOutputAllowedSet);
1848 if (workingLogTargetValues) {
1849 workingLogTargetValues->
subWriteContents(0 + 1 - m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
1850 m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
1851 m_optionsObj->m_ov.m_rawChainDataOutputFileName +
"_target",
1852 m_optionsObj->m_ov.m_rawChainDataOutputFileType,
1853 m_optionsObj->m_ov.m_rawChainDataOutputAllowedSet);
1856 m_numPositionsNotSubWritten = 0;
1860 if (workingLogLikelihoodValues) (*workingLogLikelihoodValues)[positionId] = currentPositionData.
logLikelihood();
1861 if (workingLogTargetValues ) (*workingLogTargetValues )[positionId] = currentPositionData.
logTarget();
1863 if (m_optionsObj->m_ov.m_rawChainGenerateExtra) {
1864 m_logTargets[positionId] = currentPositionData.
logTarget();
1867 if( m_optionsObj->m_ov.m_enableBrooksGelmanConvMonitor > 0 ) {
1868 if( positionId%m_optionsObj->m_ov.m_enableBrooksGelmanConvMonitor == 0 &&
1869 positionId > m_optionsObj->m_ov.m_BrooksGelmanLag+1 ) {
1872 positionId - m_optionsObj->m_ov.m_BrooksGelmanLag );
1874 if ( m_env.subDisplayFile() ) {
1875 *m_env.subDisplayFile() <<
"positionId = " << positionId
1876 <<
", conv_est = " << conv_est << std::endl;
1877 (*m_env.subDisplayFile()).flush();
1887 if ((m_optionsObj->m_ov.m_tkUseLocalHessian ==
false) &&
1888 (m_optionsObj->m_ov.m_amInitialNonAdaptInterval > 0) &&
1889 (m_optionsObj->m_ov.m_amAdaptInterval > 0)) {
1890 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) iRC = gettimeofday(&timevalAM, NULL);
1893 unsigned int idOfFirstPositionInSubChain = 0;
1897 bool printAdaptedMatrix =
false;
1898 if (positionId < m_optionsObj->m_ov.m_amInitialNonAdaptInterval) {
1901 else if (positionId == m_optionsObj->m_ov.m_amInitialNonAdaptInterval) {
1902 idOfFirstPositionInSubChain = 0;
1903 partialChain.
resizeSequence(m_optionsObj->m_ov.m_amInitialNonAdaptInterval+1);
1904 m_lastMean = m_vectorSpace.newVector();
1905 m_lastAdaptedCovMatrix = m_vectorSpace.newMatrix();
1906 printAdaptedMatrix =
true;
1909 unsigned int interval = positionId - m_optionsObj->m_ov.m_amInitialNonAdaptInterval;
1910 if ((interval % m_optionsObj->m_ov.m_amAdaptInterval) == 0) {
1911 idOfFirstPositionInSubChain = positionId - m_optionsObj->m_ov.m_amAdaptInterval;
1912 partialChain.
resizeSequence(m_optionsObj->m_ov.m_amAdaptInterval);
1914 if (m_optionsObj->m_ov.m_amAdaptedMatricesDataOutputPeriod > 0) {
1915 if ((interval % m_optionsObj->m_ov.m_amAdaptedMatricesDataOutputPeriod) == 0) {
1916 printAdaptedMatrix =
true;
1924 P_V transporterVec(m_vectorSpace.zeroVector());
1929 updateAdaptedCovMatrix(partialChain,
1930 idOfFirstPositionInSubChain,
1933 *m_lastAdaptedCovMatrix);
1935 if ((printAdaptedMatrix ==
true) &&
1936 (m_optionsObj->m_ov.m_amAdaptedMatricesDataOutputFileName !=
"." )) {
1937 char varNamePrefix[64];
1938 sprintf(varNamePrefix,
"mat_am%d",positionId);
1941 sprintf(tmpChar,
"_am%d",positionId);
1943 std::set<unsigned int> tmpSet;
1944 tmpSet.insert(m_env.subId());
1946 m_lastAdaptedCovMatrix->subWriteContents(varNamePrefix,
1947 (m_optionsObj->m_ov.m_amAdaptedMatricesDataOutputFileName+tmpChar),
1948 m_optionsObj->m_ov.m_amAdaptedMatricesDataOutputFileType,
1950 if ((m_env.subDisplayFile() ) &&
1951 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1952 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1953 <<
": just wrote last adapted proposal cov matrix contents = " << *m_lastAdaptedCovMatrix
1958 bool tmpCholIsPositiveDefinite =
false;
1959 P_M tmpChol(*m_lastAdaptedCovMatrix);
1960 P_M attemptedMatrix(tmpChol);
1961 if ((m_env.subDisplayFile() ) &&
1962 (m_env.displayVerbosity() >= 10)) {
1964 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1965 <<
", positionId = " << positionId
1966 <<
": 'am' calling first tmpChol.chol()"
1969 iRC = tmpChol.chol();
1971 std::cerr <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain(): first chol failed\n";
1973 if ((m_env.subDisplayFile() ) &&
1974 (m_env.displayVerbosity() >= 10)) {
1976 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1977 <<
", positionId = " << positionId
1978 <<
": 'am' got first tmpChol.chol() with iRC = " << iRC
1981 double diagMult = 1.;
1982 for (
unsigned int j = 0; j < tmpChol.numRowsLocal(); ++j) {
1983 diagMult *= tmpChol(j,j);
1985 *m_env.subDisplayFile() <<
"diagMult = " << diagMult
1989 #if 0 // tentative logic
1991 double diagMult = 1.;
1992 for (
unsigned int j = 0; j < tmpChol.numRowsLocal(); ++j) {
1993 diagMult *= tmpChol(j,j);
1995 if (diagMult < 1.e-40) {
2004 "MetropolisHastingsSG<P_V,P_M>::generateFullChain()",
2005 "invalid iRC returned from first chol()");
2007 P_M* tmpDiag = m_vectorSpace.newDiagMatrix(m_optionsObj->m_ov.m_amEpsilon);
2008 if (m_numDisabledParameters > 0) {
2009 for (
unsigned int paramId = 0; paramId < m_vectorSpace.dimLocal(); ++paramId) {
2010 if (m_parameterEnabledStatus[paramId] ==
false) {
2011 (*tmpDiag)(paramId,paramId) = 0.;
2015 tmpChol = *m_lastAdaptedCovMatrix + *tmpDiag;
2016 attemptedMatrix = tmpChol;
2018 if ((m_env.subDisplayFile() ) &&
2019 (m_env.displayVerbosity() >= 10)) {
2021 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
2022 <<
", positionId = " << positionId
2023 <<
": 'am' calling second tmpChol.chol()"
2026 iRC = tmpChol.chol();
2028 std::cerr <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain(): second chol failed\n";
2030 if ((m_env.subDisplayFile() ) &&
2031 (m_env.displayVerbosity() >= 10)) {
2033 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
2034 <<
", positionId = " << positionId
2035 <<
": 'am' got second tmpChol.chol() with iRC = " << iRC
2038 double diagMult = 1.;
2039 for (
unsigned int j = 0; j < tmpChol.numRowsLocal(); ++j) {
2040 diagMult *= tmpChol(j,j);
2042 *m_env.subDisplayFile() <<
"diagMult = " << diagMult
2046 *m_env.subDisplayFile() <<
"attemptedMatrix = " << attemptedMatrix
2053 "MetropolisHastingsSG<P_V,P_M>::generateFullChain()",
2054 "invalid iRC returned from second chol()");
2058 tmpCholIsPositiveDefinite =
true;
2062 tmpCholIsPositiveDefinite =
true;
2064 if (tmpCholIsPositiveDefinite) {
2066 P_M tmpMatrix(m_optionsObj->m_ov.m_amEta*attemptedMatrix);
2067 if (m_numDisabledParameters > 0) {
2068 for (
unsigned int paramId = 0; paramId < m_vectorSpace.dimLocal(); ++paramId) {
2069 if (m_parameterEnabledStatus[paramId] ==
false) {
2070 for (
unsigned int i = 0; i < m_vectorSpace.dimLocal(); ++i) {
2071 tmpMatrix(i,paramId) = 0.;
2073 for (
unsigned int j = 0; j < m_vectorSpace.dimLocal(); ++j) {
2074 tmpMatrix(paramId,j) = 0.;
2076 tmpMatrix(paramId,paramId) = 1.;
2082 #ifdef UQ_DRAM_MCG_REQUIRES_INVERTED_COV_MATRICES
2085 "MetropolisHastingsSG<P_V,P_M>::generateFullChain()",
2086 "need to code the update of m_upperCholProposalPrecMatrices");
2095 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) m_rawChainInfo.amRunTime +=
MiscGetEllapsedSeconds(&timevalAM);
2102 if ((m_env.subDisplayFile() ) &&
2103 (m_env.displayVerbosity() >= 3 ) &&
2104 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
2105 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
2106 <<
": finishing chain position of id = " << positionId
2107 <<
", accept = " << accept
2108 <<
", curLogTarget = " << currentPositionData.
logTarget()
2109 <<
", canLogTarget = " << currentCandidateData.logTarget()
2113 if ((m_optionsObj->m_ov.m_rawChainDisplayPeriod > 0) &&
2114 (((positionId+1) % m_optionsObj->m_ov.m_rawChainDisplayPeriod) == 0)) {
2115 if ((m_env.subDisplayFile() ) &&
2116 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
2117 *m_env.subDisplayFile() <<
"Finished generating " << positionId+1
2119 <<
", curret rejection percentage = " << (100. * ((double) m_rawChainInfo.numRejections)/((double) (positionId+1)))
2125 if ((m_env.subDisplayFile() ) &&
2126 (m_env.displayVerbosity() >= 10 ) &&
2127 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
2128 *m_env.subDisplayFile() <<
"\n"
2129 <<
"\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
2135 if ((m_env.numSubEnvironments() < (
unsigned int) m_env.fullComm().NumProc()) &&
2136 (m_initialPosition.numOfProcsForStorage() == 1 ) &&
2137 (m_env.subRank() == 0 )) {
2140 aux = m_targetPdfSynchronizer->callFunction(NULL,
2154 if ((m_env.subDisplayFile() ) &&
2155 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
2156 *m_env.subDisplayFile() <<
"Finished the generation of Markov chain " << workingChain.
name()
2159 *m_env.subDisplayFile() <<
"\nSome information about this chain:"
2160 <<
"\n Chain run time = " << m_rawChainInfo.runTime
2162 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) {
2163 *m_env.subDisplayFile() <<
"\n\n Breaking of the chain run time:\n";
2164 *m_env.subDisplayFile() <<
"\n Candidate run time = " << m_rawChainInfo.candidateRunTime
2165 <<
" seconds (" << 100.*m_rawChainInfo.candidateRunTime/m_rawChainInfo.runTime
2167 *m_env.subDisplayFile() <<
"\n Num target calls = " << m_rawChainInfo.numTargetCalls;
2168 *m_env.subDisplayFile() <<
"\n Target d. run time = " << m_rawChainInfo.targetRunTime
2169 <<
" seconds (" << 100.*m_rawChainInfo.targetRunTime/m_rawChainInfo.runTime
2171 *m_env.subDisplayFile() <<
"\n Avg target run time = " << m_rawChainInfo.targetRunTime/((double) m_rawChainInfo.numTargetCalls)
2173 *m_env.subDisplayFile() <<
"\n Mh alpha run time = " << m_rawChainInfo.mhAlphaRunTime
2174 <<
" seconds (" << 100.*m_rawChainInfo.mhAlphaRunTime/m_rawChainInfo.runTime
2176 *m_env.subDisplayFile() <<
"\n Dr alpha run time = " << m_rawChainInfo.drAlphaRunTime
2177 <<
" seconds (" << 100.*m_rawChainInfo.drAlphaRunTime/m_rawChainInfo.runTime
2179 *m_env.subDisplayFile() <<
"\n---------------------- --------------";
2180 double sumRunTime = m_rawChainInfo.candidateRunTime + m_rawChainInfo.targetRunTime + m_rawChainInfo.mhAlphaRunTime + m_rawChainInfo.drAlphaRunTime;
2181 *m_env.subDisplayFile() <<
"\n Sum = " << sumRunTime
2182 <<
" seconds (" << 100.*sumRunTime/m_rawChainInfo.runTime
2184 *m_env.subDisplayFile() <<
"\n\n Other run times:";
2185 *m_env.subDisplayFile() <<
"\n DR run time = " << m_rawChainInfo.drRunTime
2186 <<
" seconds (" << 100.*m_rawChainInfo.drRunTime/m_rawChainInfo.runTime
2188 *m_env.subDisplayFile() <<
"\n AM run time = " << m_rawChainInfo.amRunTime
2189 <<
" seconds (" << 100.*m_rawChainInfo.amRunTime/m_rawChainInfo.runTime
2192 *m_env.subDisplayFile() <<
"\n Number of DRs = " << m_rawChainInfo.numDRs <<
"(num_DRs/chain_size = " << (double) m_rawChainInfo.numDRs/(
double) workingChain.
subSequenceSize()
2194 *m_env.subDisplayFile() <<
"\n Out of target support in DR = " << m_rawChainInfo.numOutOfTargetSupportInDR;
2195 *m_env.subDisplayFile() <<
"\n Rejection percentage = " << 100. * (double) m_rawChainInfo.numRejections/(
double) workingChain.
subSequenceSize()
2197 *m_env.subDisplayFile() <<
"\n Out of target support percentage = " << 100. * (double) m_rawChainInfo.numOutOfTargetSupport/(
double) workingChain.
subSequenceSize()
2199 *m_env.subDisplayFile() << std::endl;
2210 template <
class P_V,
class P_M>
2214 unsigned int idOfFirstPositionInSubChain,
2215 double& lastChainSize,
2217 P_M& lastAdaptedCovMatrix)
2220 if (lastChainSize == 0) {
2223 "MetropolisHastingsSG<P_V,P_M>::updateAdaptedCovMatrix()",
2224 "'partialChain.subSequenceSize()' should be >= 2");
2226 #if 1 // prudenci-2012-07-06
2232 P_V tmpVec(m_vectorSpace.zeroVector());
2233 lastAdaptedCovMatrix = -doubleSubChainSize *
matrixProduct(lastMean,lastMean);
2238 lastAdaptedCovMatrix /= (doubleSubChainSize - 1.);
2243 "MetropolisHastingsSG<P_V,P_M>::updateAdaptedCovMatrix()",
2244 "'partialChain.subSequenceSize()' should be >= 1");
2248 "MetropolisHastingsSG<P_V,P_M>::updateAdaptedCovMatrix()",
2249 "'idOfFirstPositionInSubChain' should be >= 1");
2251 P_V tmpVec (m_vectorSpace.zeroVector());
2252 P_V diffVec(m_vectorSpace.zeroVector());
2254 double doubleCurrentId = (double) (idOfFirstPositionInSubChain+i);
2256 diffVec = tmpVec - lastMean;
2258 double ratio1 = (1. - 1./doubleCurrentId);
2259 double ratio2 = (1./(1.+doubleCurrentId));
2260 lastAdaptedCovMatrix = ratio1 * lastAdaptedCovMatrix + ratio2 *
matrixProduct(diffVec,diffVec);
2261 lastMean += ratio2 * diffVec;
2264 lastChainSize += doubleSubChainSize;
2266 if (m_numDisabledParameters > 0) {
2267 for (
unsigned int paramId = 0; paramId < m_vectorSpace.dimLocal(); ++paramId) {
2268 if (m_parameterEnabledStatus[paramId] ==
false) {
2269 for (
unsigned int i = 0; i < m_vectorSpace.dimLocal(); ++i) {
2270 lastAdaptedCovMatrix(i,paramId) = 0.;
2272 for (
unsigned int j = 0; j < m_vectorSpace.dimLocal(); ++j) {
2273 lastAdaptedCovMatrix(paramId,j) = 0.;
2275 lastAdaptedCovMatrix(paramId,paramId) = 1.;
~MetropolisHastingsSG()
Destructor.
const std::string & name() const
Access to protected attribute m_name: name of the sequence of vectors.
void generateFullChain(const P_V &valuesOf1stPosition, unsigned int chainSize, BaseVectorSequence< P_V, P_M > &workingChain, ScalarSequence< double > *workingLogLikelihoodValues, ScalarSequence< double > *workingLogTargetValues)
This method generates the chain.
MHRawChainInfoStruct()
Constructor.
A class for handling Gaussian joint PDFs.
void getPositionValues(unsigned int posId, V &vec) const
Gets the values of the sequence at position posId and stores them at vec.
void subWriteContents(unsigned int initialPos, unsigned int numPos, const std::string &fileName, const std::string &fileType, const std::set< unsigned int > &allowedSubEnvIds) const
Writes the sub-sequence to a file.
#define RawValue_MPI_DOUBLE
#define RawValue_MPI_UNSIGNED
A templated class that represents a Markov Chain.
virtual void setPositionValues(unsigned int posId, const V &vec)=0
Set the values in vec at position posId of the sequence. See template specialization.
int writeInfo(const BaseVectorSequence< P_V, P_M > &workingChain, std::ofstream &ofsvar) const
Writes information about the Markov chain in a file.
MHRawChainInfoStruct & operator+=(const MHRawChainInfoStruct &rhs)
Addition assignment operator.
const int UQ_MATRIX_IS_NOT_POS_DEFINITE_RC
std::ofstream * ofsVar
Provides a stream interface to write data to files.
void setName(const std::string &newName)
Changes the name of the sequence of vectors.
virtual void resizeSequence(unsigned int newSubSequenceSize)=0
Resize the sequence. See template specialization.
std::ofstream * subDisplayFile() const
Access function for m_subDisplayFile (displays file on stream).
This class allows the representation of a transition kernel with a scaled covariance matrix...
void Allreduce(void *sendbuf, void *recvbuf, int count, RawType_MPI_Datatype datatype, RawType_MPI_Op op, const char *whereMsg, const char *whatMsg) const
Combines values from all processes and distributes the result back to all processes.
virtual void filter(unsigned int initialPos, unsigned int spacing)=0
Filters positions in the sequence of vectors, starting at initialPos, and with spacing given by spaci...
const V & subMeanPlain() const
Finds the mean value of the sub-sequence.
virtual void subWriteContents(unsigned int initialPos, unsigned int numPos, const std::string &fileName, const std::string &fileType, const std::set< unsigned int > &allowedSubEnvIds) const =0
Writes info of the sub-sequence to a file. See template specialization.
void filter(unsigned int initialPos, unsigned int spacing)
Filters positions in the sequence of vectors.
#define UQ_MH_SG_FILENAME_FOR_NO_FILE
void mpiSum(const MpiComm &comm, MHRawChainInfoStruct &sumInfo) const
Calculates the MPI sum of this.
void generateSequence(BaseVectorSequence< P_V, P_M > &workingChain, ScalarSequence< double > *workingLogLikelihoodValues, ScalarSequence< double > *workingLogTargetValues)
Method to generate the chain.
const int UQ_INCOMPLETE_IMPLEMENTATION_RC
const V & lawVarVector() const
Access to the vector of variance values and private attribute: m_lawVarVector.
bool outOfTargetSupport() const
Whether or not a position is out of target support; access to private attribute m_outOfTargetSupport...
P_M m_initialProposalCovMatrix
unsigned int numTargetCalls
virtual void subMeanExtra(unsigned int initialPos, unsigned int numPos, V &meanVec) const =0
Finds the mean value of the sub-sequence, considering numPos positions starting at position initialPo...
GslMatrix matrixProduct(const GslVector &v1, const GslVector &v2)
void resizeSequence(unsigned int newSubSequenceSize)
Resizes the sequence.
void reset()
Resets Metropolis-Hastings chain info.
A templated class that represents a Metropolis-Hastings generator of samples.
void resizeSequence(unsigned int newSequenceSize)
Resizes the size of the sequence of scalars.
void unifiedWriteContents(const std::string &fileName, const std::string &fileType) const
Writes the unified sequence to a file.
MetropolisHastingsSG(const char *prefix, const MhOptionsValues *alternativeOptionsValues, const BaseVectorRV< P_V, P_M > &sourceRv, const P_V &initialPosition, const P_M *inputProposalCovMatrix)
Constructor.
unsigned int vectorSizeLocal() const
Local dimension (size) of the vector space.
virtual void unifiedWriteContents(const std::string &fileName, const std::string &fileType) const =0
Writes info of the unified sequence to a file. See template specialization.
void setPositionValues(unsigned int posId, const V &vec)
Set the values in vec at position posId of the sequence.
A struct that represents a Metropolis-Hastings sample.
double logLikelihood() const
Logarithm of the value of the likelihood; access to private attribute m_logLikelihood.
double MiscGetEllapsedSeconds(struct timeval *timeval0)
const M & lawCovMatrix() const
Returns the covariance matrix; access to protected attribute m_lawCovMatrix.
#define UQ_FATAL_TEST_MACRO(test, givenRank, where, what)
void copy(const MHRawChainInfoStruct &src)
Copies Metropolis-Hastings chain info from src to this.
void getRawChainInfo(MHRawChainInfoStruct &info) const
Gets information from the raw chain.
virtual void unifiedReadContents(const std::string &fileName, const std::string &fileType, const unsigned int subSequenceSize)=0
Reads info of the unified sequence from a file. See template specialization.
void readFullChain(const std::string &inputFileName, const std::string &inputFileType, unsigned int chainSize, BaseVectorSequence< P_V, P_M > &workingChain)
This method reads the chain contents.
unsigned int subSequenceSize() const
Size of the sub-sequence of vectors.
#define UQ_FILE_EXTENSION_FOR_MATLAB_FORMAT
void commonConstructor()
Reads the options values from the options input file.
MHRawChainInfoStruct & operator=(const MHRawChainInfoStruct &rhs)
Assignment operator.
void updateAdaptedCovMatrix(const BaseVectorSequence< P_V, P_M > &subChain, unsigned int idOfFirstPositionInSubChain, double &lastChainSize, P_V &lastMean, P_M &lastAdaptedCovMatrix)
This method updates the adapted covariance matrix.
double alpha(const MarkovChainPositionData< P_V > &x, const MarkovChainPositionData< P_V > &y, unsigned int xStageId, unsigned int yStageId, double *alphaQuotientPtr=NULL)
Calculates acceptance ration.
const V & vecValues() const
Values of the chain (vector); access to private attribute m_vecValues.
This class provides options for each level of the Multilevel sequence generator if no input file is a...
This class allows the representation of a transition kernel with Hessians.
Struct for handling data input and output from files.
virtual void getPositionValues(unsigned int posId, V &vec) const =0
Gets the values of the sequence at position posId and stores them at vec. See template specialization...
unsigned int numRejections
~MHRawChainInfoStruct()
Destructor.
void computeFilterParams(std::ofstream *passedOfs, unsigned int &initialPos, unsigned int &spacing)
Computes the filtering parameters spacing for the sequence of vectors.
This class provides options for the Metropolis-Hastings generator of samples if no input file is avai...
MetropolisHastingsSGOptions * m_optionsObj
double subPositionsOfMaximum(const ScalarSequence< double > &subCorrespondingScalarValues, BaseVectorSequence< V, M > &subPositionsOfMaximum)
Finds the positions where the maximum element occurs in the sub-sequence.
double logTarget() const
Logarithm of the value of the target; access to private attribute m_logTarget.
MhOptionsValues m_ov
This class is where the actual options are stored.
virtual double estimateConvBrooksGelman(unsigned int initialPos, unsigned int numPos) const =0
Estimates convergence rate using Brooks & Gelman method. See template specialization.
const BaseEnvironment & m_env
unsigned int numOutOfTargetSupport
The QUESO MPI Communicator Class.
void updateLawCovMatrix(const M &covMatrix)
Scales the covariance matrix.
const V & lawExpVector() const
Access to the vector of mean values and private attribute: m_lawExpVector.
unsigned int numOutOfTargetSupportInDR
#define UQ_FATAL_RC_MACRO(macroIRc, givenRank, where, what)
double unifiedPositionsOfMaximum(const ScalarSequence< double > &subCorrespondingScalarValues, BaseVectorSequence< V, M > &unifiedPositionsOfMaximum)
Finds the positions where the maximum element occurs in the unified sequence.
bool acceptAlpha(double alpha)
Decides whether or not to accept alpha.
virtual unsigned int subSequenceSize() const =0
Size of the sub-sequence of vectors. See template specialization.
Class for handling vector samples (sequence of vectors).
This class reads the options for the Metropolis-Hastings generator of samples from an input file...