void ParsSprProposer::testInsertParsimony(TreeAln &traln, nodeptr insertPos, nodeptr prunedTree, branch2parsScore &result, int curDepth) { if(curDepth == 0 ) return; --curDepth; nodeptr insertBack = insertPos->back; traln.clipNode(insertPos, prunedTree->next); traln.clipNode( insertBack, prunedTree->next->next); auto b = BranchPlain(insertPos->number, insertBack->number); if(_computedInsertions.size() > 0 && _computedInsertions.find(b) != _computedInsertions.end()) { result[b] = _computedInsertions.at(b); } else { ParsimonyEvaluator::disorientNode(prunedTree); result[b] = _pEval.evaluate(traln, prunedTree, false ); } traln.clipNode(insertPos, insertBack); prunedTree->next->back = prunedTree->next->next->back = NULL; // recursively descend if(not traln.isTipNode(insertPos)) { testInsertParsimony(traln, insertPos->next->back, prunedTree, result, curDepth); testInsertParsimony(traln, insertPos->next->next->back, prunedTree, result, curDepth); } }
ParsSprProposer::branch2parsScore ParsSprProposer::determineScoresOfInsertions(TreeAln& traln, BranchPlain prunedTree ) { auto result = branch2parsScore{}; nodeptr p = traln.findNodePtr(prunedTree), pn = p->next->back , pnn = p->next->next->back ; // prune the subtree traln.clipNode( pn, pnn); p->next->back = p->next->next->back = NULL; // fetch all parsimony scores if(not traln.isTipNode(pn)) { testInsertParsimony(traln, pn->next->back, p, result, _depth); testInsertParsimony(traln, pn->next->next->back, p, result, _depth); } if(not traln.isTipNode(pnn)) { testInsertParsimony(traln, pnn->next->back,p, result, _depth); testInsertParsimony(traln, pnn->next->next->back,p, result, _depth); } traln.clipNode( p->next, pn ); traln.clipNode( p->next->next, pnn); return result; }
static void addTraverseParsimony (tree *tr, nodeptr p, nodeptr q, int mintrav, int maxtrav, boolean doAll, boolean saveBranches) { if (doAll || (--mintrav <= 0)) testInsertParsimony(tr, p, q, saveBranches); if (((q->number > tr->mxtips)) && ((--maxtrav > 0) || doAll)) { addTraverseParsimony(tr, p, q->next->back, mintrav, maxtrav, doAll, saveBranches); addTraverseParsimony(tr, p, q->next->next->back, mintrav, maxtrav, doAll, saveBranches); } }