microBioRust_seqmetrics/
hamming.rs1#[allow(unused_imports)]
2
3pub fn hamming_distance(seq1: &str, seq2: &str) -> usize {
5 assert_eq!(
7 seq1.len(),
8 seq2.len(),
9 "Sequences must be of equal length for Hamming distance"
10 );
11 seq1
12 .as_bytes()
13 .iter()
14 .zip(seq2.as_bytes())
15 .filter(|(a, b)| a !=b)
16 .count()
17}
18
19pub async fn hamming_matrix(sequences: &Vec<String>) -> Result<Vec<Vec<usize>>, anyhow::Error> {
20 assert!(
21 sequences.windows(2).all(|w| w[0].len() == w[1].len()),
22 "all sequences must be the same length, i.e an alignment");
23 println!("all sequences are the same length, proceeding");
24 let n = sequences.len();
25 let mut distances = vec![vec![0usize; n]; n];
26 for i in 0..n {
27 for j in i + 1..n {
28 let d = hamming_distance(&sequences[i], &sequences[j]);
29 distances[i][j] = d;
30 distances[j][i] = d;
31 }
32 }
33 Ok(distances)
34}