docs: public static void addColAppend(double alpha, DMatrixSparseCSC A, int colA, double beta, DMatrixSparseCSC B, int colB,
                                      DMatrixSparseCSC C, @Nullable IGrowArray gw)
      {
          if( A.numRows != B.numRows || A.numRows != C.numRows)
              throw new IllegalArgumentException("Number of rows in A, B, and C do not match");
  
          int idxA0 = A.col_idx[colA];
          int idxA1 = A.col_idx[colA+1];
          int idxB0 = B.col_idx[colB];
          int idxB1 = B.col_idx[colB+1];
  
          C.growMaxColumns(++C.numCols,true);
          C.growMaxLength(C.nz_length+idxA1-idxA0+idxB1-idxB0,true);
  
          int []w = adjust(gw,A.numRows);
          Arrays.fill(w,0,A.numRows,-1);
  
          for (int i = idxA0; i < idxA1; i++) {
              int row = A.nz_rows[i];
              C.nz_rows[C.nz_length] = row;
              C.nz_values[C.nz_length] = alpha*A.nz_values[i];
              w[row] = C.nz_length++;
          }
  
          for (int i = idxB0; i < idxB1; i++) {
              int row = B.nz_rows[i];
              if( w[row] != -1 ) {
                  C.nz_values[w[row]] += beta*B.nz_values[i];
              } else {
                  C.nz_values[C.nz_length] = beta*B.nz_values[i];
                  C.nz_rows[C.nz_length++] = row;
              }
          }
          C.col_idx[C.numCols] = C.nz_length;
      }