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.
Files changed (78) hide show
  1. package/dist/dimensional/bridge-check.d.ts +6 -0
  2. package/dist/dimensional/bridge-check.d.ts.map +1 -1
  3. package/dist/dimensional/bridge-check.js +6 -0
  4. package/dist/dimensional/bridge-check.js.map +1 -1
  5. package/dist/dimensional/connection-validators.d.ts +61 -3
  6. package/dist/dimensional/connection-validators.d.ts.map +1 -1
  7. package/dist/dimensional/connection-validators.js +82 -9
  8. package/dist/dimensional/connection-validators.js.map +1 -1
  9. package/dist/dimensional/curvature.d.ts +336 -0
  10. package/dist/dimensional/curvature.d.ts.map +1 -0
  11. package/dist/dimensional/curvature.js +291 -0
  12. package/dist/dimensional/curvature.js.map +1 -0
  13. package/dist/dimensional/metric-validators.d.ts +12 -0
  14. package/dist/dimensional/metric-validators.d.ts.map +1 -1
  15. package/dist/dimensional/metric-validators.js.map +1 -1
  16. package/dist/dimensional/tensor.d.ts.map +1 -1
  17. package/dist/dimensional/tensor.js +7 -2
  18. package/dist/dimensional/tensor.js.map +1 -1
  19. package/dist/dimensional/validator.d.ts +5 -3
  20. package/dist/dimensional/validator.d.ts.map +1 -1
  21. package/dist/dimensional/validator.js +59 -2
  22. package/dist/dimensional/validator.js.map +1 -1
  23. package/dist/index.d.ts +8 -2
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +21 -2
  26. package/dist/index.js.map +1 -1
  27. package/dist/numerical/be37-covariant-eikonal.d.ts +96 -38
  28. package/dist/numerical/be37-covariant-eikonal.d.ts.map +1 -1
  29. package/dist/numerical/be37-covariant-eikonal.js +202 -39
  30. package/dist/numerical/be37-covariant-eikonal.js.map +1 -1
  31. package/dist/numerical/connection-lowering-helpers.d.ts +8 -6
  32. package/dist/numerical/connection-lowering-helpers.d.ts.map +1 -1
  33. package/dist/numerical/connection-lowering-helpers.js +25 -28
  34. package/dist/numerical/connection-lowering-helpers.js.map +1 -1
  35. package/dist/numerical/curvature-lowering-helpers.d.ts +162 -0
  36. package/dist/numerical/curvature-lowering-helpers.d.ts.map +1 -0
  37. package/dist/numerical/curvature-lowering-helpers.js +378 -0
  38. package/dist/numerical/curvature-lowering-helpers.js.map +1 -0
  39. package/dist/numerical/errors.d.ts +16 -0
  40. package/dist/numerical/errors.d.ts.map +1 -1
  41. package/dist/numerical/errors.js +20 -0
  42. package/dist/numerical/errors.js.map +1 -1
  43. package/dist/numerical/float64-engine.d.ts +4 -2
  44. package/dist/numerical/float64-engine.d.ts.map +1 -1
  45. package/dist/numerical/float64-engine.js +35 -45
  46. package/dist/numerical/float64-engine.js.map +1 -1
  47. package/dist/numerical/gl4-integrator.d.ts +167 -0
  48. package/dist/numerical/gl4-integrator.d.ts.map +1 -0
  49. package/dist/numerical/gl4-integrator.js +276 -0
  50. package/dist/numerical/gl4-integrator.js.map +1 -0
  51. package/dist/numerical/index.d.ts +8 -0
  52. package/dist/numerical/index.d.ts.map +1 -1
  53. package/dist/numerical/index.js +4 -0
  54. package/dist/numerical/index.js.map +1 -1
  55. package/dist/numerical/lowering.d.ts +3 -4
  56. package/dist/numerical/lowering.d.ts.map +1 -1
  57. package/dist/numerical/lowering.js +216 -22
  58. package/dist/numerical/lowering.js.map +1 -1
  59. package/dist/numerical/mathts-engine.d.ts +2 -2
  60. package/dist/numerical/mathts-engine.d.ts.map +1 -1
  61. package/dist/numerical/mathts-engine.js +13 -12
  62. package/dist/numerical/mathts-engine.js.map +1 -1
  63. package/dist/numerical/pderiv.d.ts.map +1 -1
  64. package/dist/numerical/pderiv.js +4 -18
  65. package/dist/numerical/pderiv.js.map +1 -1
  66. package/dist/numerical/perihelion-finder.d.ts +84 -0
  67. package/dist/numerical/perihelion-finder.d.ts.map +1 -0
  68. package/dist/numerical/perihelion-finder.js +261 -0
  69. package/dist/numerical/perihelion-finder.js.map +1 -0
  70. package/dist/numerical/strides.d.ts +26 -0
  71. package/dist/numerical/strides.d.ts.map +1 -0
  72. package/dist/numerical/strides.js +41 -0
  73. package/dist/numerical/strides.js.map +1 -0
  74. package/dist/numerical/tensor-engine.d.ts +4 -2
  75. package/dist/numerical/tensor-engine.d.ts.map +1 -1
  76. package/dist/numerical/tensor-engine.js +4 -2
  77. package/dist/numerical/tensor-engine.js.map +1 -1
  78. 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 — used at the lowering→engine boundary so a
111
- * malformed spec fails loudly rather than producing a wrong-shape tensor.
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 — used at the lowering→engine boundary so a
34
- * malformed spec fails loudly rather than producing a wrong-shape tensor.
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;;gBAEgB;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"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "universal-physics-tensor",
3
- "version": "0.4.5",
3
+ "version": "0.5.0",
4
4
  "description": "Computational framework for exploring unified physics through tensor formalism",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",