25 #include <queso/asserts.h>
26 #include <queso/MetropolisHastingsSG.h>
27 #include <queso/GslVector.h>
28 #include <queso/GslMatrix.h>
30 #include <queso/HessianCovMatricesTKGroup.h>
31 #include <queso/ScaledCovMatrixTKGroup.h>
32 #include <queso/TransformedScaledCovMatrixTKGroup.h>
34 #include <queso/InvLogitGaussianJointPdf.h>
36 #include <queso/GaussianJointPdf.h>
124 "MHRawChainInfoStruct::mpiSum()",
125 "failed MPI.Allreduce() for sum of doubles");
128 "MHRawChainInfoStruct::mpiSum()",
129 "failed MPI.Allreduce() for sum of unsigned ints");
135 template<
class P_V,
class P_M>
143 m_env (sourceRv.env()),
144 m_vectorSpace (sourceRv.imageSet().vectorSpace()),
145 m_targetPdf (sourceRv.pdf()),
146 m_initialPosition (initialPosition),
147 m_initialProposalCovMatrix (m_vectorSpace.zeroVector()),
148 m_nullInputProposalCovMatrix(inputProposalCovMatrix == NULL),
149 m_numDisabledParameters (0),
150 m_parameterEnabledStatus (m_vectorSpace.dimLocal(),
true),
153 m_positionIdForDebugging (0),
154 m_stageIdForDebugging (0),
155 m_idsOfUniquePositions (0),
157 m_alphaQuotients (0),
160 m_lastAdaptedCovMatrix (NULL),
161 m_numPositionsNotSubWritten (0),
162 #ifdef QUESO_USES_SEQUENCE_STATISTICAL_OPTIONS
163 m_alternativeOptionsValues (NULL,NULL),
165 m_alternativeOptionsValues (),
168 m_computeInitialPriorAndLikelihoodValues(
true),
169 m_initialLogPriorValue (0.),
170 m_initialLogLikelihoodValue (0.)
172 if (inputProposalCovMatrix != NULL) {
173 m_initialProposalCovMatrix = *inputProposalCovMatrix;
175 if (alternativeOptionsValues) m_alternativeOptionsValues = *alternativeOptionsValues;
176 if (m_env.optionsInputFileName() ==
"") {
181 m_optionsObj->scanOptionsValues();
184 if ((m_env.subDisplayFile() ) &&
185 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
186 *m_env.subDisplayFile() <<
"Entering MetropolisHastingsSG<P_V,P_M>::constructor(1)"
187 <<
": prefix = " << prefix
188 <<
", alternativeOptionsValues = " << alternativeOptionsValues
189 <<
", m_env.optionsInputFileName() = " << m_env.optionsInputFileName()
190 <<
", m_initialProposalCovMatrix = " << m_initialProposalCovMatrix
194 UQ_FATAL_TEST_MACRO(sourceRv.imageSet().vectorSpace().dimLocal() != initialPosition.sizeLocal(),
196 "MetropolisHastingsSG<P_V,P_M>::constructor(1)",
197 "'sourceRv' and 'initialPosition' should have equal dimensions");
199 if (inputProposalCovMatrix) {
200 UQ_FATAL_TEST_MACRO(sourceRv.imageSet().vectorSpace().dimLocal() != inputProposalCovMatrix->numRowsLocal(),
202 "MetropolisHastingsSG<P_V,P_M>::constructor(1)",
203 "'sourceRv' and 'inputProposalCovMatrix' should have equal dimensions");
204 UQ_FATAL_TEST_MACRO(inputProposalCovMatrix->numCols() != inputProposalCovMatrix->numRowsGlobal(),
206 "MetropolisHastingsSG<P_V,P_M>::constructor(1)",
207 "'inputProposalCovMatrix' should be a square matrix");
212 if ((m_env.subDisplayFile() ) &&
213 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
214 *m_env.subDisplayFile() <<
"Leaving MetropolisHastingsSG<P_V,P_M>::constructor(1)"
218 template<
class P_V,
class P_M>
228 m_env (sourceRv.env()),
229 m_vectorSpace (sourceRv.imageSet().vectorSpace()),
230 m_targetPdf (sourceRv.pdf()),
231 m_initialPosition (initialPosition),
232 m_initialProposalCovMatrix (m_vectorSpace.zeroVector()),
233 m_nullInputProposalCovMatrix(inputProposalCovMatrix == NULL),
234 m_numDisabledParameters (0),
235 m_parameterEnabledStatus (m_vectorSpace.dimLocal(),
true),
238 m_positionIdForDebugging (0),
239 m_stageIdForDebugging (0),
240 m_idsOfUniquePositions (0),
242 m_alphaQuotients (0),
245 m_lastAdaptedCovMatrix (NULL),
246 m_numPositionsNotSubWritten (0),
247 #ifdef QUESO_USES_SEQUENCE_STATISTICAL_OPTIONS
248 m_alternativeOptionsValues (NULL,NULL),
250 m_alternativeOptionsValues (),
253 m_computeInitialPriorAndLikelihoodValues(
false),
254 m_initialLogPriorValue (initialLogPrior),
255 m_initialLogLikelihoodValue (initialLogLikelihood)
257 if (inputProposalCovMatrix != NULL) {
258 m_initialProposalCovMatrix = *inputProposalCovMatrix;
260 if (alternativeOptionsValues) m_alternativeOptionsValues = *alternativeOptionsValues;
261 if (m_env.optionsInputFileName() ==
"") {
266 m_optionsObj->scanOptionsValues();
269 if ((m_env.subDisplayFile() ) &&
270 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
271 *m_env.subDisplayFile() <<
"Entering MetropolisHastingsSG<P_V,P_M>::constructor(2)"
272 <<
": prefix = " << prefix
273 <<
", alternativeOptionsValues = " << alternativeOptionsValues
274 <<
", m_env.optionsInputFileName() = " << m_env.optionsInputFileName()
275 <<
", m_initialProposalCovMatrix = " << m_initialProposalCovMatrix
279 UQ_FATAL_TEST_MACRO(sourceRv.imageSet().vectorSpace().dimLocal() != initialPosition.sizeLocal(),
281 "MetropolisHastingsSG<P_V,P_M>::constructor(2)",
282 "'sourceRv' and 'initialPosition' should have equal dimensions");
284 if (inputProposalCovMatrix) {
285 UQ_FATAL_TEST_MACRO(sourceRv.imageSet().vectorSpace().dimLocal() != inputProposalCovMatrix->numRowsLocal(),
287 "MetropolisHastingsSG<P_V,P_M>::constructor(2)",
288 "'sourceRv' and 'inputProposalCovMatrix' should have equal dimensions");
289 UQ_FATAL_TEST_MACRO(inputProposalCovMatrix->numCols() != inputProposalCovMatrix->numRowsGlobal(),
291 "MetropolisHastingsSG<P_V,P_M>::constructor(2)",
292 "'inputProposalCovMatrix' should be a square matrix");
297 if ((m_env.subDisplayFile() ) &&
298 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
299 *m_env.subDisplayFile() <<
"Leaving MetropolisHastingsSG<P_V,P_M>::constructor(2)"
304 template<
class P_V,
class P_M>
308 const P_V& initialPosition,
309 const P_M* inputProposalCovMatrix)
311 m_env (sourceRv.env()),
312 m_vectorSpace (sourceRv.imageSet().vectorSpace()),
313 m_targetPdf (sourceRv.pdf()),
314 m_initialPosition (initialPosition),
315 m_initialProposalCovMatrix (m_vectorSpace.zeroVector()),
316 m_nullInputProposalCovMatrix(inputProposalCovMatrix == NULL),
317 m_numDisabledParameters (0),
318 m_parameterEnabledStatus (m_vectorSpace.dimLocal(),true),
321 m_positionIdForDebugging (0),
322 m_stageIdForDebugging (0),
323 m_idsOfUniquePositions (0),
325 m_alphaQuotients (0),
328 m_lastAdaptedCovMatrix (NULL),
329 #ifdef QUESO_USES_SEQUENCE_STATISTICAL_OPTIONS
330 m_alternativeOptionsValues (NULL,NULL),
332 m_alternativeOptionsValues (),
335 m_computeInitialPriorAndLikelihoodValues(true),
336 m_initialLogPriorValue (0.),
337 m_initialLogLikelihoodValue (0.)
339 if (inputProposalCovMatrix != NULL) {
363 template<
class P_V,
class P_M>
367 const P_V& initialPosition,
368 double initialLogPrior,
369 double initialLogLikelihood,
370 const P_M* inputProposalCovMatrix)
372 m_env (sourceRv.env()),
373 m_vectorSpace (sourceRv.imageSet().vectorSpace()),
374 m_targetPdf (sourceRv.pdf()),
375 m_initialPosition (initialPosition),
376 m_initialProposalCovMatrix (m_vectorSpace.zeroVector()),
377 m_nullInputProposalCovMatrix(inputProposalCovMatrix == NULL),
378 m_numDisabledParameters (0),
379 m_parameterEnabledStatus (m_vectorSpace.dimLocal(),true),
382 m_positionIdForDebugging (0),
383 m_stageIdForDebugging (0),
384 m_idsOfUniquePositions (0),
386 m_alphaQuotients (0),
389 m_lastAdaptedCovMatrix (NULL),
390 #ifdef QUESO_USES_SEQUENCE_STATISTICAL_OPTIONS
391 m_alternativeOptionsValues (NULL,NULL),
393 m_alternativeOptionsValues (),
396 m_computeInitialPriorAndLikelihoodValues(false),
397 m_initialLogPriorValue (initialLogPrior),
398 m_initialLogLikelihoodValue (initialLogLikelihood)
400 if (inputProposalCovMatrix != NULL) {
424 template<
class P_V,
class P_M>
432 if (m_lastAdaptedCovMatrix)
delete m_lastAdaptedCovMatrix;
433 if (m_lastMean)
delete m_lastMean;
435 m_rawChainInfo.reset();
436 m_alphaQuotients.clear();
437 m_logTargets.clear();
438 m_numDisabledParameters = 0;
439 m_parameterEnabledStatus.clear();
440 m_positionIdForDebugging = 0;
441 m_stageIdForDebugging = 0;
442 m_idsOfUniquePositions.clear();
444 if (m_tk )
delete m_tk;
445 if (m_targetPdfSynchronizer)
delete m_targetPdfSynchronizer;
446 if (m_optionsObj )
delete m_optionsObj;
455 template<
class P_V,
class P_M>
462 if ((m_env.subDisplayFile() ) &&
463 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
464 *m_env.subDisplayFile() <<
"Entering MetropolisHastingsSG<P_V,P_M>::commonConstructor()"
468 if (m_optionsObj->m_ov.m_initialPositionDataInputFileName !=
".") {
469 std::set<unsigned int> tmpSet;
470 tmpSet.insert(m_env.subId());
471 m_initialPosition.subReadContents((m_optionsObj->m_ov.m_initialPositionDataInputFileName+
"_sub"+m_env.subIdString()),
472 m_optionsObj->m_ov.m_initialPositionDataInputFileType,
474 if ((m_env.subDisplayFile() ) &&
475 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
476 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::commonConstructor()"
477 <<
": just read initial position contents = " << m_initialPosition
482 if (m_optionsObj->m_ov.m_parameterDisabledSet.size() > 0) {
483 for (std::set<unsigned int>::iterator setIt = m_optionsObj->m_ov.m_parameterDisabledSet.begin(); setIt != m_optionsObj->m_ov.m_parameterDisabledSet.end(); ++setIt) {
484 unsigned int paramId = *setIt;
485 if (paramId < m_vectorSpace.dimLocal()) {
486 m_numDisabledParameters++;
487 m_parameterEnabledStatus[paramId] =
false;
492 std::vector<double> drScalesAll(m_optionsObj->m_ov.m_drScalesForExtraStages.size()+1,1.);
493 for (
unsigned int i = 1; i < (m_optionsObj->m_ov.m_drScalesForExtraStages.size()+1); ++i) {
494 drScalesAll[i] = m_optionsObj->m_ov.m_drScalesForExtraStages[i-1];
496 if (m_optionsObj->m_ov.m_tkUseLocalHessian) {
500 *m_targetPdfSynchronizer);
501 if ((m_env.subDisplayFile() ) &&
502 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
503 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::commonConstructor()"
504 <<
": just instantiated a 'HessianCovMatrices' TK class"
509 if (m_optionsObj->m_ov.m_initialProposalCovMatrixDataInputFileName !=
".") {
510 std::set<unsigned int> tmpSet;
511 tmpSet.insert(m_env.subId());
512 m_initialProposalCovMatrix.subReadContents((m_optionsObj->m_ov.m_initialProposalCovMatrixDataInputFileName+
"_sub"+m_env.subIdString()),
513 m_optionsObj->m_ov.m_initialProposalCovMatrixDataInputFileType,
515 if ((m_env.subDisplayFile() ) &&
516 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
517 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::commonConstructor()"
518 <<
": just read initial proposal cov matrix contents = " << m_initialProposalCovMatrix
525 "MetropolisHastingsSG<P_V,P_M>::commonConstructor()",
526 "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");
530 if (m_optionsObj->m_ov.m_doLogitTransform) {
532 transformInitialCovMatrixToGaussianSpace(
538 m_optionsObj->m_prefix.c_str(),
540 drScalesAll, m_initialProposalCovMatrix);
544 m_optionsObj->m_prefix.c_str(), m_vectorSpace, drScalesAll,
545 m_initialProposalCovMatrix);
548 if ((m_env.subDisplayFile() ) &&
549 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
550 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::commonConstructor()"
551 <<
": just instantiated a 'ScaledCovMatrix' TK class"
556 if ((m_env.subDisplayFile() ) &&
557 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
558 *m_env.subDisplayFile() <<
"Leaving MetropolisHastingsSG<P_V,P_M>::commonConstructor()"
564 template<
class P_V,
class P_M>
569 unsigned int xStageId,
570 unsigned int yStageId,
571 double* alphaQuotientPtr)
573 double alphaQuotient = 0.;
578 ( (boost::math::isnan)(x.
logTarget()) )) {
579 std::cerr <<
"WARNING In MetropolisHastingsSG<P_V,P_M>::alpha(x,y)"
580 <<
", worldRank " << m_env.worldRank()
581 <<
", fullRank " << m_env.fullRank()
582 <<
", subEnvironment " << m_env.subId()
583 <<
", subRank " << m_env.subRank()
584 <<
", inter0Rank " << m_env.inter0Rank()
585 <<
", positionId = " << m_positionIdForDebugging
586 <<
", stageId = " << m_stageIdForDebugging
592 else if ((y.
logTarget() == -INFINITY ) ||
594 ( (boost::math::isnan)(y.
logTarget()) )) {
595 std::cerr <<
"WARNING In MetropolisHastingsSG<P_V,P_M>::alpha(x,y)"
596 <<
", worldRank " << m_env.worldRank()
597 <<
", fullRank " << m_env.fullRank()
598 <<
", subEnvironment " << m_env.subId()
599 <<
", subRank " << m_env.subRank()
600 <<
", inter0Rank " << m_env.inter0Rank()
601 <<
", positionId = " << m_positionIdForDebugging
602 <<
", stageId = " << m_stageIdForDebugging
611 if (m_tk->symmetric()) {
612 alphaQuotient = std::exp(yLogTargetToUse - x.
logTarget());
614 if ((m_env.subDisplayFile() ) &&
615 (m_env.displayVerbosity() >= 3 ) &&
616 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
617 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::alpha(x,y)"
618 <<
": symmetric proposal case"
621 <<
", yLogTargetToUse = " << yLogTargetToUse
623 <<
", alpha = " << alphaQuotient
628 double qyx = m_tk->rv(yStageId).pdf().lnValue(x.
vecValues(),NULL,NULL,NULL,NULL);
629 if ((m_env.subDisplayFile() ) &&
630 (m_env.displayVerbosity() >= 10 ) &&
631 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
633 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::alpha(x,y)"
639 double qxy = m_tk->rv(xStageId).pdf().lnValue(y.
vecValues(),NULL,NULL,NULL,NULL);
640 if ((m_env.subDisplayFile() ) &&
641 (m_env.displayVerbosity() >= 10 ) &&
642 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
644 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::alpha(x,y)"
650 alphaQuotient = std::exp(yLogTargetToUse +
654 if ((m_env.subDisplayFile() ) &&
655 (m_env.displayVerbosity() >= 3 ) &&
656 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
657 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::alpha(x,y)"
658 <<
": asymmetric proposal case"
659 <<
", xStageId = " << xStageId
660 <<
", yStageId = " << yStageId
663 <<
", yLogTargetToUse = " << yLogTargetToUse
664 <<
", q(y,x) = " << qyx
666 <<
", q(x,y) = " << qxy
667 <<
", alpha = " << alphaQuotient
674 if ((m_env.subDisplayFile() ) &&
675 (m_env.displayVerbosity() >= 10 ) &&
676 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
677 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::alpha(x,y)"
683 if (alphaQuotientPtr != NULL) *alphaQuotientPtr = alphaQuotient;
685 return std::min(1.,alphaQuotient);
688 template<
class P_V,
class P_M>
692 const std::vector<unsigned int >& inputTKStageIds)
694 unsigned int inputSize = inputPositionsData.size();
695 if ((m_env.subDisplayFile() ) &&
696 (m_env.displayVerbosity() >= 10 ) &&
697 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
698 *m_env.subDisplayFile() <<
"Entering MetropolisHastingsSG<P_V,P_M>::alpha(vec)"
699 <<
", inputSize = " << inputSize
704 "MetropolisHastingsSG<P_V,P_M>::alpha(vec)",
705 "inputPositionsData has size < 2");
708 if (inputPositionsData[0 ]->outOfTargetSupport())
return 0.;
709 if (inputPositionsData[inputSize-1]->outOfTargetSupport())
return 0.;
711 if ((inputPositionsData[0]->logTarget() == -INFINITY ) ||
712 (inputPositionsData[0]->logTarget() == INFINITY ) ||
713 ( (boost::math::isnan)(inputPositionsData[0]->logTarget()) )) {
714 std::cerr <<
"WARNING In MetropolisHastingsSG<P_V,P_M>::alpha(vec)"
715 <<
", worldRank " << m_env.worldRank()
716 <<
", fullRank " << m_env.fullRank()
717 <<
", subEnvironment " << m_env.subId()
718 <<
", subRank " << m_env.subRank()
719 <<
", inter0Rank " << m_env.inter0Rank()
720 <<
", positionId = " << m_positionIdForDebugging
721 <<
", stageId = " << m_stageIdForDebugging
722 <<
": inputSize = " << inputSize
723 <<
", inputPositionsData[0]->logTarget() = " << inputPositionsData[0]->logTarget()
724 <<
", [0]->values() = " << inputPositionsData[0]->vecValues()
725 <<
", [inputSize - 1]->values() = " << inputPositionsData[inputSize-1]->vecValues()
729 else if ((inputPositionsData[inputSize - 1]->logTarget() == -INFINITY ) ||
730 (inputPositionsData[inputSize - 1]->logTarget() == INFINITY ) ||
731 ( (boost::math::isnan)(inputPositionsData[inputSize - 1]->logTarget()) )) {
732 std::cerr <<
"WARNING In MetropolisHastingsSG<P_V,P_M>::alpha(vec)"
733 <<
", worldRank " << m_env.worldRank()
734 <<
", fullRank " << m_env.fullRank()
735 <<
", subEnvironment " << m_env.subId()
736 <<
", subRank " << m_env.subRank()
737 <<
", inter0Rank " << m_env.inter0Rank()
738 <<
", positionId = " << m_positionIdForDebugging
739 <<
", stageId = " << m_stageIdForDebugging
740 <<
": inputSize = " << inputSize
741 <<
", inputPositionsData[inputSize - 1]->logTarget() = " << inputPositionsData[inputSize-1]->logTarget()
742 <<
", [0]->values() = " << inputPositionsData[0]->vecValues()
743 <<
", [inputSize - 1]->values() = " << inputPositionsData[inputSize-1]->vecValues()
749 if (inputSize == 2)
return this->alpha(*(inputPositionsData[0 ]),
750 *(inputPositionsData[inputSize - 1]),
752 inputTKStageIds[inputSize-1]);
755 std::vector<MarkovChainPositionData<P_V>*> positionsData (inputSize,NULL);
756 std::vector<MarkovChainPositionData<P_V>*> backwardPositionsData (inputSize,NULL);
758 std::vector<unsigned int > tkStageIds (inputSize,0);
759 std::vector<unsigned int > backwardTKStageIds (inputSize,0);
761 std::vector<unsigned int > tkStageIdsLess1(inputSize,0);
762 std::vector<unsigned int > backwardTKStageIdsLess1(inputSize,0);
764 for (
unsigned int i = 0; i < inputSize; ++i) {
765 positionsData [i] = inputPositionsData[i];
766 backwardPositionsData [i] = inputPositionsData[inputSize-i-1];
768 tkStageIds [i] = inputTKStageIds [i];
769 backwardTKStageIds [i] = inputTKStageIds [inputSize-i-1];
771 tkStageIdsLess1[i] = inputTKStageIds [i];
772 backwardTKStageIdsLess1[i] = inputTKStageIds [inputSize-i-1];
775 tkStageIdsLess1.pop_back();
776 backwardTKStageIdsLess1.pop_back();
779 double logNumerator = 0.;
780 double logDenominator = 0.;
781 double alphasNumerator = 1.;
782 double alphasDenominator = 1.;
785 const P_V& _lastTKPosition = m_tk->preComputingPosition( tkStageIds[inputSize-1]);
786 const P_V& _lastBackwardTKPosition = m_tk->preComputingPosition(backwardTKStageIds[inputSize-1]);
788 double numContrib = m_tk->rv(backwardTKStageIdsLess1).pdf().lnValue(_lastBackwardTKPosition,NULL,NULL,NULL,NULL);
789 double denContrib = m_tk->rv(tkStageIdsLess1).pdf().lnValue(_lastTKPosition,NULL,NULL,NULL,NULL);
790 if ((m_env.subDisplayFile() ) &&
791 (m_env.displayVerbosity() >= 10 ) &&
792 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
793 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::alpha(vec)"
794 <<
", inputSize = " << inputSize
796 <<
": numContrib = " << numContrib
797 <<
", denContrib = " << denContrib
800 logNumerator += numContrib;
801 logDenominator += denContrib;
803 for (
unsigned int i = 0; i < (inputSize-2); ++i) {
804 positionsData.pop_back();
805 backwardPositionsData.pop_back();
807 const P_V& lastTKPosition = m_tk->preComputingPosition( tkStageIds[inputSize-2-i]);
808 const P_V& lastBackwardTKPosition = m_tk->preComputingPosition(backwardTKStageIds[inputSize-2-i]);
810 tkStageIds.pop_back();
811 backwardTKStageIds.pop_back();
813 tkStageIdsLess1.pop_back();
814 backwardTKStageIdsLess1.pop_back();
816 numContrib = m_tk->rv(backwardTKStageIdsLess1).pdf().lnValue(lastBackwardTKPosition,NULL,NULL,NULL,NULL);
817 denContrib = m_tk->rv(tkStageIdsLess1).pdf().lnValue(lastTKPosition,NULL,NULL,NULL,NULL);
818 if ((m_env.subDisplayFile() ) &&
819 (m_env.displayVerbosity() >= 10 ) &&
820 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
821 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::alpha(vec)"
822 <<
", inputSize = " << inputSize
823 <<
", in loop, i = " << i
824 <<
": numContrib = " << numContrib
825 <<
", denContrib = " << denContrib
828 logNumerator += numContrib;
829 logDenominator += denContrib;
831 alphasNumerator *= (1. - this->alpha(backwardPositionsData,backwardTKStageIds));
832 alphasDenominator *= (1. - this->alpha( positionsData, tkStageIds));
835 double numeratorLogTargetToUse = backwardPositionsData[0]->logTarget();
836 numContrib = numeratorLogTargetToUse;
837 denContrib = positionsData[0]->logTarget();
838 if ((m_env.subDisplayFile() ) &&
839 (m_env.displayVerbosity() >= 10 ) &&
840 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
841 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::alpha(vec)"
842 <<
", inputSize = " << inputSize
844 <<
": numContrib = " << numContrib
845 <<
", denContrib = " << denContrib
848 logNumerator += numContrib;
849 logDenominator += denContrib;
851 if ((m_env.subDisplayFile() ) &&
852 (m_env.displayVerbosity() >= 10 ) &&
853 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
854 *m_env.subDisplayFile() <<
"Leaving MetropolisHastingsSG<P_V,P_M>::alpha(vec)"
855 <<
", inputSize = " << inputSize
856 <<
": alphasNumerator = " << alphasNumerator
857 <<
", alphasDenominator = " << alphasDenominator
858 <<
", logNumerator = " << logNumerator
859 <<
", logDenominator = " << logDenominator
864 return std::min(1.,(alphasNumerator/alphasDenominator)*std::exp(logNumerator-logDenominator));
867 template<
class P_V,
class P_M>
873 if (alpha <= 0. ) result =
false;
874 else if (alpha >= 1. ) result =
true;
875 else if (alpha >= m_env.rngObject()->uniformSample()) result =
true;
881 template<
class P_V,
class P_M>
885 std::ofstream& ofsvar)
const
887 if ((m_env.subDisplayFile() ) &&
888 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
889 *m_env.subDisplayFile() <<
"\n"
890 <<
"\n-----------------------------------------------------"
891 <<
"\n Writing more information about the Markov chain " << workingChain.
name() <<
" to output file ..."
892 <<
"\n-----------------------------------------------------"
899 if (m_optionsObj->m_ov.m_rawChainGenerateExtra) {
901 ofsvar << m_optionsObj->m_prefix <<
"logTargets_sub" << m_env.subIdString() <<
" = zeros(" << m_logTargets.size()
905 ofsvar << m_optionsObj->m_prefix <<
"logTargets_sub" << m_env.subIdString() <<
" = [";
906 for (
unsigned int i = 0; i < m_logTargets.size(); ++i) {
907 ofsvar << m_logTargets[i]
913 ofsvar << m_optionsObj->m_prefix <<
"alphaQuotients_sub" << m_env.subIdString() <<
" = zeros(" << m_alphaQuotients.size()
917 ofsvar << m_optionsObj->m_prefix <<
"alphaQuotients_sub" << m_env.subIdString() <<
" = [";
918 for (
unsigned int i = 0; i < m_alphaQuotients.size(); ++i) {
919 ofsvar << m_alphaQuotients[i]
926 ofsvar << m_optionsObj->m_prefix <<
"rejected = " << (double) m_rawChainInfo.numRejections/(
double) (workingChain.
subSequenceSize()-1)
932 ofsvar << m_optionsObj->m_prefix <<
"componentNames = {";
933 m_vectorSpace.printComponentsNames(ofsvar,
false);
937 ofsvar << m_optionsObj->m_prefix <<
"outTargetSupport = " << (double) m_rawChainInfo.numOutOfTargetSupport/(
double) (workingChain.
subSequenceSize()-1)
942 ofsvar << m_optionsObj->m_prefix <<
"runTime = " << m_rawChainInfo.runTime
947 if ((m_env.subDisplayFile() ) &&
948 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
949 *m_env.subDisplayFile() <<
"\n-----------------------------------------------------"
950 <<
"\n Finished writing more information about the Markov chain " << workingChain.
name()
951 <<
"\n-----------------------------------------------------"
959 template <
class P_V,
class P_M>
973 template <
class P_V,
class P_M>
980 if ((m_env.subDisplayFile() ) &&
981 (m_env.displayVerbosity() >= 5 ) &&
982 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
983 *m_env.subDisplayFile() <<
"Entering MetropolisHastingsSG<P_V,P_M>::generateSequence()..."
988 std::cerr <<
"'m_vectorSpace' and 'workingChain' are related to vector"
989 <<
"spaces of different dimensions"
995 bool writeLogLikelihood;
996 if ((workingLogLikelihoodValues != NULL) &&
997 (m_optionsObj->m_ov.m_outputLogLikelihood)) {
998 writeLogLikelihood =
true;
1001 writeLogLikelihood =
false;
1005 bool writeLogTarget;
1006 if ((workingLogTargetValues != NULL) &&
1007 (m_optionsObj->m_ov.m_outputLogTarget)) {
1008 writeLogTarget =
true;
1011 writeLogTarget =
false;
1014 MiscCheckTheParallelEnvironment<P_V,P_V>(m_initialPosition,
1017 P_V valuesOf1stPosition(m_initialPosition);
1020 workingChain.
setName(m_optionsObj->m_prefix +
"rawChain");
1026 generateFullChain(valuesOf1stPosition,
1027 m_optionsObj->m_ov.m_rawChainSize,
1029 workingLogLikelihoodValues,
1030 workingLogTargetValues);
1033 readFullChain(m_optionsObj->m_ov.m_rawChainDataInputFileName,
1034 m_optionsObj->m_ov.m_rawChainDataInputFileType,
1035 m_optionsObj->m_ov.m_rawChainSize,
1042 if ((m_env.subDisplayFile() ) &&
1043 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1044 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1045 <<
", prefix = " << m_optionsObj->m_prefix
1046 <<
", chain name = " << workingChain.
name()
1047 <<
": about to try to open generic output file '" << m_optionsObj->m_ov.m_dataOutputFileName
1049 <<
"', subId = " << m_env.subId()
1050 <<
", 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())
1056 m_env.openOutputFile(m_optionsObj->m_ov.m_dataOutputFileName,
1058 m_optionsObj->m_ov.m_dataOutputAllowedSet,
1062 if ((m_env.subDisplayFile() ) &&
1063 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1064 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1065 <<
", prefix = " << m_optionsObj->m_prefix
1066 <<
", raw chain name = " << workingChain.
name()
1067 <<
": returned from opening generic output file '" << m_optionsObj->m_ov.m_dataOutputFileName
1069 <<
"', subId = " << m_env.subId()
1079 (m_optionsObj->m_ov.m_totallyMute ==
false )) {
1082 if ((m_env.subDisplayFile() ) &&
1083 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1084 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1085 <<
", prefix = " << m_optionsObj->m_prefix
1086 <<
", raw chain name = " << workingChain.
name()
1087 <<
": about to try to write raw sub chain output file '" << m_optionsObj->m_ov.m_rawChainDataOutputFileName
1088 <<
"." << m_optionsObj->m_ov.m_rawChainDataOutputFileType
1089 <<
"', subId = " << m_env.subId()
1090 <<
", 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())
1095 if ((m_numPositionsNotSubWritten > 0 ) &&
1096 (m_optionsObj->m_ov.m_rawChainDataOutputFileName !=
".")) {
1097 workingChain.
subWriteContents(m_optionsObj->m_ov.m_rawChainSize - m_numPositionsNotSubWritten,
1098 m_numPositionsNotSubWritten,
1099 m_optionsObj->m_ov.m_rawChainDataOutputFileName,
1100 m_optionsObj->m_ov.m_rawChainDataOutputFileType,
1101 m_optionsObj->m_ov.m_rawChainDataOutputAllowedSet);
1102 if ((m_env.subDisplayFile() ) &&
1103 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1104 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1105 <<
": just wrote (per period request) remaining " << m_numPositionsNotSubWritten <<
" chain positions "
1106 <<
", " << m_optionsObj->m_ov.m_rawChainSize - m_numPositionsNotSubWritten <<
" <= pos <= " << m_optionsObj->m_ov.m_rawChainSize - 1
1110 if (writeLogLikelihood) {
1111 workingLogLikelihoodValues->
subWriteContents(m_optionsObj->m_ov.m_rawChainSize - m_numPositionsNotSubWritten,
1112 m_numPositionsNotSubWritten,
1113 m_optionsObj->m_ov.m_rawChainDataOutputFileName +
"_loglikelihood",
1114 m_optionsObj->m_ov.m_rawChainDataOutputFileType,
1115 m_optionsObj->m_ov.m_rawChainDataOutputAllowedSet);
1118 if (writeLogTarget) {
1119 workingLogTargetValues->
subWriteContents(m_optionsObj->m_ov.m_rawChainSize - m_numPositionsNotSubWritten,
1120 m_numPositionsNotSubWritten,
1121 m_optionsObj->m_ov.m_rawChainDataOutputFileName +
"_logtarget",
1122 m_optionsObj->m_ov.m_rawChainDataOutputFileType,
1123 m_optionsObj->m_ov.m_rawChainDataOutputAllowedSet);
1126 m_numPositionsNotSubWritten = 0;
1130 if (workingLogLikelihoodValues) {
1133 rawSubMLEpositions);
1136 "MetropolisHastingsSG<P_V,P_M>::generateSequence()",
1137 "rawSubMLEpositions.subSequenceSize() = 0");
1139 if ((m_env.subDisplayFile() ) &&
1140 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1141 P_V tmpVec(m_vectorSpace.zeroVector());
1143 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1144 <<
": just computed MLE"
1145 <<
", rawSubMLEvalue = " << rawSubMLEvalue
1146 <<
", rawSubMLEpositions.subSequenceSize() = " << rawSubMLEpositions.
subSequenceSize()
1147 <<
", rawSubMLEpositions[0] = " << tmpVec
1153 if (workingLogTargetValues) {
1156 rawSubMAPpositions);
1159 "MetropolisHastingsSG<P_V,P_M>::generateSequence()",
1160 "rawSubMAPpositions.subSequenceSize() = 0");
1162 if ((m_env.subDisplayFile() ) &&
1163 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1164 P_V tmpVec(m_vectorSpace.zeroVector());
1166 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1167 <<
": just computed MAP"
1168 <<
", rawSubMAPvalue = " << rawSubMAPvalue
1169 <<
", rawSubMAPpositions.subSequenceSize() = " << rawSubMAPpositions.
subSequenceSize()
1170 <<
", rawSubMAPpositions[0] = " << tmpVec
1175 if ((m_env.subDisplayFile() ) &&
1176 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1177 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1178 <<
", prefix = " << m_optionsObj->m_prefix
1179 <<
", raw chain name = " << workingChain.
name()
1180 <<
": returned from writing raw sub chain output file '" << m_optionsObj->m_ov.m_rawChainDataOutputFileName
1181 <<
"." << m_optionsObj->m_ov.m_rawChainDataOutputFileType
1182 <<
"', subId = " << m_env.subId()
1187 if ((m_env.subDisplayFile() ) &&
1188 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1189 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1190 <<
", prefix = " << m_optionsObj->m_prefix
1191 <<
", raw chain name = " << workingChain.
name()
1192 <<
": about to try to write raw unified chain output file '" << m_optionsObj->m_ov.m_rawChainDataOutputFileName
1193 <<
"." << m_optionsObj->m_ov.m_rawChainDataOutputFileType
1194 <<
"', subId = " << m_env.subId()
1200 m_optionsObj->m_ov.m_rawChainDataOutputFileType);
1201 if ((m_env.subDisplayFile() ) &&
1202 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1203 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1204 <<
", prefix = " << m_optionsObj->m_prefix
1205 <<
", raw chain name = " << workingChain.
name()
1206 <<
": returned from writing raw unified chain output file '" << m_optionsObj->m_ov.m_rawChainDataOutputFileName
1207 <<
"." << m_optionsObj->m_ov.m_rawChainDataOutputFileType
1208 <<
"', subId = " << m_env.subId()
1212 if (writeLogLikelihood) {
1213 workingLogLikelihoodValues->
unifiedWriteContents(m_optionsObj->m_ov.m_rawChainDataOutputFileName +
"_loglikelihood",
1214 m_optionsObj->m_ov.m_rawChainDataOutputFileType);
1217 if (writeLogTarget) {
1218 workingLogTargetValues->
unifiedWriteContents(m_optionsObj->m_ov.m_rawChainDataOutputFileName +
"_logtarget",
1219 m_optionsObj->m_ov.m_rawChainDataOutputFileType);
1223 if (workingLogLikelihoodValues) {
1227 rawUnifiedMLEpositions);
1229 if ((m_env.subDisplayFile() ) &&
1230 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1231 P_V tmpVec(m_vectorSpace.zeroVector());
1237 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1238 <<
": just computed MLE"
1239 <<
", rawUnifiedMLEvalue = " << rawUnifiedMLEvalue
1240 <<
", rawUnifiedMLEpositions.subSequenceSize() = " << rawUnifiedMLEpositions.
subSequenceSize()
1241 <<
", rawUnifiedMLEpositions[0] = " << tmpVec
1248 if (workingLogTargetValues) {
1251 rawUnifiedMAPpositions);
1253 if ((m_env.subDisplayFile() ) &&
1254 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1255 P_V tmpVec(m_vectorSpace.zeroVector());
1261 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1262 <<
": just computed MAP"
1263 <<
", rawUnifiedMAPvalue = " << rawUnifiedMAPvalue
1264 <<
", rawUnifiedMAPpositions.subSequenceSize() = " << rawUnifiedMAPpositions.
subSequenceSize()
1265 <<
", rawUnifiedMAPpositions[0] = " << tmpVec
1273 if ((genericFilePtrSet.
ofsVar ) &&
1274 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1276 iRC = writeInfo(workingChain,
1277 *genericFilePtrSet.
ofsVar);
1280 "MetropolisHastingsSG<P_V,P_M>::generateSequence()",
1281 "improper writeInfo() return");
1284 #ifdef QUESO_USES_SEQUENCE_STATISTICAL_OPTIONS
1285 if (m_optionsObj->m_ov.m_rawChainComputeStats) {
1286 workingChain.computeStatistics(*m_optionsObj->m_rawChainStatisticalOptionsObj,
1287 genericFilePtrSet.
ofsVar);
1297 if (m_optionsObj->m_ov.m_filteredChainGenerate) {
1299 unsigned int filterInitialPos = (
unsigned int) (m_optionsObj->m_ov.m_filteredChainDiscardedPortion * (
double) workingChain.
subSequenceSize());
1300 unsigned int filterSpacing = m_optionsObj->m_ov.m_filteredChainLag;
1301 if (filterSpacing == 0) {
1308 workingChain.
filter(filterInitialPos,
1310 workingChain.
setName(m_optionsObj->m_prefix +
"filtChain");
1312 if (workingLogLikelihoodValues) workingLogLikelihoodValues->
filter(filterInitialPos,
1315 if (workingLogTargetValues) workingLogTargetValues->
filter(filterInitialPos,
1319 if ((m_env.subDisplayFile() ) &&
1320 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1321 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1322 <<
", prefix = " << m_optionsObj->m_prefix
1323 <<
": checking necessity of opening output files for filtered chain " << workingChain.
name()
1330 (m_optionsObj->m_ov.m_totallyMute ==
false )) {
1333 m_optionsObj->m_ov.m_filteredChainDataOutputFileName,
1334 m_optionsObj->m_ov.m_filteredChainDataOutputFileType,
1335 m_optionsObj->m_ov.m_filteredChainDataOutputAllowedSet);
1336 if ((m_env.subDisplayFile() ) &&
1337 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1338 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1339 <<
", prefix = " << m_optionsObj->m_prefix
1340 <<
": closed sub output file '" << m_optionsObj->m_ov.m_filteredChainDataOutputFileName
1341 <<
"' for filtered chain " << workingChain.
name()
1345 if (writeLogLikelihood) {
1348 m_optionsObj->m_ov.m_filteredChainDataOutputFileName +
"_loglikelihood",
1349 m_optionsObj->m_ov.m_filteredChainDataOutputFileType,
1350 m_optionsObj->m_ov.m_filteredChainDataOutputAllowedSet);
1353 if (writeLogTarget) {
1356 m_optionsObj->m_ov.m_filteredChainDataOutputFileName +
"_logtarget",
1357 m_optionsObj->m_ov.m_filteredChainDataOutputFileType,
1358 m_optionsObj->m_ov.m_filteredChainDataOutputAllowedSet);
1366 (m_optionsObj->m_ov.m_totallyMute == false )) {
1368 m_optionsObj->m_ov.m_filteredChainDataOutputFileType);
1369 if ((m_env.subDisplayFile() ) &&
1370 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1371 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1372 <<
", prefix = " << m_optionsObj->m_prefix
1373 <<
": closed unified output file '" << m_optionsObj->m_ov.m_filteredChainDataOutputFileName
1374 <<
"' for filtered chain " << workingChain.
name()
1378 if (writeLogLikelihood) {
1379 workingLogLikelihoodValues->
unifiedWriteContents(m_optionsObj->m_ov.m_filteredChainDataOutputFileName +
"_loglikelihood",
1380 m_optionsObj->m_ov.m_filteredChainDataOutputFileType);
1383 if (writeLogTarget) {
1384 workingLogTargetValues->
unifiedWriteContents(m_optionsObj->m_ov.m_filteredChainDataOutputFileName +
"_logtarget",
1385 m_optionsObj->m_ov.m_filteredChainDataOutputFileType);
1392 #ifdef QUESO_USES_SEQUENCE_STATISTICAL_OPTIONS
1393 if (m_optionsObj->m_ov.m_filteredChainComputeStats) {
1394 workingChain.computeStatistics(*m_optionsObj->m_filteredChainStatisticalOptionsObj,
1395 genericFilePtrSet.
ofsVar);
1403 if (genericFilePtrSet.
ofsVar) {
1405 delete genericFilePtrSet.
ofsVar;
1406 if ((m_env.subDisplayFile() ) &&
1407 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1408 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1409 <<
", prefix = " << m_optionsObj->m_prefix
1410 <<
": closed generic output file '" << m_optionsObj->m_ov.m_dataOutputFileName
1411 <<
"' (chain name is " << workingChain.
name()
1417 if ((m_env.subDisplayFile() ) &&
1418 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1419 *m_env.subDisplayFile() << std::endl;
1424 if ((m_env.subDisplayFile() ) &&
1425 (m_env.displayVerbosity() >= 5 ) &&
1426 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1427 *m_env.subDisplayFile() <<
"Leaving MetropolisHastingsSG<P_V,P_M>::generateSequence()"
1435 template<
class P_V,
class P_M>
1439 info = m_rawChainInfo;
1443 template <
class P_V,
class P_M>
1446 const std::string& inputFileName,
1447 const std::string& inputFileType,
1448 unsigned int chainSize,
1455 template <
class P_V,
class P_M>
1458 const P_V& valuesOf1stPosition,
1459 unsigned int chainSize,
1466 if ((m_env.subDisplayFile() ) &&
1467 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1468 *m_env.subDisplayFile() <<
"Starting the generation of Markov chain " << workingChain.
name()
1469 <<
", with " << chainSize
1475 struct timeval timevalChain;
1476 struct timeval timevalCandidate;
1477 struct timeval timevalTarget;
1478 struct timeval timevalMhAlpha;
1479 struct timeval timevalDrAlpha;
1480 struct timeval timevalDR;
1481 struct timeval timevalAM;
1483 m_positionIdForDebugging = 0;
1484 m_stageIdForDebugging = 0;
1486 m_rawChainInfo.reset();
1488 iRC = gettimeofday(&timevalChain, NULL);
1490 if ((m_env.subDisplayFile() ) &&
1491 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1492 *m_env.subDisplayFile() <<
"\nIn MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1493 <<
": contents of initial position are:";
1494 *m_env.subDisplayFile() << valuesOf1stPosition;
1495 *m_env.subDisplayFile() <<
"\nIn MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1496 <<
": targetPdf.domaintSet() info is:"
1497 << m_targetPdf.domainSet();
1498 *m_env.subDisplayFile() << std::endl;
1502 bool writeLogLikelihood;
1503 if ((workingLogLikelihoodValues != NULL) &&
1504 (m_optionsObj->m_ov.m_outputLogLikelihood)) {
1505 writeLogLikelihood =
true;
1508 writeLogLikelihood =
false;
1512 bool writeLogTarget;
1513 if ((workingLogTargetValues != NULL) &&
1514 (m_optionsObj->m_ov.m_outputLogTarget)) {
1515 writeLogTarget =
true;
1518 writeLogTarget =
false;
1521 bool outOfTargetSupport = !m_targetPdf.domainSet().contains(valuesOf1stPosition);
1522 if ((m_env.subDisplayFile()) &&
1523 (outOfTargetSupport )) {
1524 *m_env.subDisplayFile() <<
"ERROR: In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1525 <<
": contents of initial position are:\n";
1526 *m_env.subDisplayFile() << valuesOf1stPosition;
1527 *m_env.subDisplayFile() <<
"\nERROR: In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1528 <<
": targetPdf.domaintSet() info is:\n"
1529 << m_targetPdf.domainSet();
1530 *m_env.subDisplayFile() << std::endl;
1534 "MetropolisHastingsSG<P_V,P_M>::generateFullChain()",
1535 "initial position should not be out of target pdf support");
1537 double logPrior = 0.;
1538 double logLikelihood = 0.;
1539 double logTarget = 0.;
1540 if (m_computeInitialPriorAndLikelihoodValues) {
1541 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) iRC = gettimeofday(&timevalTarget, NULL);
1542 logTarget = m_targetPdfSynchronizer->callFunction(&valuesOf1stPosition,NULL,NULL,NULL,NULL,&logPrior,&logLikelihood);
1543 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) {
1546 m_rawChainInfo.numTargetCalls++;
1547 if ((m_env.subDisplayFile() ) &&
1548 (m_env.displayVerbosity() >= 3 ) &&
1549 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1550 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1551 <<
": just returned from likelihood() for initial chain position"
1552 <<
", m_rawChainInfo.numTargetCalls = " << m_rawChainInfo.numTargetCalls
1553 <<
", logPrior = " << logPrior
1554 <<
", logLikelihood = " << logLikelihood
1555 <<
", logTarget = " << logTarget
1560 logPrior = m_initialLogPriorValue;
1561 logLikelihood = m_initialLogLikelihoodValue;
1562 logTarget = logPrior + logLikelihood;
1563 if ((m_env.subDisplayFile() ) &&
1564 (m_env.displayVerbosity() >= 3 ) &&
1565 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1566 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1567 <<
": used input prior and likelihood for initial chain position"
1568 <<
", m_rawChainInfo.numTargetCalls = " << m_rawChainInfo.numTargetCalls
1569 <<
", logPrior = " << logPrior
1570 <<
", logLikelihood = " << logLikelihood
1571 <<
", logTarget = " << logTarget
1578 valuesOf1stPosition,
1583 P_V gaussianVector(m_vectorSpace.zeroVector());
1584 P_V tmpVecValues(m_vectorSpace.zeroVector());
1591 m_numPositionsNotSubWritten = 0;
1592 if (workingLogLikelihoodValues) workingLogLikelihoodValues->
resizeSequence(chainSize);
1593 if (workingLogTargetValues ) workingLogTargetValues->
resizeSequence (chainSize);
1594 if (
true) m_idsOfUniquePositions.resize(chainSize,0);
1595 if (m_optionsObj->m_ov.m_rawChainGenerateExtra) {
1596 m_logTargets.resize (chainSize,0.);
1597 m_alphaQuotients.resize(chainSize,0.);
1600 unsigned int uniquePos = 0;
1602 m_numPositionsNotSubWritten++;
1603 if ((m_optionsObj->m_ov.m_rawChainDataOutputPeriod > 0 ) &&
1604 (((0+1) % m_optionsObj->m_ov.m_rawChainDataOutputPeriod) == 0 ) &&
1605 (m_optionsObj->m_ov.m_rawChainDataOutputFileName !=
".")) {
1606 workingChain.
subWriteContents(0 + 1 - m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
1607 m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
1608 m_optionsObj->m_ov.m_rawChainDataOutputFileName,
1609 m_optionsObj->m_ov.m_rawChainDataOutputFileType,
1610 m_optionsObj->m_ov.m_rawChainDataOutputAllowedSet);
1611 if ((m_env.subDisplayFile() ) &&
1612 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1613 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1614 <<
": just wrote (per period request) " << m_numPositionsNotSubWritten <<
" chain positions "
1615 <<
", " << 0 + 1 - m_optionsObj->m_ov.m_rawChainDataOutputPeriod <<
" <= pos <= " << 0
1619 if (writeLogLikelihood) {
1620 workingLogLikelihoodValues->
subWriteContents(0 + 1 - m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
1621 m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
1622 m_optionsObj->m_ov.m_rawChainDataOutputFileName +
"_loglikelihood",
1623 m_optionsObj->m_ov.m_rawChainDataOutputFileType,
1624 m_optionsObj->m_ov.m_rawChainDataOutputAllowedSet);
1627 if (writeLogTarget) {
1628 workingLogTargetValues->
subWriteContents(0 + 1 - m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
1629 m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
1630 m_optionsObj->m_ov.m_rawChainDataOutputFileName +
"_logtarget",
1631 m_optionsObj->m_ov.m_rawChainDataOutputFileType,
1632 m_optionsObj->m_ov.m_rawChainDataOutputAllowedSet);
1635 m_numPositionsNotSubWritten = 0;
1638 if (workingLogLikelihoodValues) (*workingLogLikelihoodValues)[0] = currentPositionData.
logLikelihood();
1639 if (workingLogTargetValues ) (*workingLogTargetValues )[0] = currentPositionData.
logTarget();
1640 if (
true) m_idsOfUniquePositions[uniquePos++] = 0;
1641 if (m_optionsObj->m_ov.m_rawChainGenerateExtra) {
1642 m_logTargets [0] = currentPositionData.
logTarget();
1643 m_alphaQuotients[0] = 1.;
1647 if ((m_env.subDisplayFile() ) &&
1648 (m_env.displayVerbosity() >= 10 ) &&
1649 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1650 *m_env.subDisplayFile() <<
"\n"
1651 <<
"\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
1661 if ((m_env.numSubEnvironments() < (
unsigned int) m_env.fullComm().NumProc()) &&
1662 (m_initialPosition.numOfProcsForStorage() == 1 ) &&
1663 (m_env.subRank() != 0 )) {
1666 aux = m_targetPdfSynchronizer->callFunction(NULL,
1674 for (
unsigned int positionId = 1; positionId < workingChain.
subSequenceSize(); ++positionId) {
1678 m_rawChainInfo.numRejections++;
1681 else for (
unsigned int positionId = 1; positionId < workingChain.
subSequenceSize(); ++positionId) {
1686 m_positionIdForDebugging = positionId;
1687 if ((m_env.subDisplayFile() ) &&
1688 (m_env.displayVerbosity() >= 3 ) &&
1689 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1690 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1691 <<
": beginning chain position of id = " << positionId
1692 <<
", m_optionsObj->m_ov.m_drMaxNumExtraStages = " << m_optionsObj->m_ov.m_drMaxNumExtraStages
1695 unsigned int stageId = 0;
1696 m_stageIdForDebugging = stageId;
1698 m_tk->clearPreComputingPositions();
1700 if ((m_env.subDisplayFile() ) &&
1701 (m_env.displayVerbosity() >= 5 ) &&
1702 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1703 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1704 <<
": about to set TK pre computing position of local id " << 0
1705 <<
", values = " << currentPositionData.
vecValues()
1708 bool validPreComputingPosition = m_tk->setPreComputingPosition(currentPositionData.
vecValues(),0);
1709 if ((m_env.subDisplayFile() ) &&
1710 (m_env.displayVerbosity() >= 5 ) &&
1711 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1712 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1713 <<
": returned from setting TK pre computing position of local id " << 0
1714 <<
", values = " << currentPositionData.
vecValues()
1715 <<
", valid = " << validPreComputingPosition
1720 "MetropolisHastingsSG<P_V,P_M>::generateFullChain()",
1721 "initial position should not be an invalid pre computing position");
1727 bool keepGeneratingCandidates =
true;
1728 while (keepGeneratingCandidates) {
1729 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) {
1730 iRC = gettimeofday(&timevalCandidate, NULL);
1733 m_tk->rv(0).realizer().realization(tmpVecValues);
1735 if (m_numDisabledParameters > 0) {
1736 for (
unsigned int paramId = 0; paramId < m_vectorSpace.dimLocal(); ++paramId) {
1737 if (m_parameterEnabledStatus[paramId] ==
false) {
1738 tmpVecValues[paramId] = m_initialPosition[paramId];
1742 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) m_rawChainInfo.candidateRunTime +=
MiscGetEllapsedSeconds(&timevalCandidate);
1744 outOfTargetSupport = !m_targetPdf.domainSet().contains(tmpVecValues);
1746 bool displayDetail = (m_env.displayVerbosity() >= 10) || m_optionsObj->m_ov.m_displayCandidates;
1747 if ((m_env.subDisplayFile() ) &&
1749 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1750 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1751 <<
": for chain position of id = " << positionId
1752 <<
", candidate = " << tmpVecValues
1753 <<
", outOfTargetSupport = " << outOfTargetSupport
1757 if (m_optionsObj->m_ov.m_putOutOfBoundsInChain) keepGeneratingCandidates =
false;
1758 else keepGeneratingCandidates = outOfTargetSupport;
1761 if ((m_env.subDisplayFile() ) &&
1762 (m_env.displayVerbosity() >= 5 ) &&
1763 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1764 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1765 <<
": about to set TK pre computing position of local id " << stageId+1
1766 <<
", values = " << tmpVecValues
1769 validPreComputingPosition = m_tk->setPreComputingPosition(tmpVecValues,stageId+1);
1770 if ((m_env.subDisplayFile() ) &&
1771 (m_env.displayVerbosity() >= 5 ) &&
1772 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1773 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1774 <<
": returned from setting TK pre computing position of local id " << stageId+1
1775 <<
", values = " << tmpVecValues
1776 <<
", valid = " << validPreComputingPosition
1780 if (outOfTargetSupport) {
1781 m_rawChainInfo.numOutOfTargetSupport++;
1782 logPrior = -INFINITY;
1783 logLikelihood = -INFINITY;
1784 logTarget = -INFINITY;
1787 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) iRC = gettimeofday(&timevalTarget, NULL);
1788 logTarget = m_targetPdfSynchronizer->callFunction(&tmpVecValues,NULL,NULL,NULL,NULL,&logPrior,&logLikelihood);
1789 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) m_rawChainInfo.targetRunTime +=
MiscGetEllapsedSeconds(&timevalTarget);
1790 m_rawChainInfo.numTargetCalls++;
1791 if ((m_env.subDisplayFile() ) &&
1792 (m_env.displayVerbosity() >= 3 ) &&
1793 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1794 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1795 <<
": just returned from likelihood() for chain position of id " << positionId
1796 <<
", m_rawChainInfo.numTargetCalls = " << m_rawChainInfo.numTargetCalls
1797 <<
", logPrior = " << logPrior
1798 <<
", logLikelihood = " << logLikelihood
1799 <<
", logTarget = " << logTarget
1803 currentCandidateData.set(tmpVecValues,
1808 if ((m_env.subDisplayFile() ) &&
1809 (m_env.displayVerbosity() >= 10 ) &&
1810 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1811 *m_env.subDisplayFile() <<
"\n"
1812 <<
"\n-----------------------------------------------------------\n"
1816 bool accept =
false;
1817 double alphaFirstCandidate = 0.;
1818 if (outOfTargetSupport) {
1819 if (m_optionsObj->m_ov.m_rawChainGenerateExtra) {
1820 m_alphaQuotients[positionId] = 0.;
1824 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) iRC = gettimeofday(&timevalMhAlpha, NULL);
1825 if (m_optionsObj->m_ov.m_rawChainGenerateExtra) {
1826 alphaFirstCandidate = this->alpha(currentPositionData,currentCandidateData,0,1,&m_alphaQuotients[positionId]);
1829 alphaFirstCandidate = this->alpha(currentPositionData,currentCandidateData,0,1,NULL);
1831 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) m_rawChainInfo.mhAlphaRunTime +=
MiscGetEllapsedSeconds(&timevalMhAlpha);
1832 if ((m_env.subDisplayFile() ) &&
1833 (m_env.displayVerbosity() >= 10 ) &&
1834 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1835 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1836 <<
": for chain position of id = " << positionId
1839 accept = acceptAlpha(alphaFirstCandidate);
1842 bool displayDetail = (m_env.displayVerbosity() >= 10) || m_optionsObj->m_ov.m_displayCandidates;
1843 if ((m_env.subDisplayFile() ) &&
1845 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1846 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1847 <<
": for chain position of id = " << positionId
1848 <<
", outOfTargetSupport = " << outOfTargetSupport
1849 <<
", alpha = " << alphaFirstCandidate
1850 <<
", accept = " << accept
1851 <<
", currentCandidateData.vecValues() = ";
1852 *m_env.subDisplayFile() << currentCandidateData.vecValues();
1853 *m_env.subDisplayFile() <<
"\n"
1854 <<
"\n curLogTarget = " << currentPositionData.
logTarget()
1856 <<
"\n canLogTarget = " << currentCandidateData.logTarget()
1860 if ((m_env.subDisplayFile() ) &&
1861 (m_env.displayVerbosity() >= 10 ) &&
1862 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1863 *m_env.subDisplayFile() <<
"\n"
1864 <<
"\n-----------------------------------------------------------\n"
1874 std::vector<MarkovChainPositionData<P_V>*> drPositionsData(stageId+2,NULL);
1875 std::vector<unsigned int> tkStageIds (stageId+2,0);
1876 if ((accept ==
false) &&
1877 (outOfTargetSupport ==
false) &&
1878 (m_optionsObj->m_ov.m_drMaxNumExtraStages > 0 )) {
1879 if ((m_optionsObj->m_ov.m_drDuringAmNonAdaptiveInt ==
false ) &&
1880 (m_optionsObj->m_ov.m_tkUseLocalHessian ==
false ) &&
1881 (m_optionsObj->m_ov.m_amInitialNonAdaptInterval > 0 ) &&
1882 (m_optionsObj->m_ov.m_amAdaptInterval > 0 ) &&
1883 (positionId <= m_optionsObj->m_ov.m_amInitialNonAdaptInterval)) {
1887 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) iRC = gettimeofday(&timevalDR, NULL);
1895 while ((validPreComputingPosition ==
true ) &&
1896 (accept == false ) &&
1897 (stageId < m_optionsObj->m_ov.m_drMaxNumExtraStages)) {
1898 if ((m_env.subDisplayFile() ) &&
1899 (m_env.displayVerbosity() >= 10 ) &&
1900 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1901 *m_env.subDisplayFile() <<
"\n"
1902 <<
"\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-"
1906 m_rawChainInfo.numDRs++;
1908 m_stageIdForDebugging = stageId;
1909 if ((m_env.subDisplayFile() ) &&
1910 (m_env.displayVerbosity() >= 10 ) &&
1911 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1912 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1913 <<
": for chain position of id = " << positionId
1914 <<
", beginning stageId = " << stageId
1918 keepGeneratingCandidates =
true;
1919 while (keepGeneratingCandidates) {
1920 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) iRC = gettimeofday(&timevalCandidate, NULL);
1921 m_tk->rv(tkStageIds).realizer().realization(tmpVecValues);
1922 if (m_numDisabledParameters > 0) {
1923 for (
unsigned int paramId = 0; paramId < m_vectorSpace.dimLocal(); ++paramId) {
1924 if (m_parameterEnabledStatus[paramId] ==
false) {
1925 tmpVecValues[paramId] = m_initialPosition[paramId];
1929 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) m_rawChainInfo.candidateRunTime +=
MiscGetEllapsedSeconds(&timevalCandidate);
1931 outOfTargetSupport = !m_targetPdf.domainSet().contains(tmpVecValues);
1933 if (m_optionsObj->m_ov.m_putOutOfBoundsInChain) keepGeneratingCandidates =
false;
1934 else keepGeneratingCandidates = outOfTargetSupport;
1937 if ((m_env.subDisplayFile() ) &&
1938 (m_env.displayVerbosity() >= 5 ) &&
1939 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1940 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1941 <<
": about to set TK pre computing position of local id " << stageId+1
1942 <<
", values = " << tmpVecValues
1945 validPreComputingPosition = m_tk->setPreComputingPosition(tmpVecValues,stageId+1);
1946 if ((m_env.subDisplayFile() ) &&
1947 (m_env.displayVerbosity() >= 5 ) &&
1948 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1949 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1950 <<
": returned from setting TK pre computing position of local id " << stageId+1
1951 <<
", values = " << tmpVecValues
1952 <<
", valid = " << validPreComputingPosition
1956 if (outOfTargetSupport) {
1957 m_rawChainInfo.numOutOfTargetSupportInDR++;
1958 logPrior = -INFINITY;
1959 logLikelihood = -INFINITY;
1960 logTarget = -INFINITY;
1963 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) iRC = gettimeofday(&timevalTarget, NULL);
1964 logTarget = m_targetPdfSynchronizer->callFunction(&tmpVecValues,NULL,NULL,NULL,NULL,&logPrior,&logLikelihood);
1965 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) m_rawChainInfo.targetRunTime +=
MiscGetEllapsedSeconds(&timevalTarget);
1966 m_rawChainInfo.numTargetCalls++;
1967 if ((m_env.subDisplayFile() ) &&
1968 (m_env.displayVerbosity() >= 3 ) &&
1969 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
1970 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
1971 <<
": just returned from likelihood() for chain position of id " << positionId
1972 <<
", m_rawChainInfo.numTargetCalls = " << m_rawChainInfo.numTargetCalls
1973 <<
", stageId = " << stageId
1974 <<
", logPrior = " << logPrior
1975 <<
", logLikelihood = " << logLikelihood
1976 <<
", logTarget = " << logTarget
1980 currentCandidateData.set(tmpVecValues,
1986 tkStageIds.push_back (stageId+1);
1988 double alphaDR = 0.;
1989 if (outOfTargetSupport ==
false) {
1990 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) iRC = gettimeofday(&timevalDrAlpha, NULL);
1991 alphaDR = this->alpha(drPositionsData,tkStageIds);
1992 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) m_rawChainInfo.drAlphaRunTime +=
MiscGetEllapsedSeconds(&timevalDrAlpha);
1993 accept = acceptAlpha(alphaDR);
1996 displayDetail = (m_env.displayVerbosity() >= 10) || m_optionsObj->m_ov.m_displayCandidates;
1997 if ((m_env.subDisplayFile() ) &&
1999 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
2000 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
2001 <<
": for chain position of id = " << positionId
2002 <<
" and stageId = " << stageId
2003 <<
", outOfTargetSupport = " << outOfTargetSupport
2004 <<
", alpha = " << alphaDR
2005 <<
", accept = " << accept
2006 <<
", currentCandidateData.vecValues() = ";
2007 *m_env.subDisplayFile() << currentCandidateData.vecValues();
2008 *m_env.subDisplayFile() << std::endl;
2012 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) m_rawChainInfo.drRunTime +=
MiscGetEllapsedSeconds(&timevalDR);
2016 for (
unsigned int i = 0; i < drPositionsData.size(); ++i) {
2017 if (drPositionsData[i])
delete drPositionsData[i];
2026 if (
true) m_idsOfUniquePositions[uniquePos++] = positionId;
2027 currentPositionData = currentCandidateData;
2031 m_rawChainInfo.numRejections++;
2033 m_numPositionsNotSubWritten++;
2034 if ((m_optionsObj->m_ov.m_rawChainDataOutputPeriod > 0 ) &&
2035 (((positionId+1) % m_optionsObj->m_ov.m_rawChainDataOutputPeriod) == 0 ) &&
2036 (m_optionsObj->m_ov.m_rawChainDataOutputFileName !=
".")) {
2037 if ((m_env.subDisplayFile() ) &&
2038 (m_env.displayVerbosity() >= 10 ) &&
2039 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
2040 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
2041 <<
", for chain position of id = " << positionId
2042 <<
": about to write (per period request) " << m_numPositionsNotSubWritten <<
" chain positions "
2043 <<
", " << positionId + 1 - m_optionsObj->m_ov.m_rawChainDataOutputPeriod <<
" <= pos <= " << positionId
2046 workingChain.
subWriteContents(positionId + 1 - m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
2047 m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
2048 m_optionsObj->m_ov.m_rawChainDataOutputFileName,
2049 m_optionsObj->m_ov.m_rawChainDataOutputFileType,
2050 m_optionsObj->m_ov.m_rawChainDataOutputAllowedSet);
2051 if ((m_env.subDisplayFile() ) &&
2052 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
2053 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
2054 <<
", for chain position of id = " << positionId
2055 <<
": just wrote (per period request) " << m_numPositionsNotSubWritten <<
" chain positions "
2056 <<
", " << positionId + 1 - m_optionsObj->m_ov.m_rawChainDataOutputPeriod <<
" <= pos <= " << positionId
2060 if (writeLogLikelihood) {
2061 workingLogLikelihoodValues->
subWriteContents(0 + 1 - m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
2062 m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
2063 m_optionsObj->m_ov.m_rawChainDataOutputFileName +
"_loglikelihood",
2064 m_optionsObj->m_ov.m_rawChainDataOutputFileType,
2065 m_optionsObj->m_ov.m_rawChainDataOutputAllowedSet);
2068 if (writeLogTarget) {
2069 workingLogTargetValues->
subWriteContents(0 + 1 - m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
2070 m_optionsObj->m_ov.m_rawChainDataOutputPeriod,
2071 m_optionsObj->m_ov.m_rawChainDataOutputFileName +
"_logtarget",
2072 m_optionsObj->m_ov.m_rawChainDataOutputFileType,
2073 m_optionsObj->m_ov.m_rawChainDataOutputAllowedSet);
2076 m_numPositionsNotSubWritten = 0;
2080 if (workingLogLikelihoodValues) (*workingLogLikelihoodValues)[positionId] = currentPositionData.
logLikelihood();
2081 if (workingLogTargetValues ) (*workingLogTargetValues )[positionId] = currentPositionData.
logTarget();
2083 if (m_optionsObj->m_ov.m_rawChainGenerateExtra) {
2084 m_logTargets[positionId] = currentPositionData.
logTarget();
2087 if( m_optionsObj->m_ov.m_enableBrooksGelmanConvMonitor > 0 ) {
2088 if( positionId%m_optionsObj->m_ov.m_enableBrooksGelmanConvMonitor == 0 &&
2089 positionId > m_optionsObj->m_ov.m_BrooksGelmanLag+1 ) {
2092 positionId - m_optionsObj->m_ov.m_BrooksGelmanLag );
2094 if ( m_env.subDisplayFile() ) {
2095 *m_env.subDisplayFile() <<
"positionId = " << positionId
2096 <<
", conv_est = " << conv_est << std::endl;
2097 (*m_env.subDisplayFile()).flush();
2107 if ((m_optionsObj->m_ov.m_tkUseLocalHessian ==
false) &&
2108 (m_optionsObj->m_ov.m_amInitialNonAdaptInterval > 0) &&
2109 (m_optionsObj->m_ov.m_amAdaptInterval > 0)) {
2110 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) iRC = gettimeofday(&timevalAM, NULL);
2113 unsigned int idOfFirstPositionInSubChain = 0;
2117 bool printAdaptedMatrix =
false;
2118 if (positionId < m_optionsObj->m_ov.m_amInitialNonAdaptInterval) {
2121 else if (positionId == m_optionsObj->m_ov.m_amInitialNonAdaptInterval) {
2122 idOfFirstPositionInSubChain = 0;
2123 partialChain.
resizeSequence(m_optionsObj->m_ov.m_amInitialNonAdaptInterval+1);
2124 m_lastMean = m_vectorSpace.newVector();
2125 m_lastAdaptedCovMatrix = m_vectorSpace.newMatrix();
2126 printAdaptedMatrix =
true;
2129 unsigned int interval = positionId - m_optionsObj->m_ov.m_amInitialNonAdaptInterval;
2130 if ((interval % m_optionsObj->m_ov.m_amAdaptInterval) == 0) {
2131 idOfFirstPositionInSubChain = positionId - m_optionsObj->m_ov.m_amAdaptInterval;
2132 partialChain.
resizeSequence(m_optionsObj->m_ov.m_amAdaptInterval);
2134 if (m_optionsObj->m_ov.m_amAdaptedMatricesDataOutputPeriod > 0) {
2135 if ((interval % m_optionsObj->m_ov.m_amAdaptedMatricesDataOutputPeriod) == 0) {
2136 printAdaptedMatrix =
true;
2144 P_V transporterVec(m_vectorSpace.zeroVector());
2150 if (this->m_optionsObj->m_ov.m_doLogitTransform ==
true) {
2154 P_V transformedTransporterVec(m_vectorSpace.zeroVector());
2156 m_tk)->transformToGaussianSpace(transporterVec,
2157 transformedTransporterVec);
2164 updateAdaptedCovMatrix(partialChain,
2165 idOfFirstPositionInSubChain,
2168 *m_lastAdaptedCovMatrix);
2170 if ((printAdaptedMatrix ==
true) &&
2171 (m_optionsObj->m_ov.m_amAdaptedMatricesDataOutputFileName !=
"." )) {
2172 char varNamePrefix[64];
2173 sprintf(varNamePrefix,
"mat_am%d",positionId);
2176 sprintf(tmpChar,
"_am%d",positionId);
2178 std::set<unsigned int> tmpSet;
2179 tmpSet.insert(m_env.subId());
2181 m_lastAdaptedCovMatrix->subWriteContents(varNamePrefix,
2182 (m_optionsObj->m_ov.m_amAdaptedMatricesDataOutputFileName+tmpChar),
2183 m_optionsObj->m_ov.m_amAdaptedMatricesDataOutputFileType,
2185 if ((m_env.subDisplayFile() ) &&
2186 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
2187 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
2188 <<
": just wrote last adapted proposal cov matrix contents = " << *m_lastAdaptedCovMatrix
2193 bool tmpCholIsPositiveDefinite =
false;
2194 P_M tmpChol(*m_lastAdaptedCovMatrix);
2195 P_M attemptedMatrix(tmpChol);
2196 if ((m_env.subDisplayFile() ) &&
2197 (m_env.displayVerbosity() >= 10)) {
2199 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
2200 <<
", positionId = " << positionId
2201 <<
": 'am' calling first tmpChol.chol()"
2204 iRC = tmpChol.chol();
2206 std::cerr <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain(): first chol failed\n";
2208 if ((m_env.subDisplayFile() ) &&
2209 (m_env.displayVerbosity() >= 10)) {
2211 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
2212 <<
", positionId = " << positionId
2213 <<
": 'am' got first tmpChol.chol() with iRC = " << iRC
2216 double diagMult = 1.;
2217 for (
unsigned int j = 0; j < tmpChol.numRowsLocal(); ++j) {
2218 diagMult *= tmpChol(j,j);
2220 *m_env.subDisplayFile() <<
"diagMult = " << diagMult
2224 #if 0 // tentative logic
2226 double diagMult = 1.;
2227 for (
unsigned int j = 0; j < tmpChol.numRowsLocal(); ++j) {
2228 diagMult *= tmpChol(j,j);
2230 if (diagMult < 1.e-40) {
2239 "MetropolisHastingsSG<P_V,P_M>::generateFullChain()",
2240 "invalid iRC returned from first chol()");
2242 P_M* tmpDiag = m_vectorSpace.newDiagMatrix(m_optionsObj->m_ov.m_amEpsilon);
2243 if (m_numDisabledParameters > 0) {
2244 for (
unsigned int paramId = 0; paramId < m_vectorSpace.dimLocal(); ++paramId) {
2245 if (m_parameterEnabledStatus[paramId] ==
false) {
2246 (*tmpDiag)(paramId,paramId) = 0.;
2250 tmpChol = *m_lastAdaptedCovMatrix + *tmpDiag;
2251 attemptedMatrix = tmpChol;
2253 if ((m_env.subDisplayFile() ) &&
2254 (m_env.displayVerbosity() >= 10)) {
2256 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
2257 <<
", positionId = " << positionId
2258 <<
": 'am' calling second tmpChol.chol()"
2261 iRC = tmpChol.chol();
2263 std::cerr <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain(): second chol failed\n";
2265 if ((m_env.subDisplayFile() ) &&
2266 (m_env.displayVerbosity() >= 10)) {
2268 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
2269 <<
", positionId = " << positionId
2270 <<
": 'am' got second tmpChol.chol() with iRC = " << iRC
2273 double diagMult = 1.;
2274 for (
unsigned int j = 0; j < tmpChol.numRowsLocal(); ++j) {
2275 diagMult *= tmpChol(j,j);
2277 *m_env.subDisplayFile() <<
"diagMult = " << diagMult
2281 *m_env.subDisplayFile() <<
"attemptedMatrix = " << attemptedMatrix
2288 "MetropolisHastingsSG<P_V,P_M>::generateFullChain()",
2289 "invalid iRC returned from second chol()");
2293 tmpCholIsPositiveDefinite =
true;
2297 tmpCholIsPositiveDefinite =
true;
2299 if (tmpCholIsPositiveDefinite) {
2300 P_M tmpMatrix(m_optionsObj->m_ov.m_amEta*attemptedMatrix);
2301 if (m_numDisabledParameters > 0) {
2302 for (
unsigned int paramId = 0; paramId < m_vectorSpace.dimLocal(); ++paramId) {
2303 if (m_parameterEnabledStatus[paramId] ==
false) {
2304 for (
unsigned int i = 0; i < m_vectorSpace.dimLocal(); ++i) {
2305 tmpMatrix(i,paramId) = 0.;
2307 for (
unsigned int j = 0; j < m_vectorSpace.dimLocal(); ++j) {
2308 tmpMatrix(paramId,j) = 0.;
2310 tmpMatrix(paramId,paramId) = 1.;
2314 if (this->m_optionsObj->m_ov.m_doLogitTransform) {
2316 ->updateLawCovMatrix(tmpMatrix);
2320 ->updateLawCovMatrix(tmpMatrix);
2323 #ifdef UQ_DRAM_MCG_REQUIRES_INVERTED_COV_MATRICES
2326 "MetropolisHastingsSG<P_V,P_M>::generateFullChain()",
2327 "need to code the update of m_upperCholProposalPrecMatrices");
2336 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) m_rawChainInfo.amRunTime +=
MiscGetEllapsedSeconds(&timevalAM);
2343 if ((m_env.subDisplayFile() ) &&
2344 (m_env.displayVerbosity() >= 3 ) &&
2345 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
2346 *m_env.subDisplayFile() <<
"In MetropolisHastingsSG<P_V,P_M>::generateFullChain()"
2347 <<
": finishing chain position of id = " << positionId
2348 <<
", accept = " << accept
2349 <<
", curLogTarget = " << currentPositionData.
logTarget()
2350 <<
", canLogTarget = " << currentCandidateData.logTarget()
2354 if ((m_optionsObj->m_ov.m_rawChainDisplayPeriod > 0) &&
2355 (((positionId+1) % m_optionsObj->m_ov.m_rawChainDisplayPeriod) == 0)) {
2356 if ((m_env.subDisplayFile() ) &&
2357 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
2358 *m_env.subDisplayFile() <<
"Finished generating " << positionId+1
2360 <<
", curret rejection percentage = " << (100. * ((double) m_rawChainInfo.numRejections)/((double) (positionId+1)))
2366 if ((m_env.subDisplayFile() ) &&
2367 (m_env.displayVerbosity() >= 10 ) &&
2368 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
2369 *m_env.subDisplayFile() <<
"\n"
2370 <<
"\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
2376 if ((m_env.numSubEnvironments() < (
unsigned int) m_env.fullComm().NumProc()) &&
2377 (m_initialPosition.numOfProcsForStorage() == 1 ) &&
2378 (m_env.subRank() == 0 )) {
2381 aux = m_targetPdfSynchronizer->callFunction(NULL,
2395 if ((m_env.subDisplayFile() ) &&
2396 (m_optionsObj->m_ov.m_totallyMute ==
false)) {
2397 *m_env.subDisplayFile() <<
"Finished the generation of Markov chain " << workingChain.
name()
2400 *m_env.subDisplayFile() <<
"\nSome information about this chain:"
2401 <<
"\n Chain run time = " << m_rawChainInfo.runTime
2403 if (m_optionsObj->m_ov.m_rawChainMeasureRunTimes) {
2404 *m_env.subDisplayFile() <<
"\n\n Breaking of the chain run time:\n";
2405 *m_env.subDisplayFile() <<
"\n Candidate run time = " << m_rawChainInfo.candidateRunTime
2406 <<
" seconds (" << 100.*m_rawChainInfo.candidateRunTime/m_rawChainInfo.runTime
2408 *m_env.subDisplayFile() <<
"\n Num target calls = " << m_rawChainInfo.numTargetCalls;
2409 *m_env.subDisplayFile() <<
"\n Target d. run time = " << m_rawChainInfo.targetRunTime
2410 <<
" seconds (" << 100.*m_rawChainInfo.targetRunTime/m_rawChainInfo.runTime
2412 *m_env.subDisplayFile() <<
"\n Avg target run time = " << m_rawChainInfo.targetRunTime/((double) m_rawChainInfo.numTargetCalls)
2414 *m_env.subDisplayFile() <<
"\n Mh alpha run time = " << m_rawChainInfo.mhAlphaRunTime
2415 <<
" seconds (" << 100.*m_rawChainInfo.mhAlphaRunTime/m_rawChainInfo.runTime
2417 *m_env.subDisplayFile() <<
"\n Dr alpha run time = " << m_rawChainInfo.drAlphaRunTime
2418 <<
" seconds (" << 100.*m_rawChainInfo.drAlphaRunTime/m_rawChainInfo.runTime
2420 *m_env.subDisplayFile() <<
"\n---------------------- --------------";
2421 double sumRunTime = m_rawChainInfo.candidateRunTime + m_rawChainInfo.targetRunTime + m_rawChainInfo.mhAlphaRunTime + m_rawChainInfo.drAlphaRunTime;
2422 *m_env.subDisplayFile() <<
"\n Sum = " << sumRunTime
2423 <<
" seconds (" << 100.*sumRunTime/m_rawChainInfo.runTime
2425 *m_env.subDisplayFile() <<
"\n\n Other run times:";
2426 *m_env.subDisplayFile() <<
"\n DR run time = " << m_rawChainInfo.drRunTime
2427 <<
" seconds (" << 100.*m_rawChainInfo.drRunTime/m_rawChainInfo.runTime
2429 *m_env.subDisplayFile() <<
"\n AM run time = " << m_rawChainInfo.amRunTime
2430 <<
" seconds (" << 100.*m_rawChainInfo.amRunTime/m_rawChainInfo.runTime
2433 *m_env.subDisplayFile() <<
"\n Number of DRs = " << m_rawChainInfo.numDRs <<
"(num_DRs/chain_size = " << (double) m_rawChainInfo.numDRs/(
double) workingChain.
subSequenceSize()
2435 *m_env.subDisplayFile() <<
"\n Out of target support in DR = " << m_rawChainInfo.numOutOfTargetSupportInDR;
2436 *m_env.subDisplayFile() <<
"\n Rejection percentage = " << 100. * (double) m_rawChainInfo.numRejections/(
double) workingChain.
subSequenceSize()
2438 *m_env.subDisplayFile() <<
"\n Out of target support percentage = " << 100. * (double) m_rawChainInfo.numOutOfTargetSupport/(
double) workingChain.
subSequenceSize()
2440 *m_env.subDisplayFile() << std::endl;
2451 template <
class P_V,
class P_M>
2455 unsigned int idOfFirstPositionInSubChain,
2456 double& lastChainSize,
2458 P_M& lastAdaptedCovMatrix)
2461 if (lastChainSize == 0) {
2464 "MetropolisHastingsSG<P_V,P_M>::updateAdaptedCovMatrix()",
2465 "'partialChain.subSequenceSize()' should be >= 2");
2467 #if 1 // prudenci-2012-07-06
2473 P_V tmpVec(m_vectorSpace.zeroVector());
2474 lastAdaptedCovMatrix = -doubleSubChainSize *
matrixProduct(lastMean,lastMean);
2479 lastAdaptedCovMatrix /= (doubleSubChainSize - 1.);
2484 "MetropolisHastingsSG<P_V,P_M>::updateAdaptedCovMatrix()",
2485 "'partialChain.subSequenceSize()' should be >= 1");
2489 "MetropolisHastingsSG<P_V,P_M>::updateAdaptedCovMatrix()",
2490 "'idOfFirstPositionInSubChain' should be >= 1");
2492 P_V tmpVec (m_vectorSpace.zeroVector());
2493 P_V diffVec(m_vectorSpace.zeroVector());
2495 double doubleCurrentId = (double) (idOfFirstPositionInSubChain+i);
2497 diffVec = tmpVec - lastMean;
2499 double ratio1 = (1. - 1./doubleCurrentId);
2500 double ratio2 = (1./(1.+doubleCurrentId));
2501 lastAdaptedCovMatrix = ratio1 * lastAdaptedCovMatrix + ratio2 *
matrixProduct(diffVec,diffVec);
2502 lastMean += ratio2 * diffVec;
2505 lastChainSize += doubleSubChainSize;
2507 if (m_numDisabledParameters > 0) {
2508 for (
unsigned int paramId = 0; paramId < m_vectorSpace.dimLocal(); ++paramId) {
2509 if (m_parameterEnabledStatus[paramId] ==
false) {
2510 for (
unsigned int i = 0; i < m_vectorSpace.dimLocal(); ++i) {
2511 lastAdaptedCovMatrix(i,paramId) = 0.;
2513 for (
unsigned int j = 0; j < m_vectorSpace.dimLocal(); ++j) {
2514 lastAdaptedCovMatrix(paramId,j) = 0.;
2516 lastAdaptedCovMatrix(paramId,paramId) = 1.;
2524 template <
class P_V,
class P_M>
2529 P_V min_domain_bounds(boxSubset.
minValues());
2530 P_V max_domain_bounds(boxSubset.
maxValues());
2532 for (
unsigned int i = 0; i < min_domain_bounds.sizeLocal(); i++) {
2533 double min_val = min_domain_bounds[i];
2534 double max_val = max_domain_bounds[i];
2536 if (boost::math::isfinite(min_val) && boost::math::isfinite(max_val)) {
2537 if (m_initialProposalCovMatrix(i, i) >= max_val - min_val) {
2540 std::cerr <<
"Proposal variance element "
2543 << m_initialProposalCovMatrix(i, i)
2544 <<
" but domain is of size "
2545 << max_val - min_val
2547 std::cerr <<
"QUESO does not support uniform-like proposal "
2548 <<
"distributions. Try making the proposal variance smaller"
2553 double transformJacobian = 4.0 / (max_val - min_val);
2557 for (
unsigned int j = 0; j < min_domain_bounds.sizeLocal(); j++) {
2559 m_initialProposalCovMatrix(j, i) *= transformJacobian;
2561 for (
unsigned int j = 0; j < min_domain_bounds.sizeLocal(); j++) {
2563 m_initialProposalCovMatrix(i, j) *= transformJacobian;
bool outOfTargetSupport() const
Whether or not a position is out of target support; access to private attribute m_outOfTargetSupport...
void setName(const std::string &newName)
Changes the name of the sequence of vectors.
double MiscGetEllapsedSeconds(struct timeval *timeval0)
This class provides options for the Metropolis-Hastings generator of samples if no input file is avai...
A templated class that represents a Metropolis-Hastings generator of samples.
virtual double estimateConvBrooksGelman(unsigned int initialPos, unsigned int numPos) const =0
Estimates convergence rate using Brooks & Gelman method. See template specialization.
virtual void setPositionValues(unsigned int posId, const V &vec)=0
Set the values in vec at position posId of the sequence. See template specialization.
void transformInitialCovMatrixToGaussianSpace(const BoxSubset< P_V, P_M > &boxSubset)
void reset()
Resets Metropolis-Hastings chain info.
const V & maxValues() const
Vector of the maximum values of the box subset.
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 generateSequence(BaseVectorSequence< P_V, P_M > &workingChain, ScalarSequence< double > *workingLogLikelihoodValues, ScalarSequence< double > *workingLogTargetValues)
Method to generate the chain.
This class provides options for each level of the Multilevel sequence generator if no input file is a...
const BaseTKGroup< P_V, P_M > & transitionKernel() const
Returns the underlying transition kernel for this sequence generator.
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.
MetropolisHastingsSGOptions * m_optionsObj
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.
const int UQ_MATRIX_IS_NOT_POS_DEFINITE_RC
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.
Struct for handling data input and output from files.
void commonConstructor()
Reads the options values from the options input file.
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.
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...
~MHRawChainInfoStruct()
Destructor.
GslMatrix matrixProduct(const GslVector &v1, const GslVector &v2)
std::ofstream * subDisplayFile() const
Access function for m_subDisplayFile (displays file on stream).
#define RawValue_MPI_DOUBLE
const BaseEnvironment & m_env
#define RawValue_MPI_UNSIGNED
unsigned int numOutOfTargetSupportInDR
This class reads the options for the Metropolis-Hastings generator of samples from an input file...
unsigned int numTargetCalls
#define UQ_FATAL_RC_MACRO(macroIRc, givenRank, where, what)
unsigned int subSequenceSize() const
Size of the sub-sequence of vectors.
const V & lawVarVector() const
Access to the vector of variance values and private attribute: m_lawVarVector.
This class allows the representation of a transition kernel with Hessians.
unsigned int vectorSizeLocal() const
Local dimension (size) of the vector space.
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.
const V & minValues() const
Vector of the minimum values of the box subset.
const M & lawCovMatrix() const
Returns the covariance matrix; access to protected attribute m_lawCovMatrix.
int writeInfo(const BaseVectorSequence< P_V, P_M > &workingChain, std::ofstream &ofsvar) const
Writes information about the Markov chain in a file.
double logTarget() const
Logarithm of the value of the target; access to private attribute m_logTarget.
std::ofstream * ofsVar
Provides a stream interface to write data to files.
double alpha(const MarkovChainPositionData< P_V > &x, const MarkovChainPositionData< P_V > &y, unsigned int xStageId, unsigned int yStageId, double *alphaQuotientPtr=NULL)
Calculates acceptance ration.
#define UQ_FILE_EXTENSION_FOR_MATLAB_FORMAT
const int UQ_INCOMPLETE_IMPLEMENTATION_RC
MetropolisHastingsSG(const char *prefix, const MhOptionsValues *alternativeOptionsValues, const BaseVectorRV< P_V, P_M > &sourceRv, const P_V &initialPosition, const P_M *inputProposalCovMatrix)
Constructor.
void resizeSequence(unsigned int newSequenceSize)
Resizes the size of the sequence of scalars.
#define UQ_FATAL_TEST_MACRO(test, givenRank, where, what)
const V & vecValues() const
Values of the chain (vector); access to private attribute m_vecValues.
This class represents a transition kernel with a scaled covariance matrix on hybrid bounded/unbounded...
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.
void filter(unsigned int initialPos, unsigned int spacing)
Filters positions in the sequence of vectors.
const V & subMeanPlain() const
Finds the mean value of the sub-sequence.
void getRawChainInfo(MHRawChainInfoStruct &info) const
Gets information from the raw chain.
A class for handling hybrid (transformed) Gaussians with bounds.
void getPositionValues(unsigned int posId, V &vec) const
Gets the values of the sequence at position posId and stores them at vec.
The QUESO MPI Communicator Class.
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...
void unifiedWriteContents(const std::string &fileName, const std::string &fileType) const
Writes the unified sequence to a file.
MhOptionsValues m_ov
This class is where the actual options are stored.
unsigned int numOutOfTargetSupport
const V & lawExpVector() const
Access to the vector of mean values of the Gaussian (not transformed) and private attribute: m_lawExp...
void resizeSequence(unsigned int newSubSequenceSize)
Resizes the sequence.
double subPositionsOfMaximum(const ScalarSequence< double > &subCorrespondingScalarValues, BaseVectorSequence< V, M > &subPositionsOfMaximum)
Finds the positions where the maximum element occurs in the sub-sequence.
A struct that represents a Metropolis-Hastings sample.
unsigned int numRejections
This class allows the representation of a transition kernel with a scaled covariance matrix...
MHRawChainInfoStruct & operator=(const MHRawChainInfoStruct &rhs)
Assignment operator.
const std::string & name() const
Access to protected attribute m_name: name of the sequence of vectors.
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.
MHRawChainInfoStruct()
Constructor.
virtual unsigned int subSequenceSize() const =0
Size of the sub-sequence of vectors. See template specialization.
void mpiSum(const MpiComm &comm, MHRawChainInfoStruct &sumInfo) const
Calculates the MPI sum of this.
~MetropolisHastingsSG()
Destructor.
P_M m_initialProposalCovMatrix
void copy(const MHRawChainInfoStruct &src)
Copies Metropolis-Hastings chain info from src to this.
void computeFilterParams(std::ofstream *passedOfs, unsigned int &initialPos, unsigned int &spacing)
Computes the filtering parameters spacing for the sequence of vectors.
double logLikelihood() const
Logarithm of the value of the likelihood; access to private attribute m_logLikelihood.
MHRawChainInfoStruct & operator+=(const MHRawChainInfoStruct &rhs)
Addition assignment operator.
Class for handling vector samples (sequence of vectors).
double unifiedPositionsOfMaximum(const ScalarSequence< double > &subCorrespondingScalarValues, BaseVectorSequence< V, M > &unifiedPositionsOfMaximum)
Finds the positions where the maximum element occurs in the unified sequence.
#define UQ_MH_SG_FILENAME_FOR_NO_FILE
void setPositionValues(unsigned int posId, const V &vec)
Set the values in vec at position posId of the sequence.
virtual void resizeSequence(unsigned int newSubSequenceSize)=0
Resize the sequence. See template specialization.
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...
bool acceptAlpha(double alpha)
Decides whether or not to accept alpha.
A templated class that represents a Markov Chain.