/** @brief Annotes all tree nodes \a tr with their subtree size * * Similar to \a computeTraversalInfoStlen, but does a full traversal ignoring orientation. * The minum cost is defined as the minimum subtree size. In general, the closer a vector is to the tips, * the less recomputations are required to re-establish its likelihood entries * * @param p * Pointer to node * * @param maxTips * Number of tips in the tree * * @param rvec * Recomputation info */ void computeFullTraversalInfoStlen(nodeptr p, int maxTips, recompVectors *rvec) { if(isTip(p->number, maxTips)) return; else { nodeptr q = p->next->back, r = p->next->next->back; if(isTip(r->number, maxTips) && isTip(q->number, maxTips)) { rvec->stlen[p->number - maxTips - 1] = 2; #ifdef _DEBUG_RECOMPUTATION assert(rvec->stlen[p->number - maxTips - 1] == subtreeSize(p, maxTips)); #endif } else { if(isTip(r->number, maxTips) || isTip(q->number, maxTips)) { nodeptr tmp; if(isTip(r->number, maxTips)) { tmp = r; r = q; q = tmp; } computeFullTraversalInfoStlen(r, maxTips, rvec); rvec->stlen[p->number - maxTips - 1] = rvec->stlen[r->number - maxTips - 1] + 1; #ifdef _DEBUG_RECOMPUTATION assert(rvec->stlen[p->number - maxTips - 1] == subtreeSize(p, maxTips)); #endif } else { computeFullTraversalInfoStlen(r, maxTips, rvec); computeFullTraversalInfoStlen(q, maxTips, rvec); rvec->stlen[p->number - maxTips - 1] = rvec->stlen[q->number - maxTips - 1] + rvec->stlen[r->number - maxTips - 1]; #ifdef _DEBUG_RECOMPUTATION assert(rvec->stlen[p->number - maxTips - 1] == subtreeSize(p, maxTips)); #endif } } } }
void determineFullTraversalStlen(nodeptr p, tree *tr) { #ifdef _DEBUG_RECOMPUTATION double travTime = gettime(); #endif nodeptr q = p->back; computeFullTraversalInfoStlen(p, tr->mxtips, tr->rvec); computeFullTraversalInfoStlen(q, tr->mxtips, tr->rvec); #ifdef _DEBUG_RECOMPUTATION tr->stlenTime += (gettime() - travTime); #endif }