docs: public void process(Clustering<?> result1, Clustering<?> result2) {
      // Get the clusters
      final List<? extends Cluster<?>> cs1 = result1.getAllClusters();
      final List<? extends Cluster<?>> cs2 = result2.getAllClusters();
  
      // Initialize
      size1 = cs1.size();
      size2 = cs2.size();
      contingency = new int[size1 + 2][size2 + 2];
      noise1 = BitsUtil.zero(size1);
      noise2 = BitsUtil.zero(size2);
  
      // Fill main part of matrix
      {
        final Iterator<? extends Cluster<?>> it2 = cs2.iterator();
        for(int i2 = 0; it2.hasNext(); i2++) {
          final Cluster<?> c2 = it2.next();
          if(c2.isNoise()) {
            BitsUtil.setI(noise2, i2);
          }
          contingency[size1 + 1][i2] = c2.size();
          contingency[size1 + 1][size2] += c2.size();
        }
      }
      final Iterator<? extends Cluster<?>> it1 = cs1.iterator();
      for(int i1 = 0; it1.hasNext(); i1++) {
        final Cluster<?> c1 = it1.next();
        if(c1.isNoise()) {
          BitsUtil.setI(noise1, i1);
        }
        final DBIDs ids = DBIDUtil.ensureSet(c1.getIDs());
        contingency[i1][size2 + 1] = c1.size();
        contingency[size1][size2 + 1] += c1.size();
  
        final Iterator<? extends Cluster<?>> it2 = cs2.iterator();
        for(int i2 = 0; it2.hasNext(); i2++) {
          final Cluster<?> c2 = it2.next();
          int count = DBIDUtil.intersectionSize(ids, c2.getIDs());
          contingency[i1][i2] = count;
          contingency[i1][size2] += count;
          contingency[size1][i2] += count;
          contingency[size1][size2] += count;
        }
      }
    }