Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
    
}