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