pub struct EstimationRecipe {
pub range: RangeRecipe,
pub sagnac: SagnacRecipe,
pub frame: FrameRecipe,
pub normal: NormalRecipe,
pub solver: SolverRecipe,
}Expand description
The full operation-order recipe a strategy composes: one variant per stage.
Default and the named constructors reproduce the CURRENT behavior of each
existing strategy, so selecting a recipe never changes a reference golden.
Fields§
§range: RangeRecipe§sagnac: SagnacRecipe§frame: FrameRecipe§normal: NormalRecipe§solver: SolverRecipeImplementations§
Source§impl EstimationRecipe
impl EstimationRecipe
Sourcepub const fn ppp() -> Self
pub const fn ppp() -> Self
The current PPP reference recipe (precise_positioning, oracle-parity).
Sourcepub const fn spp_owned_deterministic() -> Self
pub const fn spp_owned_deterministic() -> Self
The SPP recipe driving the owned deterministic trust-region solver: the
SPP reference model with SolverRecipe::OwnedDeterministicTrf swapped
in for the legacy nalgebra LU linear-solve stage. Every other stage is the
SPP reference op-order, so only the factorization changes.
Sourcepub const fn canonical_spp() -> Self
pub const fn canonical_spp() -> Self
The canonical SPP recipe: the single consistent IERS-rigorous SPP
measurement model. It diverges from Self::spp (the Skyfield-faithful
reference) only where the physics says to:
- range:
RangeRecipe::CanonicalLightTimeClosedFormSagnaciterates the light-time loop to convergence (vs the reference’s fixed transmit-time truncation), with the closed-form Sagnac Z-rotation (never a first-order scalar Sagnac). - frame:
FrameRecipe::CanonicalWgs84solves ECEF->geodetic directly in meters on the WGS84 ellipsoid (vs the reference’s Skyfield AU-scaled three-iteration latitude loop). - solver:
SolverRecipe::OwnedDeterministicTrfowns the trust-region subproblem factorization so canonical is deterministic run-to-run on a pinned build (its cross-platform bit guarantee is scoped to the factorization; the surrounding reductions ride nalgebra).
The Sagnac stage is the closed-form Z-rotation the SPP reference already uses (the rigorous form), and the normal stage is the SPP weighted-residual finite-difference assembly the trust-region solver consumes; neither needs a separate canonical variant for SPP.
Sourcepub const fn canonical_rtk() -> Self
pub const fn canonical_rtk() -> Self
The canonical RTK recipe: the double-difference baseline under the
numerically rigorous square-root-information solve. It keeps the RTK
reference’s double-difference measurement physics (the provided-transmit
range with the RTKLIB first-order Sagnac scalar, the geocentric-up
elevation frame), because the canonical RTK divergence the physics calls
for is in the linear algebra, not the observation model: the same SPD
information system the reference assembles is solved by the owned
deterministic Cholesky square-root factorization
(NormalRecipe::CanonicalSquareRoot on
SolverRecipe::OwnedDeterministicCholesky) instead of the reference’s
general first-tie Gaussian elimination. The square-root solve needs no
pivoting, exploits the symmetry of the SPD normal matrix, and is entirely
owned scalar arithmetic (no nalgebra, no BLAS), so canonical RTK is
well-conditioned and bit-reproducible across platforms.
Sourcepub const fn canonical_ppp() -> Self
pub const fn canonical_ppp() -> Self
The canonical PPP recipe: the undifferenced ionosphere-free PPP arc under
the numerically rigorous square-root-information solve. Like
Self::canonical_rtk it keeps the PPP reference’s measurement physics
(the rounded-microsecond fixed-iteration light-time with the rigorous
closed-form Sagnac Z-rotation, and the geodetic NEU antenna frame), because
the canonical PPP divergence the physics calls for is in the linear
algebra, not the observation model: the same dense SPD weighted normal
system AᵀWA x = AᵀWy the reference assembles from the undifferenced rows
is solved by the owned deterministic Cholesky square-root factorization
(NormalRecipe::CanonicalSquareRoot on
SolverRecipe::OwnedDeterministicCholesky) instead of the reference’s
dense last-tie Gaussian elimination (SolverRecipe::DenseGaussianLastTie).
The square-root solve needs no pivoting, exploits the symmetry of the SPD
normal matrix, and is entirely owned scalar arithmetic (no nalgebra, no
BLAS), so it is well-conditioned and the solve itself is bit-portable.
Determinism scope (calibrated, not overstated): unlike canonical RTK, the PPP
measurement model that builds the rows evaluates troposphere mapping,
antenna, and geodetic-frame transcendentals through the platform math
library, so canonical PPP’s overall output is bit-reproducible run-to-run on
a pinned build but is not claimed bit-portable across platforms; only the
owned Cholesky solve carries the cross-platform guarantee.
Sourcepub const fn for_canonical(technique: Technique) -> Option<Self>
pub const fn for_canonical(technique: Technique) -> Option<Self>
The canonical recipe for a technique. Canonical SPP (P6 increment 1),
canonical RTK (P6 increment 2), and canonical PPP (P6 increment 3) are all
wired, so every technique has a canonical strategy. Returns Option to keep
the resolver’s “not yet implemented” surface stable.
Sourcepub const fn for_reference(
technique: Technique,
target: ReferenceTarget,
) -> Option<Self>
pub const fn for_reference( technique: Technique, target: ReferenceTarget, ) -> Option<Self>
The reference recipe for an explicit (technique, target) pair, or None
if the pair is not a supported reference strategy. This is the single
source of truth for which targets each technique can run: only the wired
reference oracles (Skyfield for SPP, RTKLIB for RTK, the PPP oracle for
PPP) and the SPP owned deterministic solver are valid. Every other pair
(a cross-technique oracle, or the unwired scipy host-LAPACK reference) is
rejected so an impossible strategy can never silently run a mismatched
recipe.
Trait Implementations§
Source§impl Clone for EstimationRecipe
impl Clone for EstimationRecipe
Source§fn clone(&self) -> EstimationRecipe
fn clone(&self) -> EstimationRecipe
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for EstimationRecipe
Source§impl Debug for EstimationRecipe
impl Debug for EstimationRecipe
Source§impl Default for EstimationRecipe
impl Default for EstimationRecipe
Source§fn default() -> EstimationRecipe
fn default() -> EstimationRecipe
impl Eq for EstimationRecipe
Source§impl Hash for EstimationRecipe
impl Hash for EstimationRecipe
Source§impl PartialEq for EstimationRecipe
impl PartialEq for EstimationRecipe
Source§fn eq(&self, other: &EstimationRecipe) -> bool
fn eq(&self, other: &EstimationRecipe) -> bool
self and other values to be equal, and is used by ==.impl StructuralPartialEq for EstimationRecipe
Auto Trait Implementations§
impl Freeze for EstimationRecipe
impl RefUnwindSafe for EstimationRecipe
impl Send for EstimationRecipe
impl Sync for EstimationRecipe
impl Unpin for EstimationRecipe
impl UnsafeUnpin for EstimationRecipe
impl UnwindSafe for EstimationRecipe
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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 moreSource§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Scalar for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.