score_set/lib.rs
1//! # score-set
2//!
3//! A Rust library for building **weighted scoring operator sets** with three
4//! dispatch strategies — from compile-time fixed to fully dynamic.
5//!
6//! It does not prescribe a unified input or context type. Instead it declares,
7//! stores, normalizes, and combines a set of weighted operators.
8//!
9//! # Three-layer architecture
10//!
11//! | Layer | Type | Dispatch | When to use |
12//! |---|---|---|---|
13//! | 1 — fixed | [`FixedScoreSet`] via [`fixed_score_set!`] | Compile-time, zero vtable | Known metric set at compile time |
14//! | 2 — finite | [`FiniteScoreSet`] via [`finite_score_set!`] | Enum match, zero vtable | Runtime composition, known metric types |
15//! | 3 — dynamic | [`DynamicScoreSet`] via [`dynamic_score_set!`] | Vtable per call | Fully heterogeneous, runtime assembly |
16//!
17//! # Quick example (Layer 1 — fixed)
18//!
19//! ```ignore
20//! use score_set::*;
21//!
22//! let gc = metric("gc")
23//! .measure().by(|dna: &&str| gc_ratio(dna))
24//! .map01().by(|raw: &f64, _: &&str| Value01::witness(*raw).unwrap());
25//!
26//! let len = metric("len")
27//! .measure().by(|len: &usize| *len)
28//! .map01().by(|raw: &usize, _: &usize| {
29//! Value01::witness((*raw as f64 / 100.0).min(1.0)).unwrap()
30//! });
31//!
32//! let ms = fixed_score_set! {
33//! 2.0 => gc,
34//! 3.0 => len,
35//! }?;
36//!
37//! let dna = "ACGTACGT";
38//! let score = ms.score().by(|(gc, len)| {
39//! gc.contribute(gc.metric().eval(&dna))
40//! + len.contribute(len.metric().eval(&dna.len()))
41//! });
42//! # Ok::<(), &'static str>(())
43//! ```
44
45mod breakdown;
46mod dynamic;
47mod finite;
48pub mod finite_enum;
49mod fixed;
50mod fixed_tuple;
51mod float;
52mod macros;
53mod member;
54mod metric;
55mod value;
56
57// Public API
58pub use breakdown::Breakdown;
59pub use dynamic::{
60 DynamicMember, DynamicScoreSet, DynamicScoreSetBuilder, DynamicScoreStage, Scorable,
61};
62pub use finite::{FiniteMember, FiniteScoreSet, FiniteScoreSetBuilder, FiniteScoreStage};
63pub use finite_enum::*;
64pub use fixed::{FixedScoreSet, FixedScoreStage};
65pub use float::Float;
66// fixed_score_set!, dynamic_score_set!, and finite_metric! are exported at crate root via #[macro_export]
67pub use member::{Member, Members, RawMember, raw_member};
68pub use metric::{Metric, metric};
69pub use value::{GtZero, NormalizedContainer, NormalizedWeight, Value01};
70pub use witnessed::{WitnessExt, Witnessed};
71
72#[cfg(test)]
73mod lab;