use erdos_unit_distance::algebraic::field::{FieldElement, MultiQuadraticField};
use erdos_unit_distance::algebraic::window::find_lattice_points_in_polydisk;
use erdos_unit_distance::utils::{find_unit_distance_edges, prune_to_target_density};
#[test]
fn test_pruning_disconnected_graph() {
let points = vec![
[0.0, 0.0], [1.0, 0.0], [10.0, 10.0], [20.0, 20.0], ];
let pruned = prune_to_target_density(&points, 2, 1e-4);
assert_eq!(pruned.len(), 2);
let edges = find_unit_distance_edges(&pruned, 1e-4);
assert_eq!(edges.len(), 1);
let has_origin = pruned
.iter()
.any(|p| p[0].abs() < 1e-5 && p[1].abs() < 1e-5);
let has_one = pruned
.iter()
.any(|p| (p[0] - 1.0).abs() < 1e-5 && p[1].abs() < 1e-5);
assert!(has_origin, "Should contain [0, 0]");
assert!(has_one, "Should contain [1, 0]");
}
#[test]
fn test_pruning_dense_subgraph() {
let sqrt_3_over_2 = (3.0_f64).sqrt() / 2.0;
let points = vec![
[0.0, 0.0], [1.0, 0.0], [0.5, sqrt_3_over_2], [10.0, 0.0], [11.0, 0.0], ];
let pruned = prune_to_target_density(&points, 3, 1e-4);
assert_eq!(pruned.len(), 3);
let edges = find_unit_distance_edges(&pruned, 1e-4);
assert_eq!(edges.len(), 3);
for p in &pruned {
assert!(
p[0] < 5.0,
"Pruned set should only contain the dense triangle, but got point {:?}",
p
);
}
}
#[test]
fn test_pruning_edge_cases_empty_and_trivial() {
let empty_points: Vec<[f64; 2]> = Vec::new();
let pruned_empty = prune_to_target_density(&empty_points, 5, 1e-4);
assert!(
pruned_empty.is_empty(),
"Pruning empty points should return empty"
);
let pruned_empty_zero = prune_to_target_density(&empty_points, 0, 1e-4);
assert!(
pruned_empty_zero.is_empty(),
"Pruning empty points to target 0 should return empty"
);
let points = vec![[0.0, 0.0], [1.0, 0.0], [2.0, 0.0]];
let pruned_large = prune_to_target_density(&points, 5, 1e-4);
assert_eq!(
pruned_large.len(),
3,
"Should return all points if target is larger than initial size"
);
assert_eq!(pruned_large[0], [0.0, 0.0]);
assert_eq!(pruned_large[1], [1.0, 0.0]);
assert_eq!(pruned_large[2], [2.0, 0.0]);
let pruned_zero = prune_to_target_density(&points, 0, 1e-4);
assert!(
pruned_zero.is_empty(),
"Pruning to target 0 should return empty"
);
}
#[test]
fn test_pruning_component_density_comparison() {
let sqrt_3_over_2 = (3.0_f64).sqrt() / 2.0;
let points = vec![
[0.0, 0.0], [1.0, 0.0], [0.5, sqrt_3_over_2], [10.0, 10.0], [11.0, 10.0], [11.0, 11.0], [10.0, 11.0], ];
let pruned = prune_to_target_density(&points, 4, 1e-4);
assert_eq!(pruned.len(), 4);
for p in &pruned {
assert!(
p[0] >= 9.0 && p[1] >= 9.0,
"Pruned set must isolate the intact 4-cycle, but got point {:?}",
p
);
}
let edges = find_unit_distance_edges(&pruned, 1e-4);
assert_eq!(
edges.len(),
4,
"The isolated 4-cycle should have exactly 4 unit-distance edges"
);
}
#[test]
fn test_multiquadratic_density_and_polydisk_bound() {
let field = MultiQuadraticField::try_new(&[5, -1]).unwrap(); let p = 41;
let k = 1;
let r_polydisk = 1.5;
let elements = find_lattice_points_in_polydisk(&field, p, k, 3, r_polydisk, 50).unwrap();
assert!(!elements.is_empty());
for elem in &elements {
let embs = elem.embeddings(&field);
for &emb in &embs {
assert!(
emb.norm() <= r_polydisk + 1e-5,
"Lattice point embedding {:.6} + {:.6}i exceeds polydisk radius {}",
emb.re,
emb.im,
r_polydisk
);
}
}
}
#[test]
fn test_minkowski_and_lemma_2_3_verification() {
let field = MultiQuadraticField::try_new(&[5, 17, -1]).unwrap();
let p = 101;
let k = 1;
let r_polydisk = 2.0;
let elements = find_lattice_points_in_polydisk(&field, p, k, 3, r_polydisk, 100).unwrap();
assert!(!elements.is_empty());
let alpha = FieldElement::one(&field);
let projected: Vec<[f64; 2]> = elements
.iter()
.map(|e| {
erdos_unit_distance::algebraic::lattice::project_to_plane(e, &field, &alpha).unwrap()
})
.collect();
let mut unique_projected: Vec<[f64; 2]> = Vec::new();
let mut unique_elements = Vec::new();
for (i, &p_coord) in projected.iter().enumerate() {
let mut is_dup = false;
for &existing in &unique_projected {
let dx = p_coord[0] - existing[0];
let dy = p_coord[1] - existing[1];
if (dx * dx + dy * dy).sqrt() < 1e-7 {
is_dup = true;
break;
}
}
if !is_dup {
unique_projected.push(p_coord);
unique_elements.push(elements[i].clone());
}
}
let n = unique_projected.len();
assert!(n > 0);
let edges = find_unit_distance_edges(&unique_projected, 1e-4);
for (i, j) in edges {
let diff = unique_elements[i].sub(&unique_elements[j]);
let embs = diff.embeddings(&field);
for &emb in &embs {
let mod_val = emb.norm();
assert!(
(mod_val - 1.0).abs() < 1e-5,
"Embedding of algebraic difference between unit-distance points must have modulus 1.0, but got {:.6}",
mod_val
);
}
}
}