1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
mod bdeque;
mod pqgrams;
mod default_tree;
pub use default_tree::Tree;
pub use pqgrams::{pqgram_distance, ValidGramElement, LabelledTree, PQGram, Node, pqgram_profile, flatten_profile, pqgram_distance_with_fn};
#[cfg(test)]
mod tests {
use super::default_tree::Tree;
use super::{pqgram_distance, pqgram_profile, flatten_profile};
fn f64_round_2dp(n: f64) -> f64 {
(n * 100.).round() / 100.
}
fn build_known_tree_1() -> Tree<String> {
Tree::new_str("a")
.add_node(Tree::new_str("a")
.add_node(Tree::new_str("e"))
.add_node(Tree::new_str("b")))
.add_node(Tree::new_str("b"))
.add_node(Tree::new_str("c"))
}
fn known_profile_1() -> Vec<Vec<String>> {
vec![
vec!["*", "a", "*", "*", "a"],
vec!["*", "a", "*", "a", "b"],
vec!["*", "a", "a", "b", "c"],
vec!["*", "a", "b", "c", "*"],
vec!["*", "a", "c", "*", "*"],
vec!["a", "a", "*", "*", "e"],
vec!["a", "a", "*", "e", "b"],
vec!["a", "a", "b", "*", "*"],
vec!["a", "a", "e", "b", "*"],
vec!["a", "b", "*", "*", "*"],
vec!["a", "b", "*", "*", "*"],
vec!["a", "c", "*", "*", "*"],
vec!["a", "e", "*", "*", "*"]
].iter().map(|v| v.iter().map(|s| s.to_string()).collect()).collect()
}
fn build_known_tree_2() -> Tree<String> {
Tree::new_str("a")
.add_node(Tree::new_str("a")
.add_node(Tree::new_str("e"))
.add_node(Tree::new_str("b")))
.add_node(Tree::new_str("b"))
.add_node(Tree::new_str("x"))
}
#[test]
fn test_pqgram_profile() {
assert_eq!(known_profile_1(),
flatten_profile(&pqgram_profile(build_known_tree_1(), 2, 3), "*".to_string()))
}
#[test]
fn test_pqgram_distance() {
let tree_1 = build_known_tree_1();
let tree_2 = tree_1.clone();
let tree_3 = build_known_tree_2();
let prof1 = pqgram_profile(tree_1, 2, 3);
let prof2 = pqgram_profile(tree_2, 2, 3);
let prof3 = pqgram_profile(tree_3, 2, 3);
let dist12 = pqgram_distance::<String, Tree<String>>(&prof1, &prof2, None);
let dist13 = pqgram_distance::<String, Tree<String>>(&prof1, &prof3, None);
assert_eq!(f64_round_2dp(dist12), 0.);
assert_eq!(f64_round_2dp(dist13), 0.31);
}
}