1 /*  perms.c  */
2 
3 #include "../Tree.h"
4 
5 /*--------------------------------------------------------------------*/
6 /*
7    --------------------------------------
8    fill the new-to-old permutation vector
9 
10    created -- 95nov15, cca
11    --------------------------------------
12 */
13 void
Tree_fillNewToOldPerm(Tree * tree,int newToOld[])14 Tree_fillNewToOldPerm (
15    Tree   *tree,
16    int    newToOld[]
17 ) {
18 int   i, v ;
19 /*
20    ---------------
21    check the input
22    ---------------
23 */
24 if ( tree == NULL || tree->n < 1 || newToOld == NULL ) {
25    fprintf(stderr, "\n fatal error in Tree_fillNewToOldPerm(%p,%p)"
26            "\n bad input\n", tree, newToOld) ;
27    exit(-1) ;
28 }
29 /*
30    -----------------------------------------------
31    post-order traversal to fill permutation vector
32    -----------------------------------------------
33 */
34 for ( v = Tree_postOTfirst(tree), i = 0 ;
35       v != -1 ;
36       v = Tree_postOTnext(tree, v) ) {
37    newToOld[i++] = v ;
38 }
39 return ; }
40 
41 /*--------------------------------------------------------------------*/
42 /*
43    --------------------------------------
44    fill the old-to-new permutation vector
45 
46    created -- 95nov15, cca
47    --------------------------------------
48 */
49 void
Tree_fillOldToNewPerm(Tree * tree,int oldToNew[])50 Tree_fillOldToNewPerm (
51    Tree   *tree,
52    int    oldToNew[]
53 ) {
54 int   i, v ;
55 /*
56    ---------------
57    check the input
58    ---------------
59 */
60 if ( tree == NULL || tree->n < 1 || oldToNew == NULL ) {
61    fprintf(stderr, "\n fatal error in Tree_fillOldToNewPerm(%p,%p)"
62            "\n bad input\n", tree, oldToNew) ;
63    exit(-1) ;
64 }
65 /*
66    -----------------------------------------------
67    post-order traversal to fill permutation vector
68    -----------------------------------------------
69 */
70 for ( v = Tree_postOTfirst(tree), i = 0 ;
71       v != -1 ;
72       v = Tree_postOTnext(tree, v) ) {
73    oldToNew[v] = i++ ;
74 }
75 return ; }
76 
77 /*--------------------------------------------------------------------*/
78 /*
79    ------------------------------------------------------
80    fill the new-to-old and old-to-new permutation vectors
81 
82    created -- 95nov15, cca
83    ------------------------------------------------------
84 */
85 void
Tree_fillBothPerms(Tree * tree,int newToOld[],int oldToNew[])86 Tree_fillBothPerms (
87    Tree   *tree,
88    int    newToOld[],
89    int    oldToNew[]
90 ) {
91 int   i, v ;
92 /*
93    ---------------
94    check the input
95    ---------------
96 */
97 if (  tree == NULL || tree->n < 1
98    || newToOld == NULL || oldToNew == NULL ) {
99    fprintf(stderr, "\n fatal error in Tree_fillBothPerms(%p,%p,%p)"
100            "\n bad input\n", tree, newToOld, oldToNew) ;
101    exit(-1) ;
102 }
103 /*
104    ------------------------------------------------
105    post-order traversal to fill permutation vectors
106    ------------------------------------------------
107 */
108 for ( v = Tree_postOTfirst(tree), i = 0 ;
109       v != -1 ;
110       v = Tree_postOTnext(tree, v) ) {
111    newToOld[i] =  v  ;
112    oldToNew[v] = i++ ;
113 }
114 return ; }
115 
116 /*--------------------------------------------------------------------*/
117