static unsigned int evaluateParsimony(tree *tr, nodeptr p, boolean full) { volatile unsigned int result; nodeptr q = p->back; int *ti = tr->ti, counter = 4; ti[1] = p->number; ti[2] = q->number; if(full) { if(p->number > tr->mxtips) computeTraversalInfoParsimony(p, ti, &counter, tr->mxtips, full); if(q->number > tr->mxtips) computeTraversalInfoParsimony(q, ti, &counter, tr->mxtips, full); } else { if(p->number > tr->mxtips && !p->xPars) computeTraversalInfoParsimony(p, ti, &counter, tr->mxtips, full); if(q->number > tr->mxtips && !q->xPars) computeTraversalInfoParsimony(q, ti, &counter, tr->mxtips, full); } ti[0] = counter; result = evaluateParsimonyIterativeFast(tr); return result; }
unsigned int pllEvaluateParsimony(pllInstance *tr, partitionList *pr, nodeptr p, boolean full, boolean perSiteScores) { volatile unsigned int result; nodeptr q = p->back; int *ti = tr->ti, counter = 4; ti[1] = p->number; ti[2] = q->number; if(full) { if(p->number > tr->mxtips) computeTraversalInfoParsimony(p, ti, &counter, tr->mxtips, full); if(q->number > tr->mxtips) computeTraversalInfoParsimony(q, ti, &counter, tr->mxtips, full); } else { if(p->number > tr->mxtips && !p->xPars) computeTraversalInfoParsimony(p, ti, &counter, tr->mxtips, full); if(q->number > tr->mxtips && !q->xPars) computeTraversalInfoParsimony(q, ti, &counter, tr->mxtips, full); } ti[0] = counter; result = evaluateParsimonyIterativeFast(tr, pr, perSiteScores); return result; }
void TreeRandomizer::stepwiseAddition(pllInstance *tr, partitionList *pr, nodeptr p, nodeptr q, ParallelSetup& pl) { nodeptr r = q->back; unsigned int mp; int counter = 4; p->next->back = q; q->back = p->next; p->next->next->back = r; r->back = p->next->next; computeTraversalInfoParsimony(p, tr->ti, &counter, tr->mxtips, PLL_FALSE); tr->ti[0] = counter; tr->ti[1] = p->number; tr->ti[2] = p->back->number; mp = evaluateParsimonyIterativeFast(tr, pr); auto result = std::vector<nat>{mp}; // std::cout << "my score was " << mp << std::endl; result = pl.getChainComm().allReduce(result); mp = result.at(0); // std::cout << "after allreduce "<< mp << std::endl; if(mp < tr->bestParsimony) { tr->bestParsimony = mp; tr->insertNode = q; } q->back = r; r->back = q; if(q->number > tr->mxtips #if 0 && tr->parsimonyScore[q->number] > 0 #endif ) { stepwiseAddition(tr, pr, p, q->next->back, pl); stepwiseAddition(tr, pr, p, q->next->next->back, pl); } }
static void stepwiseAddition(tree *tr, nodeptr p, nodeptr q) { nodeptr r = q->back; unsigned int mp; int counter = 4; p->next->back = q; q->back = p->next; p->next->next->back = r; r->back = p->next->next; computeTraversalInfoParsimony(p, tr->ti, &counter, tr->mxtips, FALSE); tr->ti[0] = counter; tr->ti[1] = p->number; tr->ti[2] = p->back->number; mp = evaluateParsimonyIterativeFast(tr); if(mp < tr->bestParsimony) { tr->bestParsimony = mp; tr->insertNode = q; } q->back = r; r->back = q; if(q->number > tr->mxtips && tr->parsimonyScore[q->number] > 0) { stepwiseAddition(tr, p, q->next->back); stepwiseAddition(tr, p, q->next->next->back); } }