@neilberkman/sidereon 0.12.0 → 0.14.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.
package/pkg/sidereon.js CHANGED
@@ -875,6 +875,43 @@ export class BroadcastEphemeris {
875
875
  const ret = wasm.broadcastephemeris_leapSeconds(this.__wbg_ptr);
876
876
  return ret[0] === 0 ? undefined : ret[1];
877
877
  }
878
+ /**
879
+ * Query ECEF position and clock for parallel satellite and epoch arrays
880
+ * against this parsed broadcast ephemeris store.
881
+ *
882
+ * `satellites[i]` is evaluated at `epochsJ2000S[i]`, where epochs are
883
+ * seconds since J2000 in GPST for GNSS broadcast records. The returned
884
+ * plain object has aligned `positionsEcefM`, `clocksS`, `statuses`, and
885
+ * `elementResults` arrays.
886
+ * @param {any} satellites
887
+ * @param {any} epochs_j2000_s
888
+ * @returns {any}
889
+ */
890
+ observableStatesAtJ2000S(satellites, epochs_j2000_s) {
891
+ const ret = wasm.broadcastephemeris_observableStatesAtJ2000S(this.__wbg_ptr, satellites, epochs_j2000_s);
892
+ if (ret[2]) {
893
+ throw takeFromExternrefTable0(ret[1]);
894
+ }
895
+ return takeFromExternrefTable0(ret[0]);
896
+ }
897
+ /**
898
+ * Query ECEF position and clock for many satellites at one epoch against
899
+ * this parsed broadcast ephemeris store.
900
+ *
901
+ * `epochJ2000S` is seconds since J2000 in GPST. The returned object follows
902
+ * the same contract as
903
+ * [`observableStatesAtJ2000S`](Self::observable_states_at_j2000_s).
904
+ * @param {any} satellites
905
+ * @param {number} epoch_j2000_s
906
+ * @returns {any}
907
+ */
908
+ observableStatesAtSharedJ2000S(satellites, epoch_j2000_s) {
909
+ const ret = wasm.broadcastephemeris_observableStatesAtSharedJ2000S(this.__wbg_ptr, satellites, epoch_j2000_s);
910
+ if (ret[2]) {
911
+ throw takeFromExternrefTable0(ret[1]);
912
+ }
913
+ return takeFromExternrefTable0(ret[0]);
914
+ }
878
915
  /**
879
916
  * Number of usable GPS, Galileo, and BeiDou records.
880
917
  * @returns {number}
@@ -4708,6 +4745,85 @@ export class GeoidGrid {
4708
4745
  }
4709
4746
  if (Symbol.dispose) GeoidGrid.prototype[Symbol.dispose] = GeoidGrid.prototype.free;
4710
4747
 
4748
+ /**
4749
+ * Geometry observability and covariance-validation diagnostics.
4750
+ */
4751
+ export class GeometryQuality {
4752
+ static __wrap(ptr) {
4753
+ const obj = Object.create(GeometryQuality.prototype);
4754
+ obj.__wbg_ptr = ptr;
4755
+ GeometryQualityFinalization.register(obj, obj.__wbg_ptr, obj);
4756
+ return obj;
4757
+ }
4758
+ __destroy_into_raw() {
4759
+ const ptr = this.__wbg_ptr;
4760
+ this.__wbg_ptr = 0;
4761
+ GeometryQualityFinalization.unregister(this);
4762
+ return ptr;
4763
+ }
4764
+ free() {
4765
+ const ptr = this.__destroy_into_raw();
4766
+ wasm.__wbg_geometryquality_free(ptr, 0);
4767
+ }
4768
+ /**
4769
+ * Singular-value condition number of the design matrix.
4770
+ * @returns {number}
4771
+ */
4772
+ get conditionNumber() {
4773
+ const ret = wasm.geometryquality_conditionNumber(this.__wbg_ptr);
4774
+ return ret;
4775
+ }
4776
+ /**
4777
+ * Whether residuals or a propagated prior validated the covariance bound.
4778
+ * @returns {boolean}
4779
+ */
4780
+ get covarianceValidated() {
4781
+ const ret = wasm.geometryquality_covarianceValidated(this.__wbg_ptr);
4782
+ return ret !== 0;
4783
+ }
4784
+ /**
4785
+ * Geometric dilution of precision for the solved state.
4786
+ * @returns {number}
4787
+ */
4788
+ get gdop() {
4789
+ const ret = wasm.geometryquality_gdop(this.__wbg_ptr);
4790
+ return ret;
4791
+ }
4792
+ /**
4793
+ * Whether residual-based RAIM can test the solve.
4794
+ * @returns {boolean}
4795
+ */
4796
+ get raimCheckable() {
4797
+ const ret = wasm.geometryquality_raimCheckable(this.__wbg_ptr);
4798
+ return ret !== 0;
4799
+ }
4800
+ /**
4801
+ * Rank of the design matrix used by the solve.
4802
+ * @returns {number}
4803
+ */
4804
+ get rank() {
4805
+ const ret = wasm.geometryquality_rank(this.__wbg_ptr);
4806
+ return ret >>> 0;
4807
+ }
4808
+ /**
4809
+ * Observation redundancy, `nObs - nParams`.
4810
+ * @returns {number}
4811
+ */
4812
+ get redundancy() {
4813
+ const ret = wasm.geometryquality_redundancy(this.__wbg_ptr);
4814
+ return ret;
4815
+ }
4816
+ /**
4817
+ * Observability and validation tier.
4818
+ * @returns {ObservabilityTier}
4819
+ */
4820
+ get tier() {
4821
+ const ret = wasm.geometryquality_tier(this.__wbg_ptr);
4822
+ return ret;
4823
+ }
4824
+ }
4825
+ if (Symbol.dispose) GeometryQuality.prototype[Symbol.dispose] = GeometryQuality.prototype.free;
4826
+
4711
4827
  /**
4712
4828
  * One GLONASS broadcast state-vector record. `toeUtcJ2000S` is UTC seconds past
4713
4829
  * J2000; position is PZ-90.11 ECEF metres, velocity m/s, acceleration m/s^2.
@@ -8125,6 +8241,35 @@ export class ObsPhaseShift {
8125
8241
  }
8126
8242
  if (Symbol.dispose) ObsPhaseShift.prototype[Symbol.dispose] = ObsPhaseShift.prototype.free;
8127
8243
 
8244
+ /**
8245
+ * Observability and validation tier for an estimation design.
8246
+ *
8247
+ * `ZeroRedundancy` means the design is full rank but has no residual degrees of
8248
+ * freedom, so snapshot-solve covariance bounds are unvalidated unless a
8249
+ * propagated prior is present. `Weak` means the design exceeded the configured
8250
+ * condition-number or GDOP cutoff; the returned bounds are reported as computed
8251
+ * and are not clamped.
8252
+ * @enum {0 | 1 | 2 | 3}
8253
+ */
8254
+ export const ObservabilityTier = Object.freeze({
8255
+ /**
8256
+ * At least one estimated parameter is not observable.
8257
+ */
8258
+ RankDeficient: 0, "0": "RankDeficient",
8259
+ /**
8260
+ * Full rank with no residual degrees of freedom.
8261
+ */
8262
+ ZeroRedundancy: 1, "1": "ZeroRedundancy",
8263
+ /**
8264
+ * Full rank with residual degrees of freedom, but above a cutoff.
8265
+ */
8266
+ Weak: 2, "2": "Weak",
8267
+ /**
8268
+ * Full rank and within the configured cutoffs.
8269
+ */
8270
+ Nominal: 3, "3": "Nominal",
8271
+ });
8272
+
8128
8273
  /**
8129
8274
  * Optional observation-code allow-list for raw and carrier-phase rows. Build
8130
8275
  * with `new ObservationFilter()` then chain `.withSystem(system, codes)`.
@@ -10929,6 +11074,159 @@ export class PppFloatSolution {
10929
11074
  }
10930
11075
  if (Symbol.dispose) PppFloatSolution.prototype[Symbol.dispose] = PppFloatSolution.prototype.free;
10931
11076
 
11077
+ /**
11078
+ * A reusable precise-ephemeris interpolant with cached per-satellite nodes.
11079
+ *
11080
+ * Build this handle once from a parsed [`Sp3`] product, raw precise samples, or
11081
+ * a [`PreciseEphemerisSampleSource`], then reuse it for many state or range
11082
+ * queries. The handle delegates to
11083
+ * `sidereon_core::ephemeris::PreciseEphemerisInterpolant`; ECEF positions are
11084
+ * metres, clocks are seconds, and query epochs are seconds since J2000 in the
11085
+ * source time scale.
11086
+ */
11087
+ export class PreciseEphemerisInterpolant {
11088
+ static __wrap(ptr) {
11089
+ const obj = Object.create(PreciseEphemerisInterpolant.prototype);
11090
+ obj.__wbg_ptr = ptr;
11091
+ PreciseEphemerisInterpolantFinalization.register(obj, obj.__wbg_ptr, obj);
11092
+ return obj;
11093
+ }
11094
+ __destroy_into_raw() {
11095
+ const ptr = this.__wbg_ptr;
11096
+ this.__wbg_ptr = 0;
11097
+ PreciseEphemerisInterpolantFinalization.unregister(this);
11098
+ return ptr;
11099
+ }
11100
+ free() {
11101
+ const ptr = this.__destroy_into_raw();
11102
+ wasm.__wbg_preciseephemerisinterpolant_free(ptr, 0);
11103
+ }
11104
+ /**
11105
+ * Build a cached interpolant from an existing sample-backed precise source.
11106
+ * @param {PreciseEphemerisSampleSource} source
11107
+ * @returns {PreciseEphemerisInterpolant}
11108
+ */
11109
+ static fromPreciseEphemerisSamples(source) {
11110
+ _assertClass(source, PreciseEphemerisSampleSource);
11111
+ const ret = wasm.preciseephemerisinterpolant_fromPreciseEphemerisSamples(source.__wbg_ptr);
11112
+ return PreciseEphemerisInterpolant.__wrap(ret);
11113
+ }
11114
+ /**
11115
+ * Build a cached interpolant directly from precise samples.
11116
+ *
11117
+ * `samples` is the same array accepted by
11118
+ * [`preciseEphemerisSamplesFromSamples`]: each item has `{ sat, epoch,
11119
+ * positionEcefM, clockS?, clockEvent? }`, with epochs in seconds since
11120
+ * J2000 and positions in ECEF metres. Throws a `TypeError` for malformed
11121
+ * JS input and a `RangeError` for sample validation failures.
11122
+ * @param {any} samples
11123
+ * @returns {PreciseEphemerisInterpolant}
11124
+ */
11125
+ static fromSamples(samples) {
11126
+ const ret = wasm.preciseephemerisinterpolant_fromSamples(samples);
11127
+ if (ret[2]) {
11128
+ throw takeFromExternrefTable0(ret[1]);
11129
+ }
11130
+ return PreciseEphemerisInterpolant.__wrap(ret[0]);
11131
+ }
11132
+ /**
11133
+ * Build a cached interpolant from a parsed SP3 precise product.
11134
+ *
11135
+ * Nodes are copied from the product's native SP3 records. Query epochs are
11136
+ * seconds since J2000 in the SP3 product time scale.
11137
+ * @param {Sp3} sp3
11138
+ * @returns {PreciseEphemerisInterpolant}
11139
+ */
11140
+ static fromSp3(sp3) {
11141
+ _assertClass(sp3, Sp3);
11142
+ const ret = wasm.preciseephemerisinterpolant_fromSp3(sp3.__wbg_ptr);
11143
+ return PreciseEphemerisInterpolant.__wrap(ret);
11144
+ }
11145
+ /**
11146
+ * Query ECEF position and optional clock for parallel satellite and epoch
11147
+ * arrays using this cached interpolant.
11148
+ *
11149
+ * `satellites[i]` is evaluated at `epochsJ2000S[i]`, where epochs are
11150
+ * seconds since J2000 on this handle's time scale. The returned plain
11151
+ * object has aligned `positionsEcefM`, `clocksS`, `statuses`, and
11152
+ * `elementResults` arrays.
11153
+ * @param {any} satellites
11154
+ * @param {any} epochs_j2000_s
11155
+ * @returns {any}
11156
+ */
11157
+ observableStatesAtJ2000S(satellites, epochs_j2000_s) {
11158
+ const ret = wasm.preciseephemerisinterpolant_observableStatesAtJ2000S(this.__wbg_ptr, satellites, epochs_j2000_s);
11159
+ if (ret[2]) {
11160
+ throw takeFromExternrefTable0(ret[1]);
11161
+ }
11162
+ return takeFromExternrefTable0(ret[0]);
11163
+ }
11164
+ /**
11165
+ * Query ECEF position and optional clock for many satellites at one epoch
11166
+ * using this cached interpolant.
11167
+ *
11168
+ * `epochJ2000S` is seconds since J2000 on this handle's time scale. The
11169
+ * returned object follows the same contract as
11170
+ * [`observableStatesAtJ2000S`](Self::observable_states_at_j2000_s).
11171
+ * @param {any} satellites
11172
+ * @param {number} epoch_j2000_s
11173
+ * @returns {any}
11174
+ */
11175
+ observableStatesAtSharedJ2000S(satellites, epoch_j2000_s) {
11176
+ const ret = wasm.preciseephemerisinterpolant_observableStatesAtSharedJ2000S(this.__wbg_ptr, satellites, epoch_j2000_s);
11177
+ if (ret[2]) {
11178
+ throw takeFromExternrefTable0(ret[1]);
11179
+ }
11180
+ return takeFromExternrefTable0(ret[0]);
11181
+ }
11182
+ /**
11183
+ * Predict geometric ranges for many `(satellite, receiver, epoch)`
11184
+ * requests using this cached interpolant.
11185
+ *
11186
+ * `requests` is an array of `{ sat, receiverEcefM, tRxJ2000S }` objects.
11187
+ * Positions are ECEF metres and epochs are seconds since J2000 on this
11188
+ * handle's time scale. The output matches [`Sp3.predictRanges`].
11189
+ * @param {any} requests
11190
+ * @param {any} options
11191
+ * @returns {any}
11192
+ */
11193
+ predictRanges(requests, options) {
11194
+ const ret = wasm.preciseephemerisinterpolant_predictRanges(this.__wbg_ptr, requests, options);
11195
+ if (ret[2]) {
11196
+ throw takeFromExternrefTable0(ret[1]);
11197
+ }
11198
+ return takeFromExternrefTable0(ret[0]);
11199
+ }
11200
+ /**
11201
+ * Satellite tokens this handle can interpolate, ascending.
11202
+ * @returns {string[]}
11203
+ */
11204
+ get satellites() {
11205
+ const ret = wasm.preciseephemerisinterpolant_satellites(this.__wbg_ptr);
11206
+ var v1 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice();
11207
+ wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);
11208
+ return v1;
11209
+ }
11210
+ /**
11211
+ * Source time-scale abbreviation used by this handle's J2000-second axis,
11212
+ * such as `"GPST"`.
11213
+ * @returns {string}
11214
+ */
11215
+ get timeScale() {
11216
+ let deferred1_0;
11217
+ let deferred1_1;
11218
+ try {
11219
+ const ret = wasm.preciseephemerisinterpolant_timeScale(this.__wbg_ptr);
11220
+ deferred1_0 = ret[0];
11221
+ deferred1_1 = ret[1];
11222
+ return getStringFromWasm0(ret[0], ret[1]);
11223
+ } finally {
11224
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
11225
+ }
11226
+ }
11227
+ }
11228
+ if (Symbol.dispose) PreciseEphemerisInterpolant.prototype[Symbol.dispose] = PreciseEphemerisInterpolant.prototype.free;
11229
+
10932
11230
  /**
10933
11231
  * A precise-ephemeris source built from samples rather than parsed SP3 text.
10934
11232
  *
@@ -10953,6 +11251,44 @@ export class PreciseEphemerisSampleSource {
10953
11251
  const ptr = this.__destroy_into_raw();
10954
11252
  wasm.__wbg_preciseephemerissamplesource_free(ptr, 0);
10955
11253
  }
11254
+ /**
11255
+ * Query ECEF position and optional clock for parallel satellite and epoch
11256
+ * arrays against this sample-backed precise source.
11257
+ *
11258
+ * `satellites[i]` is evaluated at `epochsJ2000S[i]`, where epochs are
11259
+ * seconds since J2000 on the source time scale. The returned plain object
11260
+ * has aligned `positionsEcefM`, `clocksS`, `statuses`, and
11261
+ * `elementResults` arrays. Failed elements use the core missing-position
11262
+ * sentinel and carry the scalar engine error in `elementResults[i].error`.
11263
+ * @param {any} satellites
11264
+ * @param {any} epochs_j2000_s
11265
+ * @returns {any}
11266
+ */
11267
+ observableStatesAtJ2000S(satellites, epochs_j2000_s) {
11268
+ const ret = wasm.preciseephemerissamplesource_observableStatesAtJ2000S(this.__wbg_ptr, satellites, epochs_j2000_s);
11269
+ if (ret[2]) {
11270
+ throw takeFromExternrefTable0(ret[1]);
11271
+ }
11272
+ return takeFromExternrefTable0(ret[0]);
11273
+ }
11274
+ /**
11275
+ * Query ECEF position and optional clock for many satellites at one epoch
11276
+ * against this sample-backed precise source.
11277
+ *
11278
+ * `epochJ2000S` is seconds since J2000 on the source time scale. The
11279
+ * returned plain object follows the same contract as
11280
+ * [`observableStatesAtJ2000S`](Self::observable_states_at_j2000_s).
11281
+ * @param {any} satellites
11282
+ * @param {number} epoch_j2000_s
11283
+ * @returns {any}
11284
+ */
11285
+ observableStatesAtSharedJ2000S(satellites, epoch_j2000_s) {
11286
+ const ret = wasm.preciseephemerissamplesource_observableStatesAtSharedJ2000S(this.__wbg_ptr, satellites, epoch_j2000_s);
11287
+ if (ret[2]) {
11288
+ throw takeFromExternrefTable0(ret[1]);
11289
+ }
11290
+ return takeFromExternrefTable0(ret[0]);
11291
+ }
10956
11292
  /**
10957
11293
  * Predict geometric ranges for many requests in one call. See the shared
10958
11294
  * [`predictRanges`](crate::precise_samples::predict_ranges_over) contract;
@@ -12192,6 +12528,15 @@ export class RtkFixedSolution {
12192
12528
  wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
12193
12529
  return v1;
12194
12530
  }
12531
+ /**
12532
+ * Geometry observability and covariance-validation diagnostics for the
12533
+ * float design used by the integer-fixed solve.
12534
+ * @returns {GeometryQuality}
12535
+ */
12536
+ get geometryQuality() {
12537
+ const ret = wasm.rtkfixedsolution_geometryQuality(this.__wbg_ptr);
12538
+ return GeometryQuality.__wrap(ret);
12539
+ }
12195
12540
  /**
12196
12541
  * @returns {number}
12197
12542
  */
@@ -12223,6 +12568,24 @@ export class RtkFixedSolution {
12223
12568
  wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
12224
12569
  }
12225
12570
  }
12571
+ /**
12572
+ * Whether residual-based RAIM can test the float design used by the
12573
+ * integer-fixed solve.
12574
+ * @returns {boolean}
12575
+ */
12576
+ get raimCheckable() {
12577
+ const ret = wasm.rtkfixedsolution_raimCheckable(this.__wbg_ptr);
12578
+ return ret !== 0;
12579
+ }
12580
+ /**
12581
+ * Observation redundancy, `nObs - nParams`, for the float design used by
12582
+ * the integer-fixed solve.
12583
+ * @returns {number}
12584
+ */
12585
+ get redundancy() {
12586
+ const ret = wasm.rtkfixedsolution_redundancy(this.__wbg_ptr);
12587
+ return ret;
12588
+ }
12226
12589
  }
12227
12590
  if (Symbol.dispose) RtkFixedSolution.prototype[Symbol.dispose] = RtkFixedSolution.prototype.free;
12228
12591
 
@@ -12278,6 +12641,17 @@ export class RtkFloatSolution {
12278
12641
  const ret = wasm.rtkfloatsolution_converged(this.__wbg_ptr);
12279
12642
  return ret !== 0;
12280
12643
  }
12644
+ /**
12645
+ * Geometry observability and covariance-validation diagnostics for the
12646
+ * final double-difference design. `ZeroRedundancy` bounds are unvalidated
12647
+ * for snapshot solves, `Weak` bounds are unclamped, and rank-deficient
12648
+ * designs are returned as a singular-geometry `Error`.
12649
+ * @returns {GeometryQuality}
12650
+ */
12651
+ get geometryQuality() {
12652
+ const ret = wasm.rtkfloatsolution_geometryQuality(this.__wbg_ptr);
12653
+ return GeometryQuality.__wrap(ret);
12654
+ }
12281
12655
  /**
12282
12656
  * @returns {number}
12283
12657
  */
@@ -12299,6 +12673,22 @@ export class RtkFloatSolution {
12299
12673
  const ret = wasm.rtkfloatsolution_phaseRmsM(this.__wbg_ptr);
12300
12674
  return ret;
12301
12675
  }
12676
+ /**
12677
+ * Whether residual-based RAIM can test the float design.
12678
+ * @returns {boolean}
12679
+ */
12680
+ get raimCheckable() {
12681
+ const ret = wasm.rtkfloatsolution_raimCheckable(this.__wbg_ptr);
12682
+ return ret !== 0;
12683
+ }
12684
+ /**
12685
+ * Observation redundancy, `nObs - nParams`, for the float design.
12686
+ * @returns {number}
12687
+ */
12688
+ get redundancy() {
12689
+ const ret = wasm.rtkfloatsolution_redundancy(this.__wbg_ptr);
12690
+ return ret;
12691
+ }
12302
12692
  /**
12303
12693
  * @returns {number}
12304
12694
  */
@@ -12996,6 +13386,44 @@ export class Sp3 {
12996
13386
  }
12997
13387
  return Sp3Interpolation.__wrap(ret[0]);
12998
13388
  }
13389
+ /**
13390
+ * Query ECEF position and optional clock for parallel satellite and epoch
13391
+ * arrays against this parsed SP3 product.
13392
+ *
13393
+ * `satellites[i]` is evaluated at `epochsJ2000S[i]`, where epochs are
13394
+ * seconds since J2000 in the product time scale. The returned plain object
13395
+ * has aligned `positionsEcefM`, `clocksS`, `statuses`, and
13396
+ * `elementResults` arrays. Failed elements use the core missing-position
13397
+ * sentinel and carry the scalar engine error in `elementResults[i].error`.
13398
+ * @param {any} satellites
13399
+ * @param {any} epochs_j2000_s
13400
+ * @returns {any}
13401
+ */
13402
+ observableStatesAtJ2000S(satellites, epochs_j2000_s) {
13403
+ const ret = wasm.sp3_observableStatesAtJ2000S(this.__wbg_ptr, satellites, epochs_j2000_s);
13404
+ if (ret[2]) {
13405
+ throw takeFromExternrefTable0(ret[1]);
13406
+ }
13407
+ return takeFromExternrefTable0(ret[0]);
13408
+ }
13409
+ /**
13410
+ * Query ECEF position and optional clock for many satellites at one epoch
13411
+ * against this parsed SP3 product.
13412
+ *
13413
+ * `epochJ2000S` is seconds since J2000 in the product time scale. The
13414
+ * returned object follows the same contract as
13415
+ * [`observableStatesAtJ2000S`](Self::observable_states_at_j2000_s).
13416
+ * @param {any} satellites
13417
+ * @param {number} epoch_j2000_s
13418
+ * @returns {any}
13419
+ */
13420
+ observableStatesAtSharedJ2000S(satellites, epoch_j2000_s) {
13421
+ const ret = wasm.sp3_observableStatesAtSharedJ2000S(this.__wbg_ptr, satellites, epoch_j2000_s);
13422
+ if (ret[2]) {
13423
+ throw takeFromExternrefTable0(ret[1]);
13424
+ }
13425
+ return takeFromExternrefTable0(ret[0]);
13426
+ }
12999
13427
  /**
13000
13428
  * Predict geometric ranges for many `(satellite, receiver, epoch)` requests
13001
13429
  * against this ephemeris in one call. `requests` is an array of
@@ -14288,6 +14716,17 @@ export class SppSolution {
14288
14716
  }
14289
14717
  return v1;
14290
14718
  }
14719
+ /**
14720
+ * Geometry observability and covariance-validation diagnostics for this
14721
+ * solved design. `ZeroRedundancy` marks unvalidated snapshot covariance
14722
+ * bounds, `Weak` leaves large bounds unclamped, and rank-deficient designs
14723
+ * are returned as a singular-geometry `Error` rather than a solution.
14724
+ * @returns {GeometryQuality}
14725
+ */
14726
+ get geometryQuality() {
14727
+ const ret = wasm.sppsolution_geometryQuality(this.__wbg_ptr);
14728
+ return GeometryQuality.__wrap(ret);
14729
+ }
14291
14730
  /**
14292
14731
  * ECEF position as a `Float64Array` `[x, y, z]`, metres.
14293
14732
  * @returns {Float64Array}
@@ -14298,6 +14737,22 @@ export class SppSolution {
14298
14737
  wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
14299
14738
  return v1;
14300
14739
  }
14740
+ /**
14741
+ * Whether residual-based RAIM can test the accepted solve.
14742
+ * @returns {boolean}
14743
+ */
14744
+ get raimCheckable() {
14745
+ const ret = wasm.sppsolution_raimCheckable(this.__wbg_ptr);
14746
+ return ret !== 0;
14747
+ }
14748
+ /**
14749
+ * Degrees of freedom in the accepted solve: `usedCount - (3 + clocks)`.
14750
+ * @returns {number}
14751
+ */
14752
+ get redundancy() {
14753
+ const ret = wasm.sppsolution_redundancy(this.__wbg_ptr);
14754
+ return ret;
14755
+ }
14301
14756
  /**
14302
14757
  * Post-fit residuals, metres, index-aligned to `usedSats`.
14303
14758
  * @returns {Float64Array}
@@ -15732,6 +16187,78 @@ export function allanDeviation(series, tau0_s, averaging_factors) {
15732
16187
  return takeFromExternrefTable0(ret[0]);
15733
16188
  }
15734
16189
 
16190
+ /**
16191
+ * Alpha-beta measurement update applied to a predicted scalar state.
16192
+ *
16193
+ * `predicted` is `{ level, rate }`, `measurement` has the same unit as
16194
+ * `level`, `dt` is seconds, and `gains` is `{ alpha, beta }`.
16195
+ * @param {any} predicted
16196
+ * @param {number} measurement
16197
+ * @param {number} dt
16198
+ * @param {any} gains
16199
+ * @returns {any}
16200
+ */
16201
+ export function alphaBetaApplyMeasurement(predicted, measurement, dt, gains) {
16202
+ const ret = wasm.alphaBetaApplyMeasurement(predicted, measurement, dt, gains);
16203
+ if (ret[2]) {
16204
+ throw takeFromExternrefTable0(ret[1]);
16205
+ }
16206
+ return takeFromExternrefTable0(ret[0]);
16207
+ }
16208
+
16209
+ /**
16210
+ * Run one alpha-beta predict and measurement update.
16211
+ *
16212
+ * `state` is `{ level, rate }`, `measurement` has the same unit as `level`,
16213
+ * `dt` is seconds, and `gains` is `{ alpha, beta }`. Returns `{ predicted,
16214
+ * updated, innovation }`.
16215
+ * @param {any} state
16216
+ * @param {number} measurement
16217
+ * @param {number} dt
16218
+ * @param {any} gains
16219
+ * @returns {any}
16220
+ */
16221
+ export function alphaBetaFilterStep(state, measurement, dt, gains) {
16222
+ const ret = wasm.alphaBetaFilterStep(state, measurement, dt, gains);
16223
+ if (ret[2]) {
16224
+ throw takeFromExternrefTable0(ret[1]);
16225
+ }
16226
+ return takeFromExternrefTable0(ret[0]);
16227
+ }
16228
+
16229
+ /**
16230
+ * Alpha-beta constant-rate prediction.
16231
+ *
16232
+ * `state` is `{ level, rate }` and `dt` is the positive propagation interval in
16233
+ * seconds. Returns the predicted `{ level, rate }`.
16234
+ * @param {any} state
16235
+ * @param {number} dt
16236
+ * @returns {any}
16237
+ */
16238
+ export function alphaBetaPredict(state, dt) {
16239
+ const ret = wasm.alphaBetaPredict(state, dt);
16240
+ if (ret[2]) {
16241
+ throw takeFromExternrefTable0(ret[1]);
16242
+ }
16243
+ return takeFromExternrefTable0(ret[0]);
16244
+ }
16245
+
16246
+ /**
16247
+ * Steady-state alpha-beta gains from a positive tracking index.
16248
+ *
16249
+ * Returns `{ alpha, beta }`, where `alpha` is the level gain and `beta` maps
16250
+ * innovation to rate through `beta * innovation / dt`.
16251
+ * @param {number} tracking_index
16252
+ * @returns {any}
16253
+ */
16254
+ export function alphaBetaSteadyStateGains(tracking_index) {
16255
+ const ret = wasm.alphaBetaSteadyStateGains(tracking_index);
16256
+ if (ret[2]) {
16257
+ throw takeFromExternrefTable0(ret[1]);
16258
+ }
16259
+ return takeFromExternrefTable0(ret[0]);
16260
+ }
16261
+
15735
16262
  /**
15736
16263
  * On-sky angle in degrees between two direction vectors.
15737
16264
  * @param {Float64Array} a
@@ -15990,6 +16517,87 @@ export function carrierFrequencyHz(system, band) {
15990
16517
  return ret[0] === 0 ? undefined : ret[1];
15991
16518
  }
15992
16519
 
16520
+ /**
16521
+ * CA-CFAR false alarm probability from searched-cell count, absolute
16522
+ * threshold, and mean noise level.
16523
+ * @param {number} searched_cells
16524
+ * @param {number} threshold
16525
+ * @param {number} noise_level
16526
+ * @returns {number}
16527
+ */
16528
+ export function cfarCaFalseAlarmProbability(searched_cells, threshold, noise_level) {
16529
+ const ret = wasm.cfarCaFalseAlarmProbability(searched_cells, threshold, noise_level);
16530
+ if (ret[2]) {
16531
+ throw takeFromExternrefTable0(ret[1]);
16532
+ }
16533
+ return ret[0];
16534
+ }
16535
+
16536
+ /**
16537
+ * CA-CFAR threshold multiplier from searched-cell count and target false alarm
16538
+ * probability.
16539
+ * @param {number} searched_cells
16540
+ * @param {number} false_alarm_probability
16541
+ * @returns {number}
16542
+ */
16543
+ export function cfarCaMultiplierFromPfa(searched_cells, false_alarm_probability) {
16544
+ const ret = wasm.cfarCaMultiplierFromPfa(searched_cells, false_alarm_probability);
16545
+ if (ret[2]) {
16546
+ throw takeFromExternrefTable0(ret[1]);
16547
+ }
16548
+ return ret[0];
16549
+ }
16550
+
16551
+ /**
16552
+ * CA-CFAR false alarm probability from searched-cell count and multiplier.
16553
+ * @param {number} searched_cells
16554
+ * @param {number} multiplier
16555
+ * @returns {number}
16556
+ */
16557
+ export function cfarCaPfaFromMultiplier(searched_cells, multiplier) {
16558
+ const ret = wasm.cfarCaPfaFromMultiplier(searched_cells, multiplier);
16559
+ if (ret[2]) {
16560
+ throw takeFromExternrefTable0(ret[1]);
16561
+ }
16562
+ return ret[0];
16563
+ }
16564
+
16565
+ /**
16566
+ * CA-CFAR absolute threshold from searched-cell count, target false alarm
16567
+ * probability, and mean noise level.
16568
+ * @param {number} searched_cells
16569
+ * @param {number} false_alarm_probability
16570
+ * @param {number} noise_level
16571
+ * @returns {number}
16572
+ */
16573
+ export function cfarCaThreshold(searched_cells, false_alarm_probability, noise_level) {
16574
+ const ret = wasm.cfarCaThreshold(searched_cells, false_alarm_probability, noise_level);
16575
+ if (ret[2]) {
16576
+ throw takeFromExternrefTable0(ret[1]);
16577
+ }
16578
+ return ret[0];
16579
+ }
16580
+
16581
+ /**
16582
+ * Compute the closed-form Chan-Ho seed used by [`locateSource`].
16583
+ *
16584
+ * `mode` is `"toa"`, `"tdoa"`, or `{ mode: "tdoa", referenceSensor }`.
16585
+ * Per-sensor speed overrides are not used by the closed-form equations, but
16586
+ * they are used by [`locateSource`] during iterative refinement.
16587
+ * @param {any} sensors
16588
+ * @param {any} arrival_times_s
16589
+ * @param {number} propagation_speed_m_s
16590
+ * @param {any} mode
16591
+ * @returns {any}
16592
+ */
16593
+ export function chanHoInitialGuess(sensors, arrival_times_s, propagation_speed_m_s, mode) {
16594
+ const ret = wasm.chanHoInitialGuess(sensors, arrival_times_s, propagation_speed_m_s, mode);
16595
+ if (ret[2]) {
16596
+ throw takeFromExternrefTable0(ret[1]);
16597
+ }
16598
+ return takeFromExternrefTable0(ret[0]);
16599
+ }
16600
+
15993
16601
  /**
15994
16602
  * Returns `true` when a diff has any findings.
15995
16603
  * @param {any} diff
@@ -17074,6 +17682,39 @@ export function estimateDecayWithSpaceWeather(drag, table, request) {
17074
17682
  return takeFromExternrefTable0(ret[0]);
17075
17683
  }
17076
17684
 
17685
+ /**
17686
+ * Exponentially weighted moving-average update.
17687
+ *
17688
+ * `alpha` must be in `[0, 1]`; the returned value is
17689
+ * `previous + alpha * (sample - previous)`.
17690
+ * @param {number} previous
17691
+ * @param {number} sample
17692
+ * @param {number} alpha
17693
+ * @returns {number}
17694
+ */
17695
+ export function ewmaUpdate(previous, sample, alpha) {
17696
+ const ret = wasm.ewmaUpdate(previous, sample, alpha);
17697
+ if (ret[2]) {
17698
+ throw takeFromExternrefTable0(ret[1]);
17699
+ }
17700
+ return ret[0];
17701
+ }
17702
+
17703
+ /**
17704
+ * EWMA update with `alpha = 1 / 2^shift`.
17705
+ * @param {number} previous
17706
+ * @param {number} sample
17707
+ * @param {number} shift
17708
+ * @returns {number}
17709
+ */
17710
+ export function ewmaUpdatePowerOfTwo(previous, sample, shift) {
17711
+ const ret = wasm.ewmaUpdatePowerOfTwo(previous, sample, shift);
17712
+ if (ret[2]) {
17713
+ throw takeFromExternrefTable0(ret[1]);
17714
+ }
17715
+ return ret[0];
17716
+ }
17717
+
17077
17718
  /**
17078
17719
  * Find Moon elevation threshold crossings (moonrise / moonset) over a UTC
17079
17720
  * window.
@@ -18203,6 +18844,25 @@ export function jarqueBera(x) {
18203
18844
  return takeFromExternrefTable0(ret[0]);
18204
18845
  }
18205
18846
 
18847
+ /**
18848
+ * Steady-state gains for a scalar constant-velocity Kalman filter.
18849
+ *
18850
+ * `trackingIndex`, `dt`, and `measurementVariance` must be positive. Returns
18851
+ * `{ positionGain, rateGain }`; `rateGain * dt` equals the alpha-beta `beta`
18852
+ * gain for the same tracking index.
18853
+ * @param {number} tracking_index
18854
+ * @param {number} dt
18855
+ * @param {number} measurement_variance
18856
+ * @returns {any}
18857
+ */
18858
+ export function kalmanCvSteadyStateGains(tracking_index, dt, measurement_variance) {
18859
+ const ret = wasm.kalmanCvSteadyStateGains(tracking_index, dt, measurement_variance);
18860
+ if (ret[2]) {
18861
+ throw takeFromExternrefTable0(ret[1]);
18862
+ }
18863
+ return takeFromExternrefTable0(ret[0]);
18864
+ }
18865
+
18206
18866
  /**
18207
18867
  * GPS broadcast Klobuchar ionospheric group delay in the model's native units
18208
18868
  * (positive metres).
@@ -18744,6 +19404,29 @@ export function loadSp3(bytes) {
18744
19404
  return Sp3.__wrap(ret[0]);
18745
19405
  }
18746
19406
 
19407
+ /**
19408
+ * Locate a source from sensor arrival times.
19409
+ *
19410
+ * `sensors` is an array of `{ positionM, propagationSpeedMS? }`; each
19411
+ * `positionM` is a 2D or 3D Cartesian metre vector and all sensors must share
19412
+ * the same dimension. `arrivalTimesS` is an aligned seconds array,
19413
+ * `propagationSpeedMS` is the call-level speed in metres per second, and
19414
+ * `options` may include `mode`, `referenceSensor`, `timingSigmaS`, `loss`,
19415
+ * `fScaleS`, `ftol`, `xtol`, `gtol`, and `maxNfev`.
19416
+ * @param {any} sensors
19417
+ * @param {any} arrival_times_s
19418
+ * @param {number} propagation_speed_m_s
19419
+ * @param {any} options
19420
+ * @returns {any}
19421
+ */
19422
+ export function locateSource(sensors, arrival_times_s, propagation_speed_m_s, options) {
19423
+ const ret = wasm.locateSource(sensors, arrival_times_s, propagation_speed_m_s, options);
19424
+ if (ret[2]) {
19425
+ throw takeFromExternrefTable0(ret[1]);
19426
+ }
19427
+ return takeFromExternrefTable0(ret[0]);
19428
+ }
19429
+
18747
19430
  /**
18748
19431
  * @param {bigint} start_unix_us
18749
19432
  * @param {bigint} end_unix_us
@@ -18795,6 +19478,33 @@ export function lvlhRotation(position_km, velocity_km_s) {
18795
19478
  return v3;
18796
19479
  }
18797
19480
 
19481
+ /**
19482
+ * Gaussian consistency factor applied by [`madSpread`].
19483
+ * @returns {number}
19484
+ */
19485
+ export function madGaussianConsistency() {
19486
+ const ret = wasm.madGaussianConsistency();
19487
+ return ret;
19488
+ }
19489
+
19490
+ /**
19491
+ * Median absolute deviation spread estimate.
19492
+ *
19493
+ * `values` is a JS number array. The returned spread is
19494
+ * `MAD_GAUSSIAN_CONSISTENCY * median(abs(value - median(values)))`, floored by
19495
+ * `scaleFloor`.
19496
+ * @param {any} values
19497
+ * @param {number} scale_floor
19498
+ * @returns {number}
19499
+ */
19500
+ export function madSpread(values, scale_floor) {
19501
+ const ret = wasm.madSpread(values, scale_floor);
19502
+ if (ret[2]) {
19503
+ throw takeFromExternrefTable0(ret[1]);
19504
+ }
19505
+ return ret[0];
19506
+ }
19507
+
18798
19508
  /**
18799
19509
  * @param {number} radius_km
18800
19510
  * @returns {number}
@@ -19204,6 +19914,65 @@ export function nequickGStecTecu(_eval) {
19204
19914
  return ret[0];
19205
19915
  }
19206
19916
 
19917
+ /**
19918
+ * Scalar normalized innovation squared statistic.
19919
+ * @param {number} innovation
19920
+ * @param {number} innovation_variance
19921
+ * @returns {number}
19922
+ */
19923
+ export function nis(innovation, innovation_variance) {
19924
+ const ret = wasm.nis(innovation, innovation_variance);
19925
+ if (ret[2]) {
19926
+ throw takeFromExternrefTable0(ret[1]);
19927
+ }
19928
+ return ret[0];
19929
+ }
19930
+
19931
+ /**
19932
+ * Bar-Shalom expected NIS value for `dof` measurement degrees of freedom.
19933
+ * @param {number} dof
19934
+ * @returns {number}
19935
+ */
19936
+ export function nisExpectedValue(dof) {
19937
+ const ret = wasm.nisExpectedValue(dof);
19938
+ if (ret[2]) {
19939
+ throw takeFromExternrefTable0(ret[1]);
19940
+ }
19941
+ return ret[0];
19942
+ }
19943
+
19944
+ /**
19945
+ * Test a scalar innovation against a chi-square NIS gate.
19946
+ *
19947
+ * Returns `{ nis, threshold, inGate, dof }`, with `confidence` in `(0, 1)`.
19948
+ * @param {number} innovation
19949
+ * @param {number} innovation_variance
19950
+ * @param {number} dof
19951
+ * @param {number} confidence
19952
+ * @returns {any}
19953
+ */
19954
+ export function nisGate(innovation, innovation_variance, dof, confidence) {
19955
+ const ret = wasm.nisGate(innovation, innovation_variance, dof, confidence);
19956
+ if (ret[2]) {
19957
+ throw takeFromExternrefTable0(ret[1]);
19958
+ }
19959
+ return takeFromExternrefTable0(ret[0]);
19960
+ }
19961
+
19962
+ /**
19963
+ * Chi-square NIS gate threshold for `dof` and confidence probability.
19964
+ * @param {number} dof
19965
+ * @param {number} confidence
19966
+ * @returns {number}
19967
+ */
19968
+ export function nisGateThreshold(dof, confidence) {
19969
+ const ret = wasm.nisGateThreshold(dof, confidence);
19970
+ if (ret[2]) {
19971
+ throw takeFromExternrefTable0(ret[1]);
19972
+ }
19973
+ return ret[0];
19974
+ }
19975
+
19207
19976
  /**
19208
19977
  * Parse bytes and return grouped epoch snapshots directly.
19209
19978
  * @param {Uint8Array} bytes
@@ -19287,6 +20056,20 @@ export function normalCovariance(jacobian, m, n, variance_scale) {
19287
20056
  return v2;
19288
20057
  }
19289
20058
 
20059
+ /**
20060
+ * Scalar normalized innovation `innovation / sqrt(innovationVariance)`.
20061
+ * @param {number} innovation
20062
+ * @param {number} innovation_variance
20063
+ * @returns {number}
20064
+ */
20065
+ export function normalizedInnovation(innovation, innovation_variance) {
20066
+ const ret = wasm.normalizedInnovation(innovation, innovation_variance);
20067
+ if (ret[2]) {
20068
+ throw takeFromExternrefTable0(ret[1]);
20069
+ }
20070
+ return ret[0];
20071
+ }
20072
+
19290
20073
  /**
19291
20074
  * Build the NTRIP connection request bytes for a config object.
19292
20075
  * @param {any} config
@@ -19302,6 +20085,41 @@ export function ntripRequestBytes(config) {
19302
20085
  return v1;
19303
20086
  }
19304
20087
 
20088
+ /**
20089
+ * Stable string label for an [`ObservabilityTier`] enum value.
20090
+ * @param {ObservabilityTier} tier
20091
+ * @returns {string}
20092
+ */
20093
+ export function observabilityTierLabel(tier) {
20094
+ let deferred1_0;
20095
+ let deferred1_1;
20096
+ try {
20097
+ const ret = wasm.observabilityTierLabel(tier);
20098
+ deferred1_0 = ret[0];
20099
+ deferred1_1 = ret[1];
20100
+ return getStringFromWasm0(ret[0], ret[1]);
20101
+ } finally {
20102
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
20103
+ }
20104
+ }
20105
+
20106
+ /**
20107
+ * Missing-position sentinel used in failed observable-state batch elements.
20108
+ *
20109
+ * The returned JS value is `[NaN, NaN, NaN]`, matching
20110
+ * `sidereon_core::ephemeris::OBSERVABLE_STATE_MISSING_POSITION_ECEF_M`. Always
20111
+ * check `elementResults[i].ok` or `statuses[i]` before using
20112
+ * `positionsEcefM[i]`.
20113
+ * @returns {any}
20114
+ */
20115
+ export function observableStateMissingPositionEcefM() {
20116
+ const ret = wasm.observableStateMissingPositionEcefM();
20117
+ if (ret[2]) {
20118
+ throw takeFromExternrefTable0(ret[1]);
20119
+ }
20120
+ return takeFromExternrefTable0(ret[0]);
20121
+ }
20122
+
19305
20123
  /**
19306
20124
  * Predict observables for one satellite from a broadcast ephemeris store.
19307
20125
  * Delegates to `sidereon_core::observables::predict`.
@@ -21413,6 +22231,74 @@ export function solveWithFallback(precise, broadcast, request, policy) {
21413
22231
  return SourcedSolution.__wrap(ret[0]);
21414
22232
  }
21415
22233
 
22234
+ /**
22235
+ * Compute the timing Cramer-Rao lower bound for a proposed source position.
22236
+ *
22237
+ * The covariance is `(H^T H)^-1 * timingSigmaS^2`; position blocks are square
22238
+ * metres and origin-time variance is square seconds.
22239
+ * @param {any} sensors
22240
+ * @param {any} source_position_m
22241
+ * @param {number} propagation_speed_m_s
22242
+ * @param {number} timing_sigma_s
22243
+ * @returns {any}
22244
+ */
22245
+ export function sourceCrlb(sensors, source_position_m, propagation_speed_m_s, timing_sigma_s) {
22246
+ const ret = wasm.sourceCrlb(sensors, source_position_m, propagation_speed_m_s, timing_sigma_s);
22247
+ if (ret[2]) {
22248
+ throw takeFromExternrefTable0(ret[1]);
22249
+ }
22250
+ return takeFromExternrefTable0(ret[0]);
22251
+ }
22252
+
22253
+ /**
22254
+ * Compute timing DOP for a proposed source position.
22255
+ *
22256
+ * `sourcePositionM` is a 2D or 3D Cartesian metre vector in the same frame as
22257
+ * the sensors. The returned DOP values multiply timing sigma in seconds to
22258
+ * produce metres in the caller's Cartesian axes.
22259
+ * @param {any} sensors
22260
+ * @param {any} source_position_m
22261
+ * @param {number} propagation_speed_m_s
22262
+ * @returns {any}
22263
+ */
22264
+ export function sourceDop(sensors, source_position_m, propagation_speed_m_s) {
22265
+ const ret = wasm.sourceDop(sensors, source_position_m, propagation_speed_m_s);
22266
+ if (ret[2]) {
22267
+ throw takeFromExternrefTable0(ret[1]);
22268
+ }
22269
+ return takeFromExternrefTable0(ret[0]);
22270
+ }
22271
+
22272
+ /**
22273
+ * Return the plain mode object for TDOA solves against `referenceSensor`.
22274
+ * @param {number} reference_sensor
22275
+ * @returns {any}
22276
+ */
22277
+ export function sourceSolveModeTdoa(reference_sensor) {
22278
+ const ret = wasm.sourceSolveModeTdoa(reference_sensor);
22279
+ if (ret[2]) {
22280
+ throw takeFromExternrefTable0(ret[1]);
22281
+ }
22282
+ return takeFromExternrefTable0(ret[0]);
22283
+ }
22284
+
22285
+ /**
22286
+ * Return the plain mode value for absolute time-of-arrival solves.
22287
+ * @returns {string}
22288
+ */
22289
+ export function sourceSolveModeToa() {
22290
+ let deferred1_0;
22291
+ let deferred1_1;
22292
+ try {
22293
+ const ret = wasm.sourceSolveModeToa();
22294
+ deferred1_0 = ret[0];
22295
+ deferred1_1 = ret[1];
22296
+ return getStringFromWasm0(ret[0], ret[1]);
22297
+ } finally {
22298
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
22299
+ }
22300
+ }
22301
+
21416
22302
  /**
21417
22303
  * Extract a parsed SP3 product as the canonical precise-ephemeris samples, one
21418
22304
  * per real position record in ascending epoch order.
@@ -22661,6 +23547,9 @@ const FrameStatesFinalization = (typeof FinalizationRegistry === 'undefined')
22661
23547
  const GeoidGridFinalization = (typeof FinalizationRegistry === 'undefined')
22662
23548
  ? { register: () => {}, unregister: () => {} }
22663
23549
  : new FinalizationRegistry(ptr => wasm.__wbg_geoidgrid_free(ptr, 1));
23550
+ const GeometryQualityFinalization = (typeof FinalizationRegistry === 'undefined')
23551
+ ? { register: () => {}, unregister: () => {} }
23552
+ : new FinalizationRegistry(ptr => wasm.__wbg_geometryquality_free(ptr, 1));
22664
23553
  const GlonassRecordJsFinalization = (typeof FinalizationRegistry === 'undefined')
22665
23554
  ? { register: () => {}, unregister: () => {} }
22666
23555
  : new FinalizationRegistry(ptr => wasm.__wbg_glonassrecordjs_free(ptr, 1));
@@ -22847,6 +23736,9 @@ const PppFixedSolutionFinalization = (typeof FinalizationRegistry === 'undefined
22847
23736
  const PppFloatSolutionFinalization = (typeof FinalizationRegistry === 'undefined')
22848
23737
  ? { register: () => {}, unregister: () => {} }
22849
23738
  : new FinalizationRegistry(ptr => wasm.__wbg_pppfloatsolution_free(ptr, 1));
23739
+ const PreciseEphemerisInterpolantFinalization = (typeof FinalizationRegistry === 'undefined')
23740
+ ? { register: () => {}, unregister: () => {} }
23741
+ : new FinalizationRegistry(ptr => wasm.__wbg_preciseephemerisinterpolant_free(ptr, 1));
22850
23742
  const PreciseEphemerisSampleSourceFinalization = (typeof FinalizationRegistry === 'undefined')
22851
23743
  ? { register: () => {}, unregister: () => {} }
22852
23744
  : new FinalizationRegistry(ptr => wasm.__wbg_preciseephemerissamplesource_free(ptr, 1));