1use {
2 core::{
3 fmt::Debug,
4 },
5 matchete::{Assessor, Resemblance},
6};
7
8#[derive(Debug)]
9struct NumericResembler;
10
11impl Resemblance<f64, f64> for NumericResembler {
12 fn resemblance(&self, query: &f64, candidate: &f64) -> f64 {
13 let diff = (query - candidate).abs();
14 let max_val = query.abs().max(candidate.abs());
15 if max_val == 0.0 { 1.0 } else { 1.0 - (diff / (max_val + 1.0)) }
16 }
17
18 fn perfect(&self, query: &f64, candidate: &f64) -> bool {
19 (query - candidate).abs() < f64::EPSILON
20 }
21}
22
23fn main() {
24 let assessor = Assessor::<f64, f64>::new()
25 .with(NumericResembler, 1.0)
26 .floor(0.8);
27
28 let query = 42.0;
29 let candidates = vec![40.0, 45.0, 100.0];
30
31 println!("Numeric Matching Example");
32 println!("=======================");
33
34 let shortlist = assessor.shortlist(&query, &candidates);
35 println!("Viable matches found: {}", shortlist.len());
36
37 for (i, verdict) in shortlist.iter().enumerate() {
38 println!("Match {}:", i + 1);
39 println!(" Resemblance: {:.2}", verdict.resemblance);
40 println!(" Candidate: {}", verdict.candidate);
41 println!(" Perfect: {}", verdict.perfect);
42 println!(" Disposition: {:?}", assessor.disposition(&query, &verdict.candidate));
43 }
44
45 println!("\nChampion Selection");
47 println!("=================");
48
49 if let Some(champion) = assessor.champion(&query, &candidates) {
50 println!("Best candidate: {} (resemblance: {:.2})", champion.candidate, champion.resemblance);
51 } else {
52 println!("No viable candidates found");
53 }
54
55 println!("\nAll Candidates Analysis");
57 println!("======================");
58
59 for candidate in &candidates {
60 let verdict = assessor.verdict(&query, candidate);
61 println!("Candidate {}: resemblance={:.2}, disposition={:?}",
62 candidate, verdict.resemblance, assessor.disposition(&query, candidate));
63 }
64}