use std::collections::HashSet;
use crate::sia::find_mtps;
use crate::tec::TranslationalEquivalence;
pub fn build_tecs_from_mtps(dataset: &Vec<(u32, u32)>, restrict_dpitch_zero: bool) -> Vec<TranslationalEquivalence> {
let points_set: HashSet<(u32, u32)> = dataset.iter().copied().collect();
let mtps = find_mtps(dataset, restrict_dpitch_zero); let mut tecs = Vec::new();
for (v, start_pts) in mtps {
if v == (0, 0) {
continue;
}
let pattern = start_pts; if pattern.is_empty() {
continue;
}
let p0 = pattern[0]; let candidates: HashSet<(i32, i32)> = points_set
.iter()
.map(|&(qx, qy)| ((qx as i64 - p0.0 as i64) as i32, (qy as i64 - p0.1 as i64) as i32))
.collect();
let mut translators = HashSet::<(i32, i32)>::new();
for w in candidates {
if w == (0, 0) {
continue;
}
if restrict_dpitch_zero && w.1 != 0 {
continue;
}
let ok = pattern.iter().all(|&(px, py)| {
let tx = (px as i32 + w.0) as u32;
let ty = (py as i32 + w.1) as u32;
points_set.contains(&(tx, ty))
});
if ok {
translators.insert(w);
}
}
if !translators.is_empty() {
let tec = TranslationalEquivalence::new(pattern, translators, None);
tecs.push(tec);
}
}
tecs
}