Skip to main content

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;