ak_core/utils/
distance_matrix.rs

1use crate::StructureView;
2
3pub fn distance_matrix(view: &StructureView) -> Vec<f64> {
4    let positions = view.positions;
5    let n = positions.len();
6    let mut output = Vec::with_capacity(n * n);
7
8    for i in 0..n {
9        for j in 0..n {
10            let dx = positions[i][0] - positions[j][0];
11            let dy = positions[i][1] - positions[j][1];
12            let dz = positions[i][2] - positions[j][2];
13            let r2 = dx * dx + dy * dy + dz * dz;
14            output.push(f64::sqrt(r2));
15        }
16    }
17
18    output
19}
20
21#[test]
22fn test_shape() {
23    use crate::Structure;
24    let positions = [[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0]].to_vec();
25    let numbers = [1, 1, 1].to_vec();
26    let cell = [[10.0, 0.0, 0.0], [0.0, 10.0, 0.0], [0.0, 0.0, 10.0]];
27    let pbc = [false, false, false];
28    let structure = Structure::new(positions.clone(), numbers.clone(), cell, pbc);
29    let view = structure.view();
30
31    let distances = distance_matrix(&view);
32    println!("{:#?}", distances);
33    assert_eq!(distances.len(), 9)
34}
35
36#[test]
37fn test_output() {
38    use crate::Structure;
39    use std::f64::consts::SQRT_2;
40
41    let positions = [[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0]].to_vec();
42    let numbers = [1, 1, 1].to_vec();
43    let cell = [[10.0, 0.0, 0.0], [0.0, 10.0, 0.0], [0.0, 0.0, 10.0]];
44    let pbc = [false, false, false];
45    let structure = Structure::new(positions.clone(), numbers.clone(), cell, pbc);
46    let view = structure.view();
47    let distances = distance_matrix(&view);
48
49    let expected_distances = vec![0.0, 1.0, 1.0, 1.0, 0.0, SQRT_2, 1.0, SQRT_2, 0.0];
50    assert_eq!(expected_distances, distances)
51}