docs: public static void solveTran(DMatrixSparseCSC G, boolean lower,
                                   DMatrixSparseCSC B, DMatrixSparseCSC X,
                                   @Nullable int pinv[] ,
                                   @Nullable DGrowArray g_x, @Nullable IGrowArray g_xi, @Nullable IGrowArray g_w)
      {
          double[] x = UtilEjml.adjust(g_x,G.numRows);
  
          X.zero();
          X.indicesSorted = false;
  
          // storage for the index of non-zero rows in X
          int[] xi = UtilEjml.adjust(g_xi,G.numRows);
          // Used to mark nodes as non-zero or not. Fill with zero initially
          int[] w = UtilEjml.adjust(g_w,G.numCols, G.numCols); // Dense fill makes adds O(N) to runtime
  
          for (int colB = 0; colB < B.numCols; colB++) {
              int idx0 = B.col_idx[colB];
              int idx1 = B.col_idx[colB+1];
  
              // Sparse copy into X and mark elements are non-zero
              int X_nz_count = 0;
              for (int i = idx0; i < idx1; i++) {
                  int row = B.nz_rows[i];
                  x[row] = B.nz_values[i];
                  w[row] = 1;
                  xi[X_nz_count++] = row;
              }
  
              if( lower ) {
                  for (int col = G.numRows - 1; col >= 0; col--) {
                      X_nz_count = solveTranColumn(G, x, xi, w, pinv, X_nz_count, col);
                  }
              } else {
                  for (int col = 0; col < G.numRows; col++) {
                      X_nz_count = solveTranColumn(G, x, xi, w, pinv, X_nz_count, col);
                  }
              }
  
              // set everything back to zero for the next column
              if( colB+1 < B.numCols ) {
                  for (int i = 0; i < X_nz_count; i++) {
                      w[xi[i]] = 0;
                  }
              }
  
              // Copy results into X
              if( X.nz_values.length < X.nz_length + X_nz_count) {
                  X.growMaxLength(X.nz_length*2 + X_nz_count,true);
              }
              for (int p = 0; p < X_nz_count; p++,X.nz_length++) {
                  X.nz_rows[X.nz_length] = xi[p];
                  X.nz_values[X.nz_length] = x[xi[p]];
              }
              X.col_idx[colB+1] = X.nz_length;
          }
      }