universal-physics-tensor 0.4.5

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 (299) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +377 -0
  3. package/dist/bridges/equations/be-11-decoherence-master.d.ts +83 -0
  4. package/dist/bridges/equations/be-11-decoherence-master.d.ts.map +1 -0
  5. package/dist/bridges/equations/be-11-decoherence-master.js +116 -0
  6. package/dist/bridges/equations/be-11-decoherence-master.js.map +1 -0
  7. package/dist/bridges/equations/be-12-coherence-length.d.ts +80 -0
  8. package/dist/bridges/equations/be-12-coherence-length.d.ts.map +1 -0
  9. package/dist/bridges/equations/be-12-coherence-length.js +128 -0
  10. package/dist/bridges/equations/be-12-coherence-length.js.map +1 -0
  11. package/dist/bridges/equations/be-13-einstein-trace.d.ts +89 -0
  12. package/dist/bridges/equations/be-13-einstein-trace.d.ts.map +1 -0
  13. package/dist/bridges/equations/be-13-einstein-trace.js +143 -0
  14. package/dist/bridges/equations/be-13-einstein-trace.js.map +1 -0
  15. package/dist/bridges/equations/be-14-ryu-takayanagi.d.ts +67 -0
  16. package/dist/bridges/equations/be-14-ryu-takayanagi.d.ts.map +1 -0
  17. package/dist/bridges/equations/be-14-ryu-takayanagi.js +112 -0
  18. package/dist/bridges/equations/be-14-ryu-takayanagi.js.map +1 -0
  19. package/dist/bridges/equations/be-15-emergence.d.ts +164 -0
  20. package/dist/bridges/equations/be-15-emergence.d.ts.map +1 -0
  21. package/dist/bridges/equations/be-15-emergence.js +204 -0
  22. package/dist/bridges/equations/be-15-emergence.js.map +1 -0
  23. package/dist/bridges/equations/be-16-landauer.d.ts +180 -0
  24. package/dist/bridges/equations/be-16-landauer.d.ts.map +1 -0
  25. package/dist/bridges/equations/be-16-landauer.js +206 -0
  26. package/dist/bridges/equations/be-16-landauer.js.map +1 -0
  27. package/dist/bridges/equations/be-17-einstein-cartan.d.ts +245 -0
  28. package/dist/bridges/equations/be-17-einstein-cartan.d.ts.map +1 -0
  29. package/dist/bridges/equations/be-17-einstein-cartan.js +304 -0
  30. package/dist/bridges/equations/be-17-einstein-cartan.js.map +1 -0
  31. package/dist/bridges/equations/be-18-higgs-mass.d.ts +65 -0
  32. package/dist/bridges/equations/be-18-higgs-mass.d.ts.map +1 -0
  33. package/dist/bridges/equations/be-18-higgs-mass.js +86 -0
  34. package/dist/bridges/equations/be-18-higgs-mass.js.map +1 -0
  35. package/dist/bridges/equations/be-19-quantum-bounce.d.ts +72 -0
  36. package/dist/bridges/equations/be-19-quantum-bounce.d.ts.map +1 -0
  37. package/dist/bridges/equations/be-19-quantum-bounce.js +151 -0
  38. package/dist/bridges/equations/be-19-quantum-bounce.js.map +1 -0
  39. package/dist/bridges/equations/be-20-vacuum-energy.d.ts +72 -0
  40. package/dist/bridges/equations/be-20-vacuum-energy.d.ts.map +1 -0
  41. package/dist/bridges/equations/be-20-vacuum-energy.js +115 -0
  42. package/dist/bridges/equations/be-20-vacuum-energy.js.map +1 -0
  43. package/dist/bridges/equations/be-21-kss-bound.d.ts +72 -0
  44. package/dist/bridges/equations/be-21-kss-bound.d.ts.map +1 -0
  45. package/dist/bridges/equations/be-21-kss-bound.js +103 -0
  46. package/dist/bridges/equations/be-21-kss-bound.js.map +1 -0
  47. package/dist/bridges/equations/be-22-topological-entanglement.d.ts +90 -0
  48. package/dist/bridges/equations/be-22-topological-entanglement.d.ts.map +1 -0
  49. package/dist/bridges/equations/be-22-topological-entanglement.js +123 -0
  50. package/dist/bridges/equations/be-22-topological-entanglement.js.map +1 -0
  51. package/dist/bridges/equations/be-23-syk-planckian.d.ts +89 -0
  52. package/dist/bridges/equations/be-23-syk-planckian.d.ts.map +1 -0
  53. package/dist/bridges/equations/be-23-syk-planckian.js +155 -0
  54. package/dist/bridges/equations/be-23-syk-planckian.js.map +1 -0
  55. package/dist/bridges/equations/be-24-foerster-fret.d.ts +81 -0
  56. package/dist/bridges/equations/be-24-foerster-fret.d.ts.map +1 -0
  57. package/dist/bridges/equations/be-24-foerster-fret.js +121 -0
  58. package/dist/bridges/equations/be-24-foerster-fret.js.map +1 -0
  59. package/dist/bridges/equations/be-25-iit-phi.d.ts +220 -0
  60. package/dist/bridges/equations/be-25-iit-phi.d.ts.map +1 -0
  61. package/dist/bridges/equations/be-25-iit-phi.js +259 -0
  62. package/dist/bridges/equations/be-25-iit-phi.js.map +1 -0
  63. package/dist/bridges/equations/be-25-orch-or.d.ts +78 -0
  64. package/dist/bridges/equations/be-25-orch-or.d.ts.map +1 -0
  65. package/dist/bridges/equations/be-25-orch-or.js +121 -0
  66. package/dist/bridges/equations/be-25-orch-or.js.map +1 -0
  67. package/dist/bridges/equations/be-26-dna-tunneling.d.ts +75 -0
  68. package/dist/bridges/equations/be-26-dna-tunneling.d.ts.map +1 -0
  69. package/dist/bridges/equations/be-26-dna-tunneling.js +138 -0
  70. package/dist/bridges/equations/be-26-dna-tunneling.js.map +1 -0
  71. package/dist/bridges/equations/be-27-effective-temperature.d.ts +81 -0
  72. package/dist/bridges/equations/be-27-effective-temperature.d.ts.map +1 -0
  73. package/dist/bridges/equations/be-27-effective-temperature.js +120 -0
  74. package/dist/bridges/equations/be-27-effective-temperature.js.map +1 -0
  75. package/dist/bridges/equations/be-28-onsager-entropy-production.d.ts +175 -0
  76. package/dist/bridges/equations/be-28-onsager-entropy-production.d.ts.map +1 -0
  77. package/dist/bridges/equations/be-28-onsager-entropy-production.js +203 -0
  78. package/dist/bridges/equations/be-28-onsager-entropy-production.js.map +1 -0
  79. package/dist/bridges/equations/be-29-jarzynski.d.ts +86 -0
  80. package/dist/bridges/equations/be-29-jarzynski.d.ts.map +1 -0
  81. package/dist/bridges/equations/be-29-jarzynski.js +132 -0
  82. package/dist/bridges/equations/be-29-jarzynski.js.map +1 -0
  83. package/dist/bridges/equations/be-30-flm-first-law.d.ts +93 -0
  84. package/dist/bridges/equations/be-30-flm-first-law.d.ts.map +1 -0
  85. package/dist/bridges/equations/be-30-flm-first-law.js +109 -0
  86. package/dist/bridges/equations/be-30-flm-first-law.js.map +1 -0
  87. package/dist/bridges/equations/be-31-causal-set-bd.d.ts +96 -0
  88. package/dist/bridges/equations/be-31-causal-set-bd.d.ts.map +1 -0
  89. package/dist/bridges/equations/be-31-causal-set-bd.js +133 -0
  90. package/dist/bridges/equations/be-31-causal-set-bd.js.map +1 -0
  91. package/dist/bridges/equations/be-32-quantum-reference-frame.d.ts +113 -0
  92. package/dist/bridges/equations/be-32-quantum-reference-frame.d.ts.map +1 -0
  93. package/dist/bridges/equations/be-32-quantum-reference-frame.js +155 -0
  94. package/dist/bridges/equations/be-32-quantum-reference-frame.js.map +1 -0
  95. package/dist/bridges/equations/be-33-hertz-millis.d.ts +77 -0
  96. package/dist/bridges/equations/be-33-hertz-millis.d.ts.map +1 -0
  97. package/dist/bridges/equations/be-33-hertz-millis.js +113 -0
  98. package/dist/bridges/equations/be-33-hertz-millis.js.map +1 -0
  99. package/dist/bridges/equations/be-34-kibble-zurek.d.ts +76 -0
  100. package/dist/bridges/equations/be-34-kibble-zurek.d.ts.map +1 -0
  101. package/dist/bridges/equations/be-34-kibble-zurek.js +139 -0
  102. package/dist/bridges/equations/be-34-kibble-zurek.js.map +1 -0
  103. package/dist/bridges/equations/be-35-conformal-bootstrap.d.ts +117 -0
  104. package/dist/bridges/equations/be-35-conformal-bootstrap.d.ts.map +1 -0
  105. package/dist/bridges/equations/be-35-conformal-bootstrap.js +167 -0
  106. package/dist/bridges/equations/be-35-conformal-bootstrap.js.map +1 -0
  107. package/dist/bridges/equations/be-36-gw-speed-bound.d.ts +77 -0
  108. package/dist/bridges/equations/be-36-gw-speed-bound.d.ts.map +1 -0
  109. package/dist/bridges/equations/be-36-gw-speed-bound.js +107 -0
  110. package/dist/bridges/equations/be-36-gw-speed-bound.js.map +1 -0
  111. package/dist/bridges/equations/be-37-shapiro-delay.d.ts +260 -0
  112. package/dist/bridges/equations/be-37-shapiro-delay.d.ts.map +1 -0
  113. package/dist/bridges/equations/be-37-shapiro-delay.js +429 -0
  114. package/dist/bridges/equations/be-37-shapiro-delay.js.map +1 -0
  115. package/dist/bridges/equations/be-38-mond.d.ts +86 -0
  116. package/dist/bridges/equations/be-38-mond.d.ts.map +1 -0
  117. package/dist/bridges/equations/be-38-mond.js +122 -0
  118. package/dist/bridges/equations/be-38-mond.js.map +1 -0
  119. package/dist/bridges/equations/be-39-asymptotic-safety.d.ts +106 -0
  120. package/dist/bridges/equations/be-39-asymptotic-safety.d.ts.map +1 -0
  121. package/dist/bridges/equations/be-39-asymptotic-safety.js +155 -0
  122. package/dist/bridges/equations/be-39-asymptotic-safety.js.map +1 -0
  123. package/dist/bridges/equations/be-40-composite-higgs.d.ts +81 -0
  124. package/dist/bridges/equations/be-40-composite-higgs.d.ts.map +1 -0
  125. package/dist/bridges/equations/be-40-composite-higgs.js +149 -0
  126. package/dist/bridges/equations/be-40-composite-higgs.js.map +1 -0
  127. package/dist/bridges/equations/be-41-swampland.d.ts +67 -0
  128. package/dist/bridges/equations/be-41-swampland.d.ts.map +1 -0
  129. package/dist/bridges/equations/be-41-swampland.js +109 -0
  130. package/dist/bridges/equations/be-41-swampland.js.map +1 -0
  131. package/dist/bridges/equations/be-42-hawking-temperature.d.ts +67 -0
  132. package/dist/bridges/equations/be-42-hawking-temperature.d.ts.map +1 -0
  133. package/dist/bridges/equations/be-42-hawking-temperature.js +109 -0
  134. package/dist/bridges/equations/be-42-hawking-temperature.js.map +1 -0
  135. package/dist/bridges/equations/be-43-er-epr.d.ts +73 -0
  136. package/dist/bridges/equations/be-43-er-epr.d.ts.map +1 -0
  137. package/dist/bridges/equations/be-43-er-epr.js +114 -0
  138. package/dist/bridges/equations/be-43-er-epr.js.map +1 -0
  139. package/dist/bridges/equations/be-44-soft-hair.d.ts +151 -0
  140. package/dist/bridges/equations/be-44-soft-hair.d.ts.map +1 -0
  141. package/dist/bridges/equations/be-44-soft-hair.js +185 -0
  142. package/dist/bridges/equations/be-44-soft-hair.js.map +1 -0
  143. package/dist/bridges/equations/be-45-tcc.d.ts +116 -0
  144. package/dist/bridges/equations/be-45-tcc.d.ts.map +1 -0
  145. package/dist/bridges/equations/be-45-tcc.js +157 -0
  146. package/dist/bridges/equations/be-45-tcc.js.map +1 -0
  147. package/dist/bridges/equations/be-46-multiverse-measure.d.ts +163 -0
  148. package/dist/bridges/equations/be-46-multiverse-measure.d.ts.map +1 -0
  149. package/dist/bridges/equations/be-46-multiverse-measure.js +198 -0
  150. package/dist/bridges/equations/be-46-multiverse-measure.js.map +1 -0
  151. package/dist/bridges/equations/be-47-bbn-dark-sector.d.ts +72 -0
  152. package/dist/bridges/equations/be-47-bbn-dark-sector.d.ts.map +1 -0
  153. package/dist/bridges/equations/be-47-bbn-dark-sector.js +121 -0
  154. package/dist/bridges/equations/be-47-bbn-dark-sector.js.map +1 -0
  155. package/dist/bridges/equations/be-48-grw-localization.d.ts +84 -0
  156. package/dist/bridges/equations/be-48-grw-localization.d.ts.map +1 -0
  157. package/dist/bridges/equations/be-48-grw-localization.js +107 -0
  158. package/dist/bridges/equations/be-48-grw-localization.js.map +1 -0
  159. package/dist/bridges/equations/be-49-quantum-darwinism.d.ts +97 -0
  160. package/dist/bridges/equations/be-49-quantum-darwinism.d.ts.map +1 -0
  161. package/dist/bridges/equations/be-49-quantum-darwinism.js +129 -0
  162. package/dist/bridges/equations/be-49-quantum-darwinism.js.map +1 -0
  163. package/dist/bridges/equations/be-50-wheeler-feynman.d.ts +120 -0
  164. package/dist/bridges/equations/be-50-wheeler-feynman.d.ts.map +1 -0
  165. package/dist/bridges/equations/be-50-wheeler-feynman.js +151 -0
  166. package/dist/bridges/equations/be-50-wheeler-feynman.js.map +1 -0
  167. package/dist/bridges/gravitational-lensing.d.ts +52 -0
  168. package/dist/bridges/gravitational-lensing.d.ts.map +1 -0
  169. package/dist/bridges/gravitational-lensing.js +48 -0
  170. package/dist/bridges/gravitational-lensing.js.map +1 -0
  171. package/dist/bridges/index.d.ts +104 -0
  172. package/dist/bridges/index.d.ts.map +1 -0
  173. package/dist/bridges/index.js +1663 -0
  174. package/dist/bridges/index.js.map +1 -0
  175. package/dist/bridges/perihelion-precession.d.ts +62 -0
  176. package/dist/bridges/perihelion-precession.d.ts.map +1 -0
  177. package/dist/bridges/perihelion-precession.js +68 -0
  178. package/dist/bridges/perihelion-precession.js.map +1 -0
  179. package/dist/core/tensor.d.ts +135 -0
  180. package/dist/core/tensor.d.ts.map +1 -0
  181. package/dist/core/tensor.js +376 -0
  182. package/dist/core/tensor.js.map +1 -0
  183. package/dist/core/types.d.ts +131 -0
  184. package/dist/core/types.d.ts.map +1 -0
  185. package/dist/core/types.js +25 -0
  186. package/dist/core/types.js.map +1 -0
  187. package/dist/dimensional/algebra.d.ts +34 -0
  188. package/dist/dimensional/algebra.d.ts.map +1 -0
  189. package/dist/dimensional/algebra.js +90 -0
  190. package/dist/dimensional/algebra.js.map +1 -0
  191. package/dist/dimensional/bridge-check.d.ts +48 -0
  192. package/dist/dimensional/bridge-check.d.ts.map +1 -0
  193. package/dist/dimensional/bridge-check.js +137 -0
  194. package/dist/dimensional/bridge-check.js.map +1 -0
  195. package/dist/dimensional/connection-validators.d.ts +53 -0
  196. package/dist/dimensional/connection-validators.d.ts.map +1 -0
  197. package/dist/dimensional/connection-validators.js +84 -0
  198. package/dist/dimensional/connection-validators.js.map +1 -0
  199. package/dist/dimensional/connection.d.ts +40 -0
  200. package/dist/dimensional/connection.d.ts.map +1 -0
  201. package/dist/dimensional/connection.js +81 -0
  202. package/dist/dimensional/connection.js.map +1 -0
  203. package/dist/dimensional/constants.d.ts +30 -0
  204. package/dist/dimensional/constants.d.ts.map +1 -0
  205. package/dist/dimensional/constants.js +31 -0
  206. package/dist/dimensional/constants.js.map +1 -0
  207. package/dist/dimensional/errors.d.ts +161 -0
  208. package/dist/dimensional/errors.d.ts.map +1 -0
  209. package/dist/dimensional/errors.js +254 -0
  210. package/dist/dimensional/errors.js.map +1 -0
  211. package/dist/dimensional/fresh-label.d.ts +26 -0
  212. package/dist/dimensional/fresh-label.d.ts.map +1 -0
  213. package/dist/dimensional/fresh-label.js +31 -0
  214. package/dist/dimensional/fresh-label.js.map +1 -0
  215. package/dist/dimensional/metric-validators.d.ts +124 -0
  216. package/dist/dimensional/metric-validators.d.ts.map +1 -0
  217. package/dist/dimensional/metric-validators.js +141 -0
  218. package/dist/dimensional/metric-validators.js.map +1 -0
  219. package/dist/dimensional/metric.d.ts +67 -0
  220. package/dist/dimensional/metric.d.ts.map +1 -0
  221. package/dist/dimensional/metric.js +177 -0
  222. package/dist/dimensional/metric.js.map +1 -0
  223. package/dist/dimensional/tensor.d.ts +153 -0
  224. package/dist/dimensional/tensor.d.ts.map +1 -0
  225. package/dist/dimensional/tensor.js +138 -0
  226. package/dist/dimensional/tensor.js.map +1 -0
  227. package/dist/dimensional/types.d.ts +50 -0
  228. package/dist/dimensional/types.d.ts.map +1 -0
  229. package/dist/dimensional/types.js +66 -0
  230. package/dist/dimensional/types.js.map +1 -0
  231. package/dist/dimensional/validator.d.ts +84 -0
  232. package/dist/dimensional/validator.d.ts.map +1 -0
  233. package/dist/dimensional/validator.js +505 -0
  234. package/dist/dimensional/validator.js.map +1 -0
  235. package/dist/index.d.ts +25 -0
  236. package/dist/index.d.ts.map +1 -0
  237. package/dist/index.js +37 -0
  238. package/dist/index.js.map +1 -0
  239. package/dist/numerical/be37-covariant-eikonal.d.ts +90 -0
  240. package/dist/numerical/be37-covariant-eikonal.d.ts.map +1 -0
  241. package/dist/numerical/be37-covariant-eikonal.js +79 -0
  242. package/dist/numerical/be37-covariant-eikonal.js.map +1 -0
  243. package/dist/numerical/connection-lowering-helpers.d.ts +107 -0
  244. package/dist/numerical/connection-lowering-helpers.d.ts.map +1 -0
  245. package/dist/numerical/connection-lowering-helpers.js +315 -0
  246. package/dist/numerical/connection-lowering-helpers.js.map +1 -0
  247. package/dist/numerical/engine-registry.d.ts +50 -0
  248. package/dist/numerical/engine-registry.d.ts.map +1 -0
  249. package/dist/numerical/engine-registry.js +82 -0
  250. package/dist/numerical/engine-registry.js.map +1 -0
  251. package/dist/numerical/errors.d.ts +28 -0
  252. package/dist/numerical/errors.d.ts.map +1 -0
  253. package/dist/numerical/errors.js +39 -0
  254. package/dist/numerical/errors.js.map +1 -0
  255. package/dist/numerical/float64-engine.d.ts +53 -0
  256. package/dist/numerical/float64-engine.d.ts.map +1 -0
  257. package/dist/numerical/float64-engine.js +638 -0
  258. package/dist/numerical/float64-engine.js.map +1 -0
  259. package/dist/numerical/geodesic-integrator.d.ts +62 -0
  260. package/dist/numerical/geodesic-integrator.d.ts.map +1 -0
  261. package/dist/numerical/geodesic-integrator.js +103 -0
  262. package/dist/numerical/geodesic-integrator.js.map +1 -0
  263. package/dist/numerical/grid-field.d.ts +24 -0
  264. package/dist/numerical/grid-field.d.ts.map +1 -0
  265. package/dist/numerical/grid-field.js +2 -0
  266. package/dist/numerical/grid-field.js.map +1 -0
  267. package/dist/numerical/index.d.ts +80 -0
  268. package/dist/numerical/index.d.ts.map +1 -0
  269. package/dist/numerical/index.js +75 -0
  270. package/dist/numerical/index.js.map +1 -0
  271. package/dist/numerical/lowering.d.ts +48 -0
  272. package/dist/numerical/lowering.d.ts.map +1 -0
  273. package/dist/numerical/lowering.js +443 -0
  274. package/dist/numerical/lowering.js.map +1 -0
  275. package/dist/numerical/mathts-engine.d.ts +55 -0
  276. package/dist/numerical/mathts-engine.d.ts.map +1 -0
  277. package/dist/numerical/mathts-engine.js +164 -0
  278. package/dist/numerical/mathts-engine.js.map +1 -0
  279. package/dist/numerical/metric-inverse.d.ts +31 -0
  280. package/dist/numerical/metric-inverse.d.ts.map +1 -0
  281. package/dist/numerical/metric-inverse.js +68 -0
  282. package/dist/numerical/metric-inverse.js.map +1 -0
  283. package/dist/numerical/null-ray-integrator.d.ts +13 -0
  284. package/dist/numerical/null-ray-integrator.d.ts.map +1 -0
  285. package/dist/numerical/null-ray-integrator.js +53 -0
  286. package/dist/numerical/null-ray-integrator.js.map +1 -0
  287. package/dist/numerical/pderiv.d.ts +43 -0
  288. package/dist/numerical/pderiv.d.ts.map +1 -0
  289. package/dist/numerical/pderiv.js +121 -0
  290. package/dist/numerical/pderiv.js.map +1 -0
  291. package/dist/numerical/tensor-engine.d.ts +114 -0
  292. package/dist/numerical/tensor-engine.d.ts.map +1 -0
  293. package/dist/numerical/tensor-engine.js +64 -0
  294. package/dist/numerical/tensor-engine.js.map +1 -0
  295. package/dist/numerical/types.d.ts +37 -0
  296. package/dist/numerical/types.d.ts.map +1 -0
  297. package/dist/numerical/types.js +8 -0
  298. package/dist/numerical/types.js.map +1 -0
  299. package/package.json +72 -0
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Tensor AST node types and helpers — v0.2.0 algebra layer.
3
+ *
4
+ * Adds the two new ExprNode discriminated-union variants:
5
+ * - 'tensor-symbol': a named tensor with variance-typed indices
6
+ * - 'tensor-product': Einstein-summation product over tensor and scalar operands
7
+ *
8
+ * Per docs/specification/Part-VII-Tensor-Algebra.md §VII.1 and §VII.4.
9
+ *
10
+ * @module dimensional/tensor
11
+ */
12
+ import { DIMENSIONLESS } from './types.js';
13
+ import { multiply } from './algebra.js';
14
+ import { DuplicateIndexLabelError, IndexLabelCollisionError, VarianceMismatchError, } from './errors.js';
15
+ /**
16
+ * Validate a tensor-symbol node. Builds the freeIndices map from the
17
+ * declared indices, with one upper / one lower count per label.
18
+ *
19
+ * Throws `DuplicateIndexLabelError` if the indices list contains the same
20
+ * label more than once (e.g., T^μ_μ_μ). Per Part-VII §VII.4
21
+ * (repeated-dummy-label-in-tensor-symbol-rejected TENSOR-RULE).
22
+ *
23
+ * The function is pure: no I/O, no shared state, total over its input
24
+ * (modulo the documented throw). Callers (validator.ts `infer()`) thread
25
+ * the returned freeIndices map up into their accumulator.
26
+ */
27
+ export function validateTensorSymbol(node) {
28
+ const freeIndices = new Map();
29
+ for (const idx of node.indices) {
30
+ if (freeIndices.has(idx.label)) {
31
+ throw new DuplicateIndexLabelError(node.name, idx.label);
32
+ }
33
+ freeIndices.set(idx.label, {
34
+ upper: idx.variance === 'upper' ? 1 : 0,
35
+ lower: idx.variance === 'lower' ? 1 : 0,
36
+ });
37
+ }
38
+ return { dim: node.dim, freeIndices };
39
+ }
40
+ /**
41
+ * Pure function that computes the dimension, free-indices map, and
42
+ * contraction pairs for a tensor-product over the given operands.
43
+ *
44
+ * The function is pure and module-cycle-free: it does NOT import
45
+ * `validator.ts`. Recursion is injected via the `validateChild` callback
46
+ * — the caller (typically validator.ts's `infer()` dispatch) supplies a
47
+ * resolver that returns `{dim, freeIndices}` for each child node. The
48
+ * caller is responsible for handling all `ExprNode` kinds in its callback
49
+ * (scalars, tensor-symbols, nested tensor-products, etc.).
50
+ *
51
+ * Critically, the per-child freeIndices maps returned by `validateChild`
52
+ * MUST be local to that child (not shared mutable state). This is what
53
+ * makes nested tensor-products safe: an inner tensor-product reports its
54
+ * post-contraction residual free indices as a local map, and the outer
55
+ * call merges those without ever touching shared accumulator state.
56
+ *
57
+ * Re-exported for the future mathjs backend per v0.2.0-Design.md §14.2.
58
+ *
59
+ * **v0.2.0 limitation — implicit identity metric.** The contraction
60
+ * mechanism here assumes one upper index `μ` paired with one lower index
61
+ * `μ` annihilate (Kronecker delta convention). v0.3.0's metric layer
62
+ * will introduce explicit g_μν / g^μν for raising and lowering — at
63
+ * which point this function's hard-coded pairing rule must generalize
64
+ * to "find labels with mismatched variance, raise/lower via the metric,
65
+ * then contract." Forward-compat callers should NOT assume the v0.2.0
66
+ * rule is permanent.
67
+ *
68
+ * Throws:
69
+ * - IndexLabelCollisionError if any label appears > 2 times total.
70
+ * - VarianceMismatchError if a label appears twice with same variance.
71
+ */
72
+ export function computeContraction(args, validateChild) {
73
+ // Step A: Recursively validate each arg via the injected callback,
74
+ // accumulating product-dimension and merging local freeIndices maps.
75
+ let dim = DIMENSIONLESS;
76
+ const merged = new Map();
77
+ for (const arg of args) {
78
+ const child = validateChild(arg);
79
+ dim = multiply(dim, child.dim);
80
+ for (const [label, counts] of child.freeIndices) {
81
+ const existing = merged.get(label) ?? { upper: 0, lower: 0 };
82
+ merged.set(label, {
83
+ upper: existing.upper + counts.upper,
84
+ lower: existing.lower + counts.lower,
85
+ });
86
+ }
87
+ }
88
+ // Step B: Validate label counts (≤2) and pair upper/lower for contraction.
89
+ const contractionPairs = [];
90
+ for (const [label, counts] of merged) {
91
+ const total = counts.upper + counts.lower;
92
+ if (total > 2) {
93
+ throw new IndexLabelCollisionError(label, total);
94
+ }
95
+ if (total === 2 && (counts.upper === 0 || counts.lower === 0)) {
96
+ const variance = counts.upper === 2 ? 'upper' : 'lower';
97
+ throw new VarianceMismatchError(label, variance);
98
+ }
99
+ if (counts.upper > 0 && counts.lower > 0) {
100
+ const pairs = Math.min(counts.upper, counts.lower);
101
+ for (let i = 0; i < pairs; i++)
102
+ contractionPairs.push({ label });
103
+ merged.set(label, {
104
+ upper: counts.upper - pairs,
105
+ lower: counts.lower - pairs,
106
+ });
107
+ }
108
+ }
109
+ // Step C: Drop fully-contracted labels (both counts zero) from the
110
+ // outgoing freeIndices map so callers don't see phantom dummies.
111
+ for (const [label, counts] of Array.from(merged.entries())) {
112
+ if (counts.upper === 0 && counts.lower === 0)
113
+ merged.delete(label);
114
+ }
115
+ return { dim, freeIndices: merged, contractionPairs };
116
+ }
117
+ /** Construct a tensor-symbol node. */
118
+ export function tsym(name, indices, dim, role, numericalForm) {
119
+ const node = { kind: 'tensor-symbol', name, indices, dim };
120
+ if (role !== undefined)
121
+ node.role = role;
122
+ if (numericalForm !== undefined)
123
+ node.numericalForm = numericalForm;
124
+ return node;
125
+ }
126
+ /** Scale a tensor by a scalar coefficient. Returns a tensor-product. */
127
+ export function scale(scalar, tensor) {
128
+ return { kind: 'tensor-product', args: [scalar, tensor] };
129
+ }
130
+ /** Contract any number of operands. Returns a tensor-product. */
131
+ export function contract(...args) {
132
+ return { kind: 'tensor-product', args };
133
+ }
134
+ /** Tensor sum via op '+'. Validator enforces matching free indices. */
135
+ export function tsum(...args) {
136
+ return { kind: 'op', op: '+', args };
137
+ }
138
+ //# sourceMappingURL=tensor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tensor.js","sourceRoot":"","sources":["../../src/dimensional/tensor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * SI dimensional types.
3
+ *
4
+ * Base dimensions per BIPM SI Brochure, 9th edition (2019), Table 3:
5
+ * length L, mass M, time T, electric current I, thermodynamic temperature Theta,
6
+ * amount of substance N, luminous intensity J.
7
+ *
8
+ * Named-dimension constants below are derived per NIST SP 811 (2008) §4
9
+ * (derived SI units) and standard physics references:
10
+ * - Goldstein, "Classical Mechanics" 3rd ed.
11
+ * - Sakurai, "Modern Quantum Mechanics" 2nd ed.
12
+ * - Wald, "General Relativity" (1984)
13
+ *
14
+ * All exponents are stored as `number` (allowing rational e.g. 1/2 if needed).
15
+ *
16
+ * @module dimensional/types
17
+ */
18
+ export interface Dimension {
19
+ /** Length (metre, m). */
20
+ L: number;
21
+ /** Mass (kilogram, kg). */
22
+ M: number;
23
+ /** Time (second, s). */
24
+ T: number;
25
+ /** Electric current (ampere, A). */
26
+ I: number;
27
+ /** Thermodynamic temperature (kelvin, K). */
28
+ Theta: number;
29
+ /** Amount of substance (mole, mol). */
30
+ N: number;
31
+ /** Luminous intensity (candela, cd). */
32
+ J: number;
33
+ }
34
+ export declare const DIMENSIONLESS: Dimension;
35
+ export declare const LENGTH: Dimension;
36
+ export declare const AREA: Dimension;
37
+ export declare const TIME: Dimension;
38
+ export declare const FREQUENCY: Dimension;
39
+ export declare const MASS: Dimension;
40
+ export declare const VELOCITY: Dimension;
41
+ export declare const ACCELERATION: Dimension;
42
+ export declare const FORCE: Dimension;
43
+ export declare const ENERGY: Dimension;
44
+ export declare const POWER: Dimension;
45
+ export declare const ACTION: Dimension;
46
+ export declare const TEMPERATURE: Dimension;
47
+ export declare const ENTROPY: Dimension;
48
+ export declare const CHARGE: Dimension;
49
+ export declare const NAMED_DIMENSIONS: ReadonlyArray<readonly [string, Dimension]>;
50
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/dimensional/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,SAAS;IACxB,yBAAyB;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,2BAA2B;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,wBAAwB;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,oCAAoC;IACpC,CAAC,EAAE,MAAM,CAAC;IACV,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,CAAC,EAAE,MAAM,CAAC;IACV,wCAAwC;IACxC,CAAC,EAAE,MAAM,CAAC;CACX;AAED,eAAO,MAAM,aAAa,EAAE,SAA4D,CAAC;AAWzF,eAAO,MAAM,MAAM,EAAS,SAA4D,CAAC;AACzF,eAAO,MAAM,IAAI,EAAW,SAA4D,CAAC;AACzF,eAAO,MAAM,IAAI,EAAW,SAA4D,CAAC;AACzF,eAAO,MAAM,SAAS,EAAM,SAA6D,CAAC;AAC1F,eAAO,MAAM,IAAI,EAAW,SAA4D,CAAC;AACzF,eAAO,MAAM,QAAQ,EAAO,SAA6D,CAAC;AAC1F,eAAO,MAAM,YAAY,EAAG,SAA6D,CAAC;AAC1F,eAAO,MAAM,KAAK,EAAU,SAA6D,CAAC;AAC1F,eAAO,MAAM,MAAM,EAAS,SAA6D,CAAC;AAC1F,eAAO,MAAM,KAAK,EAAU,SAA6D,CAAC;AAC1F,eAAO,MAAM,MAAM,EAAS,SAA6D,CAAC;AAG1F,eAAO,MAAM,WAAW,EAAI,SAA4D,CAAC;AACzF,eAAO,MAAM,OAAO,EAAQ,SAA8D,CAAC;AAG3F,eAAO,MAAM,MAAM,EAAS,SAA4D,CAAC;AAIzF,eAAO,MAAM,gBAAgB,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAmBxE,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * SI dimensional types.
3
+ *
4
+ * Base dimensions per BIPM SI Brochure, 9th edition (2019), Table 3:
5
+ * length L, mass M, time T, electric current I, thermodynamic temperature Theta,
6
+ * amount of substance N, luminous intensity J.
7
+ *
8
+ * Named-dimension constants below are derived per NIST SP 811 (2008) §4
9
+ * (derived SI units) and standard physics references:
10
+ * - Goldstein, "Classical Mechanics" 3rd ed.
11
+ * - Sakurai, "Modern Quantum Mechanics" 2nd ed.
12
+ * - Wald, "General Relativity" (1984)
13
+ *
14
+ * All exponents are stored as `number` (allowing rational e.g. 1/2 if needed).
15
+ *
16
+ * @module dimensional/types
17
+ */
18
+ export const DIMENSIONLESS = { L: 0, M: 0, T: 0, I: 0, Theta: 0, N: 0, J: 0 };
19
+ // --- Mechanics ---
20
+ //
21
+ // Named-dimension constants are exported only when there is at least one
22
+ // real consumer (a bridge encoding, a constant, or an active test). The
23
+ // previously-exported VOLUME, MOMENTUM, ANGULAR_MOMENTUM, PRESSURE,
24
+ // DENSITY, VOLTAGE, ELECTRIC_FIELD, MAGNETIC_FIELD were unreferenced and
25
+ // were removed 2026-05-04 per simplifier F-01 (no flexibility/configura-
26
+ // bility that wasn't requested). Re-add them precisely when a bridge
27
+ // encoding or test references them.
28
+ export const LENGTH = { L: 1, M: 0, T: 0, I: 0, Theta: 0, N: 0, J: 0 };
29
+ export const AREA = { L: 2, M: 0, T: 0, I: 0, Theta: 0, N: 0, J: 0 };
30
+ export const TIME = { L: 0, M: 0, T: 1, I: 0, Theta: 0, N: 0, J: 0 };
31
+ export const FREQUENCY = { L: 0, M: 0, T: -1, I: 0, Theta: 0, N: 0, J: 0 };
32
+ export const MASS = { L: 0, M: 1, T: 0, I: 0, Theta: 0, N: 0, J: 0 };
33
+ export const VELOCITY = { L: 1, M: 0, T: -1, I: 0, Theta: 0, N: 0, J: 0 };
34
+ export const ACCELERATION = { L: 1, M: 0, T: -2, I: 0, Theta: 0, N: 0, J: 0 };
35
+ export const FORCE = { L: 1, M: 1, T: -2, I: 0, Theta: 0, N: 0, J: 0 }; // newton
36
+ export const ENERGY = { L: 2, M: 1, T: -2, I: 0, Theta: 0, N: 0, J: 0 }; // joule
37
+ export const POWER = { L: 2, M: 1, T: -3, I: 0, Theta: 0, N: 0, J: 0 }; // watt
38
+ export const ACTION = { L: 2, M: 1, T: -1, I: 0, Theta: 0, N: 0, J: 0 }; // J·s
39
+ // --- Thermodynamics ---
40
+ export const TEMPERATURE = { L: 0, M: 0, T: 0, I: 0, Theta: 1, N: 0, J: 0 };
41
+ export const ENTROPY = { L: 2, M: 1, T: -2, I: 0, Theta: -1, N: 0, J: 0 }; // J/K
42
+ // --- Electromagnetism (SI) ---
43
+ export const CHARGE = { L: 0, M: 0, T: 1, I: 1, Theta: 0, N: 0, J: 0 }; // coulomb = A·s
44
+ // --- Curated lookup table for `format()` to recognize named SI dimensions. ---
45
+ // Order matters only for tie-breaks; the first matching name wins.
46
+ export const NAMED_DIMENSIONS = [
47
+ ['dimensionless', DIMENSIONLESS],
48
+ ['length', LENGTH],
49
+ ['area', AREA],
50
+ ['time', TIME],
51
+ ['frequency', FREQUENCY],
52
+ ['mass', MASS],
53
+ ['velocity', VELOCITY],
54
+ ['acceleration', ACCELERATION],
55
+ // action carries the same SI shape (J·s) as angular momentum; we keep
56
+ // 'action' as the canonical name since hbar (the only consumer today)
57
+ // is action-typed.
58
+ ['action', ACTION],
59
+ ['force', FORCE],
60
+ ['energy', ENERGY],
61
+ ['power', POWER],
62
+ ['temperature', TEMPERATURE],
63
+ ['entropy', ENTROPY],
64
+ ['charge', CHARGE],
65
+ ];
66
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/dimensional/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Validator: walks an ExprNode tree and infers / checks SI dimensions.
3
+ *
4
+ * Honest-claude scope notes:
5
+ * - This MVP does NOT track tensor index structure (rank, contractions).
6
+ * Bridge Eq 17's index-rank mismatch from the spec cannot be caught here.
7
+ * Tier 4.5 follow-up — see README.
8
+ * - Special functions (log, exp, trig) are out of scope; their arguments
9
+ * must be dimensionless but the validator does not yet enforce that.
10
+ *
11
+ * @module dimensional/validator
12
+ */
13
+ import { Dimension } from './types.js';
14
+ import type { TensorSymbolNode, TensorProductNode } from './tensor.js';
15
+ import type { MetricTensorNode, KroneckerDeltaNode, TensorPartialDerivativeNode } from './metric-validators.js';
16
+ import type { CovariantDerivativeNode } from './connection-validators.js';
17
+ export type ExprNode = {
18
+ kind: 'symbol';
19
+ name: string;
20
+ dim: Dimension;
21
+ } | {
22
+ kind: 'op';
23
+ op: '+' | '-' | '*' | '/' | '^';
24
+ args: ExprNode[];
25
+ } | {
26
+ kind: 'integral';
27
+ over: ExprNode;
28
+ integrand: ExprNode;
29
+ } | {
30
+ kind: 'derivative';
31
+ of: ExprNode;
32
+ wrt: ExprNode;
33
+ } | TensorSymbolNode | TensorProductNode | MetricTensorNode | KroneckerDeltaNode | TensorPartialDerivativeNode | CovariantDerivativeNode;
34
+ export type { TensorSymbolNode, TensorProductNode, TensorExprNode } from './tensor.js';
35
+ export type { MetricTensorNode, KroneckerDeltaNode, TensorPartialDerivativeNode, } from './metric-validators.js';
36
+ export type { CovariantDerivativeNode } from './connection-validators.js';
37
+ export interface Violation {
38
+ /** Tree path, e.g. "args[1].args[0]". Empty string for the root. */
39
+ location: string;
40
+ expected: Dimension;
41
+ actual: Dimension;
42
+ note: string;
43
+ /** v0.3.5: absent ⇒ 'error'. 'warning'-severity violations do not fail
44
+ * validation (ValidationResult.ok stays true) but are still reported. */
45
+ severity?: 'error' | 'warning';
46
+ }
47
+ export interface ValidationResult {
48
+ ok: boolean;
49
+ inferredDimension: Dimension | null;
50
+ /** Map of free (uncontracted) index labels to their upper/lower counts.
51
+ * Empty for scalar expressions. Populated by tensor-symbol /
52
+ * tensor-product validation (Tasks 5 and 6). */
53
+ freeIndices: Map<string, {
54
+ upper: number;
55
+ lower: number;
56
+ }>;
57
+ violations: Violation[];
58
+ }
59
+ /**
60
+ * Per-bridge dimensional self-check report. Each `src/bridges/equations/`
61
+ * module exports a `validate*Dimensions(): DimensionValidationReport` helper
62
+ * that runs `validateEquation(LHS, RHS)` and returns LHS/RHS inferred dims
63
+ * alongside the homogeneity verdict. Lifted here so the 9+ bridge modules
64
+ * import a single shared shape rather than redeclaring it byte-for-byte.
65
+ *
66
+ * Source: simplifier F2 (Wave G), confidence 88. The interface satisfies
67
+ * Karpathy's three extraction criteria — single semantic meaning, ≥9
68
+ * consumers, future encodings will use it.
69
+ */
70
+ export interface DimensionValidationReport {
71
+ ok: boolean;
72
+ lhsDim: Dimension | null;
73
+ rhsDim: Dimension | null;
74
+ }
75
+ export declare function validate(expr: ExprNode): ValidationResult;
76
+ /**
77
+ * Opt-in symbolic InverseMetricInconsistencyWarning check. Given a
78
+ * lower/upper metric pair, returns a deduplicated (at most one) warning-
79
+ * severity Violation set. v0.3.5 §7. (Deliberately not folded into
80
+ * validate() — that is the hot path for the whole test suite.)
81
+ */
82
+ export declare function validateInverseMetricPair(gLower: MetricTensorNode, gUpper: MetricTensorNode): Violation[];
83
+ export declare function validateEquation(lhs: ExprNode, rhs: ExprNode): ValidationResult;
84
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/dimensional/validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,SAAS,EAEV,MAAM,YAAY,CAAC;AAgBpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAyB,MAAM,aAAa,CAAC;AAE9F,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,2BAA2B,EAE5B,MAAM,wBAAwB,CAAC;AAOhC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAG1E,MAAM,MAAM,QAAQ,GAChB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,SAAS,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IAAC,IAAI,EAAE,QAAQ,EAAE,CAAA;CAAE,GACjE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,QAAQ,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,QAAQ,CAAA;CAAE,GACnD,gBAAgB,GAChB,iBAAiB,GACjB,gBAAgB,GAChB,kBAAkB,GAClB,2BAA2B,GAC3B,uBAAuB,CAAC;AAG5B,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACvF,YAAY,EACV,gBAAgB,EAChB,kBAAkB,EAClB,2BAA2B,GAC5B,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAE1E,MAAM,WAAW,SAAS;IACxB,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb;8EAC0E;IAC1E,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,iBAAiB,EAAE,SAAS,GAAG,IAAI,CAAC;IACpC;;qDAEiD;IACjD,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;CAC1B;AAmeD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,gBAAgB,CASzD;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,gBAAgB,GACvB,SAAS,EAAE,CAUb;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,GAAG,gBAAgB,CAyB/E"}