docs: public static void eliminationTree(DMatrixSparseCSC A, boolean ata, int parent[], @Nullable IGrowArray gwork) {
          int m = A.numRows;
          int n = A.numCols;
  
          if (parent.length < n)
              throw new IllegalArgumentException("parent must be of length N");
  
          int[] work = UtilEjml.adjust(gwork, n + (ata ? m : 0));
  
          int ancestor = 0; // reference to index in work array
          int previous = n; // reference to index in work array
  
          if( ata ) {
              for (int i = 0; i < m; i++) {
                  work[previous+i] = -1;
              }
          }
  
          // step through each column
          for (int k = 0; k < n; k++) {
              parent[k] = -1;
              work[ancestor+k] = -1;
  
              int idx0 = A.col_idx[k];   // node k has no parent
              int idx1 = A.col_idx[k+1]; // node k has no ancestor
  
              for (int p = idx0; p < idx1; p++) {
  
                  int nz_row_p = A.nz_rows[p];
  
                  int i = ata ? work[previous+nz_row_p] : nz_row_p;
  
                  int inext;
                  while( i != -1 && i < k ) {
                      inext = work[ancestor+i];
                      work[ancestor+i] = k;
                      if( inext == -1 ) {
                          parent[i] = k;
                          break;
                      } else {
                          i = inext;
                      }
                  }
  
                  if( ata ) {
                      work[previous+nz_row_p] = k;
                  }
              }
          }
      }