numeric/
numeric.rs

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    // Show champion example
46    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    // Show all candidates with their resemblance scores
56    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}