1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/// Declare a fixed set of `weight => metric` pairs (Layer 1).
///
/// Each weight is validated > 0 via [`GtZero`](crate::GtZero). The macro
/// normalizes weights and returns a [`FixedScoreSet`](crate::FixedScoreSet)
/// directly.
///
/// # Example
///
/// ```ignore
/// let gc = metric("gc") .measure().by(...).map01().by(...);
/// let len = metric("len").measure().by(...).map01().by(...);
///
/// let ms = fixed_score_set! {
/// 2.0 => gc,
/// 3.0 => len,
/// }?;
/// ```
/// Declare a finite set of `weight => metric` pairs (Layer 2).
///
/// Metrics are auto-wrapped in an anonymous zero-vtable enum (no explicit
/// [`finite_metric!`](crate::finite_metric!) declaration needed). For named
/// variants or a `Custom` escape hatch, use
/// [`finite_metric!`](crate::finite_metric!) directly.
///
/// # Example
///
/// ```ignore
/// let gc = metric("gc") .measure().by(...).map01().by(...);
/// let len = metric("len").measure().by(...).map01().by(...);
///
/// let set = finite_score_set! {
/// 2.0 => gc,
/// 3.0 => len,
/// }?;
///
/// let total = set.sum(&input);
/// ```
/// Declare a dynamic set of `weight => metric` pairs (Layer 3).
///
/// Metrics are auto-boxed via [`.boxed()`](crate::Metric::boxed) — no manual
/// boxing needed. Weights are normalized and a
/// [`DynamicScoreSet`](crate::DynamicScoreSet) is returned.
///
/// # Example
///
/// ```ignore
/// let gc = metric("gc") .measure().by(...).map01().by(...);
/// let len = metric("len").measure().by(...).map01().by(...);
///
/// let set = dynamic_score_set! {
/// 2.0 => gc,
/// 3.0 => len,
/// }?;
///
/// let total = set.sum(&input);
/// ```