]> git.donarmstrong.com Git - ape.git/blobdiff - src/reorder_phylo.c
provisional version of the new reorder.phylo()
[ape.git] / src / reorder_phylo.c
index c9c0fabe9a6f37cc01810792ec6db6ec4b9ecc01..7a2f80eb0070d1f0739035d43199bfa6d5587852 100644 (file)
@@ -1,4 +1,4 @@
-/* reorder_phylo.c       2012-08-17 */
+/* reorder_phylo.c       2012-09-03 */
 
 /* Copyright 2008-2012 Emmanuel Paradis */
 
@@ -23,7 +23,21 @@ void foo_reorder(int node, int n, int m, int *e1, int *e2, int *neworder, int *L
        }
 }
 
-void neworder_cladewise(int *n, int *e1, int *e2, int *N, int *neworder)
+void bar_reorder(int node, int n, int m, int *e1, int *e2, int *neworder, int *L, int *pos)
+{
+       int i = node - n - 1, j, k;
+
+       for (j = pos[i] - 1; j >= 0; j--)
+               neworder[iii--] = L[i + m * j] + 1;
+
+       for (j = 0; j < pos[i]; j++) {
+               k = e2[L[i + m * j]];
+               if (k > n)
+                       bar_reorder(k, n, m, e1, e2, neworder, L, pos);
+       }
+}
+
+void neworder_phylo(int *n, int *e1, int *e2, int *N, int *neworder, int *order)
 /* n: nb of tips
    m: nb of nodes
    N: nb of edges */
@@ -58,11 +72,16 @@ void neworder_cladewise(int *n, int *e1, int *e2, int *N, int *neworder)
 /* We start with the root 'n + 1': its index will be changed into
    the corresponding C index inside the recursive function. */
 
-       iii = 0;
-       foo_reorder(*n + 1, *n, m, e1, e2, neworder, L, pos);
+       switch(*order) {
+       case 1 : iii = 0;
+               foo_reorder(*n + 1, *n, m, e1, e2, neworder, L, pos);
+               break;
+       case 2 : iii = *N - 1;
+               bar_reorder(*n + 1, *n, m, e1, e2, neworder, L, pos);
+               break;
+       }
 }
 
-
 #define DO_NODE_PRUNING\
     /* go back down in `edge' to set `neworder' */\
     for (j = 0; j <= i; j++) {\
@@ -130,3 +149,4 @@ void neworder_pruningwise(int *ntip, int *nnode, int *edge1,
        nextI++;
     }
 }
+