pub struct AbReport {
pub treatment: ArmSpec,
pub control: ArmSpec,
pub cells: Vec<AbCell>,
pub stats: PairedStats,
}Expand description
The full report: every paired cell plus the aggregate stats. Serializes to
the timestamped JSON the car coder-ab CLI writes to bench/results.
Fields§
§treatment: ArmSpecThe arm under test.
control: ArmSpecThe reference arm.
cells: Vec<AbCell>§stats: PairedStatsImplementations§
Source§impl AbReport
impl AbReport
Sourcepub fn from_cells(
cells: Vec<AbCell>,
treatment: ArmSpec,
control: ArmSpec,
) -> Self
pub fn from_cells( cells: Vec<AbCell>, treatment: ArmSpec, control: ArmSpec, ) -> Self
Fold cells into a report against the two arms that produced them.
Sourcepub fn same_backbone(&self) -> Option<bool>
pub fn same_backbone(&self) -> Option<bool>
Whether both arms ran the same pinned backbone — the fairness rule
that makes pass_rate_delta a harness measurement rather than a model
measurement (backbone choice is ~3× the harness spread).
None when either arm is unpinned: the honest answer is then unknown,
not “yes”. This used to be unknowable — the report recorded a single
backbone string the operator asserted, while the pin reached only the
native loop. false is a legitimate, deliberate configuration (the
cross-tier diagonal); what must never happen is believing it is true
without having checked.
Some(false) means the two arms carry different pin strings — which
is not quite the same as “different models”, because the id namespaces
differ per engine (parslee/reasoning and gpt-5.5 name one backbone by
two routes). We cannot resolve that equivalence here, so the honest
reading is “different pins, check what you intended”, not “different
tiers”. Identical pins are unambiguous.
Sourcepub fn summary_line(&self) -> String
pub fn summary_line(&self) -> String
A one-line human summary for the CLI table footer.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for AbReport
impl<'de> Deserialize<'de> for AbReport
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl StructuralPartialEq for AbReport
Auto Trait Implementations§
impl Freeze for AbReport
impl RefUnwindSafe for AbReport
impl Send for AbReport
impl Sync for AbReport
impl Unpin for AbReport
impl UnsafeUnpin for AbReport
impl UnwindSafe for AbReport
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
impl<S, T> Duplex<S> for Twhere
T: FromSample<S> + ToSample<S>,
impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more