if(dbscan == null) {
// TODO: appropriate exception class?
throw new IllegalArgumentException("ERiC was run without DBSCAN as COPAC algorithm!");
}
DistanceFunction<? super V, ?> dfun = ProxyDistanceFunction.unwrapDistance(dbscan.getDistanceFunction());
ERiCDistanceFunction distanceFunction = ClassGenericsUtil.castWithGenericsOrNull(ERiCDistanceFunction.class, dfun);
if(distanceFunction == null) {
// TODO: appropriate exception class?
throw new IllegalArgumentException("ERiC was run without ERiCDistanceFunction as distance function: got " + dfun.getClass());
}
Integer lambda_max = clusterMap.lastKey();
for(Integer childCorrDim : clusterMap.keySet()) {
List<Cluster<CorrelationModel<V>>> children = clusterMap.get(childCorrDim);
SortedMap<Integer, List<Cluster<CorrelationModel<V>>>> parentMap = clusterMap.tailMap(childCorrDim + 1);
if(logger.isDebugging()) {
msg.append("\ncorrdim ").append(childCorrDim);
msg.append("\nparents ").append(parentMap.keySet());
}
for(Cluster<CorrelationModel<V>> child : children) {
for(Integer parentCorrDim : parentMap.keySet()) {
List<Cluster<CorrelationModel<V>>> parents = parentMap.get(parentCorrDim);
for(Cluster<CorrelationModel<V>> parent : parents) {
int subspaceDim_parent = parent.getModel().getPCAResult().getCorrelationDimension();
if(subspaceDim_parent == lambda_max && child.getParents().isEmpty()) {
parent.getChildren().add(child);
child.getParents().add(parent);
if(logger.isDebugging()) {
msg.append("\n").append(parent).append(" is parent of ").append(child);
}
}
else {
BitDistance dist = distanceFunction.distance(parent.getModel().getCentroid(), child.getModel().getCentroid(), parent.getModel().getPCAResult(), child.getModel().getPCAResult());
if(!dist.bitValue() && (child.getParents().isEmpty() || !isParent(distanceFunction, parent, child.getParents()))) {
parent.getChildren().add(child);
child.getParents().add(parent);
if(logger.isDebugging()) {
msg.append("\n").append(parent).append(" is parent of ").append(child);