private String getEncodedSettingsIncludingFeatures(Algorithm... algs) { if (algs == null) algs = new Algorithm[0]; if (ArrayUtil.indexOf(algs, clusteringData.getThreeDBuilder()) == -1) for (CompoundProperty p : clusteringData.getFeatures()) if (p.getCompoundPropertySet().isSensitiveTo3D()) { algs = ArrayUtil.concat( Algorithm.class, algs, new Algorithm[] {clusteringData.getThreeDBuilder()}); break; } String skipped = ""; if (clusteringData.isSkippingRedundantFeatures()) skipped += "skippedRedundantFeatures"; return CompoundPropertyUtil.getSetMD5( clusteringData.getFeatures(), skipped + getEncodedSettings(algs)); }