-/* reorder_phylo.c 2012-08-17 */
+/* reorder_phylo.c 2012-09-03 */
/* Copyright 2008-2012 Emmanuel Paradis */
}
}
-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 */
/* 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++) {\
nextI++;
}
}
+