@neilberkman/sidereon 0.13.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -116,6 +116,127 @@ export interface SppBatchOptions {
116
116
  maxPdop?: number;
117
117
  }
118
118
 
119
+ /** Serialized observability tier label. Handle getters return the generated
120
+ * `ObservabilityTier` enum; serde-returning APIs use these stable labels. */
121
+ export type ObservabilityTierLabel = "RankDeficient" | "ZeroRedundancy" | "Weak" | "Nominal";
122
+
123
+ /** Geometry observability and covariance-validation diagnostics.
124
+ * `ZeroRedundancy` marks a full-rank design with no residual degrees of freedom,
125
+ * so snapshot covariance bounds are unvalidated unless a propagated prior is
126
+ * present. `Weak` means a condition-number or GDOP cutoff was exceeded; the
127
+ * returned bounds are reported as computed and are not clamped. */
128
+ export interface GeometryQualityObject {
129
+ tier: ObservabilityTierLabel;
130
+ /** Observation redundancy, `nObs - nParams`. */
131
+ redundancy: number;
132
+ /** Rank of the design matrix used by the solve. */
133
+ rank: number;
134
+ /** Singular-value condition number of the design matrix. */
135
+ conditionNumber: number;
136
+ /** Geometric dilution of precision for the solved state. */
137
+ gdop: number;
138
+ /** Whether residual-based RAIM can test the solve. */
139
+ raimCheckable: boolean;
140
+ /** Whether residuals or a propagated prior validated the covariance bound. */
141
+ covarianceValidated: boolean;
142
+ }
143
+
144
+ // --- Source localization ----------------------------------------------------
145
+ //
146
+ // Source-localization functions deserialize inputs and serialize outputs through
147
+ // serde, so wasm-bindgen types them as `any`. Import:
148
+ //
149
+ // import { locateSource } from "@neilberkman/sidereon";
150
+ // import type { SourceSensor, SourceLocateOptions, SourceSolution } from "@neilberkman/sidereon/types";
151
+
152
+ /** One source-localization sensor. Coordinates are caller-chosen Cartesian metres. */
153
+ export interface SourceSensor {
154
+ positionM: number[];
155
+ /** Per-sensor propagation speed, metres per second. */
156
+ propagationSpeedMS?: number;
157
+ }
158
+
159
+ /** Source solve mode selector. */
160
+ export type SourceSolveMode = "toa" | { mode: "tdoa"; referenceSensor: number };
161
+
162
+ /** Options for `locateSource`. */
163
+ export interface SourceLocateOptions {
164
+ mode?: "toa" | "tdoa";
165
+ referenceSensor?: number;
166
+ timingSigmaS?: number;
167
+ loss?: "linear" | "softL1" | "soft_l1" | "huber" | "cauchy" | "arctan";
168
+ fScaleS?: number;
169
+ ftol?: number;
170
+ xtol?: number;
171
+ gtol?: number;
172
+ maxNfev?: number;
173
+ }
174
+
175
+ /** Closed-form seed used by source localization. */
176
+ export interface SourceInitialGuess {
177
+ positionM: number[];
178
+ originTimeS?: number;
179
+ residualRmsS: number;
180
+ }
181
+
182
+ /** One source-localization residual row. */
183
+ export interface SourceResidual {
184
+ sensorIndex: number;
185
+ referenceSensorIndex?: number;
186
+ residualS: number;
187
+ }
188
+
189
+ /** Per-sensor source-localization influence diagnostic. */
190
+ export interface SourceSensorInfluence {
191
+ sensorIndex: number;
192
+ residualS: number;
193
+ leaveOneOutResidualS?: number;
194
+ positionDeltaM?: number;
195
+ originTimeDeltaS?: number;
196
+ lossWeight: number;
197
+ score: number;
198
+ }
199
+
200
+ /** Source-localization covariance. */
201
+ export interface SourceCovariance {
202
+ state: number[][];
203
+ positionM2: number[][];
204
+ originTimeS2?: number;
205
+ timingSigmaS: number;
206
+ }
207
+
208
+ /** Source solution returned by `locateSource`. */
209
+ export interface SourceSolution {
210
+ positionM: number[];
211
+ originTimeS?: number;
212
+ covariance?: SourceCovariance;
213
+ residuals: SourceResidual[];
214
+ perSensorInfluence: SourceSensorInfluence[];
215
+ geometryQuality: GeometryQualityObject;
216
+ initialGuess: SourceInitialGuess;
217
+ status: number;
218
+ nfev: number;
219
+ njev: number;
220
+ cost: number;
221
+ optimality: number;
222
+ }
223
+
224
+ /** DOP scalars returned by `sourceDop` and nested in `sourceCrlb`. */
225
+ export interface SourceDop {
226
+ gdop: number;
227
+ pdop: number;
228
+ hdop: number;
229
+ vdop: number;
230
+ tdop: number;
231
+ systemTdops: { system: string; tdop: number }[];
232
+ }
233
+
234
+ /** Cramer-Rao lower bound returned by `sourceCrlb`. */
235
+ export interface SourceCrlb {
236
+ dop: SourceDop;
237
+ covariance: SourceCovariance;
238
+ }
239
+
119
240
  // --- Observable-domain plain-object inputs ----------------------------------
120
241
  //
121
242
  // The wasm-bindgen surface types these arguments as `any` because they cross
@@ -247,8 +368,95 @@ export interface AcquisitionOptions {
247
368
  // import { propagateState } from "@neilberkman/sidereon";
248
369
  // import type { PropagateStateRequest } from "@neilberkman/sidereon/types";
249
370
 
371
+ /** Space-weather constants for a drag request. */
372
+ export interface SpaceWeatherConfig {
373
+ f107?: number;
374
+ f107a?: number;
375
+ ap?: number;
376
+ }
377
+
378
+ /** Atmospheric drag parameterization. */
379
+ export interface DragConfig {
380
+ bcFactorM2Kg?: number;
381
+ ballisticCoefficientKgM2?: number;
382
+ cd?: number;
383
+ areaM2?: number;
384
+ massKg?: number;
385
+ cutoffAltitudeKm?: number;
386
+ spaceWeather?: SpaceWeatherConfig;
387
+ }
388
+
389
+ /** Cannonball solar-radiation-pressure parameters. */
390
+ export interface SolarRadiationPressureConfig {
391
+ cr: number;
392
+ areaToMassM2Kg?: number;
393
+ areaM2?: number;
394
+ massKg?: number;
395
+ pressureNM2?: number;
396
+ auKm?: number;
397
+ }
398
+
399
+ /** Zonal harmonic gravity selector. */
400
+ export interface ZonalForceConfig {
401
+ maxDegree?: 2 | 3 | 4 | 5 | 6;
402
+ j2?: boolean;
403
+ j3?: boolean;
404
+ j4?: boolean;
405
+ j5?: boolean;
406
+ j6?: boolean;
407
+ muKm3S2?: number;
408
+ reKm?: number;
409
+ coefficients?: {
410
+ j2?: number;
411
+ j3?: number;
412
+ j4?: number;
413
+ j5?: number;
414
+ j6?: number;
415
+ };
416
+ }
417
+
418
+ /** Sun/Moon third-body force selector. */
419
+ export interface ThirdBodyForceConfig {
420
+ sun?: boolean;
421
+ moon?: boolean;
422
+ gmSunKm3S2?: number;
423
+ gmMoonKm3S2?: number;
424
+ }
425
+
426
+ /** Schwarzschild relativity force selector. */
427
+ export interface RelativityForceConfig {
428
+ muKm3S2?: number;
429
+ cKmS?: number;
430
+ }
431
+
432
+ /** Additive numerical force-model composition. */
433
+ export interface CompositeForceModelConfig {
434
+ kind: "composite";
435
+ twoBody?: boolean;
436
+ twoBodyMuKm3S2?: number;
437
+ muKm3S2?: number;
438
+ zonal?: boolean | "none" | "j2" | "j2_j6" | "j2ThroughJ6" | ZonalForceConfig;
439
+ thirdBody?: boolean | "none" | "sun" | "moon" | "sun_moon" | "sunMoon" | ThirdBodyForceConfig;
440
+ solarRadiationPressure?: false | "none" | SolarRadiationPressureConfig;
441
+ srp?: false | "none" | SolarRadiationPressureConfig;
442
+ relativity?: boolean | "none" | "schwarzschild" | RelativityForceConfig;
443
+ }
444
+
445
+ /** Canonical Earth Phase A perturbation set. */
446
+ export interface EarthPhaseAForceModelConfig {
447
+ kind: "earth_phase_a" | "earthPhaseA";
448
+ solarRadiationPressure?: false | "none" | SolarRadiationPressureConfig;
449
+ srp?: false | "none" | SolarRadiationPressureConfig;
450
+ }
451
+
250
452
  /** Numerical state-propagation force model selector. */
251
- export type ForceModel = "two_body" | "two_body_j2";
453
+ export type ForceModel =
454
+ | "two_body"
455
+ | "two_body_j2"
456
+ | "composite"
457
+ | "earth_phase_a"
458
+ | CompositeForceModelConfig
459
+ | EarthPhaseAForceModelConfig;
252
460
 
253
461
  /** Numerical state-propagation integrator selector. */
254
462
  export type Integrator = "dp54" | "rk4";
@@ -282,6 +490,306 @@ export interface PropagateStateRequest {
282
490
  maxSteps?: number;
283
491
  /** Gravitational parameter, km^3/s^2. Defaults to Earth's MU_EARTH. */
284
492
  muKm3S2?: number;
493
+ /** Atmospheric drag layered on the selected force model. */
494
+ drag?: DragConfig;
495
+ }
496
+
497
+ // --- 0.15 capability payloads ----------------------------------------------
498
+
499
+ /** Sidereal filter template selector. */
500
+ export type SiderealTemplateMethod =
501
+ "mean" | "robustMad" | "robust_mad" | { method: "ewma"; alpha: number };
502
+
503
+ /** Options for `siderealFilter(series, periodS, options)`. */
504
+ export interface SiderealFilterOptions {
505
+ sampleIntervalS?: number;
506
+ priorPeriods?: number;
507
+ minCoverage?: number;
508
+ templateMethod?: SiderealTemplateMethod;
509
+ }
510
+
511
+ /** Result returned by `siderealFilter`. */
512
+ export interface SiderealFilterOutput {
513
+ filtered: number[];
514
+ template: number[];
515
+ coverage: number[];
516
+ underCovered: boolean[];
517
+ }
518
+
519
+ /** One period score returned by `periodicityStrength`. */
520
+ export interface PeriodicityStrength {
521
+ periodS: number;
522
+ strength: number;
523
+ }
524
+
525
+ /** WGS84 geodetic coordinate in radians and metres. */
526
+ export interface GeodeticCoordinate {
527
+ latRad: number;
528
+ lonRad: number;
529
+ heightM?: number;
530
+ }
531
+
532
+ /** One geodetic time-series sample. */
533
+ export interface PositionTimeSeriesSample {
534
+ epochYear: number;
535
+ positionM: [number, number, number];
536
+ covarianceM2?: [[number, number, number], [number, number, number], [number, number, number]];
537
+ }
538
+
539
+ /** Position-series frame selector. */
540
+ export type PositionSeriesFrame =
541
+ "enu" | { kind: "enu" } | { kind: "ecef"; reference: GeodeticCoordinate };
542
+
543
+ /** Station position time series passed to geodetic time-series functions. */
544
+ export interface PositionTimeSeries {
545
+ samples: PositionTimeSeriesSample[];
546
+ frame?: PositionSeriesFrame;
547
+ }
548
+
549
+ /** MIDAS velocity options. */
550
+ export interface MidasOptions {
551
+ dominantPeriodYears?: number;
552
+ periodToleranceYears?: number;
553
+ minPairs?: number;
554
+ }
555
+
556
+ /** One MIDAS component diagnostic. */
557
+ export interface MidasComponentStats {
558
+ pairCount: number;
559
+ retainedPairCount: number;
560
+ slopeSigmaMPerYr: number;
561
+ effectivePairCount: number;
562
+ }
563
+
564
+ /** Result returned by `velocityMidas`. */
565
+ export interface MidasVelocity {
566
+ rateEnuMPerYr: [number, number, number];
567
+ sigmaEnuMPerYr: [number, number, number];
568
+ covarianceEnuM2PerYr2: [
569
+ [number, number, number],
570
+ [number, number, number],
571
+ [number, number, number],
572
+ ];
573
+ componentStats: [MidasComponentStats, MidasComponentStats, MidasComponentStats];
574
+ sampleCount: number;
575
+ spanYears: number;
576
+ quality: "nominal" | "shortSpan";
577
+ }
578
+
579
+ /** Trajectory model controls for `fitTrajectory`. */
580
+ export interface TrajectoryModelOptions {
581
+ referenceEpochYear?: number;
582
+ includeAnnual?: boolean;
583
+ includeSemiannual?: boolean;
584
+ offsetEpochsYear?: number[];
585
+ }
586
+
587
+ /** Trajectory fit options. */
588
+ export interface TrajectoryFitOptions {
589
+ loss?: "linear" | "softL1" | "soft_l1" | "huber" | "cauchy" | "arctan";
590
+ fScaleM?: number;
591
+ maxNfev?: number;
592
+ }
593
+
594
+ /** One term in a fitted trajectory model. */
595
+ export interface TrajectoryTerm {
596
+ kind:
597
+ | "position"
598
+ | "velocity"
599
+ | "annualSin"
600
+ | "annualCos"
601
+ | "semiannualSin"
602
+ | "semiannualCos"
603
+ | "offset";
604
+ index?: number;
605
+ epochYear?: number;
606
+ }
607
+
608
+ /** One ENU component in a trajectory fit. */
609
+ export interface TrajectoryComponent {
610
+ positionM: number;
611
+ velocityMPerYr: number;
612
+ annualSinM?: number;
613
+ annualCosM?: number;
614
+ semiannualSinM?: number;
615
+ semiannualCosM?: number;
616
+ offsetsM: number[];
617
+ }
618
+
619
+ /** Result returned by `fitTrajectory`. */
620
+ export interface TrajectoryFit {
621
+ referenceEpochYear: number;
622
+ terms: TrajectoryTerm[];
623
+ components: [TrajectoryComponent, TrajectoryComponent, TrajectoryComponent];
624
+ parameterCovariance: number[][];
625
+ residualRmsEnuM: [number, number, number];
626
+ geometryQuality: GeometryQualityObject;
627
+ status: number;
628
+ nfev: number;
629
+ njev: number;
630
+ cost: number;
631
+ optimality: number;
632
+ }
633
+
634
+ /** Step detection options. */
635
+ export interface StepDetectionOptions {
636
+ windowYears?: number;
637
+ scoreThreshold?: number;
638
+ minOffsetM?: number;
639
+ minSamplesEachSide?: number;
640
+ minSeparationYears?: number;
641
+ midas?: MidasOptions;
642
+ }
643
+
644
+ /** Candidate returned by `detectSteps`. */
645
+ export interface StepCandidate {
646
+ epochYear: number;
647
+ offsetEnuM: [number, number, number];
648
+ score: number;
649
+ beforeCount: number;
650
+ afterCount: number;
651
+ heuristic: "detrendedSlidingMedian";
652
+ }
653
+
654
+ /** Network field request passed to `networkField`. */
655
+ export interface NetworkFieldRequest {
656
+ frame: { origin: GeodeticCoordinate; removeCommonMode?: boolean };
657
+ stations: { id: string; reference: GeodeticCoordinate; series: PositionTimeSeries }[];
658
+ }
659
+
660
+ /** Result returned by `networkField`. */
661
+ export interface NetworkField {
662
+ frame: { origin: Required<GeodeticCoordinate>; removeCommonMode: boolean };
663
+ stations: {
664
+ id: string;
665
+ rateEnuMPerYr: [number, number, number];
666
+ rawRateEnuMPerYr: [number, number, number];
667
+ sigmaEnuMPerYr: [number, number, number];
668
+ localVelocity: MidasVelocity;
669
+ }[];
670
+ commonModeEnuMPerYr: [number, number, number];
671
+ }
672
+
673
+ /** Minimal kinematic solution accepted by `metricsFromKinematicSolution`. */
674
+ export interface KinematicMetricInput {
675
+ positionM: [number, number, number];
676
+ positionCovarianceM2: [
677
+ [number, number, number],
678
+ [number, number, number],
679
+ [number, number, number],
680
+ ];
681
+ clockM?: number;
682
+ ztdResidualM?: number;
683
+ usedSats?: string[];
684
+ innovationRmsM?: number;
685
+ }
686
+
687
+ /** Allan-family deviation curve used by `fitPowerLawNoise`. */
688
+ export interface AllanDeviationCurve {
689
+ tauS: number[];
690
+ deviation: number[];
691
+ n: number[];
692
+ }
693
+
694
+ /** Power-law clock-noise fit options. */
695
+ export interface PowerLawNoiseOptions {
696
+ minPointsPerOctave?: number;
697
+ slopeTolerance?: number;
698
+ scatterTolerance?: number;
699
+ basicTauS?: number;
700
+ measurementBandwidthHz?: number;
701
+ }
702
+
703
+ /** Power-law octave decision. */
704
+ export type PowerLawOctaveDominance =
705
+ | {
706
+ kind: "dominant";
707
+ noiseType: "randomWalkFM" | "flickerFM" | "whiteFM" | "flickerPM" | "whitePM";
708
+ }
709
+ | { kind: "ambiguous" }
710
+ | { kind: "flagged"; flag: "underSampled" | "degenerateDeviation" | "missingModifiedAllan" };
711
+
712
+ /** One classified clock-noise tau octave. */
713
+ export interface PowerLawOctave {
714
+ tauStartS: number;
715
+ tauEndS: number;
716
+ pointCount: number;
717
+ adevSlope?: number;
718
+ mdevSlope?: number;
719
+ slopeScatter?: number;
720
+ dominance: PowerLawOctaveDominance;
721
+ }
722
+
723
+ /** One fitted clock-noise coefficient region. */
724
+ export interface PowerLawNoiseRegion {
725
+ noiseType: "randomWalkFM" | "flickerFM" | "whiteFM" | "flickerPM" | "whitePM";
726
+ tauStartS: number;
727
+ tauEndS: number;
728
+ octaveCount: number;
729
+ pointCount: number;
730
+ meanSlope: number;
731
+ coefficient: number;
732
+ }
733
+
734
+ /** Result returned by `fitPowerLawNoise`. */
735
+ export interface PowerLawNoiseFit {
736
+ dominantPerOctave: PowerLawOctave[];
737
+ coefficients: [number, number, number, number, number];
738
+ regions: PowerLawNoiseRegion[];
739
+ }
740
+
741
+ /** Numerical orbit-fit options. */
742
+ export interface OrbitFitOptions {
743
+ forceModel?: ForceModel;
744
+ muKm3S2?: number;
745
+ integrator?: Integrator;
746
+ integratorOptions?: Pick<
747
+ PropagateStateRequest,
748
+ "absTol" | "relTol" | "initialStepS" | "minStepS" | "maxStepS" | "maxSteps"
749
+ >;
750
+ solverOptions?: { gtol?: number; ftol?: number; xtol?: number; maxNfev?: number };
751
+ linearSolve?: "nalgebraLu" | "nalgebra_lu" | "ownedGaussianFirstTie" | "owned_gaussian_first_tie";
752
+ minLedgerSamples?: number;
753
+ drag?: DragConfig;
754
+ }
755
+
756
+ /** Fitted orbit covariance marker. */
757
+ export type OrbitFitCovariance = { kind: "estimated"; matrix: number[][] } | { kind: "unbounded" };
758
+
759
+ /** One satellite solution in an orbit-fit report. */
760
+ export interface OrbitFitSolution {
761
+ satellite: string;
762
+ initialEpochS: number;
763
+ initialPositionKm: [number, number, number];
764
+ initialVelocityKmS: [number, number, number];
765
+ covariance: OrbitFitCovariance;
766
+ geometryQuality: GeometryQualityObject;
767
+ seedRms3dM: number;
768
+ fitRms3dM: number;
769
+ iterations: number;
770
+ }
771
+
772
+ /** One RTN residual ledger entry. */
773
+ export interface OrbitResidualStats {
774
+ radialRmsM: number;
775
+ alongRmsM: number;
776
+ crossRmsM: number;
777
+ rms3dM: number;
778
+ n: number;
779
+ lowSampleCount: boolean;
780
+ }
781
+
782
+ /** Orbit residual ledger returned in an orbit-fit report. */
783
+ export interface OrbitResidualLedger {
784
+ perSatellite: { satellite: string; stats: OrbitResidualStats }[];
785
+ perConstellation: { system: string; stats: OrbitResidualStats }[];
786
+ arcSpan: { timeScale: string; startJ2000S: number; endJ2000S: number; durationS: number };
787
+ }
788
+
789
+ /** Report returned by `fitSp3PreciseOrbit` and `fitPreciseEphemerisSampleOrbit`. */
790
+ export interface OrbitFitReport {
791
+ fits: OrbitFitSolution[];
792
+ ledger: OrbitResidualLedger;
285
793
  }
286
794
 
287
795
  // --- Covariance propagation -------------------------------------------------
@@ -2683,6 +3191,7 @@ export interface RtkStaticArcFloatSolution {
2683
3191
  phaseRmsM: number;
2684
3192
  weightedRmsM: number;
2685
3193
  nObservations: number;
3194
+ geometryQuality: GeometryQualityObject;
2686
3195
  }
2687
3196
 
2688
3197
  /** Static fixed RTK solution returned inside `RtkStaticArcSolution`. */
@@ -2734,6 +3243,7 @@ export interface RtkValidatedFixedSolution {
2734
3243
 
2735
3244
  /** The full static RTK arc solution returned by `solveStaticRtkArc`. */
2736
3245
  export interface RtkStaticArcSolution {
3246
+ geometryQuality: GeometryQualityObject;
2737
3247
  references: Record<string, string>;
2738
3248
  ambiguityIds: string[];
2739
3249
  ambiguitySatellites: Record<string, string>;
@@ -2774,6 +3284,7 @@ export interface RtkArcEpochSolution {
2774
3284
  usedSatelliteIds: string[];
2775
3285
  search?: RtkArcSearchSummary;
2776
3286
  residuals: RtkArcResidual[];
3287
+ geometryQuality: GeometryQualityObject;
2777
3288
  /** Per-epoch innovation-screen result, present only when the screen is enabled
2778
3289
  * for the arc via `updateOpts.innovationScreen`. */
2779
3290
  innovationScreen?: RtkArcInnovationScreenResult;
@@ -2881,6 +3392,7 @@ export interface RtkWideLaneArcConfig {
2881
3392
 
2882
3393
  /** The wide-lane RTK arc solution returned by `fixWideLaneRtkArc`. */
2883
3394
  export interface RtkWideLaneArcSolution {
3395
+ geometryQuality: GeometryQualityObject;
2884
3396
  references: Record<string, string>;
2885
3397
  wideLaneCycles: Record<string, number>;
2886
3398
  epochs: RtkDualFrequencyArcEpoch[];
@@ -2947,3 +3459,155 @@ export type RtcmMessageInput =
2947
3459
  | RtcmGpsEphemerisInput
2948
3460
  | RtcmGlonassEphemerisInput
2949
3461
  | RtcmUnsupportedInput;
3462
+
3463
+ // ---------------------------------------------------------------------------
3464
+ // Classical reliability and SBAS protection-level plain objects
3465
+ // ---------------------------------------------------------------------------
3466
+
3467
+ /** Result returned by `wtestNoncentrality(alpha, power)`. */
3468
+ export interface WtestNoncentrality {
3469
+ /** Two-sided false-alarm probability supplied by the caller. */
3470
+ alpha: number;
3471
+ /** Detection power supplied by the caller. */
3472
+ power: number;
3473
+ /** Missed-detection probability passed to the core calculation. */
3474
+ beta: number;
3475
+ /** Baarda w-test noncentrality distance. */
3476
+ delta0: number;
3477
+ /** Squared noncentrality distance. */
3478
+ lambda0: number;
3479
+ }
3480
+
3481
+ /** One range-observation row accepted by `reliabilityDesign`. */
3482
+ export interface RangeReliabilityRow {
3483
+ /** Observation identifier echoed into the report. */
3484
+ id: string;
3485
+ /** Linearized design row for this range observation. */
3486
+ designRow: number[];
3487
+ /** Externally supplied one-sigma range model, metres. */
3488
+ sigmaM: number;
3489
+ }
3490
+
3491
+ /** Options accepted by `reliabilityDesign` and `reliabilityAraim`. */
3492
+ export interface ReliabilityOptions {
3493
+ /** Two-sided false-alarm probability for the one-dimensional w-test. */
3494
+ alpha?: number;
3495
+ /** Detection power. Mutually exclusive with `beta`. Defaults to 0.80. */
3496
+ power?: number;
3497
+ /** Missed-detection probability. Mutually exclusive with `power`. */
3498
+ beta?: number;
3499
+ /** Optional precomputed noncentrality parameter. */
3500
+ lambda0Override?: number;
3501
+ /** Alias for `lambda0Override`. */
3502
+ lambda0?: number;
3503
+ /** Redundancy floor below which an observation is uncheckable. */
3504
+ minRedundancy?: number;
3505
+ }
3506
+
3507
+ /** Reliability diagnostics for one observation. */
3508
+ export interface ObservationReliability {
3509
+ /** Observation identifier echoed from the input row. */
3510
+ id: string;
3511
+ /** Redundancy number for this observation. */
3512
+ redundancy: number;
3513
+ /** Minimal detectable bias, metres, or `null` when uncheckable. */
3514
+ mdbM: number | null;
3515
+ /** External effect vector, metres, or `null` when unavailable. */
3516
+ externalEnuM: [number, number, number] | null;
3517
+ /** Bias-to-noise ratio in state space, or `null` when uncheckable. */
3518
+ biasToNoise: number | null;
3519
+ /** True when redundancy is below the reporting floor. */
3520
+ uncheckable: boolean;
3521
+ }
3522
+
3523
+ /** Observation carrying the largest finite MDB in a reliability report. */
3524
+ export interface ReliabilityMaxMdb {
3525
+ /** Observation identifier. */
3526
+ id: string;
3527
+ /** Largest finite MDB, metres. */
3528
+ mdbM: number;
3529
+ }
3530
+
3531
+ /** Observation carrying the smallest redundancy number. */
3532
+ export interface ReliabilityMinRedundancy {
3533
+ /** Observation identifier. */
3534
+ id: string;
3535
+ /** Smallest redundancy number. */
3536
+ redundancy: number;
3537
+ }
3538
+
3539
+ /** Aggregate reliability diagnostics for a design. */
3540
+ export interface ReliabilitySummary {
3541
+ /** Number of observations in the design. */
3542
+ nObs: number;
3543
+ /** Number of estimated parameters in the design. */
3544
+ nParams: number;
3545
+ /** Algebraic degrees of freedom, `nObs - nParams`. */
3546
+ dof: number;
3547
+ /** Sum of per-observation redundancy numbers. */
3548
+ sumRedundancy: number;
3549
+ /** Noncentrality parameter used for MDB calculations. */
3550
+ lambda0: number;
3551
+ /** Largest finite MDB, or `null` if no observation is checkable. */
3552
+ maxMdbM: ReliabilityMaxMdb | null;
3553
+ /** Smallest redundancy number and its observation identifier. */
3554
+ minRedundancy: ReliabilityMinRedundancy;
3555
+ /** Count of observations reported as uncheckable. */
3556
+ nUncheckable: number;
3557
+ }
3558
+
3559
+ /** Full reliability design report. */
3560
+ export interface ReliabilityReport {
3561
+ /** Per-observation reliability diagnostics, in input order. */
3562
+ perObservation: ObservationReliability[];
3563
+ /** Aggregate design diagnostics. */
3564
+ summary: ReliabilitySummary;
3565
+ }
3566
+
3567
+ /** One SBAS or ARAIM protection-geometry row. */
3568
+ export interface ProtectionRow {
3569
+ /** Satellite token such as `"G01"`. */
3570
+ id: string;
3571
+ /** ECEF line-of-sight unit vector. */
3572
+ lineOfSight: [number, number, number];
3573
+ /** Optional GNSS system label. Defaults to the system encoded in `id`. */
3574
+ system?: string;
3575
+ /** Satellite elevation angle, radians. */
3576
+ elevationRad: number;
3577
+ }
3578
+
3579
+ /** Receiver coordinates used by SBAS and ARAIM protection geometry. */
3580
+ export interface ProtectionReceiver {
3581
+ /** Geodetic latitude, radians. */
3582
+ latRad: number;
3583
+ /** Geodetic longitude, radians east. */
3584
+ lonRad: number;
3585
+ /** Ellipsoidal height above WGS84, metres. */
3586
+ heightM: number;
3587
+ }
3588
+
3589
+ /** Protection geometry accepted by `sbasProtectionLevels` and `reliabilityAraim`. */
3590
+ export interface ProtectionGeometry {
3591
+ /** Satellite rows in input order. */
3592
+ rows: ProtectionRow[];
3593
+ /** Receiver geodetic coordinates. */
3594
+ receiver: ProtectionReceiver;
3595
+ /** Active receiver clock systems, such as `["G"]`. */
3596
+ clockSystems: string[];
3597
+ }
3598
+
3599
+ /** Plain-object row accepted by `new SbasErrorModel(rows)`. */
3600
+ export interface SbasSisErrorInput {
3601
+ /** Satellite token matching a protection-geometry row. */
3602
+ id: string;
3603
+ /** Total one-sigma range term, metres. Mutually exclusive with components. */
3604
+ sigmaM?: number;
3605
+ /** Fast and long-term correction residual sigma, metres. */
3606
+ sigmaFltM?: number;
3607
+ /** User ionospheric range-error sigma, metres. */
3608
+ sigmaUireM?: number;
3609
+ /** Airborne receiver noise, divergence, and multipath sigma, metres. */
3610
+ sigmaAirM?: number;
3611
+ /** Tropospheric residual sigma, metres. */
3612
+ sigmaTropoM?: number;
3613
+ }