SCM

SCM Repository

[matrix] Annotation of /pkg/src/Metis_utils.c
ViewVC logotype

Annotation of /pkg/src/Metis_utils.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 146 - (view) (download) (as text)

1 : bates 10 #include "Metis_utils.h"
2 :    
3 : bates 70 void ssc_metis_order(int n, const int Tp [], const int Ti [],
4 : bates 10 idxtype* perm, idxtype* iperm)
5 :     {
6 : bates 70 int j, num_flag = 0, options_flag = 0;
7 : bates 146 idxtype
8 :     *xadj = Calloc(n+1, idxtype),
9 :     *adj = Calloc(2 * (Tp[n] - n), idxtype);
10 : bates 10
11 :     /* temporarily use perm to store lengths */
12 : bates 70 memset(perm, 0, sizeof(idxtype) * n);
13 : bates 10 for (j = 0; j < n; j++) {
14 : bates 70 int ip, p2 = Tp[j+1];
15 :     for (ip = Tp[j]; ip < p2; ip++) {
16 :     int i = Ti[ip];
17 : bates 10 if (i != j) {
18 :     perm[i]++;
19 :     perm[j]++;
20 :     }
21 :     }
22 :     }
23 :     xadj[0] = 0;
24 :     for (j = 0; j < n; j++) xadj[j+1] = xadj[j] + perm[j];
25 :     /* temporarily use perm to store pointers */
26 : bates 70 Memcpy(perm, xadj, n);
27 : bates 10 for (j = 0; j < n; j++) {
28 : bates 70 int ip, p2 = Tp[j+1];
29 :     for (ip = Tp[j]; ip < p2; ip++) {
30 :     int i = Ti[ip];
31 : bates 10 if (i != j) {
32 :     adj[perm[i]] = j;
33 :     adj[perm[j]] = i;
34 :     perm[i]++;
35 :     perm[j]++;
36 :     }
37 :     }
38 :     }
39 :     METIS_NodeND(&n, xadj, adj, &num_flag, &options_flag, perm, iperm);
40 : bates 146 Free(xadj); Free(adj);
41 : bates 10 }
42 : bates 146
43 :     void col_metis_order(int j0, int j1, int i2, const int Tp[], const int Ti[],
44 :     int ans[])
45 :     {
46 :     int j, nz = 0; /* count off-diagonal pairs */
47 :     for (j = j0; j < j1; j++) { /* columns of interest */
48 :     int ii, nr = 0, p2 = Tp[j + 1];
49 :     for (ii = Tp[j]; ii < p2; ii++) {
50 :     int i = Ti[ii];
51 :     if (j1 <= i && i < i2) nr++; /* verify row index */
52 :     }
53 :     nz += (nr * (nr - 1))/2; /* add number of pairs of rows */
54 :     }
55 :     if (nz > 0) { /* Form an ssc Matrix */
56 :     int j, n = i2 - j1, /* number of rows */
57 :     nnz = n + nz, pos;
58 :     int *Ap = Calloc(n + 1, int),
59 :     *Ai = Calloc(nnz, int),
60 :     *Tj = Calloc(nnz, int),
61 :     *TTi = Calloc(nnz, int);
62 :     double /* needed for triplet_to_col */
63 :     *Ax = Calloc(nnz, double), /* FIXME: change triplet_to_col */
64 :     *Tx = Calloc(nnz, double); /* to check for null pointers */
65 :     idxtype *perm = Calloc(n, idxtype),
66 :     *iperm = Calloc(n, idxtype);
67 :    
68 :     for (j = 0; j < n; j++) { /* diagonals */
69 :     TTi[j] = Tj[j] = j;
70 :     Tx[j] = 1.;
71 :     }
72 :     pos = n;
73 :     for (j = j0; j < j1; j++) { /* create the pairs */
74 :     int ii, nr = 0, p2 = Tp[j + 1];
75 :     for (ii = Tp[j]; ii < p2; ii++) {
76 :     int r1 = Ti[ii], i1;
77 :     if (j1 <= r1 && r1 < i2) {
78 :     for (i1 = ii + 1; i1 < p2; i1++) {
79 :     int r2 = Ti[i1];
80 :     if (r2 < i2) {
81 :     TTi[pos] = r2 - j1;
82 :     Tj[pos] = r1 - j1;
83 :     Tx[pos] = 1.;
84 :     pos++;
85 :     }
86 :     }
87 :     }
88 :     }
89 :     }
90 :     triplet_to_col(n, n, nnz, TTi, Tj, Tx, Ap, Ai, Ax);
91 :     ssc_metis_order(n, Ap, Ai, perm, iperm);
92 :     for (j = j1; j < i2; j++) ans[j] = j1 + iperm[j - j1];
93 :     Free(Tx); Free(Ax); Free(TTi); Free(Tj); Free(Ai); Free(Ap);
94 :     Free(perm); Free(iperm);
95 :     }
96 :     }

root@r-forge.r-project.org
ViewVC Help
Powered by ViewVC 1.0.0  
Thanks to:
Vienna University of Economics and Business Powered By FusionForge