SCM

SCM Repository

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

Diff of /pkg/src/Metis_utils.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 70, Mon Apr 12 12:10:01 2004 UTC revision 146, Sat May 1 20:27:04 2004 UTC
# Line 4  Line 4 
4                       idxtype* perm, idxtype* iperm)                       idxtype* perm, idxtype* iperm)
5  {  {
6      int  j, num_flag = 0, options_flag = 0;      int  j, num_flag = 0, options_flag = 0;
7      idxtype *xadj, *adj;      idxtype
8            *xadj = Calloc(n+1, idxtype),
9            *adj = Calloc(2 * (Tp[n] - n), idxtype);
10    
     xadj = (idxtype *) R_alloc(n + 1, sizeof(idxtype));  
     adj = (idxtype *) R_alloc(2 * (Tp[n] - n), sizeof(idxtype));  
11                                  /* temporarily use perm to store lengths */                                  /* temporarily use perm to store lengths */
12      memset(perm, 0, sizeof(idxtype) * n);      memset(perm, 0, sizeof(idxtype) * n);
13      for (j = 0; j < n; j++) {      for (j = 0; j < n; j++) {
# Line 37  Line 37 
37          }          }
38      }      }
39      METIS_NodeND(&n, xadj, adj, &num_flag, &options_flag, perm, iperm);      METIS_NodeND(&n, xadj, adj, &num_flag, &options_flag, perm, iperm);
40        Free(xadj); Free(adj);
41    }
42    
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  }  }

Legend:
Removed from v.70  
changed lines
  Added in v.146

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