X-Git-Url: https://git.donarmstrong.com/?p=ape.git;a=blobdiff_plain;f=src%2Freorder_phylo.c;h=7a2f80eb0070d1f0739035d43199bfa6d5587852;hp=c9c0fabe9a6f37cc01810792ec6db6ec4b9ecc01;hb=fb6a06e39b9c580b39c76fd95e950144e818f45d;hpb=2653eb671caf9234635e44b895ef48b377a89a78 diff --git a/src/reorder_phylo.c b/src/reorder_phylo.c index c9c0fab..7a2f80e 100644 --- a/src/reorder_phylo.c +++ b/src/reorder_phylo.c @@ -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++; } } +