Skip to main content

sva_samples/
label.rs

1// Concern: states how exact one sampled value is and what it cost | Non-concern: deciding that (collapse.rs), printing it | IO: none
2
3#[derive(Clone, Copy, Debug, PartialEq, Eq)]
4pub enum Source {
5    Exact,
6    Measured,
7}
8
9/// A line the grid could not hold, levelled against amplitude 1.0.
10#[derive(Clone, Copy, Debug, PartialEq)]
11pub struct Dropped {
12    pub hz: f64,
13    pub db: f64,
14}
15
16macro_rules! rules {
17    ($($variant:ident => $text:literal,)+) => {
18        #[derive(Clone, Copy, Debug, PartialEq, Eq)]
19        pub enum Rule {
20            $($variant,)+
21        }
22
23        impl Rule {
24            /// The row of FORMAT 9.1 that ran, as the label prints it.
25            pub fn as_str(self) -> &'static str {
26                match self {
27                    $(Rule::$variant => $text,)+
28                }
29            }
30
31            pub fn named(text: &str) -> Option<Rule> {
32                match text {
33                    $($text => Some(Rule::$variant),)+
34                    _ => None,
35                }
36            }
37        }
38    };
39}
40
41rules! {
42    LineSpectrumExact => "line spectrum, no crop",
43    LineSpectrumSummed => "line spectrum, summed directly",
44    LineSpectrumMixed => "line spectrum, placed and summed",
45    BandLimited => "band-limited projection",
46    CroppedPair => "cropped pair, tail truncated",
47    PointSampled => "point sampling",
48    InverseSpectrum => "inverse spectrum",
49    Istft => "inverse short-time transform",
50    Reading => "reading",
51    Added => "sum, addend by addend",
52}
53
54#[derive(Clone, Debug, PartialEq)]
55pub enum Detail {
56    Lines {
57        rule: Rule,
58        /// Lines the transform placed; the rest were summed directly.
59        placed: usize,
60        summed: usize,
61        dropped: Vec<Dropped>,
62        dropped_more: usize,
63        terms: Option<usize>,
64        tail_db: Option<f64>,
65    },
66    Continuous {
67        rule: Rule,
68    },
69    Cropped {
70        rule: Rule,
71        tail_db: Option<f64>,
72    },
73    Point {
74        rule: Rule,
75        alias_db: Option<f64>,
76    },
77    Spectrum {
78        rule: Rule,
79        wrap_db: f64,
80    },
81    Roundtrip {
82        rule: Rule,
83        edited: bool,
84    },
85    /// A reading off a buffer that exists; no collapse ran under it.
86    Reading {
87        rule: Rule,
88    },
89    /// A sum whose addends named different rows; the planes added.
90    Added {
91        parts: Vec<Detail>,
92    },
93}
94
95#[derive(Clone, Copy, Debug, PartialEq, Eq)]
96pub struct Cost {
97    pub flops: u128,
98    pub budget: u128,
99}
100
101/// The level a render prunes at, and the sample each node it cut is zero from.
102#[derive(Clone, Debug, PartialEq)]
103pub struct Pruned {
104    pub db: f64,
105    pub cuts: Vec<(String, i64)>,
106}
107
108#[derive(Clone, Debug, PartialEq)]
109pub struct Label {
110    pub source: Source,
111    pub profile: &'static str,
112    pub rate: u32,
113    pub detail: Detail,
114    pub cost: Option<Cost>,
115    /// The most seconds a read was moved to land on a whole sample.
116    pub moved: Option<f64>,
117    pub pruned: Option<Pruned>,
118}
119
120impl Label {
121    pub fn measured(profile: &'static str, rate: u32) -> Label {
122        Label {
123            source: Source::Measured,
124            profile,
125            rate,
126            detail: Detail::Reading {
127                rule: Rule::Reading,
128            },
129            cost: None,
130            moved: None,
131            pruned: None,
132        }
133    }
134
135    pub fn new(source: Source, profile: &'static str, rate: u32, detail: Detail) -> Label {
136        Label {
137            source,
138            profile,
139            rate,
140            detail,
141            cost: None,
142            moved: None,
143            pruned: None,
144        }
145    }
146
147    pub fn costing(self, flops: u128, budget: u128) -> Label {
148        Label {
149            cost: Some(Cost { flops, budget }),
150            ..self
151        }
152    }
153
154    pub fn rule(&self) -> Rule {
155        self.detail.rule()
156    }
157}
158
159impl Detail {
160    pub fn rule(&self) -> Rule {
161        match *self {
162            Detail::Lines { rule, .. }
163            | Detail::Continuous { rule }
164            | Detail::Cropped { rule, .. }
165            | Detail::Point { rule, .. }
166            | Detail::Spectrum { rule, .. }
167            | Detail::Roundtrip { rule, .. }
168            | Detail::Reading { rule } => rule,
169            Detail::Added { .. } => Rule::Added,
170        }
171    }
172}