Exemple #1
0
void
Vineyard<I,It,E>::
record_knee(Iter i)
{
    rLog(rlVineyard, "Entered record_knee()");
    AssertMsg(evaluator != 0, "Cannot record knee with a null evaluator");
    AssertMsg(i->vine() != 0, "Cannot add a knee to a null vine");
    AssertMsg(i->sign(), "record_knee() must be called on a positive simplex");
    
    if (i->unpaired())
        i->vine()->add((*evaluator)(i), Infinity, evaluator->time());
    else
    {
        rLog(rlVineyard, "Creating knee");
        Knee k((*evaluator)(i), (*evaluator)((i->pair)), evaluator->time());
        rLog(rlVineyard, "Knee created: %s", tostring(k).c_str());
        rLog(rlVineyard, "Vine: %s", tostring(*(i->vine())).c_str());

        if (!k.is_diagonal() || i->vine()->empty())         // non-diagonal k, or empty vine
        {
            rLog(rlVineyard, "Extending a vine");
            i->vine()->add(k);
        }
        else if (i->vine()->back().is_diagonal())           // last knee is diagonal
        {
            AssertMsg(i->vine()->size() == 1, "Only first knee may be diagonal for a live vine");
            rLog(rlVineyard, "Overwriting first diagonal knee");
            i->vine()->back() = k;
        } else                                              // finish this vine
        {
            rLog(rlVineyard, "Finishing a vine");
            i->vine()->add(k);
            start_vine(i);
            i->vine()->add(k);
        }
    }
    
    rLog(rlVineyard, "Leaving record_knee()");
}