pub mod cluster;
pub mod digraph;
pub mod dnn;
pub mod error;
pub mod params;
pub mod smooth;
pub mod split;
pub mod triplet;
pub mod utils;
#[cfg(test)]
mod tests {
use super::*;
static PRECISION: f64 = 1.0e-4;
#[test]
fn full_clustering() {
let test_point_cloud = match utils::load_test_data() {
Ok(pc) => pc,
Err(err) => {
println!("Failed to load test data with error {err}");
panic!();
}
};
let (
test_dnn,
test_radius,
test_scale,
test_thresh,
_,
test_smooth,
test_labels,
unique_test_labels,
) = match utils::load_test_results() {
Ok(res) => res,
Err(err) => {
println!("Failed to load test results with error {err}");
panic!();
}
};
let int_scale = dnn::dnn_first_quartile(&test_point_cloud.view());
assert!((test_dnn - int_scale).abs() < PRECISION);
let smooth_params = params::SmoothParams::default(int_scale);
assert!((test_radius - smooth_params.neighborhood_radius).abs() < PRECISION);
let triplet_params =
params::TripletParams::new(19, 2, 0.03).expect("Invalid triplet parameters");
let cluster_params = params::ClusterParams::default(int_scale);
assert!((test_scale - cluster_params.scale).abs() < PRECISION);
let cloud_view = test_point_cloud.view();
let smooth_cloud =
smooth::smooth_pointcloud(&cloud_view, &smooth_params).expect("Smoothing failed!");
assert_eq!(smooth_cloud.len(), test_smooth.len());
for ridx in 0..smooth_cloud.nrows() {
for cidx in 0..smooth_cloud.ncols() {
let smooth_val = smooth_cloud[(ridx, cidx)];
let test_val = test_smooth[(ridx, cidx)];
let delta = (smooth_val - test_val).abs();
assert!(delta < PRECISION);
}
}
let triplets = triplet::evaluate_triplets(&smooth_cloud.view(), &triplet_params);
let clusters = cluster::cluster(smooth_cloud.nrows(), &triplets, &cluster_params)
.expect("Clustering failed!");
assert_ne!(clusters.labels.len(), 0);
assert!(clusters.unique_labels.len() > 1);
assert!((clusters.optimal_cdt - test_thresh).abs() < PRECISION);
assert_eq!(clusters.labels.len(), test_labels.len());
assert!(unique_test_labels.len() == clusters.unique_labels.len());
for label in clusters.unique_labels.iter() {
assert!(unique_test_labels.contains(label));
}
for (idx, label) in clusters.labels.iter().enumerate() {
assert!(test_labels[idx].contains(label));
}
}
#[test]
fn postprocessing() {
let pointcloud = match utils::load_o16_event_pointcloud_data() {
Ok(data) => data,
Err(e) => {
println!("Failed to load data: {}", e);
panic!();
}
};
let int_scale = dnn::dnn_first_quartile(&pointcloud.view());
let smooth_params = params::SmoothParams {
neighborhood_radius: 4.1 * int_scale,
};
let triplet_params =
params::TripletParams::new(20, 2, 0.01).expect("Invalid triplet parameters");
let cluster_params =
params::ClusterParams::new(Some(int_scale), 0.3, Some(13.0), 5, "single")
.expect("Invalid cluster parameters!");
let cloud_view = pointcloud.view();
let smooth_cloud =
smooth::smooth_pointcloud(&cloud_view, &smooth_params).expect("Smoothing failed!");
let triplets = triplet::evaluate_triplets(&smooth_cloud.view(), &triplet_params);
let rs_clusters = cluster::cluster(smooth_cloud.nrows(), &triplets, &cluster_params)
.expect("Clustering failed!");
let re_clusters = split::split_clusters(
&cloud_view,
&rs_clusters.labels.view(),
&rs_clusters.unique_labels.view(),
25,
)
.expect("Splitting failed!");
assert!(re_clusters.1.len() == 7);
}
}