pub type MetaMLScorer = Box<fn(crate::core::cluster::Ratios) -> f64>;
use crate::core::graph::_graph::{ClusterSet, EdgeSet};
use crate::{Cluster, Dataset, Edge, Instance};
use distances::Number;
use std::collections::HashSet;
pub fn select_clusters<'a, U: Number>(
root: &'a Cluster<U>,
_scorer_function: &MetaMLScorer,
depth: usize,
) -> ClusterSet<'a, U> {
let mut selected_clusters = ClusterSet::new();
for c in root.subtree() {
if c.depth() == depth || (c.depth() < depth && c.is_leaf()) {
selected_clusters.insert(c);
}
}
selected_clusters
}
#[allow(clippy::implicit_hasher)]
pub fn detect_edges<'a, I: Instance, U: Number, D: Dataset<I, U>>(
clusters: &ClusterSet<'a, U>,
data: &D,
) -> EdgeSet<'a, U> {
let mut edges = HashSet::new();
for (i, c1) in clusters.iter().enumerate() {
for (j, c2) in clusters.iter().enumerate().skip(i + 1) {
if i != j {
let distance = c1.distance_to_other(data, c2);
if distance <= c1.radius() + c2.radius() {
edges.insert(Edge::new(c1, c2, distance));
}
}
}
}
edges
}