docs: public void process(DMatrixSparseCSC A , int parent[], int post[], int counts[] ) {
          if( counts.length < A.numCols )
              throw new IllegalArgumentException("counts must be at least of length A.numCols");
  
          initialize(A);
  
          int delta[] = counts;
          findFirstDescendant(parent, post, delta);
  
          if( ata ) {
              init_ata(post);
          }
          for (int i = 0; i < n; i++)
              w[ancestor+i] = i;
  
          int[] ATp = At.col_idx; int []ATi = At.nz_rows;
  
          for (int k = 0; k < n; k++) {
              int j = post[k];
              if( parent[j] != -1 )
                  delta[parent[j]]--; // j is not a root
              for (int J = HEAD(k,j); J != -1; J = NEXT(J)) {
                  for (int p = ATp[J]; p < ATp[J+1]; p++) {
                      int i = ATi[p];
                      int q = isLeaf(i,j);
                      if( jleaf >= 1)
                          delta[j]++;
                      if( jleaf == 2 )
                          delta[q]--;
                  }
              }
              if( parent[j] != -1 )
                  w[ancestor+j] = parent[j];
          }
  
          // sum up delta's of each child
          for ( int j = 0; j < n; j++) {
              if( parent[j] != -1)
                  counts[parent[j]] += counts[j];
          }
      }