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()"); }