SCM

SCM Repository

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

Diff of /pkg/src/sscCrosstab.c

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

revision 86, Thu Apr 15 21:40:17 2004 UTC revision 93, Fri Apr 16 21:19:40 2004 UTC
# Line 125  Line 125 
125    * @param n number of columns in the matrix    * @param n number of columns in the matrix
126    * @param Ap column pointers in Ai (modified)    * @param Ap column pointers in Ai (modified)
127    * @param Ai row indices (modified)    * @param Ai row indices (modified)
128    * @param perm on return contains the permutation of the rows    * @param rperm on return contains the permutation of the rows
129      * @param cperm if non-null, on return contains the permutation of the columns
130    * @param useL when more than one row matches maxrc, use last match    * @param useL when more than one row matches maxrc, use last match
131    */    */
132  static  static
133  void pair_perm(int m, int n, int Ap[], int Ai[], int iperm[], int useL)  void pair_perm(int m, int n, int Ap[], int Ai[], int rperm[], int cperm[],
134                   int useL)
135  {  {
136      int *cc = Calloc(n, int),   /* column counts */      int *cc = Calloc(n, int),   /* column counts */
137          ii, j,          *cm = Calloc(n, int),   /* column removed */
138            *sm = Calloc(m, int),   /* sum of column removals for this row */
139            ii, j, pc,
140          *rc = Calloc(m, int);   /* row counts */          *rc = Calloc(m, int);   /* row counts */
141    
142      for (j = 0; j < n; j++) {   /* initialize col counts */      for (j = 0; j < n; j++) {   /* initialize col counts */
143          cc[j] = Ap[j+1] - Ap[j];          cc[j] = Ap[j+1] - Ap[j];
144            cm[j] = 0;
145      }      }
146      for (ii = m - 1; 0 <= ii; ii--) { /* fill iperm from RHS */      pc = 0;
147        for (ii = m - 1; 0 <= ii; ii--) { /* fill rperm from RHS */
148          int maxrc, rr;          int maxrc, rr;
149          int i, mincc, p1, p3;          int i, mincc, p1, p3;
150    
# Line 148  Line 154 
154              if (mincc < 2) break;              if (mincc < 2) break;
155          }          }
156    
157          for (i = 0; i < m; i++) rc[i] = 0;          for (i = 0; i < m; i++) {sm[i] = rc[i] = 0;}
158          for (j = 0; j < n; j++) { /* row counts for cols where cc = mincc */          for (j = 0; j < n; j++) { /* row counts for cols where cc = mincc */
159              if (cc[j] == mincc) {              if (cc[j] == mincc) {
160                  int p2 = Ap[j+1];                  int p2 = Ap[j+1];
161                  for (i = Ap[j]; i < p2; i++) rc[Ai[i]]++;                  for (i = Ap[j]; i < p2; i++) {
162                        rc[Ai[i]]++;
163                        sm[Ai[i]] += cm[j];
164              }              }
165          }          }
166            }
167          maxrc = -1;             /* find last row with rc[i] == max(rc) */          maxrc = -1;             /* find rows with rc[i] == max(rc) */
168          for (i = 0; i < m; i++) {          for (i = 0; i < m; i++) {
169              int ic = rc[i];              int ic = rc[i];
170              if (ic > maxrc || (useL && ic == maxrc)) {                                  /* Choose first on row count.  Ties go
171                                     * to smaller sum of moved.  Ties
172                                     * there go to the last one. */
173                if (ic > maxrc || (ic == maxrc && sm[i] >= sm[rr])) {
174                  maxrc = ic;                  maxrc = ic;
175                  rr = i;                  rr = i;
176              }              }
177          }          }
178    
179          iperm[rr] = ii;          rperm[rr] = ii;
180    
181          p1 = p3 = 0;            /* update cc, Ap and Ai */          p1 = p3 = 0;            /* update cc, Ap and Ai */
182          for (j = 0; j < n; j++) {          for (j = 0; j < n; j++) {
183              int p2 = Ap[j+1];              int p2 = Ap[j+1];
184              for (i = Ap[j]; i < p2; i++) {              for (i = Ap[j]; i < p2; i++) {
185                  if (Ai[i] == rr) {                  if (Ai[i] == rr) {
186                      cc[j]--;                      cc[j]--; cm[j]++; /* move from count to removed */
187                        if (cperm && cc[j] < 1) cperm[j] = pc++;
188                  } else {                  } else {
189                      if (i != p1) Ai[p1] = Ai[i];                      if (i != p1) Ai[p1] = Ai[i];
190                      p1++;                      p1++;
# Line 183  Line 195 
195          }          }
196          Ap[n] = p3;          Ap[n] = p3;
197      }      }
198      Free(cc); Free(rc);      Free(cc); Free(cm); Free(rc);
199  }  }
200    
201  SEXP sscCrosstab_groupedPerm(SEXP ctab, SEXP useLast)  SEXP sscCrosstab_groupedPerm(SEXP ctab, SEXP useLast)
# Line 224  Line 236 
236              }              }
237              np[j + 1 - p1] = p0;              np[j + 1 - p1] = p0;
238          }          }
239          pair_perm(p3 - p2, p2 - p1, np, ni, INTEGER(ans) + p2, useL);          pair_perm(p3 - p2, p2 - p1, np, ni,
240                      INTEGER(ans) + p2, INTEGER(ans), useL);
241          for (j = p2; j < p3; j++) INTEGER(ans)[j] += p2;          for (j = p2; j < p3; j++) INTEGER(ans)[j] += p2;
242      }      }
243    

Legend:
Removed from v.86  
changed lines
  Added in v.93

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