universal-physics-tensor 10.0.0 → 12.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 (835) hide show
  1. package/README.md +39 -36
  2. package/bin/upt.mjs +13 -1
  3. package/data/applied-cases.json +1892 -0
  4. package/data/applied-cases.schema.json +194 -0
  5. package/data/atlas/atlas.json +25 -25
  6. package/data/atlas/atlas.jsonld +1 -1
  7. package/data/atlas/diffusion.json +6 -6
  8. package/data/atlas/oscillators.json +7 -7
  9. package/data/atlas/waves.json +14 -14
  10. package/data/atlas/witness-results.json +11 -11
  11. package/data/bridge-catalog.json +389 -230
  12. package/data/bridge-catalog.schema.json +45 -7
  13. package/data/units.json +6 -25
  14. package/dist/atlas/applicability.d.ts.map +1 -1
  15. package/dist/atlas/applicability.js +21 -15
  16. package/dist/atlas/applicability.js.map +1 -1
  17. package/dist/atlas/benchmark/hybrid-retrieval.d.ts +9 -1
  18. package/dist/atlas/benchmark/hybrid-retrieval.d.ts.map +1 -1
  19. package/dist/atlas/benchmark/hybrid-retrieval.js +15 -13
  20. package/dist/atlas/benchmark/hybrid-retrieval.js.map +1 -1
  21. package/dist/atlas/benchmark/loader.js +2 -2
  22. package/dist/atlas/benchmark/loader.js.map +1 -1
  23. package/dist/atlas/benchmark/stats.d.ts +2 -2
  24. package/dist/atlas/benchmark/stats.d.ts.map +1 -1
  25. package/dist/atlas/benchmark/stats.js +9 -15
  26. package/dist/atlas/benchmark/stats.js.map +1 -1
  27. package/dist/atlas/catalog-formal-ref.d.ts +26 -3
  28. package/dist/atlas/catalog-formal-ref.d.ts.map +1 -1
  29. package/dist/atlas/catalog-formal-ref.js +52 -5
  30. package/dist/atlas/catalog-formal-ref.js.map +1 -1
  31. package/dist/atlas/chain-pipeline.d.ts.map +1 -1
  32. package/dist/atlas/chain-pipeline.js +7 -8
  33. package/dist/atlas/chain-pipeline.js.map +1 -1
  34. package/dist/atlas/diffusion/bridges-closure.d.ts +0 -4
  35. package/dist/atlas/diffusion/bridges-closure.d.ts.map +1 -1
  36. package/dist/atlas/diffusion/bridges-closure.js +8 -12
  37. package/dist/atlas/diffusion/bridges-closure.js.map +1 -1
  38. package/dist/atlas/diffusion/bridges.d.ts.map +1 -1
  39. package/dist/atlas/diffusion/bridges.js +27 -39
  40. package/dist/atlas/diffusion/bridges.js.map +1 -1
  41. package/dist/atlas/diffusion/dimensions.d.ts +6 -14
  42. package/dist/atlas/diffusion/dimensions.d.ts.map +1 -1
  43. package/dist/atlas/diffusion/dimensions.js +8 -16
  44. package/dist/atlas/diffusion/dimensions.js.map +1 -1
  45. package/dist/atlas/diffusion/models.d.ts +3 -3
  46. package/dist/atlas/diffusion/models.d.ts.map +1 -1
  47. package/dist/atlas/diffusion/models.js +5 -10
  48. package/dist/atlas/diffusion/models.js.map +1 -1
  49. package/dist/atlas/diffusion/numerics.d.ts +16 -4
  50. package/dist/atlas/diffusion/numerics.d.ts.map +1 -1
  51. package/dist/atlas/diffusion/numerics.js +38 -24
  52. package/dist/atlas/diffusion/numerics.js.map +1 -1
  53. package/dist/atlas/link-prediction.d.ts +106 -3
  54. package/dist/atlas/link-prediction.d.ts.map +1 -1
  55. package/dist/atlas/link-prediction.js +212 -66
  56. package/dist/atlas/link-prediction.js.map +1 -1
  57. package/dist/atlas/oscillators/bridges-coarse.d.ts.map +1 -1
  58. package/dist/atlas/oscillators/bridges-coarse.js +7 -11
  59. package/dist/atlas/oscillators/bridges-coarse.js.map +1 -1
  60. package/dist/atlas/oscillators/bridges-exact.d.ts.map +1 -1
  61. package/dist/atlas/oscillators/bridges-exact.js +6 -7
  62. package/dist/atlas/oscillators/bridges-exact.js.map +1 -1
  63. package/dist/atlas/oscillators/bridges-limits.d.ts +3 -16
  64. package/dist/atlas/oscillators/bridges-limits.d.ts.map +1 -1
  65. package/dist/atlas/oscillators/bridges-limits.js +23 -34
  66. package/dist/atlas/oscillators/bridges-limits.js.map +1 -1
  67. package/dist/atlas/oscillators/dimensions.d.ts +9 -21
  68. package/dist/atlas/oscillators/dimensions.d.ts.map +1 -1
  69. package/dist/atlas/oscillators/dimensions.js +9 -21
  70. package/dist/atlas/oscillators/dimensions.js.map +1 -1
  71. package/dist/atlas/oscillators/limit-witnesses.d.ts +2 -2
  72. package/dist/atlas/oscillators/limit-witnesses.d.ts.map +1 -1
  73. package/dist/atlas/oscillators/limit-witnesses.js +17 -15
  74. package/dist/atlas/oscillators/limit-witnesses.js.map +1 -1
  75. package/dist/atlas/oscillators/models.d.ts.map +1 -1
  76. package/dist/atlas/oscillators/models.js +2 -6
  77. package/dist/atlas/oscillators/models.js.map +1 -1
  78. package/dist/atlas/oscillators/pendulum-motion.d.ts +29 -6
  79. package/dist/atlas/oscillators/pendulum-motion.d.ts.map +1 -1
  80. package/dist/atlas/oscillators/pendulum-motion.js +60 -40
  81. package/dist/atlas/oscillators/pendulum-motion.js.map +1 -1
  82. package/dist/atlas/oscillators/phase-translation.d.ts +0 -11
  83. package/dist/atlas/oscillators/phase-translation.d.ts.map +1 -1
  84. package/dist/atlas/oscillators/phase-translation.js +3 -4
  85. package/dist/atlas/oscillators/phase-translation.js.map +1 -1
  86. package/dist/atlas/oscillators/position-translation.d.ts +68 -7
  87. package/dist/atlas/oscillators/position-translation.d.ts.map +1 -1
  88. package/dist/atlas/oscillators/position-translation.js +123 -12
  89. package/dist/atlas/oscillators/position-translation.js.map +1 -1
  90. package/dist/atlas/oscillators/rejections.d.ts +0 -2
  91. package/dist/atlas/oscillators/rejections.d.ts.map +1 -1
  92. package/dist/atlas/oscillators/rejections.js +0 -7
  93. package/dist/atlas/oscillators/rejections.js.map +1 -1
  94. package/dist/atlas/physjs-entries.generated.d.ts +35 -25
  95. package/dist/atlas/physjs-entries.generated.d.ts.map +1 -1
  96. package/dist/atlas/physjs-entries.generated.js +37 -25
  97. package/dist/atlas/physjs-entries.generated.js.map +1 -1
  98. package/dist/atlas/physjs-ref.d.ts +34 -31
  99. package/dist/atlas/physjs-ref.d.ts.map +1 -1
  100. package/dist/atlas/physjs-ref.js +55 -53
  101. package/dist/atlas/physjs-ref.js.map +1 -1
  102. package/dist/atlas/physjs-reviewed.d.ts +1 -1
  103. package/dist/atlas/physjs-reviewed.js +15 -15
  104. package/dist/atlas/physjs-reviewed.js.map +1 -1
  105. package/dist/atlas/poster/statements.d.ts +0 -19
  106. package/dist/atlas/poster/statements.d.ts.map +1 -1
  107. package/dist/atlas/poster/statements.js +1 -1
  108. package/dist/atlas/poster/statements.js.map +1 -1
  109. package/dist/atlas/proof-target.d.ts +1 -1
  110. package/dist/atlas/proof-target.js +1 -1
  111. package/dist/atlas/proof-target.js.map +1 -1
  112. package/dist/atlas/regime.d.ts +1 -1
  113. package/dist/atlas/regime.d.ts.map +1 -1
  114. package/dist/atlas/regime.js +1 -1
  115. package/dist/atlas/regime.js.map +1 -1
  116. package/dist/atlas/text-overlap.d.ts +23 -0
  117. package/dist/atlas/text-overlap.d.ts.map +1 -0
  118. package/dist/atlas/text-overlap.js +41 -0
  119. package/dist/atlas/text-overlap.js.map +1 -0
  120. package/dist/atlas/waves/bridges-closure.d.ts.map +1 -1
  121. package/dist/atlas/waves/bridges-closure.js +2 -6
  122. package/dist/atlas/waves/bridges-closure.js.map +1 -1
  123. package/dist/atlas/waves/bridges.d.ts.map +1 -1
  124. package/dist/atlas/waves/bridges.js +32 -48
  125. package/dist/atlas/waves/bridges.js.map +1 -1
  126. package/dist/atlas/waves/models.d.ts +5 -6
  127. package/dist/atlas/waves/models.d.ts.map +1 -1
  128. package/dist/atlas/waves/models.js +7 -13
  129. package/dist/atlas/waves/models.js.map +1 -1
  130. package/dist/atlas/waves/numerics.d.ts.map +1 -1
  131. package/dist/atlas/waves/numerics.js +10 -3
  132. package/dist/atlas/waves/numerics.js.map +1 -1
  133. package/dist/atlas/witness-numeric.d.ts +30 -0
  134. package/dist/atlas/witness-numeric.d.ts.map +1 -1
  135. package/dist/atlas/witness-numeric.js +53 -0
  136. package/dist/atlas/witness-numeric.js.map +1 -1
  137. package/dist/atlas/witness-specs.d.ts.map +1 -1
  138. package/dist/atlas/witness-specs.js +19 -0
  139. package/dist/atlas/witness-specs.js.map +1 -1
  140. package/dist/atlas/witness-symbolic.d.ts +75 -3
  141. package/dist/atlas/witness-symbolic.d.ts.map +1 -1
  142. package/dist/atlas/witness-symbolic.js +116 -10
  143. package/dist/atlas/witness-symbolic.js.map +1 -1
  144. package/dist/bridges/catalog-load.d.ts.map +1 -1
  145. package/dist/bridges/catalog-load.js +13 -8
  146. package/dist/bridges/catalog-load.js.map +1 -1
  147. package/dist/bridges/catalog-types.d.ts +26 -2
  148. package/dist/bridges/catalog-types.d.ts.map +1 -1
  149. package/dist/bridges/catalog-types.js +11 -1
  150. package/dist/bridges/catalog-types.js.map +1 -1
  151. package/dist/bridges/evaluation-errors.d.ts +31 -1
  152. package/dist/bridges/evaluation-errors.d.ts.map +1 -1
  153. package/dist/bridges/evaluation-errors.js +20 -2
  154. package/dist/bridges/evaluation-errors.js.map +1 -1
  155. package/dist/bridges/evaluator-inputs.d.ts.map +1 -1
  156. package/dist/bridges/evaluator-inputs.js +7 -5
  157. package/dist/bridges/evaluator-inputs.js.map +1 -1
  158. package/dist/bridges/evaluators.d.ts.map +1 -1
  159. package/dist/bridges/evaluators.js +27 -12
  160. package/dist/bridges/evaluators.js.map +1 -1
  161. package/dist/bridges/expr-parse.d.ts +11 -0
  162. package/dist/bridges/expr-parse.d.ts.map +1 -1
  163. package/dist/bridges/expr-parse.js +14 -5
  164. package/dist/bridges/expr-parse.js.map +1 -1
  165. package/dist/bridges/holds.d.ts +35 -3
  166. package/dist/bridges/holds.d.ts.map +1 -1
  167. package/dist/bridges/holds.js +117 -23
  168. package/dist/bridges/holds.js.map +1 -1
  169. package/dist/bridges/notices.d.ts.map +1 -1
  170. package/dist/bridges/notices.js +5 -5
  171. package/dist/bridges/notices.js.map +1 -1
  172. package/dist/bridges/relation-eval.d.ts +4 -4
  173. package/dist/bridges/relation-eval.d.ts.map +1 -1
  174. package/dist/bridges/relation-eval.js +15 -16
  175. package/dist/bridges/relation-eval.js.map +1 -1
  176. package/dist/bridges/sensitivity.d.ts.map +1 -1
  177. package/dist/bridges/sensitivity.js +3 -3
  178. package/dist/bridges/sensitivity.js.map +1 -1
  179. package/dist/bridges/validity.d.ts +33 -0
  180. package/dist/bridges/validity.d.ts.map +1 -0
  181. package/dist/bridges/validity.js +67 -0
  182. package/dist/bridges/validity.js.map +1 -0
  183. package/dist/canonical/entries/atomic.js +1 -3
  184. package/dist/canonical/entries/atomic.js.map +1 -1
  185. package/dist/canonical/entries/condensed-matter.d.ts.map +1 -1
  186. package/dist/canonical/entries/condensed-matter.js +4 -5
  187. package/dist/canonical/entries/condensed-matter.js.map +1 -1
  188. package/dist/canonical/entries/dimensional-classics.d.ts.map +1 -1
  189. package/dist/canonical/entries/dimensional-classics.js +3 -4
  190. package/dist/canonical/entries/dimensional-classics.js.map +1 -1
  191. package/dist/canonical/entries/electromagnetism.d.ts.map +1 -1
  192. package/dist/canonical/entries/electromagnetism.js +4 -10
  193. package/dist/canonical/entries/electromagnetism.js.map +1 -1
  194. package/dist/canonical/entries/fluids-waves.d.ts.map +1 -1
  195. package/dist/canonical/entries/fluids-waves.js +3 -7
  196. package/dist/canonical/entries/fluids-waves.js.map +1 -1
  197. package/dist/canonical/entries/mechanics.d.ts.map +1 -1
  198. package/dist/canonical/entries/mechanics.js +4 -6
  199. package/dist/canonical/entries/mechanics.js.map +1 -1
  200. package/dist/canonical/entries/nonmonomial.d.ts.map +1 -1
  201. package/dist/canonical/entries/nonmonomial.js +9 -17
  202. package/dist/canonical/entries/nonmonomial.js.map +1 -1
  203. package/dist/canonical/entries/relativity.d.ts.map +1 -1
  204. package/dist/canonical/entries/relativity.js +6 -6
  205. package/dist/canonical/entries/relativity.js.map +1 -1
  206. package/dist/canonical/entries/thermo-nuclear-cosmo.d.ts.map +1 -1
  207. package/dist/canonical/entries/thermo-nuclear-cosmo.js +6 -10
  208. package/dist/canonical/entries/thermo-nuclear-cosmo.js.map +1 -1
  209. package/dist/canonical/fixed-points.d.ts +94 -0
  210. package/dist/canonical/fixed-points.d.ts.map +1 -0
  211. package/dist/canonical/fixed-points.js +81 -0
  212. package/dist/canonical/fixed-points.js.map +1 -0
  213. package/dist/canonical/linkage.d.ts.map +1 -1
  214. package/dist/canonical/linkage.js +25 -44
  215. package/dist/canonical/linkage.js.map +1 -1
  216. package/dist/canonical/normal-form.d.ts.map +1 -1
  217. package/dist/canonical/normal-form.js +5 -11
  218. package/dist/canonical/normal-form.js.map +1 -1
  219. package/dist/canonical/structural.d.ts +21 -21
  220. package/dist/canonical/structural.d.ts.map +1 -1
  221. package/dist/canonical/structural.js +40 -19
  222. package/dist/canonical/structural.js.map +1 -1
  223. package/dist/cases/catalog-checks.d.ts +10 -0
  224. package/dist/cases/catalog-checks.d.ts.map +1 -0
  225. package/dist/cases/catalog-checks.js +241 -0
  226. package/dist/cases/catalog-checks.js.map +1 -0
  227. package/dist/cases/catalog.d.ts +83 -0
  228. package/dist/cases/catalog.d.ts.map +1 -0
  229. package/dist/cases/catalog.js +118 -0
  230. package/dist/cases/catalog.js.map +1 -0
  231. package/dist/cases/engine.d.ts +13 -0
  232. package/dist/cases/engine.d.ts.map +1 -0
  233. package/dist/cases/engine.js +179 -0
  234. package/dist/cases/engine.js.map +1 -0
  235. package/dist/cases/index.d.ts.map +1 -1
  236. package/dist/cases/index.js +5 -7
  237. package/dist/cases/index.js.map +1 -1
  238. package/dist/cases/methods.d.ts +215 -0
  239. package/dist/cases/methods.d.ts.map +1 -0
  240. package/dist/cases/methods.js +743 -0
  241. package/dist/cases/methods.js.map +1 -0
  242. package/dist/cases/quadrature.d.ts +7 -9
  243. package/dist/cases/quadrature.d.ts.map +1 -1
  244. package/dist/cases/quadrature.js +28 -32
  245. package/dist/cases/quadrature.js.map +1 -1
  246. package/dist/cases/types.d.ts +12 -0
  247. package/dist/cases/types.d.ts.map +1 -1
  248. package/dist/cases/types.js.map +1 -1
  249. package/dist/cli/args.d.ts +25 -1
  250. package/dist/cli/args.d.ts.map +1 -1
  251. package/dist/cli/args.js +30 -8
  252. package/dist/cli/args.js.map +1 -1
  253. package/dist/cli/bindings.d.ts.map +1 -1
  254. package/dist/cli/bindings.js +5 -4
  255. package/dist/cli/bindings.js.map +1 -1
  256. package/dist/cli/command.d.ts +11 -1
  257. package/dist/cli/command.d.ts.map +1 -1
  258. package/dist/cli/command.js.map +1 -1
  259. package/dist/cli/commands/_atlas-map.d.ts +0 -9
  260. package/dist/cli/commands/_atlas-map.d.ts.map +1 -1
  261. package/dist/cli/commands/_atlas-map.js +8 -18
  262. package/dist/cli/commands/_atlas-map.js.map +1 -1
  263. package/dist/cli/commands/_atlas-route.d.ts.map +1 -1
  264. package/dist/cli/commands/_atlas-route.js +6 -2
  265. package/dist/cli/commands/_atlas-route.js.map +1 -1
  266. package/dist/cli/commands/_discovery-opts.d.ts +1 -0
  267. package/dist/cli/commands/_discovery-opts.d.ts.map +1 -1
  268. package/dist/cli/commands/_discovery-opts.js +9 -9
  269. package/dist/cli/commands/_discovery-opts.js.map +1 -1
  270. package/dist/cli/commands/atlas.d.ts.map +1 -1
  271. package/dist/cli/commands/atlas.js +8 -5
  272. package/dist/cli/commands/atlas.js.map +1 -1
  273. package/dist/cli/commands/audit.d.ts.map +1 -1
  274. package/dist/cli/commands/audit.js +8 -1
  275. package/dist/cli/commands/audit.js.map +1 -1
  276. package/dist/cli/commands/axes.d.ts.map +1 -1
  277. package/dist/cli/commands/axes.js +20 -1
  278. package/dist/cli/commands/axes.js.map +1 -1
  279. package/dist/cli/commands/confront.d.ts.map +1 -1
  280. package/dist/cli/commands/confront.js +8 -14
  281. package/dist/cli/commands/confront.js.map +1 -1
  282. package/dist/cli/commands/derive.d.ts.map +1 -1
  283. package/dist/cli/commands/derive.js +22 -22
  284. package/dist/cli/commands/derive.js.map +1 -1
  285. package/dist/cli/commands/discover.d.ts.map +1 -1
  286. package/dist/cli/commands/discover.js +122 -73
  287. package/dist/cli/commands/discover.js.map +1 -1
  288. package/dist/cli/commands/eval.d.ts.map +1 -1
  289. package/dist/cli/commands/eval.js +1 -0
  290. package/dist/cli/commands/eval.js.map +1 -1
  291. package/dist/cli/commands/evaluate.d.ts.map +1 -1
  292. package/dist/cli/commands/evaluate.js +67 -39
  293. package/dist/cli/commands/evaluate.js.map +1 -1
  294. package/dist/cli/commands/explain.d.ts.map +1 -1
  295. package/dist/cli/commands/explain.js +24 -3
  296. package/dist/cli/commands/explain.js.map +1 -1
  297. package/dist/cli/commands/ground.d.ts.map +1 -1
  298. package/dist/cli/commands/ground.js +7 -1
  299. package/dist/cli/commands/ground.js.map +1 -1
  300. package/dist/cli/commands/map.d.ts.map +1 -1
  301. package/dist/cli/commands/map.js +84 -11
  302. package/dist/cli/commands/map.js.map +1 -1
  303. package/dist/cli/commands/metric.d.ts.map +1 -1
  304. package/dist/cli/commands/metric.js +12 -9
  305. package/dist/cli/commands/metric.js.map +1 -1
  306. package/dist/cli/commands/path.d.ts +10 -0
  307. package/dist/cli/commands/path.d.ts.map +1 -1
  308. package/dist/cli/commands/path.js +25 -3
  309. package/dist/cli/commands/path.js.map +1 -1
  310. package/dist/cli/commands/probe.d.ts.map +1 -1
  311. package/dist/cli/commands/probe.js +59 -16
  312. package/dist/cli/commands/probe.js.map +1 -1
  313. package/dist/cli/commands/regime.d.ts.map +1 -1
  314. package/dist/cli/commands/regime.js +1 -0
  315. package/dist/cli/commands/regime.js.map +1 -1
  316. package/dist/cli/commands/retrieve.d.ts.map +1 -1
  317. package/dist/cli/commands/retrieve.js +1 -0
  318. package/dist/cli/commands/retrieve.js.map +1 -1
  319. package/dist/cli/commands/search.d.ts.map +1 -1
  320. package/dist/cli/commands/search.js +1 -0
  321. package/dist/cli/commands/search.js.map +1 -1
  322. package/dist/cli/commands/symbolic.d.ts.map +1 -1
  323. package/dist/cli/commands/symbolic.js +19 -28
  324. package/dist/cli/commands/symbolic.js.map +1 -1
  325. package/dist/cli/commands/testplan.d.ts.map +1 -1
  326. package/dist/cli/commands/testplan.js +4 -2
  327. package/dist/cli/commands/testplan.js.map +1 -1
  328. package/dist/cli/determination.d.ts +1 -0
  329. package/dist/cli/determination.d.ts.map +1 -1
  330. package/dist/cli/determination.js.map +1 -1
  331. package/dist/cli/expr-print.d.ts +0 -2
  332. package/dist/cli/expr-print.d.ts.map +1 -1
  333. package/dist/cli/expr-print.js +7 -31
  334. package/dist/cli/expr-print.js.map +1 -1
  335. package/dist/cli/flag-help.d.ts +1 -0
  336. package/dist/cli/flag-help.d.ts.map +1 -1
  337. package/dist/cli/flag-help.js +1 -0
  338. package/dist/cli/flag-help.js.map +1 -1
  339. package/dist/cli/graphs.d.ts +2 -0
  340. package/dist/cli/graphs.d.ts.map +1 -1
  341. package/dist/cli/graphs.js +1 -0
  342. package/dist/cli/graphs.js.map +1 -1
  343. package/dist/cli/main.d.ts +8 -0
  344. package/dist/cli/main.d.ts.map +1 -1
  345. package/dist/cli/main.js +19 -3
  346. package/dist/cli/main.js.map +1 -1
  347. package/dist/cli/numeric-flag.d.ts +12 -0
  348. package/dist/cli/numeric-flag.d.ts.map +1 -0
  349. package/dist/cli/numeric-flag.js +44 -0
  350. package/dist/cli/numeric-flag.js.map +1 -0
  351. package/dist/cli/output.d.ts +28 -0
  352. package/dist/cli/output.d.ts.map +1 -1
  353. package/dist/cli/output.js +23 -0
  354. package/dist/cli/output.js.map +1 -1
  355. package/dist/cli/record-reach.js +2 -2
  356. package/dist/cli/record-reach.js.map +1 -1
  357. package/dist/cli/record-tables.d.ts.map +1 -1
  358. package/dist/cli/record-tables.js +6 -5
  359. package/dist/cli/record-tables.js.map +1 -1
  360. package/dist/cli/record.d.ts +1 -5
  361. package/dist/cli/record.d.ts.map +1 -1
  362. package/dist/cli/record.js +9 -8
  363. package/dist/cli/record.js.map +1 -1
  364. package/dist/cli/search-index.d.ts.map +1 -1
  365. package/dist/cli/search-index.js +7 -6
  366. package/dist/cli/search-index.js.map +1 -1
  367. package/dist/cli/statuses.d.ts +0 -2
  368. package/dist/cli/statuses.d.ts.map +1 -1
  369. package/dist/cli/statuses.js +12 -9
  370. package/dist/cli/statuses.js.map +1 -1
  371. package/dist/cli/stored-results.d.ts +7 -0
  372. package/dist/cli/stored-results.d.ts.map +1 -0
  373. package/dist/cli/stored-results.js +23 -0
  374. package/dist/cli/stored-results.js.map +1 -0
  375. package/dist/cli/version.d.ts +1 -0
  376. package/dist/cli/version.d.ts.map +1 -1
  377. package/dist/cli/version.js +8 -5
  378. package/dist/cli/version.js.map +1 -1
  379. package/dist/cli-api.d.ts +36 -5
  380. package/dist/cli-api.d.ts.map +1 -1
  381. package/dist/cli-api.js +30 -4
  382. package/dist/cli-api.js.map +1 -1
  383. package/dist/composition/algebraic-equivalence.d.ts +43 -0
  384. package/dist/composition/algebraic-equivalence.d.ts.map +1 -0
  385. package/dist/composition/algebraic-equivalence.js +115 -0
  386. package/dist/composition/algebraic-equivalence.js.map +1 -0
  387. package/dist/composition/axes.d.ts +0 -6
  388. package/dist/composition/axes.d.ts.map +1 -1
  389. package/dist/composition/axes.js +6 -6
  390. package/dist/composition/axes.js.map +1 -1
  391. package/dist/composition/axis-audit.d.ts +47 -20
  392. package/dist/composition/axis-audit.d.ts.map +1 -1
  393. package/dist/composition/axis-audit.js +82 -9
  394. package/dist/composition/axis-audit.js.map +1 -1
  395. package/dist/composition/bridge-analysis.d.ts +17 -0
  396. package/dist/composition/bridge-analysis.d.ts.map +1 -1
  397. package/dist/composition/bridge-analysis.js +102 -55
  398. package/dist/composition/bridge-analysis.js.map +1 -1
  399. package/dist/composition/canonical-compare.d.ts +40 -0
  400. package/dist/composition/canonical-compare.d.ts.map +1 -1
  401. package/dist/composition/canonical-compare.js +122 -24
  402. package/dist/composition/canonical-compare.js.map +1 -1
  403. package/dist/composition/canonical-graph.d.ts +3 -3
  404. package/dist/composition/canonical-graph.d.ts.map +1 -1
  405. package/dist/composition/canonical-graph.js +11 -38
  406. package/dist/composition/canonical-graph.js.map +1 -1
  407. package/dist/composition/canonical-json.js +2 -2
  408. package/dist/composition/canonical-json.js.map +1 -1
  409. package/dist/composition/catalog-graph.d.ts.map +1 -1
  410. package/dist/composition/catalog-graph.js +2 -5
  411. package/dist/composition/catalog-graph.js.map +1 -1
  412. package/dist/composition/chain-candidate.d.ts +8 -0
  413. package/dist/composition/chain-candidate.d.ts.map +1 -1
  414. package/dist/composition/chain-candidate.js +9 -2
  415. package/dist/composition/chain-candidate.js.map +1 -1
  416. package/dist/composition/chain-match.d.ts +6 -3
  417. package/dist/composition/chain-match.d.ts.map +1 -1
  418. package/dist/composition/chain-match.js +4 -1
  419. package/dist/composition/chain-match.js.map +1 -1
  420. package/dist/composition/chain-result.d.ts.map +1 -1
  421. package/dist/composition/chain-result.js +2 -14
  422. package/dist/composition/chain-result.js.map +1 -1
  423. package/dist/composition/compose-symbolic.d.ts.map +1 -1
  424. package/dist/composition/compose-symbolic.js +3 -2
  425. package/dist/composition/compose-symbolic.js.map +1 -1
  426. package/dist/composition/compose.d.ts.map +1 -1
  427. package/dist/composition/compose.js +13 -5
  428. package/dist/composition/compose.js.map +1 -1
  429. package/dist/composition/composition-recovery.d.ts.map +1 -1
  430. package/dist/composition/composition-recovery.js +4 -7
  431. package/dist/composition/composition-recovery.js.map +1 -1
  432. package/dist/composition/consequence.d.ts +15 -5
  433. package/dist/composition/consequence.d.ts.map +1 -1
  434. package/dist/composition/consequence.js +6 -4
  435. package/dist/composition/consequence.js.map +1 -1
  436. package/dist/composition/discovery.d.ts +129 -9
  437. package/dist/composition/discovery.d.ts.map +1 -1
  438. package/dist/composition/discovery.js +171 -67
  439. package/dist/composition/discovery.js.map +1 -1
  440. package/dist/composition/edge.d.ts +21 -2
  441. package/dist/composition/edge.d.ts.map +1 -1
  442. package/dist/composition/edge.js +23 -1
  443. package/dist/composition/edge.js.map +1 -1
  444. package/dist/composition/enumerate.d.ts.map +1 -1
  445. package/dist/composition/enumerate.js +18 -3
  446. package/dist/composition/enumerate.js.map +1 -1
  447. package/dist/composition/evaluate-relation.d.ts +35 -11
  448. package/dist/composition/evaluate-relation.d.ts.map +1 -1
  449. package/dist/composition/evaluate-relation.js +60 -39
  450. package/dist/composition/evaluate-relation.js.map +1 -1
  451. package/dist/composition/explain.d.ts +3 -12
  452. package/dist/composition/explain.d.ts.map +1 -1
  453. package/dist/composition/explain.js +7 -20
  454. package/dist/composition/explain.js.map +1 -1
  455. package/dist/composition/expr-eval.d.ts +1 -1
  456. package/dist/composition/expr-eval.d.ts.map +1 -1
  457. package/dist/composition/expr-eval.js +6 -15
  458. package/dist/composition/expr-eval.js.map +1 -1
  459. package/dist/composition/expr-simplify.d.ts +26 -14
  460. package/dist/composition/expr-simplify.d.ts.map +1 -1
  461. package/dist/composition/expr-simplify.js +64 -72
  462. package/dist/composition/expr-simplify.js.map +1 -1
  463. package/dist/composition/formula-shape.d.ts +23 -4
  464. package/dist/composition/formula-shape.d.ts.map +1 -1
  465. package/dist/composition/formula-shape.js +57 -17
  466. package/dist/composition/formula-shape.js.map +1 -1
  467. package/dist/composition/graph-structure.d.ts +98 -0
  468. package/dist/composition/graph-structure.d.ts.map +1 -0
  469. package/dist/composition/graph-structure.js +167 -0
  470. package/dist/composition/graph-structure.js.map +1 -0
  471. package/dist/composition/graph-viz-svg.d.ts.map +1 -1
  472. package/dist/composition/graph-viz-svg.js +1 -1
  473. package/dist/composition/graph-viz-svg.js.map +1 -1
  474. package/dist/composition/graph-viz.d.ts.map +1 -1
  475. package/dist/composition/graph-viz.js +8 -37
  476. package/dist/composition/graph-viz.js.map +1 -1
  477. package/dist/composition/grounding.d.ts.map +1 -1
  478. package/dist/composition/grounding.js +19 -7
  479. package/dist/composition/grounding.js.map +1 -1
  480. package/dist/composition/identifiability.d.ts +91 -4
  481. package/dist/composition/identifiability.d.ts.map +1 -1
  482. package/dist/composition/identifiability.js +363 -6
  483. package/dist/composition/identifiability.js.map +1 -1
  484. package/dist/composition/index.d.ts +8 -4
  485. package/dist/composition/index.d.ts.map +1 -1
  486. package/dist/composition/index.js +3 -2
  487. package/dist/composition/index.js.map +1 -1
  488. package/dist/composition/mathts-quiet.d.ts +7 -8
  489. package/dist/composition/mathts-quiet.d.ts.map +1 -1
  490. package/dist/composition/mathts-quiet.js +7 -16
  491. package/dist/composition/mathts-quiet.js.map +1 -1
  492. package/dist/composition/mathts-scalar-symbols.d.ts.map +1 -1
  493. package/dist/composition/mathts-scalar-symbols.js +2 -1
  494. package/dist/composition/mathts-scalar-symbols.js.map +1 -1
  495. package/dist/composition/own-equation-magnitude.d.ts +95 -0
  496. package/dist/composition/own-equation-magnitude.d.ts.map +1 -0
  497. package/dist/composition/own-equation-magnitude.js +270 -0
  498. package/dist/composition/own-equation-magnitude.js.map +1 -0
  499. package/dist/composition/probe/backend-protocol.d.ts +3 -0
  500. package/dist/composition/probe/backend-protocol.d.ts.map +1 -1
  501. package/dist/composition/probe/backend-protocol.js.map +1 -1
  502. package/dist/composition/probe/candidate-store.d.ts +1 -0
  503. package/dist/composition/probe/candidate-store.d.ts.map +1 -1
  504. package/dist/composition/probe/candidate-store.js +1 -0
  505. package/dist/composition/probe/candidate-store.js.map +1 -1
  506. package/dist/composition/probe/corpus.d.ts +8 -4
  507. package/dist/composition/probe/corpus.d.ts.map +1 -1
  508. package/dist/composition/probe/corpus.js +23 -12
  509. package/dist/composition/probe/corpus.js.map +1 -1
  510. package/dist/composition/probe/dataset.d.ts +18 -0
  511. package/dist/composition/probe/dataset.d.ts.map +1 -1
  512. package/dist/composition/probe/dataset.js +95 -50
  513. package/dist/composition/probe/dataset.js.map +1 -1
  514. package/dist/composition/probe/experiment-design.d.ts +7 -1
  515. package/dist/composition/probe/experiment-design.d.ts.map +1 -1
  516. package/dist/composition/probe/experiment-design.js +44 -24
  517. package/dist/composition/probe/experiment-design.js.map +1 -1
  518. package/dist/composition/probe/falsify.d.ts +2 -0
  519. package/dist/composition/probe/falsify.d.ts.map +1 -1
  520. package/dist/composition/probe/falsify.js +2 -0
  521. package/dist/composition/probe/falsify.js.map +1 -1
  522. package/dist/composition/probe/fit.d.ts +7 -0
  523. package/dist/composition/probe/fit.d.ts.map +1 -1
  524. package/dist/composition/probe/fit.js +46 -22
  525. package/dist/composition/probe/fit.js.map +1 -1
  526. package/dist/composition/probe/frontier.d.ts.map +1 -1
  527. package/dist/composition/probe/frontier.js +33 -15
  528. package/dist/composition/probe/frontier.js.map +1 -1
  529. package/dist/composition/probe/generator.d.ts +30 -1
  530. package/dist/composition/probe/generator.d.ts.map +1 -1
  531. package/dist/composition/probe/generator.js +58 -36
  532. package/dist/composition/probe/generator.js.map +1 -1
  533. package/dist/composition/probe/index.d.ts +14 -0
  534. package/dist/composition/probe/index.d.ts.map +1 -1
  535. package/dist/composition/probe/index.js +6 -0
  536. package/dist/composition/probe/index.js.map +1 -1
  537. package/dist/composition/probe/limits.d.ts +25 -1
  538. package/dist/composition/probe/limits.d.ts.map +1 -1
  539. package/dist/composition/probe/limits.js +53 -11
  540. package/dist/composition/probe/limits.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 +73 -24
  544. package/dist/composition/probe/pipeline.js.map +1 -1
  545. package/dist/composition/probe/power-law.d.ts +121 -0
  546. package/dist/composition/probe/power-law.d.ts.map +1 -0
  547. package/dist/composition/probe/power-law.js +251 -0
  548. package/dist/composition/probe/power-law.js.map +1 -0
  549. package/dist/composition/probe/problem.d.ts +8 -4
  550. package/dist/composition/probe/problem.d.ts.map +1 -1
  551. package/dist/composition/probe/problem.js +177 -49
  552. package/dist/composition/probe/problem.js.map +1 -1
  553. package/dist/composition/probe/report.js +1 -1
  554. package/dist/composition/probe/report.js.map +1 -1
  555. package/dist/composition/probe/residual.d.ts +7 -1
  556. package/dist/composition/probe/residual.d.ts.map +1 -1
  557. package/dist/composition/probe/residual.js +10 -7
  558. package/dist/composition/probe/residual.js.map +1 -1
  559. package/dist/composition/probe/run-manifest.d.ts +1 -0
  560. package/dist/composition/probe/run-manifest.d.ts.map +1 -1
  561. package/dist/composition/probe/run-manifest.js.map +1 -1
  562. package/dist/composition/probe/scalar-search.d.ts +50 -0
  563. package/dist/composition/probe/scalar-search.d.ts.map +1 -0
  564. package/dist/composition/probe/scalar-search.js +169 -0
  565. package/dist/composition/probe/scalar-search.js.map +1 -0
  566. package/dist/composition/probe/scoring.d.ts +1 -0
  567. package/dist/composition/probe/scoring.d.ts.map +1 -1
  568. package/dist/composition/probe/scoring.js.map +1 -1
  569. package/dist/composition/probe/structure.d.ts +82 -17
  570. package/dist/composition/probe/structure.d.ts.map +1 -1
  571. package/dist/composition/probe/structure.js +129 -55
  572. package/dist/composition/probe/structure.js.map +1 -1
  573. package/dist/composition/probe/study.d.ts +31 -9
  574. package/dist/composition/probe/study.d.ts.map +1 -1
  575. package/dist/composition/probe/study.js +235 -184
  576. package/dist/composition/probe/study.js.map +1 -1
  577. package/dist/composition/probe/t-tail.d.ts +16 -0
  578. package/dist/composition/probe/t-tail.d.ts.map +1 -0
  579. package/dist/composition/probe/t-tail.js +29 -0
  580. package/dist/composition/probe/t-tail.js.map +1 -0
  581. package/dist/composition/probe/types.d.ts +3 -0
  582. package/dist/composition/probe/types.d.ts.map +1 -1
  583. package/dist/composition/probe/types.js.map +1 -1
  584. package/dist/composition/proposed-bridges.d.ts +52 -12
  585. package/dist/composition/proposed-bridges.d.ts.map +1 -1
  586. package/dist/composition/proposed-bridges.js +107 -60
  587. package/dist/composition/proposed-bridges.js.map +1 -1
  588. package/dist/composition/quantity-clusters.d.ts +48 -0
  589. package/dist/composition/quantity-clusters.d.ts.map +1 -0
  590. package/dist/composition/quantity-clusters.js +98 -0
  591. package/dist/composition/quantity-clusters.js.map +1 -0
  592. package/dist/composition/rational-exponent.d.ts +40 -0
  593. package/dist/composition/rational-exponent.d.ts.map +1 -0
  594. package/dist/composition/rational-exponent.js +65 -0
  595. package/dist/composition/rational-exponent.js.map +1 -0
  596. package/dist/composition/representative-values.d.ts +22 -0
  597. package/dist/composition/representative-values.d.ts.map +1 -1
  598. package/dist/composition/representative-values.js +29 -0
  599. package/dist/composition/representative-values.js.map +1 -1
  600. package/dist/composition/retrodiction.d.ts +15 -0
  601. package/dist/composition/retrodiction.d.ts.map +1 -1
  602. package/dist/composition/retrodiction.js +12 -4
  603. package/dist/composition/retrodiction.js.map +1 -1
  604. package/dist/composition/user-equation.d.ts +1 -0
  605. package/dist/composition/user-equation.d.ts.map +1 -1
  606. package/dist/composition/user-equation.js +3 -2
  607. package/dist/composition/user-equation.js.map +1 -1
  608. package/dist/core/assignment.d.ts +19 -0
  609. package/dist/core/assignment.d.ts.map +1 -0
  610. package/dist/core/assignment.js +19 -0
  611. package/dist/core/assignment.js.map +1 -0
  612. package/dist/core/compare.d.ts +32 -0
  613. package/dist/core/compare.d.ts.map +1 -0
  614. package/dist/core/compare.js +46 -0
  615. package/dist/core/compare.js.map +1 -0
  616. package/dist/core/constants.d.ts +42 -41
  617. package/dist/core/constants.d.ts.map +1 -1
  618. package/dist/core/constants.js +71 -51
  619. package/dist/core/constants.js.map +1 -1
  620. package/dist/core/data-file.d.ts +7 -0
  621. package/dist/core/data-file.d.ts.map +1 -1
  622. package/dist/core/data-file.js +17 -0
  623. package/dist/core/data-file.js.map +1 -1
  624. package/dist/core/format.d.ts +36 -0
  625. package/dist/core/format.d.ts.map +1 -0
  626. package/dist/core/format.js +39 -0
  627. package/dist/core/format.js.map +1 -0
  628. package/dist/core/hash.d.ts +14 -0
  629. package/dist/core/hash.d.ts.map +1 -0
  630. package/dist/core/hash.js +17 -0
  631. package/dist/core/hash.js.map +1 -0
  632. package/dist/core/json-schema.d.ts +2 -0
  633. package/dist/core/json-schema.d.ts.map +1 -1
  634. package/dist/core/json-schema.js +14 -13
  635. package/dist/core/json-schema.js.map +1 -1
  636. package/dist/core/labeled-tensor.d.ts.map +1 -1
  637. package/dist/core/labeled-tensor.js +0 -8
  638. package/dist/core/labeled-tensor.js.map +1 -1
  639. package/dist/core/mathts-read.d.ts +25 -0
  640. package/dist/core/mathts-read.d.ts.map +1 -0
  641. package/dist/core/mathts-read.js +51 -0
  642. package/dist/core/mathts-read.js.map +1 -0
  643. package/dist/core/tensor.d.ts.map +1 -1
  644. package/dist/core/tensor.js +24 -0
  645. package/dist/core/tensor.js.map +1 -1
  646. package/dist/core/types.d.ts +5 -5
  647. package/dist/diff/bridge-ast-gradient.d.ts +27 -23
  648. package/dist/diff/bridge-ast-gradient.d.ts.map +1 -1
  649. package/dist/diff/bridge-ast-gradient.js +75 -173
  650. package/dist/diff/bridge-ast-gradient.js.map +1 -1
  651. package/dist/diff/bridge-gradient.d.ts +19 -6
  652. package/dist/diff/bridge-gradient.d.ts.map +1 -1
  653. package/dist/diff/bridge-gradient.js +19 -11
  654. package/dist/diff/bridge-gradient.js.map +1 -1
  655. package/dist/diff/bridge-specs.d.ts.map +1 -1
  656. package/dist/diff/bridge-specs.js +3 -0
  657. package/dist/diff/bridge-specs.js.map +1 -1
  658. package/dist/dimensional/algebra.d.ts +18 -0
  659. package/dist/dimensional/algebra.d.ts.map +1 -1
  660. package/dist/dimensional/algebra.js +41 -1
  661. package/dist/dimensional/algebra.js.map +1 -1
  662. package/dist/dimensional/ast-builders.d.ts +7 -0
  663. package/dist/dimensional/ast-builders.d.ts.map +1 -1
  664. package/dist/dimensional/ast-builders.js +11 -0
  665. package/dist/dimensional/ast-builders.js.map +1 -1
  666. package/dist/dimensional/ast-leaves.d.ts +81 -0
  667. package/dist/dimensional/ast-leaves.d.ts.map +1 -0
  668. package/dist/dimensional/ast-leaves.js +146 -0
  669. package/dist/dimensional/ast-leaves.js.map +1 -0
  670. package/dist/dimensional/ast-types.d.ts +15 -0
  671. package/dist/dimensional/ast-types.d.ts.map +1 -1
  672. package/dist/dimensional/ast-types.js.map +1 -1
  673. package/dist/dimensional/buckingham.d.ts.map +1 -1
  674. package/dist/dimensional/buckingham.js +15 -27
  675. package/dist/dimensional/buckingham.js.map +1 -1
  676. package/dist/dimensional/constant-rows.js +9 -9
  677. package/dist/dimensional/constant-rows.js.map +1 -1
  678. package/dist/dimensional/curvature-composite.d.ts +1 -1
  679. package/dist/dimensional/curvature-composite.js.map +1 -1
  680. package/dist/dimensional/dimension-inference.d.ts.map +1 -1
  681. package/dist/dimensional/dimension-inference.js +1 -2
  682. package/dist/dimensional/dimension-inference.js.map +1 -1
  683. package/dist/dimensional/errors.d.ts +1 -1
  684. package/dist/dimensional/errors.d.ts.map +1 -1
  685. package/dist/dimensional/errors.js +1 -15
  686. package/dist/dimensional/errors.js.map +1 -1
  687. package/dist/dimensional/exact-scale.d.ts +24 -11
  688. package/dist/dimensional/exact-scale.d.ts.map +1 -1
  689. package/dist/dimensional/exact-scale.js +122 -130
  690. package/dist/dimensional/exact-scale.js.map +1 -1
  691. package/dist/dimensional/gauge-field.d.ts.map +1 -1
  692. package/dist/dimensional/gauge-field.js +2 -2
  693. package/dist/dimensional/gauge-field.js.map +1 -1
  694. package/dist/dimensional/hyphen-names.d.ts +12 -2
  695. package/dist/dimensional/hyphen-names.d.ts.map +1 -1
  696. package/dist/dimensional/hyphen-names.js +44 -19
  697. package/dist/dimensional/hyphen-names.js.map +1 -1
  698. package/dist/dimensional/mathts-unit-delegation.d.ts +29 -0
  699. package/dist/dimensional/mathts-unit-delegation.d.ts.map +1 -0
  700. package/dist/dimensional/mathts-unit-delegation.js +187 -0
  701. package/dist/dimensional/mathts-unit-delegation.js.map +1 -0
  702. package/dist/dimensional/mathts-unit-wrapper.d.ts +33 -0
  703. package/dist/dimensional/mathts-unit-wrapper.d.ts.map +1 -0
  704. package/dist/dimensional/mathts-unit-wrapper.js +190 -0
  705. package/dist/dimensional/mathts-unit-wrapper.js.map +1 -0
  706. package/dist/dimensional/metric.d.ts.map +1 -1
  707. package/dist/dimensional/metric.js +0 -1
  708. package/dist/dimensional/metric.js.map +1 -1
  709. package/dist/dimensional/scalar-lowering.d.ts +21 -0
  710. package/dist/dimensional/scalar-lowering.d.ts.map +1 -0
  711. package/dist/dimensional/scalar-lowering.js +45 -0
  712. package/dist/dimensional/scalar-lowering.js.map +1 -0
  713. package/dist/dimensional/symbolic-constants.d.ts +9 -0
  714. package/dist/dimensional/symbolic-constants.d.ts.map +1 -1
  715. package/dist/dimensional/symbolic-constants.js +13 -1
  716. package/dist/dimensional/symbolic-constants.js.map +1 -1
  717. package/dist/dimensional/types.d.ts +36 -0
  718. package/dist/dimensional/types.d.ts.map +1 -1
  719. package/dist/dimensional/types.js +45 -7
  720. package/dist/dimensional/types.js.map +1 -1
  721. package/dist/dimensional/unit-data.d.ts +5 -1
  722. package/dist/dimensional/unit-data.d.ts.map +1 -1
  723. package/dist/dimensional/unit-data.js +30 -6
  724. package/dist/dimensional/unit-data.js.map +1 -1
  725. package/dist/dimensional/units.d.ts +2 -0
  726. package/dist/dimensional/units.d.ts.map +1 -1
  727. package/dist/dimensional/units.js +59 -3
  728. package/dist/dimensional/units.js.map +1 -1
  729. package/dist/dimensional/validator.d.ts +2 -0
  730. package/dist/dimensional/validator.d.ts.map +1 -1
  731. package/dist/dimensional/validator.js.map +1 -1
  732. package/dist/index.d.ts +9 -3
  733. package/dist/index.d.ts.map +1 -1
  734. package/dist/index.js +10 -4
  735. package/dist/index.js.map +1 -1
  736. package/dist/numerical/christoffel-flat.d.ts.map +1 -1
  737. package/dist/numerical/christoffel-flat.js +3 -2
  738. package/dist/numerical/christoffel-flat.js.map +1 -1
  739. package/dist/numerical/connection-lowering-helpers.d.ts +3 -1
  740. package/dist/numerical/connection-lowering-helpers.d.ts.map +1 -1
  741. package/dist/numerical/connection-lowering-helpers.js +11 -15
  742. package/dist/numerical/connection-lowering-helpers.js.map +1 -1
  743. package/dist/numerical/covariant-eikonal.d.ts.map +1 -1
  744. package/dist/numerical/covariant-eikonal.js +34 -11
  745. package/dist/numerical/covariant-eikonal.js.map +1 -1
  746. package/dist/numerical/curvature-lowering-helpers.js +3 -2
  747. package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
  748. package/dist/numerical/errors.d.ts.map +1 -1
  749. package/dist/numerical/errors.js +0 -3
  750. package/dist/numerical/errors.js.map +1 -1
  751. package/dist/numerical/finite-difference.d.ts +22 -0
  752. package/dist/numerical/finite-difference.d.ts.map +1 -0
  753. package/dist/numerical/finite-difference.js +27 -0
  754. package/dist/numerical/finite-difference.js.map +1 -0
  755. package/dist/numerical/geodesic-integrator.d.ts.map +1 -1
  756. package/dist/numerical/geodesic-integrator.js +22 -14
  757. package/dist/numerical/geodesic-integrator.js.map +1 -1
  758. package/dist/numerical/geometrized.d.ts.map +1 -1
  759. package/dist/numerical/geometrized.js +0 -1
  760. package/dist/numerical/geometrized.js.map +1 -1
  761. package/dist/numerical/mathts-engine.d.ts.map +1 -1
  762. package/dist/numerical/mathts-engine.js +10 -24
  763. package/dist/numerical/mathts-engine.js.map +1 -1
  764. package/dist/numerical/metric-inverse.d.ts.map +1 -1
  765. package/dist/numerical/metric-inverse.js +83 -46
  766. package/dist/numerical/metric-inverse.js.map +1 -1
  767. package/dist/numerical/null-ray-integrator.d.ts +2 -1
  768. package/dist/numerical/null-ray-integrator.d.ts.map +1 -1
  769. package/dist/numerical/null-ray-integrator.js +12 -12
  770. package/dist/numerical/null-ray-integrator.js.map +1 -1
  771. package/dist/numerical/painleve-gullstrand-metric.js +2 -2
  772. package/dist/numerical/painleve-gullstrand-metric.js.map +1 -1
  773. package/dist/numerical/pderiv.d.ts.map +1 -1
  774. package/dist/numerical/pderiv.js +2 -6
  775. package/dist/numerical/pderiv.js.map +1 -1
  776. package/dist/numerical/perihelion-finder.d.ts +0 -36
  777. package/dist/numerical/perihelion-finder.d.ts.map +1 -1
  778. package/dist/numerical/perihelion-finder.js +41 -87
  779. package/dist/numerical/perihelion-finder.js.map +1 -1
  780. package/dist/numerical/quadrature.d.ts.map +1 -1
  781. package/dist/numerical/quadrature.js +11 -13
  782. package/dist/numerical/quadrature.js.map +1 -1
  783. package/dist/numerical/rk4-trajectory.d.ts +10 -0
  784. package/dist/numerical/rk4-trajectory.d.ts.map +1 -0
  785. package/dist/numerical/rk4-trajectory.js +37 -0
  786. package/dist/numerical/rk4-trajectory.js.map +1 -0
  787. package/dist/numerical/schwarzschild.d.ts +14 -0
  788. package/dist/numerical/schwarzschild.d.ts.map +1 -0
  789. package/dist/numerical/schwarzschild.js +17 -0
  790. package/dist/numerical/schwarzschild.js.map +1 -0
  791. package/dist/numerical/spacetime-metrics.d.ts +12 -0
  792. package/dist/numerical/spacetime-metrics.d.ts.map +1 -1
  793. package/dist/numerical/spacetime-metrics.js +72 -56
  794. package/dist/numerical/spacetime-metrics.js.map +1 -1
  795. package/dist/numerical/statistics.d.ts +24 -0
  796. package/dist/numerical/statistics.d.ts.map +1 -0
  797. package/dist/numerical/statistics.js +52 -0
  798. package/dist/numerical/statistics.js.map +1 -0
  799. package/dist/numerical/strides.d.ts +3 -2
  800. package/dist/numerical/strides.d.ts.map +1 -1
  801. package/dist/numerical/strides.js +3 -10
  802. package/dist/numerical/strides.js.map +1 -1
  803. package/dist/numerical/tensor-engine.d.ts +21 -0
  804. package/dist/numerical/tensor-engine.d.ts.map +1 -1
  805. package/dist/numerical/tensor-engine.js +12 -0
  806. package/dist/numerical/tensor-engine.js.map +1 -1
  807. package/dist/relations/regime.d.ts +10 -0
  808. package/dist/relations/regime.d.ts.map +1 -1
  809. package/dist/relations/regime.js +18 -1
  810. package/dist/relations/regime.js.map +1 -1
  811. package/package.json +9 -12
  812. package/dist/cases/brownian-sphere.d.ts +0 -68
  813. package/dist/cases/brownian-sphere.d.ts.map +0 -1
  814. package/dist/cases/brownian-sphere.js +0 -354
  815. package/dist/cases/brownian-sphere.js.map +0 -1
  816. package/dist/cases/damped-resonator.d.ts +0 -23
  817. package/dist/cases/damped-resonator.d.ts.map +0 -1
  818. package/dist/cases/damped-resonator.js +0 -224
  819. package/dist/cases/damped-resonator.js.map +0 -1
  820. package/dist/cases/kepler-rv.d.ts +0 -13
  821. package/dist/cases/kepler-rv.d.ts.map +0 -1
  822. package/dist/cases/kepler-rv.js +0 -172
  823. package/dist/cases/kepler-rv.js.map +0 -1
  824. package/dist/cases/lumped-cooling.d.ts +0 -46
  825. package/dist/cases/lumped-cooling.d.ts.map +0 -1
  826. package/dist/cases/lumped-cooling.js +0 -261
  827. package/dist/cases/lumped-cooling.js.map +0 -1
  828. package/dist/cases/resistor-noise.d.ts +0 -14
  829. package/dist/cases/resistor-noise.d.ts.map +0 -1
  830. package/dist/cases/resistor-noise.js +0 -215
  831. package/dist/cases/resistor-noise.js.map +0 -1
  832. package/dist/cases/skin-depth.d.ts +0 -21
  833. package/dist/cases/skin-depth.d.ts.map +0 -1
  834. package/dist/cases/skin-depth.js +0 -174
  835. package/dist/cases/skin-depth.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"units.js","sourceRoot":"","sources":["../../src/dimensional/units.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAE/D,OAAO,EACL,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,UAAU,EACV,UAAU,EACV,aAAa,EACb,YAAY,EACZ,UAAU,GAEX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAuC,MAAM,gBAAgB,CAAC;AAahF,qFAAqF;AACrF,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,0DAA0D;AAC1D,MAAM,OAAO,gBAAiB,SAAQ,SAAS;IACxB,MAAM;IAA3B,YAAqB,MAAc;QACjC,KAAK,CAAC,iBAAiB,MAAM,GAAG,CAAC,CAAC;sBADf,MAAM;QAEzB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,gBAAiB,SAAQ,SAAS;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,mFAAmF;AACnF,MAAM,OAAO,kBAAmB,SAAQ,SAAS;IAC1B,IAAI;IAAmB,QAAQ;IAApD,YAAqB,IAAY,EAAW,QAA2B;QACrE,KAAK,CAAC,IAAI,IAAI,mBAAmB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBADvC,IAAI;wBAAmB,QAAQ;QAElD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,CAAC,GAAG,CAAC,CAAqB,EAAa,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AACzG,MAAM,aAAa,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;AAE5B,0GAA0G;AAC1G,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;AAE9B,wFAAwF;AACxF,MAAM,aAAa,GAAG,SAAS,CAAC,OAAO,CAAC;AAExC;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,SAAS,CAAC,iBAAiB,CAAC;AAExD,+BAA+B;AAC/B,MAAM,gBAAgB,GAAG,SAAS,CAAC,SAAS,CAAC;AAM7C;;;;GAIG;AACH,MAAM,MAAM,GAAG,SAAS,CAAC,MAA8B,CAAC;AAExD,uEAAuE;AACvE,SAAS,YAAY,CAAC,GAAc;IAClC,OAAO,SAAS,CAAC,gBAAgB,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACjG,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,CAAa,EAAU,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AAErG;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAyB,EAAE,OAA2B;IACtF,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,MAAM,CAAE,CAAC;IACjE,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;IAClD,IAAI,OAAO,KAAK,YAAY;QAAE,OAAO,SAAS,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,mBAAmB,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC;IACrI,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACvD,IAAI,SAAS,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,KAAK,EAAE;QAAE,OAAO,eAAe,MAAM,EAAE,CAAC;IACzE,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAE,MAAM,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;IACnH,OAAO,aAAa,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,MAAM,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;AACpG,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;AAQpC,SAAS,SAAS,CAAC,GAAW;IAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9G,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YAAE,SAAS;QAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5C,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC1C,OAAO,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvG,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAUD,0FAA0F;AAC1F,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACjB,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC;QACjE,IAAI,GAAG,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,CAAC,CAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjE,IAAI,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;YACf,GAAG,GAAG,QAAQ,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC5E,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;gBACjB,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1D,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AACpF,CAAC;AAED,SAAS,aAAa,CAAC,OAAiC;IACtD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9G,CAAC;AAED,yFAAyF;AACzF,SAAS,YAAY,CAAC,MAAc;IAClC,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;YAAE,SAAS;QAC5E,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;IAC/D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAAC,IAAmB,EAAE,IAAmB;IACzD,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC;AACtF,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,IAAI,GAAwB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACrF,IAAI,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,CAAC,CAAE,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/C,IAAI,MAAM,KAAK,IAAI;gBAAE,SAAS;YAC9B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,CAAC,CAAE,EAAE,CAAC;gBAC5B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,EAAE,MAAM,CAAC;oBAAE,SAAS;gBAC3E,IAAI,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAClD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAE;QAAE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,SAAS,SAAS,CAAC,KAAa,EAAE,OAAgB,EAAE,IAAiC;IACnF,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,OAAO,KAAK,SAAS;QAAE,MAAM,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACnD,qFAAqF;IACrF,qFAAqF;IACrF,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG,MAAM,KAAK,IAAI,IAAI,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IAC/G,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC;SAClC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;SAC/B,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAsB,EAAE,CAAC;IACnC,IAAI,MAAM,KAAK,IAAI;QAAE,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC,KAAK,MAAM,GAAG,IAAI,QAAQ;QAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAClD,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAClC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAI,KAAgC;IACpD,IAAI,GAAG,GAAU,CAAC,EAAE,CAAC,CAAC;IACtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAU,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,GAAG;YAAE,KAAK,MAAM,IAAI,IAAI,IAAI;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5E,GAAG,GAAG,IAAI,CAAC;IACb,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAUD,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACnG,CAAC;AAED,SAAS,UAAU,CAAC,MAA6C;IAC/D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,gBAAgB,CACvB,GAA0C,EAC1C,GAA0C;IAE1C,uEAAuE;IACvE,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC3D,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,WAAW,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,WAAW,EAAE,CAAC;AACrG,CAAC;AAED,SAAS,UAAU,CACjB,MAA6C,EAC7C,IAAY;IAEZ,IAAI,KAAK,GAAG,UAAU,CAAC;IACvB,IAAI,GAAG,GAAG,aAAa,CAAC;IACxB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;QAC7B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC;YAC5B,KAAK,GAAG,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3D,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,OAAO,CAAC,KAAiB,EAAE,GAAc,EAAE,KAAa,EAAE,MAAc,EAAE,MAA0B;IAC3G,OAAO;QACL,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC;QAC3B,KAAK;QACL,GAAG;QACH,KAAK;QACL,MAAM;QACN,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACtB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/E,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3F,IACE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAClF,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,EACjC,CAAC;QACD,MAAM,IAAI,gBAAgB,CAAC,iEAAiE,CAAC,CAAC;IAChG,CAAC;IACD,wFAAwF;IACxF,sFAAsF;IACtF,4CAA4C;IAC5C,IAAI,kCAAkC,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC9E,gGAAgG;IAChG,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,eAAe,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACpD,sFAAsF;IACtF,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,KAAK,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC;IACpG,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAClF,4EAA4E;IAC5E,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IACrF,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC9C,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACzC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACnH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,WAAW,GAAqC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;AAE/G;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;AAC5G,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACtB,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACzF,OAAO,QAAQ,CAAC,CAAC,CAAE,CAAC;AACtB,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzB,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACjG,CAAC;AAKD,sGAAsG;AACtG,SAAS,WAAW,CAAC,SAAqB,EAAE,IAAiB,EAAE,WAA+B;IAC5F,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7G,OAAO,GAAG,KAAK,SAAS,IAAI,WAAW,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACzG,CAAC;AAED,MAAM,QAAQ,GAAG,iEAAiE,CAAC;AACnF,MAAM,gBAAgB,GAAG,6DAA6D,CAAC;AAEvF;;;;;;GAMG;AACH,SAAS,oBAAoB,CAAC,GAAW;IACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAE,CAAC;QACxC,IAAI,GAAG,CAAC,GAAG,KAAK,EAAE;YAAE,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IACrG,CAAC;IACD,MAAM,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACnB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9D,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;IACtC,OAAO,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACzD,CAAC;AAaD,SAAS,aAAa,CAAC,GAAW,EAAE,KAAa;IAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,IAAI,GAAG,0BAA0B,CAAC,CAAC;IACpF,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,WAAW,GAAuB,UAAU;IAC3F,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,OAAO,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC9F,CAAC;IACD,IAAI,IAAiB,CAAC;IACtB,IAAI,CAAC;QACH,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,gBAAgB;YAAE,OAAO,IAAI,CAAC;QACnD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,OAAO;QACL,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QACvE,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;KAC9D,CAAC;AACJ,CAAC;AAaD;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,MAAc,EAAE,WAAW,GAAuB,UAAU;IACpG,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,OAAO,KAAK,IAAI;QAAE,MAAM,IAAI,SAAS,CAAC,IAAI,GAAG,yCAAyC,CAAC,CAAC;IAC5F,IAAI,OAAO,CAAC,IAAI,KAAK,EAAE;QAAE,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,GAAG,EAAE,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC3G,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3B,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,EAAE,CAAC,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,SAAS,CAAC,sCAAsC,MAAM,IAAI,CAAC,CAAC;IACnG,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3F,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,MAAM,IAAI,eAAe,GAAG,CAAC,CAAC;IAC/H,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;IACzB,MAAM,KAAK,GAAG,aAAa,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACvG,OAAO;QACL,KAAK,EAAE,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC;QAChC,KAAK;QACL,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QACrD,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;KAC9D,CAAC;AACJ,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;AAC7B,CAAC;AAED,mHAAmH;AACnH,MAAM,UAAU,QAAQ;IACtB,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU;IAMxB,OAAO;QACL,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,KAAK,IAAI,CAAU,CAAC,CAAC,CAAC;QACpI,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAU,CAAC,CAAC;QAC1F,cAAc,EAAE,aAAa,CAAC,gBAAgB,CAAC;QAC/C,YAAY,EAAE,SAAS,CAAC,MAAM;KAC/B,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Unit parsing for numeric inputs: `1um`, `25degC`, `1 kohm`, `3.8e-16 kg/m^3`.\n *\n * A unit is a product of factors, each `symbol[^n]`, joined by `*`, `·` or a\n * space; everything after a single `/` is the denominator (`W/(m*K)` and\n * `W/m*K` both mean W·m⁻¹·K⁻¹). An exact symbol is matched before a prefixed\n * one, so `min` is a minute, `Pa` a pascal and `mm` a millimetre.\n *\n * An affine temperature (`degC`, `°C`, `degF`, `°F`) is accepted only alone.\n * The kelvin value is `value × scale + offset` for an absolute reading and\n * `value × scale` for a difference. Rankine is proportional (`°R × 5/9`), not\n * affine. The caller decides which reading, from the quantity's role.\n *\n * An exact symbol wins over a prefix: `T` is the tesla and `Ts` is a\n * terasecond; `G` is the gauss and `GPa` is a gigapascal; `P` is the poise\n * and `PV` is still a petavolt. A glued positive exponent is that power when\n * the letters are already a unit, so `K2` and `K²` are `K^2`.\n *\n * A token with no separator is one factor when the whole token is an exact\n * unit or a prefix plus a unit, with an optional exponent. That reading\n * wins on a bare token, so `ms` stays a millisecond, `mm` a millimetre,\n * `mK` a millikelvin, and `Ts` a terasecond. Inside a larger expression the\n * prefixed reading competes with a heterogeneous product (`mK` is millikelvin\n * or metre·kelvin; `ms` is millisecond or metre·second). A split that puts\n * a prefix letter's own unit twice in a row is never a reading, because a\n * power is written `m2` or `m^2`: `mm` is a millimetre, not metre·metre,\n * and `mmin` is metre·minute or millimetre·inch, not metre·metre·inch.\n * A unit that is not a prefix letter still juxtaposes with itself (`NN` is\n * N·N). `parseUnit` names\n * every remaining reading and refuses. `convertValue` keeps the one reading\n * whose dimension is the declared unit. A token that is not one factor is a\n * product when exactly one split exists: `m2K` is `m^2·K`, `Vs` is `V·s`,\n * and `cm^2/Vs` is `cm^2/(V·s)`. Zero splits are an unknown unit. Two or more\n * splits name each reading and are refused (`mAs` is milliampere·second or\n * metre·ampere·second). An unknown token that ends in a digit stays unknown\n * when it is not that product. A numerator that is the single token `1` is\n * the dimensionless unit, so `1/s` is a reciprocal second and `1/m^3` a\n * number density; `1` is not a symbol anywhere else.\n * The table is data: `data/units.json`, loaded and validated by\n * `unit-data.ts`. Every row, prefix, refused spelling, prefix letter, affine\n * scale and spelling note is a row there, with the reason as its `comment`;\n * this module holds the grammar. `myr` is a milliyear because `m` is the SI\n * prefix, and `eV` takes one, so `GeV` is 10⁹ eV in joules.\n *\n * @module dimensional/units\n */\nimport { equals, format, multiply, power } from './algebra.js';\nimport type { Dimension } from './types.js';\nimport {\n addScales,\n decimalScale,\n divideScales,\n multiplyScales,\n powerScale,\n ratioScale,\n scaleToNumber,\n solidusSides,\n UNIT_SCALE,\n type ExactScale,\n} from './exact-scale.js';\nimport { UNIT_DATA, type AffineRow as UnitDataAffineRow } from './unit-data.js';\n\n/** An affine temperature scale: a lone `degC` or `degF`. @public */\nexport type AffineTemperature = 'celsius' | 'fahrenheit';\n\n/** A unit, as a scale to SI base units and a dimension. @public */\nexport interface ParsedUnit {\n readonly scale: number;\n readonly dim: Dimension;\n /** Set only for a lone affine temperature, which needs a reading. */\n readonly affine?: AffineTemperature;\n}\n\n/** Thrown for any input that does not parse as a value with a known unit. @public */\nexport class UnitError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'UnitError';\n }\n}\n\n/** A symbol no table row and no prefix spells. @public */\nexport class UnknownUnitError extends UnitError {\n constructor(readonly symbol: string) {\n super(`unknown unit '${symbol}'`);\n this.name = 'UnknownUnitError';\n }\n}\n\n/**\n * A unit the reader recognizes and refuses: a logarithmic or ratio unit, an\n * ambiguous name such as `ton`, or an affine temperature inside a compound.\n * @public\n */\nexport class UnitRefusedError extends UnitError {\n constructor(message: string) {\n super(message);\n this.name = 'UnitRefusedError';\n }\n}\n\n/** A unit expression with more than one dimensionally distinct reading. @public */\nexport class AmbiguousUnitError extends UnitError {\n constructor(readonly text: string, readonly readings: readonly string[]) {\n super(`'${text}' is ambiguous: ${readings.join(' or ')}`);\n this.name = 'AmbiguousUnitError';\n }\n}\n\nconst D = (p: Partial<Dimension>): Dimension => ({ L: 0, M: 0, T: 0, I: 0, Theta: 0, N: 0, J: 0, ...p });\nconst DIMENSIONLESS = D({});\n\n/** symbol → exact scale to SI base, dimension, prefixability, cycle count. Rows are `data/units.json`. */\nconst UNITS = UNIT_DATA.units;\n\n/** Units that are a ratio or a log scale, and the reason each is not a plain factor. */\nconst REFUSED_UNITS = UNIT_DATA.refused;\n\n/**\n * Letters that are both an SI prefix and a unit of their own. Such a token\n * reads as the prefix reading and not as the unit times the rest: `Gyr` is a\n * gigayear. The file's `prefixLetterUnits.comment` says why `m` is not one.\n */\nconst PREFIX_LETTER_UNITS = UNIT_DATA.prefixLetterUnits;\n\n/** Kelvin at 0 °C, exactly. */\nconst CELSIUS_OFFSET_K = UNIT_DATA.iceKelvin;\n\ninterface AffineRow extends UnitDataAffineRow {\n readonly id: AffineTemperature;\n}\n\n/**\n * Lone spellings. A compound that contains one is refused. The schema's `id`\n * enum is {@link AffineTemperature}, held equal by a test: the public type\n * promises callers these ids, so a new affine scale is an API change.\n */\nconst AFFINE = UNIT_DATA.affine as readonly AffineRow[];\n\n/** Kelvin at a reading of zero, exactly: 273.15 − icePoint × scale. */\nfunction affineOffset(row: AffineRow): ExactScale {\n return addScales(CELSIUS_OFFSET_K, multiplyScales(ratioScale(-1, 1), row.icePoint, row.scale));\n}\n\nconst fractionText = (s: ExactScale): string => (s.den === 1n ? String(s.num) : `${s.num}/${s.den}`);\n\n/**\n * How a reading on an affine scale becomes kelvin, from the row's scale and\n * ice point: `absolute: (degF − 32) × 5/9 + 273.15`, `a difference: × 5/9, no offset`.\n * @internal\n */\nexport function affineReadingNote(affine: AffineTemperature, reading: TemperatureReading): string {\n const row = AFFINE.find((candidate) => candidate.id === affine)!;\n const unitScale = row.scale.num === row.scale.den;\n if (reading === 'difference') return unitScale ? 'a difference: no offset' : `a difference: × ${fractionText(row.scale)}, no offset`;\n const kelvin = String(scaleToNumber(CELSIUS_OFFSET_K));\n if (unitScale && row.icePoint.num === 0n) return `absolute: + ${kelvin}`;\n const shifted = row.icePoint.num === 0n ? row.symbols[0]! : `(${row.symbols[0]!} − ${fractionText(row.icePoint)})`;\n return `absolute: ${unitScale ? shifted : `${shifted} × ${fractionText(row.scale)}`} + ${kelvin}`;\n}\n\nfunction affineRow(text: string): AffineRow | undefined {\n return AFFINE.find((candidate) => candidate.symbols.includes(text));\n}\n\nconst PREFIXES = UNIT_DATA.prefixes;\n\ninterface SymbolReading {\n readonly scale: ExactScale;\n readonly dim: Dimension;\n readonly cycles: number;\n}\n\nfunction trySymbol(sym: string): SymbolReading | null {\n const exact = UNITS.get(sym);\n if (exact !== undefined) return { scale: exact.scale, dim: exact.dim, cycles: exact.cycles === true ? 1 : 0 };\n for (const [p, f] of PREFIXES) {\n if (!sym.startsWith(p) || sym.length === p.length) continue;\n const base = UNITS.get(sym.slice(p.length));\n if (base !== undefined && base.prefixable) {\n return { scale: multiplyScales(f, base.scale), dim: base.dim, cycles: base.cycles === true ? 1 : 0 };\n }\n }\n return null;\n}\n\ninterface FactorReading {\n readonly base: string;\n readonly exp: number;\n readonly scale: ExactScale;\n readonly dim: Dimension;\n readonly cycles: number;\n}\n\n/** One factor, or null when `token` is not exactly one unit with an optional exponent. */\nfunction tryOneFactor(token: string): FactorReading | null {\n let base = token;\n let exp = 1;\n const caret = /^(.+)\\^([+-]?\\d+)$/.exec(token);\n if (caret !== null) {\n base = caret[1]!;\n exp = Number(caret[2]);\n } else {\n const uni = /^(.*?)(⁻?[¹²³])$/.exec(token);\n const superExp = uni === null ? undefined : SUPERSCRIPT[uni[2]!];\n if (uni !== null && superExp !== undefined && uni[1]!.length > 0) {\n base = uni[1]!;\n exp = superExp;\n } else {\n const glued = /^(.*?)([1-9]\\d*)$/.exec(token);\n if (glued !== null && glued[1]!.length > 0 && trySymbol(glued[1]!) !== null) {\n base = glued[1]!;\n exp = Number(glued[2]);\n }\n }\n }\n const parsed = trySymbol(base);\n if (parsed === null || !Number.isFinite(exp)) return null;\n return { base, exp, scale: parsed.scale, dim: parsed.dim, cycles: parsed.cycles };\n}\n\nfunction formatReading(factors: readonly FactorReading[]): string {\n return factors.map((factor) => (factor.exp === 1 ? factor.base : `${factor.base}^${factor.exp}`)).join('·');\n}\n\n/** The unprefixed unit a prefix spelling attaches to, or null when `symbol` is exact. */\nfunction attachedUnit(symbol: string): string | null {\n if (UNITS.has(symbol)) return null;\n for (const [prefix] of PREFIXES) {\n if (!symbol.startsWith(prefix) || symbol.length === prefix.length) continue;\n const base = symbol.slice(prefix.length);\n const unitRow = UNITS.get(base);\n if (unitRow !== undefined && unitRow.prefixable) return base;\n }\n return null;\n}\n\n/**\n * `X·X` where `XX` is X's own prefix spelling (`m·m` beside `mm`, `d·d`\n * beside `dd`): not a split, because a power is written `X2` or `X^2`. A\n * run of a unit that is not also a prefix letter (`N·N`) stays a product.\n */\nfunction prefixRun(last: FactorReading, next: FactorReading): boolean {\n return last.base === next.base && attachedUnit(last.base + next.base) === last.base;\n}\n\n/**\n * Every way to split `token` into one or more factors. A one-factor token is\n * included. A split that puts a prefix letter's own unit twice in a row\n * (`m·m`, `m·m²`, `m·m·in`) is not a way, inside any split.\n */\nfunction segmentations(token: string): FactorReading[][] {\n const ways: FactorReading[][][] = Array.from({ length: token.length + 1 }, () => []);\n ways[0]!.push([]);\n for (let i = 0; i < token.length; i++) {\n if (ways[i]!.length === 0) continue;\n for (let j = i + 1; j <= token.length; j++) {\n const factor = tryOneFactor(token.slice(i, j));\n if (factor === null) continue;\n for (const prev of ways[i]!) {\n if (prev.length > 0 && prefixRun(prev[prev.length - 1]!, factor)) continue;\n ways[j]!.push([...prev, factor]);\n }\n }\n }\n const unique = new Map<string, FactorReading[]>();\n for (const way of ways[token.length]!) unique.set(formatReading(way), way);\n return [...unique.values()];\n}\n\n/**\n * Ways to read one token. A bare expression keeps a one-factor reading and\n * does not also split it. Inside a compound, a prefixed factor also competes\n * with each heterogeneous product; `segmentations` has already dropped the\n * homogeneous runs.\n */\nfunction tokenWays(token: string, compete: boolean, side: 'numerator' | 'denominator'): FactorReading[][] {\n const refused = REFUSED_UNITS.get(token);\n if (refused !== undefined) throw new UnitRefusedError(refused);\n const single = tryOneFactor(token);\n if (single !== null && !compete) return [[single]];\n // A prefixed numerator token is the prefix reading: `mN/m` is millinewton per metre.\n // A denominator keeps the product readings (`W/mK`), and a target dimension chooses.\n if (single !== null && side === 'numerator') return [[single]];\n const prefixWins = single !== null && PREFIX_LETTER_UNITS.has(token[0]!) && attachedUnit(single.base) !== null;\n const products = segmentations(token)\n .filter((way) => way.length > 1)\n .filter(() => !prefixWins);\n const ways: FactorReading[][] = [];\n if (single !== null) ways.push([single]);\n for (const way of products) ways.push(way);\n const unique = new Map<string, FactorReading[]>();\n for (const way of ways) unique.set(formatReading(way), way);\n const list = [...unique.values()];\n if (list.length === 0) throw new UnknownUnitError(token);\n return list;\n}\n\nfunction cartesian<T>(lists: readonly (readonly T[])[]): T[][] {\n let acc: T[][] = [[]];\n for (const list of lists) {\n const next: T[][] = [];\n for (const prev of acc) for (const item of list) next.push([...prev, item]);\n acc = next;\n }\n return acc;\n}\n\n/** One reading of a unit expression, with its exact scale. @internal */\nexport interface UnitReading extends ParsedUnit {\n readonly label: string;\n readonly exact: ExactScale;\n /** Net power of cycle-counting units (Hz, rpm): 1 for a lone `kHz`, 0 for `1/s`. */\n readonly cycles: number;\n}\n\nfunction sideTokens(text: string): string[] {\n return text.split(/[*·\\s]+|(?<=[A-Za-zµμΩ])\\.(?=[A-Za-zµμΩ])/).filter((part) => part.length > 0);\n}\n\nfunction formatSide(tokens: readonly (readonly FactorReading[])[]): string {\n return tokens.map((factors) => formatReading(factors)).join('·');\n}\n\nfunction formatExpression(\n num: readonly (readonly FactorReading[])[],\n den: readonly (readonly FactorReading[])[],\n): string {\n // An empty numerator over a denominator is the dimensionless 1: `1/s`.\n const numerator = num.length === 0 ? '1' : formatSide(num);\n if (den.length === 0) return numerator;\n const denominator = formatSide(den);\n return denominator.includes('·') ? `${numerator}/(${denominator})` : `${numerator}/${denominator}`;\n}\n\nfunction accumulate(\n tokens: readonly (readonly FactorReading[])[],\n sign: 1 | -1,\n): { scale: ExactScale; dim: Dimension; cycles: number } {\n let scale = UNIT_SCALE;\n let dim = DIMENSIONLESS;\n let cycles = 0;\n for (const factors of tokens) {\n for (const factor of factors) {\n const n = sign * factor.exp;\n scale = multiplyScales(scale, powerScale(factor.scale, n));\n dim = multiply(dim, power(factor.dim, n));\n cycles += factor.cycles * n;\n }\n }\n return { scale, dim, cycles };\n}\n\nfunction reading(exact: ExactScale, dim: Dimension, label: string, cycles: number, affine?: AffineTemperature): UnitReading {\n return {\n scale: scaleToNumber(exact),\n exact,\n dim,\n label,\n cycles,\n ...(affine === undefined ? {} : { affine }),\n };\n}\n\n/**\n * Every dimensionally distinct reading of one unit expression.\n *\n * The unit grammar is not the formula grammar, and the difference is\n * deliberate: a unit symbol is not an identifier (a prefix, a glued product\n * or a glued power lives inside one token: `mN`, `m2K`, `Vs`, `K²`, `°C`,\n * `%`), and everything after the first `/` is the denominator, the\n * single-solidus convention of ISO 80000-1 (`W/m*K` is W·m⁻¹·K⁻¹), where the\n * formula grammar would read `(W/m)·K`.\n * @internal\n */\nfunction unitReadings(text: string): UnitReading[] {\n const t = text.trim();\n if (t === '' || t === '1') return [reading(UNIT_SCALE, DIMENSIONLESS, '1', 0)];\n const affine = affineRow(t);\n if (affine !== undefined) return [reading(affine.scale, D({ Theta: 1 }), t, 0, affine.id)];\n if (\n AFFINE.some((candidate) => candidate.symbols.some((symbol) => t.includes(symbol))) ||\n /deg\\s+[CFcf]|°\\s*[CFcf]/.test(t)\n ) {\n throw new UnitRefusedError('an affine temperature cannot be part of a compound unit; give K');\n }\n // An operator with nothing on one side (`m/`, `m//s`, `m*`, `*m`, `m/*s`) is not a unit\n // text; it was read as if the empty factor were 1 (Tom's second round). A leading `/`\n // (`/s`) stays the dimensionless numerator.\n if (/[*·/]\\s*$|^\\s*[*·]|[*·/]\\s*[*·/]/.test(t)) throw new UnknownUnitError(t);\n // A chain is one denominator: `km/s/Mpc` is km/(s·Mpc), the way the Hubble constant is written.\n const sides = solidusSides(t);\n const compete = /[*·/\\s]/.test(t);\n const numeratorTokens = sideTokens(sides.numerator);\n // A numerator that is the single token `1` is the dimensionless unit: `1/s`, `1/m^3`.\n const numerator = numeratorTokens.length === 1 && numeratorTokens[0] === '1' ? [] : numeratorTokens;\n const denominator = sides.denominator === '' ? [] : sideTokens(sides.denominator);\n // `/s` is a dimensionless numerator over seconds. A bare `/` is not a unit.\n if (numerator.length === 0 && denominator.length === 0) throw new UnknownUnitError(t);\n const numWays = numerator.map((token) => tokenWays(token, compete, 'numerator'));\n const denWays = denominator.map((token) => tokenWays(token, compete, 'denominator'));\n const numCombos = numerator.length === 0 ? [[]] : cartesian(numWays);\n const denCombos = denominator.length === 0 ? [[]] : cartesian(denWays);\n const unique = new Map<string, UnitReading>();\n for (const num of numCombos) {\n for (const den of denCombos) {\n const n = accumulate(num, 1);\n const d = accumulate(den, -1);\n const label = formatExpression(num, den);\n unique.set(label, reading(multiplyScales(n.scale, d.scale), multiply(n.dim, d.dim), label, n.cycles + d.cycles));\n }\n }\n return [...unique.values()];\n}\n\nconst SUPERSCRIPT: Readonly<Record<string, number>> = { '¹': 1, '²': 2, '³': 3, '⁻¹': -1, '⁻²': -2, '⁻³': -3 };\n\n/**\n * Spellings that convert correctly and still mean something else to a reader:\n * the `spellingNotes` of `data/units.json` for each symbol in `given`, in file\n * order. `myr` is a milliyear, bare `G` is the gauss, bare `A` the ampere.\n * @internal\n */\nexport function unitConventionNotes(given: string): string[] {\n const symbols = new Set(given.split(/[*·/\\s^0-9()+-]+/).filter((s) => s.length > 0));\n return [...UNIT_DATA.spellingNotes].filter(([spelling]) => symbols.has(spelling)).map(([, note]) => note);\n}\n\n/** The one reading of a unit expression; more than one is refused. @internal */\nexport function readUnit(text: string): UnitReading {\n const t = text.trim();\n const readings = unitReadings(t);\n if (readings.length !== 1) throw new AmbiguousUnitError(t, readings.map((r) => r.label));\n return readings[0]!;\n}\n\n/** Parse a unit expression; the empty string is dimensionless. @public */\nexport function parseUnit(text: string): ParsedUnit {\n const r = readUnit(text);\n return { scale: r.scale, dim: r.dim, ...(r.affine !== undefined ? { affine: r.affine } : {}) };\n}\n\n/** How a temperature value is read: as a point on the scale, or as a difference. @public */\nexport type TemperatureReading = 'absolute' | 'difference';\n\n/** The SI magnitude of `magnitude` in `unit`, exactly. An absolute affine reading adds its offset. */\nfunction siMagnitude(magnitude: ExactScale, unit: UnitReading, temperature: TemperatureReading): ExactScale {\n const scaled = multiplyScales(magnitude, unit.exact);\n const row = unit.affine === undefined ? undefined : AFFINE.find((candidate) => candidate.id === unit.affine);\n return row !== undefined && temperature === 'absolute' ? addScales(scaled, affineOffset(row)) : scaled;\n}\n\nconst FRACTION = /^\\s*([+-]?(?:\\d+\\.?\\d*|\\.\\d+))\\s*\\/\\s*((?:\\d+\\.?\\d*|\\.\\d+))\\s*$/;\nconst NUMBER_THEN_REST = /^\\s*([+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?)\\s*(.*?)\\s*$/;\n\n/**\n * `raw` split into an exact decimal magnitude and the unit text after it, or\n * null when `raw` is not a number followed by an optional unit. A plain\n * fraction (`1/3`) is a number. Text that begins with an operator (`*h`,\n * `·c`) is an expression, not a unit.\n * @internal\n */\nfunction splitQuantityLiteral(raw: string): { readonly magnitude: ExactScale; readonly unit: string } | null {\n const fraction = FRACTION.exec(raw);\n if (fraction !== null) {\n const den = decimalScale(fraction[2]!)!;\n if (den.num !== 0n) return { magnitude: divideScales(decimalScale(fraction[1]!)!, den), unit: '' };\n }\n const m = NUMBER_THEN_REST.exec(raw);\n if (m === null) return null;\n const unit = m[2]!;\n if (unit.startsWith('*') || unit.startsWith('·')) return null;\n const magnitude = decimalScale(m[1]!);\n return magnitude === null ? null : { magnitude, unit };\n}\n\n/** A number with a unit, read exactly and rounded once. @internal */\nexport interface QuantityLiteral {\n /** SI value; a bare number is unchanged. */\n readonly value: number;\n readonly dim: Dimension;\n /** The unit text as given; `''` for a bare number. */\n readonly unit: string;\n readonly cycles: number;\n readonly affine?: AffineTemperature;\n}\n\nfunction finiteLiteral(raw: string, value: number): number {\n if (!Number.isFinite(value)) throw new UnitError(`'${raw}' is not a finite number`);\n return value;\n}\n\n/**\n * Read `raw` as one number with an optional unit, in SI. Null when `raw` is\n * not that form or names a unit no row spells, so the caller can read it as\n * an expression. A refused unit and an ambiguous one throw. The value may be\n * non-finite (`1e999`); the caller owns that refusal and its error class.\n * @internal\n */\nexport function readQuantityLiteral(raw: string, temperature: TemperatureReading = 'absolute'): QuantityLiteral | null {\n const literal = splitQuantityLiteral(raw);\n if (literal === null) return null;\n if (literal.unit === '') {\n return { value: scaleToNumber(literal.magnitude), dim: DIMENSIONLESS, unit: '', cycles: 0 };\n }\n let unit: UnitReading;\n try {\n unit = readUnit(literal.unit);\n } catch (error) {\n if (error instanceof UnknownUnitError) return null;\n throw error;\n }\n return {\n value: scaleToNumber(siMagnitude(literal.magnitude, unit, temperature)),\n dim: unit.dim,\n unit: literal.unit,\n cycles: unit.cycles,\n ...(unit.affine === undefined ? {} : { affine: unit.affine }),\n };\n}\n\n/** A value converted into a declared unit. @public */\nexport interface ConvertedValue {\n readonly value: number;\n /** The unit the user gave; `''` for a bare number. */\n readonly given: string;\n /** Net power of cycle-counting units in `given` (1 for `Hz` or `rpm`); absent when 0. */\n readonly cycles?: number;\n /** Set when `given` is a lone affine temperature. */\n readonly affine?: AffineTemperature;\n}\n\n/**\n * Convert `raw` (`<number>[unit]`) into `target` (a unit expression). A bare\n * number is taken to be in `target` already. The dimensions must agree.\n *\n * The magnitude, the unit scales and the target scale are multiplied as\n * exact rationals and rounded once, so `1 g/cm^3` in `kg/m^3` is 1000.\n *\n * @returns the value in `target`, and the unit the user gave (`''` for none).\n * @public\n */\nexport function convertValue(raw: string, target: string, temperature: TemperatureReading = 'absolute'): ConvertedValue {\n const literal = splitQuantityLiteral(raw);\n if (literal === null) throw new UnitError(`'${raw}' is not a number with an optional unit`);\n if (literal.unit === '') return { value: finiteLiteral(raw, scaleToNumber(literal.magnitude)), given: '' };\n const given = literal.unit;\n const readings = unitReadings(given);\n const to = readUnit(target);\n if (to.affine !== undefined) throw new UnitError(`a declared unit cannot be affine ('${target}')`);\n const matched = readings.filter((candidate) => equals(candidate.dim, to.dim));\n if (matched.length !== 1) {\n if (readings.length > 1) throw new AmbiguousUnitError(given, readings.map((r) => r.label));\n const from = readings[0];\n if (from === undefined) throw new UnknownUnitError(given);\n throw new UnitError(`'${given}' is ${format(from.dim)}, but this input is ${format(to.dim)} (${target || 'dimensionless'})`);\n }\n const from = matched[0]!;\n const value = scaleToNumber(divideScales(siMagnitude(literal.magnitude, from, temperature), to.exact));\n return {\n value: finiteLiteral(raw, value),\n given,\n ...(from.cycles === 0 ? {} : { cycles: from.cycles }),\n ...(from.affine === undefined ? {} : { affine: from.affine }),\n };\n}\n\n/** The dimension of a declared unit expression. @internal */\nexport function unitDimension(unit: string): Dimension {\n return parseUnit(unit).dim;\n}\n\n/** The symbols the unit table spells, with their exact scales, for the agreement test against MathTS. @internal */\nexport function unitRows(): ReadonlyMap<string, { readonly scale: ExactScale; readonly dim: Dimension; readonly prefixable: boolean }> {\n return UNITS;\n}\n\n/**\n * The tables conversion reads, for the CLI record's fingerprint (`src/cli/record-tables.ts`):\n * each row's scale, dimension, prefixability and `cycles` flag (which multiplies an angular\n * input by 2π), the prefixes, the Celsius offset, and the SHA-256 of `data/units.json`, so a\n * refused spelling, a prefix letter, an affine row or a note that changes changes the fingerprint too.\n * @internal\n */\nexport function unitTables(): {\n units: ReadonlyMap<string, readonly [number, Dimension, boolean, boolean]>;\n prefixes: ReadonlyMap<string, number>;\n celsiusOffsetK: number;\n sourceSha256: string;\n} {\n return {\n units: new Map([...UNITS].map(([symbol, r]) => [symbol, [scaleToNumber(r.scale), r.dim, r.prefixable, r.cycles === true] as const])),\n prefixes: new Map([...PREFIXES].map(([prefix, f]) => [prefix, scaleToNumber(f)] as const)),\n celsiusOffsetK: scaleToNumber(CELSIUS_OFFSET_K),\n sourceSha256: UNIT_DATA.sha256,\n };\n}\n"]}
1
+ {"version":3,"file":"units.js","sourceRoot":"","sources":["../../src/dimensional/units.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Unit parsing for numeric inputs: `1um`, `25degC`, `1 kohm`, `3.8e-16 kg/m^3`.\n *\n * A unit is a product of factors, each `symbol[^n]`, joined by `*`, `·` or a\n * space; everything after a single `/` is the denominator (`W/(m*K)` and\n * `W/m*K` both mean W·m⁻¹·K⁻¹). An exact symbol is matched before a prefixed\n * one, so `min` is a minute, `Pa` a pascal and `mm` a millimetre.\n *\n * An affine temperature (`degC`, `°C`, `degF`, `°F`) is accepted only alone.\n * The kelvin value is `value × scale + offset` for an absolute reading and\n * `value × scale` for a difference. Rankine is proportional (`°R × 5/9`), not\n * affine. The caller decides which reading, from the quantity's role.\n *\n * An exact symbol wins over a prefix: `T` is the tesla and `Ts` is a\n * terasecond; `G` is the gauss and `GPa` is a gigapascal; `P` is the poise\n * and `PV` is still a petavolt. A glued positive exponent is that power when\n * the letters are already a unit, so `K2` and `K²` are `K^2`.\n *\n * A token with no separator is one factor when the whole token is an exact\n * unit or a prefix plus a unit, with an optional exponent. That reading\n * wins on a bare token, so `ms` stays a millisecond, `mm` a millimetre,\n * `mK` a millikelvin, and `Ts` a terasecond. Inside a larger expression the\n * prefixed reading competes with a heterogeneous product (`mK` is millikelvin\n * or metre·kelvin; `ms` is millisecond or metre·second). A split that puts\n * a prefix letter's own unit twice in a row is never a reading, because a\n * power is written `m2` or `m^2`: `mm` is a millimetre, not metre·metre,\n * and `mmin` is metre·minute or millimetre·inch, not metre·metre·inch.\n * A unit that is not a prefix letter still juxtaposes with itself (`NN` is\n * N·N). `parseUnit` names\n * every remaining reading and refuses. `convertValue` keeps the one reading\n * whose dimension is the declared unit. A token that is not one factor is a\n * product when exactly one split exists: `m2K` is `m^2·K`, `Vs` is `V·s`,\n * and `cm^2/Vs` is `cm^2/(V·s)`. Zero splits are an unknown unit. Two or more\n * splits name each reading and are refused (`mAs` is milliampere·second or\n * metre·ampere·second). An unknown token that ends in a digit stays unknown\n * when it is not that product. A numerator that is the single token `1` is\n * the dimensionless unit, so `1/s` is a reciprocal second and `1/m^3` a\n * number density; `1` is not a symbol anywhere else.\n * The table is data: `data/units.json`, loaded and validated by\n * `unit-data.ts`. Every row, prefix, refused spelling, prefix letter, affine\n * scale and spelling note is a row there, with the reason as its `comment`;\n * this module holds the grammar. `myr` is a milliyear because `m` is the SI\n * prefix, and `eV` takes one, so `GeV` is 10⁹ eV in joules.\n *\n * @module dimensional/units\n */\nimport { Unit, exactScaleToNumber } from '@danielsimonjr/mathts-core';\nimport { equals, format, multiply, power } from './algebra.js';\nimport type { Dimension } from './types.js';\nimport {\n addScales,\n decimalScale,\n divideScales,\n multiplyScales,\n powerScale,\n ratioScale,\n scaleToNumber,\n solidusSides,\n UNIT_SCALE,\n type ExactScale,\n} from './exact-scale.js';\nimport {\n mathtsParsedDimension,\n unitExactScaleViaMathts,\n unitParserViaMathts,\n} from './mathts-unit-delegation.js';\nimport { applyBitScaleOverride, tryMathtsA5Reading, uptRefusalReason } from './mathts-unit-wrapper.js';\nimport { UNIT_DATA, type AffineRow as UnitDataAffineRow } from './unit-data.js';\n\n/** An affine temperature scale: a lone `degC` or `degF`. @public */\nexport type AffineTemperature = 'celsius' | 'fahrenheit';\n\n/** A unit, as a scale to SI base units and a dimension. @public */\nexport interface ParsedUnit {\n readonly scale: number;\n readonly dim: Dimension;\n /** Set only for a lone affine temperature, which needs a reading. */\n readonly affine?: AffineTemperature;\n}\n\n/** Thrown for any input that does not parse as a value with a known unit. @public */\nexport class UnitError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'UnitError';\n }\n}\n\n/** A symbol no table row and no prefix spells. @public */\nexport class UnknownUnitError extends UnitError {\n constructor(readonly symbol: string) {\n super(`unknown unit '${symbol}'`);\n this.name = 'UnknownUnitError';\n }\n}\n\n/**\n * A unit the reader recognizes and refuses: a logarithmic or ratio unit, an\n * ambiguous name such as `ton`, or an affine temperature inside a compound.\n * @public\n */\nexport class UnitRefusedError extends UnitError {\n constructor(message: string) {\n super(message);\n this.name = 'UnitRefusedError';\n }\n}\n\n/** A unit expression with more than one dimensionally distinct reading. @public */\nexport class AmbiguousUnitError extends UnitError {\n constructor(readonly text: string, readonly readings: readonly string[]) {\n super(`'${text}' is ambiguous: ${readings.join(' or ')}`);\n this.name = 'AmbiguousUnitError';\n }\n}\n\nconst D = (p: Partial<Dimension>): Dimension => ({ L: 0, M: 0, T: 0, I: 0, Theta: 0, N: 0, J: 0, ...p });\nconst DIMENSIONLESS = D({});\n\n/** symbol → exact scale to SI base, dimension, prefixability, cycle count. Rows are `data/units.json`. */\nconst UNITS = UNIT_DATA.units;\n\n/** Units that are a ratio or a log scale, and the reason each is not a plain factor. */\nconst REFUSED_UNITS = UNIT_DATA.refused;\n\n/**\n * Letters that are both an SI prefix and a unit of their own. Such a token\n * reads as the prefix reading and not as the unit times the rest: `Gyr` is a\n * gigayear. The file's `prefixLetterUnits.comment` says why `m` is not one.\n */\nconst PREFIX_LETTER_UNITS = UNIT_DATA.prefixLetterUnits;\n\n/** Kelvin at 0 °C, exactly. */\nconst CELSIUS_OFFSET_K = UNIT_DATA.iceKelvin;\n\ninterface AffineRow extends UnitDataAffineRow {\n readonly id: AffineTemperature;\n}\n\n/**\n * Lone spellings. A compound that contains one is refused. The schema's `id`\n * enum is {@link AffineTemperature}, held equal by a test: the public type\n * promises callers these ids, so a new affine scale is an API change.\n */\nconst AFFINE = UNIT_DATA.affine as readonly AffineRow[];\n\n/** Kelvin at a reading of zero, exactly: 273.15 − icePoint × scale. */\nfunction affineOffset(row: AffineRow): ExactScale {\n return addScales(CELSIUS_OFFSET_K, multiplyScales(ratioScale(-1, 1), row.icePoint, row.scale));\n}\n\nconst fractionText = (s: ExactScale): string => (s.den === 1n ? String(s.num) : `${s.num}/${s.den}`);\n\n/**\n * How a reading on an affine scale becomes kelvin, from the row's scale and\n * ice point: `absolute: (degF − 32) × 5/9 + 273.15`, `a difference: × 5/9, no offset`.\n * @internal\n */\nexport function affineReadingNote(affine: AffineTemperature, reading: TemperatureReading): string {\n const row = AFFINE.find((candidate) => candidate.id === affine)!;\n const unitScale = row.scale.num === row.scale.den;\n if (reading === 'difference') return unitScale ? 'a difference: no offset' : `a difference: × ${fractionText(row.scale)}, no offset`;\n const kelvin = String(scaleToNumber(CELSIUS_OFFSET_K));\n if (unitScale && row.icePoint.num === 0n) return `absolute: + ${kelvin}`;\n const shifted = row.icePoint.num === 0n ? row.symbols[0]! : `(${row.symbols[0]!} − ${fractionText(row.icePoint)})`;\n return `absolute: ${unitScale ? shifted : `${shifted} × ${fractionText(row.scale)}`} + ${kelvin}`;\n}\n\nfunction affineRow(text: string): AffineRow | undefined {\n return AFFINE.find((candidate) => candidate.symbols.includes(text));\n}\n\nconst PREFIXES = UNIT_DATA.prefixes;\n\ninterface SymbolReading {\n readonly scale: ExactScale;\n readonly dim: Dimension;\n readonly cycles: number;\n}\n\nfunction trySymbol(sym: string): SymbolReading | null {\n const exact = UNITS.get(sym);\n if (exact !== undefined) return { scale: exact.scale, dim: exact.dim, cycles: exact.cycles === true ? 1 : 0 };\n for (const [p, f] of PREFIXES) {\n if (!sym.startsWith(p) || sym.length === p.length) continue;\n const base = UNITS.get(sym.slice(p.length));\n if (base !== undefined && base.prefixable) {\n return { scale: multiplyScales(f, base.scale), dim: base.dim, cycles: base.cycles === true ? 1 : 0 };\n }\n }\n return null;\n}\n\nconst SUPERSCRIPT: Readonly<Record<string, number>> = { '¹': 1, '²': 2, '³': 3, '⁻¹': -1, '⁻²': -2, '⁻³': -3 };\n\ninterface FactorReading {\n readonly base: string;\n readonly exp: number;\n readonly scale: ExactScale;\n readonly dim: Dimension;\n readonly cycles: number;\n}\n\n/** One factor, or null when `token` is not exactly one unit with an optional exponent. */\nfunction tryOneFactor(token: string): FactorReading | null {\n let base = token;\n let exp = 1;\n const caret = /^(.+)\\^([+-]?\\d+)$/.exec(token);\n if (caret !== null) {\n base = caret[1]!;\n exp = Number(caret[2]);\n } else {\n const uni = /^(.*?)(⁻?[¹²³])$/.exec(token);\n const superExp = uni === null ? undefined : SUPERSCRIPT[uni[2]!];\n if (uni !== null && superExp !== undefined && uni[1]!.length > 0) {\n base = uni[1]!;\n exp = superExp;\n } else {\n const glued = /^(.*?)([1-9]\\d*)$/.exec(token);\n if (glued !== null && glued[1]!.length > 0 && trySymbol(glued[1]!) !== null) {\n base = glued[1]!;\n exp = Number(glued[2]);\n }\n }\n }\n const parsed = trySymbol(base);\n if (parsed === null || !Number.isFinite(exp)) return null;\n return { base, exp, scale: parsed.scale, dim: parsed.dim, cycles: parsed.cycles };\n}\n\nfunction formatReading(factors: readonly FactorReading[]): string {\n return factors.map((factor) => (factor.exp === 1 ? factor.base : `${factor.base}^${factor.exp}`)).join('·');\n}\n\n/** The unprefixed unit a prefix spelling attaches to, or null when `symbol` is exact. */\nfunction attachedUnit(symbol: string): string | null {\n if (UNITS.has(symbol)) return null;\n for (const [prefix] of PREFIXES) {\n if (!symbol.startsWith(prefix) || symbol.length === prefix.length) continue;\n const base = symbol.slice(prefix.length);\n const unitRow = UNITS.get(base);\n if (unitRow !== undefined && unitRow.prefixable) return base;\n }\n return null;\n}\n\n/**\n * `X·X` where `XX` is X's own prefix spelling (`m·m` beside `mm`, `d·d`\n * beside `dd`): not a split, because a power is written `X2` or `X^2`. A\n * run of a unit that is not also a prefix letter (`N·N`) stays a product.\n */\nfunction prefixRun(last: FactorReading, next: FactorReading): boolean {\n return last.base === next.base && attachedUnit(last.base + next.base) === last.base;\n}\n\n/**\n * Every way to split `token` into one or more factors. A one-factor token is\n * included. A split that puts a prefix letter's own unit twice in a row\n * (`m·m`, `m·m²`, `m·m·in`) is not a way, inside any split.\n */\nfunction segmentations(token: string): FactorReading[][] {\n const ways: FactorReading[][][] = Array.from({ length: token.length + 1 }, () => []);\n ways[0]!.push([]);\n for (let i = 0; i < token.length; i++) {\n if (ways[i]!.length === 0) continue;\n for (let j = i + 1; j <= token.length; j++) {\n const factor = tryOneFactor(token.slice(i, j));\n if (factor === null) continue;\n for (const prev of ways[i]!) {\n if (prev.length > 0 && prefixRun(prev[prev.length - 1]!, factor)) continue;\n ways[j]!.push([...prev, factor]);\n }\n }\n }\n const unique = new Map<string, FactorReading[]>();\n for (const way of ways[token.length]!) unique.set(formatReading(way), way);\n return [...unique.values()];\n}\n\n/**\n * Ways to read one token. A bare expression keeps a one-factor reading and\n * does not also split it. Inside a compound, a prefixed factor also competes\n * with each heterogeneous product; `segmentations` has already dropped the\n * homogeneous runs.\n */\nfunction tokenWays(token: string, compete: boolean, side: 'numerator' | 'denominator'): FactorReading[][] {\n const refused = REFUSED_UNITS.get(token);\n if (refused !== undefined) throw new UnitRefusedError(refused);\n const single = tryOneFactor(token);\n if (single !== null && !compete) return [[single]];\n // A prefixed numerator token is the prefix reading: `mN/m` is millinewton per metre.\n // A denominator keeps the product readings (`W/mK`), and a target dimension chooses.\n if (single !== null && side === 'numerator') return [[single]];\n const prefixWins = single !== null && PREFIX_LETTER_UNITS.has(token[0]!) && attachedUnit(single.base) !== null;\n const products = segmentations(token)\n .filter((way) => way.length > 1)\n .filter(() => !prefixWins);\n const ways: FactorReading[][] = [];\n if (single !== null) ways.push([single]);\n for (const way of products) ways.push(way);\n const unique = new Map<string, FactorReading[]>();\n for (const way of ways) unique.set(formatReading(way), way);\n const list = [...unique.values()];\n if (list.length === 0) throw new UnknownUnitError(token);\n return list;\n}\n\nfunction cartesian<T>(lists: readonly (readonly T[])[]): T[][] {\n let acc: T[][] = [[]];\n for (const list of lists) {\n const next: T[][] = [];\n for (const prev of acc) for (const item of list) next.push([...prev, item]);\n acc = next;\n }\n return acc;\n}\n\n/** One reading of a unit expression, with its exact scale. @internal */\nexport interface UnitReading extends ParsedUnit {\n readonly label: string;\n readonly exact: ExactScale;\n /** Net power of cycle-counting units (Hz, rpm): 1 for a lone `kHz`, 0 for `1/s`. */\n readonly cycles: number;\n}\n\nfunction sideTokens(text: string): string[] {\n return text.split(/[*·\\s]+|(?<=[A-Za-zµμΩ])\\.(?=[A-Za-zµμΩ])/).filter((part) => part.length > 0);\n}\n\nfunction formatSide(tokens: readonly (readonly FactorReading[])[]): string {\n return tokens.map((factors) => formatReading(factors)).join('·');\n}\n\nfunction formatExpression(\n num: readonly (readonly FactorReading[])[],\n den: readonly (readonly FactorReading[])[],\n): string {\n // An empty numerator over a denominator is the dimensionless 1: `1/s`.\n const numerator = num.length === 0 ? '1' : formatSide(num);\n if (den.length === 0) return numerator;\n const denominator = formatSide(den);\n return denominator.includes('·') ? `${numerator}/(${denominator})` : `${numerator}/${denominator}`;\n}\n\nfunction accumulate(\n tokens: readonly (readonly FactorReading[])[],\n sign: 1 | -1,\n): { scale: ExactScale; dim: Dimension; cycles: number } {\n let scale = UNIT_SCALE;\n let dim = DIMENSIONLESS;\n let cycles = 0;\n for (const factors of tokens) {\n for (const factor of factors) {\n const n = sign * factor.exp;\n scale = multiplyScales(scale, powerScale(factor.scale, n));\n dim = multiply(dim, power(factor.dim, n));\n cycles += factor.cycles * n;\n }\n }\n return { scale, dim, cycles };\n}\n\nfunction reading(exact: ExactScale, dim: Dimension, label: string, cycles: number, affine?: AffineTemperature): UnitReading {\n return {\n scale: scaleToNumber(exact),\n exact,\n dim,\n label,\n cycles,\n ...(affine === undefined ? {} : { affine }),\n };\n}\n\nlet lastReadingSource: { readonly text: string; readonly kind: 'mathts' | 'local' } | null = null;\n\nfunction applyMathtsExactScale(text: string, local: UnitReading): UnitReading {\n if (!unitExactScaleViaMathts(text, local.scale, local.exact, local.dim)) return local;\n const core = Unit.exactScale(text.trim());\n if (core === null) return local;\n return { ...local, scale: exactScaleToNumber(core) };\n}\n\n/**\n * Every dimensionally distinct reading of one unit expression (local grammar).\n *\n * The unit grammar is not the formula grammar, and the difference is\n * deliberate: a unit symbol is not an identifier (a prefix, a glued product\n * or a glued power lives inside one token: `mN`, `m2K`, `Vs`, `K²`, `°C`,\n * `%`), and everything after the first `/` is the denominator, the\n * single-solidus convention of ISO 80000-1 (`W/m*K` is W·m⁻¹·K⁻¹), where the\n * formula grammar would read `(W/m)·K`.\n * @internal\n */\nfunction localUnitReadings(text: string): UnitReading[] {\n const t = text.trim();\n if (t === '' || t === '1') return [reading(UNIT_SCALE, DIMENSIONLESS, '1', 0)];\n const affine = affineRow(t);\n if (affine !== undefined) return [reading(affine.scale, D({ Theta: 1 }), t, 0, affine.id)];\n if (\n AFFINE.some((candidate) => candidate.symbols.some((symbol) => t.includes(symbol))) ||\n /deg\\s+[CFcf]|°\\s*[CFcf]/.test(t)\n ) {\n throw new UnitRefusedError('an affine temperature cannot be part of a compound unit; give K');\n }\n // An operator with nothing on one side (`m/`, `m//s`, `m*`, `*m`, `m/*s`) is not a unit\n // text; it was read as if the empty factor were 1 (Tom's second round). A leading `/`\n // (`/s`) stays the dimensionless numerator.\n if (/[*·/]\\s*$|^\\s*[*·]|[*·/]\\s*[*·/]/.test(t)) throw new UnknownUnitError(t);\n // A chain is one denominator: `km/s/Mpc` is km/(s·Mpc), the way the Hubble constant is written.\n const sides = solidusSides(t);\n const compete = /[*·/\\s]/.test(t);\n const numeratorTokens = sideTokens(sides.numerator);\n // A numerator that is the single token `1` is the dimensionless unit: `1/s`, `1/m^3`.\n const numerator = numeratorTokens.length === 1 && numeratorTokens[0] === '1' ? [] : numeratorTokens;\n const denominator = sides.denominator === '' ? [] : sideTokens(sides.denominator);\n // `/s` is a dimensionless numerator over seconds. A bare `/` is not a unit.\n if (numerator.length === 0 && denominator.length === 0) throw new UnknownUnitError(t);\n const numWays = numerator.map((token) => tokenWays(token, compete, 'numerator'));\n const denWays = denominator.map((token) => tokenWays(token, compete, 'denominator'));\n const numCombos = numerator.length === 0 ? [[]] : cartesian(numWays);\n const denCombos = denominator.length === 0 ? [[]] : cartesian(denWays);\n const unique = new Map<string, UnitReading>();\n for (const num of numCombos) {\n for (const den of denCombos) {\n const n = accumulate(num, 1);\n const d = accumulate(den, -1);\n const label = formatExpression(num, den);\n unique.set(label, reading(multiplyScales(n.scale, d.scale), multiply(n.dim, d.dim), label, n.cycles + d.cycles));\n }\n }\n return [...unique.values()];\n}\n\nfunction unitReadings(text: string): UnitReading[] {\n const t = text.trim();\n lastReadingSource = { text: t, kind: 'local' };\n const refusal = uptRefusalReason(t);\n if (refusal !== null) throw new UnitRefusedError(refusal);\n\n const a5 = tryMathtsA5Reading(t);\n if (a5 !== null) {\n // A12 partial: A5 in-set texts skip localUnitReadings when MathTS agrees.\n lastReadingSource = { text: t, kind: 'mathts' };\n const affine = affineRow(t);\n return [\n reading(a5.exact, a5.dim, t, a5.cycles, affine?.id),\n ];\n }\n\n const readings = localUnitReadings(text);\n if (readings.length === 1) {\n const local = readings[0]!;\n if (unitParserViaMathts(t, local.scale, local.exact, local.dim)) {\n lastReadingSource = { text: t, kind: 'mathts' };\n const core = Unit.exactScale(t);\n const scale = core === null ? local.scale : exactScaleToNumber(core);\n const overridden = applyBitScaleOverride(t, local.exact, scale);\n return [\n {\n ...local,\n dim: mathtsParsedDimension(t, local.dim),\n exact: overridden.exact,\n scale: overridden.scale,\n },\n ];\n }\n const scaled = applyMathtsExactScale(t, local);\n const overridden = applyBitScaleOverride(t, scaled.exact, scaled.scale);\n return [{ ...scaled, exact: overridden.exact, scale: overridden.scale }];\n }\n return readings;\n}\n\n/**\n * Spellings that convert correctly and still mean something else to a reader:\n * the `spellingNotes` of `data/units.json` for each symbol in `given`, in file\n * order. `myr` is a milliyear, bare `G` is the gauss, bare `A` the ampere.\n * @internal\n */\nexport function unitConventionNotes(given: string): string[] {\n const symbols = new Set(given.split(/[*·/\\s^0-9()+-]+/).filter((s) => s.length > 0));\n return [...UNIT_DATA.spellingNotes].filter(([spelling]) => symbols.has(spelling)).map(([, note]) => note);\n}\n\n/** The one reading of a unit expression; more than one is refused. @internal */\nexport function readUnit(text: string): UnitReading {\n const t = text.trim();\n const readings = unitReadings(t);\n if (readings.length !== 1) throw new AmbiguousUnitError(t, readings.map((r) => r.label));\n return readings[0]!;\n}\n\n/** Which reader parsed `text` last: local grammar or MathTS `Unit.parse`. @internal */\nexport function unitReadingsSource(text: string): 'mathts' | 'local' {\n readUnit(text);\n const t = text.trim();\n return lastReadingSource !== null && lastReadingSource.text === t ? lastReadingSource.kind : 'local';\n}\n\n/** Parse a unit expression; the empty string is dimensionless. @public */\nexport function parseUnit(text: string): ParsedUnit {\n const r = readUnit(text);\n return { scale: r.scale, dim: r.dim, ...(r.affine !== undefined ? { affine: r.affine } : {}) };\n}\n\n/** How a temperature value is read: as a point on the scale, or as a difference. @public */\nexport type TemperatureReading = 'absolute' | 'difference';\n\n/** The SI magnitude of `magnitude` in `unit`, exactly. An absolute affine reading adds its offset. */\nfunction siMagnitude(magnitude: ExactScale, unit: UnitReading, temperature: TemperatureReading): ExactScale {\n const scaled = multiplyScales(magnitude, unit.exact);\n const row = unit.affine === undefined ? undefined : AFFINE.find((candidate) => candidate.id === unit.affine);\n return row !== undefined && temperature === 'absolute' ? addScales(scaled, affineOffset(row)) : scaled;\n}\n\nconst FRACTION = /^\\s*([+-]?(?:\\d+\\.?\\d*|\\.\\d+))\\s*\\/\\s*((?:\\d+\\.?\\d*|\\.\\d+))\\s*$/;\nconst NUMBER_THEN_REST = /^\\s*([+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?)\\s*(.*?)\\s*$/;\n\n/**\n * `raw` split into an exact decimal magnitude and the unit text after it, or\n * null when `raw` is not a number followed by an optional unit. A plain\n * fraction (`1/3`) is a number. Text that begins with an operator (`*h`,\n * `·c`) is an expression, not a unit.\n * @internal\n */\nfunction splitQuantityLiteral(raw: string): { readonly magnitude: ExactScale; readonly unit: string } | null {\n const fraction = FRACTION.exec(raw);\n if (fraction !== null) {\n const den = decimalScale(fraction[2]!)!;\n if (den.num !== 0n) return { magnitude: divideScales(decimalScale(fraction[1]!)!, den), unit: '' };\n }\n const m = NUMBER_THEN_REST.exec(raw);\n if (m === null) return null;\n const unit = m[2]!;\n if (unit.startsWith('*') || unit.startsWith('·')) return null;\n const magnitude = decimalScale(m[1]!);\n return magnitude === null ? null : { magnitude, unit };\n}\n\n/** A number with a unit, read exactly and rounded once. @internal */\nexport interface QuantityLiteral {\n /** SI value; a bare number is unchanged. */\n readonly value: number;\n readonly dim: Dimension;\n /** The unit text as given; `''` for a bare number. */\n readonly unit: string;\n readonly cycles: number;\n readonly affine?: AffineTemperature;\n}\n\nfunction finiteLiteral(raw: string, value: number): number {\n if (!Number.isFinite(value)) throw new UnitError(`'${raw}' is not a finite number`);\n return value;\n}\n\n/**\n * Read `raw` as one number with an optional unit, in SI. Null when `raw` is\n * not that form or names a unit no row spells, so the caller can read it as\n * an expression. A refused unit and an ambiguous one throw. The value may be\n * non-finite (`1e999`); the caller owns that refusal and its error class.\n * @internal\n */\nexport function readQuantityLiteral(raw: string, temperature: TemperatureReading = 'absolute'): QuantityLiteral | null {\n const literal = splitQuantityLiteral(raw);\n if (literal === null) return null;\n if (literal.unit === '') {\n return { value: scaleToNumber(literal.magnitude), dim: DIMENSIONLESS, unit: '', cycles: 0 };\n }\n let unit: UnitReading;\n try {\n unit = readUnit(literal.unit);\n } catch (error) {\n if (error instanceof UnknownUnitError) return null;\n throw error;\n }\n return {\n value: scaleToNumber(siMagnitude(literal.magnitude, unit, temperature)),\n dim: unit.dim,\n unit: literal.unit,\n cycles: unit.cycles,\n ...(unit.affine === undefined ? {} : { affine: unit.affine }),\n };\n}\n\n/** A value converted into a declared unit. @public */\nexport interface ConvertedValue {\n readonly value: number;\n /** The unit the user gave; `''` for a bare number. */\n readonly given: string;\n /** Net power of cycle-counting units in `given` (1 for `Hz` or `rpm`); absent when 0. */\n readonly cycles?: number;\n /** Set when `given` is a lone affine temperature. */\n readonly affine?: AffineTemperature;\n}\n\n/**\n * Convert `raw` (`<number>[unit]`) into `target` (a unit expression). A bare\n * number is taken to be in `target` already. The dimensions must agree.\n *\n * The magnitude, the unit scales and the target scale are multiplied as\n * exact rationals and rounded once, so `1 g/cm^3` in `kg/m^3` is 1000.\n *\n * @returns the value in `target`, and the unit the user gave (`''` for none).\n * @public\n */\nexport function convertValue(raw: string, target: string, temperature: TemperatureReading = 'absolute'): ConvertedValue {\n const literal = splitQuantityLiteral(raw);\n if (literal === null) throw new UnitError(`'${raw}' is not a number with an optional unit`);\n if (literal.unit === '') return { value: finiteLiteral(raw, scaleToNumber(literal.magnitude)), given: '' };\n const given = literal.unit;\n const readings = unitReadings(given);\n const to = readUnit(target);\n if (to.affine !== undefined) throw new UnitError(`a declared unit cannot be affine ('${target}')`);\n const matched = readings.filter((candidate) => equals(candidate.dim, to.dim));\n if (matched.length !== 1) {\n if (readings.length > 1) throw new AmbiguousUnitError(given, readings.map((r) => r.label));\n const from = readings[0];\n if (from === undefined) throw new UnknownUnitError(given);\n throw new UnitError(`'${given}' is ${format(from.dim)}, but this input is ${format(to.dim)} (${target || 'dimensionless'})`);\n }\n const from = matched[0]!;\n const value = scaleToNumber(divideScales(siMagnitude(literal.magnitude, from, temperature), to.exact));\n return {\n value: finiteLiteral(raw, value),\n given,\n ...(from.cycles === 0 ? {} : { cycles: from.cycles }),\n ...(from.affine === undefined ? {} : { affine: from.affine }),\n };\n}\n\n/** The dimension of a declared unit expression. @internal */\nexport function unitDimension(unit: string): Dimension {\n return parseUnit(unit).dim;\n}\n\n/** The symbols the unit table spells, with their exact scales, for the agreement test against MathTS. @internal */\nexport function unitRows(): ReadonlyMap<string, { readonly scale: ExactScale; readonly dim: Dimension; readonly prefixable: boolean }> {\n return UNITS;\n}\n\n/**\n * The tables conversion reads, for the CLI record's fingerprint (`src/cli/record-tables.ts`):\n * each row's scale, dimension, prefixability and `cycles` flag (which multiplies an angular\n * input by 2π), the prefixes, the Celsius offset, and the SHA-256 of `data/units.json`, so a\n * refused spelling, a prefix letter, an affine row or a note that changes changes the fingerprint too.\n * @internal\n */\nexport function unitTables(): {\n units: ReadonlyMap<string, readonly [number, Dimension, boolean, boolean]>;\n prefixes: ReadonlyMap<string, number>;\n celsiusOffsetK: number;\n sourceSha256: string;\n} {\n return {\n units: new Map([...UNITS].map(([symbol, r]) => [symbol, [scaleToNumber(r.scale), r.dim, r.prefixable, r.cycles === true] as const])),\n prefixes: new Map([...PREFIXES].map(([prefix, f]) => [prefix, scaleToNumber(f)] as const)),\n celsiusOffsetK: scaleToNumber(CELSIUS_OFFSET_K),\n sourceSha256: UNIT_DATA.sha256,\n };\n}\n"]}
@@ -16,6 +16,7 @@
16
16
  import { Dimension } from './types.js';
17
17
  import type { ExprNode, MetricTensorNode } from './ast-types.js';
18
18
  export type { ExprNode, TranscendentalFn, TensorSymbolNode, TensorProductNode, TensorIndex, Variance, Role, MetricTensorNode, KroneckerDeltaNode, TensorPartialDerivativeNode, CovariantIndex, UpperIndex, CovariantDerivativeNode, RiemannTensorNode, RicciTensorNode, EinsteinTensorNode, BianchiResidualNode, KillingVectorNode, ConservedChargeNode, StressEnergyTensorNode, CosmologicalConstantNode, EinsteinFieldEquationNode, WeylTensorNode, KretschmannScalarNode, } from './ast-types.js';
19
+ /** One dimensional violation that validation found in an expression. */
19
20
  export interface Violation {
20
21
  /** Tree path, e.g. "args[1].args[0]". Empty string for the root. */
21
22
  location: string;
@@ -26,6 +27,7 @@ export interface Violation {
26
27
  * validation (ValidationResult.ok stays true) but are still reported. */
27
28
  severity?: 'error' | 'warning';
28
29
  }
30
+ /** The result of validating one expression: its verdict, dimension, free indices and violations. */
29
31
  export interface ValidationResult {
30
32
  ok: boolean;
31
33
  inferredDimension: Dimension | null;
@@ -1 +1 @@
1
- {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/dimensional/validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,SAAS,EAEV,MAAM,YAAY,CAAC;AAqBpB,OAAO,KAAK,EACV,QAAQ,EAIR,gBAAgB,EAejB,MAAM,gBAAgB,CAAC;AAwBxB,YAAY,EACV,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,QAAQ,EACR,IAAI,EACJ,gBAAgB,EAChB,kBAAkB,EAClB,2BAA2B,EAC3B,cAAc,EACd,UAAU,EACV,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,yBAAyB,EACzB,cAAc,EACd,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAExB,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;AAusBD;;;;GAIG;AACH,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;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,GAAG,gBAAgB,CA8C/E"}
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/dimensional/validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,SAAS,EAEV,MAAM,YAAY,CAAC;AAqBpB,OAAO,KAAK,EACV,QAAQ,EAIR,gBAAgB,EAejB,MAAM,gBAAgB,CAAC;AAwBxB,YAAY,EACV,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,QAAQ,EACR,IAAI,EACJ,gBAAgB,EAChB,kBAAkB,EAClB,2BAA2B,EAC3B,cAAc,EACd,UAAU,EACV,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,yBAAyB,EACzB,cAAc,EACd,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAExB,wEAAwE;AACxE,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,oGAAoG;AACpG,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;AAusBD;;;;GAIG;AACH,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;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,GAAG,gBAAgB,CA8C/E"}
@@ -1 +1 @@
1
- {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/dimensional/validator.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Validator: walks an ExprNode tree and infers / checks SI dimensions.\n *\n * Honest-claude scope notes:\n * - Tensor index structure IS tracked: tensor-symbol / tensor-product\n * nodes carry free-index (upper/lower) signatures, contraction is\n * enforced, and `validateEquation` now checks valence homogeneity\n * across '=' (so the spec's Bridge Eq 17 rank mismatch — a tensor\n * equated to a scalar — is caught even when the SI dimensions agree).\n * - Transcendental nodes (exp, ln, log, trig): the argument must be\n * dimensionless. A dimensioned argument is an error-severity violation;\n * a tensor argument throws `TensorInScalarOpError`.\n *\n * @module dimensional/validator\n */\n\nimport {\n Dimension,\n DIMENSIONLESS,\n} from './types.js';\nimport {\n multiply,\n divide,\n power,\n add,\n subtract,\n equals,\n format,\n DimensionMismatchError,\n} from './algebra.js';\nimport {\n TensorInScalarOpError,\n FreeIndexMismatchError,\n TensorProductChildInferenceError,\n} from './errors.js';\n// All AST node types + ExprNode + TranscendentalFn now live in the leaf\n// `ast-types.ts` (consolidated to break the validator↔tensor / validator↔\n// curvature type-only cycles). The per-kind VALIDATION FUNCTIONS still live in\n// their modules and are value-imported below (one-way edges — those modules no\n// longer import validator).\nimport type {\n ExprNode,\n TranscendentalFn,\n TensorSymbolNode,\n TensorProductNode,\n MetricTensorNode,\n KroneckerDeltaNode,\n TensorPartialDerivativeNode,\n CovariantDerivativeNode,\n RiemannTensorNode,\n RicciTensorNode,\n EinsteinTensorNode,\n BianchiResidualNode,\n KillingVectorNode,\n ConservedChargeNode,\n StressEnergyTensorNode,\n CosmologicalConstantNode,\n EinsteinFieldEquationNode,\n WeylTensorNode,\n KretschmannScalarNode,\n} from './ast-types.js';\nimport type { ChildValidationResult } from './tensor.js';\nimport { validateTensorSymbol, computeContraction } from './tensor.js';\nimport type { PartialDerivativeChildResult } from './metric-validators.js';\nimport {\n validateMetricTensor,\n validateKroneckerDelta,\n validatePartialDerivative,\n checkInverseMetricStructure,\n} from './metric-validators.js';\nimport { validateCovariantDerivative } from './connection-validators.js';\n// v0.6.1 Phase 2: 11-arm curvature/GR-object dispatch consolidated into\n// the validator-registry module. The individual `validateX` functions\n// are still imported by validator-registry.ts (which the registry\n// indexes); validator.ts now only needs the dispatcher helpers.\nimport {\n lookupValidatorEntry,\n dispatchValidator,\n shouldPropagateFreeIndices,\n} from './validator-registry.js';\n\n// `ExprNode`, `TranscendentalFn`, and every node/index type now live in the\n// leaf `ast-types.ts`. They are re-exported here so the ~100 consumers that\n// import `{ ExprNode, … }` from `./validator.js` are unchanged.\nexport type {\n ExprNode,\n TranscendentalFn,\n TensorSymbolNode,\n TensorProductNode,\n TensorIndex,\n Variance,\n Role,\n MetricTensorNode,\n KroneckerDeltaNode,\n TensorPartialDerivativeNode,\n CovariantIndex,\n UpperIndex,\n CovariantDerivativeNode,\n RiemannTensorNode,\n RicciTensorNode,\n EinsteinTensorNode,\n BianchiResidualNode,\n KillingVectorNode,\n ConservedChargeNode,\n StressEnergyTensorNode,\n CosmologicalConstantNode,\n EinsteinFieldEquationNode,\n WeylTensorNode,\n KretschmannScalarNode,\n} from './ast-types.js';\n\nexport interface Violation {\n /** Tree path, e.g. \"args[1].args[0]\". Empty string for the root. */\n location: string;\n expected: Dimension;\n actual: Dimension;\n note: string;\n /** v0.3.5: absent ⇒ 'error'. 'warning'-severity violations do not fail\n * validation (ValidationResult.ok stays true) but are still reported. */\n severity?: 'error' | 'warning';\n}\n\nexport interface ValidationResult {\n ok: boolean;\n inferredDimension: Dimension | null;\n /** Map of free (uncontracted) index labels to their upper/lower counts.\n * Empty for scalar expressions. Populated by tensor-symbol /\n * tensor-product validation (Tasks 5 and 6). */\n freeIndices: Map<string, { upper: number; lower: number }>;\n violations: Violation[];\n}\n\ninterface InferContext {\n path: string;\n violations: Violation[];\n /** Free-indices accumulator for the root expression. Tensor-aware node\n * cases (tensor-symbol, tensor-product) populate this; scalar cases\n * leave it alone. validate() reads it after walking to construct the\n * ValidationResult.freeIndices map. Shared by reference across the\n * recursion so sibling subtrees can contribute. */\n freeIndices: Map<string, { upper: number; lower: number }>;\n}\n\nfunction joinPath(path: string, segment: string): string {\n return path === '' ? segment : `${path}.${segment}`;\n}\n\n/**\n * Structural equality for freeIndices maps. Two maps are equal iff they\n * contain the same label set and each label's `{upper, lower}` counts\n * match. Used by `op '+'` / `'-'` (Task 7 / Part-VII §VII.5) to enforce\n * that all operands of a tensor sum share the same free-index signature.\n */\nfunction freeIndicesEqual(\n a: Map<string, { upper: number; lower: number }>,\n b: Map<string, { upper: number; lower: number }>,\n): boolean {\n if (a.size !== b.size) return false;\n for (const [label, counts] of a) {\n const other = b.get(label);\n if (!other) return false;\n if (other.upper !== counts.upper || other.lower !== counts.lower) return false;\n }\n return true;\n}\n\n/**\n * Human-readable summary of a freeIndices map for use in error messages.\n * Empty map renders as `{}` so a tensor-vs-scalar mismatch is visually\n * obvious in the thrown FreeIndexMismatchError text.\n */\nfunction formatFreeIndices(m: Map<string, { upper: number; lower: number }>): string {\n if (m.size === 0) return '{}';\n const parts: string[] = [];\n for (const [label, counts] of m) {\n parts.push(`${label}:{upper:${counts.upper},lower:${counts.lower}}`);\n }\n return `{${parts.join(', ')}}`;\n}\n\n/**\n * Merge every `{label → counts}` entry from `source` into `target`,\n * overwriting any existing entry for the same label. One helper for the\n * `for (const [label, counts] of …) target.set(label, counts)` loop that\n * the `infer()` switch arms each used to carry.\n *\n * The semantics are an \"overwrite-style\" merge — child results are\n * authoritative when their labels collide with the parent context.\n * (This matches the original inline-loop behaviour. There is NO\n * accumulating `.upper +=` variant anywhere in `validator.ts`.)\n *\n * @internal\n */\nfunction mergeFreeIndices(\n target: Map<string, { upper: number; lower: number }>,\n source: Map<string, { upper: number; lower: number }>,\n): void {\n for (const [label, counts] of source) {\n target.set(label, counts);\n }\n}\n\n/**\n * Infer an arg's dimension and capture its LOCAL freeIndices map. Used by\n * `op '+'` / `'-'` (to compare maps across args) and by `op '*'` / `'/'` /\n * `'^'` (to reject any tensor-valued operand). The arg's freeIndices are\n * NOT merged into `ctx.freeIndices` here — the caller decides whether to\n * merge (op '+' merges after equality check) or discard (op '*' rejects).\n *\n * Violations from the arg's subtree are forwarded to `ctx.violations`, so\n * error reports stay coherent with the rest of the walker.\n */\nfunction inferArgLocal(\n node: ExprNode,\n ctx: InferContext,\n segment: string,\n): { dim: Dimension | null; freeIndices: Map<string, { upper: number; lower: number }> } {\n const localFI = new Map<string, { upper: number; lower: number }>();\n const localCtx: InferContext = {\n path: joinPath(ctx.path, segment),\n violations: ctx.violations,\n freeIndices: localFI,\n };\n const dim = infer(node, localCtx);\n return { dim, freeIndices: localFI };\n}\n\n/**\n * Resolve a child node for `computeContraction` — returns a LOCAL\n * `{dim, freeIndices}` result with no shared mutable state. This is the\n * cycle-breaker and nested-safety primitive: it lets tensor-product\n * recursion avoid touching `ctx.freeIndices` for any subtree.\n *\n * - tensor-symbol → forwards to `validateTensorSymbol` (returns a local Map).\n * - tensor-product → recurses into `computeContraction` with this same\n * resolver, threading violations + path through `parentCtx` so error\n * reports stay informative.\n * - all other kinds → invoke `infer()` against a throwaway context so the\n * dimension is computed but no free-indices state leaks; non-tensor\n * nodes contribute an empty freeIndices map.\n *\n * Violations from non-tensor children DO get appended to `parentCtx.violations`\n * (via the throwaway ctx's violations array, which we then splice in). This\n * keeps error reporting equivalent to the inline-recursion shape used by\n * the scalar `op` / `integral` / `derivative` cases.\n */\nfunction resolveChildForContraction(\n node: ExprNode,\n parentCtx: InferContext,\n): ChildValidationResult {\n if (node.kind === 'tensor-symbol') {\n return validateTensorSymbol(node);\n }\n if (node.kind === 'metric-tensor') {\n return validateMetricTensor(node);\n }\n if (node.kind === 'kronecker-delta') {\n return validateKroneckerDelta(node);\n }\n if (node.kind === 'tensor-product') {\n return computeContraction(node.args, (grandchild) =>\n resolveChildForContraction(grandchild, parentCtx),\n );\n }\n // Non-tensor child: use `infer()` for dimension only. Use a throwaway\n // freeIndices map (discarded) but forward violations to the parent so\n // error reports remain coherent.\n const probe: InferContext = {\n path: parentCtx.path,\n violations: parentCtx.violations,\n freeIndices: new Map(),\n };\n const dim = infer(node, probe);\n if (dim === null) {\n // Surface as an error rather than silently producing a malformed\n // ContractionResult. The probe already recorded the violation in\n // parentCtx.violations, so the message here is the second signal.\n // Subclass of UPTError (§14.7) so downstream consumers can\n // discriminate UPT-source errors uniformly with `instanceof UPTError`.\n throw new TensorProductChildInferenceError(\n 'tensor-product: a non-tensor operand failed dimension inference; ' +\n 'see ValidationResult.violations for the underlying cause.',\n );\n }\n return { dim, freeIndices: probe.freeIndices };\n}\n\n/**\n * Resolve a child of a tensor-partial-derivative to its local\n * {dim, freeIndices, role?} carrier. Same shape as\n * `resolveChildForContraction` but returns role-aware result so the\n * pderiv validator can pass through `of.role` (Design §13 Q1).\n */\nfunction resolveChildForPartialDerivative(\n typed: ExprNode,\n parentCtx: InferContext,\n): PartialDerivativeChildResult {\n if (typed.kind === 'tensor-symbol') {\n const result = validateTensorSymbol(typed);\n return { dim: result.dim, freeIndices: result.freeIndices, role: typed.role };\n }\n if (typed.kind === 'metric-tensor') {\n const result = validateMetricTensor(typed);\n return { dim: result.dim, freeIndices: result.freeIndices };\n }\n if (typed.kind === 'kronecker-delta') {\n const result = validateKroneckerDelta(typed);\n return { dim: result.dim, freeIndices: result.freeIndices };\n }\n if (typed.kind === 'tensor-partial-derivative') {\n const result = validatePartialDerivative(typed, (grandchild) =>\n resolveChildForPartialDerivative(grandchild, parentCtx),\n );\n return result;\n }\n // For scalars / op / integral / derivative / tensor-product nodes, use\n // inferArgLocal for dim + freeIndices, no role.\n const probe = inferArgLocal(typed, parentCtx, '<pderiv-child>');\n if (probe.dim === null) {\n throw new TensorProductChildInferenceError(\n 'tensor-partial-derivative child failed dimension inference; ' +\n 'see ValidationResult.violations for cause.',\n );\n }\n return { dim: probe.dim, freeIndices: probe.freeIndices };\n}\n\n/**\n * Recursive dimension inference. On any sub-expression error we record a\n * violation, return `null`, and let parent ops propagate the null up.\n */\n/** A decimal literal: an optional sign, digits with an optional fraction, an optional exponent. */\nconst DECIMAL_LITERAL = /^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?$/;\n/** The scalar operators an `op` node may carry; anything else is a violation, not a sum. */\nconst SCALAR_OPS: ReadonlySet<string> = new Set(['^', '*', '/', '+', '-']);\n/** The `TranscendentalFn` union, as a runtime set for a node built from JSON. */\nconst TRANSCENDENTAL_FNS: ReadonlySet<string> = new Set(['exp', 'ln', 'log2', 'log10', 'sin', 'cos', 'tan', 'sinh', 'cosh', 'tanh']);\n\n/**\n * A literal exponent: a symbol whose name is a decimal literal and whose\n * dimension is dimensionless. The name is the number; the dimension says it\n * is a number and not a quantity that happens to be spelled with digits.\n */\nfunction isLiteralExponent(node: { readonly name: string; readonly dim: Dimension }): boolean {\n return DECIMAL_LITERAL.test(node.name) && equals(node.dim, DIMENSIONLESS);\n}\n\nfunction infer(node: ExprNode, ctx: InferContext): Dimension | null {\n switch (node.kind) {\n case 'symbol':\n return node.dim;\n\n case 'op': {\n if (!SCALAR_OPS.has(node.op)) {\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: DIMENSIONLESS,\n note: `unknown operator '${String(node.op)}'; the operators are ^ * / + -`,\n });\n return null;\n }\n if (node.op === '^') {\n // a^n — base is an arbitrary expression. A numeric-literal exponent\n // works on any base (power(baseDim, n)). A non-literal (input-dependent)\n // exponent is supported ONLY on a DIMENSIONLESS base (v0.13), where the\n // result is dimensionless regardless of the exponent's value.\n if (node.args.length !== 2) {\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: DIMENSIONLESS,\n note: `^ requires exactly 2 args (base, exponent), got ${node.args.length}`,\n });\n return null;\n }\n const [baseNode, expNode] = node.args;\n // Per Part-VII §VII.5: '^' is a scalar operator. Capture the base's\n // local freeIndices and reject if non-empty (tensor base).\n const baseProbe = inferArgLocal(baseNode, ctx, 'args[0]');\n const baseDim = baseProbe.dim;\n if (baseDim === null) return null;\n if (baseProbe.freeIndices.size > 0) {\n throw new TensorInScalarOpError('^');\n }\n // Classify the exponent. A numeric-literal symbol supports a\n // DIMENSIONFUL base (e.g. c^3, r_s = …/c^2). A literal is a decimal\n // literal (`2`, `-1`, `0.5`, `1e-3`) carried by a DIMENSIONLESS\n // symbol: `''`, `' '` and `'0x2'` are not literals, and a `2` that\n // carries a dimension is a dimensioned exponent, which no base takes.\n if (expNode !== undefined && expNode.kind === 'symbol' && isLiteralExponent(expNode)) {\n const n = Number(expNode.name);\n // `1e400` reads as Infinity and `1e-400` as 0: neither is the exponent written.\n if (!Number.isFinite(n) || (n === 0 && !/^[+-]?0*\\.?0*(?:[eE][+-]?\\d+)?$/.test(expNode.name))) {\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: DIMENSIONLESS,\n note: `exponent '${expNode.name}' is not representable as a finite number`,\n });\n return null;\n }\n return power(baseDim, n);\n }\n\n // Non-literal (input-dependent) exponent. SOUND only when the base is\n // DIMENSIONLESS: dimensionless^(dimensionless) = dimensionless, so the\n // result dimension is statically inferable without the exponent's\n // value. (v0.13 — symbolic exponents; e.g. Hertz-Millis (T/T₀)^(−1/z).)\n if (equals(baseDim, DIMENSIONLESS)) {\n if (!expNode) return null; // arity already guarded; defensive\n const expProbe = inferArgLocal(expNode, ctx, 'args[1]');\n if (expProbe.dim === null) return null; // exponent failed — short-circuit\n if (expProbe.freeIndices.size > 0) {\n throw new TensorInScalarOpError('^'); // tensor exponent\n }\n if (!equals(expProbe.dim, DIMENSIONLESS)) {\n ctx.violations.push({\n location: joinPath(ctx.path, 'args[1]'),\n expected: DIMENSIONLESS,\n actual: expProbe.dim,\n note: '^ exponent must be dimensionless',\n });\n return null;\n }\n return DIMENSIONLESS;\n }\n\n // Dimensionful base + non-literal exponent: not statically inferable —\n // a numeric literal is required. Throwaway-probe the exponent so the\n // violation's `actual` carries its inferred dim (informative; a\n // downstream consumer keying on `equals(expected,actual)` sees the\n // mismatch). Preserves the pinned violation shape.\n let actualDim: Dimension = DIMENSIONLESS;\n if (expNode) {\n const probeCtx: InferContext = { path: joinPath(ctx.path, 'args[1]'), violations: [], freeIndices: new Map() };\n const probed = infer(expNode, probeCtx);\n if (probed !== null && okFromViolations(probeCtx.violations)) {\n actualDim = probed;\n }\n }\n ctx.violations.push({\n location: joinPath(ctx.path, 'args[1]'),\n expected: DIMENSIONLESS,\n actual: actualDim,\n note: '^ exponent must be a numeric literal symbol unless the base is dimensionless',\n });\n return null;\n }\n\n if (node.op === '*' || node.op === '/') {\n if (node.args.length === 0) return DIMENSIONLESS;\n // Per Part-VII §VII.5: '*' / '/' are scalar-only operators. Any\n // arg with non-empty freeIndices is rejected with\n // TensorInScalarOpError; users must use 'tensor-product' for\n // tensor multiplication. Scalar-only operand lists retain the\n // existing dim-accumulation behavior.\n let acc: Dimension | null = null;\n for (let i = 0; i < node.args.length; i++) {\n const probe = inferArgLocal(node.args[i], ctx, `args[${i}]`);\n const childDim = probe.dim;\n if (childDim === null) return null;\n if (probe.freeIndices.size > 0) {\n throw new TensorInScalarOpError(node.op);\n }\n if (i === 0) acc = childDim;\n else if (node.op === '*') acc = multiply(acc!, childDim);\n else acc = divide(acc!, childDim);\n }\n return acc;\n }\n\n // '+' or '-' — all operands must share a common dimension AND\n // (per Part-VII §VII.5) the same freeIndices signature. Mismatched\n // free-index maps raise FreeIndexMismatchError; this catches both\n // tensor + scalar (one map non-empty, one empty) and tensor + tensor\n // with differing variance / labels / counts.\n if (node.args.length === 0) return DIMENSIONLESS;\n let acc: Dimension | null = null;\n let firstFI: Map<string, { upper: number; lower: number }> | null = null;\n for (let i = 0; i < node.args.length; i++) {\n // A literal zero is the additive identity and carries no dimension of\n // its own. Numbers are dimensionless symbols in this grammar, so\n // without this `x = 0`, written `x - 0`, could never validate.\n if (isDimensionlessZeroLiteral(node.args[i])) continue;\n const probe = inferArgLocal(node.args[i], ctx, `args[${i}]`);\n const childDim = probe.dim;\n if (childDim === null) return null;\n if (acc === null) {\n acc = childDim;\n firstFI = probe.freeIndices;\n } else {\n if (!freeIndicesEqual(firstFI!, probe.freeIndices)) {\n throw new FreeIndexMismatchError(\n `op '${node.op}' args have mismatched freeIndices: ` +\n `args[0] has ${formatFreeIndices(firstFI!)} but ` +\n `args[${i}] has ${formatFreeIndices(probe.freeIndices)}. ` +\n `All operands of a tensor sum must share the same free-index signature.`,\n );\n }\n try {\n acc = node.op === '+' ? add(acc!, childDim) : subtract(acc!, childDim);\n } catch (err) {\n if (err instanceof DimensionMismatchError) {\n ctx.violations.push({\n location: joinPath(ctx.path, `args[${i}]`),\n expected: acc!,\n actual: childDim,\n note: `Cannot ${node.op === '+' ? 'add' : 'subtract'} ${format(childDim)} with running ${format(acc!)} (dimension mismatch).`,\n });\n return null;\n }\n throw err;\n }\n }\n }\n // Propagate the (shared) freeIndices signature to the parent ctx so\n // a tensor-sum can flow into another tensor-aware operator above.\n if (firstFI !== null) {\n mergeFreeIndices(ctx.freeIndices, firstFI);\n }\n return acc ?? DIMENSIONLESS;\n }\n\n case 'integral': {\n // ∫ f dx — result has dim(f) * dim(x).\n // Guard against malformed nodes loaded from JSON / hand-built test\n // fixtures that omit `integrand` or `over` (TypeScript requires them\n // but `as unknown as ExprNode` casts can bypass the check).\n if (!node.integrand || !node.over) {\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: DIMENSIONLESS,\n note: `integral requires both 'integrand' and 'over' fields`,\n });\n return null;\n }\n // v0.3.1 audit fix: shallow `{ ...ctx, path }` shared ctx.freeIndices\n // (a Map, copied by reference), so a tensor-valued integrand silently\n // leaked its free indices into the parent accumulator. Use\n // inferArgLocal() to give each child a fresh local freeIndices Map.\n // v0.3.0 has no tensor-integral semantics; the operator is dimensional\n // scalar and child free-indices stay local.\n const fProbe = inferArgLocal(node.integrand, ctx, 'integrand');\n const xProbe = inferArgLocal(node.over, ctx, 'over');\n if (fProbe.dim === null || xProbe.dim === null) return null;\n // Definite integral: the bounds are points on the integration axis, so\n // each must carry the integration variable's dimension.\n for (const [bound, label] of [\n [node.lower, 'lower'] as const,\n [node.upper, 'upper'] as const,\n ]) {\n if (!bound) continue;\n const bProbe = inferArgLocal(bound, ctx, label);\n if (bProbe.dim === null) return null;\n if (!equals(bProbe.dim, xProbe.dim)) {\n ctx.violations.push({\n location: joinPath(ctx.path, label),\n expected: xProbe.dim,\n actual: bProbe.dim,\n note: `integral ${label} bound must match the integration variable's dimension`,\n });\n return null;\n }\n }\n return multiply(fProbe.dim, xProbe.dim);\n }\n\n case 'derivative': {\n // d f / d x — result has dim(f) / dim(x).\n // Same shape guard as `integral` above.\n if (!node.of || !node.wrt) {\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: DIMENSIONLESS,\n note: `derivative requires both 'of' and 'wrt' fields`,\n });\n return null;\n }\n // v0.3.1 audit fix: same shallow-spread ctx.freeIndices leak as the\n // integral case above. Use inferArgLocal() so a tensor-valued `of`\n // doesn't bleed its free indices into the parent. v0.3.0 has no\n // tensor-derivative semantics (tensor-partial-derivative is the\n // dedicated node for that); this `derivative` node stays dimensional\n // scalar.\n const fProbe = inferArgLocal(node.of, ctx, 'of');\n const xProbe = inferArgLocal(node.wrt, ctx, 'wrt');\n if (fProbe.dim === null || xProbe.dim === null) return null;\n return divide(fProbe.dim, xProbe.dim);\n }\n\n case 'dirac-delta': {\n // δ(x) — Dirac-delta correlator primitive (v0.14). Since ∫δ(x)dx=1 is\n // dimensionless, [δ(x)] = [x]⁻¹ = power(dim(arg), -1). A dimensionless\n // arg gives a dimensionless δ (power of DIMENSIONLESS is DIMENSIONLESS).\n // Scalar operator: a tensor-valued arg is rejected by inferArgLocal via\n // TensorInScalarOpError; free indices stay local (not merged to parent).\n if (!node.arg) {\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: DIMENSIONLESS,\n note: `dirac-delta requires an 'arg' field`,\n });\n return null;\n }\n const argProbe = inferArgLocal(node.arg, ctx, 'arg');\n if (argProbe.dim === null) return null;\n if (argProbe.freeIndices.size > 0) {\n throw new TensorInScalarOpError('dirac-delta');\n }\n return power(argProbe.dim, -1);\n }\n\n case 'variational-derivative': {\n // δF/δφ — functional derivative primitive (v0.14). From the defining\n // relation δF = ∫ (δF/δφ) δφ dμ we get [F] = [δF/δφ]·[φ]·[μ], so\n // [δF/δφ] = [F]/([φ]·[μ]) = divide(divide([F],[φ]),[μ]). `over` carries\n // the integration-measure dimension [dμ] whose one integration the\n // variational derivative undoes (the dual of `integral`, which MULTIPLIES\n // by [over]). Scalar operator: tensor children rejected by inferArgLocal.\n if (!node.functional || !node.field || !node.over) {\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: DIMENSIONLESS,\n note: `variational-derivative requires 'functional', 'field', and 'over' fields`,\n });\n return null;\n }\n const fnProbe = inferArgLocal(node.functional, ctx, 'functional');\n const phiProbe = inferArgLocal(node.field, ctx, 'field');\n const muProbe = inferArgLocal(node.over, ctx, 'over');\n if (fnProbe.dim === null || phiProbe.dim === null || muProbe.dim === null) {\n return null;\n }\n if (\n fnProbe.freeIndices.size > 0 ||\n phiProbe.freeIndices.size > 0 ||\n muProbe.freeIndices.size > 0\n ) {\n throw new TensorInScalarOpError('variational-derivative');\n }\n return divide(divide(fnProbe.dim, phiProbe.dim), muProbe.dim);\n }\n\n case 'transcendental': {\n if (!TRANSCENDENTAL_FNS.has(node.fn)) {\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: DIMENSIONLESS,\n note: `unknown transcendental function '${String(node.fn)}'; the functions are ${[...TRANSCENDENTAL_FNS].join(', ')}`,\n });\n return null;\n }\n // exp/ln/logₙ/sin/cos/tan/sinh/cosh/tanh of a DIMENSIONLESS argument is\n // DIMENSIONLESS (the function's Taylor series only sums across like\n // dimensions when its argument is dimensionless). A dimensionful argument\n // is a dimension violation; a tensor-valued argument is rejected (scalar\n // operator), mirroring dirac-delta.\n if (!node.arg) {\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: DIMENSIONLESS,\n note: `transcendental '${node.fn}' requires an 'arg' field`,\n });\n return null;\n }\n const argProbe = inferArgLocal(node.arg, ctx, 'arg');\n if (argProbe.dim === null) return null;\n if (argProbe.freeIndices.size > 0) {\n throw new TensorInScalarOpError('transcendental');\n }\n if (!equals(argProbe.dim, DIMENSIONLESS)) {\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: argProbe.dim,\n note: `transcendental '${node.fn}' requires a dimensionless argument`,\n });\n return null;\n }\n return DIMENSIONLESS;\n }\n\n case 'abs': {\n // |x| is dimension-PRESERVING: [|x|] = [x]. Scalar operator (a tensor arg\n // is rejected, mirroring dirac-delta / transcendental).\n if (!node.arg) {\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: DIMENSIONLESS,\n note: `abs requires an 'arg' field`,\n });\n return null;\n }\n const argProbe = inferArgLocal(node.arg, ctx, 'arg');\n if (argProbe.dim === null) return null;\n if (argProbe.freeIndices.size > 0) {\n throw new TensorInScalarOpError('abs');\n }\n return argProbe.dim;\n }\n\n case 'tensor-symbol': {\n // Real validation per Part-VII §VII.4. Builds the free-indices map\n // from declared indices and merges into the context accumulator so\n // the root validate() call sees them in its ValidationResult.\n const { dim, freeIndices } = validateTensorSymbol(node);\n mergeFreeIndices(ctx.freeIndices, freeIndices);\n return dim;\n }\n\n case 'tensor-product': {\n // Task 6 — Einstein contraction. We delegate the algebra to the\n // pure `computeContraction(args, validateChild)` helper in tensor.ts\n // and inject `validateChild` to break the module cycle that would\n // otherwise arise from tensor.ts importing the validator.\n //\n // CRITICAL: every nested call uses *local* freeIndices maps; we never\n // mutate ctx.freeIndices from inside the recursion. Only the outer-\n // most tensor-product case merges its final residual map into the\n // shared ctx.freeIndices accumulator. This is what makes\n // (A·B)·C-style nested products correct: the inner product's dummy\n // indices stay scoped to the inner call.\n // Errors from the contraction (IndexLabelCollisionError,\n // VarianceMismatchError) are part of the public surface and propagate\n // so callers / tests can catch by type.\n const result = computeContraction(node.args, (child) =>\n resolveChildForContraction(child, ctx),\n );\n mergeFreeIndices(ctx.freeIndices, result.freeIndices);\n return result.dim;\n }\n\n case 'metric-tensor': {\n const { dim, freeIndices } = validateMetricTensor(node);\n mergeFreeIndices(ctx.freeIndices, freeIndices);\n return dim;\n }\n\n case 'kronecker-delta': {\n const { dim, freeIndices } = validateKroneckerDelta(node);\n mergeFreeIndices(ctx.freeIndices, freeIndices);\n return dim;\n }\n\n case 'tensor-partial-derivative': {\n const result = validatePartialDerivative(node, (child) =>\n resolveChildForPartialDerivative(child, ctx),\n );\n mergeFreeIndices(ctx.freeIndices, result.freeIndices);\n return result.dim;\n }\n\n case 'covariant-derivative': {\n // Same child kinds as a partial derivative, so it reuses that resolver.\n const result = validateCovariantDerivative(node, (child) =>\n resolveChildForPartialDerivative(child, ctx),\n );\n mergeFreeIndices(ctx.freeIndices, result.freeIndices);\n return result.dim;\n }\n\n // v0.6.1 Phase 2 Proposal 1 — the 11 curvature/GR-object arms\n // (riemann-tensor, ricci-tensor, einstein-tensor, bianchi-residual,\n // killing-vector, conserved-charge, stress-energy, cosmological-\n // constant, einstein-equation, weyl-tensor, kretschmann-scalar)\n // dispatch through a registry. The registry's discriminated-union\n // entry encodes three patterns (A/B/C) that capture the per-arm\n // callback-shape + freeIndices-propagate asymmetry; see\n // `validator-registry.ts` for the per-kind classification.\n case 'riemann-tensor':\n case 'ricci-tensor':\n case 'einstein-tensor':\n case 'bianchi-residual':\n case 'killing-vector':\n case 'conserved-charge':\n case 'stress-energy':\n case 'cosmological-constant':\n case 'einstein-equation':\n case 'weyl-tensor':\n case 'kretschmann-scalar': {\n const entry = lookupValidatorEntry(node.kind);\n if (!entry) {\n // Defensive: should be unreachable given the `case` labels\n // above match the registry's `RegistryKind` exactly.\n throw new Error(`validator: no registry entry for ${node.kind}`);\n }\n const result = dispatchValidator(entry, node);\n if (shouldPropagateFreeIndices(entry)) {\n mergeFreeIndices(ctx.freeIndices, result.freeIndices);\n }\n return result.dim;\n }\n\n default: {\n // Exhaustiveness guard: if a future ExprNode arm is added but not\n // handled here, this branch records a shape violation rather than\n // silently returning `undefined` (which validate() would coerce to\n // `ok: true, inferredDimension: undefined` — see silent-failure F1).\n const _exhaustive: never = node;\n void _exhaustive;\n const kind = (node as { kind?: unknown })?.kind;\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: DIMENSIONLESS,\n note: `Validator: unknown ExprNode.kind ${JSON.stringify(kind)}`,\n });\n return null;\n }\n }\n}\n\n/**\n * A violation set passes iff it contains no error-severity violation.\n * Violations with `severity` absent default to 'error' (v0.3.5 §4).\n */\nfunction okFromViolations(violations: ReadonlyArray<Violation>): boolean {\n return !violations.some((v) => (v.severity ?? 'error') === 'error');\n}\n\n/**\n * A symbol whose name is a numeric literal equal to zero and whose dimension\n * is dimensionless. In a sum it is the additive identity and is skipped.\n * A \"0\" that carries a dimension is an ordinary term.\n */\nfunction isDimensionlessZeroLiteral(node: ExprNode | undefined): boolean {\n if (node === undefined || node.kind !== 'symbol' || node.name.trim() === '') return false;\n // A decimal literal zero only: `0x0`, `0b0` and a blank are not the written identity.\n if (!DECIMAL_LITERAL.test(node.name) || Number(node.name) !== 0) return false;\n const d = node.dim;\n return d.L === 0 && d.M === 0 && d.T === 0 && d.I === 0 && d.Theta === 0 && d.N === 0 && d.J === 0;\n}\n\n/**\n * Validate a single scalar/tensor `ExprNode`: infer its dimension and collect\n * any consistency violations. `ok` is true iff a dimension was inferred and no\n * error-severity violations were raised. The hot path for the whole suite.\n */\nexport function validate(expr: ExprNode): ValidationResult {\n const ctx: InferContext = { path: '', violations: [], freeIndices: new Map() };\n const dim = infer(expr, ctx);\n return {\n ok: okFromViolations(ctx.violations) && dim !== null,\n inferredDimension: dim,\n freeIndices: ctx.freeIndices,\n violations: ctx.violations,\n };\n}\n\n/**\n * Opt-in symbolic InverseMetricInconsistencyWarning check. Given a\n * lower/upper metric pair, returns a deduplicated (at most one) warning-\n * severity Violation set. v0.3.5 §7. (Deliberately not folded into\n * validate() — that is the hot path for the whole test suite.)\n */\nexport function validateInverseMetricPair(\n gLower: MetricTensorNode,\n gUpper: MetricTensorNode,\n): Violation[] {\n const note = checkInverseMetricStructure(gLower, gUpper);\n if (note === null) return [];\n return [{\n location: `${gLower.name}/${gUpper.name}`,\n expected: gLower.dim,\n actual: gUpper.dim,\n note,\n severity: 'warning',\n }];\n}\n\n/**\n * Validate an equation `lhs = rhs`: both sides must infer a dimension, the two\n * dimensions must match, and free-index valence must agree (so a tensor = scalar\n * is caught even when units match). Returns the combined `ValidationResult`.\n */\nexport function validateEquation(lhs: ExprNode, rhs: ExprNode): ValidationResult {\n const lhsCtx: InferContext = { path: 'lhs', violations: [], freeIndices: new Map() };\n const rhsCtx: InferContext = { path: 'rhs', violations: [], freeIndices: new Map() };\n const lhsDim = infer(lhs, lhsCtx);\n const rhsDim = infer(rhs, rhsCtx);\n const violations = [...lhsCtx.violations, ...rhsCtx.violations];\n\n if (lhsDim !== null && rhsDim !== null && !equals(lhsDim, rhsDim)) {\n violations.push({\n location: '<equation>',\n expected: lhsDim,\n actual: rhsDim,\n note: `LHS has ${format(lhsDim)} but RHS has ${format(rhsDim)} — equation is not dimensionally homogeneous.`,\n });\n }\n\n // Equation-level valence (free-index) homogeneity. Both sides of an\n // equation must carry the same free-index signature: a rank-2 tensor\n // cannot equal a scalar, nor A^mu equal B_mu, even when the SI dimensions\n // agree. Only checked when both sides inferred a dimension (a side that\n // already failed inference has reported its own violation). Scalar\n // equations have empty maps on both sides ⇒ no effect.\n if (\n lhsDim !== null &&\n rhsDim !== null &&\n !freeIndicesEqual(lhsCtx.freeIndices, rhsCtx.freeIndices)\n ) {\n violations.push({\n location: '<equation>',\n expected: lhsDim,\n actual: rhsDim,\n note:\n `LHS free indices ${formatFreeIndices(lhsCtx.freeIndices)} but RHS ` +\n `free indices ${formatFreeIndices(rhsCtx.freeIndices)} — equation is ` +\n `not valence-homogeneous (index/rank mismatch across '=').`,\n });\n }\n\n return {\n ok: okFromViolations(violations) && lhsDim !== null && rhsDim !== null,\n inferredDimension: lhsDim, // by convention, LHS dimension is the canonical answer\n // By convention LHS free-indices map is the canonical answer (mirrors\n // inferredDimension's LHS bias).\n freeIndices: lhsCtx.freeIndices,\n violations,\n };\n}\n"]}
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/dimensional/validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAEL,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,QAAQ,EACR,MAAM,EACN,KAAK,EACL,GAAG,EACH,QAAQ,EACR,MAAM,EACN,MAAM,EACN,sBAAsB,GACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,gCAAgC,GACjC,MAAM,aAAa,CAAC;AA4BrB,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEvE,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,wEAAwE;AACxE,sEAAsE;AACtE,kEAAkE;AAClE,gEAAgE;AAChE,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,yBAAyB,CAAC;AAkEjC,SAAS,QAAQ,CAAC,IAAY,EAAE,OAAe;IAC7C,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC;AACtD,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CACvB,CAAgD,EAChD,CAAgD;IAEhD,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACpC,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;IACjF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,CAAgD;IACzE,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,WAAW,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AACjC,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,gBAAgB,CACvB,MAAqD,EACrD,MAAqD;IAErD,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,aAAa,CACpB,IAAc,EACd,GAAiB,EACjB,OAAe;IAEf,MAAM,OAAO,GAAG,IAAI,GAAG,EAA4C,CAAC;IACpE,MAAM,QAAQ,GAAiB;QAC7B,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC;QACjC,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,WAAW,EAAE,OAAO;KACrB,CAAC;IACF,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAClC,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AACvC,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAS,0BAA0B,CACjC,IAAc,EACd,SAAuB;IAEvB,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QAClC,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QAClC,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACpC,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACnC,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,EAAE,CAClD,0BAA0B,CAAC,UAAU,EAAE,SAAS,CAAC,CAClD,CAAC;IACJ,CAAC;IACD,sEAAsE;IACtE,sEAAsE;IACtE,iCAAiC;IACjC,MAAM,KAAK,GAAiB;QAC1B,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,WAAW,EAAE,IAAI,GAAG,EAAE;KACvB,CAAC;IACF,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,iEAAiE;QACjE,iEAAiE;QACjE,kEAAkE;QAClE,2DAA2D;QAC3D,uEAAuE;QACvE,MAAM,IAAI,gCAAgC,CACxC,mEAAmE;YACjE,2DAA2D,CAC9D,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;AACjD,CAAC;AAED;;;;;GAKG;AACH,SAAS,gCAAgC,CACvC,KAAe,EACf,SAAuB;IAEvB,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IAChF,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IAC9D,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC7C,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IAC9D,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,2BAA2B,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,yBAAyB,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,EAAE,CAC7D,gCAAgC,CAAC,UAAU,EAAE,SAAS,CAAC,CACxD,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,uEAAuE;IACvE,gDAAgD;IAChD,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAChE,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,gCAAgC,CACxC,8DAA8D;YAC5D,4CAA4C,CAC/C,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;AAC5D,CAAC;AAED;;;GAGG;AACH,mGAAmG;AACnG,MAAM,eAAe,GAAG,6CAA6C,CAAC;AACtE,4FAA4F;AAC5F,MAAM,UAAU,GAAwB,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAC3E,iFAAiF;AACjF,MAAM,kBAAkB,GAAwB,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAErI;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,IAAwD;IACjF,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,KAAK,CAAC,IAAc,EAAE,GAAiB;IAC9C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC,GAAG,CAAC;QAElB,KAAK,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC7B,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;oBAClB,QAAQ,EAAE,GAAG,CAAC,IAAI;oBAClB,QAAQ,EAAE,aAAa;oBACvB,MAAM,EAAE,aAAa;oBACrB,IAAI,EAAE,qBAAqB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,gCAAgC;iBAC3E,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,IAAI,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC;gBACpB,oEAAoE;gBACpE,yEAAyE;gBACzE,wEAAwE;gBACxE,8DAA8D;gBAC9D,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC3B,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;wBAClB,QAAQ,EAAE,GAAG,CAAC,IAAI;wBAClB,QAAQ,EAAE,aAAa;wBACvB,MAAM,EAAE,aAAa;wBACrB,IAAI,EAAE,mDAAmD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;qBAC5E,CAAC,CAAC;oBACH,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;gBACtC,oEAAoE;gBACpE,2DAA2D;gBAC3D,MAAM,SAAS,GAAG,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;gBAC1D,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC;gBAC9B,IAAI,OAAO,KAAK,IAAI;oBAAE,OAAO,IAAI,CAAC;gBAClC,IAAI,SAAS,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;oBACnC,MAAM,IAAI,qBAAqB,CAAC,GAAG,CAAC,CAAC;gBACvC,CAAC;gBACD,6DAA6D;gBAC7D,oEAAoE;gBACpE,gEAAgE;gBAChE,mEAAmE;gBACnE,sEAAsE;gBACtE,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;oBACrF,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBAC/B,gFAAgF;oBAChF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;wBAC9F,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;4BAClB,QAAQ,EAAE,GAAG,CAAC,IAAI;4BAClB,QAAQ,EAAE,aAAa;4BACvB,MAAM,EAAE,aAAa;4BACrB,IAAI,EAAE,aAAa,OAAO,CAAC,IAAI,2CAA2C;yBAC3E,CAAC,CAAC;wBACH,OAAO,IAAI,CAAC;oBACd,CAAC;oBACD,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAC3B,CAAC;gBAED,sEAAsE;gBACtE,uEAAuE;gBACvE,kEAAkE;gBAClE,wEAAwE;gBACxE,IAAI,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC;oBACnC,IAAI,CAAC,OAAO;wBAAE,OAAO,IAAI,CAAC,CAAC,mCAAmC;oBAC9D,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;oBACxD,IAAI,QAAQ,CAAC,GAAG,KAAK,IAAI;wBAAE,OAAO,IAAI,CAAC,CAAC,kCAAkC;oBAC1E,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;wBAClC,MAAM,IAAI,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB;oBAC1D,CAAC;oBACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,CAAC;wBACzC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;4BAClB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC;4BACvC,QAAQ,EAAE,aAAa;4BACvB,MAAM,EAAE,QAAQ,CAAC,GAAG;4BACpB,IAAI,EAAE,kCAAkC;yBACzC,CAAC,CAAC;wBACH,OAAO,IAAI,CAAC;oBACd,CAAC;oBACD,OAAO,aAAa,CAAC;gBACvB,CAAC;gBAED,uEAAuE;gBACvE,qEAAqE;gBACrE,gEAAgE;gBAChE,mEAAmE;gBACnE,mDAAmD;gBACnD,IAAI,SAAS,GAAc,aAAa,CAAC;gBACzC,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,QAAQ,GAAiB,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;oBAC/G,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;oBACxC,IAAI,MAAM,KAAK,IAAI,IAAI,gBAAgB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC7D,SAAS,GAAG,MAAM,CAAC;oBACrB,CAAC;gBACH,CAAC;gBACD,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;oBAClB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC;oBACvC,QAAQ,EAAE,aAAa;oBACvB,MAAM,EAAE,SAAS;oBACjB,IAAI,EAAE,8EAA8E;iBACrF,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC;YACd,CAAC;YAED,IAAI,IAAI,CAAC,EAAE,KAAK,GAAG,IAAI,IAAI,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC;gBACvC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,aAAa,CAAC;gBACjD,gEAAgE;gBAChE,kDAAkD;gBAClD,6DAA6D;gBAC7D,8DAA8D;gBAC9D,sCAAsC;gBACtC,IAAI,GAAG,GAAqB,IAAI,CAAC;gBACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC1C,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;oBAC7D,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC;oBAC3B,IAAI,QAAQ,KAAK,IAAI;wBAAE,OAAO,IAAI,CAAC;oBACnC,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;wBAC/B,MAAM,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC3C,CAAC;oBACD,IAAI,CAAC,KAAK,CAAC;wBAAE,GAAG,GAAG,QAAQ,CAAC;yBACvB,IAAI,IAAI,CAAC,EAAE,KAAK,GAAG;wBAAE,GAAG,GAAG,QAAQ,CAAC,GAAI,EAAE,QAAQ,CAAC,CAAC;;wBACpD,GAAG,GAAG,MAAM,CAAC,GAAI,EAAE,QAAQ,CAAC,CAAC;gBACpC,CAAC;gBACD,OAAO,GAAG,CAAC;YACb,CAAC;YAED,8DAA8D;YAC9D,mEAAmE;YACnE,kEAAkE;YAClE,qEAAqE;YACrE,6CAA6C;YAC7C,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,aAAa,CAAC;YACjD,IAAI,GAAG,GAAqB,IAAI,CAAC;YACjC,IAAI,OAAO,GAAyD,IAAI,CAAC;YACzE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC1C,sEAAsE;gBACtE,iEAAiE;gBACjE,+DAA+D;gBAC/D,IAAI,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAAE,SAAS;gBACvD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC7D,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC;gBAC3B,IAAI,QAAQ,KAAK,IAAI;oBAAE,OAAO,IAAI,CAAC;gBACnC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;oBACjB,GAAG,GAAG,QAAQ,CAAC;oBACf,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC;gBAC9B,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,gBAAgB,CAAC,OAAQ,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;wBACnD,MAAM,IAAI,sBAAsB,CAC9B,OAAO,IAAI,CAAC,EAAE,sCAAsC;4BAClD,eAAe,iBAAiB,CAAC,OAAQ,CAAC,OAAO;4BACjD,QAAQ,CAAC,SAAS,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI;4BAC1D,wEAAwE,CAC3E,CAAC;oBACJ,CAAC;oBACD,IAAI,CAAC;wBACH,GAAG,GAAG,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAI,EAAE,QAAQ,CAAC,CAAC;oBACzE,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,IAAI,GAAG,YAAY,sBAAsB,EAAE,CAAC;4BAC1C,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;gCAClB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC;gCAC1C,QAAQ,EAAE,GAAI;gCACd,MAAM,EAAE,QAAQ;gCAChB,IAAI,EAAE,UAAU,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,CAAC,iBAAiB,MAAM,CAAC,GAAI,CAAC,wBAAwB;6BAC9H,CAAC,CAAC;4BACH,OAAO,IAAI,CAAC;wBACd,CAAC;wBACD,MAAM,GAAG,CAAC;oBACZ,CAAC;gBACH,CAAC;YACH,CAAC;YACD,oEAAoE;YACpE,kEAAkE;YAClE,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,gBAAgB,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC7C,CAAC;YACD,OAAO,GAAG,IAAI,aAAa,CAAC;QAC9B,CAAC;QAED,KAAK,UAAU,EAAE,CAAC;YAChB,uCAAuC;YACvC,mEAAmE;YACnE,qEAAqE;YACrE,4DAA4D;YAC5D,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAClC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;oBAClB,QAAQ,EAAE,GAAG,CAAC,IAAI;oBAClB,QAAQ,EAAE,aAAa;oBACvB,MAAM,EAAE,aAAa;oBACrB,IAAI,EAAE,sDAAsD;iBAC7D,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC;YACd,CAAC;YACD,sEAAsE;YACtE,sEAAsE;YACtE,2DAA2D;YAC3D,oEAAoE;YACpE,uEAAuE;YACvE,4CAA4C;YAC5C,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YACrD,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAC5D,uEAAuE;YACvE,wDAAwD;YACxD,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI;gBAC3B,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAU;gBAC9B,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAU;aAC/B,EAAE,CAAC;gBACF,IAAI,CAAC,KAAK;oBAAE,SAAS;gBACrB,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;gBAChD,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI;oBAAE,OAAO,IAAI,CAAC;gBACrC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;oBACpC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;wBAClB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC;wBACnC,QAAQ,EAAE,MAAM,CAAC,GAAG;wBACpB,MAAM,EAAE,MAAM,CAAC,GAAG;wBAClB,IAAI,EAAE,YAAY,KAAK,wDAAwD;qBAChF,CAAC,CAAC;oBACH,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YACD,OAAO,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1C,CAAC;QAED,KAAK,YAAY,EAAE,CAAC;YAClB,0CAA0C;YAC1C,wCAAwC;YACxC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC1B,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;oBAClB,QAAQ,EAAE,GAAG,CAAC,IAAI;oBAClB,QAAQ,EAAE,aAAa;oBACvB,MAAM,EAAE,aAAa;oBACrB,IAAI,EAAE,gDAAgD;iBACvD,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC;YACd,CAAC;YACD,oEAAoE;YACpE,mEAAmE;YACnE,gEAAgE;YAChE,gEAAgE;YAChE,qEAAqE;YACrE,UAAU;YACV,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YACnD,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAC5D,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC;QAED,KAAK,aAAa,EAAE,CAAC;YACnB,sEAAsE;YACtE,uEAAuE;YACvE,yEAAyE;YACzE,wEAAwE;YACxE,yEAAyE;YACzE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACd,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;oBAClB,QAAQ,EAAE,GAAG,CAAC,IAAI;oBAClB,QAAQ,EAAE,aAAa;oBACvB,MAAM,EAAE,aAAa;oBACrB,IAAI,EAAE,qCAAqC;iBAC5C,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YACrD,IAAI,QAAQ,CAAC,GAAG,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YACvC,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,qBAAqB,CAAC,aAAa,CAAC,CAAC;YACjD,CAAC;YACD,OAAO,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;QAED,KAAK,wBAAwB,EAAE,CAAC;YAC9B,qEAAqE;YACrE,iEAAiE;YACjE,wEAAwE;YACxE,mEAAmE;YACnE,0EAA0E;YAC1E,0EAA0E;YAC1E,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAClD,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;oBAClB,QAAQ,EAAE,GAAG,CAAC,IAAI;oBAClB,QAAQ,EAAE,aAAa;oBACvB,MAAM,EAAE,aAAa;oBACrB,IAAI,EAAE,0EAA0E;iBACjF,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;YAClE,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YACtD,IAAI,OAAO,CAAC,GAAG,KAAK,IAAI,IAAI,QAAQ,CAAC,GAAG,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;gBAC1E,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IACE,OAAO,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC;gBAC5B,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC;gBAC7B,OAAO,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,EAC5B,CAAC;gBACD,MAAM,IAAI,qBAAqB,CAAC,wBAAwB,CAAC,CAAC;YAC5D,CAAC;YACD,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAChE,CAAC;QAED,KAAK,gBAAgB,EAAE,CAAC;YACtB,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBACrC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;oBAClB,QAAQ,EAAE,GAAG,CAAC,IAAI;oBAClB,QAAQ,EAAE,aAAa;oBACvB,MAAM,EAAE,aAAa;oBACrB,IAAI,EAAE,oCAAoC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,wBAAwB,CAAC,GAAG,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBACtH,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC;YACd,CAAC;YACD,wEAAwE;YACxE,oEAAoE;YACpE,0EAA0E;YAC1E,yEAAyE;YACzE,oCAAoC;YACpC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACd,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;oBAClB,QAAQ,EAAE,GAAG,CAAC,IAAI;oBAClB,QAAQ,EAAE,aAAa;oBACvB,MAAM,EAAE,aAAa;oBACrB,IAAI,EAAE,mBAAmB,IAAI,CAAC,EAAE,2BAA2B;iBAC5D,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YACrD,IAAI,QAAQ,CAAC,GAAG,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YACvC,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;YACpD,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,CAAC;gBACzC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;oBAClB,QAAQ,EAAE,GAAG,CAAC,IAAI;oBAClB,QAAQ,EAAE,aAAa;oBACvB,MAAM,EAAE,QAAQ,CAAC,GAAG;oBACpB,IAAI,EAAE,mBAAmB,IAAI,CAAC,EAAE,qCAAqC;iBACtE,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,KAAK,KAAK,EAAE,CAAC;YACX,0EAA0E;YAC1E,wDAAwD;YACxD,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACd,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;oBAClB,QAAQ,EAAE,GAAG,CAAC,IAAI;oBAClB,QAAQ,EAAE,aAAa;oBACvB,MAAM,EAAE,aAAa;oBACrB,IAAI,EAAE,6BAA6B;iBACpC,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YACrD,IAAI,QAAQ,CAAC,GAAG,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YACvC,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,qBAAqB,CAAC,KAAK,CAAC,CAAC;YACzC,CAAC;YACD,OAAO,QAAQ,CAAC,GAAG,CAAC;QACtB,CAAC;QAED,KAAK,eAAe,EAAE,CAAC;YACrB,mEAAmE;YACnE,mEAAmE;YACnE,8DAA8D;YAC9D,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;YACxD,gBAAgB,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YAC/C,OAAO,GAAG,CAAC;QACb,CAAC;QAED,KAAK,gBAAgB,EAAE,CAAC;YACtB,gEAAgE;YAChE,qEAAqE;YACrE,kEAAkE;YAClE,0DAA0D;YAC1D,EAAE;YACF,sEAAsE;YACtE,oEAAoE;YACpE,kEAAkE;YAClE,yDAAyD;YACzD,mEAAmE;YACnE,yCAAyC;YACzC,yDAAyD;YACzD,sEAAsE;YACtE,wCAAwC;YACxC,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CACrD,0BAA0B,CAAC,KAAK,EAAE,GAAG,CAAC,CACvC,CAAC;YACF,gBAAgB,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YACtD,OAAO,MAAM,CAAC,GAAG,CAAC;QACpB,CAAC;QAED,KAAK,eAAe,EAAE,CAAC;YACrB,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;YACxD,gBAAgB,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YAC/C,OAAO,GAAG,CAAC;QACb,CAAC;QAED,KAAK,iBAAiB,EAAE,CAAC;YACvB,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;YAC1D,gBAAgB,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YAC/C,OAAO,GAAG,CAAC;QACb,CAAC;QAED,KAAK,2BAA2B,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,yBAAyB,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CACvD,gCAAgC,CAAC,KAAK,EAAE,GAAG,CAAC,CAC7C,CAAC;YACF,gBAAgB,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YACtD,OAAO,MAAM,CAAC,GAAG,CAAC;QACpB,CAAC;QAED,KAAK,sBAAsB,EAAE,CAAC;YAC5B,wEAAwE;YACxE,MAAM,MAAM,GAAG,2BAA2B,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CACzD,gCAAgC,CAAC,KAAK,EAAE,GAAG,CAAC,CAC7C,CAAC;YACF,gBAAgB,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YACtD,OAAO,MAAM,CAAC,GAAG,CAAC;QACpB,CAAC;QAED,8DAA8D;QAC9D,oEAAoE;QACpE,iEAAiE;QACjE,gEAAgE;QAChE,kEAAkE;QAClE,gEAAgE;QAChE,wDAAwD;QACxD,2DAA2D;QAC3D,KAAK,gBAAgB,CAAC;QACtB,KAAK,cAAc,CAAC;QACpB,KAAK,iBAAiB,CAAC;QACvB,KAAK,kBAAkB,CAAC;QACxB,KAAK,gBAAgB,CAAC;QACtB,KAAK,kBAAkB,CAAC;QACxB,KAAK,eAAe,CAAC;QACrB,KAAK,uBAAuB,CAAC;QAC7B,KAAK,mBAAmB,CAAC;QACzB,KAAK,aAAa,CAAC;QACnB,KAAK,oBAAoB,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,2DAA2D;gBAC3D,qDAAqD;gBACrD,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACnE,CAAC;YACD,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC9C,IAAI,0BAA0B,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtC,gBAAgB,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YACxD,CAAC;YACD,OAAO,MAAM,CAAC,GAAG,CAAC;QACpB,CAAC;QAED,SAAS,CAAC;YACR,kEAAkE;YAClE,kEAAkE;YAClE,mEAAmE;YACnE,qEAAqE;YACrE,MAAM,WAAW,GAAU,IAAI,CAAC;YAChC,KAAK,WAAW,CAAC;YACjB,MAAM,IAAI,GAAI,IAA2B,EAAE,IAAI,CAAC;YAChD,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;gBAClB,QAAQ,EAAE,GAAG,CAAC,IAAI;gBAClB,QAAQ,EAAE,aAAa;gBACvB,MAAM,EAAE,aAAa;gBACrB,IAAI,EAAE,oCAAoC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;aACjE,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,UAAoC;IAC5D,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC;AACtE,CAAC;AAED;;;;GAIG;AACH,SAAS,0BAA0B,CAAC,IAA0B;IAC5D,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IAC1F,sFAAsF;IACtF,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9E,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;IACnB,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACrG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAc;IACrC,MAAM,GAAG,GAAiB,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IAC/E,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC7B,OAAO;QACL,EAAE,EAAE,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,KAAK,IAAI;QACpD,iBAAiB,EAAE,GAAG;QACtB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,UAAU,EAAE,GAAG,CAAC,UAAU;KAC3B,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAAwB,EACxB,MAAwB;IAExB,MAAM,IAAI,GAAG,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzD,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7B,OAAO,CAAC;YACN,QAAQ,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE;YACzC,QAAQ,EAAE,MAAM,CAAC,GAAG;YACpB,MAAM,EAAE,MAAM,CAAC,GAAG;YAClB,IAAI;YACJ,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAa,EAAE,GAAa;IAC3D,MAAM,MAAM,GAAiB,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IACrF,MAAM,MAAM,GAAiB,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IACrF,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,UAAU,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAEhE,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;QAClE,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,MAAM;YAChB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,WAAW,MAAM,CAAC,MAAM,CAAC,gBAAgB,MAAM,CAAC,MAAM,CAAC,+CAA+C;SAC7G,CAAC,CAAC;IACL,CAAC;IAED,oEAAoE;IACpE,qEAAqE;IACrE,0EAA0E;IAC1E,wEAAwE;IACxE,mEAAmE;IACnE,uDAAuD;IACvD,IACE,MAAM,KAAK,IAAI;QACf,MAAM,KAAK,IAAI;QACf,CAAC,gBAAgB,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,EACzD,CAAC;QACD,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,MAAM;YAChB,MAAM,EAAE,MAAM;YACd,IAAI,EACF,oBAAoB,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW;gBACpE,gBAAgB,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,iBAAiB;gBACtE,2DAA2D;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,EAAE,EAAE,gBAAgB,CAAC,UAAU,CAAC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI;QACtE,iBAAiB,EAAE,MAAM,EAAE,uDAAuD;QAClF,sEAAsE;QACtE,iCAAiC;QACjC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,UAAU;KACX,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Validator: walks an ExprNode tree and infers / checks SI dimensions.\n *\n * Honest-claude scope notes:\n * - Tensor index structure IS tracked: tensor-symbol / tensor-product\n * nodes carry free-index (upper/lower) signatures, contraction is\n * enforced, and `validateEquation` now checks valence homogeneity\n * across '=' (so the spec's Bridge Eq 17 rank mismatch — a tensor\n * equated to a scalar — is caught even when the SI dimensions agree).\n * - Transcendental nodes (exp, ln, log, trig): the argument must be\n * dimensionless. A dimensioned argument is an error-severity violation;\n * a tensor argument throws `TensorInScalarOpError`.\n *\n * @module dimensional/validator\n */\n\nimport {\n Dimension,\n DIMENSIONLESS,\n} from './types.js';\nimport {\n multiply,\n divide,\n power,\n add,\n subtract,\n equals,\n format,\n DimensionMismatchError,\n} from './algebra.js';\nimport {\n TensorInScalarOpError,\n FreeIndexMismatchError,\n TensorProductChildInferenceError,\n} from './errors.js';\n// All AST node types + ExprNode + TranscendentalFn now live in the leaf\n// `ast-types.ts` (consolidated to break the validator↔tensor / validator↔\n// curvature type-only cycles). The per-kind VALIDATION FUNCTIONS still live in\n// their modules and are value-imported below (one-way edges — those modules no\n// longer import validator).\nimport type {\n ExprNode,\n TranscendentalFn,\n TensorSymbolNode,\n TensorProductNode,\n MetricTensorNode,\n KroneckerDeltaNode,\n TensorPartialDerivativeNode,\n CovariantDerivativeNode,\n RiemannTensorNode,\n RicciTensorNode,\n EinsteinTensorNode,\n BianchiResidualNode,\n KillingVectorNode,\n ConservedChargeNode,\n StressEnergyTensorNode,\n CosmologicalConstantNode,\n EinsteinFieldEquationNode,\n WeylTensorNode,\n KretschmannScalarNode,\n} from './ast-types.js';\nimport type { ChildValidationResult } from './tensor.js';\nimport { validateTensorSymbol, computeContraction } from './tensor.js';\nimport type { PartialDerivativeChildResult } from './metric-validators.js';\nimport {\n validateMetricTensor,\n validateKroneckerDelta,\n validatePartialDerivative,\n checkInverseMetricStructure,\n} from './metric-validators.js';\nimport { validateCovariantDerivative } from './connection-validators.js';\n// v0.6.1 Phase 2: 11-arm curvature/GR-object dispatch consolidated into\n// the validator-registry module. The individual `validateX` functions\n// are still imported by validator-registry.ts (which the registry\n// indexes); validator.ts now only needs the dispatcher helpers.\nimport {\n lookupValidatorEntry,\n dispatchValidator,\n shouldPropagateFreeIndices,\n} from './validator-registry.js';\n\n// `ExprNode`, `TranscendentalFn`, and every node/index type now live in the\n// leaf `ast-types.ts`. They are re-exported here so the ~100 consumers that\n// import `{ ExprNode, … }` from `./validator.js` are unchanged.\nexport type {\n ExprNode,\n TranscendentalFn,\n TensorSymbolNode,\n TensorProductNode,\n TensorIndex,\n Variance,\n Role,\n MetricTensorNode,\n KroneckerDeltaNode,\n TensorPartialDerivativeNode,\n CovariantIndex,\n UpperIndex,\n CovariantDerivativeNode,\n RiemannTensorNode,\n RicciTensorNode,\n EinsteinTensorNode,\n BianchiResidualNode,\n KillingVectorNode,\n ConservedChargeNode,\n StressEnergyTensorNode,\n CosmologicalConstantNode,\n EinsteinFieldEquationNode,\n WeylTensorNode,\n KretschmannScalarNode,\n} from './ast-types.js';\n\n/** One dimensional violation that validation found in an expression. */\nexport interface Violation {\n /** Tree path, e.g. \"args[1].args[0]\". Empty string for the root. */\n location: string;\n expected: Dimension;\n actual: Dimension;\n note: string;\n /** v0.3.5: absent ⇒ 'error'. 'warning'-severity violations do not fail\n * validation (ValidationResult.ok stays true) but are still reported. */\n severity?: 'error' | 'warning';\n}\n\n/** The result of validating one expression: its verdict, dimension, free indices and violations. */\nexport interface ValidationResult {\n ok: boolean;\n inferredDimension: Dimension | null;\n /** Map of free (uncontracted) index labels to their upper/lower counts.\n * Empty for scalar expressions. Populated by tensor-symbol /\n * tensor-product validation (Tasks 5 and 6). */\n freeIndices: Map<string, { upper: number; lower: number }>;\n violations: Violation[];\n}\n\ninterface InferContext {\n path: string;\n violations: Violation[];\n /** Free-indices accumulator for the root expression. Tensor-aware node\n * cases (tensor-symbol, tensor-product) populate this; scalar cases\n * leave it alone. validate() reads it after walking to construct the\n * ValidationResult.freeIndices map. Shared by reference across the\n * recursion so sibling subtrees can contribute. */\n freeIndices: Map<string, { upper: number; lower: number }>;\n}\n\nfunction joinPath(path: string, segment: string): string {\n return path === '' ? segment : `${path}.${segment}`;\n}\n\n/**\n * Structural equality for freeIndices maps. Two maps are equal iff they\n * contain the same label set and each label's `{upper, lower}` counts\n * match. Used by `op '+'` / `'-'` (Task 7 / Part-VII §VII.5) to enforce\n * that all operands of a tensor sum share the same free-index signature.\n */\nfunction freeIndicesEqual(\n a: Map<string, { upper: number; lower: number }>,\n b: Map<string, { upper: number; lower: number }>,\n): boolean {\n if (a.size !== b.size) return false;\n for (const [label, counts] of a) {\n const other = b.get(label);\n if (!other) return false;\n if (other.upper !== counts.upper || other.lower !== counts.lower) return false;\n }\n return true;\n}\n\n/**\n * Human-readable summary of a freeIndices map for use in error messages.\n * Empty map renders as `{}` so a tensor-vs-scalar mismatch is visually\n * obvious in the thrown FreeIndexMismatchError text.\n */\nfunction formatFreeIndices(m: Map<string, { upper: number; lower: number }>): string {\n if (m.size === 0) return '{}';\n const parts: string[] = [];\n for (const [label, counts] of m) {\n parts.push(`${label}:{upper:${counts.upper},lower:${counts.lower}}`);\n }\n return `{${parts.join(', ')}}`;\n}\n\n/**\n * Merge every `{label → counts}` entry from `source` into `target`,\n * overwriting any existing entry for the same label. One helper for the\n * `for (const [label, counts] of …) target.set(label, counts)` loop that\n * the `infer()` switch arms each used to carry.\n *\n * The semantics are an \"overwrite-style\" merge — child results are\n * authoritative when their labels collide with the parent context.\n * (This matches the original inline-loop behaviour. There is NO\n * accumulating `.upper +=` variant anywhere in `validator.ts`.)\n *\n * @internal\n */\nfunction mergeFreeIndices(\n target: Map<string, { upper: number; lower: number }>,\n source: Map<string, { upper: number; lower: number }>,\n): void {\n for (const [label, counts] of source) {\n target.set(label, counts);\n }\n}\n\n/**\n * Infer an arg's dimension and capture its LOCAL freeIndices map. Used by\n * `op '+'` / `'-'` (to compare maps across args) and by `op '*'` / `'/'` /\n * `'^'` (to reject any tensor-valued operand). The arg's freeIndices are\n * NOT merged into `ctx.freeIndices` here — the caller decides whether to\n * merge (op '+' merges after equality check) or discard (op '*' rejects).\n *\n * Violations from the arg's subtree are forwarded to `ctx.violations`, so\n * error reports stay coherent with the rest of the walker.\n */\nfunction inferArgLocal(\n node: ExprNode,\n ctx: InferContext,\n segment: string,\n): { dim: Dimension | null; freeIndices: Map<string, { upper: number; lower: number }> } {\n const localFI = new Map<string, { upper: number; lower: number }>();\n const localCtx: InferContext = {\n path: joinPath(ctx.path, segment),\n violations: ctx.violations,\n freeIndices: localFI,\n };\n const dim = infer(node, localCtx);\n return { dim, freeIndices: localFI };\n}\n\n/**\n * Resolve a child node for `computeContraction` — returns a LOCAL\n * `{dim, freeIndices}` result with no shared mutable state. This is the\n * cycle-breaker and nested-safety primitive: it lets tensor-product\n * recursion avoid touching `ctx.freeIndices` for any subtree.\n *\n * - tensor-symbol → forwards to `validateTensorSymbol` (returns a local Map).\n * - tensor-product → recurses into `computeContraction` with this same\n * resolver, threading violations + path through `parentCtx` so error\n * reports stay informative.\n * - all other kinds → invoke `infer()` against a throwaway context so the\n * dimension is computed but no free-indices state leaks; non-tensor\n * nodes contribute an empty freeIndices map.\n *\n * Violations from non-tensor children DO get appended to `parentCtx.violations`\n * (via the throwaway ctx's violations array, which we then splice in). This\n * keeps error reporting equivalent to the inline-recursion shape used by\n * the scalar `op` / `integral` / `derivative` cases.\n */\nfunction resolveChildForContraction(\n node: ExprNode,\n parentCtx: InferContext,\n): ChildValidationResult {\n if (node.kind === 'tensor-symbol') {\n return validateTensorSymbol(node);\n }\n if (node.kind === 'metric-tensor') {\n return validateMetricTensor(node);\n }\n if (node.kind === 'kronecker-delta') {\n return validateKroneckerDelta(node);\n }\n if (node.kind === 'tensor-product') {\n return computeContraction(node.args, (grandchild) =>\n resolveChildForContraction(grandchild, parentCtx),\n );\n }\n // Non-tensor child: use `infer()` for dimension only. Use a throwaway\n // freeIndices map (discarded) but forward violations to the parent so\n // error reports remain coherent.\n const probe: InferContext = {\n path: parentCtx.path,\n violations: parentCtx.violations,\n freeIndices: new Map(),\n };\n const dim = infer(node, probe);\n if (dim === null) {\n // Surface as an error rather than silently producing a malformed\n // ContractionResult. The probe already recorded the violation in\n // parentCtx.violations, so the message here is the second signal.\n // Subclass of UPTError (§14.7) so downstream consumers can\n // discriminate UPT-source errors uniformly with `instanceof UPTError`.\n throw new TensorProductChildInferenceError(\n 'tensor-product: a non-tensor operand failed dimension inference; ' +\n 'see ValidationResult.violations for the underlying cause.',\n );\n }\n return { dim, freeIndices: probe.freeIndices };\n}\n\n/**\n * Resolve a child of a tensor-partial-derivative to its local\n * {dim, freeIndices, role?} carrier. Same shape as\n * `resolveChildForContraction` but returns role-aware result so the\n * pderiv validator can pass through `of.role` (Design §13 Q1).\n */\nfunction resolveChildForPartialDerivative(\n typed: ExprNode,\n parentCtx: InferContext,\n): PartialDerivativeChildResult {\n if (typed.kind === 'tensor-symbol') {\n const result = validateTensorSymbol(typed);\n return { dim: result.dim, freeIndices: result.freeIndices, role: typed.role };\n }\n if (typed.kind === 'metric-tensor') {\n const result = validateMetricTensor(typed);\n return { dim: result.dim, freeIndices: result.freeIndices };\n }\n if (typed.kind === 'kronecker-delta') {\n const result = validateKroneckerDelta(typed);\n return { dim: result.dim, freeIndices: result.freeIndices };\n }\n if (typed.kind === 'tensor-partial-derivative') {\n const result = validatePartialDerivative(typed, (grandchild) =>\n resolveChildForPartialDerivative(grandchild, parentCtx),\n );\n return result;\n }\n // For scalars / op / integral / derivative / tensor-product nodes, use\n // inferArgLocal for dim + freeIndices, no role.\n const probe = inferArgLocal(typed, parentCtx, '<pderiv-child>');\n if (probe.dim === null) {\n throw new TensorProductChildInferenceError(\n 'tensor-partial-derivative child failed dimension inference; ' +\n 'see ValidationResult.violations for cause.',\n );\n }\n return { dim: probe.dim, freeIndices: probe.freeIndices };\n}\n\n/**\n * Recursive dimension inference. On any sub-expression error we record a\n * violation, return `null`, and let parent ops propagate the null up.\n */\n/** A decimal literal: an optional sign, digits with an optional fraction, an optional exponent. */\nconst DECIMAL_LITERAL = /^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?$/;\n/** The scalar operators an `op` node may carry; anything else is a violation, not a sum. */\nconst SCALAR_OPS: ReadonlySet<string> = new Set(['^', '*', '/', '+', '-']);\n/** The `TranscendentalFn` union, as a runtime set for a node built from JSON. */\nconst TRANSCENDENTAL_FNS: ReadonlySet<string> = new Set(['exp', 'ln', 'log2', 'log10', 'sin', 'cos', 'tan', 'sinh', 'cosh', 'tanh']);\n\n/**\n * A literal exponent: a symbol whose name is a decimal literal and whose\n * dimension is dimensionless. The name is the number; the dimension says it\n * is a number and not a quantity that happens to be spelled with digits.\n */\nfunction isLiteralExponent(node: { readonly name: string; readonly dim: Dimension }): boolean {\n return DECIMAL_LITERAL.test(node.name) && equals(node.dim, DIMENSIONLESS);\n}\n\nfunction infer(node: ExprNode, ctx: InferContext): Dimension | null {\n switch (node.kind) {\n case 'symbol':\n return node.dim;\n\n case 'op': {\n if (!SCALAR_OPS.has(node.op)) {\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: DIMENSIONLESS,\n note: `unknown operator '${String(node.op)}'; the operators are ^ * / + -`,\n });\n return null;\n }\n if (node.op === '^') {\n // a^n — base is an arbitrary expression. A numeric-literal exponent\n // works on any base (power(baseDim, n)). A non-literal (input-dependent)\n // exponent is supported ONLY on a DIMENSIONLESS base (v0.13), where the\n // result is dimensionless regardless of the exponent's value.\n if (node.args.length !== 2) {\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: DIMENSIONLESS,\n note: `^ requires exactly 2 args (base, exponent), got ${node.args.length}`,\n });\n return null;\n }\n const [baseNode, expNode] = node.args;\n // Per Part-VII §VII.5: '^' is a scalar operator. Capture the base's\n // local freeIndices and reject if non-empty (tensor base).\n const baseProbe = inferArgLocal(baseNode, ctx, 'args[0]');\n const baseDim = baseProbe.dim;\n if (baseDim === null) return null;\n if (baseProbe.freeIndices.size > 0) {\n throw new TensorInScalarOpError('^');\n }\n // Classify the exponent. A numeric-literal symbol supports a\n // DIMENSIONFUL base (e.g. c^3, r_s = …/c^2). A literal is a decimal\n // literal (`2`, `-1`, `0.5`, `1e-3`) carried by a DIMENSIONLESS\n // symbol: `''`, `' '` and `'0x2'` are not literals, and a `2` that\n // carries a dimension is a dimensioned exponent, which no base takes.\n if (expNode !== undefined && expNode.kind === 'symbol' && isLiteralExponent(expNode)) {\n const n = Number(expNode.name);\n // `1e400` reads as Infinity and `1e-400` as 0: neither is the exponent written.\n if (!Number.isFinite(n) || (n === 0 && !/^[+-]?0*\\.?0*(?:[eE][+-]?\\d+)?$/.test(expNode.name))) {\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: DIMENSIONLESS,\n note: `exponent '${expNode.name}' is not representable as a finite number`,\n });\n return null;\n }\n return power(baseDim, n);\n }\n\n // Non-literal (input-dependent) exponent. SOUND only when the base is\n // DIMENSIONLESS: dimensionless^(dimensionless) = dimensionless, so the\n // result dimension is statically inferable without the exponent's\n // value. (v0.13 — symbolic exponents; e.g. Hertz-Millis (T/T₀)^(−1/z).)\n if (equals(baseDim, DIMENSIONLESS)) {\n if (!expNode) return null; // arity already guarded; defensive\n const expProbe = inferArgLocal(expNode, ctx, 'args[1]');\n if (expProbe.dim === null) return null; // exponent failed — short-circuit\n if (expProbe.freeIndices.size > 0) {\n throw new TensorInScalarOpError('^'); // tensor exponent\n }\n if (!equals(expProbe.dim, DIMENSIONLESS)) {\n ctx.violations.push({\n location: joinPath(ctx.path, 'args[1]'),\n expected: DIMENSIONLESS,\n actual: expProbe.dim,\n note: '^ exponent must be dimensionless',\n });\n return null;\n }\n return DIMENSIONLESS;\n }\n\n // Dimensionful base + non-literal exponent: not statically inferable —\n // a numeric literal is required. Throwaway-probe the exponent so the\n // violation's `actual` carries its inferred dim (informative; a\n // downstream consumer keying on `equals(expected,actual)` sees the\n // mismatch). Preserves the pinned violation shape.\n let actualDim: Dimension = DIMENSIONLESS;\n if (expNode) {\n const probeCtx: InferContext = { path: joinPath(ctx.path, 'args[1]'), violations: [], freeIndices: new Map() };\n const probed = infer(expNode, probeCtx);\n if (probed !== null && okFromViolations(probeCtx.violations)) {\n actualDim = probed;\n }\n }\n ctx.violations.push({\n location: joinPath(ctx.path, 'args[1]'),\n expected: DIMENSIONLESS,\n actual: actualDim,\n note: '^ exponent must be a numeric literal symbol unless the base is dimensionless',\n });\n return null;\n }\n\n if (node.op === '*' || node.op === '/') {\n if (node.args.length === 0) return DIMENSIONLESS;\n // Per Part-VII §VII.5: '*' / '/' are scalar-only operators. Any\n // arg with non-empty freeIndices is rejected with\n // TensorInScalarOpError; users must use 'tensor-product' for\n // tensor multiplication. Scalar-only operand lists retain the\n // existing dim-accumulation behavior.\n let acc: Dimension | null = null;\n for (let i = 0; i < node.args.length; i++) {\n const probe = inferArgLocal(node.args[i], ctx, `args[${i}]`);\n const childDim = probe.dim;\n if (childDim === null) return null;\n if (probe.freeIndices.size > 0) {\n throw new TensorInScalarOpError(node.op);\n }\n if (i === 0) acc = childDim;\n else if (node.op === '*') acc = multiply(acc!, childDim);\n else acc = divide(acc!, childDim);\n }\n return acc;\n }\n\n // '+' or '-' — all operands must share a common dimension AND\n // (per Part-VII §VII.5) the same freeIndices signature. Mismatched\n // free-index maps raise FreeIndexMismatchError; this catches both\n // tensor + scalar (one map non-empty, one empty) and tensor + tensor\n // with differing variance / labels / counts.\n if (node.args.length === 0) return DIMENSIONLESS;\n let acc: Dimension | null = null;\n let firstFI: Map<string, { upper: number; lower: number }> | null = null;\n for (let i = 0; i < node.args.length; i++) {\n // A literal zero is the additive identity and carries no dimension of\n // its own. Numbers are dimensionless symbols in this grammar, so\n // without this `x = 0`, written `x - 0`, could never validate.\n if (isDimensionlessZeroLiteral(node.args[i])) continue;\n const probe = inferArgLocal(node.args[i], ctx, `args[${i}]`);\n const childDim = probe.dim;\n if (childDim === null) return null;\n if (acc === null) {\n acc = childDim;\n firstFI = probe.freeIndices;\n } else {\n if (!freeIndicesEqual(firstFI!, probe.freeIndices)) {\n throw new FreeIndexMismatchError(\n `op '${node.op}' args have mismatched freeIndices: ` +\n `args[0] has ${formatFreeIndices(firstFI!)} but ` +\n `args[${i}] has ${formatFreeIndices(probe.freeIndices)}. ` +\n `All operands of a tensor sum must share the same free-index signature.`,\n );\n }\n try {\n acc = node.op === '+' ? add(acc!, childDim) : subtract(acc!, childDim);\n } catch (err) {\n if (err instanceof DimensionMismatchError) {\n ctx.violations.push({\n location: joinPath(ctx.path, `args[${i}]`),\n expected: acc!,\n actual: childDim,\n note: `Cannot ${node.op === '+' ? 'add' : 'subtract'} ${format(childDim)} with running ${format(acc!)} (dimension mismatch).`,\n });\n return null;\n }\n throw err;\n }\n }\n }\n // Propagate the (shared) freeIndices signature to the parent ctx so\n // a tensor-sum can flow into another tensor-aware operator above.\n if (firstFI !== null) {\n mergeFreeIndices(ctx.freeIndices, firstFI);\n }\n return acc ?? DIMENSIONLESS;\n }\n\n case 'integral': {\n // ∫ f dx — result has dim(f) * dim(x).\n // Guard against malformed nodes loaded from JSON / hand-built test\n // fixtures that omit `integrand` or `over` (TypeScript requires them\n // but `as unknown as ExprNode` casts can bypass the check).\n if (!node.integrand || !node.over) {\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: DIMENSIONLESS,\n note: `integral requires both 'integrand' and 'over' fields`,\n });\n return null;\n }\n // v0.3.1 audit fix: shallow `{ ...ctx, path }` shared ctx.freeIndices\n // (a Map, copied by reference), so a tensor-valued integrand silently\n // leaked its free indices into the parent accumulator. Use\n // inferArgLocal() to give each child a fresh local freeIndices Map.\n // v0.3.0 has no tensor-integral semantics; the operator is dimensional\n // scalar and child free-indices stay local.\n const fProbe = inferArgLocal(node.integrand, ctx, 'integrand');\n const xProbe = inferArgLocal(node.over, ctx, 'over');\n if (fProbe.dim === null || xProbe.dim === null) return null;\n // Definite integral: the bounds are points on the integration axis, so\n // each must carry the integration variable's dimension.\n for (const [bound, label] of [\n [node.lower, 'lower'] as const,\n [node.upper, 'upper'] as const,\n ]) {\n if (!bound) continue;\n const bProbe = inferArgLocal(bound, ctx, label);\n if (bProbe.dim === null) return null;\n if (!equals(bProbe.dim, xProbe.dim)) {\n ctx.violations.push({\n location: joinPath(ctx.path, label),\n expected: xProbe.dim,\n actual: bProbe.dim,\n note: `integral ${label} bound must match the integration variable's dimension`,\n });\n return null;\n }\n }\n return multiply(fProbe.dim, xProbe.dim);\n }\n\n case 'derivative': {\n // d f / d x — result has dim(f) / dim(x).\n // Same shape guard as `integral` above.\n if (!node.of || !node.wrt) {\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: DIMENSIONLESS,\n note: `derivative requires both 'of' and 'wrt' fields`,\n });\n return null;\n }\n // v0.3.1 audit fix: same shallow-spread ctx.freeIndices leak as the\n // integral case above. Use inferArgLocal() so a tensor-valued `of`\n // doesn't bleed its free indices into the parent. v0.3.0 has no\n // tensor-derivative semantics (tensor-partial-derivative is the\n // dedicated node for that); this `derivative` node stays dimensional\n // scalar.\n const fProbe = inferArgLocal(node.of, ctx, 'of');\n const xProbe = inferArgLocal(node.wrt, ctx, 'wrt');\n if (fProbe.dim === null || xProbe.dim === null) return null;\n return divide(fProbe.dim, xProbe.dim);\n }\n\n case 'dirac-delta': {\n // δ(x) — Dirac-delta correlator primitive (v0.14). Since ∫δ(x)dx=1 is\n // dimensionless, [δ(x)] = [x]⁻¹ = power(dim(arg), -1). A dimensionless\n // arg gives a dimensionless δ (power of DIMENSIONLESS is DIMENSIONLESS).\n // Scalar operator: a tensor-valued arg is rejected by inferArgLocal via\n // TensorInScalarOpError; free indices stay local (not merged to parent).\n if (!node.arg) {\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: DIMENSIONLESS,\n note: `dirac-delta requires an 'arg' field`,\n });\n return null;\n }\n const argProbe = inferArgLocal(node.arg, ctx, 'arg');\n if (argProbe.dim === null) return null;\n if (argProbe.freeIndices.size > 0) {\n throw new TensorInScalarOpError('dirac-delta');\n }\n return power(argProbe.dim, -1);\n }\n\n case 'variational-derivative': {\n // δF/δφ — functional derivative primitive (v0.14). From the defining\n // relation δF = ∫ (δF/δφ) δφ dμ we get [F] = [δF/δφ]·[φ]·[μ], so\n // [δF/δφ] = [F]/([φ]·[μ]) = divide(divide([F],[φ]),[μ]). `over` carries\n // the integration-measure dimension [dμ] whose one integration the\n // variational derivative undoes (the dual of `integral`, which MULTIPLIES\n // by [over]). Scalar operator: tensor children rejected by inferArgLocal.\n if (!node.functional || !node.field || !node.over) {\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: DIMENSIONLESS,\n note: `variational-derivative requires 'functional', 'field', and 'over' fields`,\n });\n return null;\n }\n const fnProbe = inferArgLocal(node.functional, ctx, 'functional');\n const phiProbe = inferArgLocal(node.field, ctx, 'field');\n const muProbe = inferArgLocal(node.over, ctx, 'over');\n if (fnProbe.dim === null || phiProbe.dim === null || muProbe.dim === null) {\n return null;\n }\n if (\n fnProbe.freeIndices.size > 0 ||\n phiProbe.freeIndices.size > 0 ||\n muProbe.freeIndices.size > 0\n ) {\n throw new TensorInScalarOpError('variational-derivative');\n }\n return divide(divide(fnProbe.dim, phiProbe.dim), muProbe.dim);\n }\n\n case 'transcendental': {\n if (!TRANSCENDENTAL_FNS.has(node.fn)) {\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: DIMENSIONLESS,\n note: `unknown transcendental function '${String(node.fn)}'; the functions are ${[...TRANSCENDENTAL_FNS].join(', ')}`,\n });\n return null;\n }\n // exp/ln/logₙ/sin/cos/tan/sinh/cosh/tanh of a DIMENSIONLESS argument is\n // DIMENSIONLESS (the function's Taylor series only sums across like\n // dimensions when its argument is dimensionless). A dimensionful argument\n // is a dimension violation; a tensor-valued argument is rejected (scalar\n // operator), mirroring dirac-delta.\n if (!node.arg) {\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: DIMENSIONLESS,\n note: `transcendental '${node.fn}' requires an 'arg' field`,\n });\n return null;\n }\n const argProbe = inferArgLocal(node.arg, ctx, 'arg');\n if (argProbe.dim === null) return null;\n if (argProbe.freeIndices.size > 0) {\n throw new TensorInScalarOpError('transcendental');\n }\n if (!equals(argProbe.dim, DIMENSIONLESS)) {\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: argProbe.dim,\n note: `transcendental '${node.fn}' requires a dimensionless argument`,\n });\n return null;\n }\n return DIMENSIONLESS;\n }\n\n case 'abs': {\n // |x| is dimension-PRESERVING: [|x|] = [x]. Scalar operator (a tensor arg\n // is rejected, mirroring dirac-delta / transcendental).\n if (!node.arg) {\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: DIMENSIONLESS,\n note: `abs requires an 'arg' field`,\n });\n return null;\n }\n const argProbe = inferArgLocal(node.arg, ctx, 'arg');\n if (argProbe.dim === null) return null;\n if (argProbe.freeIndices.size > 0) {\n throw new TensorInScalarOpError('abs');\n }\n return argProbe.dim;\n }\n\n case 'tensor-symbol': {\n // Real validation per Part-VII §VII.4. Builds the free-indices map\n // from declared indices and merges into the context accumulator so\n // the root validate() call sees them in its ValidationResult.\n const { dim, freeIndices } = validateTensorSymbol(node);\n mergeFreeIndices(ctx.freeIndices, freeIndices);\n return dim;\n }\n\n case 'tensor-product': {\n // Task 6 — Einstein contraction. We delegate the algebra to the\n // pure `computeContraction(args, validateChild)` helper in tensor.ts\n // and inject `validateChild` to break the module cycle that would\n // otherwise arise from tensor.ts importing the validator.\n //\n // CRITICAL: every nested call uses *local* freeIndices maps; we never\n // mutate ctx.freeIndices from inside the recursion. Only the outer-\n // most tensor-product case merges its final residual map into the\n // shared ctx.freeIndices accumulator. This is what makes\n // (A·B)·C-style nested products correct: the inner product's dummy\n // indices stay scoped to the inner call.\n // Errors from the contraction (IndexLabelCollisionError,\n // VarianceMismatchError) are part of the public surface and propagate\n // so callers / tests can catch by type.\n const result = computeContraction(node.args, (child) =>\n resolveChildForContraction(child, ctx),\n );\n mergeFreeIndices(ctx.freeIndices, result.freeIndices);\n return result.dim;\n }\n\n case 'metric-tensor': {\n const { dim, freeIndices } = validateMetricTensor(node);\n mergeFreeIndices(ctx.freeIndices, freeIndices);\n return dim;\n }\n\n case 'kronecker-delta': {\n const { dim, freeIndices } = validateKroneckerDelta(node);\n mergeFreeIndices(ctx.freeIndices, freeIndices);\n return dim;\n }\n\n case 'tensor-partial-derivative': {\n const result = validatePartialDerivative(node, (child) =>\n resolveChildForPartialDerivative(child, ctx),\n );\n mergeFreeIndices(ctx.freeIndices, result.freeIndices);\n return result.dim;\n }\n\n case 'covariant-derivative': {\n // Same child kinds as a partial derivative, so it reuses that resolver.\n const result = validateCovariantDerivative(node, (child) =>\n resolveChildForPartialDerivative(child, ctx),\n );\n mergeFreeIndices(ctx.freeIndices, result.freeIndices);\n return result.dim;\n }\n\n // v0.6.1 Phase 2 Proposal 1 — the 11 curvature/GR-object arms\n // (riemann-tensor, ricci-tensor, einstein-tensor, bianchi-residual,\n // killing-vector, conserved-charge, stress-energy, cosmological-\n // constant, einstein-equation, weyl-tensor, kretschmann-scalar)\n // dispatch through a registry. The registry's discriminated-union\n // entry encodes three patterns (A/B/C) that capture the per-arm\n // callback-shape + freeIndices-propagate asymmetry; see\n // `validator-registry.ts` for the per-kind classification.\n case 'riemann-tensor':\n case 'ricci-tensor':\n case 'einstein-tensor':\n case 'bianchi-residual':\n case 'killing-vector':\n case 'conserved-charge':\n case 'stress-energy':\n case 'cosmological-constant':\n case 'einstein-equation':\n case 'weyl-tensor':\n case 'kretschmann-scalar': {\n const entry = lookupValidatorEntry(node.kind);\n if (!entry) {\n // Defensive: should be unreachable given the `case` labels\n // above match the registry's `RegistryKind` exactly.\n throw new Error(`validator: no registry entry for ${node.kind}`);\n }\n const result = dispatchValidator(entry, node);\n if (shouldPropagateFreeIndices(entry)) {\n mergeFreeIndices(ctx.freeIndices, result.freeIndices);\n }\n return result.dim;\n }\n\n default: {\n // Exhaustiveness guard: if a future ExprNode arm is added but not\n // handled here, this branch records a shape violation rather than\n // silently returning `undefined` (which validate() would coerce to\n // `ok: true, inferredDimension: undefined` — see silent-failure F1).\n const _exhaustive: never = node;\n void _exhaustive;\n const kind = (node as { kind?: unknown })?.kind;\n ctx.violations.push({\n location: ctx.path,\n expected: DIMENSIONLESS,\n actual: DIMENSIONLESS,\n note: `Validator: unknown ExprNode.kind ${JSON.stringify(kind)}`,\n });\n return null;\n }\n }\n}\n\n/**\n * A violation set passes iff it contains no error-severity violation.\n * Violations with `severity` absent default to 'error' (v0.3.5 §4).\n */\nfunction okFromViolations(violations: ReadonlyArray<Violation>): boolean {\n return !violations.some((v) => (v.severity ?? 'error') === 'error');\n}\n\n/**\n * A symbol whose name is a numeric literal equal to zero and whose dimension\n * is dimensionless. In a sum it is the additive identity and is skipped.\n * A \"0\" that carries a dimension is an ordinary term.\n */\nfunction isDimensionlessZeroLiteral(node: ExprNode | undefined): boolean {\n if (node === undefined || node.kind !== 'symbol' || node.name.trim() === '') return false;\n // A decimal literal zero only: `0x0`, `0b0` and a blank are not the written identity.\n if (!DECIMAL_LITERAL.test(node.name) || Number(node.name) !== 0) return false;\n const d = node.dim;\n return d.L === 0 && d.M === 0 && d.T === 0 && d.I === 0 && d.Theta === 0 && d.N === 0 && d.J === 0;\n}\n\n/**\n * Validate a single scalar/tensor `ExprNode`: infer its dimension and collect\n * any consistency violations. `ok` is true iff a dimension was inferred and no\n * error-severity violations were raised. The hot path for the whole suite.\n */\nexport function validate(expr: ExprNode): ValidationResult {\n const ctx: InferContext = { path: '', violations: [], freeIndices: new Map() };\n const dim = infer(expr, ctx);\n return {\n ok: okFromViolations(ctx.violations) && dim !== null,\n inferredDimension: dim,\n freeIndices: ctx.freeIndices,\n violations: ctx.violations,\n };\n}\n\n/**\n * Opt-in symbolic InverseMetricInconsistencyWarning check. Given a\n * lower/upper metric pair, returns a deduplicated (at most one) warning-\n * severity Violation set. v0.3.5 §7. (Deliberately not folded into\n * validate() — that is the hot path for the whole test suite.)\n */\nexport function validateInverseMetricPair(\n gLower: MetricTensorNode,\n gUpper: MetricTensorNode,\n): Violation[] {\n const note = checkInverseMetricStructure(gLower, gUpper);\n if (note === null) return [];\n return [{\n location: `${gLower.name}/${gUpper.name}`,\n expected: gLower.dim,\n actual: gUpper.dim,\n note,\n severity: 'warning',\n }];\n}\n\n/**\n * Validate an equation `lhs = rhs`: both sides must infer a dimension, the two\n * dimensions must match, and free-index valence must agree (so a tensor = scalar\n * is caught even when units match). Returns the combined `ValidationResult`.\n */\nexport function validateEquation(lhs: ExprNode, rhs: ExprNode): ValidationResult {\n const lhsCtx: InferContext = { path: 'lhs', violations: [], freeIndices: new Map() };\n const rhsCtx: InferContext = { path: 'rhs', violations: [], freeIndices: new Map() };\n const lhsDim = infer(lhs, lhsCtx);\n const rhsDim = infer(rhs, rhsCtx);\n const violations = [...lhsCtx.violations, ...rhsCtx.violations];\n\n if (lhsDim !== null && rhsDim !== null && !equals(lhsDim, rhsDim)) {\n violations.push({\n location: '<equation>',\n expected: lhsDim,\n actual: rhsDim,\n note: `LHS has ${format(lhsDim)} but RHS has ${format(rhsDim)} — equation is not dimensionally homogeneous.`,\n });\n }\n\n // Equation-level valence (free-index) homogeneity. Both sides of an\n // equation must carry the same free-index signature: a rank-2 tensor\n // cannot equal a scalar, nor A^mu equal B_mu, even when the SI dimensions\n // agree. Only checked when both sides inferred a dimension (a side that\n // already failed inference has reported its own violation). Scalar\n // equations have empty maps on both sides ⇒ no effect.\n if (\n lhsDim !== null &&\n rhsDim !== null &&\n !freeIndicesEqual(lhsCtx.freeIndices, rhsCtx.freeIndices)\n ) {\n violations.push({\n location: '<equation>',\n expected: lhsDim,\n actual: rhsDim,\n note:\n `LHS free indices ${formatFreeIndices(lhsCtx.freeIndices)} but RHS ` +\n `free indices ${formatFreeIndices(rhsCtx.freeIndices)} — equation is ` +\n `not valence-homogeneous (index/rank mismatch across '=').`,\n });\n }\n\n return {\n ok: okFromViolations(violations) && lhsDim !== null && rhsDim !== null,\n inferredDimension: lhsDim, // by convention, LHS dimension is the canonical answer\n // By convention LHS free-indices map is the canonical answer (mirrors\n // inferredDimension's LHS bias).\n freeIndices: lhsCtx.freeIndices,\n violations,\n };\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -52,7 +52,7 @@ export { DuplicateInputError, InputTypeError, MissingInputError, NonFiniteInputE
52
52
  /** A caller input that names a registered constant (`G`, `k_B`, `m_p`, …) is refused on every evaluation path. */
53
53
  export { ConstantInputError } from './bridges/index.js';
54
54
  /** The result of {@link evaluateRelation}. A value carries a public `Dimension`. */
55
- export type { Evaluation } from './composition/index.js';
55
+ export type { Evaluation, ExtraOutput } from './composition/index.js';
56
56
  export type { EvaluatorSpec, EvaluatorParameter, ParameterAlternate, GeometryRole } from './bridges/evaluators.js';
57
57
  /** An extra output an `EvaluatorSpec` returns beside its `value`. */
58
58
  export type { CatalogEvaluatorOutput } from './bridges/catalog-types.js';
@@ -105,14 +105,20 @@ export { evaluateNumerical, evaluateNumericalRaw, evaluateMetricInverse, getActi
105
105
  export type { NumericalResult, NumericalRawResult, EvaluateOptions, NumericalInputs, TensorEngine, EngineTensor, EinsumSpec, NestedArray, GridField, ForwardGradResult, ReverseGradResult, GL4State, GL4Snapshot, GL4Options, PerihelionResult, FindPerihelionOptions, CovariantEikonalInputs, CovariantEikonalResult, } from './numerical/index.js';
106
106
  export { composeEdges, consistencyRatio, evaluateEdge, minConfidence, regimesDiffer, QUANTITY_IDENTIFICATIONS, CompositionDimensionError, CompositionJunctionError, DomainViolationError, M_SUN_KG, } from './composition/index.js';
107
107
  export type { BridgeEdge, ComposeOptions, EdgeConfidence, Quantity, QuantityIdentification, RegimeAttributes, ValidityDomain, } from './composition/index.js';
108
+ /** A validity domain built from one condition text: the predicate, the description and the refusal all read it. */
109
+ export { validityDomain } from './composition/index.js';
110
+ /** A failed validity condition and the inputs it read, as `DomainViolationError.violations` lists them. */
111
+ export type { DomainInput, DomainViolation } from './composition/index.js';
108
112
  export { adjudicateBridgeEntry, adjudicateCatalog } from './bridges/membership.js';
109
113
  export { REJECTED_BRIDGE_ADJUDICATIONS, REJECTED_BRIDGE_IDS } from './bridges/rejected.js';
110
114
  export type { BridgeVerdict, CatalogAdjudicationReport } from './bridges/membership.js';
111
115
  export type { RejectedBridgeAdjudication } from './bridges/rejected.js';
112
116
  export { enumerateCompositions, REGISTERED_COMPOSITION_IDS, propagateUncertainty, } from './composition/index.js';
113
117
  export type { CompositionCandidate, EnumerationReport, UncertaintyResult, } from './composition/index.js';
114
- export { classifyIdentifiability, classifyAll, forwardClosure, } from './composition/index.js';
115
- export type { IdentifiabilityVerdict, IdentifiabilityResult, IdentifiabilityOptions, } from './composition/index.js';
118
+ /** The forward closure, the per-target classifier, the sweep, and the log-space rank over the monomial edges. */
119
+ export { classifyIdentifiability, classifyAll, forwardClosure, identifiabilityByRank, } from './composition/index.js';
120
+ /** The classifier's verdict, result and option types, and the rank instrument's report. */
121
+ export type { IdentifiabilityVerdict, IdentifiabilityResult, IdentifiabilityOptions, RankIdentifiability, } from './composition/index.js';
116
122
  export { retrodict, retrodictNode } from './composition/index.js';
117
123
  /** The retrodiction harness's result, prediction, refusal, report and option types. */
118
124
  export type { RetrodictionOutcome, RetrodictionPrediction, RetrodictionResult, RetrodictionRefusal, RetrodictionReport, RetrodictionOptions, } from './composition/index.js';