universal-physics-tensor 9.0.0 → 10.0.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 (824) hide show
  1. package/README.md +19 -16
  2. package/data/atlas/atlas.json +55 -44
  3. package/data/atlas/atlas.jsonld +1 -1
  4. package/data/atlas/diffusion.json +19 -18
  5. package/data/atlas/oscillators.json +15 -10
  6. package/data/atlas/waves.json +23 -18
  7. package/data/bridge-catalog.json +886 -1473
  8. package/data/bridge-catalog.schema.json +349 -132
  9. package/data/quantities.json +53 -19
  10. package/data/schemas/atlas-record.v0.json +184 -46
  11. package/data/units.json +33 -4
  12. package/dist/atlas/applicability.d.ts.map +1 -1
  13. package/dist/atlas/applicability.js +14 -3
  14. package/dist/atlas/applicability.js.map +1 -1
  15. package/dist/atlas/association.js.map +1 -1
  16. package/dist/atlas/benchmark/backend-shapes.d.ts.map +1 -1
  17. package/dist/atlas/benchmark/backend-shapes.js +5 -1
  18. package/dist/atlas/benchmark/backend-shapes.js.map +1 -1
  19. package/dist/atlas/benchmark/baselines.d.ts.map +1 -1
  20. package/dist/atlas/benchmark/baselines.js +8 -0
  21. package/dist/atlas/benchmark/baselines.js.map +1 -1
  22. package/dist/atlas/benchmark/hybrid-retrieval.d.ts +3 -2
  23. package/dist/atlas/benchmark/hybrid-retrieval.d.ts.map +1 -1
  24. package/dist/atlas/benchmark/hybrid-retrieval.js +15 -8
  25. package/dist/atlas/benchmark/hybrid-retrieval.js.map +1 -1
  26. package/dist/atlas/benchmark/leakage.js.map +1 -1
  27. package/dist/atlas/benchmark/loader.js.map +1 -1
  28. package/dist/atlas/benchmark/run-atlas.d.ts.map +1 -1
  29. package/dist/atlas/benchmark/run-atlas.js +14 -2
  30. package/dist/atlas/benchmark/run-atlas.js.map +1 -1
  31. package/dist/atlas/benchmark/stats.d.ts +1 -1
  32. package/dist/atlas/benchmark/stats.d.ts.map +1 -1
  33. package/dist/atlas/benchmark/stats.js +1 -1
  34. package/dist/atlas/benchmark/stats.js.map +1 -1
  35. package/dist/atlas/benchmark/study.js.map +1 -1
  36. package/dist/atlas/benchmark/types.js.map +1 -1
  37. package/dist/atlas/bridge-record.d.ts +4 -4
  38. package/dist/atlas/bridge-record.d.ts.map +1 -1
  39. package/dist/atlas/bridge-record.js +6 -6
  40. package/dist/atlas/bridge-record.js.map +1 -1
  41. package/dist/atlas/catalog-formal-ref.js.map +1 -1
  42. package/dist/atlas/chain-pipeline.d.ts +0 -11
  43. package/dist/atlas/chain-pipeline.d.ts.map +1 -1
  44. package/dist/atlas/chain-pipeline.js +5 -16
  45. package/dist/atlas/chain-pipeline.js.map +1 -1
  46. package/dist/atlas/composition-table.js.map +1 -1
  47. package/dist/atlas/conventions.js.map +1 -1
  48. package/dist/atlas/coverage.d.ts +2 -2
  49. package/dist/atlas/coverage.js.map +1 -1
  50. package/dist/atlas/derivation.js.map +1 -1
  51. package/dist/atlas/derive-evidence.d.ts +6 -4
  52. package/dist/atlas/derive-evidence.d.ts.map +1 -1
  53. package/dist/atlas/derive-evidence.js +7 -2
  54. package/dist/atlas/derive-evidence.js.map +1 -1
  55. package/dist/atlas/diffusion/bridges-closure.d.ts.map +1 -1
  56. package/dist/atlas/diffusion/bridges-closure.js +0 -5
  57. package/dist/atlas/diffusion/bridges-closure.js.map +1 -1
  58. package/dist/atlas/diffusion/bridges.d.ts.map +1 -1
  59. package/dist/atlas/diffusion/bridges.js +0 -3
  60. package/dist/atlas/diffusion/bridges.js.map +1 -1
  61. package/dist/atlas/diffusion/dimensions.js.map +1 -1
  62. package/dist/atlas/diffusion/index.d.ts +1 -1
  63. package/dist/atlas/diffusion/index.d.ts.map +1 -1
  64. package/dist/atlas/diffusion/index.js.map +1 -1
  65. package/dist/atlas/diffusion/models.js.map +1 -1
  66. package/dist/atlas/diffusion/numerics.js.map +1 -1
  67. package/dist/atlas/error-algebra.d.ts +6 -0
  68. package/dist/atlas/error-algebra.d.ts.map +1 -1
  69. package/dist/atlas/error-algebra.js +26 -0
  70. package/dist/atlas/error-algebra.js.map +1 -1
  71. package/dist/atlas/export.d.ts +18 -2
  72. package/dist/atlas/export.d.ts.map +1 -1
  73. package/dist/atlas/export.js +9 -3
  74. package/dist/atlas/export.js.map +1 -1
  75. package/dist/atlas/families.d.ts +19 -2
  76. package/dist/atlas/families.d.ts.map +1 -1
  77. package/dist/atlas/families.js +26 -3
  78. package/dist/atlas/families.js.map +1 -1
  79. package/dist/atlas/family.d.ts +27 -0
  80. package/dist/atlas/family.d.ts.map +1 -0
  81. package/dist/atlas/family.js +12 -0
  82. package/dist/atlas/family.js.map +1 -0
  83. package/dist/atlas/index.d.ts +3 -2
  84. package/dist/atlas/index.d.ts.map +1 -1
  85. package/dist/atlas/index.js +2 -1
  86. package/dist/atlas/index.js.map +1 -1
  87. package/dist/atlas/link-prediction.d.ts +1 -1
  88. package/dist/atlas/link-prediction.d.ts.map +1 -1
  89. package/dist/atlas/link-prediction.js.map +1 -1
  90. package/dist/atlas/model.js.map +1 -1
  91. package/dist/atlas/oscillators/bridges-coarse.d.ts.map +1 -1
  92. package/dist/atlas/oscillators/bridges-coarse.js +0 -1
  93. package/dist/atlas/oscillators/bridges-coarse.js.map +1 -1
  94. package/dist/atlas/oscillators/bridges-exact.d.ts.map +1 -1
  95. package/dist/atlas/oscillators/bridges-exact.js +0 -3
  96. package/dist/atlas/oscillators/bridges-exact.js.map +1 -1
  97. package/dist/atlas/oscillators/bridges-limits.d.ts.map +1 -1
  98. package/dist/atlas/oscillators/bridges-limits.js +0 -2
  99. package/dist/atlas/oscillators/bridges-limits.js.map +1 -1
  100. package/dist/atlas/oscillators/dimensions.js.map +1 -1
  101. package/dist/atlas/oscillators/index.d.ts +1 -16
  102. package/dist/atlas/oscillators/index.d.ts.map +1 -1
  103. package/dist/atlas/oscillators/index.js.map +1 -1
  104. package/dist/atlas/oscillators/limit-witnesses.js.map +1 -1
  105. package/dist/atlas/oscillators/models.js.map +1 -1
  106. package/dist/atlas/oscillators/norm-transport-witness.js.map +1 -1
  107. package/dist/atlas/oscillators/norm-transport.js.map +1 -1
  108. package/dist/atlas/oscillators/norms.js.map +1 -1
  109. package/dist/atlas/oscillators/pendulum-motion.js.map +1 -1
  110. package/dist/atlas/oscillators/phase-carriage.js.map +1 -1
  111. package/dist/atlas/oscillators/phase-translation.js.map +1 -1
  112. package/dist/atlas/oscillators/position-translation.js.map +1 -1
  113. package/dist/atlas/oscillators/rejections.js.map +1 -1
  114. package/dist/atlas/path-bound.js.map +1 -1
  115. package/dist/atlas/physjs-entries.generated.js.map +1 -1
  116. package/dist/atlas/physjs-ref.d.ts +79 -45
  117. package/dist/atlas/physjs-ref.d.ts.map +1 -1
  118. package/dist/atlas/physjs-ref.js +143 -62
  119. package/dist/atlas/physjs-ref.js.map +1 -1
  120. package/dist/atlas/physjs-reviewed.d.ts +31 -0
  121. package/dist/atlas/physjs-reviewed.d.ts.map +1 -0
  122. package/dist/atlas/physjs-reviewed.js +194 -0
  123. package/dist/atlas/physjs-reviewed.js.map +1 -0
  124. package/dist/atlas/poster/associations.js.map +1 -1
  125. package/dist/atlas/poster/derivations.js.map +1 -1
  126. package/dist/atlas/poster/statements.js.map +1 -1
  127. package/dist/atlas/proof-target.js.map +1 -1
  128. package/dist/atlas/public.d.ts +2 -1
  129. package/dist/atlas/public.d.ts.map +1 -1
  130. package/dist/atlas/public.js +2 -1
  131. package/dist/atlas/public.js.map +1 -1
  132. package/dist/atlas/regime.js.map +1 -1
  133. package/dist/atlas/serialize.d.ts +18 -12
  134. package/dist/atlas/serialize.d.ts.map +1 -1
  135. package/dist/atlas/serialize.js +28 -18
  136. package/dist/atlas/serialize.js.map +1 -1
  137. package/dist/atlas/statement.js.map +1 -1
  138. package/dist/atlas/translation-registry.js.map +1 -1
  139. package/dist/atlas/translation.js.map +1 -1
  140. package/dist/atlas/types.d.ts +9 -2
  141. package/dist/atlas/types.d.ts.map +1 -1
  142. package/dist/atlas/types.js +1 -1
  143. package/dist/atlas/types.js.map +1 -1
  144. package/dist/atlas/waves/bridges-closure.d.ts.map +1 -1
  145. package/dist/atlas/waves/bridges-closure.js +0 -3
  146. package/dist/atlas/waves/bridges-closure.js.map +1 -1
  147. package/dist/atlas/waves/bridges.d.ts.map +1 -1
  148. package/dist/atlas/waves/bridges.js +0 -4
  149. package/dist/atlas/waves/bridges.js.map +1 -1
  150. package/dist/atlas/waves/index.d.ts +1 -1
  151. package/dist/atlas/waves/index.d.ts.map +1 -1
  152. package/dist/atlas/waves/index.js.map +1 -1
  153. package/dist/atlas/waves/models.js.map +1 -1
  154. package/dist/atlas/waves/numerics.js.map +1 -1
  155. package/dist/atlas/witness-artifact.js.map +1 -1
  156. package/dist/atlas/witness-dominance.d.ts +4 -3
  157. package/dist/atlas/witness-dominance.d.ts.map +1 -1
  158. package/dist/atlas/witness-dominance.js +15 -5
  159. package/dist/atlas/witness-dominance.js.map +1 -1
  160. package/dist/atlas/witness-numeric.d.ts +8 -4
  161. package/dist/atlas/witness-numeric.d.ts.map +1 -1
  162. package/dist/atlas/witness-numeric.js +27 -2
  163. package/dist/atlas/witness-numeric.js.map +1 -1
  164. package/dist/atlas/witness-result.d.ts +7 -1
  165. package/dist/atlas/witness-result.d.ts.map +1 -1
  166. package/dist/atlas/witness-result.js.map +1 -1
  167. package/dist/atlas/witness-specs.js.map +1 -1
  168. package/dist/atlas/witness-symbolic.js.map +1 -1
  169. package/dist/atlas/witnesses/quantum-support.js.map +1 -1
  170. package/dist/bridges/caller-table.d.ts +1 -1
  171. package/dist/bridges/caller-table.d.ts.map +1 -1
  172. package/dist/bridges/caller-table.js.map +1 -1
  173. package/dist/bridges/carrier-sign.d.ts.map +1 -1
  174. package/dist/bridges/carrier-sign.js +8 -3
  175. package/dist/bridges/carrier-sign.js.map +1 -1
  176. package/dist/bridges/catalog-adapter.d.ts +12 -3
  177. package/dist/bridges/catalog-adapter.d.ts.map +1 -1
  178. package/dist/bridges/catalog-adapter.js +17 -9
  179. package/dist/bridges/catalog-adapter.js.map +1 -1
  180. package/dist/bridges/catalog-load.d.ts +12 -2
  181. package/dist/bridges/catalog-load.d.ts.map +1 -1
  182. package/dist/bridges/catalog-load.js +171 -8
  183. package/dist/bridges/catalog-load.js.map +1 -1
  184. package/dist/bridges/catalog-types.d.ts +48 -24
  185. package/dist/bridges/catalog-types.d.ts.map +1 -1
  186. package/dist/bridges/catalog-types.js.map +1 -1
  187. package/dist/bridges/coefficient-statement.js +1 -5
  188. package/dist/bridges/coefficient-statement.js.map +1 -1
  189. package/dist/bridges/confrontation-coverage.js.map +1 -1
  190. package/dist/bridges/confrontations.d.ts +1 -1
  191. package/dist/bridges/confrontations.d.ts.map +1 -1
  192. package/dist/bridges/confrontations.js +1 -1
  193. package/dist/bridges/confrontations.js.map +1 -1
  194. package/dist/bridges/evaluation-errors.d.ts +15 -2
  195. package/dist/bridges/evaluation-errors.d.ts.map +1 -1
  196. package/dist/bridges/evaluation-errors.js +20 -2
  197. package/dist/bridges/evaluation-errors.js.map +1 -1
  198. package/dist/bridges/evaluator-inputs.js.map +1 -1
  199. package/dist/bridges/evaluators.d.ts +17 -2
  200. package/dist/bridges/evaluators.d.ts.map +1 -1
  201. package/dist/bridges/evaluators.js +49 -16
  202. package/dist/bridges/evaluators.js.map +1 -1
  203. package/dist/bridges/expr-parse.d.ts +27 -4
  204. package/dist/bridges/expr-parse.d.ts.map +1 -1
  205. package/dist/bridges/expr-parse.js +90 -10
  206. package/dist/bridges/expr-parse.js.map +1 -1
  207. package/dist/bridges/holds.d.ts +5 -1
  208. package/dist/bridges/holds.d.ts.map +1 -1
  209. package/dist/bridges/holds.js +18 -3
  210. package/dist/bridges/holds.js.map +1 -1
  211. package/dist/bridges/index.d.ts +15 -14
  212. package/dist/bridges/index.d.ts.map +1 -1
  213. package/dist/bridges/index.js +14 -15
  214. package/dist/bridges/index.js.map +1 -1
  215. package/dist/bridges/input-contract.js.map +1 -1
  216. package/dist/bridges/membership.d.ts +5 -3
  217. package/dist/bridges/membership.d.ts.map +1 -1
  218. package/dist/bridges/membership.js +5 -6
  219. package/dist/bridges/membership.js.map +1 -1
  220. package/dist/bridges/notices.js.map +1 -1
  221. package/dist/bridges/observations/types.js.map +1 -1
  222. package/dist/bridges/rejected.d.ts +11 -17
  223. package/dist/bridges/rejected.d.ts.map +1 -1
  224. package/dist/bridges/rejected.js +13 -68
  225. package/dist/bridges/rejected.js.map +1 -1
  226. package/dist/bridges/relation-eval.d.ts +5 -6
  227. package/dist/bridges/relation-eval.d.ts.map +1 -1
  228. package/dist/bridges/relation-eval.js +9 -38
  229. package/dist/bridges/relation-eval.js.map +1 -1
  230. package/dist/bridges/rhs-registry.js.map +1 -1
  231. package/dist/bridges/sensitivity.d.ts +11 -3
  232. package/dist/bridges/sensitivity.d.ts.map +1 -1
  233. package/dist/bridges/sensitivity.js +24 -10
  234. package/dist/bridges/sensitivity.js.map +1 -1
  235. package/dist/bridges/tensor-index.js.map +1 -1
  236. package/dist/bridges/types.d.ts +1 -7
  237. package/dist/bridges/types.d.ts.map +1 -1
  238. package/dist/bridges/types.js +1 -4
  239. package/dist/bridges/types.js.map +1 -1
  240. package/dist/canonical/canonical-equation.js.map +1 -1
  241. package/dist/canonical/dimensional-fields.js.map +1 -1
  242. package/dist/canonical/entries/_l1-build.js.map +1 -1
  243. package/dist/canonical/entries/atomic.js.map +1 -1
  244. package/dist/canonical/entries/condensed-matter.js +4 -4
  245. package/dist/canonical/entries/condensed-matter.js.map +1 -1
  246. package/dist/canonical/entries/dimensional-classics.js +2 -2
  247. package/dist/canonical/entries/dimensional-classics.js.map +1 -1
  248. package/dist/canonical/entries/electromagnetism.js +2 -2
  249. package/dist/canonical/entries/electromagnetism.js.map +1 -1
  250. package/dist/canonical/entries/fluids-waves.js.map +1 -1
  251. package/dist/canonical/entries/mechanics.js.map +1 -1
  252. package/dist/canonical/entries/nonmonomial.d.ts.map +1 -1
  253. package/dist/canonical/entries/nonmonomial.js +29 -22
  254. package/dist/canonical/entries/nonmonomial.js.map +1 -1
  255. package/dist/canonical/entries/relativity.js.map +1 -1
  256. package/dist/canonical/entries/statistical-mechanics.js +5 -5
  257. package/dist/canonical/entries/statistical-mechanics.js.map +1 -1
  258. package/dist/canonical/entries/thermo-nuclear-cosmo.js.map +1 -1
  259. package/dist/canonical/linkage.d.ts +29 -4
  260. package/dist/canonical/linkage.d.ts.map +1 -1
  261. package/dist/canonical/linkage.js +31 -29
  262. package/dist/canonical/linkage.js.map +1 -1
  263. package/dist/canonical/normal-form.d.ts +0 -8
  264. package/dist/canonical/normal-form.d.ts.map +1 -1
  265. package/dist/canonical/normal-form.js +17 -12
  266. package/dist/canonical/normal-form.js.map +1 -1
  267. package/dist/canonical/registry.js.map +1 -1
  268. package/dist/canonical/residual.js.map +1 -1
  269. package/dist/canonical/seed-l-layer.d.ts +7 -1
  270. package/dist/canonical/seed-l-layer.d.ts.map +1 -1
  271. package/dist/canonical/seed-l-layer.js +7 -1
  272. package/dist/canonical/seed-l-layer.js.map +1 -1
  273. package/dist/canonical/structural.d.ts +21 -0
  274. package/dist/canonical/structural.d.ts.map +1 -1
  275. package/dist/canonical/structural.js +24 -4
  276. package/dist/canonical/structural.js.map +1 -1
  277. package/dist/cases/brownian-sphere.js +4 -4
  278. package/dist/cases/brownian-sphere.js.map +1 -1
  279. package/dist/cases/damped-resonator.js +2 -2
  280. package/dist/cases/damped-resonator.js.map +1 -1
  281. package/dist/cases/index.js.map +1 -1
  282. package/dist/cases/kepler-rv.js.map +1 -1
  283. package/dist/cases/lumped-cooling.js +1 -1
  284. package/dist/cases/lumped-cooling.js.map +1 -1
  285. package/dist/cases/quadrature.js.map +1 -1
  286. package/dist/cases/resistor-noise.js +3 -3
  287. package/dist/cases/resistor-noise.js.map +1 -1
  288. package/dist/cases/skin-depth.js.map +1 -1
  289. package/dist/cases/types.js.map +1 -1
  290. package/dist/cli/args.d.ts +7 -2
  291. package/dist/cli/args.d.ts.map +1 -1
  292. package/dist/cli/args.js +18 -2
  293. package/dist/cli/args.js.map +1 -1
  294. package/dist/cli/bindings.d.ts +13 -0
  295. package/dist/cli/bindings.d.ts.map +1 -0
  296. package/dist/cli/bindings.js +32 -0
  297. package/dist/cli/bindings.js.map +1 -0
  298. package/dist/cli/closed-form-range.js.map +1 -1
  299. package/dist/cli/command.js.map +1 -1
  300. package/dist/cli/commands/_atlas-map.d.ts +3 -3
  301. package/dist/cli/commands/_atlas-map.d.ts.map +1 -1
  302. package/dist/cli/commands/_atlas-map.js +43 -18
  303. package/dist/cli/commands/_atlas-map.js.map +1 -1
  304. package/dist/cli/commands/_atlas-route.js.map +1 -1
  305. package/dist/cli/commands/_discovery-opts.d.ts.map +1 -1
  306. package/dist/cli/commands/_discovery-opts.js +42 -7
  307. package/dist/cli/commands/_discovery-opts.js.map +1 -1
  308. package/dist/cli/commands/atlas.d.ts.map +1 -1
  309. package/dist/cli/commands/atlas.js +1 -3
  310. package/dist/cli/commands/atlas.js.map +1 -1
  311. package/dist/cli/commands/audit.d.ts.map +1 -1
  312. package/dist/cli/commands/audit.js +13 -20
  313. package/dist/cli/commands/audit.js.map +1 -1
  314. package/dist/cli/commands/axes.js.map +1 -1
  315. package/dist/cli/commands/candidates.d.ts.map +1 -1
  316. package/dist/cli/commands/candidates.js +16 -8
  317. package/dist/cli/commands/candidates.js.map +1 -1
  318. package/dist/cli/commands/canonical.js.map +1 -1
  319. package/dist/cli/commands/chain.js +1 -1
  320. package/dist/cli/commands/chain.js.map +1 -1
  321. package/dist/cli/commands/confront.d.ts.map +1 -1
  322. package/dist/cli/commands/confront.js +22 -14
  323. package/dist/cli/commands/confront.js.map +1 -1
  324. package/dist/cli/commands/connectors.js.map +1 -1
  325. package/dist/cli/commands/coverage.js.map +1 -1
  326. package/dist/cli/commands/derive.d.ts.map +1 -1
  327. package/dist/cli/commands/derive.js +42 -17
  328. package/dist/cli/commands/derive.js.map +1 -1
  329. package/dist/cli/commands/discover.d.ts.map +1 -1
  330. package/dist/cli/commands/discover.js +15 -9
  331. package/dist/cli/commands/discover.js.map +1 -1
  332. package/dist/cli/commands/eval.d.ts.map +1 -1
  333. package/dist/cli/commands/eval.js +13 -10
  334. package/dist/cli/commands/eval.js.map +1 -1
  335. package/dist/cli/commands/evaluate.d.ts.map +1 -1
  336. package/dist/cli/commands/evaluate.js +53 -31
  337. package/dist/cli/commands/evaluate.js.map +1 -1
  338. package/dist/cli/commands/explain.d.ts.map +1 -1
  339. package/dist/cli/commands/explain.js +14 -7
  340. package/dist/cli/commands/explain.js.map +1 -1
  341. package/dist/cli/commands/frontier.js.map +1 -1
  342. package/dist/cli/commands/ground.d.ts.map +1 -1
  343. package/dist/cli/commands/ground.js +40 -10
  344. package/dist/cli/commands/ground.js.map +1 -1
  345. package/dist/cli/commands/index.js.map +1 -1
  346. package/dist/cli/commands/map.d.ts.map +1 -1
  347. package/dist/cli/commands/map.js +82 -89
  348. package/dist/cli/commands/map.js.map +1 -1
  349. package/dist/cli/commands/metric.d.ts.map +1 -1
  350. package/dist/cli/commands/metric.js +53 -18
  351. package/dist/cli/commands/metric.js.map +1 -1
  352. package/dist/cli/commands/path.js +4 -4
  353. package/dist/cli/commands/path.js.map +1 -1
  354. package/dist/cli/commands/predict.js.map +1 -1
  355. package/dist/cli/commands/priority.js.map +1 -1
  356. package/dist/cli/commands/probe.d.ts.map +1 -1
  357. package/dist/cli/commands/probe.js +50 -26
  358. package/dist/cli/commands/probe.js.map +1 -1
  359. package/dist/cli/commands/recover.js +1 -1
  360. package/dist/cli/commands/recover.js.map +1 -1
  361. package/dist/cli/commands/regime.d.ts +5 -4
  362. package/dist/cli/commands/regime.d.ts.map +1 -1
  363. package/dist/cli/commands/regime.js +24 -26
  364. package/dist/cli/commands/regime.js.map +1 -1
  365. package/dist/cli/commands/retrieve.d.ts.map +1 -1
  366. package/dist/cli/commands/retrieve.js +22 -14
  367. package/dist/cli/commands/retrieve.js.map +1 -1
  368. package/dist/cli/commands/search.d.ts.map +1 -1
  369. package/dist/cli/commands/search.js +8 -4
  370. package/dist/cli/commands/search.js.map +1 -1
  371. package/dist/cli/commands/symbolic.d.ts.map +1 -1
  372. package/dist/cli/commands/symbolic.js +13 -9
  373. package/dist/cli/commands/symbolic.js.map +1 -1
  374. package/dist/cli/commands/testplan.js +1 -1
  375. package/dist/cli/commands/testplan.js.map +1 -1
  376. package/dist/cli/conventions.js.map +1 -1
  377. package/dist/cli/determination.js.map +1 -1
  378. package/dist/cli/errors.js.map +1 -1
  379. package/dist/cli/euler-guard.js.map +1 -1
  380. package/dist/cli/eval-numbers.js.map +1 -1
  381. package/dist/cli/expr-print.d.ts +29 -2
  382. package/dist/cli/expr-print.d.ts.map +1 -1
  383. package/dist/cli/expr-print.js +46 -2
  384. package/dist/cli/expr-print.js.map +1 -1
  385. package/dist/cli/flag-help.js.map +1 -1
  386. package/dist/cli/graphs.js.map +1 -1
  387. package/dist/cli/library-defaults.d.ts +19 -0
  388. package/dist/cli/library-defaults.d.ts.map +1 -0
  389. package/dist/cli/library-defaults.js +22 -0
  390. package/dist/cli/library-defaults.js.map +1 -0
  391. package/dist/cli/main.js +7 -3
  392. package/dist/cli/main.js.map +1 -1
  393. package/dist/cli/map-evidence.js.map +1 -1
  394. package/dist/cli/output.d.ts +3 -6
  395. package/dist/cli/output.d.ts.map +1 -1
  396. package/dist/cli/output.js.map +1 -1
  397. package/dist/cli/published-url.js.map +1 -1
  398. package/dist/cli/record-reach.d.ts +6 -0
  399. package/dist/cli/record-reach.d.ts.map +1 -1
  400. package/dist/cli/record-reach.js +16 -10
  401. package/dist/cli/record-reach.js.map +1 -1
  402. package/dist/cli/record-tables.js +1 -1
  403. package/dist/cli/record-tables.js.map +1 -1
  404. package/dist/cli/record.d.ts.map +1 -1
  405. package/dist/cli/record.js +31 -12
  406. package/dist/cli/record.js.map +1 -1
  407. package/dist/cli/search-index.d.ts +5 -0
  408. package/dist/cli/search-index.d.ts.map +1 -1
  409. package/dist/cli/search-index.js +12 -1
  410. package/dist/cli/search-index.js.map +1 -1
  411. package/dist/cli/statuses.js.map +1 -1
  412. package/dist/cli/top-level-help.js.map +1 -1
  413. package/dist/cli/version.js.map +1 -1
  414. package/dist/cli-api.d.ts +15 -9
  415. package/dist/cli-api.d.ts.map +1 -1
  416. package/dist/cli-api.js +14 -13
  417. package/dist/cli-api.js.map +1 -1
  418. package/dist/composition/adjudication.js.map +1 -1
  419. package/dist/composition/aliases.js.map +1 -1
  420. package/dist/composition/audit-coverage.d.ts +2 -0
  421. package/dist/composition/audit-coverage.d.ts.map +1 -1
  422. package/dist/composition/audit-coverage.js.map +1 -1
  423. package/dist/composition/axes.d.ts +12 -0
  424. package/dist/composition/axes.d.ts.map +1 -1
  425. package/dist/composition/axes.js +18 -6
  426. package/dist/composition/axes.js.map +1 -1
  427. package/dist/composition/axis-audit.js.map +1 -1
  428. package/dist/composition/bridge-analysis.d.ts +0 -18
  429. package/dist/composition/bridge-analysis.d.ts.map +1 -1
  430. package/dist/composition/bridge-analysis.js +57 -47
  431. package/dist/composition/bridge-analysis.js.map +1 -1
  432. package/dist/composition/bridge-prediction.d.ts +5 -1
  433. package/dist/composition/bridge-prediction.d.ts.map +1 -1
  434. package/dist/composition/bridge-prediction.js +12 -16
  435. package/dist/composition/bridge-prediction.js.map +1 -1
  436. package/dist/composition/buckingham-filter.js.map +1 -1
  437. package/dist/composition/canonical-compare.d.ts.map +1 -1
  438. package/dist/composition/canonical-compare.js +12 -2
  439. package/dist/composition/canonical-compare.js.map +1 -1
  440. package/dist/composition/canonical-graph.d.ts +8 -9
  441. package/dist/composition/canonical-graph.d.ts.map +1 -1
  442. package/dist/composition/canonical-graph.js +25 -67
  443. package/dist/composition/canonical-graph.js.map +1 -1
  444. package/dist/composition/canonical-json.js.map +1 -1
  445. package/dist/composition/canonical-prefactors.js.map +1 -1
  446. package/dist/composition/catalog-graph.d.ts.map +1 -1
  447. package/dist/composition/catalog-graph.js +6 -20
  448. package/dist/composition/catalog-graph.js.map +1 -1
  449. package/dist/composition/chain-candidate.d.ts +2 -0
  450. package/dist/composition/chain-candidate.d.ts.map +1 -1
  451. package/dist/composition/chain-candidate.js +2 -0
  452. package/dist/composition/chain-candidate.js.map +1 -1
  453. package/dist/composition/chain-match.js.map +1 -1
  454. package/dist/composition/chain-regime.js.map +1 -1
  455. package/dist/composition/chain-result.js.map +1 -1
  456. package/dist/composition/compose-surface.js.map +1 -1
  457. package/dist/composition/compose-symbolic.js.map +1 -1
  458. package/dist/composition/compose.d.ts.map +1 -1
  459. package/dist/composition/compose.js +153 -36
  460. package/dist/composition/compose.js.map +1 -1
  461. package/dist/composition/composition-recovery.js.map +1 -1
  462. package/dist/composition/consequence.d.ts.map +1 -1
  463. package/dist/composition/consequence.js +15 -6
  464. package/dist/composition/consequence.js.map +1 -1
  465. package/dist/composition/consistency.js.map +1 -1
  466. package/dist/composition/descriptor.d.ts +1 -1
  467. package/dist/composition/descriptor.d.ts.map +1 -1
  468. package/dist/composition/descriptor.js.map +1 -1
  469. package/dist/composition/dimension-adjacency.js.map +1 -1
  470. package/dist/composition/discovery.d.ts +21 -11
  471. package/dist/composition/discovery.d.ts.map +1 -1
  472. package/dist/composition/discovery.js +81 -21
  473. package/dist/composition/discovery.js.map +1 -1
  474. package/dist/composition/edge.d.ts +19 -8
  475. package/dist/composition/edge.d.ts.map +1 -1
  476. package/dist/composition/edge.js +24 -11
  477. package/dist/composition/edge.js.map +1 -1
  478. package/dist/composition/enumerate.d.ts +2 -2
  479. package/dist/composition/enumerate.d.ts.map +1 -1
  480. package/dist/composition/enumerate.js.map +1 -1
  481. package/dist/composition/evaluate-relation.js.map +1 -1
  482. package/dist/composition/explain.d.ts +14 -9
  483. package/dist/composition/explain.d.ts.map +1 -1
  484. package/dist/composition/explain.js +46 -13
  485. package/dist/composition/explain.js.map +1 -1
  486. package/dist/composition/expr-eval.js.map +1 -1
  487. package/dist/composition/expr-simplify.d.ts.map +1 -1
  488. package/dist/composition/expr-simplify.js +9 -39
  489. package/dist/composition/expr-simplify.js.map +1 -1
  490. package/dist/composition/expr-subst.js.map +1 -1
  491. package/dist/composition/formula-shape.d.ts +9 -0
  492. package/dist/composition/formula-shape.d.ts.map +1 -1
  493. package/dist/composition/formula-shape.js +54 -0
  494. package/dist/composition/formula-shape.js.map +1 -1
  495. package/dist/composition/frontier-account.d.ts +3 -2
  496. package/dist/composition/frontier-account.d.ts.map +1 -1
  497. package/dist/composition/frontier-account.js +7 -3
  498. package/dist/composition/frontier-account.js.map +1 -1
  499. package/dist/composition/graph-viz-svg.js.map +1 -1
  500. package/dist/composition/graph-viz.js.map +1 -1
  501. package/dist/composition/grounding.js.map +1 -1
  502. package/dist/composition/identifiability.js.map +1 -1
  503. package/dist/composition/index.d.ts +6 -4
  504. package/dist/composition/index.d.ts.map +1 -1
  505. package/dist/composition/index.js +4 -3
  506. package/dist/composition/index.js.map +1 -1
  507. package/dist/composition/mathts-quiet.d.ts +28 -0
  508. package/dist/composition/mathts-quiet.d.ts.map +1 -0
  509. package/dist/composition/mathts-quiet.js +56 -0
  510. package/dist/composition/mathts-quiet.js.map +1 -0
  511. package/dist/composition/mathts-scalar-symbols.d.ts.map +1 -1
  512. package/dist/composition/mathts-scalar-symbols.js +18 -34
  513. package/dist/composition/mathts-scalar-symbols.js.map +1 -1
  514. package/dist/composition/not-composable-seeds.d.ts +3 -1
  515. package/dist/composition/not-composable-seeds.d.ts.map +1 -1
  516. package/dist/composition/not-composable-seeds.js +2 -0
  517. package/dist/composition/not-composable-seeds.js.map +1 -1
  518. package/dist/composition/probe/backend-protocol.js.map +1 -1
  519. package/dist/composition/probe/candidate-store.js.map +1 -1
  520. package/dist/composition/probe/corpus.js.map +1 -1
  521. package/dist/composition/probe/dataset.js.map +1 -1
  522. package/dist/composition/probe/experiment-design.js.map +1 -1
  523. package/dist/composition/probe/expression-gaps.js.map +1 -1
  524. package/dist/composition/probe/falsify.d.ts +14 -3
  525. package/dist/composition/probe/falsify.d.ts.map +1 -1
  526. package/dist/composition/probe/falsify.js +14 -27
  527. package/dist/composition/probe/falsify.js.map +1 -1
  528. package/dist/composition/probe/fingerprint.js.map +1 -1
  529. package/dist/composition/probe/fit.d.ts +1 -1
  530. package/dist/composition/probe/fit.d.ts.map +1 -1
  531. package/dist/composition/probe/fit.js +2 -1
  532. package/dist/composition/probe/fit.js.map +1 -1
  533. package/dist/composition/probe/frontier.js.map +1 -1
  534. package/dist/composition/probe/generator.js.map +1 -1
  535. package/dist/composition/probe/index.d.ts +4 -2
  536. package/dist/composition/probe/index.d.ts.map +1 -1
  537. package/dist/composition/probe/index.js +4 -2
  538. package/dist/composition/probe/index.js.map +1 -1
  539. package/dist/composition/probe/limits.js.map +1 -1
  540. package/dist/composition/probe/metadata.js.map +1 -1
  541. package/dist/composition/probe/pipeline.d.ts +5 -0
  542. package/dist/composition/probe/pipeline.d.ts.map +1 -1
  543. package/dist/composition/probe/pipeline.js +13 -6
  544. package/dist/composition/probe/pipeline.js.map +1 -1
  545. package/dist/composition/probe/problem.d.ts +8 -0
  546. package/dist/composition/probe/problem.d.ts.map +1 -1
  547. package/dist/composition/probe/problem.js +78 -12
  548. package/dist/composition/probe/problem.js.map +1 -1
  549. package/dist/composition/probe/report.js.map +1 -1
  550. package/dist/composition/probe/residual.js.map +1 -1
  551. package/dist/composition/probe/run-manifest.js +2 -2
  552. package/dist/composition/probe/run-manifest.js.map +1 -1
  553. package/dist/composition/probe/scoring.d.ts +2 -1
  554. package/dist/composition/probe/scoring.d.ts.map +1 -1
  555. package/dist/composition/probe/scoring.js +21 -7
  556. package/dist/composition/probe/scoring.js.map +1 -1
  557. package/dist/composition/probe/search-budget.js.map +1 -1
  558. package/dist/composition/probe/serialize.js.map +1 -1
  559. package/dist/composition/probe/structure.js.map +1 -1
  560. package/dist/composition/probe/study.d.ts +4 -3
  561. package/dist/composition/probe/study.d.ts.map +1 -1
  562. package/dist/composition/probe/study.js +5 -3
  563. package/dist/composition/probe/study.js.map +1 -1
  564. package/dist/composition/probe/types.d.ts +3 -1
  565. package/dist/composition/probe/types.d.ts.map +1 -1
  566. package/dist/composition/probe/types.js +2 -0
  567. package/dist/composition/probe/types.js.map +1 -1
  568. package/dist/composition/proposed-bridges.d.ts +11 -4
  569. package/dist/composition/proposed-bridges.d.ts.map +1 -1
  570. package/dist/composition/proposed-bridges.js +11 -4
  571. package/dist/composition/proposed-bridges.js.map +1 -1
  572. package/dist/composition/quantities.d.ts +0 -4
  573. package/dist/composition/quantities.d.ts.map +1 -1
  574. package/dist/composition/quantities.js +5 -5
  575. package/dist/composition/quantities.js.map +1 -1
  576. package/dist/composition/quantity.d.ts +18 -2
  577. package/dist/composition/quantity.d.ts.map +1 -1
  578. package/dist/composition/quantity.js +35 -6
  579. package/dist/composition/quantity.js.map +1 -1
  580. package/dist/composition/representative-values.js.map +1 -1
  581. package/dist/composition/retrodiction.d.ts +16 -6
  582. package/dist/composition/retrodiction.d.ts.map +1 -1
  583. package/dist/composition/retrodiction.js +34 -9
  584. package/dist/composition/retrodiction.js.map +1 -1
  585. package/dist/composition/uncertainty.js.map +1 -1
  586. package/dist/composition/user-equation.js.map +1 -1
  587. package/dist/core/axes-registry.d.ts +8 -5
  588. package/dist/core/axes-registry.d.ts.map +1 -1
  589. package/dist/core/axes-registry.js.map +1 -1
  590. package/dist/core/cell.js.map +1 -1
  591. package/dist/core/constants.d.ts +8 -8
  592. package/dist/core/constants.d.ts.map +1 -1
  593. package/dist/core/constants.js +8 -10
  594. package/dist/core/constants.js.map +1 -1
  595. package/dist/core/data-file.js.map +1 -1
  596. package/dist/core/flux-rules.js +1 -1
  597. package/dist/core/flux-rules.js.map +1 -1
  598. package/dist/core/json-schema.d.ts +1 -1
  599. package/dist/core/json-schema.d.ts.map +1 -1
  600. package/dist/core/json-schema.js +31 -7
  601. package/dist/core/json-schema.js.map +1 -1
  602. package/dist/core/labeled-tensor.d.ts +6 -1
  603. package/dist/core/labeled-tensor.d.ts.map +1 -1
  604. package/dist/core/labeled-tensor.js +18 -8
  605. package/dist/core/labeled-tensor.js.map +1 -1
  606. package/dist/core/regime-registry.d.ts +6 -2
  607. package/dist/core/regime-registry.d.ts.map +1 -1
  608. package/dist/core/regime-registry.js.map +1 -1
  609. package/dist/core/regime-rule-install.js.map +1 -1
  610. package/dist/core/regimes-builtins.js.map +1 -1
  611. package/dist/core/tensor.d.ts +7 -4
  612. package/dist/core/tensor.d.ts.map +1 -1
  613. package/dist/core/tensor.js +40 -8
  614. package/dist/core/tensor.js.map +1 -1
  615. package/dist/core/types.js.map +1 -1
  616. package/dist/core/universal-index.js.map +1 -1
  617. package/dist/diff/bridge-ast-gradient.d.ts +4 -5
  618. package/dist/diff/bridge-ast-gradient.d.ts.map +1 -1
  619. package/dist/diff/bridge-ast-gradient.js +10 -6
  620. package/dist/diff/bridge-ast-gradient.js.map +1 -1
  621. package/dist/diff/bridge-gradient.d.ts +24 -80
  622. package/dist/diff/bridge-gradient.d.ts.map +1 -1
  623. package/dist/diff/bridge-gradient.js +21 -98
  624. package/dist/diff/bridge-gradient.js.map +1 -1
  625. package/dist/diff/bridge-specs.d.ts +16 -5
  626. package/dist/diff/bridge-specs.d.ts.map +1 -1
  627. package/dist/diff/bridge-specs.js +16 -4
  628. package/dist/diff/bridge-specs.js.map +1 -1
  629. package/dist/dimensional/algebra.js.map +1 -1
  630. package/dist/dimensional/ast-builders.d.ts +5 -4
  631. package/dist/dimensional/ast-builders.d.ts.map +1 -1
  632. package/dist/dimensional/ast-builders.js +6 -5
  633. package/dist/dimensional/ast-builders.js.map +1 -1
  634. package/dist/dimensional/ast-types.js.map +1 -1
  635. package/dist/dimensional/bridge-check.js.map +1 -1
  636. package/dist/dimensional/buckingham.js.map +1 -1
  637. package/dist/dimensional/connection-validators.d.ts +2 -1
  638. package/dist/dimensional/connection-validators.d.ts.map +1 -1
  639. package/dist/dimensional/connection-validators.js.map +1 -1
  640. package/dist/dimensional/connection.js.map +1 -1
  641. package/dist/dimensional/constant-rows.d.ts.map +1 -1
  642. package/dist/dimensional/constant-rows.js +9 -5
  643. package/dist/dimensional/constant-rows.js.map +1 -1
  644. package/dist/dimensional/constants.d.ts +5 -6
  645. package/dist/dimensional/constants.d.ts.map +1 -1
  646. package/dist/dimensional/constants.js +5 -6
  647. package/dist/dimensional/constants.js.map +1 -1
  648. package/dist/dimensional/curvature-composite.js.map +1 -1
  649. package/dist/dimensional/curvature-invariants.js.map +1 -1
  650. package/dist/dimensional/curvature.js.map +1 -1
  651. package/dist/dimensional/dimension-inference.js.map +1 -1
  652. package/dist/dimensional/dimension-spec.d.ts +13 -7
  653. package/dist/dimensional/dimension-spec.d.ts.map +1 -1
  654. package/dist/dimensional/dimension-spec.js +49 -23
  655. package/dist/dimensional/dimension-spec.js.map +1 -1
  656. package/dist/dimensional/einstein-equation.js.map +1 -1
  657. package/dist/dimensional/errors.d.ts +3 -1
  658. package/dist/dimensional/errors.d.ts.map +1 -1
  659. package/dist/dimensional/errors.js +2 -2
  660. package/dist/dimensional/errors.js.map +1 -1
  661. package/dist/dimensional/exact-scale.js.map +1 -1
  662. package/dist/dimensional/field-equation-helpers.js.map +1 -1
  663. package/dist/dimensional/formula-names.js.map +1 -1
  664. package/dist/dimensional/fresh-label.js.map +1 -1
  665. package/dist/dimensional/friedmann-equation.d.ts +3 -3
  666. package/dist/dimensional/friedmann-equation.js +3 -3
  667. package/dist/dimensional/friedmann-equation.js.map +1 -1
  668. package/dist/dimensional/gauge-field.d.ts +2 -3
  669. package/dist/dimensional/gauge-field.d.ts.map +1 -1
  670. package/dist/dimensional/gauge-field.js +0 -1
  671. package/dist/dimensional/gauge-field.js.map +1 -1
  672. package/dist/dimensional/hyphen-names.d.ts.map +1 -1
  673. package/dist/dimensional/hyphen-names.js +8 -0
  674. package/dist/dimensional/hyphen-names.js.map +1 -1
  675. package/dist/dimensional/killing-validators.js.map +1 -1
  676. package/dist/dimensional/klein-gordon-equation.js.map +1 -1
  677. package/dist/dimensional/metric-validators.d.ts +2 -1
  678. package/dist/dimensional/metric-validators.d.ts.map +1 -1
  679. package/dist/dimensional/metric-validators.js.map +1 -1
  680. package/dist/dimensional/metric.js.map +1 -1
  681. package/dist/dimensional/natural-units.js.map +1 -1
  682. package/dist/dimensional/quantity-registry.d.ts +13 -0
  683. package/dist/dimensional/quantity-registry.d.ts.map +1 -1
  684. package/dist/dimensional/quantity-registry.js +14 -6
  685. package/dist/dimensional/quantity-registry.js.map +1 -1
  686. package/dist/dimensional/rg-flow.js.map +1 -1
  687. package/dist/dimensional/stress-energy-validators.js.map +1 -1
  688. package/dist/dimensional/symbolic-constants.d.ts.map +1 -1
  689. package/dist/dimensional/symbolic-constants.js +7 -2
  690. package/dist/dimensional/symbolic-constants.js.map +1 -1
  691. package/dist/dimensional/tensor-trace.js.map +1 -1
  692. package/dist/dimensional/tensor.js.map +1 -1
  693. package/dist/dimensional/types.js.map +1 -1
  694. package/dist/dimensional/unit-convention.d.ts +0 -2
  695. package/dist/dimensional/unit-convention.d.ts.map +1 -1
  696. package/dist/dimensional/unit-convention.js +2 -2
  697. package/dist/dimensional/unit-convention.js.map +1 -1
  698. package/dist/dimensional/unit-data.d.ts.map +1 -1
  699. package/dist/dimensional/unit-data.js +9 -5
  700. package/dist/dimensional/unit-data.js.map +1 -1
  701. package/dist/dimensional/units.d.ts.map +1 -1
  702. package/dist/dimensional/units.js +38 -20
  703. package/dist/dimensional/units.js.map +1 -1
  704. package/dist/dimensional/validator-registry.js.map +1 -1
  705. package/dist/dimensional/validator.d.ts +0 -16
  706. package/dist/dimensional/validator.d.ts.map +1 -1
  707. package/dist/dimensional/validator.js +65 -29
  708. package/dist/dimensional/validator.js.map +1 -1
  709. package/dist/dimensional/weyl-validators.js.map +1 -1
  710. package/dist/index.d.ts +50 -5
  711. package/dist/index.d.ts.map +1 -1
  712. package/dist/index.js +12 -20
  713. package/dist/index.js.map +1 -1
  714. package/dist/numerical/bianchi-residual.js.map +1 -1
  715. package/dist/numerical/binding-value.d.ts +11 -6
  716. package/dist/numerical/binding-value.d.ts.map +1 -1
  717. package/dist/numerical/binding-value.js +126 -122
  718. package/dist/numerical/binding-value.js.map +1 -1
  719. package/dist/numerical/christoffel-flat.js.map +1 -1
  720. package/dist/numerical/connection-lowering-helpers.js.map +1 -1
  721. package/dist/numerical/covariant-eikonal.d.ts.map +1 -1
  722. package/dist/numerical/covariant-eikonal.js +2 -2
  723. package/dist/numerical/covariant-eikonal.js.map +1 -1
  724. package/dist/numerical/curvature-lowering-helpers.d.ts +20 -0
  725. package/dist/numerical/curvature-lowering-helpers.d.ts.map +1 -1
  726. package/dist/numerical/curvature-lowering-helpers.js +6 -3
  727. package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
  728. package/dist/numerical/derivative-lowering.js.map +1 -1
  729. package/dist/numerical/einstein-equation.js.map +1 -1
  730. package/dist/numerical/engine-registry.js.map +1 -1
  731. package/dist/numerical/errors.d.ts +7 -3
  732. package/dist/numerical/errors.d.ts.map +1 -1
  733. package/dist/numerical/errors.js +5 -5
  734. package/dist/numerical/errors.js.map +1 -1
  735. package/dist/numerical/evaluator-uncertainty.d.ts.map +1 -1
  736. package/dist/numerical/evaluator-uncertainty.js +19 -2
  737. package/dist/numerical/evaluator-uncertainty.js.map +1 -1
  738. package/dist/numerical/formula-contract.d.ts +63 -7
  739. package/dist/numerical/formula-contract.d.ts.map +1 -1
  740. package/dist/numerical/formula-contract.js +61 -42
  741. package/dist/numerical/formula-contract.js.map +1 -1
  742. package/dist/numerical/formula-dimension.d.ts +8 -7
  743. package/dist/numerical/formula-dimension.d.ts.map +1 -1
  744. package/dist/numerical/formula-dimension.js +58 -36
  745. package/dist/numerical/formula-dimension.js.map +1 -1
  746. package/dist/numerical/formula-mathts.d.ts.map +1 -1
  747. package/dist/numerical/formula-mathts.js +5 -2
  748. package/dist/numerical/formula-mathts.js.map +1 -1
  749. package/dist/numerical/formula-registry.d.ts +13 -3
  750. package/dist/numerical/formula-registry.d.ts.map +1 -1
  751. package/dist/numerical/formula-registry.js +7 -2
  752. package/dist/numerical/formula-registry.js.map +1 -1
  753. package/dist/numerical/geodesic-integrator.js.map +1 -1
  754. package/dist/numerical/geometrized.js.map +1 -1
  755. package/dist/numerical/gl4-integrator.d.ts +28 -27
  756. package/dist/numerical/gl4-integrator.d.ts.map +1 -1
  757. package/dist/numerical/gl4-integrator.js +41 -42
  758. package/dist/numerical/gl4-integrator.js.map +1 -1
  759. package/dist/numerical/grid-field.js.map +1 -1
  760. package/dist/numerical/index.js.map +1 -1
  761. package/dist/numerical/input-validation.d.ts +3 -6
  762. package/dist/numerical/input-validation.d.ts.map +1 -1
  763. package/dist/numerical/input-validation.js +4 -8
  764. package/dist/numerical/input-validation.js.map +1 -1
  765. package/dist/numerical/killing.d.ts +8 -5
  766. package/dist/numerical/killing.d.ts.map +1 -1
  767. package/dist/numerical/killing.js.map +1 -1
  768. package/dist/numerical/klein-gordon.js.map +1 -1
  769. package/dist/numerical/kretschmann.js.map +1 -1
  770. package/dist/numerical/lowering-utils.js.map +1 -1
  771. package/dist/numerical/lowering.d.ts.map +1 -1
  772. package/dist/numerical/lowering.js +7 -17
  773. package/dist/numerical/lowering.js.map +1 -1
  774. package/dist/numerical/mathts-engine.d.ts.map +1 -1
  775. package/dist/numerical/mathts-engine.js +11 -6
  776. package/dist/numerical/mathts-engine.js.map +1 -1
  777. package/dist/numerical/metric-inverse.js.map +1 -1
  778. package/dist/numerical/null-ic.js.map +1 -1
  779. package/dist/numerical/null-ray-integrator.js +4 -4
  780. package/dist/numerical/null-ray-integrator.js.map +1 -1
  781. package/dist/numerical/painleve-gullstrand-metric.js.map +1 -1
  782. package/dist/numerical/pderiv.d.ts.map +1 -1
  783. package/dist/numerical/pderiv.js +9 -2
  784. package/dist/numerical/pderiv.js.map +1 -1
  785. package/dist/numerical/perihelion-finder.js.map +1 -1
  786. package/dist/numerical/quadrature.d.ts +5 -2
  787. package/dist/numerical/quadrature.d.ts.map +1 -1
  788. package/dist/numerical/quadrature.js +20 -3
  789. package/dist/numerical/quadrature.js.map +1 -1
  790. package/dist/numerical/spacetime-metrics.d.ts +13 -19
  791. package/dist/numerical/spacetime-metrics.d.ts.map +1 -1
  792. package/dist/numerical/spacetime-metrics.js +126 -248
  793. package/dist/numerical/spacetime-metrics.js.map +1 -1
  794. package/dist/numerical/strides.js.map +1 -1
  795. package/dist/numerical/tensor-engine.d.ts +9 -5
  796. package/dist/numerical/tensor-engine.d.ts.map +1 -1
  797. package/dist/numerical/tensor-engine.js.map +1 -1
  798. package/dist/numerical/types.js.map +1 -1
  799. package/dist/numerical/weyl-lowering.js.map +1 -1
  800. package/dist/relations/category.js.map +1 -1
  801. package/dist/relations/composition-table.d.ts +4 -4
  802. package/dist/relations/composition-table.js +4 -4
  803. package/dist/relations/composition-table.js.map +1 -1
  804. package/dist/relations/conventions.js.map +1 -1
  805. package/dist/relations/domain-regimes.js.map +1 -1
  806. package/dist/relations/regime-registration.js.map +1 -1
  807. package/dist/relations/regime-vocabularies.js.map +1 -1
  808. package/dist/relations/regime.d.ts +18 -8
  809. package/dist/relations/regime.d.ts.map +1 -1
  810. package/dist/relations/regime.js +26 -14
  811. package/dist/relations/regime.js.map +1 -1
  812. package/dist/relations/types.d.ts +18 -5
  813. package/dist/relations/types.d.ts.map +1 -1
  814. package/dist/relations/types.js +5 -3
  815. package/dist/relations/types.js.map +1 -1
  816. package/package.json +10 -14
  817. package/dist/bridges/registry.d.ts +0 -60
  818. package/dist/bridges/registry.d.ts.map +0 -1
  819. package/dist/bridges/registry.js +0 -87
  820. package/dist/bridges/registry.js.map +0 -1
  821. package/dist/cli/poster-source.d.ts +0 -154
  822. package/dist/cli/poster-source.d.ts.map +0 -1
  823. package/dist/cli/poster-source.js +0 -184
  824. package/dist/cli/poster-source.js.map +0 -1
@@ -6,27 +6,39 @@
6
6
  * node uses the same mostly-plus signature. The Kretschmann scalar does not
7
7
  * depend on that choice.
8
8
  *
9
- * Schwarzschild Christoffel symbols are the closed form. Riemann, Ricci and
10
- * Kretschmann are a 4th-order finite difference of the metric, checked in
11
- * tests against the closed forms (Schwarzschild Kretschmann, flat-dust FLRW
12
- * Ricci scalar, Kerr Kretschmann). Kerr geodesics in Boyer–Lindquist
13
- * coordinates, including inclined ones, take their initial data from the
14
- * Carter constant and are integrated with the second-order geodesic equation.
9
+ * Schwarzschild and Kerr Christoffel symbols are closed forms; the Kerr
10
+ * ones come from the analytic metric derivatives through the one Christoffel
11
+ * builder (`computeChristoffelTensor`). Riemann, Ricci and Kretschmann are
12
+ * the finite-difference curvature stack of `curvature-lowering-helpers.ts`
13
+ * (`christoffelAt`, `riemannUpperAt`, `lowerFirstIndex`) and
14
+ * `computeKretschmann`, checked in tests against the closed forms
15
+ * (Schwarzschild Kretschmann, flat-dust FLRW Ricci scalar, Kerr
16
+ * Kretschmann). The metric inverse is MathTS `inv`. Kerr geodesics in
17
+ * Boyer–Lindquist coordinates, including inclined ones, take their initial
18
+ * data from the Carter constant and are integrated with the second-order
19
+ * geodesic equation by `integrateGeodesic` (`geodesic-integrator.ts`).
20
+ * This module holds no curvature or geodesic arithmetic of its own.
15
21
  *
16
22
  * @module numerical/spacetime-metrics
17
23
  * @internal
18
24
  */
19
- import { solveODESystem } from '@danielsimonjr/mathts-functions';
25
+ import { det, inv } from '@danielsimonjr/mathts-functions';
20
26
  import { C_SI, G_SI, M_SUN_SI } from '../core/constants.js';
21
27
  import { DIMENSIONLESS, LENGTH, MASS, MASS_DENSITY, TIME, VELOCITY } from '../dimensional/types.js';
28
+ import { UnitError } from '../dimensional/units.js';
22
29
  import { readParameter } from './binding-value.js';
23
- /** The signature this module differentiates. */
30
+ import { computeChristoffelTensor } from './connection-lowering-helpers.js';
31
+ import { christoffelAt, lowerFirstIndex, riemannUpperAt } from './curvature-lowering-helpers.js';
32
+ import { integrateGeodesic as integrateGeodesicRK4 } from './geodesic-integrator.js';
33
+ import { computeKretschmann } from './kretschmann.js';
34
+ import { MathTSEngine } from './mathts-engine.js';
35
+ /** The signature this module differentiates; `CurvatureReport.signature` is its type. */
24
36
  export const METRIC_SIGNATURE = '(-,+,+,+)';
25
37
  /**
26
38
  * Printed with every curvature report. The line element and the canonical
27
39
  * Einstein-equation metric node share this mostly-plus signature.
28
40
  */
29
- export const METRIC_SIGNATURE_NOTE = 'Line element signature (−,+,+,+), the same mostly-plus signature as the Schwarzschild fixture ' +
41
+ const METRIC_SIGNATURE_NOTE = 'Line element signature (−,+,+,+), the same mostly-plus signature as the Schwarzschild fixture ' +
30
42
  'and as the canonical Einstein-equation metric node. ' +
31
43
  'The Kretschmann scalar does not depend on that choice.';
32
44
  const Z = 1e-8;
@@ -36,145 +48,59 @@ function zeros(n) {
36
48
  function mat4() {
37
49
  return [zeros(4), zeros(4), zeros(4), zeros(4)];
38
50
  }
51
+ /** The engine the curvature helpers carry their tensors on. */
52
+ const ENGINE = new MathTSEngine();
53
+ /**
54
+ * The metric inverse, MathTS `inv`. A singular metric is this module's error,
55
+ * decided by MathTS `det` before the inverse is asked for, so no error text is
56
+ * read. `inv` and `det` are typed over every MathTS matrix kind, so their
57
+ * results are read back as the number and the 4×4 number array they are for a
58
+ * number[][] input.
59
+ */
39
60
  function invert4(src) {
40
- const a = src.map((row, i) => {
41
- const out = zeros(8);
42
- for (let j = 0; j < 4; j++)
43
- out[j] = row[j];
44
- out[4 + i] = 1;
45
- return out;
46
- });
47
- for (let col = 0; col < 4; col++) {
48
- let pivot = col;
49
- for (let r = col + 1; r < 4; r++) {
50
- if (Math.abs(a[r][col]) > Math.abs(a[pivot][col]))
51
- pivot = r;
52
- }
53
- const tmp = a[col];
54
- a[col] = a[pivot];
55
- a[pivot] = tmp;
56
- const div = a[col][col];
57
- if (!Number.isFinite(div) || Math.abs(div) < 1e-18)
58
- throw new Error('metric is singular at this point');
59
- for (let j = 0; j < 8; j++)
60
- a[col][j] = a[col][j] / div;
61
- for (let r = 0; r < 4; r++) {
62
- if (r === col)
63
- continue;
64
- const f = a[r][col];
65
- for (let j = 0; j < 8; j++)
66
- a[r][j] = a[r][j] - f * a[col][j];
67
- }
61
+ const determinant = det(src);
62
+ if (typeof determinant !== 'number' || !Number.isFinite(determinant) || determinant === 0) {
63
+ throw new Error('metric is singular at this point');
68
64
  }
69
- return a.map((row) => row.slice(4));
65
+ const out = inv(src);
66
+ if (!Array.isArray(out) || out.length !== 4)
67
+ throw new Error('metric inverse is not a 4×4 matrix');
68
+ return out.map((row) => {
69
+ if (!Array.isArray(row) || row.length !== 4)
70
+ throw new Error('metric inverse is not a 4×4 matrix');
71
+ return row.map((v) => {
72
+ if (typeof v !== 'number')
73
+ throw new Error('metric inverse is not a 4×4 matrix');
74
+ return v;
75
+ });
76
+ });
70
77
  }
71
- function shift(x, mu, delta) {
72
- const y = [x[0], x[1], x[2], x[3]];
73
- y[mu] += delta;
74
- return y;
75
- }
76
- /** 4th-order central difference of a matrix-valued function. */
77
- function dMetric(g, x, mu, h) {
78
- const at = (s) => g(shift(x, mu, s * h));
79
- const a = at(-2);
80
- const b = at(-1);
81
- const c = at(1);
82
- const d = at(2);
83
- const out = mat4();
84
- for (let i = 0; i < 4; i++) {
85
- for (let j = 0; j < 4; j++) {
86
- const av = a[i][j];
87
- const bv = b[i][j];
88
- const cv = c[i][j];
89
- const dv = d[i][j];
90
- // A component that does not change must not differentiate a huge constant
91
- // (g_tt = −c²): the stencil cancels only up to a roundoff, and that
92
- // roundoff divided by h is a fake Christoffel.
93
- out[i][j] = av === bv && bv === cv && cv === dv ? 0 : (-dv + 8 * cv - 8 * bv + av) / (12 * h);
94
- }
95
- }
96
- return out;
78
+ /** The nested-array closures the curvature helpers take, over a `MetricFn`. */
79
+ function closuresOf(g) {
80
+ const at = (x) => g([x[0], x[1], x[2], x[3]]);
81
+ return { gFn: at, gInverseFn: (x) => invert4(at(x)) };
97
82
  }
98
83
  function blankGamma() {
99
84
  return [0, 1, 2, 3].map(() => mat4());
100
85
  }
101
- /** A rank-4 array of numbers, indexed [a][b][c][d]. */
102
- function tensor4() {
103
- return [0, 1, 2, 3].map(() => [0, 1, 2, 3].map(() => [0, 1, 2, 3].map(() => [0, 0, 0, 0])));
104
- }
105
- function christoffelOf(g, x, steps) {
106
- const gi = invert4(g(x));
107
- const dg = [0, 1, 2, 3].map((mu) => dMetric(g, x, mu, steps[mu]));
108
- const G = blankGamma();
109
- for (let rho = 0; rho < 4; rho++) {
110
- for (let mu = 0; mu < 4; mu++) {
111
- for (let nu = mu; nu < 4; nu++) {
112
- let s = 0;
113
- for (let sigma = 0; sigma < 4; sigma++) {
114
- s += gi[rho][sigma] * (dg[mu][nu][sigma] + dg[nu][mu][sigma] - dg[sigma][mu][nu]);
115
- }
116
- const v = 0.5 * s;
117
- G[rho][mu][nu] = v;
118
- G[rho][nu][mu] = v;
119
- }
120
- }
121
- }
122
- return G;
86
+ /** Γ^ρ_{μν}(x) by the finite-difference Christoffel of the curvature helpers. */
87
+ function christoffelOf(g, x) {
88
+ const { gFn, gInverseFn } = closuresOf(g);
89
+ return christoffelAt(x, gFn, gInverseFn, 4, ENGINE);
123
90
  }
124
91
  /**
125
- * R^ρ_{σμν} = ∂_μ Γ^ρ_{νσ} − ∂_ν Γ^ρ_{μσ} + Γ^ρ_{μλ} Γ^λ_{νσ} − Γ^ρ_{νλ} Γ^λ_{μσ}.
126
- * Christoffel comes from a 4th-order difference of the metric; its coordinate
127
- * derivative is a central difference of that. Checked against the Schwarzschild
128
- * Kretschmann closed form.
92
+ * Christoffel, Ricci, the Ricci scalar and the Kretschmann scalar at `x`:
93
+ * `christoffelAt` and `riemannUpperAt` (the finite-difference Γ and R^ρ_{σμν}
94
+ * of the curvature helpers), the Ricci contraction R_{σν} = R^ρ_{σρν}, and
95
+ * `computeKretschmann` over the lowered Riemann. Checked against the
96
+ * Schwarzschild Kretschmann closed form.
129
97
  */
130
- function tensorsOf(g, x, steps) {
98
+ function tensorsOf(g, x) {
99
+ const { gFn, gInverseFn } = closuresOf(g);
131
100
  const g0 = g(x);
132
101
  const gi = invert4(g0);
133
- const gamma = christoffelOf(g, x, steps);
134
- const partial = [];
135
- for (let mu = 0; mu < 4; mu++) {
136
- const h = steps[mu];
137
- const plus = christoffelOf(g, shift(x, mu, h), steps);
138
- const minus = christoffelOf(g, shift(x, mu, -h), steps);
139
- const d = blankGamma();
140
- for (let rho = 0; rho < 4; rho++) {
141
- for (let a = 0; a < 4; a++) {
142
- for (let b = 0; b < 4; b++) {
143
- d[rho][a][b] = (plus[rho][a][b] - minus[rho][a][b]) / (2 * h);
144
- }
145
- }
146
- }
147
- partial.push(d);
148
- }
149
- const up = tensor4();
150
- for (let rho = 0; rho < 4; rho++) {
151
- for (let sigma = 0; sigma < 4; sigma++) {
152
- for (let mu = 0; mu < 4; mu++) {
153
- for (let nu = 0; nu < 4; nu++) {
154
- let s = partial[mu][rho][nu][sigma] - partial[nu][rho][mu][sigma];
155
- for (let lam = 0; lam < 4; lam++) {
156
- s +=
157
- gamma[rho][mu][lam] * gamma[lam][nu][sigma] -
158
- gamma[rho][nu][lam] * gamma[lam][mu][sigma];
159
- }
160
- up[rho][sigma][mu][nu] = s;
161
- }
162
- }
163
- }
164
- }
165
- const lower = tensor4();
166
- for (let a = 0; a < 4; a++) {
167
- for (let b = 0; b < 4; b++) {
168
- for (let c = 0; c < 4; c++) {
169
- for (let d = 0; d < 4; d++) {
170
- let s = 0;
171
- for (let rho = 0; rho < 4; rho++)
172
- s += g0[a][rho] * up[rho][b][c][d];
173
- lower[a][b][c][d] = s;
174
- }
175
- }
176
- }
177
- }
102
+ const gamma = christoffelAt(x, gFn, gInverseFn, 4, ENGINE);
103
+ const up = riemannUpperAt(x, gFn, gInverseFn, 4, ENGINE, gamma);
178
104
  const ricci = mat4();
179
105
  for (let sigma = 0; sigma < 4; sigma++) {
180
106
  for (let nu = 0; nu < 4; nu++) {
@@ -189,26 +115,8 @@ function tensorsOf(g, x, steps) {
189
115
  for (let b = 0; b < 4; b++)
190
116
  ricciScalar += gi[a][b] * ricci[a][b];
191
117
  }
192
- let kretschmann = 0;
193
- for (let a = 0; a < 4; a++) {
194
- for (let b = 0; b < 4; b++) {
195
- for (let c = 0; c < 4; c++) {
196
- for (let d = 0; d < 4; d++) {
197
- let raised = 0;
198
- for (let ap = 0; ap < 4; ap++) {
199
- for (let bp = 0; bp < 4; bp++) {
200
- for (let cp = 0; cp < 4; cp++) {
201
- for (let dp = 0; dp < 4; dp++) {
202
- raised += gi[a][ap] * gi[b][bp] * gi[c][cp] * gi[d][dp] * lower[ap][bp][cp][dp];
203
- }
204
- }
205
- }
206
- }
207
- kretschmann += lower[a][b][c][d] * raised;
208
- }
209
- }
210
- }
211
- }
118
+ const lower = lowerFirstIndex(up, g0.flat(), 4);
119
+ const kretschmann = computeKretschmann(lower, gi);
212
120
  return { ricciScalar, kretschmann, ricci, christoffel: gamma };
213
121
  }
214
122
  function nonzeroMatrix(m, label) {
@@ -243,9 +151,6 @@ function nonzeroGamma(G) {
243
151
  }
244
152
  return out;
245
153
  }
246
- function stepsFor(x) {
247
- return [Math.max(Math.abs(x[0]), 1) * 1e-4, Math.max(Math.abs(x[1]), 1) * 1e-4, 1e-4, 1e-4];
248
- }
249
154
  function schwarzschildMetric(M, c, G) {
250
155
  const rs = (2 * G * M) / (c * c);
251
156
  return (x) => {
@@ -340,7 +245,7 @@ export class MetricMassError extends Error {
340
245
  /** A mass that is not positive is not a source. */
341
246
  function requirePositiveMass(M) {
342
247
  if (!(M > 0))
343
- throw new MetricMassError(`${M <= 0 ? 'a non-positive' : 'a non-finite'} mass is not a source: the metric needs a positive mass`);
248
+ throw new MetricMassError(`${M <= 0 ? 'a non-positive' : 'a non-finite'} mass (M = ${M} kg) is not a source: the metric needs a positive mass`);
344
249
  }
345
250
  /**
346
251
  * The polar angle is a point of the spherical chart only on the open interval
@@ -371,7 +276,7 @@ const PARAM_DIM = {
371
276
  rho: MASS_DENSITY,
372
277
  };
373
278
  /** Parse `key=value` pairs. A value is a number, a unit, or a constant expression. @internal */
374
- export function metricParams(pairs, defaults) {
279
+ function metricParams(pairs, defaults) {
375
280
  const values = { ...defaults };
376
281
  const notes = [];
377
282
  for (const pair of pairs) {
@@ -381,7 +286,16 @@ export function metricParams(pairs, defaults) {
381
286
  const key = pair.slice(0, eq);
382
287
  if (!(key in defaults))
383
288
  throw new Error(`unknown parameter '${key}' (expected ${Object.keys(defaults).join(', ')})`);
384
- const read = readParameter(pair.slice(eq + 1), PARAM_DIM[key] ?? DIMENSIONLESS);
289
+ let read;
290
+ try {
291
+ read = readParameter(pair.slice(eq + 1), PARAM_DIM[key] ?? DIMENSIONLESS);
292
+ }
293
+ catch (e) {
294
+ // The reader knows the text and the dimension it was given, not which parameter held them.
295
+ if (e instanceof UnitError)
296
+ throw new UnitError(`parameter ${key}: ${e.message}`);
297
+ throw e;
298
+ }
385
299
  values[key] = read.value;
386
300
  for (const note of read.notes)
387
301
  if (!notes.includes(note))
@@ -405,7 +319,7 @@ export function curvatureReport(metric, pairs = []) {
405
319
  return m;
406
320
  };
407
321
  const x = [p.t, p.r, p.theta, p.phi];
408
- const t = tensorsOf(g, x, stepsFor(x));
322
+ const t = tensorsOf(g, x);
409
323
  return stateCurvature(pack('minkowski', p, x, t, { ricciScalar: 0, kretschmann: 0 }, [
410
324
  'Minkowski in Cartesian-like coordinates (the angular part is not a sphere here; g_θθ = g_φφ = 1).',
411
325
  ...notes,
@@ -420,10 +334,10 @@ export function curvatureReport(metric, pairs = []) {
420
334
  if (Number.isNaN(p.r))
421
335
  p.r = 10 * rs;
422
336
  if (!(p.r > rs))
423
- throw new Error(`r must be outside the horizon (r_s = ${rs})`);
337
+ throw new Error(`r must be outside the horizon (r = ${p.r} m, r_s = ${rs} m)`);
424
338
  const g = schwarzschildMetric(p.M, p.c, p.G);
425
339
  const x = [p.t, p.r, p.theta, p.phi];
426
- const t = tensorsOf(g, x, stepsFor(x));
340
+ const t = tensorsOf(g, x);
427
341
  const K = schwarzschildKretschmann(p.M, p.r, p.c, p.G);
428
342
  return stateCurvature(pack('schwarzschild', p, x, t, { kretschmann: K, ricciScalar: 0, horizon_m: rs }, [
429
343
  'Closed form: Kretschmann = 48 G² M² / (c⁴ r⁶), Ricci = 0.',
@@ -456,8 +370,8 @@ export function curvatureReport(metric, pairs = []) {
456
370
  // Christoffel in the SI metric. Ricci and Kretschmann are computed at c = 1
457
371
  // and divided by c² and c⁴: g_tt = −c² makes those scalars smaller than the
458
372
  // roundoff of an SI finite difference.
459
- const tSi = tensorsOf(g, x, stepsFor(x));
460
- const t1 = p.c === 1 ? tSi : tensorsOf(flrwMetric(p.a0, p.t0, p.n, p.k, 1), x, stepsFor(x));
373
+ const tSi = tensorsOf(g, x);
374
+ const t1 = p.c === 1 ? tSi : tensorsOf(flrwMetric(p.a0, p.t0, p.n, p.k, 1), x);
461
375
  const c2 = p.c * p.c;
462
376
  const t = {
463
377
  christoffel: tSi.christoffel,
@@ -502,12 +416,12 @@ export function curvatureReport(metric, pairs = []) {
502
416
  if (Number.isNaN(p.r))
503
417
  p.r = 10 * Mgeom;
504
418
  if (!(p.r > 0))
505
- throw new Error(`r must be positive and outside the singularity (got ${p.r})`);
419
+ throw new Error(`r must be positive and outside the singularity (got r = ${p.r} m)`);
506
420
  if (Math.abs(p.a) >= p.r)
507
421
  throw new Error('Kerr finite difference wants |a| < r and r outside the ring');
508
422
  const g = kerrMetric(Mgeom, p.a);
509
423
  const x = [p.t, p.r, p.theta, p.phi];
510
- const t = tensorsOf(g, x, stepsFor(x));
424
+ const t = tensorsOf(g, x);
511
425
  const K = kerrKretschmann(Mgeom, p.r, p.a, p.theta);
512
426
  const aOverM = p.a / Mgeom;
513
427
  const kerrNotes = [
@@ -590,51 +504,12 @@ export function schwarzschildCircularOrbit(opts) {
590
504
  const uphi = Omega * ut;
591
505
  if (!(f > 0) || !Number.isFinite(ut))
592
506
  throw new Error('circular orbit needs r > 1.5 r_s');
593
- // Analytic Γ for the equatorial circular orbit (θ = π/2, sin = 1, cos = 0).
594
- // Equatorial reduction. The polar symbols that carry cot θ are omitted:
595
- // a floating-point step off θ = π/2 makes cot θ explode.
596
- const gamma = (r) => {
597
- const ff = 1 - rs / r;
598
- const Gma = blankGamma();
599
- const set = (rho, mu, nu, v) => {
600
- Gma[rho][mu][nu] = v;
601
- Gma[rho][nu][mu] = v;
602
- };
603
- set(0, 0, 1, rs / (2 * r * (r - rs)));
604
- set(1, 0, 0, (rs * ff) / (2 * r * r));
605
- set(1, 1, 1, -rs / (2 * r * (r - rs)));
606
- set(1, 2, 2, -(r - rs));
607
- set(1, 3, 3, -(r - rs));
608
- set(2, 1, 2, 1 / r);
609
- set(3, 1, 3, 1 / r);
610
- return Gma;
611
- };
612
- // state: t, r, th, phi, ut, ur, uth, uphi
613
- let y = [0, r0, Math.PI / 2, 0, ut, 0, 0, uphi];
614
- const accel = (s) => {
615
- const Gma = gamma(s[1]);
616
- const u = [s[4], s[5], s[6], s[7]];
617
- const du = [0, 0, 0, 0];
618
- for (let rho = 0; rho < 4; rho++) {
619
- let sum = 0;
620
- for (let mu = 0; mu < 4; mu++) {
621
- for (let nu = 0; nu < 4; nu++)
622
- sum += Gma[rho][mu][nu] * u[mu] * u[nu];
623
- }
624
- du[rho] = -sum;
625
- }
626
- return [u[0], u[1], u[2], u[3], du[0], du[1], du[2], du[3]];
627
- };
507
+ // The closed-form Schwarzschild Christoffel symbols, polar terms included:
508
+ // with u^θ = 0 and θ = π/2 the polar terms stay zero to roundoff.
628
509
  const period = (2 * Math.PI) / uphi;
629
510
  const fraction = opts?.fraction ?? 0.02;
630
511
  const steps = 400;
631
- const h = (period * fraction) / steps;
632
- for (let n = 0; n < steps; n++) {
633
- const sol = solveODESystem((_t, s) => accel(s), y, [0, h], { dt: h });
634
- y = (sol.y[sol.y.length - 1] ?? y).slice();
635
- y[2] = Math.PI / 2;
636
- y[6] = 0;
637
- }
512
+ const y = integrateWithChristoffel((r, theta) => schwarzschildChristoffel(M, r, theta), [0, r0, Math.PI / 2, 0, ut, 0, 0, uphi], period * fraction, steps);
638
513
  return { r0, rEnd: y[1], phiAdvance: y[3], steps };
639
514
  }
640
515
  /**
@@ -863,26 +738,15 @@ function kerrMetricDerivatives(M, a, r, theta) {
863
738
  dth[3][3] = ((2 * s * c * A + s * s * dAt) * Sigma - s * s * A * dSt) / Sigma2;
864
739
  return { dr, dth };
865
740
  }
741
+ /**
742
+ * Γ^ρ_{μν} from a metric and its analytic partial derivatives, through the
743
+ * one Christoffel builder (`computeChristoffelTensor`). A `null` derivative
744
+ * is a coordinate the metric does not depend on.
745
+ */
866
746
  function christoffelFrom(g, dg) {
867
- const gi = invert4(g);
868
- const G = blankGamma();
869
- for (let rho = 0; rho < 4; rho++) {
870
- for (let mu = 0; mu < 4; mu++) {
871
- for (let nu = mu; nu < 4; nu++) {
872
- let s = 0;
873
- for (let sigma = 0; sigma < 4; sigma++) {
874
- const dmu = dg[mu]?.[nu][sigma] ?? 0;
875
- const dnu = dg[nu]?.[mu][sigma] ?? 0;
876
- const dsig = dg[sigma]?.[mu][nu] ?? 0;
877
- s += gi[rho][sigma] * (dmu + dnu - dsig);
878
- }
879
- const v = 0.5 * s;
880
- G[rho][mu][nu] = v;
881
- G[rho][nu][mu] = v;
882
- }
883
- }
884
- }
885
- return G;
747
+ const gInverseFlat = invert4(g).flat();
748
+ const tensor = computeChristoffelTensor(gInverseFlat, (mu) => (dg[mu] ?? mat4()).flat(), 4, ENGINE);
749
+ return ENGINE.toNested(tensor);
886
750
  }
887
751
  function kerrChristoffel(M, a, r, theta) {
888
752
  const partial = kerrMetricDerivatives(M, a, r, theta);
@@ -892,7 +756,7 @@ function kerrChristoffel(M, a, r, theta) {
892
756
  export function kerrChristoffelFdGap(M, a, r, theta) {
893
757
  const x = [0, r, theta, 0];
894
758
  const analytic = kerrChristoffel(M, a, r, theta);
895
- const fd = christoffelOf(kerrMetric(M, a), x, stepsFor(x));
759
+ const fd = christoffelOf(kerrMetric(M, a), x);
896
760
  let gap = 0;
897
761
  for (let rho = 0; rho < 4; rho++) {
898
762
  for (let mu = 0; mu < 4; mu++) {
@@ -962,24 +826,38 @@ function carterState(M, a, r, theta, E, L, Q, mu2, signR, signTheta, allowOffShe
962
826
  const uth = signTheta * Math.sqrt(Math.max(Theta, 0)) / Sigma;
963
827
  return [0, r, theta, 0, ut, ur, uth, uphi];
964
828
  }
965
- function integrateGeodesic(gammaAt, y0, fraction, steps) {
966
- const accel = (s) => {
967
- const Gma = gammaAt(s[1], s[2]);
968
- const u = [s[4], s[5], s[6], s[7]];
969
- const du = [0, 0, 0, 0];
970
- for (let rho = 0; rho < 4; rho++) {
971
- let sum = 0;
972
- for (let mu = 0; mu < 4; mu++)
973
- for (let nu = 0; nu < 4; nu++)
974
- sum += Gma[rho][mu][nu] * u[mu] * u[nu];
975
- du[rho] = -sum;
829
+ /**
830
+ * The state `[t, r, θ, φ, u^t, u^r, u^θ, u^φ]` after `steps` RK4 steps of
831
+ * the second-order geodesic equation over an affine extent `tauEnd`, by
832
+ * `integrateGeodesic` of `geodesic-integrator.ts` with `gammaAt` packed into
833
+ * its flat layout `G[16·μ + 4·ν + ρ] = Γ^μ_{νρ}`.
834
+ */
835
+ function integrateWithChristoffel(gammaAt, y0, tauEnd, steps) {
836
+ const christoffelFn = (x, out) => {
837
+ const flat = out ?? new Float64Array(64);
838
+ const gamma = gammaAt(x[1], x[2]);
839
+ for (let mu = 0; mu < 4; mu++) {
840
+ for (let nu = 0; nu < 4; nu++) {
841
+ for (let rho = 0; rho < 4; rho++)
842
+ flat[16 * mu + 4 * nu + rho] = gamma[mu][nu][rho];
843
+ }
976
844
  }
977
- return [u[0], u[1], u[2], u[3], du[0], du[1], du[2], du[3]];
845
+ return flat;
978
846
  };
847
+ const result = integrateGeodesicRK4({
848
+ christoffelFn,
849
+ x0: [y0[0], y0[1], y0[2], y0[3]],
850
+ v0: [y0[4], y0[5], y0[6], y0[7]],
851
+ tauStart: 0,
852
+ tauEnd,
853
+ steps,
854
+ });
855
+ return [...result.xFinal, ...result.vFinal];
856
+ }
857
+ /** `fraction` of an orbit's angular period, from the start's angular rate. */
858
+ function orbitExtent(y0, fraction) {
979
859
  const angular = Math.max(Math.abs(y0[7]), Math.abs(y0[6]), 1e-12);
980
- const h = ((2 * Math.PI) / angular) * fraction / steps;
981
- const sol = solveODESystem((_t, s) => accel(s), y0.slice(), [0, steps * h], { dt: h });
982
- return sol.y[sol.y.length - 1] ?? y0.slice();
860
+ return ((2 * Math.PI) / angular) * fraction;
983
861
  }
984
862
  function sampleOf(metric, a, y0, y1, steps, mu2) {
985
863
  const start = conservedOf(metric, a, y0, mu2);
@@ -1024,7 +902,7 @@ export function kerrGeodesic(opts) {
1024
902
  const fraction = opts.fraction ?? 0.01;
1025
903
  const metric = kerrMetric(M, a);
1026
904
  const y0 = carterState(M, a, r, theta, opts.E, opts.L, opts.Q, mu2, opts.signR ?? 1, opts.signTheta ?? 1, opts.allowOffShell === true);
1027
- const y1 = integrateGeodesic((rr, th) => kerrChristoffel(M, a, rr, th), y0, fraction, steps);
905
+ const y1 = integrateWithChristoffel((rr, th) => kerrChristoffel(M, a, rr, th), y0, orbitExtent(y0, fraction), steps);
1028
906
  return sampleOf(metric, a, y0, y1, steps, mu2);
1029
907
  }
1030
908
  /**
@@ -1043,7 +921,7 @@ export function schwarzschildGeodesic(opts) {
1043
921
  const fraction = opts.fraction ?? 0.01;
1044
922
  const metric = schwarzschildMetric(M, 1, 1);
1045
923
  const y0 = carterState(M, 0, r, theta, opts.E, opts.L, opts.Q, 1, opts.signR ?? 1, opts.signTheta ?? 1, false);
1046
- const y1 = integrateGeodesic((rr, th) => schwarzschildChristoffel(M, rr, th), y0, fraction, steps);
924
+ const y1 = integrateWithChristoffel((rr, th) => schwarzschildChristoffel(M, rr, th), y0, orbitExtent(y0, fraction), steps);
1047
925
  return sampleOf(metric, 0, y0, y1, steps, 1);
1048
926
  }
1049
927
  /**