void NWK_roothandl(char *nwktr, int nwklen, int ntax, int numnodes, tree *newtree, bool isRooted) { int ctr = 0; int *ctrp; ctrp = &ctr; newtree->trnodes[ntax] = cpyfromNWK(nwktr, nwklen, ntax, numnodes, ctrp, newtree->trnodes, isRooted); newtree->root = newtree->trnodes[ntax]; if (!isRooted) { mfl_unroot(ntax, newtree); } /* debugging print */ /*dbg_printf("[&"); if (newtree->root) { dbg_printf("R] = "); printNewick(newtree->root); } else { dbg_printf("U] = "); printNewick(newtree->trnodes[0]); } dbg_printf("\n");*/ /* end debugging print */ }
void mfl_nni_traversal(node *n, tree *swapingon, tree **savedtrees, int ntax, int nchar, int numnodes, long int *current, charstate *tipdata, bool *undertreelimit, int *currentbesttree, bool *foundbettertree) { int trlength = 0; node *p; if (n->start) { mfl_nni_traversal(n->edge, swapingon, savedtrees, ntax, nchar, numnodes, current, tipdata, undertreelimit, currentbesttree, foundbettertree); return; } if (n->tip || !(*undertreelimit)) { return; } if (!n->edge->tip) { /* Nearly identical steps are conducted twice because all nearest- * neighbor interchanges produce two distinct tree topologies */ if (*current + 1 <= TREELIMIT) { mfl_bswap(n->next->edge, n->edge->next->edge); mfl_root_tree(swapingon, 1, ntax); trlength = mfl_get_treelen(swapingon, ntax, nchar, currentbesttree); mfl_unroot(ntax, swapingon); if (trlength < *currentbesttree) { *foundbettertree = true; *currentbesttree = trlength; swapingon->length = trlength; mfl_reinit_treebuffer(savedtrees, swapingon, current, numnodes); trlength = 0; *current = *current + 1; return; } if (trlength == *currentbesttree) { *foundbettertree = false; savedtrees[*current] = mfl_copytree(swapingon, ntax, numnodes); savedtrees[*current]->index = *current; savedtrees[*current]->length = trlength; trlength = 0; *current = *current + 1; } mfl_bswap(n->next->edge, n->edge->next->edge); if (*current + 1 <= TREELIMIT){ mfl_bswap(n->next->next->edge, n->edge->next->edge); mfl_root_tree(swapingon, 1, ntax); trlength = mfl_get_treelen(swapingon, ntax, nchar, currentbesttree); mfl_unroot(ntax, swapingon); if (trlength < *currentbesttree) { *foundbettertree = true; *currentbesttree = trlength; swapingon->length = trlength; mfl_reinit_treebuffer(savedtrees, swapingon, current, numnodes); trlength = 0; *current = *current + 1; return; } if (trlength == *currentbesttree) { *foundbettertree = false; savedtrees[*current] = mfl_copytree(swapingon, ntax, numnodes); savedtrees[*current]->index = *current; savedtrees[*current]->length = trlength; trlength = 0; *current = *current + 1; } mfl_bswap(n->next->next->edge, n->edge->next->edge); } } else { dbg_printf("Hit tree limit\n"); *undertreelimit = false; return; } } p = n->next; while (p != n) { mfl_nni_traversal(p->edge, swapingon, savedtrees, ntax, nchar, numnodes, current, tipdata, undertreelimit, currentbesttree, foundbettertree); p = p->next; } }