1l = 0; 2while (cladesInfo[l][1]) 3{ 4 l = l+1; 5} 6 7if (verbFlag) 8{ 9 fprintf (stdout, "\n\n\tPerforming subtree pruning and regrafting on the best tree so far.\n\n"); 10} 11nniDidBetter = 0; 12for (l2 = 0; l2 < l; l2=l2+1) 13{ 14 dummy = splitCladesOnIBranch (filteredData.species,filteredData.species+l2); 15 l3s = 0; 16 l3f = 2; 17 if ((splitTreeInfo[0][1]==1)&&(splitTreeInfo[0][3]==1)) 18 { 19 l3s = 2; 20 l3f = 4; 21 } 22 23 for (l3=l3s; l3<l3f; l3=l3+1) 24 { 25 l4 = 0; 26 while (splitTreeInfo[l4+1][2*l3+1]) 27 { 28 /* check for degeneracies 29 if ((l3==1)&&(splitTreeInfo[0][1]==1)&&(splitTreeInfo[0][3]==1)) 30 { 31 break; 32 }*/ 33 if (l3<2) 34 { 35 dummy = doSPRSwap (2,3,l3,l4,filteredData.species); 36 } 37 else 38 { 39 dummy = doSPRSwap (0,1,l3,l4,filteredData.species); 40 } 41 42 thisTree = TreeMatrix2TreeString (2,0); 43 if (verbFlag) 44 { 45 fprintf (stdout, "\n\tSPR tree ",thisTree); 46 } 47 Tree Inferred_Tree = thisTree; 48 if (haveTreeConstraint) 49 { 50 if ((Inferred_Tree<=_topologyPattern) == 0) 51 { 52 if (verbFlag) 53 { 54 fprintf (stdout, " => Rejected by the topology constraint."); 55 } 56 l4 = l4+1; 57 continue; 58 } 59 else 60 { 61 if (verbFlag) 62 { 63 fprintf (stdout, " => Accepted by the topology constraint."); 64 } 65 } 66 } 67 if (starDecomposition) 68 { 69 LikelihoodFunction lf = (filteredData, Inferred_Tree); 70 } 71 else 72 { 73 LikelihoodFunction lf = (smallerFilter, Inferred_Tree); 74 } 75 Optimize (res,lf); 76 if (verbFlag) 77 { 78 fprintf (stdout, " => ", res[1][0]); 79 } 80 if (res[1][0]>bestValue) 81 { 82 nniDidBetter = 1; 83 bestValue = res[1][0]; 84 bestTree = thisTree; 85 for (l4=2*taxonCounter-2;l4>=0;l4=l4-1) 86 { 87 bestTreeNodes[l4][0]= treeNodes[l4][2]; 88 bestTreeNodes[l4][1]= treeNodes[l4][3]; 89 treeNodes[l4][0] = treeNodes[l4][2]; 90 treeNodes[l4][1] = treeNodes[l4][3]; 91 } 92 for (l4=0; l4<taxonCounter-2; l4=l4+1) 93 { 94 bestCladesInfo[l4][0]= cladesInfo[l4][2]; 95 bestCladesInfo[l4][1]= cladesInfo[l4][3]; 96 cladesInfo[l4][0] = cladesInfo[l4][2]; 97 cladesInfo[l4][1] = cladesInfo[l4][3]; 98 } 99 if (verbFlag) 100 { 101 OpenWindow (TREEWINDOW, {{"Inferred_Tree"}}); 102 fprintf (stdout, "\n\tRestarting SPR on the better tree."); 103 } 104 l = 0; 105 while (cladesInfo[l][1]) 106 { 107 l = l+1; 108 } 109 l2 = -1; 110 l3 = l3f; 111 break; 112 } 113 l4 = l4+1; 114 } 115 } 116} 117if (nniDidBetter) 118{ 119 for (l=Rows(bestTreeNodes)-1;l>=0;l=l-1) 120 { 121 treeNodes[l][0]=bestTreeNodes[l][0]; 122 treeNodes[l][1]=bestTreeNodes[l][1]; 123 } 124 for (l=0; l<Rows(bestCladesInfo); l=l+1) 125 { 126 cladesInfo[l][0]=bestCladesInfo[l][0]; 127 cladesInfo[l][1]=bestCladesInfo[l][1]; 128 } 129 if (verbFlag) 130 { 131 fprintf (stdout,"\n\n\t Improved SPR ", Format(taxonCounter,0,0)," taxa tree is ", bestTree, " with log likelihood of ", bestValue); 132 } 133} 134