pub struct AbsenceCensus { /* private fields */ }Expand description
How often each path was absent, counted per occurrence rather than per file.
LabelCensus counts a label once per file, which answers “does the
corpus carry this at all”. It cannot answer how often a reader’s absent
fallback runs, because a label inside a list is present on some elements
and absent on others and a file-level count collapses that to one bit. A
corpus of two hundred creatures where one omits ScriptHeartbeat and a
corpus where all two hundred omit it are the same file either way.
So the denominator here is the number of structs visited at the path’s parent: the number of times the reader ran at all. A field on a list element gets one occasion per element.
Paths are label sequences with no list marker, so a schema entry looks up
directly by the path a walk builds for it. A list and a struct both become
the parent path of whatever hangs beneath them, which is the same nesting
Shape uses for a container’s children.
Implementations§
Source§impl AbsenceCensus
impl AbsenceCensus
Sourcepub fn rate(&self, path: &[&str]) -> Option<AbsenceRate>
pub fn rate(&self, path: &[&str]) -> Option<AbsenceRate>
How often path was absent, or None when the corpus never reached
its parent.
None is not the same as “always present” and not the same as “always
absent”. It means no file in the corpus held a struct this field could
have appeared on, so the corpus says nothing about the field either
way. Ranking that as a 0% firing rate would read as evidence the
fallback never runs, which is exactly backwards.
Sourcepub fn firing_rate(
&self,
path: &[&str],
shape: SchemaShape,
) -> Option<AbsenceRate>
pub fn firing_rate( &self, path: &[&str], shape: SchemaShape, ) -> Option<AbsenceRate>
How often path’s fallback fires in this corpus, or None when this
corpus cannot speak to it.
rate answers “how often was the label missing here”, which is not the
same question. A missing label only means a fallback ran if this
corpus’s reader was the one looking for it, and under
SchemaShape::Union it may not have been. Callers deciding that
inline have gotten it wrong in both directions:
- Treating a union schema as single-form counts every static-form label
as firing across the entire saved corpus, which put six
TemplateResRefrows at the head of a ranking on numbers describing a reader that never ran. - Treating a single-form schema as a union drops every field the corpus universally omits, which is exactly the set whose fallback runs every time and therefore matters most.
So the shape is a parameter rather than a heuristic, and this is the only place the rule is written down.
Sourcepub fn occurrences(&self, path: &[&str]) -> usize
pub fn occurrences(&self, path: &[&str]) -> usize
How many structs the corpus held at path.
The element count of a list, when path names one. Zero for a path the
corpus never held.
Trait Implementations§
Source§impl Clone for AbsenceCensus
impl Clone for AbsenceCensus
Source§fn clone(&self) -> AbsenceCensus
fn clone(&self) -> AbsenceCensus
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more