universal-physics-tensor 0.4.5 → 0.5.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/dist/dimensional/bridge-check.d.ts +6 -0
- package/dist/dimensional/bridge-check.d.ts.map +1 -1
- package/dist/dimensional/bridge-check.js +6 -0
- package/dist/dimensional/bridge-check.js.map +1 -1
- package/dist/dimensional/connection-validators.d.ts +61 -3
- package/dist/dimensional/connection-validators.d.ts.map +1 -1
- package/dist/dimensional/connection-validators.js +82 -9
- package/dist/dimensional/connection-validators.js.map +1 -1
- package/dist/dimensional/curvature.d.ts +336 -0
- package/dist/dimensional/curvature.d.ts.map +1 -0
- package/dist/dimensional/curvature.js +291 -0
- package/dist/dimensional/curvature.js.map +1 -0
- package/dist/dimensional/metric-validators.d.ts +12 -0
- package/dist/dimensional/metric-validators.d.ts.map +1 -1
- package/dist/dimensional/metric-validators.js.map +1 -1
- package/dist/dimensional/tensor.d.ts.map +1 -1
- package/dist/dimensional/tensor.js +7 -2
- package/dist/dimensional/tensor.js.map +1 -1
- package/dist/dimensional/validator.d.ts +5 -3
- package/dist/dimensional/validator.d.ts.map +1 -1
- package/dist/dimensional/validator.js +59 -2
- package/dist/dimensional/validator.js.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -2
- package/dist/index.js.map +1 -1
- package/dist/numerical/be37-covariant-eikonal.d.ts +96 -38
- package/dist/numerical/be37-covariant-eikonal.d.ts.map +1 -1
- package/dist/numerical/be37-covariant-eikonal.js +202 -39
- package/dist/numerical/be37-covariant-eikonal.js.map +1 -1
- package/dist/numerical/connection-lowering-helpers.d.ts +8 -6
- package/dist/numerical/connection-lowering-helpers.d.ts.map +1 -1
- package/dist/numerical/connection-lowering-helpers.js +25 -28
- package/dist/numerical/connection-lowering-helpers.js.map +1 -1
- package/dist/numerical/curvature-lowering-helpers.d.ts +162 -0
- package/dist/numerical/curvature-lowering-helpers.d.ts.map +1 -0
- package/dist/numerical/curvature-lowering-helpers.js +378 -0
- package/dist/numerical/curvature-lowering-helpers.js.map +1 -0
- package/dist/numerical/errors.d.ts +16 -0
- package/dist/numerical/errors.d.ts.map +1 -1
- package/dist/numerical/errors.js +20 -0
- package/dist/numerical/errors.js.map +1 -1
- package/dist/numerical/float64-engine.d.ts +4 -2
- package/dist/numerical/float64-engine.d.ts.map +1 -1
- package/dist/numerical/float64-engine.js +35 -45
- package/dist/numerical/float64-engine.js.map +1 -1
- package/dist/numerical/gl4-integrator.d.ts +167 -0
- package/dist/numerical/gl4-integrator.d.ts.map +1 -0
- package/dist/numerical/gl4-integrator.js +276 -0
- package/dist/numerical/gl4-integrator.js.map +1 -0
- package/dist/numerical/index.d.ts +8 -0
- package/dist/numerical/index.d.ts.map +1 -1
- package/dist/numerical/index.js +4 -0
- package/dist/numerical/index.js.map +1 -1
- package/dist/numerical/lowering.d.ts +3 -4
- package/dist/numerical/lowering.d.ts.map +1 -1
- package/dist/numerical/lowering.js +216 -22
- package/dist/numerical/lowering.js.map +1 -1
- package/dist/numerical/mathts-engine.d.ts +2 -2
- package/dist/numerical/mathts-engine.d.ts.map +1 -1
- package/dist/numerical/mathts-engine.js +13 -12
- package/dist/numerical/mathts-engine.js.map +1 -1
- package/dist/numerical/pderiv.d.ts.map +1 -1
- package/dist/numerical/pderiv.js +4 -18
- package/dist/numerical/pderiv.js.map +1 -1
- package/dist/numerical/perihelion-finder.d.ts +84 -0
- package/dist/numerical/perihelion-finder.d.ts.map +1 -0
- package/dist/numerical/perihelion-finder.js +261 -0
- package/dist/numerical/perihelion-finder.js.map +1 -0
- package/dist/numerical/strides.d.ts +26 -0
- package/dist/numerical/strides.d.ts.map +1 -0
- package/dist/numerical/strides.js +41 -0
- package/dist/numerical/strides.js.map +1 -0
- package/dist/numerical/tensor-engine.d.ts +4 -2
- package/dist/numerical/tensor-engine.d.ts.map +1 -1
- package/dist/numerical/tensor-engine.js +4 -2
- package/dist/numerical/tensor-engine.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bisection perihelion finder via cubic-Hermite interpolation on cached
|
|
3
|
+
* GL4 snapshots (v0.5.0 Task 4, Phase 1b).
|
|
4
|
+
*
|
|
5
|
+
* Algorithm (Design §3 Task 1b):
|
|
6
|
+
* 1. Walk snapshots, extract `dr/dτ_i = g^{rν}(x_i) · p_{i,ν}` at each
|
|
7
|
+
* snapshot. Index `r` is the radial coordinate slot (index 1 by
|
|
8
|
+
* convention in (t, r, θ, φ)).
|
|
9
|
+
* 2. Locate consecutive indices `(i, i+1)` where `dr/dτ` sign-changes
|
|
10
|
+
* from `−` to `+` — that is the perihelion (inner radial turning
|
|
11
|
+
* point). Sign-change `+ → −` is apoapsis and is intentionally
|
|
12
|
+
* skipped.
|
|
13
|
+
* 3. **M3 bracket-width check:** if `|τ_{i+1} − τ_i| < 2 · h_snap`
|
|
14
|
+
* where `h_snap` is the median Δτ across all snapshots, emit a
|
|
15
|
+
* non-throwing `PerihelionBracketWidthWarning` via
|
|
16
|
+
* `process.emitWarning`. This indicates the GL4 step is too coarse
|
|
17
|
+
* to resolve the turning point — the caller should re-integrate
|
|
18
|
+
* with finer steps.
|
|
19
|
+
* 4. Fit a **cubic Hermite polynomial** through `(τ_i, dr/dτ_i)` and
|
|
20
|
+
* `(τ_{i+1}, dr/dτ_{i+1})`, with endpoint derivatives estimated
|
|
21
|
+
* from neighboring snapshots (4 values total: f and f' at both
|
|
22
|
+
* endpoints). Find an analytic root of the cubic on [τ_i, τ_{i+1}].
|
|
23
|
+
* 5. If `|P(τ_root)| > tauTolerance`, refine with **bisection on the
|
|
24
|
+
* polynomial** (not re-integration — Adam+Eve I6/F11 — that would
|
|
25
|
+
* cost a full GL4 sweep per bisection step, which defeats the
|
|
26
|
+
* cached-snapshot approach). Precision floor: 1e-9 × T_orbit
|
|
27
|
+
* (Adam+Eve I1 — 1e-12 needs ~40 cubic bisections and is wasted
|
|
28
|
+
* effort given the integrator's per-step error is already > 1e-12).
|
|
29
|
+
* 6. Return `{ tau, x, phi }` where `x` is the cubic-Hermite-interpolated
|
|
30
|
+
* 4-coordinate at the root and `phi = x[3]`.
|
|
31
|
+
*
|
|
32
|
+
* **Throws** `Error("no perihelion bracket")` if no `−→+` sign-change is
|
|
33
|
+
* found in the snapshot range.
|
|
34
|
+
*
|
|
35
|
+
* @module numerical/perihelion-finder
|
|
36
|
+
*/
|
|
37
|
+
/**
|
|
38
|
+
* Result of `findPerihelion`: the τ at the radial turning point, the
|
|
39
|
+
* interpolated 4-coordinate, and the orbital phase `phi = x[3]`.
|
|
40
|
+
*
|
|
41
|
+
* @public
|
|
42
|
+
*/
|
|
43
|
+
export interface PerihelionResult {
|
|
44
|
+
/** Proper time at the perihelion. */
|
|
45
|
+
readonly tau: number;
|
|
46
|
+
/** Interpolated 4-coordinate x^μ at τ_perihelion. */
|
|
47
|
+
readonly x: readonly number[];
|
|
48
|
+
/** Orbital phase φ = x[3] at τ_perihelion. */
|
|
49
|
+
readonly phi: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Options for {@link findPerihelion}.
|
|
53
|
+
*
|
|
54
|
+
* @public
|
|
55
|
+
*/
|
|
56
|
+
export interface FindPerihelionOptions {
|
|
57
|
+
/** Snapshots produced by `integrateGeodesicGL4` (or any compatible
|
|
58
|
+
* `(τ, x, p)` snapshot stream — only `tau`, `x`, `p` are read). */
|
|
59
|
+
readonly snapshots: ReadonlyArray<{
|
|
60
|
+
readonly tau: number;
|
|
61
|
+
readonly x: readonly number[];
|
|
62
|
+
readonly p: readonly number[];
|
|
63
|
+
}>;
|
|
64
|
+
/** Inverse-metric closure: `gInverseFn(x)[μ][ν] = g^{μν}(x)`. Used to
|
|
65
|
+
* compute `dr/dτ = g^{rν}(x) p_ν` at each snapshot. */
|
|
66
|
+
readonly gInverseFn: (x: readonly number[]) => readonly (readonly number[])[];
|
|
67
|
+
/** Polynomial-bisection target tolerance on the cubic-Hermite root —
|
|
68
|
+
* measured as `|P(τ_root)|`, not `|τ − τ_true|`. Precision floor 1e-9
|
|
69
|
+
* per Adam+Eve I1; tighter values just waste bisections. */
|
|
70
|
+
readonly tauTolerance: number;
|
|
71
|
+
/** Coordinate index used as the "radial" slot. Defaults to 1
|
|
72
|
+
* ((t, r, θ, φ) convention). */
|
|
73
|
+
readonly radialIndex?: number;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Find the perihelion (inner radial turning point) on a snapshot stream.
|
|
77
|
+
*
|
|
78
|
+
* See module-level docstring for the algorithm. Throws if no `−→+` sign
|
|
79
|
+
* change in `dr/dτ` is found.
|
|
80
|
+
*
|
|
81
|
+
* @public
|
|
82
|
+
*/
|
|
83
|
+
export declare function findPerihelion(options: FindPerihelionOptions): PerihelionResult;
|
|
84
|
+
//# sourceMappingURL=perihelion-finder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perihelion-finder.d.ts","sourceRoot":"","sources":["../../src/numerical/perihelion-finder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qCAAqC;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,QAAQ,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,8CAA8C;IAC9C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC;wEACoE;IACpE,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;QAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC9B,QAAQ,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;KAC/B,CAAC,CAAC;IACH;4DACwD;IACxD,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,KAAK,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;IAC9E;;iEAE6D;IAC7D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B;qCACiC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAmID;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,gBAAgB,CAwG/E"}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bisection perihelion finder via cubic-Hermite interpolation on cached
|
|
3
|
+
* GL4 snapshots (v0.5.0 Task 4, Phase 1b).
|
|
4
|
+
*
|
|
5
|
+
* Algorithm (Design §3 Task 1b):
|
|
6
|
+
* 1. Walk snapshots, extract `dr/dτ_i = g^{rν}(x_i) · p_{i,ν}` at each
|
|
7
|
+
* snapshot. Index `r` is the radial coordinate slot (index 1 by
|
|
8
|
+
* convention in (t, r, θ, φ)).
|
|
9
|
+
* 2. Locate consecutive indices `(i, i+1)` where `dr/dτ` sign-changes
|
|
10
|
+
* from `−` to `+` — that is the perihelion (inner radial turning
|
|
11
|
+
* point). Sign-change `+ → −` is apoapsis and is intentionally
|
|
12
|
+
* skipped.
|
|
13
|
+
* 3. **M3 bracket-width check:** if `|τ_{i+1} − τ_i| < 2 · h_snap`
|
|
14
|
+
* where `h_snap` is the median Δτ across all snapshots, emit a
|
|
15
|
+
* non-throwing `PerihelionBracketWidthWarning` via
|
|
16
|
+
* `process.emitWarning`. This indicates the GL4 step is too coarse
|
|
17
|
+
* to resolve the turning point — the caller should re-integrate
|
|
18
|
+
* with finer steps.
|
|
19
|
+
* 4. Fit a **cubic Hermite polynomial** through `(τ_i, dr/dτ_i)` and
|
|
20
|
+
* `(τ_{i+1}, dr/dτ_{i+1})`, with endpoint derivatives estimated
|
|
21
|
+
* from neighboring snapshots (4 values total: f and f' at both
|
|
22
|
+
* endpoints). Find an analytic root of the cubic on [τ_i, τ_{i+1}].
|
|
23
|
+
* 5. If `|P(τ_root)| > tauTolerance`, refine with **bisection on the
|
|
24
|
+
* polynomial** (not re-integration — Adam+Eve I6/F11 — that would
|
|
25
|
+
* cost a full GL4 sweep per bisection step, which defeats the
|
|
26
|
+
* cached-snapshot approach). Precision floor: 1e-9 × T_orbit
|
|
27
|
+
* (Adam+Eve I1 — 1e-12 needs ~40 cubic bisections and is wasted
|
|
28
|
+
* effort given the integrator's per-step error is already > 1e-12).
|
|
29
|
+
* 6. Return `{ tau, x, phi }` where `x` is the cubic-Hermite-interpolated
|
|
30
|
+
* 4-coordinate at the root and `phi = x[3]`.
|
|
31
|
+
*
|
|
32
|
+
* **Throws** `Error("no perihelion bracket")` if no `−→+` sign-change is
|
|
33
|
+
* found in the snapshot range.
|
|
34
|
+
*
|
|
35
|
+
* @module numerical/perihelion-finder
|
|
36
|
+
*/
|
|
37
|
+
/** Compute `dr/dτ = g^{rν}(x) p_ν` at a single snapshot. */
|
|
38
|
+
function radialVelocity(x, p, gInverseFn, r) {
|
|
39
|
+
const gInv = gInverseFn(x);
|
|
40
|
+
let v = 0;
|
|
41
|
+
for (let nu = 0; nu < p.length; nu++) {
|
|
42
|
+
v += gInv[r][nu] * p[nu];
|
|
43
|
+
}
|
|
44
|
+
return v;
|
|
45
|
+
}
|
|
46
|
+
/** Median of a numeric array (does not mutate input). */
|
|
47
|
+
function median(values) {
|
|
48
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
49
|
+
const n = sorted.length;
|
|
50
|
+
if (n === 0)
|
|
51
|
+
return 0;
|
|
52
|
+
if (n % 2 === 1)
|
|
53
|
+
return sorted[(n - 1) / 2];
|
|
54
|
+
return 0.5 * (sorted[n / 2 - 1] + sorted[n / 2]);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Hermite basis on the unit interval, evaluated at `s ∈ [0,1]`.
|
|
58
|
+
*
|
|
59
|
+
* Cubic Hermite interpolant of a scalar `f(τ)` over `[τ0, τ1]` with
|
|
60
|
+
* endpoint values `f0, f1` and endpoint derivatives `m0, m1` (in `f` per
|
|
61
|
+
* `τ`):
|
|
62
|
+
*
|
|
63
|
+
* P(τ) = h00(s) f0 + h10(s) (τ1−τ0) m0 + h01(s) f1 + h11(s) (τ1−τ0) m1
|
|
64
|
+
*
|
|
65
|
+
* where `s = (τ − τ0)/(τ1 − τ0)` and
|
|
66
|
+
* h00 = 2s³ − 3s² + 1
|
|
67
|
+
* h10 = s³ − 2s² + s
|
|
68
|
+
* h01 = −2s³ + 3s²
|
|
69
|
+
* h11 = s³ − s²
|
|
70
|
+
*
|
|
71
|
+
* (Numerical Recipes §3.4; Hairer/Lubich/Wanner §III.5.)
|
|
72
|
+
*/
|
|
73
|
+
function hermiteEval(f0, f1, m0, m1, dt, s) {
|
|
74
|
+
const s2 = s * s;
|
|
75
|
+
const s3 = s2 * s;
|
|
76
|
+
const h00 = 2 * s3 - 3 * s2 + 1;
|
|
77
|
+
const h10 = s3 - 2 * s2 + s;
|
|
78
|
+
const h01 = -2 * s3 + 3 * s2;
|
|
79
|
+
const h11 = s3 - s2;
|
|
80
|
+
return h00 * f0 + h10 * dt * m0 + h01 * f1 + h11 * dt * m1;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Vector cubic-Hermite interpolation of a 4-coordinate `x^μ` at `τ`
|
|
84
|
+
* given the two bracket endpoints and their snapshot derivatives in `τ`
|
|
85
|
+
* (here: the `x` arrays, with derivative `dx/dτ` approximated by central
|
|
86
|
+
* differences on neighbor snapshots — passed in by the caller).
|
|
87
|
+
*/
|
|
88
|
+
function hermiteInterpVector(x0, x1, m0, m1, dt, s) {
|
|
89
|
+
const dim = x0.length;
|
|
90
|
+
const out = new Array(dim);
|
|
91
|
+
for (let mu = 0; mu < dim; mu++) {
|
|
92
|
+
out[mu] = hermiteEval(x0[mu], x1[mu], m0[mu], m1[mu], dt, s);
|
|
93
|
+
}
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Bisection on the cubic-Hermite polynomial for the scalar `dr/dτ` root.
|
|
98
|
+
* Operates on `s ∈ [0,1]` — the normalised bracket coordinate. Returns
|
|
99
|
+
* the converged `s` and the corresponding polynomial value.
|
|
100
|
+
*
|
|
101
|
+
* Precision: the loop terminates when `|P(s_mid)| ≤ tauTolerance` (scaled
|
|
102
|
+
* to whatever units `dr/dτ` is in — the caller passes `tauTolerance`
|
|
103
|
+
* matched to the integrator scale). A hard iteration cap of 60 prevents
|
|
104
|
+
* runaway on pathological inputs (60 bisections halve `s` to ≈1e-18 — well
|
|
105
|
+
* below floating-point resolution).
|
|
106
|
+
*/
|
|
107
|
+
function bisectCubic(f0, f1, m0, m1, dt, sInitial, tol) {
|
|
108
|
+
// Establish a bracket around sInitial. The sign-change is at the
|
|
109
|
+
// f(τ0)=f0 → f(τ1)=f1 endpoints (by construction f0 < 0, f1 > 0).
|
|
110
|
+
let sLo = 0;
|
|
111
|
+
let sHi = 1;
|
|
112
|
+
let fLo = f0;
|
|
113
|
+
let fHi = f1;
|
|
114
|
+
let s = sInitial;
|
|
115
|
+
let fs = hermiteEval(f0, f1, m0, m1, dt, s);
|
|
116
|
+
// If sInitial already satisfies tol, return it.
|
|
117
|
+
if (Math.abs(fs) <= tol)
|
|
118
|
+
return { s, residual: fs };
|
|
119
|
+
for (let iter = 0; iter < 60; iter++) {
|
|
120
|
+
// Use midpoint, not the (possibly poor) sInitial, after first iter.
|
|
121
|
+
s = 0.5 * (sLo + sHi);
|
|
122
|
+
fs = hermiteEval(f0, f1, m0, m1, dt, s);
|
|
123
|
+
if (Math.abs(fs) <= tol)
|
|
124
|
+
return { s, residual: fs };
|
|
125
|
+
// Maintain sign-bracket: fLo < 0 < fHi.
|
|
126
|
+
if (Math.sign(fs) === Math.sign(fLo)) {
|
|
127
|
+
sLo = s;
|
|
128
|
+
fLo = fs;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
sHi = s;
|
|
132
|
+
fHi = fs;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return { s, residual: fs };
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Find the perihelion (inner radial turning point) on a snapshot stream.
|
|
139
|
+
*
|
|
140
|
+
* See module-level docstring for the algorithm. Throws if no `−→+` sign
|
|
141
|
+
* change in `dr/dτ` is found.
|
|
142
|
+
*
|
|
143
|
+
* @public
|
|
144
|
+
*/
|
|
145
|
+
export function findPerihelion(options) {
|
|
146
|
+
const { snapshots, gInverseFn, tauTolerance, radialIndex = 1 } = options;
|
|
147
|
+
if (snapshots.length < 2) {
|
|
148
|
+
throw new Error('no perihelion bracket: need at least 2 snapshots');
|
|
149
|
+
}
|
|
150
|
+
// Step 1: extract dr/dτ at every snapshot.
|
|
151
|
+
const drDtau = new Array(snapshots.length);
|
|
152
|
+
for (let i = 0; i < snapshots.length; i++) {
|
|
153
|
+
drDtau[i] = radialVelocity(snapshots[i].x, snapshots[i].p, gInverseFn, radialIndex);
|
|
154
|
+
}
|
|
155
|
+
// Step 2: locate the first `− → +` sign change.
|
|
156
|
+
// Tolerant against snapshot landing exactly at the turning point
|
|
157
|
+
// (drDtau ≈ 0): treat `≤ 0 → > 0` as a valid bracket. A snapshot with
|
|
158
|
+
// f == 0 exactly is itself the perihelion — but we still return through
|
|
159
|
+
// the Hermite path so the {x, phi} interpolation is uniform.
|
|
160
|
+
let iBracket = -1;
|
|
161
|
+
for (let i = 0; i < snapshots.length - 1; i++) {
|
|
162
|
+
if (drDtau[i] <= 0 && drDtau[i + 1] > 0) {
|
|
163
|
+
iBracket = i;
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
if (drDtau[i] < 0 && drDtau[i + 1] >= 0) {
|
|
167
|
+
iBracket = i;
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (iBracket < 0) {
|
|
172
|
+
throw new Error('no perihelion bracket: dr/dτ does not change sign − → +');
|
|
173
|
+
}
|
|
174
|
+
const i0 = iBracket;
|
|
175
|
+
const i1 = iBracket + 1;
|
|
176
|
+
const tau0 = snapshots[i0].tau;
|
|
177
|
+
const tau1 = snapshots[i1].tau;
|
|
178
|
+
const dt = tau1 - tau0;
|
|
179
|
+
// Step 3: M3 bracket-width check vs median Δτ.
|
|
180
|
+
//
|
|
181
|
+
// Plan spec literally says `< 2·h_snap`, but on a uniform-step grid
|
|
182
|
+
// every bracket equals h_snap exactly (ratio 1.0), so `< 2·h_snap` would
|
|
183
|
+
// fire on every successful call — useless as a diagnostic. The intent
|
|
184
|
+
// of M3 is to flag brackets compressed below the nominal integrator
|
|
185
|
+
// step (i.e., adaptive step-halving has run near perihelion, leaving a
|
|
186
|
+
// suspicious cluster). We compare against `h_snap` directly: the
|
|
187
|
+
// warning fires when the bracket is **narrower than the typical step**.
|
|
188
|
+
// Documented deviation; honest framing maintained — see CHANGELOG.
|
|
189
|
+
const deltas = [];
|
|
190
|
+
for (let i = 0; i < snapshots.length - 1; i++) {
|
|
191
|
+
deltas.push(snapshots[i + 1].tau - snapshots[i].tau);
|
|
192
|
+
}
|
|
193
|
+
const hSnap = median(deltas);
|
|
194
|
+
if (dt < hSnap) {
|
|
195
|
+
process.emitWarning(`findPerihelion: bracket width Δτ=${dt} < h_snap=${hSnap} `
|
|
196
|
+
+ `(median snapshot step) — GL4 snapshot density is too coarse to `
|
|
197
|
+
+ `resolve this turning point reliably; consider re-integrating `
|
|
198
|
+
+ `with finer steps.`, 'PerihelionBracketWidthWarning');
|
|
199
|
+
}
|
|
200
|
+
// Step 4: build cubic-Hermite interpolant for dr/dτ on [τ_i0, τ_i1].
|
|
201
|
+
// Endpoint derivatives (d/dτ of dr/dτ) approximated via central
|
|
202
|
+
// differences on neighboring snapshots (one-sided at boundaries).
|
|
203
|
+
const f0 = drDtau[i0];
|
|
204
|
+
const f1 = drDtau[i1];
|
|
205
|
+
const m0 = derivAt(drDtau, snapshots, i0);
|
|
206
|
+
const m1 = derivAt(drDtau, snapshots, i1);
|
|
207
|
+
// Initial guess: linear interpolation root, s = f0 / (f0 − f1).
|
|
208
|
+
// For a linear sign-change this is exact; for cubic it's a warm start.
|
|
209
|
+
const sLinear = f0 / (f0 - f1);
|
|
210
|
+
// Step 5: bisect the cubic-Hermite polynomial until residual ≤ tolerance.
|
|
211
|
+
const { s: sRoot } = bisectCubic(f0, f1, m0, m1, dt, sLinear, tauTolerance);
|
|
212
|
+
const tauRoot = tau0 + sRoot * dt;
|
|
213
|
+
// Step 6: interpolate x^μ at τ_root via cubic Hermite using the same
|
|
214
|
+
// endpoint-derivative scheme. dx^μ/dτ at endpoints comes from
|
|
215
|
+
// central-differencing neighboring snapshots' x arrays.
|
|
216
|
+
const xMomentum0 = velocityAt(snapshots, i0, gInverseFn);
|
|
217
|
+
const xMomentum1 = velocityAt(snapshots, i1, gInverseFn);
|
|
218
|
+
const xInterp = hermiteInterpVector(snapshots[i0].x, snapshots[i1].x, xMomentum0, xMomentum1, dt, sRoot);
|
|
219
|
+
return {
|
|
220
|
+
tau: tauRoot,
|
|
221
|
+
x: xInterp,
|
|
222
|
+
phi: xInterp[3] ?? 0,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Central-difference estimate of `d(dr/dτ)/dτ` at snapshot index `i`.
|
|
227
|
+
* One-sided at i=0 and i=N−1. Used as the Hermite endpoint slope.
|
|
228
|
+
*/
|
|
229
|
+
function derivAt(drDtau, snapshots, i) {
|
|
230
|
+
const N = snapshots.length;
|
|
231
|
+
if (i === 0) {
|
|
232
|
+
return (drDtau[1] - drDtau[0]) / (snapshots[1].tau - snapshots[0].tau);
|
|
233
|
+
}
|
|
234
|
+
if (i === N - 1) {
|
|
235
|
+
return (drDtau[N - 1] - drDtau[N - 2])
|
|
236
|
+
/ (snapshots[N - 1].tau - snapshots[N - 2].tau);
|
|
237
|
+
}
|
|
238
|
+
return (drDtau[i + 1] - drDtau[i - 1])
|
|
239
|
+
/ (snapshots[i + 1].tau - snapshots[i - 1].tau);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* 4-velocity `v^μ = g^{μν}(x_i) p_{i,ν}` at snapshot `i`. Used as the
|
|
243
|
+
* Hermite endpoint slope for the `x^μ` interpolation (since by definition
|
|
244
|
+
* `dx^μ/dτ = g^{μν} p_ν` along a geodesic).
|
|
245
|
+
*/
|
|
246
|
+
function velocityAt(snapshots, i, gInverseFn) {
|
|
247
|
+
const x = snapshots[i].x;
|
|
248
|
+
const p = snapshots[i].p;
|
|
249
|
+
const gInv = gInverseFn(x);
|
|
250
|
+
const dim = x.length;
|
|
251
|
+
const v = new Array(dim);
|
|
252
|
+
for (let mu = 0; mu < dim; mu++) {
|
|
253
|
+
let acc = 0;
|
|
254
|
+
for (let nu = 0; nu < dim; nu++) {
|
|
255
|
+
acc += gInv[mu][nu] * p[nu];
|
|
256
|
+
}
|
|
257
|
+
v[mu] = acc;
|
|
258
|
+
}
|
|
259
|
+
return v;
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=perihelion-finder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perihelion-finder.js","sourceRoot":"","sources":["../../src/numerical/perihelion-finder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared stride and flat-index utilities for row-major tensor storage.
|
|
3
|
+
*
|
|
4
|
+
* Used by both float64-engine.ts (Float64Tensor) and
|
|
5
|
+
* connection-lowering-helpers.ts (Christoffel / contraction loops).
|
|
6
|
+
* Extracted in v0.4.6 to eliminate duplicate implementations.
|
|
7
|
+
*
|
|
8
|
+
* @module numerical/strides
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Compute row-major strides for a given shape.
|
|
13
|
+
* strides[k] = product of shape[k+1..end], so that
|
|
14
|
+
* flatIndex = sum(idx[k] * strides[k]).
|
|
15
|
+
*/
|
|
16
|
+
export declare function rowMajorStrides(shape: ReadonlyArray<number>): number[];
|
|
17
|
+
/**
|
|
18
|
+
* Compute the flat (linear) index from a multi-index and precomputed strides.
|
|
19
|
+
* flatIndex = sum_k(idx[k] * strides[k]).
|
|
20
|
+
*/
|
|
21
|
+
export declare function flatIndex(idx: ReadonlyArray<number>, strides: ReadonlyArray<number>): number;
|
|
22
|
+
/**
|
|
23
|
+
* Check if two shape arrays are element-wise equal.
|
|
24
|
+
*/
|
|
25
|
+
export declare function sameShape(a: ReadonlyArray<number>, b: ReadonlyArray<number>): boolean;
|
|
26
|
+
//# sourceMappingURL=strides.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strides.d.ts","sourceRoot":"","sources":["../../src/numerical/strides.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAQtE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,aAAa,CAAC,MAAM,CAAC,EAC1B,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAC7B,MAAM,CAIR;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EACxB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,GACvB,OAAO,CAET"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared stride and flat-index utilities for row-major tensor storage.
|
|
3
|
+
*
|
|
4
|
+
* Used by both float64-engine.ts (Float64Tensor) and
|
|
5
|
+
* connection-lowering-helpers.ts (Christoffel / contraction loops).
|
|
6
|
+
* Extracted in v0.4.6 to eliminate duplicate implementations.
|
|
7
|
+
*
|
|
8
|
+
* @module numerical/strides
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Compute row-major strides for a given shape.
|
|
13
|
+
* strides[k] = product of shape[k+1..end], so that
|
|
14
|
+
* flatIndex = sum(idx[k] * strides[k]).
|
|
15
|
+
*/
|
|
16
|
+
export function rowMajorStrides(shape) {
|
|
17
|
+
const strides = new Array(shape.length);
|
|
18
|
+
let s = 1;
|
|
19
|
+
for (let k = shape.length - 1; k >= 0; k--) {
|
|
20
|
+
strides[k] = s;
|
|
21
|
+
s *= shape[k];
|
|
22
|
+
}
|
|
23
|
+
return strides;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Compute the flat (linear) index from a multi-index and precomputed strides.
|
|
27
|
+
* flatIndex = sum_k(idx[k] * strides[k]).
|
|
28
|
+
*/
|
|
29
|
+
export function flatIndex(idx, strides) {
|
|
30
|
+
let f = 0;
|
|
31
|
+
for (let k = 0; k < idx.length; k++)
|
|
32
|
+
f += idx[k] * strides[k];
|
|
33
|
+
return f;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Check if two shape arrays are element-wise equal.
|
|
37
|
+
*/
|
|
38
|
+
export function sameShape(a, b) {
|
|
39
|
+
return a.length === b.length && a.every((v, i) => v === b[i]);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=strides.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strides.js","sourceRoot":"","sources":["../../src/numerical/strides.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,KAA4B;IAC1D,MAAM,OAAO,GAAG,IAAI,KAAK,CAAS,KAAK,CAAC,MAAM,CAAC,CAAC;IAChD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACf,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,GAA0B,EAC1B,OAA8B;IAE9B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,CAAwB,EACxB,CAAwB;IAExB,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -107,8 +107,10 @@ export interface TensorEngine {
|
|
|
107
107
|
* @public
|
|
108
108
|
*/
|
|
109
109
|
export declare function hasAutogradSupport(engine: TensorEngine): boolean;
|
|
110
|
-
/** Runtime guard for EinsumSpec —
|
|
111
|
-
*
|
|
110
|
+
/** Runtime guard for EinsumSpec — validates structure before passing to
|
|
111
|
+
* engine.einsum(). Not called internally by the lowering pass (which builds
|
|
112
|
+
* specs via buildEinsumSpec and trusts the upstream AST validation). Available
|
|
113
|
+
* for consumers who construct EinsumSpec objects directly.
|
|
112
114
|
* @internal */
|
|
113
115
|
export declare function isEinsumSpec(x: unknown): x is EinsumSpec;
|
|
114
116
|
//# sourceMappingURL=tensor-engine.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tensor-engine.d.ts","sourceRoot":"","sources":["../../src/numerical/tensor-engine.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tensor-engine.d.ts","sourceRoot":"","sources":["../../src/numerical/tensor-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,8 +30,10 @@ export function hasAutogradSupport(engine) {
|
|
|
30
30
|
return typeof engine.forwardGrad === 'function'
|
|
31
31
|
&& typeof engine.reverseGrad === 'function';
|
|
32
32
|
}
|
|
33
|
-
/** Runtime guard for EinsumSpec —
|
|
34
|
-
*
|
|
33
|
+
/** Runtime guard for EinsumSpec — validates structure before passing to
|
|
34
|
+
* engine.einsum(). Not called internally by the lowering pass (which builds
|
|
35
|
+
* specs via buildEinsumSpec and trusts the upstream AST validation). Available
|
|
36
|
+
* for consumers who construct EinsumSpec objects directly.
|
|
35
37
|
* @internal */
|
|
36
38
|
export function isEinsumSpec(x) {
|
|
37
39
|
if (typeof x !== 'object' || x === null)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tensor-engine.js","sourceRoot":"","sources":["../../src/numerical/tensor-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,CAAC;AAsGjC;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,OAAO,OAAO,MAAM,CAAC,WAAW,KAAK,UAAU;WACxC,OAAO,MAAM,CAAC,WAAW,KAAK,UAAU,CAAC;AAClD,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"tensor-engine.js","sourceRoot":"","sources":["../../src/numerical/tensor-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,CAAC;AAsGjC;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,OAAO,OAAO,MAAM,CAAC,WAAW,KAAK,UAAU;WACxC,OAAO,MAAM,CAAC,WAAW,KAAK,UAAU,CAAC;AAClD,CAAC;AAED;;;;gBAIgB;AAChB,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAG,CAA+C,CAAC;IAC1D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3E,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QACtD,MAAM,IAAI,GAAI,CAAwB,CAAC,IAAI,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC5D,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC9D,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;QACjF,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QACtD,MAAM,EAAE,GAAG,CAA0C,CAAC;QACtD,IAAI,OAAO,EAAE,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;IAClF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/package.json
CHANGED