Expand description
MBA-1349: robust hold corridors across a bounded set of NAMED segmented-wind scenarios.
Field users usually have several concrete plausible wind calls — a low call and a high call, or two different downrange patterns — rather than a distribution they actually believe. A nominal trajectory hides that ambiguity; Monte Carlo demands a probability model they do not have. This module takes the middle path: solve a handful of named scenarios exactly, report every one of them, and report the corridor they span.
§No probabilities, anywhere
Nothing here assigns a likelihood to a scenario, interpolates between scenarios, or
folds the finite set into a standard deviation. The corridor is the range spanned by
the hypotheses the user supplied, at the ranges they asked about — no more, and
deliberately no more. A three-scenario corridor is not a confidence interval, and this
module never presents it as one. Statistical dispersion remains monte-carlo --wez’s
job.
§What a “hold” is here
The same convention the rest of the 0.31.0 reticle work uses (see crate::reticle):
angular milliradians the shooter must apply, with elevation positive = hold UP (the
bullet fell below the line of sight) and windage positive = hold RIGHT (the wind
pushed the bullet right).
§Determinism
Scenarios are sorted by name before anything is solved, so no result — corridor, minimax hold, or which scenario is named as the worst case — can depend on the order they appeared in the file. Every tie-break downstream is therefore over a fixed order.
§The zero is solved ONCE, in calm air
A rifle has one zero; the scenarios are hypotheses about the shot, not about the
zeroing session. Re-zeroing per scenario would fold each hypothesis into its own datum
and shrink the corridor toward nothing, which is exactly the ambiguity this command
exists to show. So the muzzle angle is solved once against
WindConditions::default() and reused verbatim by every scenario.
Structs§
- Corridor
Load - The rifle, load and atmosphere every scenario is solved with. SI throughout.
- Corridor
Row - The corridor and chosen hold at one range.
- Named
Wind Scenario - One named wind hypothesis: a label plus the downrange segments that define it.
- Robust
Hold Report V1 - A complete robust-hold report (MBA-1349).
- Robust
Hold Request - One robust-hold run.
- Scenario
Hold - One scenario’s hold at one range.
- Wind
Scenario SetV1 - A bounded, named set of wind hypotheses (MBA-1349).
Enums§
- Corridor
Metric - Which norm the minimax hold minimizes.
- Robust
Hold Format - Rendering shape for the robust-hold report.
- Target
Spec - The target a corridor is judged against.
- Wind
Scenario Error - Why a robust-hold run was rejected. Typed, and every variant is raised BEFORE any
trajectory is solved except
Self::SolveFailed.
Constants§
- MAX_
CORRIDOR_ RANGES - Most ranges one run will sample. Same rationale: a bounded, checkable table, not a swept surface.
- MAX_
WIND_ SCENARIOS - Most scenarios one run will accept.
- ROBUST_
HOLD_ REPORT_ VERSION - Schema version carried by
RobustHoldReportV1. - TARGET_
FIT_ EPSILON_ M - Slack (meters) allowed when deciding whether a miss is inside a target.
- WIND_
SCENARIO_ SET_ VERSION - Schema version carried by
WindScenarioSetV1and enforced on load.
Functions§
- format_
robust_ hold_ report - Render a robust-hold report, identically on every surface (MBA-1349).
- parse_
target_ spec - Parse a
rect:WxHorcircle:Dtarget specification. - parse_
wind_ scenario_ set - Decode a wind scenario set from JSON TEXT (MBA-1349).
- solve_
robust_ hold - Solve one robust-hold run (MBA-1349).