void Move_ElementSlide::constructInternalObject( void ) { // we free the memory first delete value; // now allocate a new vector-slide move double l = static_cast<const RealPos &>( delta->getRevObject() ).getValue(); double w = static_cast<const RealPos &>( weight->getRevObject() ).getValue(); RevBayesCore::TypedDagNode<RevBayesCore::RbVector<double> >* tmp = static_cast<const ModelVector<RealPos> &>( x->getRevObject() ).getDagNode(); std::set<const RevBayesCore::DagNode*> p = tmp->getParents(); std::vector< RevBayesCore::StochasticNode<double> *> n; for (std::set<const RevBayesCore::DagNode*>::const_iterator it = p.begin(); it != p.end(); ++it) { const RevBayesCore::StochasticNode<double> *theNode = dynamic_cast< const RevBayesCore::StochasticNode<double>* >( *it ); if ( theNode != NULL ) { n.push_back( const_cast< RevBayesCore::StochasticNode<double>* >( theNode ) ); } else { throw RbException("Could not create a mvElementSlide because the node isn't a vector of stochastic nodes."); } } bool t = static_cast<const RlBoolean &>( tune->getRevObject() ).getValue(); RevBayesCore::Proposal *prop = new RevBayesCore::ElementSlideProposal(n,l); value = new RevBayesCore::MetropolisHastingsMove(prop,w,t); }
void Move_SynchronizedVectorFixedSingleElementSlide::constructInternalObject( void ) { // we free the memory first delete value; // now allocate a new sliding move double l = static_cast<const RealPos &>( lambda->getRevObject() ).getValue(); double w = static_cast<const RealPos &>( weight->getRevObject() ).getValue(); RevBayesCore::TypedDagNode<RevBayesCore::RbVector<RevBayesCore::RbVector<double> > >* tmp = static_cast<const ModelVector<ModelVector<RealPos> > &>( v->getRevObject() ).getDagNode(); std::vector<const RevBayesCore::DagNode*> par = tmp->getParents(); std::vector< RevBayesCore::StochasticNode<RevBayesCore::RbVector<double> > *> n; for (std::vector<const RevBayesCore::DagNode*>::const_iterator it = par.begin(); it != par.end(); ++it) { const RevBayesCore::StochasticNode<RevBayesCore::RbVector<double> > *the_node = dynamic_cast< const RevBayesCore::StochasticNode<RevBayesCore::RbVector<double> >* >( *it ); if ( the_node != NULL ) { n.push_back( const_cast< RevBayesCore::StochasticNode<RevBayesCore::RbVector<double> >* >( the_node ) ); } else { throw RbException("Could not create a mvElementScale because the node isn't a vector of stochastic nodes."); } } bool t = static_cast<const RlBoolean &>( tune->getRevObject() ).getValue(); std::vector<int> e; if ( which_element->getRevObject().isType( ModelVector<Natural>::getClassTypeSpec() ) ) { e = static_cast<const ModelVector<Natural> &>( which_element->getRevObject() ).getValue(); } else { int index = static_cast<const Natural &>( which_element->getRevObject() ).getValue(); e.push_back( index ); } // we need to offset the indices for (size_t i=0; i<e.size(); ++i) { --e[i]; } RevBayesCore::Proposal *prop = new RevBayesCore::SynchronizedVectorFixedSingleElementSlideProposal(n, l, e); value = new RevBayesCore::MetropolisHastingsMove(prop, w, t); }