docs: protected void updateMatrix(int size, double[] scratch, DBIDArrayIter ij, double[] bestd, int[] besti, PointerHierarchyRepresentationBuilder builder, double mindist, int x, int y, final int sizex, final int sizey) {
      // Update distance matrix. Note: miny < minx
      final int xbase = MatrixParadigm.triangleSize(x);
      final int ybase = MatrixParadigm.triangleSize(y);
  
      // Write to (y, j), with j < y
      int j = 0;
      for(; j < y; j++) {
        if(builder.isLinked(ij.seek(j))) {
          continue;
        }
        final int sizej = builder.getSize(ij);
        final int yb = ybase + j;
        final double d = scratch[yb] = linkage.combine(sizex, scratch[xbase + j], sizey, scratch[yb], sizej, mindist);
        updateCache(size, scratch, bestd, besti, x, y, j, d);
      }
      j++; // Skip y
      // Write to (j, y), with y < j < x
      int jbase = MatrixParadigm.triangleSize(j);
      for(; j < x; jbase += j++) {
        if(builder.isLinked(ij.seek(j))) {
          continue;
        }
        final int sizej = builder.getSize(ij);
        final int jb = jbase + y;
        final double d = scratch[jb] = linkage.combine(sizex, scratch[xbase + j], sizey, scratch[jb], sizej, mindist);
        updateCache(size, scratch, bestd, besti, x, y, j, d);
      }
      jbase += j++; // Skip x
      // Write to (j, y), with y < x < j
      for(; j < size; jbase += j++) {
        if(builder.isLinked(ij.seek(j))) {
          continue;
        }
        final int sizej = builder.getSize(ij);
        final int jb = jbase + y;
        final double d = scratch[jb] = linkage.combine(sizex, scratch[jbase + x], sizey, scratch[jb], sizej, mindist);
        updateCache(size, scratch, bestd, besti, x, y, j, d);
      }
    }