@neilberkman/sidereon 0.9.0 → 0.9.1

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.
@@ -1367,6 +1367,37 @@ export class Ephemeris {
1367
1367
  readonly velocityKmS: Float64Array;
1368
1368
  }
1369
1369
 
1370
+ /**
1371
+ * A confidence ellipse from a 2x2 covariance block: semi-axes scaled by the
1372
+ * two-degree-of-freedom chi-square quantile `-2 ln(1 - confidence)`.
1373
+ */
1374
+ export class ErrorEllipse2 {
1375
+ private constructor();
1376
+ free(): void;
1377
+ [Symbol.dispose](): void;
1378
+ /**
1379
+ * Two-degree-of-freedom chi-square scale `-2 ln(1 - confidence)`.
1380
+ */
1381
+ readonly chiSquareScale: number;
1382
+ /**
1383
+ * Requested confidence probability in `(0, 1)`.
1384
+ */
1385
+ readonly confidence: number;
1386
+ /**
1387
+ * Semi-major-axis orientation in radians, from the first (row/col 0) axis
1388
+ * toward the second (row/col 1) axis.
1389
+ */
1390
+ readonly orientationRad: number;
1391
+ /**
1392
+ * Semi-major axis length (same unit as the square root of the covariance).
1393
+ */
1394
+ readonly semiMajor: number;
1395
+ /**
1396
+ * Semi-minor axis length.
1397
+ */
1398
+ readonly semiMinor: number;
1399
+ }
1400
+
1370
1401
  /**
1371
1402
  * A fault-detection-and-exclusion result: the surviving solution, the excluded
1372
1403
  * satellites in exclusion order, and the number of exclusions performed.
@@ -2193,6 +2224,95 @@ export class LeapSecondTable {
2193
2224
  readonly source: string;
2194
2225
  }
2195
2226
 
2227
+ /**
2228
+ * A serial leave-one-out sweep: the base solve over all rows plus one re-solve
2229
+ * per masked row, with the per-row optimum-cost shift.
2230
+ */
2231
+ export class LeastSquaresDropOneReport {
2232
+ private constructor();
2233
+ free(): void;
2234
+ [Symbol.dispose](): void;
2235
+ /**
2236
+ * The solve with residual row `index` masked out. Throws a `RangeError` for
2237
+ * an out-of-range index.
2238
+ */
2239
+ dropAt(index: number): LeastSquaresResult;
2240
+ /**
2241
+ * The solve over the full residual.
2242
+ */
2243
+ readonly base: LeastSquaresResult;
2244
+ /**
2245
+ * `costDeltas[i] = dropAt(i).cost - base.cost`: how much the optimum cost
2246
+ * moves when row `i` is removed. `Float64Array` of length `count`.
2247
+ */
2248
+ readonly costDeltas: Float64Array;
2249
+ /**
2250
+ * Number of masked-row re-solves (equals the residual-row count `m`).
2251
+ */
2252
+ readonly count: number;
2253
+ }
2254
+
2255
+ /**
2256
+ * The outcome of one trust-region least-squares solve, mirroring the fields of
2257
+ * `scipy.optimize.least_squares`'s `OptimizeResult`.
2258
+ */
2259
+ export class LeastSquaresResult {
2260
+ private constructor();
2261
+ free(): void;
2262
+ [Symbol.dispose](): void;
2263
+ /**
2264
+ * Optimal cost `0.5 * sum(residual^2)` (after robust reweighting when a
2265
+ * non-linear loss is used).
2266
+ */
2267
+ readonly cost: number;
2268
+ /**
2269
+ * Residual vector at the solution, `Float64Array` of length `m`.
2270
+ */
2271
+ readonly fun: Float64Array;
2272
+ /**
2273
+ * Gradient `J^T f` at the solution, `Float64Array` of length `n`.
2274
+ */
2275
+ readonly grad: Float64Array;
2276
+ /**
2277
+ * Row-major `m`-by-`n` Jacobian at the solution, flat `Float64Array` of
2278
+ * length `m * n`.
2279
+ */
2280
+ readonly jac: Float64Array;
2281
+ /**
2282
+ * Residual row count `m`.
2283
+ */
2284
+ readonly m: number;
2285
+ /**
2286
+ * Parameter count `n`.
2287
+ */
2288
+ readonly n: number;
2289
+ /**
2290
+ * Number of residual evaluations.
2291
+ */
2292
+ readonly nfev: number;
2293
+ /**
2294
+ * Number of Jacobian evaluations.
2295
+ */
2296
+ readonly njev: number;
2297
+ /**
2298
+ * First-order optimality `||J^T f||_inf` at the solution.
2299
+ */
2300
+ readonly optimality: number;
2301
+ /**
2302
+ * SciPy-compatible termination status: `0` max evaluations, `1` gtol,
2303
+ * `2` ftol, `3` xtol, `4` both ftol and xtol.
2304
+ */
2305
+ readonly status: number;
2306
+ /**
2307
+ * Whether the solve converged (`status > 0`).
2308
+ */
2309
+ readonly success: boolean;
2310
+ /**
2311
+ * Solution parameter vector, `Float64Array` of length `n`.
2312
+ */
2313
+ readonly x: Float64Array;
2314
+ }
2315
+
2196
2316
  /**
2197
2317
  * Link-budget inputs for [`LinkBudget.margin`].
2198
2318
  */
@@ -2421,6 +2541,49 @@ export class MappingFactors {
2421
2541
  readonly wet: number;
2422
2542
  }
2423
2543
 
2544
+ /**
2545
+ * One refined Moon elevation threshold crossing (moonrise / moonset).
2546
+ */
2547
+ export class MoonElevationCrossing {
2548
+ private constructor();
2549
+ free(): void;
2550
+ [Symbol.dispose](): void;
2551
+ /**
2552
+ * Topocentric Moon elevation at the refined instant, degrees.
2553
+ */
2554
+ readonly elevationDeg: number;
2555
+ /**
2556
+ * Crossing direction: `"rising"` (moonrise) or `"setting"` (moonset).
2557
+ */
2558
+ readonly kind: string;
2559
+ /**
2560
+ * Refined crossing instant, unix microseconds.
2561
+ */
2562
+ readonly timeUnixUs: bigint;
2563
+ }
2564
+
2565
+ /**
2566
+ * One refined Moon meridian transit (culmination).
2567
+ */
2568
+ export class MoonTransit {
2569
+ private constructor();
2570
+ free(): void;
2571
+ [Symbol.dispose](): void;
2572
+ /**
2573
+ * Topocentric Moon elevation at the refined instant, degrees.
2574
+ */
2575
+ readonly elevationDeg: number;
2576
+ /**
2577
+ * Culmination kind: `"upper"` (due south, highest) or `"lower"` (due north,
2578
+ * lowest).
2579
+ */
2580
+ readonly kind: string;
2581
+ /**
2582
+ * Refined culmination instant, unix microseconds.
2583
+ */
2584
+ readonly timeUnixUs: bigint;
2585
+ }
2586
+
2424
2587
  /**
2425
2588
  * One solved moving-baseline epoch.
2426
2589
  */
@@ -3500,6 +3663,38 @@ export class PppFloatSolution {
3500
3663
  readonly ztdResidualM: number | undefined;
3501
3664
  }
3502
3665
 
3666
+ /**
3667
+ * The per-request results of a batch observable prediction, index-aligned to
3668
+ * the input requests. Each request independently either produced observables or
3669
+ * failed; query a request with [`PredictBatch.isOk`] /
3670
+ * [`PredictBatch.observables`] / [`PredictBatch.error`].
3671
+ */
3672
+ export class PredictBatch {
3673
+ private constructor();
3674
+ free(): void;
3675
+ [Symbol.dispose](): void;
3676
+ /**
3677
+ * The failure message for request `index`, or `undefined` when it
3678
+ * succeeded. Throws a `RangeError` for an out-of-range index.
3679
+ */
3680
+ error(index: number): string | undefined;
3681
+ /**
3682
+ * Whether request `index` produced observables. Throws a `RangeError` for
3683
+ * an out-of-range index.
3684
+ */
3685
+ isOk(index: number): boolean;
3686
+ /**
3687
+ * The observables for request `index`. Throws a `RangeError` for an
3688
+ * out-of-range index and an `Error` carrying that request's failure message
3689
+ * when the prediction failed (check [`PredictBatch.isOk`] first).
3690
+ */
3691
+ observables(index: number): PredictedObservables;
3692
+ /**
3693
+ * Number of requests in the batch.
3694
+ */
3695
+ readonly count: number;
3696
+ }
3697
+
3503
3698
  /**
3504
3699
  * Predicted GNSS observables for one satellite at one receive epoch. Every
3505
3700
  * field is computed by `sidereon_core::observables::predict`.
@@ -5119,6 +5314,21 @@ export function collisionProbability(object1: ConjunctionState, object2: Conjunc
5119
5314
  */
5120
5315
  export function correlate(iq: Float64Array, prn: bigint, options: any): CorrelationResult;
5121
5316
 
5317
+ /**
5318
+ * Fitted parameter covariance from a converged solve, scaling `(J^T J)^-1` by
5319
+ * the post-fit reduced chi-square `s_sq = 2 * cost / (m - n)` (the same scale
5320
+ * `scipy.optimize.curve_fit` applies to its `pcov`).
5321
+ *
5322
+ * `jacobian` is a flat row-major `(m, n)` `Float64Array` (the Jacobian at the
5323
+ * solution), and `cost` is the solve's optimal cost `0.5 * sum(residual^2)`;
5324
+ * the degrees of freedom `m - n` (taken from the Jacobian's own shape) must be
5325
+ * positive. Pairs naturally with a [`crate::LeastSquaresResult`] (`result.jac`,
5326
+ * `result.m`, `result.n`, `result.cost`). Returns the `n`-by-`n` covariance as
5327
+ * a flat row-major `Float64Array`. Delegates to
5328
+ * `sidereon_core::astro::math::least_squares::covariance_from_jacobian`.
5329
+ */
5330
+ export function covarianceFromJacobian(jacobian: Float64Array, m: number, n: number, cost: number): Float64Array;
5331
+
5122
5332
  /**
5123
5333
  * Whether a 3x3 covariance (flat row-major length 9) is symmetric positive
5124
5334
  * semidefinite within the engine tolerance.
@@ -5221,6 +5431,19 @@ export function diff(previous: any, current: any): any;
5221
5431
  */
5222
5432
  export function dishGain(diameter_m: number, frequency_hz: number, efficiency: number): number;
5223
5433
 
5434
+ /**
5435
+ * GNSS dilution of precision with an explicit ENU convention for the
5436
+ * horizontal/vertical split.
5437
+ *
5438
+ * `lineOfSight` is a flat row-major `(n, 3)` `Float64Array` of ECEF unit
5439
+ * vectors, `weights` a positive `Float64Array` of length `n`, and `convention`
5440
+ * is `"geodeticNormal"` (the GNSS-standard default, matching [`gnssDop`]) or
5441
+ * `"geocentricRadial"` (radial up). Only HDOP/VDOP differ between conventions
5442
+ * (by ~`1e-3` relative); GDOP/PDOP/TDOP are identical. Delegates to
5443
+ * `sidereon_core::geometry::dop_with_convention`.
5444
+ */
5445
+ export function dopWithConvention(line_of_sight: Float64Array, weights: Float64Array, receiver: Wgs84Geodetic, convention: string): Dop;
5446
+
5224
5447
  /**
5225
5448
  * Range rate and dimensionless Doppler ratio from a GCRS state.
5226
5449
  *
@@ -5267,6 +5490,33 @@ export function ecefToGeodetic(position_km: Float64Array): Float64Array;
5267
5490
  */
5268
5491
  export function eclipseStatus(satellite_position_km: Float64Array, sun_position_km: Float64Array): string[];
5269
5492
 
5493
+ /**
5494
+ * Ellipsoidal height `h = H + N` (metres above the WGS84 ellipsoid) from an
5495
+ * orthometric height and a geodetic position in radians, using the embedded
5496
+ * genuine EGM96 1-degree model. Delegates to
5497
+ * `sidereon_core::geoid::egm96_ellipsoidal_height_m`.
5498
+ */
5499
+ export function egm96EllipsoidalHeightM(orthometric_height_m: number, lat_rad: number, lon_rad: number): number;
5500
+
5501
+ /**
5502
+ * Orthometric height `H = h - N` (metres above mean sea level) from an
5503
+ * ellipsoidal height and a geodetic position in radians, using the embedded
5504
+ * genuine EGM96 1-degree model. Delegates to
5505
+ * `sidereon_core::geoid::egm96_orthometric_height_m`.
5506
+ */
5507
+ export function egm96OrthometricHeightM(ellipsoidal_height_m: number, lat_rad: number, lon_rad: number): number;
5508
+
5509
+ /**
5510
+ * Geoid undulation `N` (metres above the WGS84 ellipsoid) at a geodetic
5511
+ * position in radians, from the embedded GENUINE EGM96 1-degree global grid.
5512
+ * Latitude is positive north, longitude positive east. This is the recommended
5513
+ * zero-setup default for metre-class datum work (its bilinear lookup agrees
5514
+ * with the full 15-arcminute EGM96 grid to ~0.4 m RMS); the coarse
5515
+ * [`geoidUndulation`] is only suitable for sanity checks. Delegates to
5516
+ * `sidereon_core::geoid::egm96_undulation`.
5517
+ */
5518
+ export function egm96Undulation(lat_rad: number, lon_rad: number): number;
5519
+
5270
5520
  /**
5271
5521
  * Effective isotropic radiated power, dBW.
5272
5522
  */
@@ -5328,6 +5578,39 @@ export function encounterFrame(position1_km: Float64Array, velocity1_km_s: Float
5328
5578
  */
5329
5579
  export function encounterPlaneCovariance(frame: EncounterFrame, covariance_km2: Float64Array): Float64Array;
5330
5580
 
5581
+ /**
5582
+ * Confidence ellipse from an arbitrary 2x2 covariance block.
5583
+ *
5584
+ * `covariance` is a flat row-major length-4 `Float64Array` (`[c00, c01, c10,
5585
+ * c11]`); `confidence` is in `(0, 1)`. The semi-axes are the eigenvalues of the
5586
+ * symmetrized block scaled by the chi-square(2) quantile. Throws a `RangeError`
5587
+ * for a non-positive-semidefinite block or an out-of-range confidence.
5588
+ * Delegates to `sidereon_core::geometry::error_ellipse_2x2`.
5589
+ */
5590
+ export function errorEllipse2(covariance: Float64Array, confidence: number): ErrorEllipse2;
5591
+
5592
+ /**
5593
+ * Find Moon elevation threshold crossings (moonrise / moonset) over a UTC
5594
+ * window.
5595
+ *
5596
+ * The station is geodetic (`latitudeDeg`, `longitudeDeg`, `altitudeKm`);
5597
+ * `startUnixUs` / `endUnixUs` bound the window in unix microseconds. `options`
5598
+ * is `{ elevationThresholdDeg?, stepSeconds?, timeToleranceSeconds? }`.
5599
+ * Delegates to `sidereon_core::astro::bodies::find_moon_elevation_crossings`.
5600
+ */
5601
+ export function findMoonElevationCrossings(latitude_deg: number, longitude_deg: number, altitude_km: number, start_unix_us: bigint, end_unix_us: bigint, options: any): MoonElevationCrossing[];
5602
+
5603
+ /**
5604
+ * Find Moon meridian transits (upper and lower culminations) over a UTC window.
5605
+ *
5606
+ * The station is geodetic (`latitudeDeg`, `longitudeDeg`, `altitudeKm`);
5607
+ * `startUnixUs` / `endUnixUs` bound the window in unix microseconds.
5608
+ * `stepSeconds` is the uniform scan step and `timeToleranceSeconds` the
5609
+ * refinement tolerance. Delegates to
5610
+ * `sidereon_core::astro::bodies::find_moon_transits`.
5611
+ */
5612
+ export function findMoonTransits(latitude_deg: number, longitude_deg: number, altitude_km: number, start_unix_us: bigint, end_unix_us: bigint, step_seconds: number, time_tolerance_seconds: number): MoonTransit[];
5613
+
5331
5614
  /**
5332
5615
  * Find local TCA candidates between two satellites over a UTC window.
5333
5616
  *
@@ -5601,6 +5884,24 @@ export function gnssVisibilitySeries(sp3: Sp3, station_ecef_m: Float64Array, sta
5601
5884
  */
5602
5885
  export function gnssVisible(sp3: Sp3, station_ecef_m: Float64Array, j2000_seconds: number, options: any): GnssVisibleSatellite[];
5603
5886
 
5887
+ /**
5888
+ * GPS - UTC (the GNSS leap-second offset since the GPS epoch) on a UTC calendar
5889
+ * date: the IS-GPS-200 quantity broadcast in the navigation message (18 s from
5890
+ * 2017-01-01). Equals `taiUtcOffsetS - 19`. Use this, not [`taiUtcOffsetS`],
5891
+ * whenever you mean the leap seconds a GPS receiver applies. Delegates to
5892
+ * `sidereon_core::astro::time::scales::gps_utc_offset_s`.
5893
+ */
5894
+ export function gpsUtcOffsetS(year: number, month: number, day: number): number;
5895
+
5896
+ /**
5897
+ * Trace of the Gauss-Newton Hessian approximation `J^T J`: the sum of the
5898
+ * squared column norms of the Jacobian, with no inverse formed.
5899
+ *
5900
+ * `jacobian` is a flat row-major `(m, n)` `Float64Array`. Delegates to
5901
+ * `sidereon_core::astro::math::least_squares::hessian_trace`.
5902
+ */
5903
+ export function hessianTrace(jacobian: Float64Array, m: number, n: number): number;
5904
+
5604
5905
  /**
5605
5906
  * Gauss angles-only orbit determination.
5606
5907
  *
@@ -5670,6 +5971,17 @@ export function itrsToGcrs(position_km: Float64Array, epochs_unix_us: BigInt64Ar
5670
5971
  */
5671
5972
  export function j2000SecondsToCivil(seconds: bigint): CivilDateTime;
5672
5973
 
5974
+ /**
5975
+ * Jarque-Bera normality test on a residual set.
5976
+ *
5977
+ * `x` is a `Float64Array` (at least two values). Returns
5978
+ * `{ statistic, pValue }` with `statistic = n/6 (S^2 + K^2/4)` (biased moments)
5979
+ * and the chi-square(2) survival `pValue = exp(-statistic/2)`, matching
5980
+ * `scipy.stats.jarque_bera`. Delegates to
5981
+ * `sidereon_core::quality::normality::jarque_bera`.
5982
+ */
5983
+ export function jarqueBera(x: Float64Array): any;
5984
+
5673
5985
  /**
5674
5986
  * GPS broadcast Klobuchar ionospheric group delay in the model's native units
5675
5987
  * (positive metres).
@@ -5686,6 +5998,17 @@ export function j2000SecondsToCivil(seconds: bigint): CivilDateTime;
5686
5998
  */
5687
5999
  export function klobucharDelay(alpha: Float64Array, beta: Float64Array, lat_deg: number, lon_deg: number, azimuth_deg: number, elevation_deg: number, t_gps_s: number, frequency_hz: number): number;
5688
6000
 
6001
+ /**
6002
+ * Sample kurtosis of a residual set.
6003
+ *
6004
+ * `x` is a `Float64Array`. `fisher` (default `true`) returns the excess
6005
+ * kurtosis `m4 / m2^2 - 3` (Gaussian -> 0, `scipy.stats.kurtosis`); `false`
6006
+ * returns the Pearson kurtosis (Gaussian -> 3). `bias` (default `true`); pass
6007
+ * `false` for the sample correction (needs at least four values). Delegates to
6008
+ * `sidereon_core::quality::normality::kurtosis`.
6009
+ */
6010
+ export function kurtosis(x: Float64Array, fisher?: boolean | null, bias?: boolean | null): number;
6011
+
5689
6012
  /**
5690
6013
  * Resolve integer ambiguities with the LAMBDA method (RTKLIB `lambda()` port).
5691
6014
  *
@@ -5729,6 +6052,31 @@ export function leapSeconds(year: number, month: number, day: number): number;
5729
6052
  */
5730
6053
  export function leapSecondsBatch(dates: Int32Array): Float64Array;
5731
6054
 
6055
+ /**
6056
+ * Solve a generic data-driven least-squares problem.
6057
+ *
6058
+ * `request` is a `DataProblemInput` object: a `kind` (`"linear"`,
6059
+ * `"polynomial"`, `"exponential"`) carrying its data arrays, the `x0` starting
6060
+ * point, and the SciPy `least_squares` options. The whole trust-region
6061
+ * iteration runs in Rust through
6062
+ * `trust_region_least_squares::data::solve_data_problem` (the serial entry, the
6063
+ * default in-crate SVD backend); no rayon thread pool is entered.
6064
+ */
6065
+ export function leastSquares(request: any): LeastSquaresResult;
6066
+
6067
+ /**
6068
+ * Serial leave-one-out (jackknife) over a data-driven least-squares problem.
6069
+ *
6070
+ * Delegates to the core's serial leave-one-out entry
6071
+ * `trust_region_least_squares::batch::solve_data_problem_drop_one_serial`: the
6072
+ * full problem is solved once, then re-solved with each residual row masked in
6073
+ * turn. The core's default `solve_data_problem_drop_one` fans these re-solves
6074
+ * across a rayon pool that wasm has no threads for, so this binding takes the
6075
+ * serial twin, which runs the identical re-solves one row at a time and is
6076
+ * byte-identical to the parallel version.
6077
+ */
6078
+ export function leastSquaresDropOne(request: any): LeastSquaresDropOneReport;
6079
+
5732
6080
  /**
5733
6081
  * Decode LNAV subframes 1-3 back into engineering-unit parameters.
5734
6082
  *
@@ -5854,11 +6202,47 @@ export function mergeNavcen(records: any, statuses: any): any;
5854
6202
  */
5855
6203
  export function mergeSp3(sources: Sp3[], options: any): Sp3MergeResult;
5856
6204
 
6205
+ /**
6206
+ * Mean, variance, skewness, and excess kurtosis of a residual set in one pass.
6207
+ *
6208
+ * `x` is a `Float64Array`; `fisher` and `bias` select the kurtosis convention
6209
+ * and the bias correction exactly as in [`skewness`] / [`kurtosis`] (both
6210
+ * default `true`). Returns `{ mean, variance, skewness, kurtosisExcess }`; the
6211
+ * variance is the biased second central moment. Delegates to
6212
+ * `sidereon_core::quality::normality::moments`.
6213
+ */
6214
+ export function moments(x: Float64Array, fisher?: boolean | null, bias?: boolean | null): any;
6215
+
5857
6216
  /**
5858
6217
  * Angle in degrees between satellite nadir and the Moon direction.
5859
6218
  */
5860
6219
  export function moonAngle(satellite_position_km: Float64Array, moon_position_km: Float64Array): Float64Array;
5861
6220
 
6221
+ /**
6222
+ * Topocentric azimuth/elevation/range of the Moon from a ground site,
6223
+ * including the diurnal parallax. See [`sunAzEl`] for the argument shapes.
6224
+ * Delegates to `sidereon_core::astro::bodies::moon_az_el`.
6225
+ */
6226
+ export function moonAzEl(latitude_deg: number, longitude_deg: number, altitude_km: number, epoch_unix_us: bigint): any;
6227
+
6228
+ /**
6229
+ * Topocentric geometric Moon (disk-center) elevation from a ground site,
6230
+ * degrees. See [`sunAzEl`] for the argument shapes. Delegates to
6231
+ * `sidereon_core::astro::bodies::moon_az_el` and returns its `elevationDeg`: the
6232
+ * core `moon_elevation_deg` convenience wrapper `expect`s on the geometry, so a
6233
+ * valid-shaped but out-of-range station (e.g. latitude 120) would panic the
6234
+ * wasm module; going through `moon_az_el` surfaces that as a thrown JS error.
6235
+ */
6236
+ export function moonElevationDeg(latitude_deg: number, longitude_deg: number, altitude_km: number, epoch_unix_us: bigint): number;
6237
+
6238
+ /**
6239
+ * Illuminated fraction of the Moon as seen from a ground site. Returns
6240
+ * `{ illuminatedFraction, phaseAngleDeg }` (0 = new, 1 = full). See [`sunAzEl`]
6241
+ * for the argument shapes. Delegates to
6242
+ * `sidereon_core::astro::bodies::moon_illumination`.
6243
+ */
6244
+ export function moonIllumination(latitude_deg: number, longitude_deg: number, altitude_km: number, epoch_unix_us: bigint): any;
6245
+
5862
6246
  /**
5863
6247
  * Narrow-lane code combination, metres.
5864
6248
  */
@@ -5901,6 +6285,21 @@ export function nequickGStecTecu(_eval: any): number;
5901
6285
  */
5902
6286
  export function noiseAmplification(f1_hz: number, f2_hz: number): number;
5903
6287
 
6288
+ /**
6289
+ * Parameter covariance from a design (Jacobian) matrix via the Gauss-Newton
6290
+ * normal equations `varianceScale * (J^T J)^-1`, formed from the thin SVD of
6291
+ * `J` (not by inverting `J^T J`, so the condition number is not squared).
6292
+ *
6293
+ * `jacobian` is a flat row-major `(m, n)` `Float64Array` with `m >= n`;
6294
+ * `varianceScale` (`sigma^2`, non-negative) scales the bare cofactor (pass the
6295
+ * post-fit reduced chi-square for the fitted covariance, or `1.0` for
6296
+ * `(J^T J)^-1`). Returns the `n`-by-`n` covariance as a flat row-major
6297
+ * `Float64Array` of length `n * n`. Throws an `Error` for a rank-deficient
6298
+ * Jacobian. Delegates to
6299
+ * `sidereon_core::astro::math::least_squares::normal_covariance`.
6300
+ */
6301
+ export function normalCovariance(jacobian: Float64Array, m: number, n: number, variance_scale: number): Float64Array;
6302
+
5904
6303
  /**
5905
6304
  * Predict observables for one satellite from a broadcast ephemeris store.
5906
6305
  * Delegates to `sidereon_core::observables::predict`.
@@ -6084,6 +6483,27 @@ export function phaseMeters(phi_cycles: number, f_hz: number): number;
6084
6483
  */
6085
6484
  export function pppCorrections(sp3: Sp3, epochs: any, receiver_ecef_m: Float64Array, options: any): any;
6086
6485
 
6486
+ /**
6487
+ * Predict observables for many `(satellite, receiver, epoch)` requests from a
6488
+ * broadcast ephemeris store, serially. See [`predictBatchSp3`] for the argument
6489
+ * shapes. Delegates to the serial `sidereon_core::observables::predict_batch`.
6490
+ */
6491
+ export function predictBatchBroadcast(broadcast: BroadcastEphemeris, satellites: string[], receivers_ecef_m: Float64Array, epochs_j2000_s: Float64Array, options: any): PredictBatch;
6492
+
6493
+ /**
6494
+ * Predict observables for many `(satellite, receiver, epoch)` requests from an
6495
+ * SP3 precise product, serially.
6496
+ *
6497
+ * `satellites` is an array of satellite tokens, `receiversEcefM` a flat
6498
+ * row-major `(n, 3)` `Float64Array` of receiver ECEF positions (metres), and
6499
+ * `epochsJ2000S` a `Float64Array` of receive epochs (seconds since J2000); all
6500
+ * three are index-aligned and length `n`. Element `i` of the result corresponds
6501
+ * to request `i`. Delegates to the serial reference kernel
6502
+ * `sidereon_core::observables::predict_batch`; the binding never spawns the
6503
+ * rayon thread pool the parallel variant uses.
6504
+ */
6505
+ export function predictBatchSp3(sp3: Sp3, satellites: string[], receivers_ecef_m: Float64Array, epochs_j2000_s: Float64Array, options: any): PredictBatch;
6506
+
6087
6507
  /**
6088
6508
  * Prepare ionosphere-free single-frequency RTK arc inputs from a
6089
6509
  * dual-frequency arc and fixed wide-lane ambiguities.
@@ -6264,12 +6684,32 @@ export function selectSp3OverRange(products: Sp3[], start_epoch_j2000_s: number,
6264
6684
  */
6265
6685
  export function shadowFraction(satellite_position_km: Float64Array, sun_position_km: Float64Array): Float64Array;
6266
6686
 
6687
+ /**
6688
+ * Shapiro-Wilk normality test on a residual set.
6689
+ *
6690
+ * `x` is a `Float64Array` (at least three values). Returns `{ w, pValue }`,
6691
+ * Royston's AS R94 port that `scipy.stats.shapiro` uses; `w` is in `(0, 1]`
6692
+ * (closer to one is more Gaussian). Delegates to
6693
+ * `sidereon_core::quality::normality::shapiro_wilk`.
6694
+ */
6695
+ export function shapiroWilk(x: Float64Array): any;
6696
+
6267
6697
  /**
6268
6698
  * Build satellite-keyed pseudorange sigmas in metres from `{ satelliteId,
6269
6699
  * elevationDeg, cn0Dbhz? }` entries. Invalid entries are dropped by the core.
6270
6700
  */
6271
6701
  export function sigmas(entries: any, options: any): SatelliteVector;
6272
6702
 
6703
+ /**
6704
+ * Sample skewness of a residual set.
6705
+ *
6706
+ * `x` is a `Float64Array`. `bias` (default `true`) selects the Fisher-Pearson
6707
+ * coefficient `g1 = m3 / m2^(3/2)` (`scipy.stats.skew`); `false` applies the
6708
+ * sample correction (`scipy.stats.skew(bias=False)`, needs at least three
6709
+ * values). Delegates to `sidereon_core::quality::normality::skewness`.
6710
+ */
6711
+ export function skewness(x: Float64Array, bias?: boolean | null): number;
6712
+
6273
6713
  /**
6274
6714
  * Stable lower-case label for a slip reason.
6275
6715
  */
@@ -6464,6 +6904,16 @@ export function subSolarPoint(sun_ecef: Float64Array): any;
6464
6904
  */
6465
6905
  export function sunAngle(satellite_position_km: Float64Array, sun_position_km: Float64Array): Float64Array;
6466
6906
 
6907
+ /**
6908
+ * Topocentric azimuth/elevation/range of the Sun from a ground site.
6909
+ *
6910
+ * The station is geodetic (`latitudeDeg`, `longitudeDeg`, `altitudeKm`);
6911
+ * `epochUnixUs` is the UTC instant as unix microseconds. Returns
6912
+ * `{ azimuthDeg, elevationDeg, rangeKm }` (azimuth clockwise from north).
6913
+ * Delegates to `sidereon_core::astro::bodies::sun_az_el`.
6914
+ */
6915
+ export function sunAzEl(latitude_deg: number, longitude_deg: number, altitude_km: number, epoch_unix_us: bigint): any;
6916
+
6467
6917
  /**
6468
6918
  * Sun elevation in degrees above the satellite local horizontal plane.
6469
6919
  */
@@ -6481,6 +6931,15 @@ export function sunMoonEcef(epochs_unix_us: BigInt64Array): SunMoon;
6481
6931
  */
6482
6932
  export function sunMoonEci(epochs_unix_us: BigInt64Array): SunMoon;
6483
6933
 
6934
+ /**
6935
+ * TAI-UTC (cumulative leap seconds) in effect on a UTC calendar date.
6936
+ *
6937
+ * This is **not** the GNSS "GPS - UTC" offset; for the quantity a GPS receiver
6938
+ * applies use [`gpsUtcOffsetS`] (they differ by a constant 19 s). Delegates to
6939
+ * `sidereon_core::astro::time::scales::tai_utc_offset_s`.
6940
+ */
6941
+ export function taiUtcOffsetS(year: number, month: number, day: number): number;
6942
+
6484
6943
  /**
6485
6944
  * Transform a batch of TEME states to GCRS, each at its own epoch.
6486
6945
  *
@@ -6523,8 +6982,8 @@ export function timescaleOffsetAtS(from: TimeScale, to: TimeScale, utc_jd: numbe
6523
6982
  *
6524
6983
  * Covers the atomic scales (TAI/TT/GPST/GST/QZSST/BDT), whose mutual offsets
6525
6984
  * are constants fixed by their ICDs. Throws a `RangeError` when either scale is
6526
- * UTC-based (`Utc`/`Glonasst`) those carry leap seconds, so their offset is
6527
- * epoch-dependent and needs [`timescaleOffsetAtS`] or for `Tdb` (no fixed
6985
+ * UTC-based (`Utc`/`Glonasst`): those carry leap seconds, so their offset is
6986
+ * epoch-dependent and needs [`timescaleOffsetAtS`], or for `Tdb` (no fixed
6528
6987
  * offset; resolve it through an `Instant`).
6529
6988
  */
6530
6989
  export function timescaleOffsetS(from: TimeScale, to: TimeScale): number;