docs: public DataStore<? extends DBIDs> getNeighs() {
      final DBIDs ids = points.getDBIDs();
      // init lists
      WritableDataStore<ModifiableDBIDs> neighs = DataStoreUtil.makeStorage(ids, DataStoreFactory.HINT_HOT, ModifiableDBIDs.class);
      for(DBIDIter it = ids.iter(); it.valid(); it.advance()) {
        neighs.put(it, DBIDUtil.newHashSet());
      }
  
      FiniteProgress splitp = LOG.isVerbose() ? new FiniteProgress("Processing splits for neighborhoods", splitsets.size(), LOG) : null;
      // go through all sets
      Iterator<ArrayDBIDs> it1 = splitsets.iterator();
      DBIDVar v = DBIDUtil.newVar();
      while(it1.hasNext()) {
        ArrayDBIDs pinSet = it1.next();
  
        final int indoff = pinSet.size() >> 1; // middle point of projection
        pinSet.assignVar(indoff, v);
        // add all points as neighbors to middle point
        neighs.get(v).addDBIDs(pinSet);
  
        // and the the middle point to all other points in set
        for(DBIDIter it = pinSet.iter(); it.valid(); it.advance()) {
          neighs.get(it).add(v);
        }
        LOG.incrementProcessed(splitp);
      }
      LOG.ensureCompleted(splitp);
      return neighs;
    }