/** * Reset the currently monitored DAG nodes by extracting the DAG nodes from the model again * and store this in the set of DAG nodes. */ void ModelMonitor::resetDagNodes( void ) { // for savety we empty our dag nodes nodes.clear(); if ( model != NULL ) { // we only want to have each nodes once // this should by default happen by here we check again std::set<std::string> varNames; const std::vector<DagNode*> &n = model->getDagNodes(); for (std::vector<DagNode*>::const_iterator it = n.begin(); it != n.end(); ++it) { DagNode *theNode = *it; // only simple numeric variable can be monitored (i.e. only integer and real numbers) if ( theNode->isSimpleNumeric() && !theNode->isClamped()) { if ( (!stochasticNodesOnly && !theNode->isConstant() && theNode->getName() != "" && !theNode->isHidden() && !theNode->isElementVariable() ) || ( theNode->isStochastic() && !theNode->isClamped() && theNode->isHidden() == false && theNode->isElementVariable() == false ) ) { const std::string &name = theNode->getName(); if ( varNames.find( name ) == varNames.end() ) { nodes.push_back( theNode ); varNames.insert( name ); } else { /* std::cerr << "Trying to add variable with name '" << name << "' twice." << std::endl; */ } } } } } }
void HillClimber::initializeSampler( void ) { std::vector<DagNode *>& dagNodes = model->getDagNodes(); std::vector<DagNode *> orderedStochNodes = model->getOrderedStochasticNodes( ); // Get rid of previous move schedule, if any if ( schedule ) { delete schedule; } schedule = NULL; // Get initial lnProbability of model // first we touch all nodes so that the likelihood is dirty for (std::vector<DagNode *>::iterator i=dagNodes.begin(); i!=dagNodes.end(); i++) { DagNode *the_node = *i; the_node->setMcmcMode( true ); the_node->setPriorOnly( false ); the_node->touch(); } int numTries = 0; int maxNumTries = 100; double lnProbability = 0.0; for ( ; numTries < maxNumTries; numTries ++ ) { // a flag if we failed to find a valid starting value bool failed = false; lnProbability = 0.0; for (std::vector<DagNode *>::iterator i=dagNodes.begin(); i!=dagNodes.end(); i++) { DagNode* node = (*i); node->touch(); double lnProb = node->getLnProbability(); if ( !RbMath::isAComputableNumber(lnProb) ) { std::stringstream ss; ss << "Could not compute lnProb for node " << node->getName() << "." << std::endl; node->printValue( ss ); ss << std::endl; RBOUT( ss.str() ); // set the flag failed = true; break; } lnProbability += lnProb; } // now we keep all nodes so that the likelihood is stored for (std::vector<DagNode *>::iterator i=dagNodes.begin(); i!=dagNodes.end(); i++) { (*i)->keep(); } if ( failed == true ) { std::cout << "Drawing new initial states ... " << std::endl; for (std::vector<DagNode *>::iterator i=orderedStochNodes.begin(); i!=orderedStochNodes.end(); i++) { if ( !(*i)->isClamped() && (*i)->isStochastic() ) { (*i)->redraw(); (*i)->reInitialized(); } else if ( (*i)->isClamped() ) { // make sure that the clamped node also recompute their probabilities (*i)->reInitialized(); (*i)->touch(); } } } else { break; } } if ( numTries == maxNumTries ) { std::stringstream msg; msg << "Unable to find a starting state with computable probability"; if ( numTries > 1 ) { msg << " after " << numTries << " tries"; } throw RbException( msg.str() ); } // Create the move scheduler if ( scheduleType == "sequential" ) { schedule = new SequentialMoveSchedule( &moves ); } else if ( scheduleType == "single" ) { schedule = new SingleRandomMoveSchedule( &moves ); } else { schedule = new RandomMoveSchedule( &moves ); } generation = 0; }