score-set
A Rust library for building weighted scoring operator sets with three dispatch strategies — from compile-time fixed to fully dynamic.
Quick example (Layer 1 — fixed)
use *;
let gc = metric
.measure.by
.map01.by;
let len = metric
.measure.by
.map01.by;
let ms = fixed_score_set! ?;
let dna = "ACGTACGT";
let score = ms.score.by;
Three-layer architecture
| Layer | Type | Macro | Dispatch | Use when |
|---|---|---|---|---|
| 1 — fixed | FixedScoreSet |
fixed_score_set! |
Compile-time, zero vtable | Metric set known at compile time |
| 2 — finite | FiniteScoreSet |
finite_score_set! |
Enum match, zero vtable | Runtime composition, known metric types |
| 3 — dynamic | DynamicScoreSet |
dynamic_score_set! |
Vtable per call | Fully heterogeneous, runtime assembly |
All three layers share the same { weight => metric, ... } macro syntax.
Layer 2 — finite
Declare a metric enum with named keys, then assemble:
finite_metric!
let set = finite_score_set! ?;
let total = set.sum;
let rows = set.breakdown; // per-metric detail
Or skip the enum declaration entirely — bare metrics are auto-wrapped in an anonymous zero-vtable enum:
let set = finite_score_set! ?;
let total = set.sum;
Layer 3 — dynamic
Same syntax, metrics are auto-boxed:
let set = dynamic_score_set! ?;
let total = set.sum;
Scoring
| Method | Layer 1 | Layer 2 | Layer 3 |
|---|---|---|---|
set.sum(&input) |
— | ✅ | ✅ |
set.score().by(closure) |
✅ | ✅ | ✅ |
set.breakdown(&input) |
— | ✅ | ✅ |
set.iter() / .len() |
— | ✅ | ✅ |
Builder .push().build() |
— | ✅ | ✅ |
Building a metric
let m = metric // name it
.measure.by // measure: I → Raw
.map01.by; // normalise: Raw → [0, 1]
Features
Default arity is 128 members per set. Opt into smaller feature sets:
= { = false, = ["level-8"] }
= { = ["level-16"] }
Available levels: level-8, level-16, level-32, level-64, level-128.
Per-layer control:
= { = ["fixed-level-8", "finite-level-8"] }
License
MIT OR Apache-2.0