universal-physics-tensor 0.5.1 → 0.7.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.
Files changed (378) hide show
  1. package/README.md +66 -105
  2. package/dist/bridges/catalog-adapter.d.ts +116 -0
  3. package/dist/bridges/catalog-adapter.d.ts.map +1 -0
  4. package/dist/bridges/catalog-adapter.js +302 -0
  5. package/dist/bridges/catalog-adapter.js.map +1 -0
  6. package/dist/bridges/equations/_be-helpers.d.ts +145 -0
  7. package/dist/bridges/equations/_be-helpers.d.ts.map +1 -0
  8. package/dist/bridges/equations/_be-helpers.js +179 -0
  9. package/dist/bridges/equations/_be-helpers.js.map +1 -0
  10. package/dist/bridges/equations/be-11-decoherence-master.d.ts +1 -2
  11. package/dist/bridges/equations/be-11-decoherence-master.d.ts.map +1 -1
  12. package/dist/bridges/equations/be-11-decoherence-master.js +9 -20
  13. package/dist/bridges/equations/be-11-decoherence-master.js.map +1 -1
  14. package/dist/bridges/equations/be-12-coherence-length.d.ts +7 -1
  15. package/dist/bridges/equations/be-12-coherence-length.d.ts.map +1 -1
  16. package/dist/bridges/equations/be-12-coherence-length.js +8 -16
  17. package/dist/bridges/equations/be-12-coherence-length.js.map +1 -1
  18. package/dist/bridges/equations/be-13-einstein-trace.d.ts +51 -3
  19. package/dist/bridges/equations/be-13-einstein-trace.d.ts.map +1 -1
  20. package/dist/bridges/equations/be-13-einstein-trace.js +74 -17
  21. package/dist/bridges/equations/be-13-einstein-trace.js.map +1 -1
  22. package/dist/bridges/equations/be-14-ryu-takayanagi.d.ts +10 -4
  23. package/dist/bridges/equations/be-14-ryu-takayanagi.d.ts.map +1 -1
  24. package/dist/bridges/equations/be-14-ryu-takayanagi.js +6 -17
  25. package/dist/bridges/equations/be-14-ryu-takayanagi.js.map +1 -1
  26. package/dist/bridges/equations/be-15-emergence.d.ts +7 -1
  27. package/dist/bridges/equations/be-15-emergence.d.ts.map +1 -1
  28. package/dist/bridges/equations/be-15-emergence.js +12 -22
  29. package/dist/bridges/equations/be-15-emergence.js.map +1 -1
  30. package/dist/bridges/equations/be-16-landauer.d.ts +7 -1
  31. package/dist/bridges/equations/be-16-landauer.d.ts.map +1 -1
  32. package/dist/bridges/equations/be-16-landauer.js +5 -13
  33. package/dist/bridges/equations/be-16-landauer.js.map +1 -1
  34. package/dist/bridges/equations/be-17-einstein-cartan.d.ts +26 -13
  35. package/dist/bridges/equations/be-17-einstein-cartan.d.ts.map +1 -1
  36. package/dist/bridges/equations/be-17-einstein-cartan.js +28 -31
  37. package/dist/bridges/equations/be-17-einstein-cartan.js.map +1 -1
  38. package/dist/bridges/equations/be-18-higgs-mass.d.ts +7 -1
  39. package/dist/bridges/equations/be-18-higgs-mass.d.ts.map +1 -1
  40. package/dist/bridges/equations/be-18-higgs-mass.js +5 -16
  41. package/dist/bridges/equations/be-18-higgs-mass.js.map +1 -1
  42. package/dist/bridges/equations/be-19-quantum-bounce.d.ts +38 -3
  43. package/dist/bridges/equations/be-19-quantum-bounce.d.ts.map +1 -1
  44. package/dist/bridges/equations/be-19-quantum-bounce.js +69 -20
  45. package/dist/bridges/equations/be-19-quantum-bounce.js.map +1 -1
  46. package/dist/bridges/equations/be-20-vacuum-energy.d.ts +20 -1
  47. package/dist/bridges/equations/be-20-vacuum-energy.d.ts.map +1 -1
  48. package/dist/bridges/equations/be-20-vacuum-energy.js +36 -15
  49. package/dist/bridges/equations/be-20-vacuum-energy.js.map +1 -1
  50. package/dist/bridges/equations/be-21-kss-bound.d.ts +2 -0
  51. package/dist/bridges/equations/be-21-kss-bound.d.ts.map +1 -1
  52. package/dist/bridges/equations/be-21-kss-bound.js +4 -10
  53. package/dist/bridges/equations/be-21-kss-bound.js.map +1 -1
  54. package/dist/bridges/equations/be-22-topological-entanglement.d.ts +6 -9
  55. package/dist/bridges/equations/be-22-topological-entanglement.d.ts.map +1 -1
  56. package/dist/bridges/equations/be-22-topological-entanglement.js +9 -21
  57. package/dist/bridges/equations/be-22-topological-entanglement.js.map +1 -1
  58. package/dist/bridges/equations/be-23-syk-planckian.d.ts +7 -1
  59. package/dist/bridges/equations/be-23-syk-planckian.d.ts.map +1 -1
  60. package/dist/bridges/equations/be-23-syk-planckian.js +11 -25
  61. package/dist/bridges/equations/be-23-syk-planckian.js.map +1 -1
  62. package/dist/bridges/equations/be-24-foerster-fret.d.ts +7 -1
  63. package/dist/bridges/equations/be-24-foerster-fret.d.ts.map +1 -1
  64. package/dist/bridges/equations/be-24-foerster-fret.js +8 -16
  65. package/dist/bridges/equations/be-24-foerster-fret.js.map +1 -1
  66. package/dist/bridges/equations/be-25-iit-phi.d.ts +7 -1
  67. package/dist/bridges/equations/be-25-iit-phi.d.ts.map +1 -1
  68. package/dist/bridges/equations/be-25-iit-phi.js +12 -16
  69. package/dist/bridges/equations/be-25-iit-phi.js.map +1 -1
  70. package/dist/bridges/equations/be-25-orch-or.d.ts +6 -3
  71. package/dist/bridges/equations/be-25-orch-or.d.ts.map +1 -1
  72. package/dist/bridges/equations/be-25-orch-or.js +8 -17
  73. package/dist/bridges/equations/be-25-orch-or.js.map +1 -1
  74. package/dist/bridges/equations/be-26-dna-tunneling.d.ts +6 -3
  75. package/dist/bridges/equations/be-26-dna-tunneling.d.ts.map +1 -1
  76. package/dist/bridges/equations/be-26-dna-tunneling.js +11 -26
  77. package/dist/bridges/equations/be-26-dna-tunneling.js.map +1 -1
  78. package/dist/bridges/equations/be-27-effective-temperature.d.ts +7 -1
  79. package/dist/bridges/equations/be-27-effective-temperature.d.ts.map +1 -1
  80. package/dist/bridges/equations/be-27-effective-temperature.js +8 -16
  81. package/dist/bridges/equations/be-27-effective-temperature.js.map +1 -1
  82. package/dist/bridges/equations/be-28-onsager-entropy-production.d.ts +7 -1
  83. package/dist/bridges/equations/be-28-onsager-entropy-production.d.ts.map +1 -1
  84. package/dist/bridges/equations/be-28-onsager-entropy-production.js +9 -13
  85. package/dist/bridges/equations/be-28-onsager-entropy-production.js.map +1 -1
  86. package/dist/bridges/equations/be-29-jarzynski.d.ts +7 -1
  87. package/dist/bridges/equations/be-29-jarzynski.d.ts.map +1 -1
  88. package/dist/bridges/equations/be-29-jarzynski.js +8 -13
  89. package/dist/bridges/equations/be-29-jarzynski.js.map +1 -1
  90. package/dist/bridges/equations/be-30-flm-first-law.d.ts +11 -2
  91. package/dist/bridges/equations/be-30-flm-first-law.d.ts.map +1 -1
  92. package/dist/bridges/equations/be-30-flm-first-law.js +10 -21
  93. package/dist/bridges/equations/be-30-flm-first-law.js.map +1 -1
  94. package/dist/bridges/equations/be-31-causal-set-bd.d.ts +7 -1
  95. package/dist/bridges/equations/be-31-causal-set-bd.d.ts.map +1 -1
  96. package/dist/bridges/equations/be-31-causal-set-bd.js +11 -25
  97. package/dist/bridges/equations/be-31-causal-set-bd.js.map +1 -1
  98. package/dist/bridges/equations/be-32-quantum-reference-frame.d.ts +6 -9
  99. package/dist/bridges/equations/be-32-quantum-reference-frame.d.ts.map +1 -1
  100. package/dist/bridges/equations/be-32-quantum-reference-frame.js +8 -18
  101. package/dist/bridges/equations/be-32-quantum-reference-frame.js.map +1 -1
  102. package/dist/bridges/equations/be-33-hertz-millis.d.ts +53 -28
  103. package/dist/bridges/equations/be-33-hertz-millis.d.ts.map +1 -1
  104. package/dist/bridges/equations/be-33-hertz-millis.js +55 -51
  105. package/dist/bridges/equations/be-33-hertz-millis.js.map +1 -1
  106. package/dist/bridges/equations/be-34-kibble-zurek.d.ts +6 -3
  107. package/dist/bridges/equations/be-34-kibble-zurek.d.ts.map +1 -1
  108. package/dist/bridges/equations/be-34-kibble-zurek.js +15 -26
  109. package/dist/bridges/equations/be-34-kibble-zurek.js.map +1 -1
  110. package/dist/bridges/equations/be-35-conformal-bootstrap.d.ts +6 -9
  111. package/dist/bridges/equations/be-35-conformal-bootstrap.d.ts.map +1 -1
  112. package/dist/bridges/equations/be-35-conformal-bootstrap.js +9 -21
  113. package/dist/bridges/equations/be-35-conformal-bootstrap.js.map +1 -1
  114. package/dist/bridges/equations/be-36-gw-speed-bound.d.ts +7 -1
  115. package/dist/bridges/equations/be-36-gw-speed-bound.d.ts.map +1 -1
  116. package/dist/bridges/equations/be-36-gw-speed-bound.js +5 -13
  117. package/dist/bridges/equations/be-36-gw-speed-bound.js.map +1 -1
  118. package/dist/bridges/equations/be-37-shapiro-delay.d.ts +4 -2
  119. package/dist/bridges/equations/be-37-shapiro-delay.d.ts.map +1 -1
  120. package/dist/bridges/equations/be-37-shapiro-delay.js +15 -28
  121. package/dist/bridges/equations/be-37-shapiro-delay.js.map +1 -1
  122. package/dist/bridges/equations/be-38-mond.d.ts +7 -1
  123. package/dist/bridges/equations/be-38-mond.d.ts.map +1 -1
  124. package/dist/bridges/equations/be-38-mond.js +9 -19
  125. package/dist/bridges/equations/be-38-mond.js.map +1 -1
  126. package/dist/bridges/equations/be-39-asymptotic-safety.d.ts +66 -2
  127. package/dist/bridges/equations/be-39-asymptotic-safety.d.ts.map +1 -1
  128. package/dist/bridges/equations/be-39-asymptotic-safety.js +128 -20
  129. package/dist/bridges/equations/be-39-asymptotic-safety.js.map +1 -1
  130. package/dist/bridges/equations/be-40-composite-higgs.d.ts +7 -1
  131. package/dist/bridges/equations/be-40-composite-higgs.d.ts.map +1 -1
  132. package/dist/bridges/equations/be-40-composite-higgs.js +10 -22
  133. package/dist/bridges/equations/be-40-composite-higgs.js.map +1 -1
  134. package/dist/bridges/equations/be-41-swampland.d.ts +6 -3
  135. package/dist/bridges/equations/be-41-swampland.d.ts.map +1 -1
  136. package/dist/bridges/equations/be-41-swampland.js +11 -23
  137. package/dist/bridges/equations/be-41-swampland.js.map +1 -1
  138. package/dist/bridges/equations/be-42-hawking-temperature.d.ts +2 -0
  139. package/dist/bridges/equations/be-42-hawking-temperature.d.ts.map +1 -1
  140. package/dist/bridges/equations/be-42-hawking-temperature.js +5 -13
  141. package/dist/bridges/equations/be-42-hawking-temperature.js.map +1 -1
  142. package/dist/bridges/equations/be-43-er-epr.d.ts +7 -1
  143. package/dist/bridges/equations/be-43-er-epr.d.ts.map +1 -1
  144. package/dist/bridges/equations/be-43-er-epr.js +5 -13
  145. package/dist/bridges/equations/be-43-er-epr.js.map +1 -1
  146. package/dist/bridges/equations/be-44-soft-hair.d.ts +7 -1
  147. package/dist/bridges/equations/be-44-soft-hair.d.ts.map +1 -1
  148. package/dist/bridges/equations/be-44-soft-hair.js +5 -13
  149. package/dist/bridges/equations/be-44-soft-hair.js.map +1 -1
  150. package/dist/bridges/equations/be-45-tcc.d.ts +7 -1
  151. package/dist/bridges/equations/be-45-tcc.d.ts.map +1 -1
  152. package/dist/bridges/equations/be-45-tcc.js +10 -22
  153. package/dist/bridges/equations/be-45-tcc.js.map +1 -1
  154. package/dist/bridges/equations/be-46-multiverse-measure.d.ts +7 -1
  155. package/dist/bridges/equations/be-46-multiverse-measure.d.ts.map +1 -1
  156. package/dist/bridges/equations/be-46-multiverse-measure.js +9 -19
  157. package/dist/bridges/equations/be-46-multiverse-measure.js.map +1 -1
  158. package/dist/bridges/equations/be-47-bbn-dark-sector.d.ts +7 -1
  159. package/dist/bridges/equations/be-47-bbn-dark-sector.d.ts.map +1 -1
  160. package/dist/bridges/equations/be-47-bbn-dark-sector.js +14 -16
  161. package/dist/bridges/equations/be-47-bbn-dark-sector.js.map +1 -1
  162. package/dist/bridges/equations/be-48-grw-localization.d.ts +7 -1
  163. package/dist/bridges/equations/be-48-grw-localization.d.ts.map +1 -1
  164. package/dist/bridges/equations/be-48-grw-localization.js +15 -20
  165. package/dist/bridges/equations/be-48-grw-localization.js.map +1 -1
  166. package/dist/bridges/equations/be-49-quantum-darwinism.d.ts +7 -1
  167. package/dist/bridges/equations/be-49-quantum-darwinism.d.ts.map +1 -1
  168. package/dist/bridges/equations/be-49-quantum-darwinism.js +10 -22
  169. package/dist/bridges/equations/be-49-quantum-darwinism.js.map +1 -1
  170. package/dist/bridges/equations/be-50-wheeler-feynman.d.ts +42 -12
  171. package/dist/bridges/equations/be-50-wheeler-feynman.d.ts.map +1 -1
  172. package/dist/bridges/equations/be-50-wheeler-feynman.js +84 -20
  173. package/dist/bridges/equations/be-50-wheeler-feynman.js.map +1 -1
  174. package/dist/bridges/equations/be-53-yang-mills-beta.d.ts +158 -0
  175. package/dist/bridges/equations/be-53-yang-mills-beta.d.ts.map +1 -0
  176. package/dist/bridges/equations/be-53-yang-mills-beta.js +175 -0
  177. package/dist/bridges/equations/be-53-yang-mills-beta.js.map +1 -0
  178. package/dist/bridges/equations/be-54-randall-sundrum-brane.d.ts +117 -0
  179. package/dist/bridges/equations/be-54-randall-sundrum-brane.d.ts.map +1 -0
  180. package/dist/bridges/equations/be-54-randall-sundrum-brane.js +213 -0
  181. package/dist/bridges/equations/be-54-randall-sundrum-brane.js.map +1 -0
  182. package/dist/bridges/index.d.ts +40 -1
  183. package/dist/bridges/index.d.ts.map +1 -1
  184. package/dist/bridges/index.js +130 -48
  185. package/dist/bridges/index.js.map +1 -1
  186. package/dist/bridges/perihelion-precession-labeled.d.ts +46 -0
  187. package/dist/bridges/perihelion-precession-labeled.d.ts.map +1 -0
  188. package/dist/bridges/perihelion-precession-labeled.js +54 -0
  189. package/dist/bridges/perihelion-precession-labeled.js.map +1 -0
  190. package/dist/core/axes-registry.d.ts +67 -0
  191. package/dist/core/axes-registry.d.ts.map +1 -0
  192. package/dist/core/axes-registry.js +75 -0
  193. package/dist/core/axes-registry.js.map +1 -0
  194. package/dist/core/cell.d.ts +176 -0
  195. package/dist/core/cell.d.ts.map +1 -0
  196. package/dist/core/cell.js +166 -0
  197. package/dist/core/cell.js.map +1 -0
  198. package/dist/core/flux-rules.d.ts +176 -0
  199. package/dist/core/flux-rules.d.ts.map +1 -0
  200. package/dist/core/flux-rules.js +329 -0
  201. package/dist/core/flux-rules.js.map +1 -0
  202. package/dist/core/labeled-tensor.d.ts +143 -0
  203. package/dist/core/labeled-tensor.d.ts.map +1 -0
  204. package/dist/core/labeled-tensor.js +275 -0
  205. package/dist/core/labeled-tensor.js.map +1 -0
  206. package/dist/core/regime-registry.d.ts +169 -0
  207. package/dist/core/regime-registry.d.ts.map +1 -0
  208. package/dist/core/regime-registry.js +174 -0
  209. package/dist/core/regime-registry.js.map +1 -0
  210. package/dist/core/regime-rule-install.d.ts +26 -0
  211. package/dist/core/regime-rule-install.d.ts.map +1 -0
  212. package/dist/core/regime-rule-install.js +90 -0
  213. package/dist/core/regime-rule-install.js.map +1 -0
  214. package/dist/core/regimes-builtins.d.ts +22 -0
  215. package/dist/core/regimes-builtins.d.ts.map +1 -0
  216. package/dist/core/regimes-builtins.js +96 -0
  217. package/dist/core/regimes-builtins.js.map +1 -0
  218. package/dist/core/tensor.d.ts +112 -0
  219. package/dist/core/tensor.d.ts.map +1 -1
  220. package/dist/core/tensor.js +366 -0
  221. package/dist/core/tensor.js.map +1 -1
  222. package/dist/core/types.d.ts +7 -2
  223. package/dist/core/types.d.ts.map +1 -1
  224. package/dist/core/types.js.map +1 -1
  225. package/dist/core/universal-index.d.ts +97 -0
  226. package/dist/core/universal-index.d.ts.map +1 -0
  227. package/dist/core/universal-index.js +70 -0
  228. package/dist/core/universal-index.js.map +1 -0
  229. package/dist/diff/bridge-gradient.d.ts +94 -0
  230. package/dist/diff/bridge-gradient.d.ts.map +1 -0
  231. package/dist/diff/bridge-gradient.js +83 -0
  232. package/dist/diff/bridge-gradient.js.map +1 -0
  233. package/dist/diff/bridge-specs.d.ts +68 -0
  234. package/dist/diff/bridge-specs.d.ts.map +1 -0
  235. package/dist/diff/bridge-specs.js +96 -0
  236. package/dist/diff/bridge-specs.js.map +1 -0
  237. package/dist/dimensional/bridge-check.d.ts.map +1 -1
  238. package/dist/dimensional/bridge-check.js +8 -0
  239. package/dist/dimensional/bridge-check.js.map +1 -1
  240. package/dist/dimensional/connection-validators.d.ts +12 -5
  241. package/dist/dimensional/connection-validators.d.ts.map +1 -1
  242. package/dist/dimensional/connection-validators.js.map +1 -1
  243. package/dist/dimensional/curvature-composite.d.ts +90 -0
  244. package/dist/dimensional/curvature-composite.d.ts.map +1 -0
  245. package/dist/dimensional/curvature-composite.js +57 -0
  246. package/dist/dimensional/curvature-composite.js.map +1 -0
  247. package/dist/dimensional/curvature-invariants.d.ts +90 -0
  248. package/dist/dimensional/curvature-invariants.d.ts.map +1 -0
  249. package/dist/dimensional/curvature-invariants.js +64 -0
  250. package/dist/dimensional/curvature-invariants.js.map +1 -0
  251. package/dist/dimensional/curvature.d.ts +46 -30
  252. package/dist/dimensional/curvature.d.ts.map +1 -1
  253. package/dist/dimensional/curvature.js.map +1 -1
  254. package/dist/dimensional/einstein-equation.d.ts +126 -0
  255. package/dist/dimensional/einstein-equation.d.ts.map +1 -0
  256. package/dist/dimensional/einstein-equation.js +122 -0
  257. package/dist/dimensional/einstein-equation.js.map +1 -0
  258. package/dist/dimensional/field-equation-helpers.d.ts +82 -0
  259. package/dist/dimensional/field-equation-helpers.d.ts.map +1 -0
  260. package/dist/dimensional/field-equation-helpers.js +123 -0
  261. package/dist/dimensional/field-equation-helpers.js.map +1 -0
  262. package/dist/dimensional/friedmann-equation.d.ts +148 -0
  263. package/dist/dimensional/friedmann-equation.d.ts.map +1 -0
  264. package/dist/dimensional/friedmann-equation.js +150 -0
  265. package/dist/dimensional/friedmann-equation.js.map +1 -0
  266. package/dist/dimensional/gauge-field.d.ts +182 -0
  267. package/dist/dimensional/gauge-field.d.ts.map +1 -0
  268. package/dist/dimensional/gauge-field.js +134 -0
  269. package/dist/dimensional/gauge-field.js.map +1 -0
  270. package/dist/dimensional/killing-validators.d.ts +94 -0
  271. package/dist/dimensional/killing-validators.d.ts.map +1 -0
  272. package/dist/dimensional/killing-validators.js +66 -0
  273. package/dist/dimensional/killing-validators.js.map +1 -0
  274. package/dist/dimensional/klein-gordon-equation.d.ts +113 -0
  275. package/dist/dimensional/klein-gordon-equation.d.ts.map +1 -0
  276. package/dist/dimensional/klein-gordon-equation.js +98 -0
  277. package/dist/dimensional/klein-gordon-equation.js.map +1 -0
  278. package/dist/dimensional/rg-flow.d.ts +156 -0
  279. package/dist/dimensional/rg-flow.d.ts.map +1 -0
  280. package/dist/dimensional/rg-flow.js +150 -0
  281. package/dist/dimensional/rg-flow.js.map +1 -0
  282. package/dist/dimensional/stress-energy-validators.d.ts +74 -0
  283. package/dist/dimensional/stress-energy-validators.d.ts.map +1 -0
  284. package/dist/dimensional/stress-energy-validators.js +47 -0
  285. package/dist/dimensional/stress-energy-validators.js.map +1 -0
  286. package/dist/dimensional/tensor-trace.d.ts +128 -0
  287. package/dist/dimensional/tensor-trace.d.ts.map +1 -0
  288. package/dist/dimensional/tensor-trace.js +95 -0
  289. package/dist/dimensional/tensor-trace.js.map +1 -0
  290. package/dist/dimensional/tensor.d.ts +6 -8
  291. package/dist/dimensional/tensor.d.ts.map +1 -1
  292. package/dist/dimensional/tensor.js +3 -1
  293. package/dist/dimensional/tensor.js.map +1 -1
  294. package/dist/dimensional/validator-registry.d.ts +90 -0
  295. package/dist/dimensional/validator-registry.d.ts.map +1 -0
  296. package/dist/dimensional/validator-registry.js +131 -0
  297. package/dist/dimensional/validator-registry.js.map +1 -0
  298. package/dist/dimensional/validator.d.ts +12 -2
  299. package/dist/dimensional/validator.d.ts.map +1 -1
  300. package/dist/dimensional/validator.js +60 -75
  301. package/dist/dimensional/validator.js.map +1 -1
  302. package/dist/dimensional/weyl-validators.d.ts +84 -0
  303. package/dist/dimensional/weyl-validators.d.ts.map +1 -0
  304. package/dist/dimensional/weyl-validators.js +84 -0
  305. package/dist/dimensional/weyl-validators.js.map +1 -0
  306. package/dist/index.d.ts +37 -0
  307. package/dist/index.d.ts.map +1 -1
  308. package/dist/index.js +41 -0
  309. package/dist/index.js.map +1 -1
  310. package/dist/numerical/be37-covariant-eikonal.d.ts +19 -0
  311. package/dist/numerical/be37-covariant-eikonal.d.ts.map +1 -1
  312. package/dist/numerical/be37-covariant-eikonal.js +29 -9
  313. package/dist/numerical/be37-covariant-eikonal.js.map +1 -1
  314. package/dist/numerical/christoffel-flat.d.ts +49 -0
  315. package/dist/numerical/christoffel-flat.d.ts.map +1 -0
  316. package/dist/numerical/christoffel-flat.js +86 -0
  317. package/dist/numerical/christoffel-flat.js.map +1 -0
  318. package/dist/numerical/curvature-lowering-helpers.d.ts +49 -57
  319. package/dist/numerical/curvature-lowering-helpers.d.ts.map +1 -1
  320. package/dist/numerical/curvature-lowering-helpers.js +109 -4
  321. package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
  322. package/dist/numerical/derivative-lowering.d.ts +67 -0
  323. package/dist/numerical/derivative-lowering.d.ts.map +1 -0
  324. package/dist/numerical/derivative-lowering.js +243 -0
  325. package/dist/numerical/derivative-lowering.js.map +1 -0
  326. package/dist/numerical/einstein-equation.d.ts +106 -0
  327. package/dist/numerical/einstein-equation.d.ts.map +1 -0
  328. package/dist/numerical/einstein-equation.js +172 -0
  329. package/dist/numerical/einstein-equation.js.map +1 -0
  330. package/dist/numerical/geodesic-integrator.d.ts +7 -4
  331. package/dist/numerical/geodesic-integrator.d.ts.map +1 -1
  332. package/dist/numerical/geodesic-integrator.js +5 -1
  333. package/dist/numerical/geodesic-integrator.js.map +1 -1
  334. package/dist/numerical/gl4-integrator.d.ts +4 -2
  335. package/dist/numerical/gl4-integrator.d.ts.map +1 -1
  336. package/dist/numerical/gl4-integrator.js +24 -8
  337. package/dist/numerical/gl4-integrator.js.map +1 -1
  338. package/dist/numerical/killing.d.ts +157 -0
  339. package/dist/numerical/killing.d.ts.map +1 -0
  340. package/dist/numerical/killing.js +242 -0
  341. package/dist/numerical/killing.js.map +1 -0
  342. package/dist/numerical/kretschmann.d.ts +62 -0
  343. package/dist/numerical/kretschmann.d.ts.map +1 -0
  344. package/dist/numerical/kretschmann.js +88 -0
  345. package/dist/numerical/kretschmann.js.map +1 -0
  346. package/dist/numerical/lowering-utils.d.ts +47 -0
  347. package/dist/numerical/lowering-utils.d.ts.map +1 -0
  348. package/dist/numerical/lowering-utils.js +64 -0
  349. package/dist/numerical/lowering-utils.js.map +1 -0
  350. package/dist/numerical/lowering.d.ts +1 -29
  351. package/dist/numerical/lowering.d.ts.map +1 -1
  352. package/dist/numerical/lowering.js +219 -415
  353. package/dist/numerical/lowering.js.map +1 -1
  354. package/dist/numerical/null-ic.d.ts +40 -0
  355. package/dist/numerical/null-ic.d.ts.map +1 -0
  356. package/dist/numerical/null-ic.js +50 -0
  357. package/dist/numerical/null-ic.js.map +1 -0
  358. package/dist/numerical/null-ray-integrator.d.ts +3 -2
  359. package/dist/numerical/null-ray-integrator.d.ts.map +1 -1
  360. package/dist/numerical/painleve-gullstrand-metric.d.ts +74 -0
  361. package/dist/numerical/painleve-gullstrand-metric.d.ts.map +1 -0
  362. package/dist/numerical/painleve-gullstrand-metric.js +121 -0
  363. package/dist/numerical/painleve-gullstrand-metric.js.map +1 -0
  364. package/dist/numerical/pderiv.d.ts +17 -9
  365. package/dist/numerical/pderiv.d.ts.map +1 -1
  366. package/dist/numerical/pderiv.js +6 -3
  367. package/dist/numerical/pderiv.js.map +1 -1
  368. package/dist/numerical/perihelion-finder.d.ts +30 -0
  369. package/dist/numerical/perihelion-finder.d.ts.map +1 -1
  370. package/dist/numerical/perihelion-finder.js +30 -0
  371. package/dist/numerical/perihelion-finder.js.map +1 -1
  372. package/dist/numerical/tensor-engine.d.ts +2 -2
  373. package/dist/numerical/tensor-engine.d.ts.map +1 -1
  374. package/dist/numerical/weyl-lowering.d.ts +60 -0
  375. package/dist/numerical/weyl-lowering.d.ts.map +1 -0
  376. package/dist/numerical/weyl-lowering.js +111 -0
  377. package/dist/numerical/weyl-lowering.js.map +1 -0
  378. package/package.json +9 -7
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Derivative-arm lowering — extracted from `lowering.ts`'s switch
3
+ * to close the v0.6.1 sprint-target LOC miss (903 vs ≤890).
4
+ *
5
+ * Exports two pure functions:
6
+ * - `lowerTensorPartialDerivative` (∂_μ over tensor-symbol or
7
+ * metric-tensor `of` operands, three numericalForm strategies)
8
+ * - `lowerCovariantDerivative` (∇_μ over tensor-symbol or
9
+ * metric-tensor `of`; sign rule applied per free index)
10
+ *
11
+ * Both functions take a `recur` thunk for the recursive `lowerNode`
12
+ * call (the covariant-derivative arm needs it twice, once to lower
13
+ * the `of` operand and once to lower a synthesized
14
+ * `tensor-partial-derivative` for the partial component of ∇).
15
+ * Threading the recursion via parameter avoids a forward-import
16
+ * cycle between this module and `lowering.ts`.
17
+ *
18
+ * @module numerical/derivative-lowering
19
+ */
20
+ import type { ExprNode } from '../dimensional/validator.js';
21
+ import type { EngineTensor, TensorEngine } from './tensor-engine.js';
22
+ import type { NumericalInputs } from './types.js';
23
+ /**
24
+ * Thunk signature for the recursive `lowerNode` call. `lowering.ts`
25
+ * passes its own `lowerNode` as this argument; the derivative arms
26
+ * use it to lower sub-expressions (the `of` operand of a covariant
27
+ * derivative, and a synthesized partial-derivative subtree).
28
+ *
29
+ * @internal
30
+ */
31
+ export type LowerNodeRecur = (node: ExprNode, inputs: NumericalInputs, engine: TensorEngine) => EngineTensor;
32
+ /**
33
+ * Lower a `tensor-partial-derivative` node (∂_μ over an `of` operand).
34
+ *
35
+ * v0.3.5/v0.4.0 scope: `of` is a tensor-symbol or metric-tensor.
36
+ * ∂_μ(of) adds the wrtIndex as a trailing axis — the result shape is
37
+ * [...ofShape, N], NOT ofShape. (For BE-37, `of` = the scalar S is
38
+ * rank-0, so ∂_μ S is the rank-1 wave covector k_μ, shape [N].)
39
+ *
40
+ * Three numericalForm dispatches: 'symbolic' (caller-supplied
41
+ * derivatives map), 'numerical-fn' (rank-0 scalar field, all-axes
42
+ * stack), 'grid' (sampled derivative field).
43
+ *
44
+ * @internal
45
+ */
46
+ export declare function lowerTensorPartialDerivative(node: Extract<ExprNode, {
47
+ kind: 'tensor-partial-derivative';
48
+ }>, inputs: NumericalInputs, engine: TensorEngine): EngineTensor;
49
+ /**
50
+ * Lower a `covariant-derivative` node (∇_μ over an `of` operand).
51
+ *
52
+ * Calls `recur` to lower the `of` subtree and a synthesized
53
+ * `tensor-partial-derivative` (the ∂ component of ∇). The Christoffel
54
+ * correction (Γ^α_{μν} sign rule per free index of `of`) builds on
55
+ * the metric-derivative data supplied via `inputs.metricDerivatives`.
56
+ *
57
+ * v0.4.0 contract: `of.derivativeStrategy === 'zero'` short-circuits
58
+ * to a zero result. `'computed'` on a raw-tensor metric reduces to
59
+ * the partial only (constant metric → Γ = 0). `'supplied'` invokes
60
+ * the full Christoffel pipeline.
61
+ *
62
+ * @internal
63
+ */
64
+ export declare function lowerCovariantDerivative(node: Extract<ExprNode, {
65
+ kind: 'covariant-derivative';
66
+ }>, inputs: NumericalInputs, engine: TensorEngine, recur: LowerNodeRecur): EngineTensor;
67
+ //# sourceMappingURL=derivative-lowering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derivative-lowering.d.ts","sourceRoot":"","sources":["../../src/numerical/derivative-lowering.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAM5D,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAe,MAAM,YAAY,CAAC;AAmB/D;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG,CAC3B,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,YAAY,KACjB,YAAY,CAAC;AAMlB;;;;;;;;;;;;;GAaG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,2BAA2B,CAAA;CAAE,CAAC,EAC9D,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,YAAY,GACnB,YAAY,CAgGd;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,sBAAsB,CAAA;CAAE,CAAC,EACzD,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,cAAc,GACpB,YAAY,CAwId"}
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Derivative-arm lowering — extracted from `lowering.ts`'s switch
3
+ * to close the v0.6.1 sprint-target LOC miss (903 vs ≤890).
4
+ *
5
+ * Exports two pure functions:
6
+ * - `lowerTensorPartialDerivative` (∂_μ over tensor-symbol or
7
+ * metric-tensor `of` operands, three numericalForm strategies)
8
+ * - `lowerCovariantDerivative` (∇_μ over tensor-symbol or
9
+ * metric-tensor `of`; sign rule applied per free index)
10
+ *
11
+ * Both functions take a `recur` thunk for the recursive `lowerNode`
12
+ * call (the covariant-derivative arm needs it twice, once to lower
13
+ * the `of` operand and once to lower a synthesized
14
+ * `tensor-partial-derivative` for the partial component of ∇).
15
+ * Threading the recursion via parameter avoids a forward-import
16
+ * cycle between this module and `lowering.ts`.
17
+ *
18
+ * @module numerical/derivative-lowering
19
+ */
20
+ import { validate } from '../dimensional/validator.js';
21
+ import { pderivGrid, pderivNumericalFn, pderivSymbolic } from './pderiv.js';
22
+ import { NumericalBackendError } from './errors.js';
23
+ import { zeroTensor, zeroTensorLike, flatToNested, tensorAdd, tensorAddScaled, computeChristoffelTensor, contractChristoffelWithOperand, getMetricDerivFlat, } from './connection-lowering-helpers.js';
24
+ import { isMetricTensorNode, dimensionOf, requireValue, flattenNestedArray, } from './lowering-utils.js';
25
+ // ---------------------------------------------------------------------------
26
+ // tensor-partial-derivative arm
27
+ // ---------------------------------------------------------------------------
28
+ /**
29
+ * Lower a `tensor-partial-derivative` node (∂_μ over an `of` operand).
30
+ *
31
+ * v0.3.5/v0.4.0 scope: `of` is a tensor-symbol or metric-tensor.
32
+ * ∂_μ(of) adds the wrtIndex as a trailing axis — the result shape is
33
+ * [...ofShape, N], NOT ofShape. (For BE-37, `of` = the scalar S is
34
+ * rank-0, so ∂_μ S is the rank-1 wave covector k_μ, shape [N].)
35
+ *
36
+ * Three numericalForm dispatches: 'symbolic' (caller-supplied
37
+ * derivatives map), 'numerical-fn' (rank-0 scalar field, all-axes
38
+ * stack), 'grid' (sampled derivative field).
39
+ *
40
+ * @internal
41
+ */
42
+ export function lowerTensorPartialDerivative(node, inputs, engine) {
43
+ const of = node.of;
44
+ // v0.4.0 extension: metric-tensor pderiv dispatch.
45
+ if (of.kind === 'metric-tensor') {
46
+ const mNode = of;
47
+ const strategy = mNode.derivativeStrategy ?? 'computed';
48
+ const N = dimensionOf(inputs);
49
+ const coordLabel = node.wrtIndex.label;
50
+ const ofShape = mNode.indices.map(() => N);
51
+ const resultShape = [...ofShape, N];
52
+ if (strategy === 'zero') {
53
+ // ∂g = 0 everywhere (constant/flat metric).
54
+ return zeroTensor(resultShape, engine);
55
+ }
56
+ if (strategy === 'supplied') {
57
+ // Look up the N slices ∂_mu g for mu=0..N-1 and stack them as the
58
+ // trailing axis. Key format: `${metricName}/${coordLabel}_${mu}`.
59
+ const size = resultShape.reduce((a, b) => a * b, 1);
60
+ const flat = new Array(size).fill(0);
61
+ for (let mu = 0; mu < N; mu++) {
62
+ const key = `${mNode.name}/${coordLabel}_${mu}`;
63
+ const slice = inputs.metricDerivatives?.get(key);
64
+ if (slice === undefined) {
65
+ throw new NumericalBackendError(`lowering: metric-tensor pderiv with strategy='supplied': ` +
66
+ `no metricDerivatives entry for "${key}"`);
67
+ }
68
+ const flatSlice = flattenNestedArray(slice, N * N);
69
+ for (let ij = 0; ij < N * N; ij++) {
70
+ flat[ij * N + mu] = flatSlice[ij];
71
+ }
72
+ }
73
+ return engine.fromNested(flatToNested(flat, resultShape), resultShape);
74
+ }
75
+ // strategy === 'computed': constant-tensor metrics carry no
76
+ // coordinate dependence — ∂_μ g = 0.
77
+ return zeroTensor(resultShape, engine);
78
+ }
79
+ if (of.kind !== 'tensor-symbol') {
80
+ throw new NumericalBackendError(`lowering: tensor-partial-derivative numerical eval requires a tensor-symbol `
81
+ + `or metric-tensor 'of' operand in v0.3.5/v0.4.0 — got '${of.kind}'`);
82
+ }
83
+ const sym = of;
84
+ const form = sym.numericalForm ?? 'symbolic';
85
+ const coordLabel = node.wrtIndex.label;
86
+ const N = dimensionOf(inputs);
87
+ const ofShape = sym.indices.map(() => N);
88
+ const resultShape = [...ofShape, N];
89
+ if (form === 'symbolic') {
90
+ const d = pderivSymbolic(sym.name, coordLabel, inputs.derivatives ?? new Map());
91
+ return engine.fromNested(d, resultShape);
92
+ }
93
+ if (form === 'numerical-fn') {
94
+ // 'numerical-fn' lowering is scoped to a rank-0 `of` (scalar
95
+ // field). ∂_μ ranges over all N coordinate axes — stack the N
96
+ // single-axis derivatives into the rank-1 result.
97
+ if (ofShape.length !== 0) {
98
+ throw new NumericalBackendError(`lowering: 'numerical-fn' pderiv lowering supports a rank-0 'of' in v0.3.5; `
99
+ + `"${sym.name}" is rank ${ofShape.length}`);
100
+ }
101
+ const fn = inputs.fields?.get(sym.name);
102
+ if (!fn) {
103
+ throw new NumericalBackendError(`lowering: 'numerical-fn' tensor-symbol "${sym.name}" has no field fn in inputs.fields`);
104
+ }
105
+ const coordValues = inputs.coords ? [...inputs.coords.values()] : [];
106
+ const components = [];
107
+ for (let axis = 0; axis < N; axis++) {
108
+ components.push(pderivNumericalFn(fn, coordValues, axis));
109
+ }
110
+ return engine.fromNested(components, [N]);
111
+ }
112
+ // form === 'grid': the GridField is sampled over space and
113
+ // pderivGrid returns the derivative field sampled on that grid.
114
+ const grid = inputs.grids?.get(sym.name);
115
+ if (!grid) {
116
+ throw new NumericalBackendError(`lowering: 'grid' tensor-symbol "${sym.name}" has no GridField in inputs.grids`);
117
+ }
118
+ const gridAxis = inputs.coords ? [...inputs.coords.keys()].indexOf(coordLabel) : 0;
119
+ const flat = pderivGrid(grid, gridAxis < 0 ? 0 : gridAxis);
120
+ return engine.fromNested(flat.length === 1 ? flat[0] : flat, grid.shape);
121
+ }
122
+ // ---------------------------------------------------------------------------
123
+ // covariant-derivative arm
124
+ // ---------------------------------------------------------------------------
125
+ /**
126
+ * Lower a `covariant-derivative` node (∇_μ over an `of` operand).
127
+ *
128
+ * Calls `recur` to lower the `of` subtree and a synthesized
129
+ * `tensor-partial-derivative` (the ∂ component of ∇). The Christoffel
130
+ * correction (Γ^α_{μν} sign rule per free index of `of`) builds on
131
+ * the metric-derivative data supplied via `inputs.metricDerivatives`.
132
+ *
133
+ * v0.4.0 contract: `of.derivativeStrategy === 'zero'` short-circuits
134
+ * to a zero result. `'computed'` on a raw-tensor metric reduces to
135
+ * the partial only (constant metric → Γ = 0). `'supplied'` invokes
136
+ * the full Christoffel pipeline.
137
+ *
138
+ * @internal
139
+ */
140
+ export function lowerCovariantDerivative(node, inputs, engine, recur) {
141
+ // S2(a) fix: `of.freeIndices` does NOT exist on the raw ExprNode.
142
+ // Re-validate the `of` subtree to obtain its free-index structure.
143
+ const covNode = node;
144
+ const ofExpr = covNode.of;
145
+ // TS-2 runtime guard: `covNode.of` is typed as `unknown` (module-cycle
146
+ // prevents ExprNode import in connection-validators.ts). A malformed
147
+ // AST bypassing validate() would produce a cryptic TypeError at
148
+ // `ofExpr.kind` below. Throw a clear message now.
149
+ if (typeof ofExpr.kind !== 'string') {
150
+ throw new NumericalBackendError(`lowering: CovariantDerivativeNode.of must have a string 'kind' field ` +
151
+ `(got ${JSON.stringify(ofExpr.kind)}). ` +
152
+ `Always call validate() before evaluateNumericalRaw().`);
153
+ }
154
+ const ofValidation = validate(ofExpr);
155
+ // Build ordered list of free indices: [{label, variance, pos}].
156
+ const ofFreeIndices = [];
157
+ const ofIndices = ofExpr.indices;
158
+ if (ofIndices) {
159
+ for (const idx of ofIndices) {
160
+ const counts = ofValidation.freeIndices.get(idx.label);
161
+ if (counts === undefined)
162
+ continue; // contracted — not a free axis
163
+ ofFreeIndices.push({
164
+ label: idx.label,
165
+ variance: idx.variance,
166
+ pos: ofFreeIndices.length,
167
+ });
168
+ }
169
+ }
170
+ else {
171
+ // Fallback for future of-kinds without .indices.
172
+ let axisPos = 0;
173
+ for (const [label, counts] of ofValidation.freeIndices) {
174
+ for (let i = 0; i < counts.upper; i++) {
175
+ ofFreeIndices.push({ label, variance: 'upper', pos: axisPos++ });
176
+ }
177
+ for (let i = 0; i < counts.lower; i++) {
178
+ ofFreeIndices.push({ label, variance: 'lower', pos: axisPos++ });
179
+ }
180
+ }
181
+ }
182
+ // Lower the operand tensor via the injected recur thunk.
183
+ const ofTensor = recur(ofExpr, inputs, engine);
184
+ const N = dimensionOf(inputs);
185
+ // TS-2 runtime guard: gLower must be a metric-tensor node.
186
+ if (!isMetricTensorNode(covNode.gLower)) {
187
+ throw new NumericalBackendError(`lowering: CovariantDerivativeNode.gLower must be a metric-tensor node ` +
188
+ `(got kind='${covNode.gLower.kind}')`);
189
+ }
190
+ const strategy = covNode.gLower.derivativeStrategy ?? 'computed';
191
+ // S2(b): strategy='zero' → flat space, Γ=0, ∇_μ T = ∂_μ T.
192
+ // For constant tensors ∂_μ T = 0, result is zero of shape [...ofShape, N].
193
+ if (strategy === 'zero') {
194
+ const outShape = [...ofTensor.shape, N];
195
+ return zeroTensor(outShape, engine);
196
+ }
197
+ // v0.4.0 CRITICAL FIX (Finding #1): 'computed' on a raw-tensor metric means
198
+ // constant metric → Γ = 0 → covariant-derivative = partial only.
199
+ // This early return MUST come before Christoffel construction.
200
+ if (ofExpr.kind !== 'tensor-symbol' && ofExpr.kind !== 'metric-tensor') {
201
+ throw new NumericalBackendError(`lowering: covariant-derivative 'of' must be tensor-symbol or metric-tensor ` +
202
+ `(got '${ofExpr.kind}') — validated nodes cannot reach this point`);
203
+ }
204
+ const pdNode = {
205
+ kind: 'tensor-partial-derivative',
206
+ of: ofExpr,
207
+ wrt: covNode.wrt,
208
+ wrtIndex: covNode.wrtIndex,
209
+ };
210
+ const partial = recur(pdNode, inputs, engine);
211
+ if (strategy === 'computed') {
212
+ return partial;
213
+ }
214
+ // S2(c) + S2(d): Build Γ^α_{μν} from metric data and apply
215
+ // the sign rule to all free indices of `of`:
216
+ // ∇_μ T^α_β = ∂_μ T^α_β + Γ^α_{μλ} T^λ_β − Γ^λ_{μβ} T^α_λ
217
+ if (ofFreeIndices.length === 0) {
218
+ return partial;
219
+ }
220
+ // gLower narrowed to MetricTensorNode by the predicate above (TS-2).
221
+ const gLowerNode = covNode.gLower;
222
+ const gInverseNode = covNode.gInverse;
223
+ const gInverseData = flattenNestedArray(requireValue(gInverseNode.name, inputs), N * N);
224
+ const coordLabel = covNode.wrtIndex.label;
225
+ // getMetricDeriv(mu): returns flat [N*N] of ∂_{mu} g.
226
+ // 'supplied' strategy is the only remaining possibility here.
227
+ const getMetricDeriv = (mu) => getMetricDerivFlat(gLowerNode.name, coordLabel, mu, 'supplied', N, inputs.metricDerivatives);
228
+ // Compute Γ^α_{μν} from metric data.
229
+ const GammaTensor = computeChristoffelTensor(gInverseData, getMetricDeriv, N, engine);
230
+ const GammaFlat = flattenNestedArray(engine.toNested(GammaTensor), N * N * N);
231
+ // Apply the Christoffel correction for each free index of `of`.
232
+ // S2(d) sign rule: upper → +Γ, lower → −Γ.
233
+ const ofFlat = flattenNestedArray(engine.toNested(ofTensor), ofTensor.shape.reduce((a, b) => a * b, 1));
234
+ const ofShapeArr = [...ofTensor.shape];
235
+ let correction = zeroTensorLike(partial, engine);
236
+ for (const freeIdx of ofFreeIndices) {
237
+ const term = contractChristoffelWithOperand(GammaFlat, ofFlat, ofShapeArr, freeIdx.pos, freeIdx.variance, N, engine);
238
+ const sign = freeIdx.variance === 'upper' ? 1 : -1;
239
+ correction = tensorAddScaled(correction, term, sign, engine);
240
+ }
241
+ return tensorAdd(partial, correction, engine);
242
+ }
243
+ //# sourceMappingURL=derivative-lowering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derivative-lowering.js","sourceRoot":"","sources":["../../src/numerical/derivative-lowering.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Einstein field equation residual evaluator (v0.6.0 Phase 2, Task 2.4).
3
+ *
4
+ * Computes the **scale-normalized** max residual of
5
+ *
6
+ * G_μν[g] + Λ g_μν − (8πG/c⁴) T_μν
7
+ *
8
+ * at a coordinate point, using the existing v0.5.0 einstein-tensor lowering
9
+ * pipeline (lowerNode, einstein-tensor arm in src/numerical/lowering.ts).
10
+ * No curvature recomputation from scratch — delegates to the internal
11
+ * `lowerNode` synchronous path to stay non-async.
12
+ *
13
+ * **Scale normalization**: in SI units, the G_tt component involves catastrophic
14
+ * cancellation of terms of order c²/r² ≈ 9e16/r² — the raw absolute residual
15
+ * |G_tt| reaches O(0.25) due to FD truncation noise in individual Riemann
16
+ * components, even though the true G_tt is identically zero. To make the
17
+ * vacuum-closure test meaningful, each |G_μν| component is normalized by the
18
+ * scale of the corresponding metric component |g_μν| (where g_μν ≠ 0).
19
+ * The returned value is then max over (μ,ν) of |G_μν| / scale_μν, which is
20
+ * dimensionless and measures relative closure at the FD truncation floor.
21
+ *
22
+ * @module numerical/einstein-equation
23
+ */
24
+ /** 4-component coordinate vector [t, r, θ, φ].
25
+ *
26
+ * @public */
27
+ export type Vec4 = [number, number, number, number];
28
+ /**
29
+ * Coordinate-dependent metric closure: maps a coordinate 4-vector to a 4×4
30
+ * covariant or contravariant metric matrix.
31
+ *
32
+ * @public
33
+ */
34
+ export type MetricClosure = (x: ReadonlyArray<number>) => number[][];
35
+ /**
36
+ * Input bag for `evaluateEinsteinEquationResidual`.
37
+ *
38
+ * @public
39
+ */
40
+ export interface EinsteinEquationResidualInput {
41
+ /**
42
+ * Covariant metric closure g_{μν}(x). Must be coordinate-dependent (the FD
43
+ * pipeline inside the einstein-tensor lowering samples it at perturbed points).
44
+ */
45
+ gFn: MetricClosure;
46
+ /**
47
+ * Contravariant metric closure g^{μν}(x). Must be the exact inverse of gFn
48
+ * (i.e. gFn(x) · gInvFn(x) = I for all x).
49
+ */
50
+ gInvFn: MetricClosure;
51
+ /** Cosmological constant Λ in units consistent with the metric (m⁻² for SI). Use 0 for vacuum. */
52
+ cosmologicalConstant: number;
53
+ /** Stress-energy tensor T_μν as a 4×4 matrix closure; return zeros for vacuum. */
54
+ stressEnergy: (x: Vec4) => number[][];
55
+ /** Coordinate 4-vector [t, r, θ, φ] at which to evaluate the residual. */
56
+ x: Vec4;
57
+ }
58
+ /**
59
+ * Evaluate the Einstein-equation scale-normalized residual at the given point.
60
+ *
61
+ * Returns `max over (μ,ν) of |G_μν + Λ g_μν − κ T_μν| / scale_μν`, where
62
+ * `scale_μν = max(|g_μν|, 1e-30)` to avoid division by zero on off-diagonal
63
+ * zero entries.
64
+ *
65
+ * **Why scale-normalize?** In SI units, G_tt involves cancellation of
66
+ * Riemann terms of order c²/r² ~ 9e16/r², leaving a FD truncation noise
67
+ * of O(0.25) in the absolute residual at r=3r_s. Dividing by |g_tt| ~ 6e16
68
+ * gives a relative residual of ~4e-18, which is the genuine FD precision
69
+ * floor. Without normalization, the vacuum closure test would require a
70
+ * tolerance of ~1 rather than ~1e-17, making it vacuous.
71
+ *
72
+ * For Schwarzschild vacuum (T=0, Λ=0) the normalized residual should be
73
+ * near machine precision (typically < 1e-8 at all 13 sample points).
74
+ *
75
+ * The function is **synchronous** because `lowerNode` is synchronous — the
76
+ * async wrapper in `evaluateNumerical` is only for the engine-registry lookup
77
+ * and dimensional validation, both bypassed here by using the Float64 engine
78
+ * directly and passing a structurally-known-valid AST.
79
+ *
80
+ * @example
81
+ * ```typescript
82
+ * import { evaluateEinsteinEquationResidual } from 'universal-physics-tensor';
83
+ * import {
84
+ * schwarzschildGFn,
85
+ * schwarzschildGInverseFn,
86
+ * schwarzschildRs,
87
+ * } from '../tests/fixtures/schwarzschild.js';
88
+ *
89
+ * const M = 1.989e30;
90
+ * const r_s = schwarzschildRs(M);
91
+ * const x: [number, number, number, number] = [0, 5 * r_s, Math.PI / 2, 0];
92
+ *
93
+ * const residual = evaluateEinsteinEquationResidual({
94
+ * gFn: schwarzschildGFn(M),
95
+ * gInvFn: schwarzschildGInverseFn(M),
96
+ * cosmologicalConstant: 0,
97
+ * stressEnergy: (_x) => [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],
98
+ * x,
99
+ * });
100
+ * // residual < 1e-8 for Schwarzschild vacuum (FD truncation floor)
101
+ * ```
102
+ *
103
+ * @public
104
+ */
105
+ export declare function evaluateEinsteinEquationResidual(input: EinsteinEquationResidualInput): number;
106
+ //# sourceMappingURL=einstein-equation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"einstein-equation.d.ts","sourceRoot":"","sources":["../../src/numerical/einstein-equation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAWH;;cAEc;AACd,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,MAAM,EAAE,EAAE,CAAC;AAErE;;;;GAIG;AACH,MAAM,WAAW,6BAA6B;IAC5C;;;OAGG;IACH,GAAG,EAAE,aAAa,CAAC;IACnB;;;OAGG;IACH,MAAM,EAAE,aAAa,CAAC;IACtB,kGAAkG;IAClG,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kFAAkF;IAClF,YAAY,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,EAAE,EAAE,CAAC;IACtC,0EAA0E;IAC1E,CAAC,EAAE,IAAI,CAAC;CACT;AAsDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,6BAA6B,GACnC,MAAM,CAmER"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Einstein field equation residual evaluator (v0.6.0 Phase 2, Task 2.4).
3
+ *
4
+ * Computes the **scale-normalized** max residual of
5
+ *
6
+ * G_μν[g] + Λ g_μν − (8πG/c⁴) T_μν
7
+ *
8
+ * at a coordinate point, using the existing v0.5.0 einstein-tensor lowering
9
+ * pipeline (lowerNode, einstein-tensor arm in src/numerical/lowering.ts).
10
+ * No curvature recomputation from scratch — delegates to the internal
11
+ * `lowerNode` synchronous path to stay non-async.
12
+ *
13
+ * **Scale normalization**: in SI units, the G_tt component involves catastrophic
14
+ * cancellation of terms of order c²/r² ≈ 9e16/r² — the raw absolute residual
15
+ * |G_tt| reaches O(0.25) due to FD truncation noise in individual Riemann
16
+ * components, even though the true G_tt is identically zero. To make the
17
+ * vacuum-closure test meaningful, each |G_μν| component is normalized by the
18
+ * scale of the corresponding metric component |g_μν| (where g_μν ≠ 0).
19
+ * The returned value is then max over (μ,ν) of |G_μν| / scale_μν, which is
20
+ * dimensionless and measures relative closure at the FD truncation floor.
21
+ *
22
+ * @module numerical/einstein-equation
23
+ */
24
+ import { lowerNode } from './lowering.js';
25
+ import { Float64ReferenceEngine } from './float64-engine.js';
26
+ import { metric } from '../dimensional/metric.js';
27
+ import { tsym } from '../dimensional/tensor.js';
28
+ import { LENGTH, DIMENSIONLESS } from '../dimensional/types.js';
29
+ import { C_SI, G_SI } from '../core/constants.js';
30
+ /** Shared engine instance (stateless Float64ReferenceEngine, safe to reuse). */
31
+ const _engine = new Float64ReferenceEngine();
32
+ /**
33
+ * Build the EinsteinTensorNode AST that the lowering layer understands.
34
+ * The inner RiemannTensorNode and outer EinsteinTensorNode both reference
35
+ * the same metric pair by name ('g' / 'g_inv'), which the inputs.tensors
36
+ * and inputs.fields maps must populate at call time.
37
+ */
38
+ function buildEinsteinNode() {
39
+ const gLower = metric('g', [{ label: 'mu', variance: 'lower' }, { label: 'nu', variance: 'lower' }], DIMENSIONLESS, '+,-,-,-');
40
+ const gInverse = metric('g_inv', [{ label: 'mu', variance: 'upper' }, { label: 'nu', variance: 'upper' }], DIMENSIONLESS, '+,-,-,-');
41
+ const xCoord = tsym('x', [{ label: 'c', variance: 'upper' }], LENGTH, 'coordinate');
42
+ const riemannNode = {
43
+ kind: 'riemann-tensor',
44
+ upperIndex: { label: 'rho', variance: 'upper' },
45
+ lowerIndices: [
46
+ { label: 'sigma', variance: 'lower' },
47
+ { label: 'lam', variance: 'lower' },
48
+ { label: 'nu_r', variance: 'lower' },
49
+ ],
50
+ gLower,
51
+ gInverse,
52
+ xCoord,
53
+ };
54
+ return {
55
+ kind: 'einstein-tensor',
56
+ riemann: riemannNode,
57
+ gLower,
58
+ gInverse,
59
+ };
60
+ }
61
+ /** The cached AST node (constructed once, reused across calls). */
62
+ const _einsteinNode = buildEinsteinNode();
63
+ /**
64
+ * Evaluate the Einstein-equation scale-normalized residual at the given point.
65
+ *
66
+ * Returns `max over (μ,ν) of |G_μν + Λ g_μν − κ T_μν| / scale_μν`, where
67
+ * `scale_μν = max(|g_μν|, 1e-30)` to avoid division by zero on off-diagonal
68
+ * zero entries.
69
+ *
70
+ * **Why scale-normalize?** In SI units, G_tt involves cancellation of
71
+ * Riemann terms of order c²/r² ~ 9e16/r², leaving a FD truncation noise
72
+ * of O(0.25) in the absolute residual at r=3r_s. Dividing by |g_tt| ~ 6e16
73
+ * gives a relative residual of ~4e-18, which is the genuine FD precision
74
+ * floor. Without normalization, the vacuum closure test would require a
75
+ * tolerance of ~1 rather than ~1e-17, making it vacuous.
76
+ *
77
+ * For Schwarzschild vacuum (T=0, Λ=0) the normalized residual should be
78
+ * near machine precision (typically < 1e-8 at all 13 sample points).
79
+ *
80
+ * The function is **synchronous** because `lowerNode` is synchronous — the
81
+ * async wrapper in `evaluateNumerical` is only for the engine-registry lookup
82
+ * and dimensional validation, both bypassed here by using the Float64 engine
83
+ * directly and passing a structurally-known-valid AST.
84
+ *
85
+ * @example
86
+ * ```typescript
87
+ * import { evaluateEinsteinEquationResidual } from 'universal-physics-tensor';
88
+ * import {
89
+ * schwarzschildGFn,
90
+ * schwarzschildGInverseFn,
91
+ * schwarzschildRs,
92
+ * } from '../tests/fixtures/schwarzschild.js';
93
+ *
94
+ * const M = 1.989e30;
95
+ * const r_s = schwarzschildRs(M);
96
+ * const x: [number, number, number, number] = [0, 5 * r_s, Math.PI / 2, 0];
97
+ *
98
+ * const residual = evaluateEinsteinEquationResidual({
99
+ * gFn: schwarzschildGFn(M),
100
+ * gInvFn: schwarzschildGInverseFn(M),
101
+ * cosmologicalConstant: 0,
102
+ * stressEnergy: (_x) => [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],
103
+ * x,
104
+ * });
105
+ * // residual < 1e-8 for Schwarzschild vacuum (FD truncation floor)
106
+ * ```
107
+ *
108
+ * @public
109
+ */
110
+ export function evaluateEinsteinEquationResidual(input) {
111
+ const { gFn, gInvFn, cosmologicalConstant, stressEnergy, x } = input;
112
+ // κ = 8πG/c⁴ (SI units: m/kg·s² if G in m³/kg/s², c in m/s)
113
+ const kappa = (8 * Math.PI * G_SI) / (C_SI * C_SI * C_SI * C_SI);
114
+ // Sample metric at the evaluation point (needed for the Λ g_μν term, the
115
+ // ½R g_μν subtraction inside einstein-tensor lowering, and scale normalization).
116
+ const gAtX = gFn(x);
117
+ const gInvAtX = gInvFn(x);
118
+ const gMat = gAtX;
119
+ // Build NumericalInputs that the einstein-tensor lowering arm expects:
120
+ // - inputs.tensors['g']: concrete g_{μν} at x (step 4: ½R g_μν subtraction)
121
+ // - inputs.tensors['g_inv']: concrete g^{μν} at x (step 3: scalar trace R)
122
+ // - inputs.tensors['x']: coordinate array (riemann-tensor arm reads xCoord)
123
+ // - inputs.fields['g']: coordinate-dependent g closure (FD for ∂g → Γ)
124
+ // - inputs.fields['g_inv']: coordinate-dependent g^{-1} closure (FD for Γ)
125
+ const inputs = {
126
+ tensors: new Map([
127
+ ['g', gAtX],
128
+ ['g_inv', gInvAtX],
129
+ ['x', [...x]],
130
+ ]),
131
+ fields: new Map([
132
+ ['g', gFn],
133
+ ['g_inv', gInvFn],
134
+ ]),
135
+ dimension: 4,
136
+ };
137
+ // Lower G_μν via the einstein-tensor arm. lowerNode is synchronous (no await
138
+ // inside the einstein-tensor / ricci-tensor / riemann-tensor case arms).
139
+ const G_tensor = lowerNode(_einsteinNode, inputs, _engine);
140
+ const G = _engine.toNested(G_tensor);
141
+ // T_μν at this point.
142
+ const T = stressEnergy(x);
143
+ // Scale-normalized residual: max |G_μν + Λ g_μν − κ T_μν| / |g_μν|
144
+ //
145
+ // scale_μν = max(|g_μν|, 1e-30) avoids division by zero on off-diagonal zeros.
146
+ // For diagonal Schwarzschild: |g_tt| ~ c²f ~ 6e16, |g_rr|~1.5, |g_θθ|~r²,
147
+ // |g_φφ|~r²sin²θ. Off-diagonal components are exactly zero → scale = 1e-30,
148
+ // making |G_μν|/scale = |G_μν|/1e-30 — but G_μν off-diagonal is also ~0
149
+ // (FD noise), so these terms are ~0/1e-30 = negligible once the diagonal
150
+ // terms dominate.
151
+ //
152
+ // Implementation note: use max(|g_μν|, 1.0) instead of 1e-30 to keep the
153
+ // relative residual well-behaved when G_μν_off-diag has O(FD noise) absolute
154
+ // values. With floor=1.0, the off-diagonal "relative" residuals are just the
155
+ // absolute FD noise, which is < 1e-9 for 4th-order stencils, hence swamped
156
+ // by the diagonal relative residuals.
157
+ const N = 4;
158
+ let maxNormalized = 0;
159
+ for (let mu = 0; mu < N; mu++) {
160
+ for (let nu = 0; nu < N; nu++) {
161
+ const component = G[mu][nu]
162
+ + cosmologicalConstant * gMat[mu][nu]
163
+ - kappa * T[mu][nu];
164
+ const scale = Math.max(Math.abs(gMat[mu][nu]), 1.0);
165
+ const normalized = Math.abs(component) / scale;
166
+ if (normalized > maxNormalized)
167
+ maxNormalized = normalized;
168
+ }
169
+ }
170
+ return maxNormalized;
171
+ }
172
+ //# sourceMappingURL=einstein-equation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"einstein-equation.js","sourceRoot":"","sources":["../../src/numerical/einstein-equation.ts"],"names":[],"mappings":"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"}
@@ -4,11 +4,14 @@
4
4
  */
5
5
  export interface GeodesicIntegratorInputs {
6
6
  /**
7
- * Christoffel-symbol closure. Maps a 4-coordinate array x^μ to the
8
- * [4][4][4] tensor Γ^μ_{νρ}(x). The array is indexed as
9
- * `christoffelFn(x)[mu][nu][rho]`.
7
+ * Christoffel-symbol closure. Maps a 4-coordinate array x^μ to a
8
+ * Float64Array(64) containing Γ^μ_{νρ}(x) in λ-major layout:
9
+ * index (λ, μ, ν) → 16·λ + 4·μ + ν.
10
+ *
11
+ * BR-2 (v0.6.0 Task 2.9): migrated from nested number[][][] to flat
12
+ * Float64Array(64). Consumers call `arr[16*mu + 4*nu + rho]`.
10
13
  */
11
- christoffelFn: (x: ReadonlyArray<number>) => readonly (readonly (readonly number[])[])[];
14
+ christoffelFn: (x: ReadonlyArray<number>) => Float64Array;
12
15
  /** Initial 4-position x^μ(τ₀) = [t, r, θ, φ]. */
13
16
  x0: readonly [number, number, number, number];
14
17
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"geodesic-integrator.d.ts","sourceRoot":"","sources":["../../src/numerical/geodesic-integrator.ts"],"names":[],"mappings":"AAwBA;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,aAAa,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAEzF,iDAAiD;IACjD,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAE9C;;;;;;;;OAQG;IACH,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAE9C,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IAEjB,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IAEf,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IAEd;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAE3D,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAE3D;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC/E;AAoDD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,wBAAwB,GAC/B,wBAAwB,CAsD1B"}
1
+ {"version":3,"file":"geodesic-integrator.d.ts","sourceRoot":"","sources":["../../src/numerical/geodesic-integrator.ts"],"names":[],"mappings":"AAwBA;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;;;;;OAOG;IACH,aAAa,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,YAAY,CAAC;IAE1D,iDAAiD;IACjD,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAE9C;;;;;;;;OAQG;IACH,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAE9C,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IAEjB,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IAEf,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IAEd;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAE3D,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAE3D;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC/E;AAuDD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,wBAAwB,GAC/B,wBAAwB,CAuD1B"}