当前位置: 首页>>代码示例>>C++>>正文


C++ Parm::change方法代码示例

本文整理汇总了C++中Parm::change方法的典型用法代码示例。如果您正苦于以下问题:C++ Parm::change方法的具体用法?C++ Parm::change怎么用?C++ Parm::change使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在Parm的用法示例。


在下文中一共展示了Parm::change方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: runChain

void Mcmc::runChain(void) {

	// get initial likelihood
	modelPtr->updateAllFlags();
	double oldLnL = modelPtr->lnLikelihood();
	
	for (int n=1; n<=numCycles; n++)
		{
		// pick a parameter to change
		Parm* parm = modelPtr->pickParmAtRandom();
		
		// propose a new state for the parameter
		double lnProposalRatio = parm->change();
		
		// calculate the prior ratio 
		double lnPriorRatio = parm->lnPriorRatio();
		
		// calculate the likelihood
		modelPtr->updateQ(parm);
		double lnL = modelPtr->lnLikelihood();
		double lnLikelihoodRatio = lnL - oldLnL;
		
		// calculate the acceptance probability of the proposed state
		double r = safeExp( lnLikelihoodRatio + lnPriorRatio + lnProposalRatio );
		
		// accept or reject the proposed state as the next state of the chain
		bool acceptState = false;
		if (ranPtr->uniformRv() < r)
			acceptState = true;
			
		// print information to the screen
		if ( n % printFrequency == 0 )
			{
			std::cout << std::setw(5) << n << " -- ";
			std::cout << std::fixed << std::setprecision(8) << oldLnL << " -> " << lnL;
			if (acceptState == true)
				std::cout << " -- Accepted change to " << parm->getName() << std::endl;
			else
				std::cout << " -- Rejected change to " << parm->getName() << std::endl;
			}
		
		// update the state of the chain
		if (acceptState == true)
			{
			parm->incrementNumAccepted();
			oldLnL = lnL;
			modelPtr->keep(parm);
			}
		else 
			{
			modelPtr->restore(parm);
			modelPtr->restoreQ(parm);
			}

		// print out current chain state
		if ( n == 1 || n % sampleFrequency == 0 || n == numCycles )
			printChainState(n, oldLnL);
			
		// print summary of chain
		if ( n % summarizeFrequency == 0 )
			treeSummary->printSummary();
		}
		
	treeSummary->print();
	modelPtr->printAcceptanceInfo();
}
开发者ID:mlandis,项目名称:posselreg,代码行数:66,代码来源:Mcmc.cpp

示例2: parmOut

Mcmc::Mcmc(Model *m, MbRandom *r, Settings *s, IoManager *outputPtr) {

	/* initialize some pointers and variables */
	modelPtr    = m;
	rnd         = r;
	chainLength = s->getChainLength();
	printFreq   = s->getPrintFrequency();
	sampleFreq  = s->getSampleFrequency();

	/* open files for output */
	string fileName = "";
	if (outputPtr->getFileName() == "")
		fileName = "mcmc_out";
	else
		fileName = outputPtr->getFileName();
	string filePathAndName = outputPtr->getFilePath() + PATH_SEPERATOR + fileName;
	string parmFile = filePathAndName + ".parm";
	string treeFile = filePathAndName + ".tree";
	ofstream parmOut( parmFile.c_str(), ios::out );
	ofstream treeOut( treeFile.c_str(), ios::out );
	if (!parmOut) 
		{
		cerr << "Cannot open file \"" + parmFile + "\"" << endl;
		exit(1);
		}
	if (!treeOut) 
		{
		cerr << "Cannot open file \"" + treeFile + "\"" << endl;
		exit(1);
		}
	
	cout << "   Running Markov chain" << endl;
	cout << "      Number of cycles      = " << chainLength << endl;
	cout << "      Print frequency       = " << printFreq << endl;
	cout << "      Sample frequency      = " << sampleFreq << endl;
	cout << "      Parameter file name   = " << fileName + ".parm" << endl;
	cout << "      Tree file name        = " << fileName + ".tree" << endl << endl;
	cout << "   Chain" << endl;
	
	/* run the Markov chain */
	int timeOn = clock();
	for (int n=1; n<=chainLength; n++)
		{
		/* pick a parameter to change */
		int whichParm = modelPtr->pickParm();
		Parm *parmOld = modelPtr->getCurParameter(whichParm);
		modelPtr->flipActiveParm();
		Parm *parmNew = modelPtr->getCurParameter(whichParm);

		/* change the parameter */
		double lnProposalRatio = parmNew->change();
		
		/* calculate likelihood for new state */
		modelPtr->upDateQ(parmNew);
		modelPtr->upDateTiProbs();
		double lnLOld = modelPtr->getLnL();
		double lnLNew = modelPtr->lnLikelihood();

		if (n % printFreq == 0)
			cout << setw(8) << n << " -- " << fixed << setprecision(2) << lnLOld << " -> " << fixed << setprecision(2) << lnLNew;
		
		/* calculate the acceptance probability */
		double lnLikelihoodRatio = lnLNew - lnLOld;
		double lnPriorRatio = parmNew->getLnPriorProbability() - parmOld->getLnPriorProbability();
		double lnR = lnLikelihoodRatio + lnPriorRatio + lnProposalRatio;
		double r = 0.0;
		if (lnR > 0.0)
			r = 1.0;
		else if (lnR < -100.0)
			r = 0.0;
		else
			r = exp(lnR);
		
		/* accept or reject the move */
		bool acceptMove = false;
		if (rnd->uniformRv() < r)
			acceptMove = true;
			
		/* update state of chain */
		if (acceptMove == true)
			{
			modelPtr->setLnL(lnLNew);
			int from = modelPtr->getActiveParm();
			int to   = flip(from);
			modelPtr->copyParms( from, to );
			if (n % printFreq == 0)
				cout << " -- Accepted change to " << parmNew->getParmName() << endl;
			}
		else
			{
			modelPtr->restoreQ(parmNew);
			int to = modelPtr->getActiveParm();
			int from   = flip(to);
			modelPtr->copyParms( from, to );
			modelPtr->flipActiveParm();
			if (n % printFreq == 0)
				cout << " -- Rejected change to " << parmNew->getParmName() << endl;
			}
			
		/* print state of the chain to a file */
//.........这里部分代码省略.........
开发者ID:kaspermunch,项目名称:sap-vendors,代码行数:101,代码来源:mcmc.cpp


注:本文中的Parm::change方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。