annotate main/sparse/SuperLU/SRC/sp_coletree.c @ 0:6b33357c7561 octave-forge

Initial revision
author pkienzle
date Wed, 10 Oct 2001 19:54:49 +0000
parents
children c09b8fd6ce44
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
1
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
2 /* Elimination tree computation and layout routines */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
3
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
4 #include <stdio.h>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
5 #include <malloc.h>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
6 #include <stdlib.h>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
7 #include "util.h"
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
8
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
9 /*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
10 * Implementation of disjoint set union routines.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
11 * Elements are integers in 0..n-1, and the
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
12 * names of the sets themselves are of type int.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
13 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
14 * Calls are:
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
15 * initialize_disjoint_sets (n) initial call.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
16 * s = make_set (i) returns a set containing only i.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
17 * s = link (t, u) returns s = t union u, destroying t and u.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
18 * s = find (i) return name of set containing i.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
19 * finalize_disjoint_sets final call.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
20 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
21 * This implementation uses path compression but not weighted union.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
22 * See Tarjan's book for details.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
23 * John Gilbert, CMI, 1987.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
24 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
25 * Implemented path-halving by XL 7/5/95.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
26 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
27
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
28 static int *pp; /* parent array for sets */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
29
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
30 static
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
31 int *mxCallocInt(int n)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
32 {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
33 register int i;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
34 int *buf;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
35
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
36 buf = (int *) SUPERLU_MALLOC( n * sizeof(int) );
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
37 if ( !buf ) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
38 ABORT("SUPERLU_MALLOC fails for buf in mxCallocInt()");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
39 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
40 for (i = 0; i < n; i++) buf[i] = 0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
41 return (buf);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
42 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
43
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
44 static
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
45 void initialize_disjoint_sets (
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
46 int n
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
47 )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
48 {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
49 pp = mxCallocInt(n);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
50 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
51
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
52
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
53 static
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
54 int make_set (
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
55 int i
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
56 )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
57 {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
58 pp[i] = i;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
59 return i;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
60 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
61
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
62
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
63 static
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
64 int link (
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
65 int s,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
66 int t
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
67 )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
68 {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
69 pp[s] = t;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
70 return t;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
71 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
72
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
73
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
74 /* PATH HALVING */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
75 static
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
76 int find (int i)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
77 {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
78 register int p, gp;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
79
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
80 p = pp[i];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
81 gp = pp[p];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
82 while (gp != p) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
83 pp[i] = gp;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
84 i = gp;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
85 p = pp[i];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
86 gp = pp[p];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
87 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
88 return (p);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
89 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
90
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
91 #if 0
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
92 /* PATH COMPRESSION */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
93 static
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
94 int find (
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
95 int i
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
96 )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
97 {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
98 if (pp[i] != i)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
99 pp[i] = find (pp[i]);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
100 return pp[i];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
101 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
102 #endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
103
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
104 static
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
105 void finalize_disjoint_sets (
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
106 void
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
107 )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
108 {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
109 SUPERLU_FREE(pp);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
110 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
111
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
112
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
113 /*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
114 * Find the elimination tree for A'*A.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
115 * This uses something similar to Liu's algorithm.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
116 * It runs in time O(nz(A)*log n) and does not form A'*A.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
117 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
118 * Input:
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
119 * Sparse matrix A. Numeric values are ignored, so any
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
120 * explicit zeros are treated as nonzero.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
121 * Output:
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
122 * Integer array of parents representing the elimination
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
123 * tree of the symbolic product A'*A. Each vertex is a
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
124 * column of A, and nc means a root of the elimination forest.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
125 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
126 * John R. Gilbert, Xerox, 10 Dec 1990
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
127 * Based on code by JRG dated 1987, 1988, and 1990.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
128 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
129
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
130 /*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
131 * Nonsymmetric elimination tree
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
132 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
133 int
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
134 sp_coletree(
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
135 int *acolst, int *acolend, /* column start and end past 1 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
136 int *arow, /* row indices of A */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
137 int nr, int nc, /* dimension of A */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
138 int *parent /* parent in elim tree */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
139 )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
140 {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
141 int *root; /* root of subtee of etree */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
142 int *firstcol; /* first nonzero col in each row*/
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
143 int rset, cset;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
144 int row, col;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
145 int rroot;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
146 int p;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
147
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
148 root = mxCallocInt (nc);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
149 initialize_disjoint_sets (nc);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
150
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
151 /* Compute firstcol[row] = first nonzero column in row */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
152
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
153 firstcol = mxCallocInt (nr);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
154 for (row = 0; row < nr; firstcol[row++] = nc);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
155 for (col = 0; col < nc; col++)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
156 for (p = acolst[col]; p < acolend[col]; p++) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
157 row = arow[p];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
158 firstcol[row] = MIN(firstcol[row], col);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
159 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
160
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
161 /* Compute etree by Liu's algorithm for symmetric matrices,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
162 except use (firstcol[r],c) in place of an edge (r,c) of A.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
163 Thus each row clique in A'*A is replaced by a star
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
164 centered at its first vertex, which has the same fill. */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
165
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
166 for (col = 0; col < nc; col++) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
167 cset = make_set (col);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
168 root[cset] = col;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
169 parent[col] = nc; /* Matlab */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
170 for (p = acolst[col]; p < acolend[col]; p++) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
171 row = firstcol[arow[p]];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
172 if (row >= col) continue;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
173 rset = find (row);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
174 rroot = root[rset];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
175 if (rroot != col) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
176 parent[rroot] = col;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
177 cset = link (cset, rset);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
178 root[cset] = col;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
179 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
180 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
181 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
182
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
183 SUPERLU_FREE (root);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
184 SUPERLU_FREE (firstcol);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
185 finalize_disjoint_sets ();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
186 return 0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
187 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
188
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
189 /*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
190 * q = TreePostorder (n, p);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
191 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
192 * Postorder a tree.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
193 * Input:
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
194 * p is a vector of parent pointers for a forest whose
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
195 * vertices are the integers 0 to n-1; p[root]==n.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
196 * Output:
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
197 * q is a vector indexed by 0..n-1 such that q[i] is the
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
198 * i-th vertex in a postorder numbering of the tree.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
199 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
200 * ( 2/7/95 modified by X.Li:
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
201 * q is a vector indexed by 0:n-1 such that vertex i is the
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
202 * q[i]-th vertex in a postorder numbering of the tree.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
203 * That is, this is the inverse of the previous q. )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
204 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
205 * In the child structure, lower-numbered children are represented
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
206 * first, so that a tree which is already numbered in postorder
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
207 * will not have its order changed.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
208 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
209 * Written by John Gilbert, Xerox, 10 Dec 1990.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
210 * Based on code written by John Gilbert at CMI in 1987.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
211 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
212
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
213 static int *first_kid, *next_kid; /* Linked list of children. */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
214 static int *post, postnum;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
215
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
216 static
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
217 /*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
218 * Depth-first search from vertex v.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
219 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
220 void etdfs (
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
221 int v
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
222 )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
223 {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
224 int w;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
225
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
226 for (w = first_kid[v]; w != -1; w = next_kid[w]) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
227 etdfs (w);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
228 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
229 /* post[postnum++] = v; in Matlab */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
230 post[v] = postnum++; /* Modified by X.Li on 2/14/95 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
231 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
232
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
233
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
234 /*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
235 * Post order a tree
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
236 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
237 int *TreePostorder(
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
238 int n,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
239 int *parent
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
240 )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
241 {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
242 int v, dad;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
243
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
244 /* Allocate storage for working arrays and results */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
245 first_kid = mxCallocInt (n+1);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
246 next_kid = mxCallocInt (n+1);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
247 post = mxCallocInt (n+1);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
248
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
249 /* Set up structure describing children */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
250 for (v = 0; v <= n; first_kid[v++] = -1);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
251 for (v = n-1; v >= 0; v--) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
252 dad = parent[v];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
253 next_kid[v] = first_kid[dad];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
254 first_kid[dad] = v;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
255 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
256
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
257 /* Depth-first search from dummy root vertex #n */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
258 postnum = 0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
259 etdfs (n);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
260
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
261 SUPERLU_FREE (first_kid);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
262 SUPERLU_FREE (next_kid);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
263 return post;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
264 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
265