docs: public static double dotInnerColumns( DMatrixSparseCSC A , int colA , DMatrixSparseCSC B , int colB ,
                                            IGrowArray gw , DGrowArray gx)
      {
          if( A.numRows != B.numRows )
              throw new IllegalArgumentException("Number of rows must match.");
  
          int w[] = adjust(gw,A.numRows);
          Arrays.fill(w,0,A.numRows,-1);
          double x[] = adjust(gx,A.numRows);
  
          int length = 0;
  
          int idx0 = A.col_idx[colA];
          int idx1 = A.col_idx[colA+1];
          for (int i = idx0; i < idx1; i++) {
              int row = A.nz_rows[i];
              x[length] = A.nz_values[i];
              w[row] = length++;
          }
  
          double dot = 0;
  
          idx0 = B.col_idx[colB];
          idx1 = B.col_idx[colB+1];
          for (int i = idx0; i < idx1; i++) {
              int row = B.nz_rows[i];
              if( w[row] != -1 ) {
                  dot += x[w[row]]*B.nz_values[i];
              }
          }
  
          return dot;
      }