universal-physics-tensor 10.0.0 → 11.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 (720) hide show
  1. package/README.md +4 -3
  2. package/bin/upt.mjs +13 -1
  3. package/data/atlas/atlas.json +25 -25
  4. package/data/atlas/atlas.jsonld +1 -1
  5. package/data/atlas/diffusion.json +6 -6
  6. package/data/atlas/oscillators.json +7 -7
  7. package/data/atlas/waves.json +14 -14
  8. package/data/atlas/witness-results.json +11 -11
  9. package/data/bridge-catalog.json +371 -228
  10. package/data/bridge-catalog.schema.json +45 -7
  11. package/dist/atlas/applicability.d.ts.map +1 -1
  12. package/dist/atlas/applicability.js +21 -15
  13. package/dist/atlas/applicability.js.map +1 -1
  14. package/dist/atlas/benchmark/hybrid-retrieval.d.ts +9 -1
  15. package/dist/atlas/benchmark/hybrid-retrieval.d.ts.map +1 -1
  16. package/dist/atlas/benchmark/hybrid-retrieval.js +15 -13
  17. package/dist/atlas/benchmark/hybrid-retrieval.js.map +1 -1
  18. package/dist/atlas/benchmark/loader.js +2 -2
  19. package/dist/atlas/benchmark/loader.js.map +1 -1
  20. package/dist/atlas/benchmark/stats.d.ts +2 -2
  21. package/dist/atlas/benchmark/stats.d.ts.map +1 -1
  22. package/dist/atlas/benchmark/stats.js +15 -7
  23. package/dist/atlas/benchmark/stats.js.map +1 -1
  24. package/dist/atlas/catalog-formal-ref.d.ts +26 -3
  25. package/dist/atlas/catalog-formal-ref.d.ts.map +1 -1
  26. package/dist/atlas/catalog-formal-ref.js +52 -5
  27. package/dist/atlas/catalog-formal-ref.js.map +1 -1
  28. package/dist/atlas/chain-pipeline.d.ts.map +1 -1
  29. package/dist/atlas/chain-pipeline.js +7 -8
  30. package/dist/atlas/chain-pipeline.js.map +1 -1
  31. package/dist/atlas/diffusion/bridges-closure.d.ts +0 -4
  32. package/dist/atlas/diffusion/bridges-closure.d.ts.map +1 -1
  33. package/dist/atlas/diffusion/bridges-closure.js +8 -12
  34. package/dist/atlas/diffusion/bridges-closure.js.map +1 -1
  35. package/dist/atlas/diffusion/bridges.d.ts.map +1 -1
  36. package/dist/atlas/diffusion/bridges.js +27 -39
  37. package/dist/atlas/diffusion/bridges.js.map +1 -1
  38. package/dist/atlas/diffusion/dimensions.d.ts +6 -14
  39. package/dist/atlas/diffusion/dimensions.d.ts.map +1 -1
  40. package/dist/atlas/diffusion/dimensions.js +8 -16
  41. package/dist/atlas/diffusion/dimensions.js.map +1 -1
  42. package/dist/atlas/diffusion/models.d.ts +3 -3
  43. package/dist/atlas/diffusion/models.d.ts.map +1 -1
  44. package/dist/atlas/diffusion/models.js +5 -10
  45. package/dist/atlas/diffusion/models.js.map +1 -1
  46. package/dist/atlas/diffusion/numerics.d.ts +16 -4
  47. package/dist/atlas/diffusion/numerics.d.ts.map +1 -1
  48. package/dist/atlas/diffusion/numerics.js +38 -24
  49. package/dist/atlas/diffusion/numerics.js.map +1 -1
  50. package/dist/atlas/link-prediction.d.ts +106 -3
  51. package/dist/atlas/link-prediction.d.ts.map +1 -1
  52. package/dist/atlas/link-prediction.js +212 -66
  53. package/dist/atlas/link-prediction.js.map +1 -1
  54. package/dist/atlas/oscillators/bridges-coarse.d.ts.map +1 -1
  55. package/dist/atlas/oscillators/bridges-coarse.js +7 -11
  56. package/dist/atlas/oscillators/bridges-coarse.js.map +1 -1
  57. package/dist/atlas/oscillators/bridges-exact.d.ts.map +1 -1
  58. package/dist/atlas/oscillators/bridges-exact.js +6 -7
  59. package/dist/atlas/oscillators/bridges-exact.js.map +1 -1
  60. package/dist/atlas/oscillators/bridges-limits.d.ts +3 -16
  61. package/dist/atlas/oscillators/bridges-limits.d.ts.map +1 -1
  62. package/dist/atlas/oscillators/bridges-limits.js +23 -34
  63. package/dist/atlas/oscillators/bridges-limits.js.map +1 -1
  64. package/dist/atlas/oscillators/dimensions.d.ts +9 -21
  65. package/dist/atlas/oscillators/dimensions.d.ts.map +1 -1
  66. package/dist/atlas/oscillators/dimensions.js +9 -21
  67. package/dist/atlas/oscillators/dimensions.js.map +1 -1
  68. package/dist/atlas/oscillators/limit-witnesses.d.ts +2 -2
  69. package/dist/atlas/oscillators/limit-witnesses.d.ts.map +1 -1
  70. package/dist/atlas/oscillators/limit-witnesses.js +17 -15
  71. package/dist/atlas/oscillators/limit-witnesses.js.map +1 -1
  72. package/dist/atlas/oscillators/models.d.ts.map +1 -1
  73. package/dist/atlas/oscillators/models.js +2 -6
  74. package/dist/atlas/oscillators/models.js.map +1 -1
  75. package/dist/atlas/oscillators/pendulum-motion.d.ts +29 -6
  76. package/dist/atlas/oscillators/pendulum-motion.d.ts.map +1 -1
  77. package/dist/atlas/oscillators/pendulum-motion.js +60 -40
  78. package/dist/atlas/oscillators/pendulum-motion.js.map +1 -1
  79. package/dist/atlas/oscillators/phase-translation.d.ts +0 -11
  80. package/dist/atlas/oscillators/phase-translation.d.ts.map +1 -1
  81. package/dist/atlas/oscillators/phase-translation.js +3 -4
  82. package/dist/atlas/oscillators/phase-translation.js.map +1 -1
  83. package/dist/atlas/oscillators/position-translation.d.ts +68 -7
  84. package/dist/atlas/oscillators/position-translation.d.ts.map +1 -1
  85. package/dist/atlas/oscillators/position-translation.js +123 -12
  86. package/dist/atlas/oscillators/position-translation.js.map +1 -1
  87. package/dist/atlas/oscillators/rejections.d.ts +0 -2
  88. package/dist/atlas/oscillators/rejections.d.ts.map +1 -1
  89. package/dist/atlas/oscillators/rejections.js +0 -7
  90. package/dist/atlas/oscillators/rejections.js.map +1 -1
  91. package/dist/atlas/physjs-entries.generated.d.ts +25 -24
  92. package/dist/atlas/physjs-entries.generated.d.ts.map +1 -1
  93. package/dist/atlas/physjs-entries.generated.js +25 -24
  94. package/dist/atlas/physjs-entries.generated.js.map +1 -1
  95. package/dist/atlas/physjs-ref.d.ts +34 -31
  96. package/dist/atlas/physjs-ref.d.ts.map +1 -1
  97. package/dist/atlas/physjs-ref.js +55 -53
  98. package/dist/atlas/physjs-ref.js.map +1 -1
  99. package/dist/atlas/physjs-reviewed.d.ts +1 -1
  100. package/dist/atlas/physjs-reviewed.js +15 -15
  101. package/dist/atlas/physjs-reviewed.js.map +1 -1
  102. package/dist/atlas/poster/statements.d.ts +0 -19
  103. package/dist/atlas/poster/statements.d.ts.map +1 -1
  104. package/dist/atlas/poster/statements.js +1 -1
  105. package/dist/atlas/poster/statements.js.map +1 -1
  106. package/dist/atlas/proof-target.d.ts +1 -1
  107. package/dist/atlas/proof-target.js +1 -1
  108. package/dist/atlas/proof-target.js.map +1 -1
  109. package/dist/atlas/regime.d.ts +1 -1
  110. package/dist/atlas/regime.d.ts.map +1 -1
  111. package/dist/atlas/regime.js +1 -1
  112. package/dist/atlas/regime.js.map +1 -1
  113. package/dist/atlas/text-overlap.d.ts +23 -0
  114. package/dist/atlas/text-overlap.d.ts.map +1 -0
  115. package/dist/atlas/text-overlap.js +41 -0
  116. package/dist/atlas/text-overlap.js.map +1 -0
  117. package/dist/atlas/waves/bridges-closure.d.ts.map +1 -1
  118. package/dist/atlas/waves/bridges-closure.js +2 -6
  119. package/dist/atlas/waves/bridges-closure.js.map +1 -1
  120. package/dist/atlas/waves/bridges.d.ts.map +1 -1
  121. package/dist/atlas/waves/bridges.js +32 -48
  122. package/dist/atlas/waves/bridges.js.map +1 -1
  123. package/dist/atlas/waves/models.d.ts +5 -6
  124. package/dist/atlas/waves/models.d.ts.map +1 -1
  125. package/dist/atlas/waves/models.js +7 -13
  126. package/dist/atlas/waves/models.js.map +1 -1
  127. package/dist/atlas/waves/numerics.d.ts.map +1 -1
  128. package/dist/atlas/waves/numerics.js +10 -3
  129. package/dist/atlas/waves/numerics.js.map +1 -1
  130. package/dist/atlas/witness-numeric.d.ts +30 -0
  131. package/dist/atlas/witness-numeric.d.ts.map +1 -1
  132. package/dist/atlas/witness-numeric.js +53 -0
  133. package/dist/atlas/witness-numeric.js.map +1 -1
  134. package/dist/atlas/witness-specs.d.ts.map +1 -1
  135. package/dist/atlas/witness-specs.js +19 -0
  136. package/dist/atlas/witness-specs.js.map +1 -1
  137. package/dist/atlas/witness-symbolic.d.ts +75 -3
  138. package/dist/atlas/witness-symbolic.d.ts.map +1 -1
  139. package/dist/atlas/witness-symbolic.js +116 -10
  140. package/dist/atlas/witness-symbolic.js.map +1 -1
  141. package/dist/bridges/catalog-load.d.ts.map +1 -1
  142. package/dist/bridges/catalog-load.js +13 -8
  143. package/dist/bridges/catalog-load.js.map +1 -1
  144. package/dist/bridges/catalog-types.d.ts +26 -2
  145. package/dist/bridges/catalog-types.d.ts.map +1 -1
  146. package/dist/bridges/catalog-types.js +11 -1
  147. package/dist/bridges/catalog-types.js.map +1 -1
  148. package/dist/bridges/evaluation-errors.d.ts +31 -1
  149. package/dist/bridges/evaluation-errors.d.ts.map +1 -1
  150. package/dist/bridges/evaluation-errors.js +20 -2
  151. package/dist/bridges/evaluation-errors.js.map +1 -1
  152. package/dist/bridges/evaluator-inputs.d.ts.map +1 -1
  153. package/dist/bridges/evaluator-inputs.js +7 -5
  154. package/dist/bridges/evaluator-inputs.js.map +1 -1
  155. package/dist/bridges/evaluators.d.ts.map +1 -1
  156. package/dist/bridges/evaluators.js +27 -12
  157. package/dist/bridges/evaluators.js.map +1 -1
  158. package/dist/bridges/expr-parse.d.ts +11 -0
  159. package/dist/bridges/expr-parse.d.ts.map +1 -1
  160. package/dist/bridges/expr-parse.js +14 -5
  161. package/dist/bridges/expr-parse.js.map +1 -1
  162. package/dist/bridges/holds.d.ts +35 -3
  163. package/dist/bridges/holds.d.ts.map +1 -1
  164. package/dist/bridges/holds.js +117 -23
  165. package/dist/bridges/holds.js.map +1 -1
  166. package/dist/bridges/notices.d.ts.map +1 -1
  167. package/dist/bridges/notices.js +5 -5
  168. package/dist/bridges/notices.js.map +1 -1
  169. package/dist/bridges/relation-eval.d.ts +4 -4
  170. package/dist/bridges/relation-eval.d.ts.map +1 -1
  171. package/dist/bridges/relation-eval.js +15 -16
  172. package/dist/bridges/relation-eval.js.map +1 -1
  173. package/dist/bridges/sensitivity.d.ts.map +1 -1
  174. package/dist/bridges/sensitivity.js +3 -3
  175. package/dist/bridges/sensitivity.js.map +1 -1
  176. package/dist/bridges/validity.d.ts +33 -0
  177. package/dist/bridges/validity.d.ts.map +1 -0
  178. package/dist/bridges/validity.js +67 -0
  179. package/dist/bridges/validity.js.map +1 -0
  180. package/dist/canonical/entries/atomic.js +1 -3
  181. package/dist/canonical/entries/atomic.js.map +1 -1
  182. package/dist/canonical/entries/condensed-matter.d.ts.map +1 -1
  183. package/dist/canonical/entries/condensed-matter.js +4 -5
  184. package/dist/canonical/entries/condensed-matter.js.map +1 -1
  185. package/dist/canonical/entries/dimensional-classics.d.ts.map +1 -1
  186. package/dist/canonical/entries/dimensional-classics.js +3 -4
  187. package/dist/canonical/entries/dimensional-classics.js.map +1 -1
  188. package/dist/canonical/entries/electromagnetism.d.ts.map +1 -1
  189. package/dist/canonical/entries/electromagnetism.js +4 -10
  190. package/dist/canonical/entries/electromagnetism.js.map +1 -1
  191. package/dist/canonical/entries/fluids-waves.d.ts.map +1 -1
  192. package/dist/canonical/entries/fluids-waves.js +3 -7
  193. package/dist/canonical/entries/fluids-waves.js.map +1 -1
  194. package/dist/canonical/entries/mechanics.d.ts.map +1 -1
  195. package/dist/canonical/entries/mechanics.js +4 -6
  196. package/dist/canonical/entries/mechanics.js.map +1 -1
  197. package/dist/canonical/entries/nonmonomial.d.ts.map +1 -1
  198. package/dist/canonical/entries/nonmonomial.js +9 -17
  199. package/dist/canonical/entries/nonmonomial.js.map +1 -1
  200. package/dist/canonical/entries/relativity.d.ts.map +1 -1
  201. package/dist/canonical/entries/relativity.js +6 -6
  202. package/dist/canonical/entries/relativity.js.map +1 -1
  203. package/dist/canonical/entries/thermo-nuclear-cosmo.d.ts.map +1 -1
  204. package/dist/canonical/entries/thermo-nuclear-cosmo.js +6 -10
  205. package/dist/canonical/entries/thermo-nuclear-cosmo.js.map +1 -1
  206. package/dist/canonical/fixed-points.d.ts +94 -0
  207. package/dist/canonical/fixed-points.d.ts.map +1 -0
  208. package/dist/canonical/fixed-points.js +81 -0
  209. package/dist/canonical/fixed-points.js.map +1 -0
  210. package/dist/canonical/linkage.d.ts.map +1 -1
  211. package/dist/canonical/linkage.js +25 -44
  212. package/dist/canonical/linkage.js.map +1 -1
  213. package/dist/canonical/normal-form.d.ts.map +1 -1
  214. package/dist/canonical/normal-form.js +5 -11
  215. package/dist/canonical/normal-form.js.map +1 -1
  216. package/dist/canonical/structural.d.ts +21 -21
  217. package/dist/canonical/structural.d.ts.map +1 -1
  218. package/dist/canonical/structural.js +40 -19
  219. package/dist/canonical/structural.js.map +1 -1
  220. package/dist/cases/brownian-sphere.d.ts +3 -3
  221. package/dist/cases/brownian-sphere.d.ts.map +1 -1
  222. package/dist/cases/brownian-sphere.js +6 -5
  223. package/dist/cases/brownian-sphere.js.map +1 -1
  224. package/dist/cases/damped-resonator.d.ts.map +1 -1
  225. package/dist/cases/damped-resonator.js +6 -9
  226. package/dist/cases/damped-resonator.js.map +1 -1
  227. package/dist/cases/kepler-rv.d.ts +1 -1
  228. package/dist/cases/kepler-rv.d.ts.map +1 -1
  229. package/dist/cases/kepler-rv.js +3 -2
  230. package/dist/cases/kepler-rv.js.map +1 -1
  231. package/dist/cases/lumped-cooling.d.ts +8 -3
  232. package/dist/cases/lumped-cooling.d.ts.map +1 -1
  233. package/dist/cases/lumped-cooling.js +21 -23
  234. package/dist/cases/lumped-cooling.js.map +1 -1
  235. package/dist/cases/quadrature.d.ts +7 -9
  236. package/dist/cases/quadrature.d.ts.map +1 -1
  237. package/dist/cases/quadrature.js +28 -32
  238. package/dist/cases/quadrature.js.map +1 -1
  239. package/dist/cases/resistor-noise.js +4 -4
  240. package/dist/cases/resistor-noise.js.map +1 -1
  241. package/dist/cases/skin-depth.d.ts +0 -4
  242. package/dist/cases/skin-depth.d.ts.map +1 -1
  243. package/dist/cases/skin-depth.js +3 -7
  244. package/dist/cases/skin-depth.js.map +1 -1
  245. package/dist/cli/args.d.ts +23 -1
  246. package/dist/cli/args.d.ts.map +1 -1
  247. package/dist/cli/args.js +30 -8
  248. package/dist/cli/args.js.map +1 -1
  249. package/dist/cli/bindings.d.ts.map +1 -1
  250. package/dist/cli/bindings.js +5 -4
  251. package/dist/cli/bindings.js.map +1 -1
  252. package/dist/cli/command.d.ts +8 -1
  253. package/dist/cli/command.d.ts.map +1 -1
  254. package/dist/cli/command.js.map +1 -1
  255. package/dist/cli/commands/_atlas-map.d.ts +0 -9
  256. package/dist/cli/commands/_atlas-map.d.ts.map +1 -1
  257. package/dist/cli/commands/_atlas-map.js +8 -18
  258. package/dist/cli/commands/_atlas-map.js.map +1 -1
  259. package/dist/cli/commands/_atlas-route.d.ts.map +1 -1
  260. package/dist/cli/commands/_atlas-route.js +6 -2
  261. package/dist/cli/commands/_atlas-route.js.map +1 -1
  262. package/dist/cli/commands/_discovery-opts.d.ts.map +1 -1
  263. package/dist/cli/commands/_discovery-opts.js +8 -9
  264. package/dist/cli/commands/_discovery-opts.js.map +1 -1
  265. package/dist/cli/commands/atlas.d.ts.map +1 -1
  266. package/dist/cli/commands/atlas.js +8 -5
  267. package/dist/cli/commands/atlas.js.map +1 -1
  268. package/dist/cli/commands/audit.d.ts.map +1 -1
  269. package/dist/cli/commands/audit.js +8 -1
  270. package/dist/cli/commands/audit.js.map +1 -1
  271. package/dist/cli/commands/axes.d.ts.map +1 -1
  272. package/dist/cli/commands/axes.js +20 -1
  273. package/dist/cli/commands/axes.js.map +1 -1
  274. package/dist/cli/commands/confront.d.ts.map +1 -1
  275. package/dist/cli/commands/confront.js +8 -14
  276. package/dist/cli/commands/confront.js.map +1 -1
  277. package/dist/cli/commands/derive.d.ts.map +1 -1
  278. package/dist/cli/commands/derive.js +22 -22
  279. package/dist/cli/commands/derive.js.map +1 -1
  280. package/dist/cli/commands/discover.d.ts.map +1 -1
  281. package/dist/cli/commands/discover.js +6 -2
  282. package/dist/cli/commands/discover.js.map +1 -1
  283. package/dist/cli/commands/eval.d.ts.map +1 -1
  284. package/dist/cli/commands/eval.js +1 -0
  285. package/dist/cli/commands/eval.js.map +1 -1
  286. package/dist/cli/commands/evaluate.d.ts.map +1 -1
  287. package/dist/cli/commands/evaluate.js +65 -37
  288. package/dist/cli/commands/evaluate.js.map +1 -1
  289. package/dist/cli/commands/explain.d.ts.map +1 -1
  290. package/dist/cli/commands/explain.js +2 -1
  291. package/dist/cli/commands/explain.js.map +1 -1
  292. package/dist/cli/commands/ground.d.ts.map +1 -1
  293. package/dist/cli/commands/ground.js +1 -0
  294. package/dist/cli/commands/ground.js.map +1 -1
  295. package/dist/cli/commands/map.d.ts.map +1 -1
  296. package/dist/cli/commands/map.js +75 -5
  297. package/dist/cli/commands/map.js.map +1 -1
  298. package/dist/cli/commands/metric.d.ts.map +1 -1
  299. package/dist/cli/commands/metric.js +12 -9
  300. package/dist/cli/commands/metric.js.map +1 -1
  301. package/dist/cli/commands/path.d.ts +10 -0
  302. package/dist/cli/commands/path.d.ts.map +1 -1
  303. package/dist/cli/commands/path.js +25 -3
  304. package/dist/cli/commands/path.js.map +1 -1
  305. package/dist/cli/commands/probe.d.ts.map +1 -1
  306. package/dist/cli/commands/probe.js +59 -16
  307. package/dist/cli/commands/probe.js.map +1 -1
  308. package/dist/cli/commands/regime.d.ts.map +1 -1
  309. package/dist/cli/commands/regime.js +1 -0
  310. package/dist/cli/commands/regime.js.map +1 -1
  311. package/dist/cli/commands/retrieve.d.ts.map +1 -1
  312. package/dist/cli/commands/retrieve.js +1 -0
  313. package/dist/cli/commands/retrieve.js.map +1 -1
  314. package/dist/cli/commands/search.d.ts.map +1 -1
  315. package/dist/cli/commands/search.js +1 -0
  316. package/dist/cli/commands/search.js.map +1 -1
  317. package/dist/cli/commands/symbolic.d.ts.map +1 -1
  318. package/dist/cli/commands/symbolic.js +19 -28
  319. package/dist/cli/commands/symbolic.js.map +1 -1
  320. package/dist/cli/commands/testplan.d.ts.map +1 -1
  321. package/dist/cli/commands/testplan.js +4 -2
  322. package/dist/cli/commands/testplan.js.map +1 -1
  323. package/dist/cli/expr-print.d.ts +0 -2
  324. package/dist/cli/expr-print.d.ts.map +1 -1
  325. package/dist/cli/expr-print.js +7 -31
  326. package/dist/cli/expr-print.js.map +1 -1
  327. package/dist/cli/main.d.ts +7 -0
  328. package/dist/cli/main.d.ts.map +1 -1
  329. package/dist/cli/main.js +18 -3
  330. package/dist/cli/main.js.map +1 -1
  331. package/dist/cli/numeric-flag.d.ts +12 -0
  332. package/dist/cli/numeric-flag.d.ts.map +1 -0
  333. package/dist/cli/numeric-flag.js +44 -0
  334. package/dist/cli/numeric-flag.js.map +1 -0
  335. package/dist/cli/output.d.ts +20 -0
  336. package/dist/cli/output.d.ts.map +1 -1
  337. package/dist/cli/output.js +15 -0
  338. package/dist/cli/output.js.map +1 -1
  339. package/dist/cli/record-reach.js +2 -2
  340. package/dist/cli/record-reach.js.map +1 -1
  341. package/dist/cli/record-tables.d.ts.map +1 -1
  342. package/dist/cli/record-tables.js +6 -5
  343. package/dist/cli/record-tables.js.map +1 -1
  344. package/dist/cli/record.d.ts +1 -5
  345. package/dist/cli/record.d.ts.map +1 -1
  346. package/dist/cli/record.js +9 -8
  347. package/dist/cli/record.js.map +1 -1
  348. package/dist/cli/search-index.d.ts.map +1 -1
  349. package/dist/cli/search-index.js +7 -6
  350. package/dist/cli/search-index.js.map +1 -1
  351. package/dist/cli/statuses.d.ts +0 -2
  352. package/dist/cli/statuses.d.ts.map +1 -1
  353. package/dist/cli/statuses.js +0 -7
  354. package/dist/cli/statuses.js.map +1 -1
  355. package/dist/cli/stored-results.d.ts +7 -0
  356. package/dist/cli/stored-results.d.ts.map +1 -0
  357. package/dist/cli/stored-results.js +23 -0
  358. package/dist/cli/stored-results.js.map +1 -0
  359. package/dist/cli/version.d.ts.map +1 -1
  360. package/dist/cli/version.js +7 -5
  361. package/dist/cli/version.js.map +1 -1
  362. package/dist/cli-api.d.ts +34 -5
  363. package/dist/cli-api.d.ts.map +1 -1
  364. package/dist/cli-api.js +28 -4
  365. package/dist/cli-api.js.map +1 -1
  366. package/dist/composition/algebraic-equivalence.d.ts +43 -0
  367. package/dist/composition/algebraic-equivalence.d.ts.map +1 -0
  368. package/dist/composition/algebraic-equivalence.js +115 -0
  369. package/dist/composition/algebraic-equivalence.js.map +1 -0
  370. package/dist/composition/axes.d.ts +0 -6
  371. package/dist/composition/axes.d.ts.map +1 -1
  372. package/dist/composition/axes.js +6 -6
  373. package/dist/composition/axes.js.map +1 -1
  374. package/dist/composition/axis-audit.d.ts +47 -20
  375. package/dist/composition/axis-audit.d.ts.map +1 -1
  376. package/dist/composition/axis-audit.js +82 -9
  377. package/dist/composition/axis-audit.js.map +1 -1
  378. package/dist/composition/bridge-analysis.d.ts +17 -0
  379. package/dist/composition/bridge-analysis.d.ts.map +1 -1
  380. package/dist/composition/bridge-analysis.js +102 -55
  381. package/dist/composition/bridge-analysis.js.map +1 -1
  382. package/dist/composition/canonical-compare.d.ts +40 -0
  383. package/dist/composition/canonical-compare.d.ts.map +1 -1
  384. package/dist/composition/canonical-compare.js +122 -24
  385. package/dist/composition/canonical-compare.js.map +1 -1
  386. package/dist/composition/canonical-graph.d.ts +1 -1
  387. package/dist/composition/canonical-graph.d.ts.map +1 -1
  388. package/dist/composition/canonical-graph.js +9 -36
  389. package/dist/composition/canonical-graph.js.map +1 -1
  390. package/dist/composition/canonical-json.js +2 -2
  391. package/dist/composition/canonical-json.js.map +1 -1
  392. package/dist/composition/catalog-graph.d.ts.map +1 -1
  393. package/dist/composition/catalog-graph.js +2 -5
  394. package/dist/composition/catalog-graph.js.map +1 -1
  395. package/dist/composition/chain-candidate.d.ts +8 -0
  396. package/dist/composition/chain-candidate.d.ts.map +1 -1
  397. package/dist/composition/chain-candidate.js +9 -2
  398. package/dist/composition/chain-candidate.js.map +1 -1
  399. package/dist/composition/chain-match.d.ts +6 -3
  400. package/dist/composition/chain-match.d.ts.map +1 -1
  401. package/dist/composition/chain-match.js +4 -1
  402. package/dist/composition/chain-match.js.map +1 -1
  403. package/dist/composition/chain-result.d.ts.map +1 -1
  404. package/dist/composition/chain-result.js +2 -14
  405. package/dist/composition/chain-result.js.map +1 -1
  406. package/dist/composition/compose-symbolic.d.ts.map +1 -1
  407. package/dist/composition/compose-symbolic.js +3 -2
  408. package/dist/composition/compose-symbolic.js.map +1 -1
  409. package/dist/composition/compose.d.ts.map +1 -1
  410. package/dist/composition/compose.js +13 -5
  411. package/dist/composition/compose.js.map +1 -1
  412. package/dist/composition/composition-recovery.d.ts.map +1 -1
  413. package/dist/composition/composition-recovery.js +4 -7
  414. package/dist/composition/composition-recovery.js.map +1 -1
  415. package/dist/composition/discovery.d.ts +56 -0
  416. package/dist/composition/discovery.d.ts.map +1 -1
  417. package/dist/composition/discovery.js +114 -60
  418. package/dist/composition/discovery.js.map +1 -1
  419. package/dist/composition/edge.d.ts +21 -2
  420. package/dist/composition/edge.d.ts.map +1 -1
  421. package/dist/composition/edge.js +23 -1
  422. package/dist/composition/edge.js.map +1 -1
  423. package/dist/composition/enumerate.d.ts.map +1 -1
  424. package/dist/composition/enumerate.js +18 -3
  425. package/dist/composition/enumerate.js.map +1 -1
  426. package/dist/composition/evaluate-relation.d.ts +35 -11
  427. package/dist/composition/evaluate-relation.d.ts.map +1 -1
  428. package/dist/composition/evaluate-relation.js +60 -39
  429. package/dist/composition/evaluate-relation.js.map +1 -1
  430. package/dist/composition/explain.d.ts +3 -12
  431. package/dist/composition/explain.d.ts.map +1 -1
  432. package/dist/composition/explain.js +7 -20
  433. package/dist/composition/explain.js.map +1 -1
  434. package/dist/composition/expr-eval.d.ts.map +1 -1
  435. package/dist/composition/expr-eval.js +2 -11
  436. package/dist/composition/expr-eval.js.map +1 -1
  437. package/dist/composition/expr-simplify.d.ts +16 -0
  438. package/dist/composition/expr-simplify.d.ts.map +1 -1
  439. package/dist/composition/expr-simplify.js +15 -20
  440. package/dist/composition/expr-simplify.js.map +1 -1
  441. package/dist/composition/formula-shape.d.ts +23 -4
  442. package/dist/composition/formula-shape.d.ts.map +1 -1
  443. package/dist/composition/formula-shape.js +57 -17
  444. package/dist/composition/formula-shape.js.map +1 -1
  445. package/dist/composition/graph-structure.d.ts +98 -0
  446. package/dist/composition/graph-structure.d.ts.map +1 -0
  447. package/dist/composition/graph-structure.js +167 -0
  448. package/dist/composition/graph-structure.js.map +1 -0
  449. package/dist/composition/graph-viz-svg.d.ts.map +1 -1
  450. package/dist/composition/graph-viz-svg.js +1 -1
  451. package/dist/composition/graph-viz-svg.js.map +1 -1
  452. package/dist/composition/graph-viz.d.ts.map +1 -1
  453. package/dist/composition/graph-viz.js +8 -37
  454. package/dist/composition/graph-viz.js.map +1 -1
  455. package/dist/composition/identifiability.d.ts +91 -4
  456. package/dist/composition/identifiability.d.ts.map +1 -1
  457. package/dist/composition/identifiability.js +363 -6
  458. package/dist/composition/identifiability.js.map +1 -1
  459. package/dist/composition/index.d.ts +8 -4
  460. package/dist/composition/index.d.ts.map +1 -1
  461. package/dist/composition/index.js +3 -2
  462. package/dist/composition/index.js.map +1 -1
  463. package/dist/composition/mathts-quiet.d.ts +4 -3
  464. package/dist/composition/mathts-quiet.d.ts.map +1 -1
  465. package/dist/composition/mathts-quiet.js +4 -3
  466. package/dist/composition/mathts-quiet.js.map +1 -1
  467. package/dist/composition/mathts-scalar-symbols.d.ts.map +1 -1
  468. package/dist/composition/mathts-scalar-symbols.js +2 -1
  469. package/dist/composition/mathts-scalar-symbols.js.map +1 -1
  470. package/dist/composition/probe/corpus.d.ts +4 -2
  471. package/dist/composition/probe/corpus.d.ts.map +1 -1
  472. package/dist/composition/probe/corpus.js +20 -9
  473. package/dist/composition/probe/corpus.js.map +1 -1
  474. package/dist/composition/probe/dataset.d.ts +17 -0
  475. package/dist/composition/probe/dataset.d.ts.map +1 -1
  476. package/dist/composition/probe/dataset.js +95 -50
  477. package/dist/composition/probe/dataset.js.map +1 -1
  478. package/dist/composition/probe/experiment-design.d.ts +5 -1
  479. package/dist/composition/probe/experiment-design.d.ts.map +1 -1
  480. package/dist/composition/probe/experiment-design.js +44 -24
  481. package/dist/composition/probe/experiment-design.js.map +1 -1
  482. package/dist/composition/probe/falsify.d.ts.map +1 -1
  483. package/dist/composition/probe/falsify.js +2 -0
  484. package/dist/composition/probe/falsify.js.map +1 -1
  485. package/dist/composition/probe/fit.d.ts +6 -0
  486. package/dist/composition/probe/fit.d.ts.map +1 -1
  487. package/dist/composition/probe/fit.js +46 -22
  488. package/dist/composition/probe/fit.js.map +1 -1
  489. package/dist/composition/probe/frontier.d.ts.map +1 -1
  490. package/dist/composition/probe/frontier.js +33 -15
  491. package/dist/composition/probe/frontier.js.map +1 -1
  492. package/dist/composition/probe/generator.d.ts +27 -1
  493. package/dist/composition/probe/generator.d.ts.map +1 -1
  494. package/dist/composition/probe/generator.js +53 -30
  495. package/dist/composition/probe/generator.js.map +1 -1
  496. package/dist/composition/probe/index.d.ts +14 -0
  497. package/dist/composition/probe/index.d.ts.map +1 -1
  498. package/dist/composition/probe/index.js +6 -0
  499. package/dist/composition/probe/index.js.map +1 -1
  500. package/dist/composition/probe/limits.d.ts +24 -1
  501. package/dist/composition/probe/limits.d.ts.map +1 -1
  502. package/dist/composition/probe/limits.js +53 -11
  503. package/dist/composition/probe/limits.js.map +1 -1
  504. package/dist/composition/probe/pipeline.d.ts.map +1 -1
  505. package/dist/composition/probe/pipeline.js +10 -4
  506. package/dist/composition/probe/pipeline.js.map +1 -1
  507. package/dist/composition/probe/power-law.d.ts +121 -0
  508. package/dist/composition/probe/power-law.d.ts.map +1 -0
  509. package/dist/composition/probe/power-law.js +255 -0
  510. package/dist/composition/probe/power-law.js.map +1 -0
  511. package/dist/composition/probe/problem.d.ts +7 -4
  512. package/dist/composition/probe/problem.d.ts.map +1 -1
  513. package/dist/composition/probe/problem.js +177 -49
  514. package/dist/composition/probe/problem.js.map +1 -1
  515. package/dist/composition/probe/report.js +1 -1
  516. package/dist/composition/probe/report.js.map +1 -1
  517. package/dist/composition/probe/residual.d.ts +6 -1
  518. package/dist/composition/probe/residual.d.ts.map +1 -1
  519. package/dist/composition/probe/residual.js +9 -7
  520. package/dist/composition/probe/residual.js.map +1 -1
  521. package/dist/composition/probe/structure.d.ts +82 -17
  522. package/dist/composition/probe/structure.d.ts.map +1 -1
  523. package/dist/composition/probe/structure.js +129 -55
  524. package/dist/composition/probe/structure.js.map +1 -1
  525. package/dist/composition/probe/study.d.ts +31 -9
  526. package/dist/composition/probe/study.d.ts.map +1 -1
  527. package/dist/composition/probe/study.js +236 -181
  528. package/dist/composition/probe/study.js.map +1 -1
  529. package/dist/composition/probe/t-tail.d.ts +17 -0
  530. package/dist/composition/probe/t-tail.d.ts.map +1 -0
  531. package/dist/composition/probe/t-tail.js +32 -0
  532. package/dist/composition/probe/t-tail.js.map +1 -0
  533. package/dist/composition/probe/types.d.ts +3 -0
  534. package/dist/composition/probe/types.d.ts.map +1 -1
  535. package/dist/composition/probe/types.js.map +1 -1
  536. package/dist/composition/proposed-bridges.d.ts +41 -10
  537. package/dist/composition/proposed-bridges.d.ts.map +1 -1
  538. package/dist/composition/proposed-bridges.js +100 -55
  539. package/dist/composition/proposed-bridges.js.map +1 -1
  540. package/dist/composition/quantity-clusters.d.ts +48 -0
  541. package/dist/composition/quantity-clusters.d.ts.map +1 -0
  542. package/dist/composition/quantity-clusters.js +98 -0
  543. package/dist/composition/quantity-clusters.js.map +1 -0
  544. package/dist/composition/rational-exponent.d.ts +40 -0
  545. package/dist/composition/rational-exponent.d.ts.map +1 -0
  546. package/dist/composition/rational-exponent.js +65 -0
  547. package/dist/composition/rational-exponent.js.map +1 -0
  548. package/dist/composition/representative-values.d.ts +22 -0
  549. package/dist/composition/representative-values.d.ts.map +1 -1
  550. package/dist/composition/representative-values.js +23 -0
  551. package/dist/composition/representative-values.js.map +1 -1
  552. package/dist/composition/retrodiction.d.ts.map +1 -1
  553. package/dist/composition/retrodiction.js +2 -1
  554. package/dist/composition/retrodiction.js.map +1 -1
  555. package/dist/composition/user-equation.d.ts.map +1 -1
  556. package/dist/composition/user-equation.js +2 -2
  557. package/dist/composition/user-equation.js.map +1 -1
  558. package/dist/core/assignment.d.ts +19 -0
  559. package/dist/core/assignment.d.ts.map +1 -0
  560. package/dist/core/assignment.js +19 -0
  561. package/dist/core/assignment.js.map +1 -0
  562. package/dist/core/compare.d.ts +32 -0
  563. package/dist/core/compare.d.ts.map +1 -0
  564. package/dist/core/compare.js +46 -0
  565. package/dist/core/compare.js.map +1 -0
  566. package/dist/core/constants.d.ts +30 -30
  567. package/dist/core/constants.d.ts.map +1 -1
  568. package/dist/core/constants.js +47 -30
  569. package/dist/core/constants.js.map +1 -1
  570. package/dist/core/data-file.d.ts +7 -0
  571. package/dist/core/data-file.d.ts.map +1 -1
  572. package/dist/core/data-file.js +17 -0
  573. package/dist/core/data-file.js.map +1 -1
  574. package/dist/core/format.d.ts +36 -0
  575. package/dist/core/format.d.ts.map +1 -0
  576. package/dist/core/format.js +39 -0
  577. package/dist/core/format.js.map +1 -0
  578. package/dist/core/hash.d.ts +14 -0
  579. package/dist/core/hash.d.ts.map +1 -0
  580. package/dist/core/hash.js +17 -0
  581. package/dist/core/hash.js.map +1 -0
  582. package/dist/core/json-schema.d.ts +2 -0
  583. package/dist/core/json-schema.d.ts.map +1 -1
  584. package/dist/core/json-schema.js +14 -13
  585. package/dist/core/json-schema.js.map +1 -1
  586. package/dist/core/labeled-tensor.d.ts.map +1 -1
  587. package/dist/core/labeled-tensor.js +0 -8
  588. package/dist/core/labeled-tensor.js.map +1 -1
  589. package/dist/core/mathts-read.d.ts +25 -0
  590. package/dist/core/mathts-read.d.ts.map +1 -0
  591. package/dist/core/mathts-read.js +51 -0
  592. package/dist/core/mathts-read.js.map +1 -0
  593. package/dist/core/tensor.d.ts.map +1 -1
  594. package/dist/core/tensor.js +24 -0
  595. package/dist/core/tensor.js.map +1 -1
  596. package/dist/core/types.d.ts +5 -5
  597. package/dist/diff/bridge-gradient.d.ts +19 -6
  598. package/dist/diff/bridge-gradient.d.ts.map +1 -1
  599. package/dist/diff/bridge-gradient.js +19 -11
  600. package/dist/diff/bridge-gradient.js.map +1 -1
  601. package/dist/diff/bridge-specs.d.ts.map +1 -1
  602. package/dist/diff/bridge-specs.js +3 -0
  603. package/dist/diff/bridge-specs.js.map +1 -1
  604. package/dist/dimensional/algebra.d.ts +18 -0
  605. package/dist/dimensional/algebra.d.ts.map +1 -1
  606. package/dist/dimensional/algebra.js +41 -1
  607. package/dist/dimensional/algebra.js.map +1 -1
  608. package/dist/dimensional/ast-builders.d.ts +7 -0
  609. package/dist/dimensional/ast-builders.d.ts.map +1 -1
  610. package/dist/dimensional/ast-builders.js +11 -0
  611. package/dist/dimensional/ast-builders.js.map +1 -1
  612. package/dist/dimensional/ast-leaves.d.ts +81 -0
  613. package/dist/dimensional/ast-leaves.d.ts.map +1 -0
  614. package/dist/dimensional/ast-leaves.js +146 -0
  615. package/dist/dimensional/ast-leaves.js.map +1 -0
  616. package/dist/dimensional/buckingham.d.ts.map +1 -1
  617. package/dist/dimensional/buckingham.js +15 -27
  618. package/dist/dimensional/buckingham.js.map +1 -1
  619. package/dist/dimensional/constant-rows.js +9 -9
  620. package/dist/dimensional/constant-rows.js.map +1 -1
  621. package/dist/dimensional/dimension-inference.d.ts.map +1 -1
  622. package/dist/dimensional/dimension-inference.js +1 -2
  623. package/dist/dimensional/dimension-inference.js.map +1 -1
  624. package/dist/dimensional/errors.d.ts +1 -1
  625. package/dist/dimensional/errors.d.ts.map +1 -1
  626. package/dist/dimensional/errors.js +1 -15
  627. package/dist/dimensional/errors.js.map +1 -1
  628. package/dist/dimensional/exact-scale.d.ts +0 -17
  629. package/dist/dimensional/exact-scale.d.ts.map +1 -1
  630. package/dist/dimensional/exact-scale.js +8 -8
  631. package/dist/dimensional/exact-scale.js.map +1 -1
  632. package/dist/dimensional/gauge-field.d.ts.map +1 -1
  633. package/dist/dimensional/gauge-field.js +2 -2
  634. package/dist/dimensional/gauge-field.js.map +1 -1
  635. package/dist/dimensional/hyphen-names.d.ts +12 -2
  636. package/dist/dimensional/hyphen-names.d.ts.map +1 -1
  637. package/dist/dimensional/hyphen-names.js +44 -19
  638. package/dist/dimensional/hyphen-names.js.map +1 -1
  639. package/dist/dimensional/metric.d.ts.map +1 -1
  640. package/dist/dimensional/metric.js +0 -1
  641. package/dist/dimensional/metric.js.map +1 -1
  642. package/dist/dimensional/symbolic-constants.d.ts +9 -0
  643. package/dist/dimensional/symbolic-constants.d.ts.map +1 -1
  644. package/dist/dimensional/symbolic-constants.js +13 -1
  645. package/dist/dimensional/symbolic-constants.js.map +1 -1
  646. package/dist/dimensional/types.d.ts +36 -0
  647. package/dist/dimensional/types.d.ts.map +1 -1
  648. package/dist/dimensional/types.js +45 -7
  649. package/dist/dimensional/types.js.map +1 -1
  650. package/dist/dimensional/unit-data.js +2 -2
  651. package/dist/dimensional/unit-data.js.map +1 -1
  652. package/dist/index.d.ts +9 -3
  653. package/dist/index.d.ts.map +1 -1
  654. package/dist/index.js +10 -4
  655. package/dist/index.js.map +1 -1
  656. package/dist/numerical/christoffel-flat.d.ts.map +1 -1
  657. package/dist/numerical/christoffel-flat.js +3 -2
  658. package/dist/numerical/christoffel-flat.js.map +1 -1
  659. package/dist/numerical/covariant-eikonal.d.ts.map +1 -1
  660. package/dist/numerical/covariant-eikonal.js +34 -11
  661. package/dist/numerical/covariant-eikonal.js.map +1 -1
  662. package/dist/numerical/curvature-lowering-helpers.js +3 -2
  663. package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
  664. package/dist/numerical/errors.d.ts.map +1 -1
  665. package/dist/numerical/errors.js +0 -3
  666. package/dist/numerical/errors.js.map +1 -1
  667. package/dist/numerical/finite-difference.d.ts +22 -0
  668. package/dist/numerical/finite-difference.d.ts.map +1 -0
  669. package/dist/numerical/finite-difference.js +27 -0
  670. package/dist/numerical/finite-difference.js.map +1 -0
  671. package/dist/numerical/geodesic-integrator.d.ts.map +1 -1
  672. package/dist/numerical/geodesic-integrator.js +22 -14
  673. package/dist/numerical/geodesic-integrator.js.map +1 -1
  674. package/dist/numerical/geometrized.d.ts.map +1 -1
  675. package/dist/numerical/geometrized.js +0 -1
  676. package/dist/numerical/geometrized.js.map +1 -1
  677. package/dist/numerical/mathts-engine.d.ts.map +1 -1
  678. package/dist/numerical/mathts-engine.js +10 -24
  679. package/dist/numerical/mathts-engine.js.map +1 -1
  680. package/dist/numerical/metric-inverse.d.ts.map +1 -1
  681. package/dist/numerical/metric-inverse.js +83 -46
  682. package/dist/numerical/metric-inverse.js.map +1 -1
  683. package/dist/numerical/null-ray-integrator.d.ts +2 -1
  684. package/dist/numerical/null-ray-integrator.d.ts.map +1 -1
  685. package/dist/numerical/null-ray-integrator.js +12 -12
  686. package/dist/numerical/null-ray-integrator.js.map +1 -1
  687. package/dist/numerical/painleve-gullstrand-metric.js +2 -2
  688. package/dist/numerical/painleve-gullstrand-metric.js.map +1 -1
  689. package/dist/numerical/perihelion-finder.d.ts +0 -36
  690. package/dist/numerical/perihelion-finder.d.ts.map +1 -1
  691. package/dist/numerical/perihelion-finder.js +41 -87
  692. package/dist/numerical/perihelion-finder.js.map +1 -1
  693. package/dist/numerical/quadrature.d.ts.map +1 -1
  694. package/dist/numerical/quadrature.js +8 -10
  695. package/dist/numerical/quadrature.js.map +1 -1
  696. package/dist/numerical/rk4-trajectory.d.ts +10 -0
  697. package/dist/numerical/rk4-trajectory.d.ts.map +1 -0
  698. package/dist/numerical/rk4-trajectory.js +37 -0
  699. package/dist/numerical/rk4-trajectory.js.map +1 -0
  700. package/dist/numerical/schwarzschild.d.ts +14 -0
  701. package/dist/numerical/schwarzschild.d.ts.map +1 -0
  702. package/dist/numerical/schwarzschild.js +17 -0
  703. package/dist/numerical/schwarzschild.js.map +1 -0
  704. package/dist/numerical/spacetime-metrics.d.ts +12 -0
  705. package/dist/numerical/spacetime-metrics.d.ts.map +1 -1
  706. package/dist/numerical/spacetime-metrics.js +72 -56
  707. package/dist/numerical/spacetime-metrics.js.map +1 -1
  708. package/dist/numerical/statistics.d.ts +24 -0
  709. package/dist/numerical/statistics.d.ts.map +1 -0
  710. package/dist/numerical/statistics.js +52 -0
  711. package/dist/numerical/statistics.js.map +1 -0
  712. package/dist/numerical/tensor-engine.d.ts +21 -0
  713. package/dist/numerical/tensor-engine.d.ts.map +1 -1
  714. package/dist/numerical/tensor-engine.js +12 -0
  715. package/dist/numerical/tensor-engine.js.map +1 -1
  716. package/dist/relations/regime.d.ts +10 -0
  717. package/dist/relations/regime.d.ts.map +1 -1
  718. package/dist/relations/regime.js +18 -1
  719. package/dist/relations/regime.js.map +1 -1
  720. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"explain.js","sourceRoot":"","sources":["../../src/composition/explain.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * \"Explain this quantity\" — the unified entry point over the three\n * bridge-inference primitives (docs/planning/Bridge-Inference-Epistemics-\n * Note.md). Given a target quantity and a set of knowns (names, or\n * name→value), it composes:\n *\n * 1. the identifiability classifier — CAN the graph compute the target\n * from the knowns, and via how many derivations? Independence is\n * counted by catalog bridge (`beId`): two routes that restate one bridge\n * agree by algebra, and the summary says so.\n * 2. the retrodiction harness — when values are supplied, RECOVER the\n * value via each derivation and (for over-determined targets) check\n * they agree;\n * 3. the Buckingham-π enumerator — is the known set even DIMENSIONALLY\n * sufficient to fix the target up to a constant, independent of the\n * graph's encoded edges?\n *\n * The three answer complementary questions, so the explanation is richer\n * than any one alone: the graph may compute a target whose dimensional\n * closure relies on constants baked into the evaluator (e.g. r_s = 2GM/c²\n * — mass alone is not dimensionally sufficient), and the classifier +\n * Buckingham layer make that explicit together.\n *\n * @module composition/explain\n */\n\nimport type { BridgeEdge } from './edge.js';\nimport type { QuantityIdentification } from './compose.js';\nimport { QUANTITY_IDENTIFICATIONS } from './compose.js';\nimport type { IdentifiabilityResult } from './identifiability.js';\nimport { classifyIdentifiability, forwardClosure } from './identifiability.js';\nimport type { RetrodictionResult } from './retrodiction.js';\nimport { retrodictNode } from './retrodiction.js';\nimport type { Dimension } from '../dimensional/types.js';\nimport { CANONICAL_GROUP_PREFACTORS } from './canonical-prefactors.js';\nimport { canonicalById } from '../canonical/registry.js';\n\n/**\n * Text form of a recovered quantity: `digits` significant digits (15 by default, the precision an\n * evaluator input is already passed at; a statistic such as a residual in σ asks for 3). JSON keeps\n * the number; this is only the printed form. An integer stays an integer (`1`, not `1.0000e+0`).\n * Every command prints a number through this function or through {@link formatExact}.\n * @internal\n */\nexport function formatQuantity(value: number, digits = 15): string {\n return String(Number(value.toPrecision(digits)));\n}\n\n/**\n * Text form of a computed value that a reader may need to reproduce bit for bit: the shortest\n * decimal that round-trips to the same double (`upt evaluate`'s outputs). A recovered or compared\n * quantity prints through {@link formatQuantity} instead.\n * @internal\n */\nexport function formatExact(value: number): string {\n return String(value);\n}\nimport type { DimensionalDeterminationResult } from '../dimensional/buckingham.js';\nimport { dimensionallyDetermines } from '../dimensional/buckingham.js';\nimport { collapseSynonymGovernors } from './aliases.js';\nimport { formulaShape } from './formula-shape.js';\n\n/** One structural derivation of the target, with the recovered value when\n * ground-truth values were supplied. @public */\nexport interface DerivationExplanation {\n readonly edge: string;\n /**\n * The catalog bridge the last edge encodes (`BridgeEdge.beId`), `null` for a\n * law or an uncatalogued edge. Two routes with the same `beId` are one\n * bridge restated, so their agreement is algebra, not a check.\n */\n readonly beId: number | null;\n readonly label: string;\n /** The edge's immediate (last-hop) source quantities. */\n readonly sources: readonly string[];\n /**\n * The LEAF inputs this derivation ultimately depends on — its immediate\n * sources traced back through every intermediate to the known set. The\n * full-chain (leaf-to-target) view, vs `sources` (last-hop). A subset of\n * the known set.\n */\n readonly leafInputs: readonly string[];\n /**\n * The target as a dimensionless-constant-times-monomial in the LEAF\n * inputs, when those leaves dimensionally fix it (Buckingham-π over the\n * full chain). Absent when the leaves rely on dimensionful constants\n * baked into the evaluators (the common case for the bridge graph).\n */\n readonly dimensionalForm?: {\n readonly monomial: Readonly<Record<string, number>>;\n /** e.g. `period ∝ length^1·gravity^-1` (up to a dimensionless constant). */\n readonly formula: string;\n };\n /** Value recovered via this derivation (only when values were given). */\n readonly value?: number;\n}\n\n/** Options for {@link explainQuantity}. @public */\nexport interface ExplainOptions {\n readonly identifications?: readonly QuantityIdentification[];\n /** Consistency tolerance forwarded to the retrodiction harness. */\n readonly tolerance?: number;\n /**\n * Dimensions for known names that are not graph quantities (e.g. raw\n * constants `G`, `c`, `hbar`) — lets the Buckingham layer test a known\n * set richer than the graph's nodes.\n */\n readonly extraDimensions?: Readonly<Record<string, Dimension>>;\n}\n\n/** The unified explanation of one quantity. @public */\nexport interface QuantityExplanation {\n readonly target: string;\n readonly known: readonly string[];\n /** Structural verdict (under/exactly/over-determined or given). */\n readonly identifiability: IdentifiabilityResult;\n /** One entry per independent derivation the classifier found. */\n readonly derivations: readonly DerivationExplanation[];\n /** Retrodiction result, present when ≥2 derivations fired on values. */\n readonly consistency?: RetrodictionResult;\n /** Agreed recovered value (consistent or single), when values supplied. */\n readonly recoveredValue?: number;\n /**\n * Where the numeric factor came from. `unset` is not the same as a\n * missing `recoveredValue`: the inputs were read and the factor has\n * no source. `group` means a bound dimensionless group supplied it.\n */\n readonly coefficient?: 'sourced' | 'group' | 'unset';\n /** Whether the KNOWN set dimensionally fixes the target (Buckingham-π);\n * absent when the target has no resolvable dimension. */\n readonly dimensional?: DimensionalDeterminationResult;\n /** Derivations that refused the given values, each under its own kind (`RetrodictionRefusal`). */\n readonly refusals?: RetrodictionResult['refusals'];\n /** Upstream gaps for an under-determined target (from the classifier). */\n readonly blockingFrontier: readonly string[];\n /** Plain-language synthesis of the above. */\n readonly summary: string;\n}\n\n/**\n * A Buckingham monomial is the encoded formula only when scaling each known\n * input scales the recovered value by that exponent. A monomial such as\n * `n^(-1/3)` or `∝ 1` can share the target's dimension and still not be the\n * formula, because the formula carries constants the monomial did not use.\n * Samples that the domain refuses leave the monomial in place: this check\n * does not invent a second domain.\n */\nfunction encodedMatchesMonomial(\n edges: readonly BridgeEdge[],\n target: string,\n knownNames: readonly string[],\n monomial: Readonly<Record<string, number>>,\n identifications: readonly QuantityIdentification[],\n): boolean {\n if (knownNames.length === 0) return true;\n const base: Record<string, number> = {};\n knownNames.forEach((name, i) => {\n base[name] = 1.7 + 0.3 * i;\n });\n const read = (values: Record<string, number>): number | undefined => {\n const retro = retrodictNode(edges, values, target, { identifications });\n const hit = retro.predictions.find((prediction) => Number.isFinite(prediction.value) && prediction.value !== 0);\n return hit?.value;\n };\n const origin = read(base);\n if (origin === undefined) return true;\n for (const name of knownNames) {\n const current = base[name];\n if (current === undefined) return true;\n const next = read({ ...base, [name]: current * 4 });\n if (next === undefined) return true;\n const exponent = monomial[name] ?? 0;\n // A known name the evaluator does not read (G declared beside a law that\n // already bakes G in) does not move the value. That is not a mismatch.\n const unchanged = Math.abs(next - origin) / Math.max(Math.abs(origin), 1e-300) < 1e-9;\n if (unchanged && Math.abs(exponent) > 1e-9) continue;\n const expected = origin * Math.pow(4, exponent);\n const scale = Math.max(Math.abs(expected), Math.abs(next), 1e-300);\n if (Math.abs(next - expected) / scale > 1e-6) return false;\n }\n return true;\n}\n\nfunction buildDimMap(\n edges: readonly BridgeEdge[],\n extra?: Readonly<Record<string, Dimension>>,\n): Map<string, Dimension> {\n const m = new Map<string, Dimension>();\n for (const e of edges) {\n for (const s of e.sources) if (!m.has(s.name)) m.set(s.name, s.dim);\n if (!m.has(e.target.name)) m.set(e.target.name, e.target.dim);\n }\n if (extra) for (const [k, v] of Object.entries(extra)) m.set(k, v);\n return m;\n}\n\n/**\n * Trace `startSources` back through every intermediate to the leaf inputs\n * — names in `known`, or terminals that no determinable edge produces.\n * Never expands the target (a self-loop would be circular). The union over\n * alternative sub-derivations of an over-determined intermediate.\n */\nfunction traceLeaves(\n edges: readonly BridgeEdge[],\n known: ReadonlySet<string>,\n determinable: ReadonlySet<string>,\n startSources: readonly string[],\n idents: readonly QuantityIdentification[],\n target: string,\n): string[] {\n const leaves = new Set<string>();\n const visited = new Set<string>([target]); // never expand the target itself\n const stack = [...startSources];\n while (stack.length) {\n const q = stack.pop()!;\n if (known.has(q)) {\n leaves.add(q);\n continue;\n }\n if (visited.has(q)) continue;\n visited.add(q);\n let expanded = false;\n for (const e of edges) {\n if (e.target.name !== q) continue;\n if (!e.sources.every((s) => determinable.has(s.name))) continue;\n for (const s of e.sources) stack.push(s.name);\n expanded = true;\n }\n if (!expanded) {\n for (const id of idents) {\n if (id.to === q && determinable.has(id.from)) {\n stack.push(id.from);\n expanded = true;\n }\n }\n }\n if (!expanded) leaves.add(q); // a terminal we cannot expand\n }\n return [...leaves].sort();\n}\n\n/** An even integer power is already an even function of a signed input. */\nfunction evenIntegerPower(exp: number): boolean {\n return Number.isInteger(exp) && Math.abs(exp) % 2 === 0;\n}\n\n/**\n * Buckingham's exponent of an even input is the exponent of its magnitude.\n * `√(q²)` and `|q|` come out as `q^1` and `q^-1`. Those odd powers are\n * printed as `|q|`, so a dimensionless constant can produce the positive\n * value. An even integer power (`q^2`, `q^-2`) is already even.\n */\nfunction formatMonomial(m: Readonly<Record<string, number>>, even?: ReadonlySet<string>): string {\n const parts = Object.entries(m)\n .filter(([, e]) => e !== 0)\n .map(([n, e]) => {\n const token = even?.has(n) === true && !evenIntegerPower(e) ? `|${n}|` : n;\n return e === 1 ? token : `${token}^${e}`;\n });\n return parts.join('·') || '1';\n}\n\n/**\n * Names every fired edge treats as a magnitude. A name that is signed on\n * any fired edge stays signed: one odd formula does not borrow another's\n * absolute value.\n */\nfunction magnitudeNames(edges: readonly BridgeEdge[]): ReadonlySet<string> {\n const even = new Set<string>();\n const signed = new Set<string>();\n for (const edge of edges) {\n const marked = new Set(edge.evenInputs ?? []);\n for (const source of edge.sources) {\n if (marked.has(source.name)) even.add(source.name);\n else signed.add(source.name);\n }\n }\n for (const name of signed) even.delete(name);\n return even;\n}\n\nfunction factorsOn(edge: BridgeEdge | undefined): Readonly<Record<string, number>> {\n return edge?.formulaFactors ?? {};\n}\n\nfunction collectFactors(edges: readonly BridgeEdge[]): Record<string, number> {\n const out: Record<string, number> = {};\n for (const edge of edges) {\n for (const [name, exp] of Object.entries(factorsOn(edge))) out[name] = exp;\n }\n return out;\n}\n\n/**\n * Buckingham cannot see a dimensionless count, so the printed monomial\n * omits it. Put the recorded exponent back for each count the inputs name.\n */\nfunction monomialWithFactors(\n monomial: Readonly<Record<string, number>>,\n factors: Readonly<Record<string, number>>,\n present: ReadonlySet<string>,\n): Record<string, number> {\n const merged: Record<string, number> = { ...monomial };\n for (const [name, exp] of Object.entries(factors)) {\n if (present.has(name) && exp !== 0) merged[name] = exp;\n }\n return merged;\n}\n\n\nfunction buildSummary(\n target: string,\n id: IdentifiabilityResult,\n derivations: readonly DerivationExplanation[],\n consistency: RetrodictionResult | undefined,\n recoveredValue: number | undefined,\n dimensional: DimensionalDeterminationResult | undefined,\n knownNames: readonly string[],\n formulaIsSum: boolean,\n encodedMatchesMonomial: boolean,\n unsetSentence: string | undefined,\n even: ReadonlySet<string>,\n /** The identification that determines the target when no edge does. */\n viaIdentification: QuantityIdentification | undefined,\n): string {\n const known = knownNames.length\n ? `{${knownNames.join(', ')}}`\n : '{} (no inputs)';\n const ids = derivations.map((d) => d.edge).join(', ');\n let s: string;\n\n switch (id.verdict) {\n case 'given':\n s = `'${target}' is a supplied input.`;\n if (derivations.length) {\n s += ` ${derivations.length} graph derivation(s) (${ids}) can cross-check it`;\n s += consistency\n ? consistency.outcome === 'consistent'\n ? `, and they are consistent (relative spread ${consistency.relativeSpread.toExponential(1)}).`\n : ` — and they are INCONSISTENT (relative spread ${consistency.relativeSpread.toExponential(1)}).`\n : '.';\n }\n break;\n case 'under-determined':\n s = `'${target}' is in the graph, but cannot be determined from ${known}: the graph has no derivation path.`;\n if (id.blockingFrontier.length) {\n s += ` Knowing one of {${id.blockingFrontier.join(', ')}} would unblock it.`;\n }\n break;\n case 'exactly-determined': {\n // No edge derives a target the identification alone determines; the\n // sentence then names the identification, not an undefined edge\n // (9.0.0 audit §4 C11).\n const first = derivations[0];\n s =\n first !== undefined\n ? `'${target}' is determined from ${known} via ${first.edge} (${first.label}).`\n : viaIdentification !== undefined\n ? `'${target}' is determined from ${known} by the identification ${viaIdentification.from} ≡ ${viaIdentification.to} (${viaIdentification.rationale}).`\n : `'${target}' is determined from ${known}.`;\n if (recoveredValue !== undefined) {\n s += ` Recovered value: ${formatQuantity(recoveredValue)}.`;\n }\n break;\n }\n case 'over-determined':\n default: {\n // Independence is counted by BRIDGE, not by edge: be-42 and be-42-via-rs\n // are one bridge written in M and in r_s, and agree by algebra.\n const bridges = [...new Set(derivations.map((d) => (d.beId === null ? d.edge : `BE-${d.beId}`)))];\n const oneBridge = bridges.length === 1 && derivations.length > 1;\n if (bridges.length === derivations.length) {\n s = `'${target}' is over-determined from ${known}: ${derivations.length} independent derivations (${ids}).`;\n } else if (oneBridge) {\n s = `'${target}' is over-determined from ${known}: ${derivations.length} derivation routes (${ids}) restate ONE bridge (${bridges[0]}).`;\n } else {\n s = `'${target}' is over-determined from ${known}: ${derivations.length} derivation routes (${ids}) over ${bridges.length} distinct bridges (${bridges.join(', ')}).`;\n }\n if (consistency) {\n const spread = consistency.relativeSpread.toExponential(1);\n if (consistency.outcome === 'consistent') {\n s += oneBridge\n ? ` They agree (relative spread ${spread}) — agreement by construction, not an independent check.`\n : ` They agree (relative spread ${spread}) — a passing consistency check.`;\n } else {\n s += oneBridge\n ? ` They DISAGREE (relative spread ${spread}) — two forms of one bridge disagree: an encoding error.`\n : ` They DISAGREE (relative spread ${spread}) — a falsification.`;\n }\n } else if (oneBridge) {\n s += ` The routes restate one bridge, so they carry no independent constraint.`;\n } else {\n s += ` The ${id.surplusConstraints} surplus derivation(s) are falsifiable consistency constraints (supply values to check them).`;\n }\n if (recoveredValue !== undefined) {\n s += ` Recovered value: ${formatQuantity(recoveredValue)}.`;\n }\n break;\n }\n }\n\n if (dimensional?.determined && dimensional.monomial && formulaIsSum) {\n s += ` The encoded formula adds dimensionful terms, so it is not a proportionality.`;\n } else if (dimensional?.determined && dimensional.monomial && !encodedMatchesMonomial) {\n s += ` Dimensionally, those inputs alone do not fix it — the encoded formula carries dimensionful constants.`;\n } else if (dimensional?.determined && dimensional.monomial) {\n s += ` Dimensionally, ${known} fix it up to a dimensionless constant: ${target} ∝ ${formatMonomial(dimensional.monomial, even)}.`;\n } else if (dimensional?.outsideGoverningSpan && knownNames.length) {\n s += ` Dimensionally, those inputs alone do not fix it — the encoded formula carries dimensionful constants.`;\n } else if (dimensional && !dimensional.determined && knownNames.length) {\n s += ` Dimensionally, those inputs alone do not fix a unique monomial.`;\n }\n // The unset factor is a fact about the edge, whatever the inputs span: it is said whether or\n // not a ∝ line could be printed (a baked constant removes the ∝ line, not the unset factor).\n if (unsetSentence !== undefined) s += ` ${unsetSentence}`;\n return s;\n}\n\n/**\n * Explain a quantity: synthesize the identifiability verdict, the\n * recovered value + consistency (when values are supplied), and the\n * dimensional sufficiency of the known set into one report.\n *\n * `known` may be a list of names (structural + dimensional analysis only)\n * or a `name → value` map (adds value recovery and the over-determined\n * consistency check).\n *\n * @public\n */\nexport function explainQuantity(\n edges: readonly BridgeEdge[],\n target: string,\n known: readonly string[] | Readonly<Record<string, number>>,\n opts: ExplainOptions = {},\n): QuantityExplanation {\n const identifications = opts.identifications ?? QUANTITY_IDENTIFICATIONS;\n const hasValues = !Array.isArray(known);\n const values = hasValues ? (known as Record<string, number>) : null;\n const rawNames = hasValues\n ? Object.keys(values!)\n : [...new Set(known as string[])];\n const sourceNames = new Set<string>();\n for (const e of edges) {\n if (e.target.name !== target) continue;\n for (const s of e.sources) sourceNames.add(s.name);\n }\n // A copied synonym is the same quantity. Buckingham and the printed\n // known set see one name. The value map still carries both spellings\n // so the edge source evaluates.\n const knownNames = collapseSynonymGovernors(rawNames, sourceNames, values);\n\n const identifiability = classifyIdentifiability(edges, knownNames, target, {\n identifications,\n });\n\n const byId = new Map(edges.map((e) => [e.id, e] as const));\n\n let consistency: RetrodictionResult | undefined;\n let refusals: RetrodictionResult['refusals'];\n let recoveredValue: number | undefined;\n const valueByEdge = new Map<string, number>();\n if (values) {\n const references =\n target in values ? { [target]: values[target] } : undefined;\n const retro = retrodictNode(edges, values, target, {\n identifications,\n tolerance: opts.tolerance,\n references,\n });\n refusals = retro.refusals;\n for (const p of retro.predictions) valueByEdge.set(p.edge, p.value);\n if (retro.predictions.length >= 2) consistency = retro;\n if (\n (retro.outcome === 'consistent' || retro.outcome === 'single') &&\n retro.predictions.length > 0\n ) {\n recoveredValue =\n retro.predictions.reduce((a, p) => a + p.value, 0) /\n retro.predictions.length;\n }\n }\n\n const dimMap = buildDimMap(edges, opts.extraDimensions);\n const knownSet = new Set(knownNames);\n const determinable = forwardClosure(edges, knownNames, identifications);\n\n const derivations: DerivationExplanation[] = identifiability.derivations.map(\n (eid) => {\n const e = byId.get(eid);\n const sources = e ? e.sources.map((s) => s.name) : [];\n // Full-chain: trace the immediate sources back to the leaf inputs.\n const leafInputs = e\n ? traceLeaves(\n edges,\n knownSet,\n determinable,\n sources,\n identifications,\n target,\n )\n : [];\n // Dimensional form in terms of those leaves, when they fix the target.\n let dimensionalForm: DerivationExplanation['dimensionalForm'];\n const targetDimForChain = dimMap.get(target);\n if (targetDimForChain && leafInputs.length) {\n const factors = factorsOn(e);\n const governing = leafInputs\n .filter((n) => n !== target && dimMap.has(n) && factors[n] === undefined)\n .map((n) => ({ name: n, dim: dimMap.get(n)! }));\n const det = dimensionallyDetermines(\n { name: target, dim: targetDimForChain },\n governing,\n );\n const symbolic = e?.symbolic;\n const sum = symbolic !== undefined && formulaShape(symbolic) === 'dimensional-sum';\n const leaves = leafInputs.filter((name) => name !== target);\n const missingCount = Object.keys(factors).some((name) => !leaves.includes(name));\n const merged =\n det.determined && det.monomial !== undefined\n ? monomialWithFactors(det.monomial, factors, new Set(leaves))\n : undefined;\n const agrees =\n merged !== undefined &&\n encodedMatchesMonomial(edges, target, leaves, merged, identifications);\n if (!sum && !missingCount && merged !== undefined && agrees) {\n dimensionalForm = {\n monomial: merged,\n formula: `${target} ∝ ${formatMonomial(merged, new Set(e?.evenInputs ?? []))}`,\n };\n }\n }\n return {\n edge: eid,\n beId: e?.beId ?? null,\n label: e?.label ?? eid,\n sources,\n leafInputs,\n ...(dimensionalForm ? { dimensionalForm } : {}),\n ...(valueByEdge.has(eid) ? { value: valueByEdge.get(eid) } : {}),\n };\n },\n );\n\n // Dimensional sufficiency of the KNOWN set, independent of the graph.\n // A dimensionless count is stripped before Buckingham (it is a π-group and\n // would make the monomial non-unique) and written back into the monomial\n // the summary prints. An edge whose other sources are known, but whose\n // count is not, does not get to claim the count-free monomial.\n const firedEdges = identifiability.derivations\n .map((id) => byId.get(id))\n .filter((edge): edge is BridgeEdge => edge !== undefined);\n const firedFactors = collectFactors(firedEdges);\n const boundGroupExponents: Record<string, number> = {};\n if (values) {\n for (const edge of firedEdges) {\n const group = CANONICAL_GROUP_PREFACTORS.find((p) => p.id === edge.id);\n if (group !== undefined && Number.isFinite(values[group.group])) {\n boundGroupExponents[group.group] = group.exponent;\n }\n }\n }\n const blockedByCount = edges.filter((edge) => {\n if (edge.target.name !== target) return false;\n const factors = factorsOn(edge);\n const names = Object.keys(factors);\n if (names.length === 0 || names.every((name) => knownSet.has(name))) return false;\n return edge.sources\n .filter((source) => factors[source.name] === undefined)\n .every((source) => knownSet.has(source.name) || determinable.has(source.name));\n });\n let dimensional: DimensionalDeterminationResult | undefined;\n const targetDim = dimMap.get(target);\n if (targetDim) {\n const strip = new Set<string>([\n ...Object.keys(firedFactors),\n ...blockedByCount.flatMap((edge) => Object.keys(factorsOn(edge))),\n ]);\n const governing = knownNames\n .filter((n) => n !== target && dimMap.has(n) && !strip.has(n))\n .map((n) => ({ name: n, dim: dimMap.get(n)! }));\n const det = dimensionallyDetermines({ name: target, dim: targetDim }, governing);\n const hideCountFree = blockedByCount.length > 0 && firedEdges.length === 0;\n if (hideCountFree) {\n dimensional = {\n ...det,\n determined: false,\n monomial: undefined,\n reason: 'a dimensionless count in the formula is not among the inputs',\n };\n } else if (det.determined && det.monomial !== undefined) {\n dimensional = {\n ...det,\n monomial: monomialWithFactors(\n det.monomial,\n { ...firedFactors, ...boundGroupExponents },\n knownSet,\n ),\n };\n } else {\n dimensional = det;\n }\n }\n\n const formulaIsSum = identifiability.derivations.some((eid) => {\n const symbolic = byId.get(eid)?.symbolic;\n return symbolic !== undefined && formulaShape(symbolic) === 'dimensional-sum';\n });\n const encodedAgrees =\n dimensional?.determined === true && dimensional.monomial !== undefined\n ? encodedMatchesMonomial(edges, target, knownNames, dimensional.monomial, identifications)\n : true;\n\n const unsetEdge = derivations\n .map((d) => byId.get(d.edge))\n .find((e) => e?.coefficientUnset === true);\n const groupBound =\n unsetEdge !== undefined &&\n CANONICAL_GROUP_PREFACTORS.some(\n (p) => p.id === unsetEdge.id && values !== null && Number.isFinite(values[p.group]),\n );\n const unsetSentence =\n unsetEdge === undefined || groupBound\n ? undefined\n : 'The factor is unset.' +\n (canonicalById(unsetEdge.id)?.unsetFactorNote !== undefined ? ` ${canonicalById(unsetEdge.id)!.unsetFactorNote}` : '');\n\n const coefficient: QuantityExplanation['coefficient'] =\n unsetEdge !== undefined && !groupBound\n ? 'unset'\n : groupBound\n ? 'group'\n : recoveredValue !== undefined\n ? 'sourced'\n : undefined;\n\n // A target with no derivation that is still determinable is reached by an\n // identification whose `from` the known set determines.\n const viaIdentification =\n identifiability.verdict === 'exactly-determined' && derivations.length === 0\n ? identifications.find((ident) => ident.to === target && determinable.has(ident.from))\n : undefined;\n\n const summary = buildSummary(\n target,\n identifiability,\n derivations,\n consistency,\n recoveredValue,\n dimensional,\n knownNames,\n formulaIsSum,\n encodedAgrees,\n unsetSentence,\n magnitudeNames(firedEdges),\n viaIdentification,\n );\n // A refusal of the point (a validity domain, opposite carrier signs, a formula with no\n // finite value there) is a bad value and is named with the edge's own reason. An unset\n // coefficient is not: `unsetSentence` already says it in words (AGENTS law 4).\n const domainRefusals = (refusals ?? []).filter((r) => r.kind !== 'coefficient-unset');\n const refusalSentence =\n domainRefusals.length === 0 || recoveredValue !== undefined\n ? ''\n : ` No recovered value: ${domainRefusals.map((r) => r.reason).join('; ')}.`;\n\n return {\n target,\n known: knownNames,\n identifiability,\n derivations,\n ...(consistency ? { consistency } : {}),\n ...(recoveredValue !== undefined ? { recoveredValue } : {}),\n ...(coefficient !== undefined ? { coefficient } : {}),\n ...(dimensional ? { dimensional } : {}),\n ...(refusals !== undefined ? { refusals } : {}),\n blockingFrontier: identifiability.blockingFrontier,\n summary: summary + refusalSentence,\n };\n}\n"]}
1
+ {"version":3,"file":"explain.js","sourceRoot":"","sources":["../../src/composition/explain.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * \"Explain this quantity\" — the unified entry point over the three\n * bridge-inference primitives (docs/planning/Bridge-Inference-Epistemics-\n * Note.md). Given a target quantity and a set of knowns (names, or\n * name→value), it composes:\n *\n * 1. the identifiability classifier — CAN the graph compute the target\n * from the knowns, and via how many derivations? Independence is\n * counted by catalog bridge (`beId`): two routes that restate one bridge\n * agree by algebra, and the summary says so.\n * 2. the retrodiction harness — when values are supplied, RECOVER the\n * value via each derivation and (for over-determined targets) check\n * they agree;\n * 3. the Buckingham-π enumerator — is the known set even DIMENSIONALLY\n * sufficient to fix the target up to a constant, independent of the\n * graph's encoded edges?\n *\n * The three answer complementary questions, so the explanation is richer\n * than any one alone: the graph may compute a target whose dimensional\n * closure relies on constants baked into the evaluator (e.g. r_s = 2GM/c²\n * — mass alone is not dimensionally sufficient), and the classifier +\n * Buckingham layer make that explicit together.\n *\n * @module composition/explain\n */\n\nimport type { BridgeEdge } from './edge.js';\nimport type { QuantityIdentification } from './compose.js';\nimport { QUANTITY_IDENTIFICATIONS } from './compose.js';\nimport type { IdentifiabilityResult } from './identifiability.js';\nimport { classifyIdentifiability, forwardClosure } from './identifiability.js';\nimport { fixedPoint } from '../canonical/fixed-points.js';\nimport type { RetrodictionResult } from './retrodiction.js';\nimport { retrodictNode } from './retrodiction.js';\nimport type { Dimension } from '../dimensional/types.js';\nimport { CANONICAL_GROUP_PREFACTORS } from './canonical-prefactors.js';\nimport { canonicalById } from '../canonical/registry.js';\n\nimport { formatQuantity } from '../core/format.js';\n/**\n * The printed forms of a number, owned by `core/format` and re-exported here so the commands'\n * imports stay as they were: every command prints a number through `formatQuantity` or `formatExact`.\n * @internal\n */\nexport { formatQuantity, formatExact } from '../core/format.js';\nimport type { DimensionalDeterminationResult } from '../dimensional/buckingham.js';\nimport { dimensionallyDetermines } from '../dimensional/buckingham.js';\nimport { collapseSynonymGovernors } from './aliases.js';\nimport { formulaShape } from './formula-shape.js';\n\n/** One structural derivation of the target, with the recovered value when\n * ground-truth values were supplied. @public */\nexport interface DerivationExplanation {\n readonly edge: string;\n /**\n * The catalog bridge the last edge encodes (`BridgeEdge.beId`), `null` for a\n * law or an uncatalogued edge. Two routes with the same `beId` are one\n * bridge restated, so their agreement is algebra, not a check.\n */\n readonly beId: number | null;\n readonly label: string;\n /** The edge's immediate (last-hop) source quantities. */\n readonly sources: readonly string[];\n /**\n * The LEAF inputs this derivation ultimately depends on — its immediate\n * sources traced back through every intermediate to the known set. The\n * full-chain (leaf-to-target) view, vs `sources` (last-hop). A subset of\n * the known set.\n */\n readonly leafInputs: readonly string[];\n /**\n * The target as a dimensionless-constant-times-monomial in the LEAF\n * inputs, when those leaves dimensionally fix it (Buckingham-π over the\n * full chain). Absent when the leaves rely on dimensionful constants\n * baked into the evaluators (the common case for the bridge graph).\n */\n readonly dimensionalForm?: {\n readonly monomial: Readonly<Record<string, number>>;\n /** e.g. `period ∝ length^1·gravity^-1` (up to a dimensionless constant). */\n readonly formula: string;\n };\n /** Value recovered via this derivation (only when values were given). */\n readonly value?: number;\n}\n\n/** Options for {@link explainQuantity}. @public */\nexport interface ExplainOptions {\n readonly identifications?: readonly QuantityIdentification[];\n /** Consistency tolerance forwarded to the retrodiction harness. */\n readonly tolerance?: number;\n /**\n * Dimensions for known names that are not graph quantities (e.g. raw\n * constants `G`, `c`, `hbar`) — lets the Buckingham layer test a known\n * set richer than the graph's nodes.\n */\n readonly extraDimensions?: Readonly<Record<string, Dimension>>;\n}\n\n/** The unified explanation of one quantity. @public */\nexport interface QuantityExplanation {\n readonly target: string;\n readonly known: readonly string[];\n /** Structural verdict (under/exactly/over-determined or given). */\n readonly identifiability: IdentifiabilityResult;\n /** One entry per independent derivation the classifier found. */\n readonly derivations: readonly DerivationExplanation[];\n /** Retrodiction result, present when ≥2 derivations fired on values. */\n readonly consistency?: RetrodictionResult;\n /** Agreed recovered value (consistent or single), when values supplied. */\n readonly recoveredValue?: number;\n /**\n * Where the numeric factor came from. `unset` is not the same as a\n * missing `recoveredValue`: the inputs were read and the factor has\n * no source. `group` means a bound dimensionless group supplied it.\n */\n readonly coefficient?: 'sourced' | 'group' | 'unset';\n /** Whether the KNOWN set dimensionally fixes the target (Buckingham-π);\n * absent when the target has no resolvable dimension. */\n readonly dimensional?: DimensionalDeterminationResult;\n /** Derivations that refused the given values, each under its own kind (`RetrodictionRefusal`). */\n readonly refusals?: RetrodictionResult['refusals'];\n /** Upstream gaps for an under-determined target (from the classifier). */\n readonly blockingFrontier: readonly string[];\n /** Plain-language synthesis of the above. */\n readonly summary: string;\n}\n\n/**\n * A Buckingham monomial is the encoded formula only when scaling each known\n * input scales the recovered value by that exponent. A monomial such as\n * `n^(-1/3)` or `∝ 1` can share the target's dimension and still not be the\n * formula, because the formula carries constants the monomial did not use.\n * Samples that the domain refuses leave the monomial in place: this check\n * does not invent a second domain.\n */\nfunction encodedMatchesMonomial(\n edges: readonly BridgeEdge[],\n target: string,\n knownNames: readonly string[],\n monomial: Readonly<Record<string, number>>,\n identifications: readonly QuantityIdentification[],\n): boolean {\n if (knownNames.length === 0) return true;\n // Known i takes 1.7 + 0.3 i: this check's own scheme, stated here; each is then scaled by 4.\n const base = fixedPoint(knownNames, 1, { base: 1.7, step: 0.3 });\n const read = (values: Record<string, number>): number | undefined => {\n const retro = retrodictNode(edges, values, target, { identifications });\n const hit = retro.predictions.find((prediction) => Number.isFinite(prediction.value) && prediction.value !== 0);\n return hit?.value;\n };\n const origin = read(base);\n if (origin === undefined) return true;\n for (const name of knownNames) {\n const current = base[name];\n if (current === undefined) return true;\n const next = read({ ...base, [name]: current * 4 });\n if (next === undefined) return true;\n const exponent = monomial[name] ?? 0;\n // A known name the evaluator does not read (G declared beside a law that\n // already bakes G in) does not move the value. That is not a mismatch.\n const unchanged = Math.abs(next - origin) / Math.max(Math.abs(origin), 1e-300) < 1e-9;\n if (unchanged && Math.abs(exponent) > 1e-9) continue;\n const expected = origin * Math.pow(4, exponent);\n const scale = Math.max(Math.abs(expected), Math.abs(next), 1e-300);\n if (Math.abs(next - expected) / scale > 1e-6) return false;\n }\n return true;\n}\n\nfunction buildDimMap(\n edges: readonly BridgeEdge[],\n extra?: Readonly<Record<string, Dimension>>,\n): Map<string, Dimension> {\n const m = new Map<string, Dimension>();\n for (const e of edges) {\n for (const s of e.sources) if (!m.has(s.name)) m.set(s.name, s.dim);\n if (!m.has(e.target.name)) m.set(e.target.name, e.target.dim);\n }\n if (extra) for (const [k, v] of Object.entries(extra)) m.set(k, v);\n return m;\n}\n\n/**\n * Trace `startSources` back through every intermediate to the leaf inputs\n * — names in `known`, or terminals that no determinable edge produces.\n * Never expands the target (a self-loop would be circular). The union over\n * alternative sub-derivations of an over-determined intermediate.\n */\nfunction traceLeaves(\n edges: readonly BridgeEdge[],\n known: ReadonlySet<string>,\n determinable: ReadonlySet<string>,\n startSources: readonly string[],\n idents: readonly QuantityIdentification[],\n target: string,\n): string[] {\n const leaves = new Set<string>();\n const visited = new Set<string>([target]); // never expand the target itself\n const stack = [...startSources];\n while (stack.length) {\n const q = stack.pop()!;\n if (known.has(q)) {\n leaves.add(q);\n continue;\n }\n if (visited.has(q)) continue;\n visited.add(q);\n let expanded = false;\n for (const e of edges) {\n if (e.target.name !== q) continue;\n if (!e.sources.every((s) => determinable.has(s.name))) continue;\n for (const s of e.sources) stack.push(s.name);\n expanded = true;\n }\n if (!expanded) {\n for (const id of idents) {\n if (id.to === q && determinable.has(id.from)) {\n stack.push(id.from);\n expanded = true;\n }\n }\n }\n if (!expanded) leaves.add(q); // a terminal we cannot expand\n }\n return [...leaves].sort();\n}\n\n/** An even integer power is already an even function of a signed input. */\nfunction evenIntegerPower(exp: number): boolean {\n return Number.isInteger(exp) && Math.abs(exp) % 2 === 0;\n}\n\n/**\n * Buckingham's exponent of an even input is the exponent of its magnitude.\n * `√(q²)` and `|q|` come out as `q^1` and `q^-1`. Those odd powers are\n * printed as `|q|`, so a dimensionless constant can produce the positive\n * value. An even integer power (`q^2`, `q^-2`) is already even.\n */\nfunction formatMonomial(m: Readonly<Record<string, number>>, even?: ReadonlySet<string>): string {\n const parts = Object.entries(m)\n .filter(([, e]) => e !== 0)\n .map(([n, e]) => {\n const token = even?.has(n) === true && !evenIntegerPower(e) ? `|${n}|` : n;\n return e === 1 ? token : `${token}^${e}`;\n });\n return parts.join('·') || '1';\n}\n\n/**\n * Names every fired edge treats as a magnitude. A name that is signed on\n * any fired edge stays signed: one odd formula does not borrow another's\n * absolute value.\n */\nfunction magnitudeNames(edges: readonly BridgeEdge[]): ReadonlySet<string> {\n const even = new Set<string>();\n const signed = new Set<string>();\n for (const edge of edges) {\n const marked = new Set(edge.evenInputs ?? []);\n for (const source of edge.sources) {\n if (marked.has(source.name)) even.add(source.name);\n else signed.add(source.name);\n }\n }\n for (const name of signed) even.delete(name);\n return even;\n}\n\nfunction factorsOn(edge: BridgeEdge | undefined): Readonly<Record<string, number>> {\n return edge?.formulaFactors ?? {};\n}\n\nfunction collectFactors(edges: readonly BridgeEdge[]): Record<string, number> {\n const out: Record<string, number> = {};\n for (const edge of edges) {\n for (const [name, exp] of Object.entries(factorsOn(edge))) out[name] = exp;\n }\n return out;\n}\n\n/**\n * Buckingham cannot see a dimensionless count, so the printed monomial\n * omits it. Put the recorded exponent back for each count the inputs name.\n */\nfunction monomialWithFactors(\n monomial: Readonly<Record<string, number>>,\n factors: Readonly<Record<string, number>>,\n present: ReadonlySet<string>,\n): Record<string, number> {\n const merged: Record<string, number> = { ...monomial };\n for (const [name, exp] of Object.entries(factors)) {\n if (present.has(name) && exp !== 0) merged[name] = exp;\n }\n return merged;\n}\n\n\nfunction buildSummary(\n target: string,\n id: IdentifiabilityResult,\n derivations: readonly DerivationExplanation[],\n consistency: RetrodictionResult | undefined,\n recoveredValue: number | undefined,\n dimensional: DimensionalDeterminationResult | undefined,\n knownNames: readonly string[],\n formulaIsSum: boolean,\n encodedMatchesMonomial: boolean,\n unsetSentence: string | undefined,\n even: ReadonlySet<string>,\n /** The identification that determines the target when no edge does. */\n viaIdentification: QuantityIdentification | undefined,\n): string {\n const known = knownNames.length\n ? `{${knownNames.join(', ')}}`\n : '{} (no inputs)';\n const ids = derivations.map((d) => d.edge).join(', ');\n let s: string;\n\n switch (id.verdict) {\n case 'given':\n s = `'${target}' is a supplied input.`;\n if (derivations.length) {\n s += ` ${derivations.length} graph derivation(s) (${ids}) can cross-check it`;\n s += consistency\n ? consistency.outcome === 'consistent'\n ? `, and they are consistent (relative spread ${consistency.relativeSpread.toExponential(1)}).`\n : ` — and they are INCONSISTENT (relative spread ${consistency.relativeSpread.toExponential(1)}).`\n : '.';\n }\n break;\n case 'under-determined':\n s = `'${target}' is in the graph, but cannot be determined from ${known}: the graph has no derivation path.`;\n if (id.blockingFrontier.length) {\n s += ` Knowing one of {${id.blockingFrontier.join(', ')}} would unblock it.`;\n }\n break;\n case 'exactly-determined': {\n // No edge derives a target the identification alone determines; the\n // sentence then names the identification, not an undefined edge\n // (9.0.0 audit §4 C11).\n const first = derivations[0];\n s =\n first !== undefined\n ? `'${target}' is determined from ${known} via ${first.edge} (${first.label}).`\n : viaIdentification !== undefined\n ? `'${target}' is determined from ${known} by the identification ${viaIdentification.from} ≡ ${viaIdentification.to} (${viaIdentification.rationale}).`\n : `'${target}' is determined from ${known}.`;\n if (recoveredValue !== undefined) {\n s += ` Recovered value: ${formatQuantity(recoveredValue)}.`;\n }\n break;\n }\n case 'over-determined':\n default: {\n // Independence is counted by BRIDGE, not by edge: be-42 and be-42-via-rs\n // are one bridge written in M and in r_s, and agree by algebra.\n const bridges = [...new Set(derivations.map((d) => (d.beId === null ? d.edge : `BE-${d.beId}`)))];\n const oneBridge = bridges.length === 1 && derivations.length > 1;\n if (bridges.length === derivations.length) {\n s = `'${target}' is over-determined from ${known}: ${derivations.length} independent derivations (${ids}).`;\n } else if (oneBridge) {\n s = `'${target}' is over-determined from ${known}: ${derivations.length} derivation routes (${ids}) restate ONE bridge (${bridges[0]}).`;\n } else {\n s = `'${target}' is over-determined from ${known}: ${derivations.length} derivation routes (${ids}) over ${bridges.length} distinct bridges (${bridges.join(', ')}).`;\n }\n if (consistency) {\n const spread = consistency.relativeSpread.toExponential(1);\n if (consistency.outcome === 'consistent') {\n s += oneBridge\n ? ` They agree (relative spread ${spread}) — agreement by construction, not an independent check.`\n : ` They agree (relative spread ${spread}) — a passing consistency check.`;\n } else {\n s += oneBridge\n ? ` They DISAGREE (relative spread ${spread}) — two forms of one bridge disagree: an encoding error.`\n : ` They DISAGREE (relative spread ${spread}) — a falsification.`;\n }\n } else if (oneBridge) {\n s += ` The routes restate one bridge, so they carry no independent constraint.`;\n } else {\n s += ` The ${id.surplusConstraints} surplus derivation(s) are falsifiable consistency constraints (supply values to check them).`;\n }\n if (recoveredValue !== undefined) {\n s += ` Recovered value: ${formatQuantity(recoveredValue)}.`;\n }\n break;\n }\n }\n\n if (dimensional?.determined && dimensional.monomial && formulaIsSum) {\n s += ` The encoded formula adds dimensionful terms, so it is not a proportionality.`;\n } else if (dimensional?.determined && dimensional.monomial && !encodedMatchesMonomial) {\n s += ` Dimensionally, those inputs alone do not fix it — the encoded formula carries dimensionful constants.`;\n } else if (dimensional?.determined && dimensional.monomial) {\n s += ` Dimensionally, ${known} fix it up to a dimensionless constant: ${target} ∝ ${formatMonomial(dimensional.monomial, even)}.`;\n } else if (dimensional?.outsideGoverningSpan && knownNames.length) {\n s += ` Dimensionally, those inputs alone do not fix it — the encoded formula carries dimensionful constants.`;\n } else if (dimensional && !dimensional.determined && knownNames.length) {\n s += ` Dimensionally, those inputs alone do not fix a unique monomial.`;\n }\n // The unset factor is a fact about the edge, whatever the inputs span: it is said whether or\n // not a ∝ line could be printed (a baked constant removes the ∝ line, not the unset factor).\n if (unsetSentence !== undefined) s += ` ${unsetSentence}`;\n return s;\n}\n\n/**\n * Explain a quantity: synthesize the identifiability verdict, the\n * recovered value + consistency (when values are supplied), and the\n * dimensional sufficiency of the known set into one report.\n *\n * `known` may be a list of names (structural + dimensional analysis only)\n * or a `name → value` map (adds value recovery and the over-determined\n * consistency check).\n *\n * @public\n */\nexport function explainQuantity(\n edges: readonly BridgeEdge[],\n target: string,\n known: readonly string[] | Readonly<Record<string, number>>,\n opts: ExplainOptions = {},\n): QuantityExplanation {\n const identifications = opts.identifications ?? QUANTITY_IDENTIFICATIONS;\n const hasValues = !Array.isArray(known);\n const values = hasValues ? (known as Record<string, number>) : null;\n const rawNames = hasValues\n ? Object.keys(values!)\n : [...new Set(known as string[])];\n const sourceNames = new Set<string>();\n for (const e of edges) {\n if (e.target.name !== target) continue;\n for (const s of e.sources) sourceNames.add(s.name);\n }\n // A copied synonym is the same quantity. Buckingham and the printed\n // known set see one name. The value map still carries both spellings\n // so the edge source evaluates.\n const knownNames = collapseSynonymGovernors(rawNames, sourceNames, values);\n\n const identifiability = classifyIdentifiability(edges, knownNames, target, {\n identifications,\n });\n\n const byId = new Map(edges.map((e) => [e.id, e] as const));\n\n let consistency: RetrodictionResult | undefined;\n let refusals: RetrodictionResult['refusals'];\n let recoveredValue: number | undefined;\n const valueByEdge = new Map<string, number>();\n if (values) {\n const references =\n target in values ? { [target]: values[target] } : undefined;\n const retro = retrodictNode(edges, values, target, {\n identifications,\n tolerance: opts.tolerance,\n references,\n });\n refusals = retro.refusals;\n for (const p of retro.predictions) valueByEdge.set(p.edge, p.value);\n if (retro.predictions.length >= 2) consistency = retro;\n if (\n (retro.outcome === 'consistent' || retro.outcome === 'single') &&\n retro.predictions.length > 0\n ) {\n recoveredValue =\n retro.predictions.reduce((a, p) => a + p.value, 0) /\n retro.predictions.length;\n }\n }\n\n const dimMap = buildDimMap(edges, opts.extraDimensions);\n const knownSet = new Set(knownNames);\n const determinable = forwardClosure(edges, knownNames, identifications);\n\n const derivations: DerivationExplanation[] = identifiability.derivations.map(\n (eid) => {\n const e = byId.get(eid);\n const sources = e ? e.sources.map((s) => s.name) : [];\n // Full-chain: trace the immediate sources back to the leaf inputs.\n const leafInputs = e\n ? traceLeaves(\n edges,\n knownSet,\n determinable,\n sources,\n identifications,\n target,\n )\n : [];\n // Dimensional form in terms of those leaves, when they fix the target.\n let dimensionalForm: DerivationExplanation['dimensionalForm'];\n const targetDimForChain = dimMap.get(target);\n if (targetDimForChain && leafInputs.length) {\n const factors = factorsOn(e);\n const governing = leafInputs\n .filter((n) => n !== target && dimMap.has(n) && factors[n] === undefined)\n .map((n) => ({ name: n, dim: dimMap.get(n)! }));\n const det = dimensionallyDetermines(\n { name: target, dim: targetDimForChain },\n governing,\n );\n const symbolic = e?.symbolic;\n const sum = symbolic !== undefined && formulaShape(symbolic) === 'dimensional-sum';\n const leaves = leafInputs.filter((name) => name !== target);\n const missingCount = Object.keys(factors).some((name) => !leaves.includes(name));\n const merged =\n det.determined && det.monomial !== undefined\n ? monomialWithFactors(det.monomial, factors, new Set(leaves))\n : undefined;\n const agrees =\n merged !== undefined &&\n encodedMatchesMonomial(edges, target, leaves, merged, identifications);\n if (!sum && !missingCount && merged !== undefined && agrees) {\n dimensionalForm = {\n monomial: merged,\n formula: `${target} ∝ ${formatMonomial(merged, new Set(e?.evenInputs ?? []))}`,\n };\n }\n }\n return {\n edge: eid,\n beId: e?.beId ?? null,\n label: e?.label ?? eid,\n sources,\n leafInputs,\n ...(dimensionalForm ? { dimensionalForm } : {}),\n ...(valueByEdge.has(eid) ? { value: valueByEdge.get(eid) } : {}),\n };\n },\n );\n\n // Dimensional sufficiency of the KNOWN set, independent of the graph.\n // A dimensionless count is stripped before Buckingham (it is a π-group and\n // would make the monomial non-unique) and written back into the monomial\n // the summary prints. An edge whose other sources are known, but whose\n // count is not, does not get to claim the count-free monomial.\n const firedEdges = identifiability.derivations\n .map((id) => byId.get(id))\n .filter((edge): edge is BridgeEdge => edge !== undefined);\n const firedFactors = collectFactors(firedEdges);\n const boundGroupExponents: Record<string, number> = {};\n if (values) {\n for (const edge of firedEdges) {\n const group = CANONICAL_GROUP_PREFACTORS.find((p) => p.id === edge.id);\n if (group !== undefined && Number.isFinite(values[group.group])) {\n boundGroupExponents[group.group] = group.exponent;\n }\n }\n }\n const blockedByCount = edges.filter((edge) => {\n if (edge.target.name !== target) return false;\n const factors = factorsOn(edge);\n const names = Object.keys(factors);\n if (names.length === 0 || names.every((name) => knownSet.has(name))) return false;\n return edge.sources\n .filter((source) => factors[source.name] === undefined)\n .every((source) => knownSet.has(source.name) || determinable.has(source.name));\n });\n let dimensional: DimensionalDeterminationResult | undefined;\n const targetDim = dimMap.get(target);\n if (targetDim) {\n const strip = new Set<string>([\n ...Object.keys(firedFactors),\n ...blockedByCount.flatMap((edge) => Object.keys(factorsOn(edge))),\n ]);\n const governing = knownNames\n .filter((n) => n !== target && dimMap.has(n) && !strip.has(n))\n .map((n) => ({ name: n, dim: dimMap.get(n)! }));\n const det = dimensionallyDetermines({ name: target, dim: targetDim }, governing);\n const hideCountFree = blockedByCount.length > 0 && firedEdges.length === 0;\n if (hideCountFree) {\n dimensional = {\n ...det,\n determined: false,\n monomial: undefined,\n reason: 'a dimensionless count in the formula is not among the inputs',\n };\n } else if (det.determined && det.monomial !== undefined) {\n dimensional = {\n ...det,\n monomial: monomialWithFactors(\n det.monomial,\n { ...firedFactors, ...boundGroupExponents },\n knownSet,\n ),\n };\n } else {\n dimensional = det;\n }\n }\n\n const formulaIsSum = identifiability.derivations.some((eid) => {\n const symbolic = byId.get(eid)?.symbolic;\n return symbolic !== undefined && formulaShape(symbolic) === 'dimensional-sum';\n });\n const encodedAgrees =\n dimensional?.determined === true && dimensional.monomial !== undefined\n ? encodedMatchesMonomial(edges, target, knownNames, dimensional.monomial, identifications)\n : true;\n\n const unsetEdge = derivations\n .map((d) => byId.get(d.edge))\n .find((e) => e?.coefficientUnset === true);\n const groupBound =\n unsetEdge !== undefined &&\n CANONICAL_GROUP_PREFACTORS.some(\n (p) => p.id === unsetEdge.id && values !== null && Number.isFinite(values[p.group]),\n );\n const unsetSentence =\n unsetEdge === undefined || groupBound\n ? undefined\n : 'The factor is unset.' +\n (canonicalById(unsetEdge.id)?.unsetFactorNote !== undefined ? ` ${canonicalById(unsetEdge.id)!.unsetFactorNote}` : '');\n\n const coefficient: QuantityExplanation['coefficient'] =\n unsetEdge !== undefined && !groupBound\n ? 'unset'\n : groupBound\n ? 'group'\n : recoveredValue !== undefined\n ? 'sourced'\n : undefined;\n\n // A target with no derivation that is still determinable is reached by an\n // identification whose `from` the known set determines.\n const viaIdentification =\n identifiability.verdict === 'exactly-determined' && derivations.length === 0\n ? identifications.find((ident) => ident.to === target && determinable.has(ident.from))\n : undefined;\n\n const summary = buildSummary(\n target,\n identifiability,\n derivations,\n consistency,\n recoveredValue,\n dimensional,\n knownNames,\n formulaIsSum,\n encodedAgrees,\n unsetSentence,\n magnitudeNames(firedEdges),\n viaIdentification,\n );\n // A refusal of the point (a validity domain, opposite carrier signs, a formula with no\n // finite value there) is a bad value and is named with the edge's own reason. An unset\n // coefficient is not: `unsetSentence` already says it in words (AGENTS law 4).\n const domainRefusals = (refusals ?? []).filter((r) => r.kind !== 'coefficient-unset');\n const refusalSentence =\n domainRefusals.length === 0 || recoveredValue !== undefined\n ? ''\n : ` No recovered value: ${domainRefusals.map((r) => r.reason).join('; ')}.`;\n\n return {\n target,\n known: knownNames,\n identifiability,\n derivations,\n ...(consistency ? { consistency } : {}),\n ...(recoveredValue !== undefined ? { recoveredValue } : {}),\n ...(coefficient !== undefined ? { coefficient } : {}),\n ...(dimensional ? { dimensional } : {}),\n ...(refusals !== undefined ? { refusals } : {}),\n blockingFrontier: identifiability.blockingFrontier,\n summary: summary + refusalSentence,\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"expr-eval.d.ts","sourceRoot":"","sources":["../../src/composition/expr-eval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAI5D;yCACyC;AACzC,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAuDD;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,QAAQ,EACd,MAAM,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,GAC5C,MAAM,CAOR"}
1
+ {"version":3,"file":"expr-eval.d.ts","sourceRoot":"","sources":["../../src/composition/expr-eval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAK5D;yCACyC;AACzC,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AA+CD;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,QAAQ,EACd,MAAM,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,GAC5C,MAAM,CAOR"}
@@ -21,6 +21,7 @@
21
21
  */
22
22
  import { createScalarBuilder, ScalarBuildError } from '@danielsimonjr/mathts-expression';
23
23
  import { evaluateScalar, ScalarEvalError } from '@danielsimonjr/mathts-functions';
24
+ import { forEachScalarLeaf } from '../dimensional/ast-leaves.js';
24
25
  import { CONSTANTS, piMultipleValue } from '../dimensional/symbolic-constants.js';
25
26
  import { FORMULA_NAMED } from '../dimensional/formula-names.js';
26
27
  /** A scalar `ExprNode` could not be evaluated (unsupported arm / unresolved
@@ -34,17 +35,7 @@ export class SymbolicEvalError extends Error {
34
35
  const builder = createScalarBuilder();
35
36
  /** Symbol names on the scalar arms. Other kinds are left for the builder to reject. */
36
37
  function symbolNames(node, out) {
37
- if (node.kind === 'symbol') {
38
- out.add(node.name);
39
- return;
40
- }
41
- if (node.kind === 'op') {
42
- for (const arg of node.args)
43
- symbolNames(arg, out);
44
- return;
45
- }
46
- if (node.kind === 'transcendental' || node.kind === 'abs')
47
- symbolNames(node.arg, out);
38
+ forEachScalarLeaf(node, (leaf) => out.add(leaf.name), { transcendental: true, abs: true });
48
39
  }
49
40
  /**
50
41
  * Caller bindings, then registered constants and spelled-out π multiples
@@ -1 +1 @@
1
- {"version":3,"file":"expr-eval.js","sourceRoot":"","sources":["../../src/composition/expr-eval.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Scalar `ExprNode` value evaluator (v0.12 symbolic composition).\n *\n * Numerically evaluates a SCALAR `ExprNode` (the `symbol` / `op` /\n * `transcendental` / `abs` arms) given leaf values. The dimensional validator infers\n * dimensions but never computes values, and the formula parser evaluates a\n * DIFFERENT AST — so this is the missing primitive that makes a bridge's\n * `symbolic` form executable.\n *\n * The tree is lowered with `createScalarBuilder` and evaluated with\n * `evaluateScalar`. This module does not print a formula and does not parse\n * one. Leaf resolution order (Adam A-1, A-5): caller `values` win, then the\n * `CONSTANTS` registry, then a spelled-out multiple of π, then a base-10\n * numeric-literal symbol (`'2'`, `'3'`), which MathTS resolves. An unresolved\n * or non-finite operator result throws. Tensor / integral / derivative arms\n * are out of scope and throw.\n *\n * INTERNAL — not on the public surface.\n *\n * @module composition/expr-eval\n */\n\nimport { createScalarBuilder, ScalarBuildError } from '@danielsimonjr/mathts-expression';\nimport { evaluateScalar, ScalarEvalError } from '@danielsimonjr/mathts-functions';\nimport type { ExprNode } from '../dimensional/validator.js';\nimport { CONSTANTS, piMultipleValue } from '../dimensional/symbolic-constants.js';\nimport { FORMULA_NAMED } from '../dimensional/formula-names.js';\n\n/** A scalar `ExprNode` could not be evaluated (unsupported arm / unresolved\n * leaf / non-finite result). @public */\nexport class SymbolicEvalError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'SymbolicEvalError';\n }\n}\n\nconst builder = createScalarBuilder();\n\n/** Symbol names on the scalar arms. Other kinds are left for the builder to reject. */\nfunction symbolNames(node: ExprNode, out: Set<string>): void {\n if (node.kind === 'symbol') {\n out.add(node.name);\n return;\n }\n if (node.kind === 'op') {\n for (const arg of node.args) symbolNames(arg, out);\n return;\n }\n if (node.kind === 'transcendental' || node.kind === 'abs') symbolNames(node.arg, out);\n}\n\n/**\n * Caller bindings, then registered constants and spelled-out π multiples\n * that the caller did not set. Numeric-literal names stay unset so MathTS\n * reads them.\n */\nfunction scopeFor(\n node: ExprNode,\n values: Readonly<Record<string, number>>,\n): Record<string, number> {\n const scope: Record<string, number> = { ...values };\n const names = new Set<string>();\n symbolNames(node, names);\n for (const name of names) {\n if (Object.prototype.hasOwnProperty.call(scope, name)) continue;\n const constant = CONSTANTS[name];\n if (constant !== undefined) {\n scope[name] = constant.value;\n continue;\n }\n const named = FORMULA_NAMED.find((row) => row.name === name);\n if (named !== undefined) {\n scope[name] = named.value;\n continue;\n }\n const pi = piMultipleValue(name);\n if (pi !== undefined) scope[name] = pi;\n }\n return scope;\n}\n\nfunction asSymbolic(err: unknown): Error {\n if (err instanceof ScalarEvalError || err instanceof ScalarBuildError) {\n // MathTS names its own function first (`evaluateScalar:`); the message is kept whole, not rewritten.\n return new SymbolicEvalError(`evalExpr: ${err.message}`);\n }\n return err instanceof Error ? err : new SymbolicEvalError(String(err));\n}\n\n/**\n * Evaluate a scalar `ExprNode` to a number. See module docs for the leaf\n * resolution order and scope.\n *\n * @internal\n */\nexport function evalExpr(\n node: ExprNode,\n values: Readonly<Record<string, number>> = {},\n): number {\n try {\n const lowered = builder.from(node);\n return evaluateScalar(lowered, scopeFor(node, values));\n } catch (err) {\n throw asSymbolic(err);\n }\n}\n"]}
1
+ {"version":3,"file":"expr-eval.js","sourceRoot":"","sources":["../../src/composition/expr-eval.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Scalar `ExprNode` value evaluator (v0.12 symbolic composition).\n *\n * Numerically evaluates a SCALAR `ExprNode` (the `symbol` / `op` /\n * `transcendental` / `abs` arms) given leaf values. The dimensional validator infers\n * dimensions but never computes values, and the formula parser evaluates a\n * DIFFERENT AST — so this is the missing primitive that makes a bridge's\n * `symbolic` form executable.\n *\n * The tree is lowered with `createScalarBuilder` and evaluated with\n * `evaluateScalar`. This module does not print a formula and does not parse\n * one. Leaf resolution order (Adam A-1, A-5): caller `values` win, then the\n * `CONSTANTS` registry, then a spelled-out multiple of π, then a base-10\n * numeric-literal symbol (`'2'`, `'3'`), which MathTS resolves. An unresolved\n * or non-finite operator result throws. Tensor / integral / derivative arms\n * are out of scope and throw.\n *\n * INTERNAL — not on the public surface.\n *\n * @module composition/expr-eval\n */\n\nimport { createScalarBuilder, ScalarBuildError } from '@danielsimonjr/mathts-expression';\nimport { evaluateScalar, ScalarEvalError } from '@danielsimonjr/mathts-functions';\nimport type { ExprNode } from '../dimensional/validator.js';\nimport { forEachScalarLeaf } from '../dimensional/ast-leaves.js';\nimport { CONSTANTS, piMultipleValue } from '../dimensional/symbolic-constants.js';\nimport { FORMULA_NAMED } from '../dimensional/formula-names.js';\n\n/** A scalar `ExprNode` could not be evaluated (unsupported arm / unresolved\n * leaf / non-finite result). @public */\nexport class SymbolicEvalError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'SymbolicEvalError';\n }\n}\n\nconst builder = createScalarBuilder();\n\n/** Symbol names on the scalar arms. Other kinds are left for the builder to reject. */\nfunction symbolNames(node: ExprNode, out: Set<string>): void {\n forEachScalarLeaf(node, (leaf) => out.add(leaf.name), { transcendental: true, abs: true });\n}\n\n/**\n * Caller bindings, then registered constants and spelled-out π multiples\n * that the caller did not set. Numeric-literal names stay unset so MathTS\n * reads them.\n */\nfunction scopeFor(\n node: ExprNode,\n values: Readonly<Record<string, number>>,\n): Record<string, number> {\n const scope: Record<string, number> = { ...values };\n const names = new Set<string>();\n symbolNames(node, names);\n for (const name of names) {\n if (Object.prototype.hasOwnProperty.call(scope, name)) continue;\n const constant = CONSTANTS[name];\n if (constant !== undefined) {\n scope[name] = constant.value;\n continue;\n }\n const named = FORMULA_NAMED.find((row) => row.name === name);\n if (named !== undefined) {\n scope[name] = named.value;\n continue;\n }\n const pi = piMultipleValue(name);\n if (pi !== undefined) scope[name] = pi;\n }\n return scope;\n}\n\nfunction asSymbolic(err: unknown): Error {\n if (err instanceof ScalarEvalError || err instanceof ScalarBuildError) {\n // MathTS names its own function first (`evaluateScalar:`); the message is kept whole, not rewritten.\n return new SymbolicEvalError(`evalExpr: ${err.message}`);\n }\n return err instanceof Error ? err : new SymbolicEvalError(String(err));\n}\n\n/**\n * Evaluate a scalar `ExprNode` to a number. See module docs for the leaf\n * resolution order and scope.\n *\n * @internal\n */\nexport function evalExpr(\n node: ExprNode,\n values: Readonly<Record<string, number>> = {},\n): number {\n try {\n const lowered = builder.from(node);\n return evaluateScalar(lowered, scopeFor(node, values));\n } catch (err) {\n throw asSymbolic(err);\n }\n}\n"]}
@@ -27,7 +27,23 @@
27
27
  * @module composition/expr-simplify
28
28
  */
29
29
  import type { ExprNode } from '../dimensional/validator.js';
30
+ import type { Dimension } from '../dimensional/types.js';
30
31
  import type { Observable } from './compose-symbolic.js';
32
+ /** The leaf a gensym stands for: its name and dimension. @internal */
33
+ export interface LeafMeta {
34
+ readonly name: string;
35
+ readonly dim: Dimension;
36
+ }
37
+ /**
38
+ * Render a scalar ExprNode to a mathjs-safe, fully-parenthesized string,
39
+ * gensym'ing each non-literal leaf by NAME (so repeats share an identifier
40
+ * and can cancel). Throws on a non-scalar arm and on a non-literal exponent;
41
+ * `algebraic-equivalence.ts` renders both sides of a quotient through one
42
+ * gensym table with it.
43
+ *
44
+ * @internal
45
+ */
46
+ export declare function renderGensym(expr: ExprNode, gensymOf: Map<string, string>, meta: Map<string, LeafMeta>): string;
31
47
  /** The result of attempting to simplify an expression. */
32
48
  interface SimplifyResult {
33
49
  readonly expr: ExprNode;
@@ -1 +1 @@
1
- {"version":3,"file":"expr-simplify.d.ts","sourceRoot":"","sources":["../../src/composition/expr-simplify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAO5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAwOxD,0DAA0D;AAC1D,UAAU,cAAc;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAE9D;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,CAgE1E;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAI7E"}
1
+ {"version":3,"file":"expr-simplify.d.ts","sourceRoot":"","sources":["../../src/composition/expr-simplify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAG5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAKzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAmFxD,sEAAsE;AACtE,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;CACzB;AAID;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAC1B,MAAM,CAmBR;AA4GD,0DAA0D;AAC1D,UAAU,cAAc;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAE9D;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,CAgE1E;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAI7E"}
@@ -30,7 +30,8 @@ import { validate } from '../dimensional/validator.js';
30
30
  import { equals } from '../dimensional/algebra.js';
31
31
  import { DIMENSIONLESS } from '../dimensional/types.js';
32
32
  import { evalExpr } from './expr-eval.js';
33
- import { CONSTANTS } from '../dimensional/symbolic-constants.js';
33
+ import { forEachScalarLeaf, isDecimalLiteral } from '../dimensional/ast-leaves.js';
34
+ import { isRegisteredConstant } from '../dimensional/symbolic-constants.js';
34
35
  import { makeObservable } from './compose-symbolic.js';
35
36
  import { renderScalarLeaf } from './mathts-scalar-symbols.js';
36
37
  import { quietly } from './mathts-quiet.js';
@@ -88,11 +89,17 @@ function collectMathSymbols(n, out) {
88
89
  for (const a of n.args ?? [])
89
90
  collectMathSymbols(a, out);
90
91
  }
91
- const isLiteral = (name) => Number.isFinite(Number(name));
92
- /** Render a scalar ExprNode to a mathjs-safe, fully-parenthesized string,
93
- * gensym'ing each non-literal leaf by NAME (so repeats share an identifier
94
- * and can cancel). Throws `Unsupported` on non-scalar arms. */
95
- function renderGensym(expr, gensymOf, meta) {
92
+ const isLiteral = isDecimalLiteral;
93
+ /**
94
+ * Render a scalar ExprNode to a mathjs-safe, fully-parenthesized string,
95
+ * gensym'ing each non-literal leaf by NAME (so repeats share an identifier
96
+ * and can cancel). Throws on a non-scalar arm and on a non-literal exponent;
97
+ * `algebraic-equivalence.ts` renders both sides of a quotient through one
98
+ * gensym table with it.
99
+ *
100
+ * @internal
101
+ */
102
+ export function renderGensym(expr, gensymOf, meta) {
96
103
  switch (expr.kind) {
97
104
  case 'symbol':
98
105
  return renderScalarLeaf(expr, gensymOf, meta);
@@ -172,19 +179,7 @@ function walkBack(node, meta) {
172
179
  // Guards.
173
180
  // ---------------------------------------------------------------------------
174
181
  function symbolNames(expr, out = []) {
175
- if (expr.kind === 'symbol')
176
- out.push(expr.name);
177
- else if (expr.kind === 'op')
178
- for (const a of expr.args)
179
- symbolNames(a, out);
180
- else if (expr.kind === 'integral') {
181
- symbolNames(expr.over, out);
182
- symbolNames(expr.integrand, out);
183
- }
184
- else if (expr.kind === 'derivative') {
185
- symbolNames(expr.of, out);
186
- symbolNames(expr.wrt, out);
187
- }
182
+ forEachScalarLeaf(expr, (leaf) => out.push(leaf.name), { integral: 'over+integrand', derivative: true });
188
183
  return out;
189
184
  }
190
185
  const nonNumericSymbols = (expr) => symbolNames(expr).filter((n) => !isLiteral(n));
@@ -195,7 +190,7 @@ const PROBE_MULTIPLIERS = [1, 1.7, 0.41, 2.9];
195
190
  * avoid accidental cancellation. <2 finite probes ⇒ 'insufficient' (cannot
196
191
  * verify — EVE-C). */
197
192
  function numericAgreement(original, candidate) {
198
- const leaves = [...new Set(nonNumericSymbols(original))].filter((n) => !(n in CONSTANTS));
193
+ const leaves = [...new Set(nonNumericSymbols(original))].filter((n) => !isRegisteredConstant(n));
199
194
  let finiteProbes = 0;
200
195
  for (const mult of PROBE_MULTIPLIERS) {
201
196
  const values = {};
@@ -1 +1 @@
1
- {"version":3,"file":"expr-simplify.js","sourceRoot":"","sources":["../../src/composition/expr-simplify.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Symbolic simplification of a scalar `ExprNode` via MathTS (v0.12 — optional\n * supplement to symbolic composition).\n *\n * Composing two bridges' symbolic forms leaves an UNSIMPLIFIED AST — CT-1 is\n * `k_B·(ℏc³/8πG·mass·k_B)·ln2`, with `k_B` uncancelled. This folds it to the\n * canonical `ℏc³·ln2/(8πG·mass)` using `@danielsimonjr/mathts-functions`'\n * `simplify` (the same OPTIONAL peer the Path-A formula parser loads).\n *\n * Pipeline (Adam+Eve-vetted — docs/planning/v0.12.0-Symbolic-Simplification-\n * Design.md): GENSYM every non-exponent leaf to a mathjs-safe identifier\n * (shared by name, so repeated leaves cancel), render FULLY-PARENTHESIZED\n * (EVE-A — no precedence ambiguity), `parse`+`simplify`, walk the result back\n * (un-gensym, INTEGER-exponent-strict — EVE/Adam HIGH-1). Three guards make a\n * black-box CAS safe to trust:\n * 1. dimensional — `validate(simplified)` dim `equals` the original's;\n * 2. structural — non-numeric symbols of the result ⊆ those of the original\n * (no leaf invented — Adam HIGH-2 / EVE-B);\n * 3. numeric — `evalExpr` agrees over ≥2 finite synthesized probes at\n * rel tol 1e-9 (Adam CRITICAL-2 / EVE-C).\n * A representable result that DISAGREES dimensionally/numerically THROWS (a\n * bug to surface); anything we cannot represent / verify / load degrades to a\n * graceful no-op (return the original, `simplified:false`).\n *\n * INTERNAL — surfaced via `upt symbolic --simplify`.\n *\n * @module composition/expr-simplify\n */\n\nimport type { ExprNode } from '../dimensional/validator.js';\nimport { validate } from '../dimensional/validator.js';\nimport { equals } from '../dimensional/algebra.js';\nimport type { Dimension } from '../dimensional/types.js';\nimport { DIMENSIONLESS } from '../dimensional/types.js';\nimport { evalExpr } from './expr-eval.js';\nimport { CONSTANTS } from '../dimensional/symbolic-constants.js';\nimport type { Observable } from './compose-symbolic.js';\nimport { makeObservable } from './compose-symbolic.js';\nimport { renderScalarLeaf } from './mathts-scalar-symbols.js';\nimport { quietly } from './mathts-quiet.js';\n\n/** A simplification completed but produced a dimensionally/numerically wrong\n * result (a real bug — not a graceful no-op). @internal */\nclass SimplificationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'SimplificationError';\n }\n}\n\n/** The bits of a MathTS (mathjs-style) AST node the walk-back reads — pinned\n * + runtime-verified (Adam CRITICAL-1). */\ninterface MathNode {\n readonly type?: string;\n readonly op?: string;\n readonly name?: string;\n readonly value?: unknown;\n readonly args?: MathNode[];\n readonly content?: MathNode;\n toString(): string;\n}\ninterface MathtsSimplifyModule {\n parse(expr: string): MathNode;\n simplify(node: MathNode): MathNode;\n}\n\n/** Thrown internally when a node cannot be rendered/walked — caught and turned\n * into a graceful no-op (never escapes the module). */\nclass Unsupported extends Error {}\n\n// ---------------------------------------------------------------------------\n// Optional-peer load — cache + quietly + simplify-smoke (mirrors\n// formula-registry.ts).\n// ---------------------------------------------------------------------------\n\nlet cached: Promise<MathtsSimplifyModule | null> | undefined;\n\n/** Load + smoke-test the peer. A peer with `parse` but a missing/broken\n * `simplify` (it must actually CANCEL) is rejected → null (graceful no-op). */\nasync function detect(): Promise<MathtsSimplifyModule | null> {\n try {\n // Import AND smoke-test inside the ONE suppression window this module\n // opens (`mathts-quiet.ts` states the invariant): the WASM-fallback\n // chatter fires lazily on first parse/simplify, not only at import, and\n // the smoke below is that first use. Later calls run with the console\n // untouched.\n return await quietly(async () => {\n const mod = (await import(\n '@danielsimonjr/mathts-functions'\n )) as unknown as MathtsSimplifyModule;\n if (typeof mod.parse !== 'function' || typeof mod.simplify !== 'function') {\n return null;\n }\n // Smoke: g0 must cancel out of (g0)*((g1)/(g0)) → only g1 remains.\n const s = mod.simplify(mod.parse('(g0)*((g1)/(g0))'));\n const names = new Set<string>();\n collectMathSymbols(s, names);\n return names.size === 1 && names.has('g1') ? mod : null;\n });\n } catch {\n return null;\n }\n}\n\nfunction loadSimplifier(): Promise<MathtsSimplifyModule | null> {\n cached ??= detect();\n return cached;\n}\n\nfunction collectMathSymbols(n: MathNode, out: Set<string>): void {\n if (n.type === 'SymbolNode' && n.name) out.add(n.name);\n if (n.content) collectMathSymbols(n.content, out);\n for (const a of n.args ?? []) collectMathSymbols(a, out);\n}\n\n// ---------------------------------------------------------------------------\n// ExprNode → gensym string (fully parenthesized) and back.\n// ---------------------------------------------------------------------------\n\ninterface LeafMeta {\n readonly name: string;\n readonly dim: Dimension;\n}\n\nconst isLiteral = (name: string): boolean => Number.isFinite(Number(name));\n\n/** Render a scalar ExprNode to a mathjs-safe, fully-parenthesized string,\n * gensym'ing each non-literal leaf by NAME (so repeats share an identifier\n * and can cancel). Throws `Unsupported` on non-scalar arms. */\nfunction renderGensym(\n expr: ExprNode,\n gensymOf: Map<string, string>,\n meta: Map<string, LeafMeta>,\n): string {\n switch (expr.kind) {\n case 'symbol':\n return renderScalarLeaf(expr, gensymOf, meta);\n case 'op': {\n if (expr.op === '^') {\n const exp = expr.args[1];\n if (!exp || exp.kind !== 'symbol' || !isLiteral(exp.name)) {\n throw new Unsupported();\n }\n return `(${renderGensym(expr.args[0], gensymOf, meta)})^${Number(exp.name)}`;\n }\n if (expr.args.length === 0) throw new Unsupported();\n const parts = expr.args.map((a) => `(${renderGensym(a, gensymOf, meta)})`);\n return `(${parts.join(expr.op)})`;\n }\n default:\n throw new Unsupported(); // integral / derivative / tensor arms\n }\n}\n\nconst lit = (v: number): ExprNode => ({ kind: 'symbol', name: String(v), dim: DIMENSIONLESS });\n\n/** Walk a simplified MathTS node back to an ExprNode, un-gensym'ing leaves and\n * rejecting anything outside UPT's integer-exponent scalar model (→ throws\n * `Unsupported`, a graceful no-op). */\nfunction walkBack(node: MathNode, meta: Map<string, LeafMeta>): ExprNode {\n switch (node.type) {\n case 'ConstantNode': {\n if (typeof node.value !== 'number' || !Number.isFinite(node.value)) {\n throw new Unsupported();\n }\n return lit(node.value);\n }\n case 'SymbolNode': {\n const m = node.name !== undefined ? meta.get(node.name) : undefined;\n if (!m) throw new Unsupported(); // a symbol we did not issue\n return { kind: 'symbol', name: m.name, dim: m.dim };\n }\n case 'ParenthesisNode':\n if (!node.content) throw new Unsupported();\n return walkBack(node.content, meta);\n case 'OperatorNode': {\n const op = node.op;\n const args = node.args ?? [];\n if (op === '^') {\n if (args.length !== 2) throw new Unsupported();\n const exp = args[1];\n if (\n exp.type !== 'ConstantNode' ||\n typeof exp.value !== 'number' ||\n !Number.isInteger(exp.value)\n ) {\n throw new Unsupported(); // non-integer exponent — not in ℤ⁷ model\n }\n return {\n kind: 'op',\n op: '^',\n args: [walkBack(args[0], meta), lit(exp.value)],\n };\n }\n if ((op === '+' || op === '-') && args.length === 1) {\n // unary minus → (-1) * arg\n return { kind: 'op', op: '*', args: [lit(-1), walkBack(args[0], meta)] };\n }\n if (op === '+' || op === '-' || op === '*' || op === '/') {\n if (args.length < 2) throw new Unsupported();\n return { kind: 'op', op, args: args.map((a) => walkBack(a, meta)) };\n }\n throw new Unsupported();\n }\n default:\n throw new Unsupported(); // FunctionNode (sqrt/cbrt/…) etc.\n }\n}\n\n// ---------------------------------------------------------------------------\n// Guards.\n// ---------------------------------------------------------------------------\n\nfunction symbolNames(expr: ExprNode, out: string[] = []): string[] {\n if (expr.kind === 'symbol') out.push(expr.name);\n else if (expr.kind === 'op') for (const a of expr.args) symbolNames(a, out);\n else if (expr.kind === 'integral') {\n symbolNames(expr.over, out);\n symbolNames(expr.integrand, out);\n } else if (expr.kind === 'derivative') {\n symbolNames(expr.of, out);\n symbolNames(expr.wrt, out);\n }\n return out;\n}\n\nconst nonNumericSymbols = (expr: ExprNode): string[] =>\n symbolNames(expr).filter((n) => !isLiteral(n));\n\nconst PROBE_VALUES = [2.3, 3.7, 5.1, 7.9, 11.3, 13.1, 17.9, 19.3];\nconst PROBE_MULTIPLIERS = [1, 1.7, 0.41, 2.9];\n\n/** Numeric agreement of `original` and `candidate` over synthesized probes.\n * Free (non-constant) leaves get distinct, mutually-incommensurate values to\n * avoid accidental cancellation. <2 finite probes ⇒ 'insufficient' (cannot\n * verify — EVE-C). */\nfunction numericAgreement(\n original: ExprNode,\n candidate: ExprNode,\n): 'agree' | 'disagree' | 'insufficient' {\n const leaves = [...new Set(nonNumericSymbols(original))].filter(\n (n) => !(n in CONSTANTS),\n );\n let finiteProbes = 0;\n for (const mult of PROBE_MULTIPLIERS) {\n const values: Record<string, number> = {};\n leaves.forEach((leaf, i) => {\n values[leaf] = PROBE_VALUES[i % PROBE_VALUES.length] * mult;\n });\n let a: number;\n let b: number;\n try {\n a = evalExpr(original, values);\n b = evalExpr(candidate, values);\n } catch {\n continue; // a probe drove evalExpr non-finite — skip it\n }\n if (!Number.isFinite(a) || !Number.isFinite(b)) continue;\n finiteProbes++;\n if (Math.abs(a - b) / Math.abs(b || 1) > 1e-9) return 'disagree';\n }\n return finiteProbes >= 2 ? 'agree' : 'insufficient';\n}\n\n// ---------------------------------------------------------------------------\n// Public entry points.\n// ---------------------------------------------------------------------------\n\n/** The result of attempting to simplify an expression. */\ninterface SimplifyResult {\n readonly expr: ExprNode;\n /** True iff MathTS was present AND produced a guard-passing, distinct form. */\n readonly simplified: boolean;\n}\n\n/**\n * Whether the optional MathTS simplifier peer is installed AND passes its\n * smoke test.\n *\n * {@link simplifyExpr} returns `simplified: false` both when the peer is absent\n * and when it is present but could not reduce the expression, so a caller that\n * must report WHY nothing happened (the atlas witness runner's `peer-absent`\n * versus `not-simplified`) needs this separate signal. Shares the same cached\n * detection, so it costs nothing after the first call.\n *\n * @internal\n */\nexport async function isSimplifierAvailable(): Promise<boolean> {\n return (await loadSimplifier()) !== null;\n}\n\n/**\n * Simplify a scalar `ExprNode` via MathTS, guarded. Returns the original\n * unchanged (`simplified:false`) when the peer is absent or the result cannot\n * be represented/verified; THROWS {@link SimplificationError} only when a\n * representable result disagrees dimensionally/numerically. See module docs.\n *\n * @internal\n */\nexport async function simplifyExpr(expr: ExprNode): Promise<SimplifyResult> {\n const mod = await loadSimplifier();\n if (!mod) return { expr, simplified: false };\n\n const gensymOf = new Map<string, string>();\n const meta = new Map<string, LeafMeta>();\n let candidate: ExprNode;\n try {\n const str = renderGensym(expr, gensymOf, meta);\n // The peer can THROW on some forms (e.g. a known mathts `simplify` BigInt\n // bug on nested `a/(b/c²)`); that, like an unsupported node, is a graceful\n // no-op, not an error. The console is not touched here: the peer's first\n // use already ran inside `detect`'s load window.\n const simplifiedNode = mod.simplify(mod.parse(str));\n candidate = walkBack(simplifiedNode, meta);\n } catch {\n return { expr, simplified: false }; // unsupported / unrepresentable / peer threw\n }\n\n // Guard 1 — dimensional. Inability to validate ⇒ no-op; a CHANGED dimension\n // is a representable disagreement ⇒ throw.\n const origDim = validate(expr).inferredDimension;\n // A literal ZERO carries every dimension: `x − x` with `x` a length is a zero\n // LENGTH, but the CAS hands back a bare dimensionless `0`. Re-stamp it with\n // the original dimension, or this guard would reject every exact\n // cancellation of a dimensioned expression as a \"changed dimension\".\n if (\n origDim !== null &&\n candidate.kind === 'symbol' &&\n candidate.name.trim() !== '' &&\n Number(candidate.name) === 0\n ) {\n candidate = { kind: 'symbol', name: '0', dim: origDim };\n }\n const newResult = validate(candidate);\n if (origDim === null || !newResult.ok || newResult.inferredDimension === null) {\n return { expr, simplified: false };\n }\n if (!equals(origDim, newResult.inferredDimension)) {\n throw new SimplificationError(\n `simplifyExpr: the simplified form changed dimension — a CAS or ` +\n `walk-back error.`,\n );\n }\n\n // Guard 2 — structural subset (no non-numeric leaf invented).\n const origSyms = new Set(nonNumericSymbols(expr));\n for (const s of nonNumericSymbols(candidate)) {\n if (!origSyms.has(s)) return { expr, simplified: false }; // suspicious ⇒ no-op\n }\n\n // Guard 3 — numeric agreement.\n const verdict = numericAgreement(expr, candidate);\n if (verdict === 'disagree') {\n throw new SimplificationError(\n `simplifyExpr: the simplified form disagrees numerically with the ` +\n `original — a CAS or walk-back error.`,\n );\n }\n if (verdict === 'insufficient') return { expr, simplified: false };\n\n // Identical-structure ⇒ nothing gained; report not simplified.\n const changed = symbolNames(candidate).length !== symbolNames(expr).length;\n return { expr: candidate, simplified: changed };\n}\n\n/**\n * Simplify a composed {@link Observable}: returns a freshly-RECONSTRUCTED\n * Observable (new strict `evaluate` closure over the simplified `expr` +\n * recomputed `leaves`) when simplification succeeds, else the original\n * unchanged. See module docs.\n *\n * @internal\n */\nexport async function simplifyObservable(obs: Observable): Promise<Observable> {\n const { expr, simplified } = await simplifyExpr(obs.expr);\n if (!simplified) return obs;\n return makeObservable(obs.name, obs.symbol, obs.dim, expr);\n}\n"]}
1
+ {"version":3,"file":"expr-simplify.js","sourceRoot":"","sources":["../../src/composition/expr-simplify.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Symbolic simplification of a scalar `ExprNode` via MathTS (v0.12 — optional\n * supplement to symbolic composition).\n *\n * Composing two bridges' symbolic forms leaves an UNSIMPLIFIED AST — CT-1 is\n * `k_B·(ℏc³/8πG·mass·k_B)·ln2`, with `k_B` uncancelled. This folds it to the\n * canonical `ℏc³·ln2/(8πG·mass)` using `@danielsimonjr/mathts-functions`'\n * `simplify` (the same OPTIONAL peer the Path-A formula parser loads).\n *\n * Pipeline (Adam+Eve-vetted — docs/planning/v0.12.0-Symbolic-Simplification-\n * Design.md): GENSYM every non-exponent leaf to a mathjs-safe identifier\n * (shared by name, so repeated leaves cancel), render FULLY-PARENTHESIZED\n * (EVE-A — no precedence ambiguity), `parse`+`simplify`, walk the result back\n * (un-gensym, INTEGER-exponent-strict — EVE/Adam HIGH-1). Three guards make a\n * black-box CAS safe to trust:\n * 1. dimensional — `validate(simplified)` dim `equals` the original's;\n * 2. structural — non-numeric symbols of the result ⊆ those of the original\n * (no leaf invented — Adam HIGH-2 / EVE-B);\n * 3. numeric — `evalExpr` agrees over ≥2 finite synthesized probes at\n * rel tol 1e-9 (Adam CRITICAL-2 / EVE-C).\n * A representable result that DISAGREES dimensionally/numerically THROWS (a\n * bug to surface); anything we cannot represent / verify / load degrades to a\n * graceful no-op (return the original, `simplified:false`).\n *\n * INTERNAL — surfaced via `upt symbolic --simplify`.\n *\n * @module composition/expr-simplify\n */\n\nimport type { ExprNode } from '../dimensional/validator.js';\nimport { validate } from '../dimensional/validator.js';\nimport { equals } from '../dimensional/algebra.js';\nimport type { Dimension } from '../dimensional/types.js';\nimport { DIMENSIONLESS } from '../dimensional/types.js';\nimport { evalExpr } from './expr-eval.js';\nimport { forEachScalarLeaf, isDecimalLiteral } from '../dimensional/ast-leaves.js';\nimport { isRegisteredConstant } from '../dimensional/symbolic-constants.js';\nimport type { Observable } from './compose-symbolic.js';\nimport { makeObservable } from './compose-symbolic.js';\nimport { renderScalarLeaf } from './mathts-scalar-symbols.js';\nimport { quietly } from './mathts-quiet.js';\n\n/** A simplification completed but produced a dimensionally/numerically wrong\n * result (a real bug — not a graceful no-op). @internal */\nclass SimplificationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'SimplificationError';\n }\n}\n\n/** The bits of a MathTS (mathjs-style) AST node the walk-back reads — pinned\n * + runtime-verified (Adam CRITICAL-1). */\ninterface MathNode {\n readonly type?: string;\n readonly op?: string;\n readonly name?: string;\n readonly value?: unknown;\n readonly args?: MathNode[];\n readonly content?: MathNode;\n toString(): string;\n}\ninterface MathtsSimplifyModule {\n parse(expr: string): MathNode;\n simplify(node: MathNode): MathNode;\n}\n\n/** Thrown internally when a node cannot be rendered/walked — caught and turned\n * into a graceful no-op (never escapes the module). */\nclass Unsupported extends Error {}\n\n// ---------------------------------------------------------------------------\n// Optional-peer load — cache + quietly + simplify-smoke (mirrors\n// formula-registry.ts).\n// ---------------------------------------------------------------------------\n\nlet cached: Promise<MathtsSimplifyModule | null> | undefined;\n\n/** Load + smoke-test the peer. A peer with `parse` but a missing/broken\n * `simplify` (it must actually CANCEL) is rejected → null (graceful no-op). */\nasync function detect(): Promise<MathtsSimplifyModule | null> {\n try {\n // Import AND smoke-test inside the ONE suppression window this module\n // opens (`mathts-quiet.ts` states the invariant): the WASM-fallback\n // chatter fires lazily on first parse/simplify, not only at import, and\n // the smoke below is that first use. Later calls run with the console\n // untouched.\n return await quietly(async () => {\n const mod = (await import(\n '@danielsimonjr/mathts-functions'\n )) as unknown as MathtsSimplifyModule;\n if (typeof mod.parse !== 'function' || typeof mod.simplify !== 'function') {\n return null;\n }\n // Smoke: g0 must cancel out of (g0)*((g1)/(g0)) → only g1 remains.\n const s = mod.simplify(mod.parse('(g0)*((g1)/(g0))'));\n const names = new Set<string>();\n collectMathSymbols(s, names);\n return names.size === 1 && names.has('g1') ? mod : null;\n });\n } catch {\n return null;\n }\n}\n\nfunction loadSimplifier(): Promise<MathtsSimplifyModule | null> {\n cached ??= detect();\n return cached;\n}\n\nfunction collectMathSymbols(n: MathNode, out: Set<string>): void {\n if (n.type === 'SymbolNode' && n.name) out.add(n.name);\n if (n.content) collectMathSymbols(n.content, out);\n for (const a of n.args ?? []) collectMathSymbols(a, out);\n}\n\n// ---------------------------------------------------------------------------\n// ExprNode → gensym string (fully parenthesized) and back.\n// ---------------------------------------------------------------------------\n\n/** The leaf a gensym stands for: its name and dimension. @internal */\nexport interface LeafMeta {\n readonly name: string;\n readonly dim: Dimension;\n}\n\nconst isLiteral = isDecimalLiteral;\n\n/**\n * Render a scalar ExprNode to a mathjs-safe, fully-parenthesized string,\n * gensym'ing each non-literal leaf by NAME (so repeats share an identifier\n * and can cancel). Throws on a non-scalar arm and on a non-literal exponent;\n * `algebraic-equivalence.ts` renders both sides of a quotient through one\n * gensym table with it.\n *\n * @internal\n */\nexport function renderGensym(\n expr: ExprNode,\n gensymOf: Map<string, string>,\n meta: Map<string, LeafMeta>,\n): string {\n switch (expr.kind) {\n case 'symbol':\n return renderScalarLeaf(expr, gensymOf, meta);\n case 'op': {\n if (expr.op === '^') {\n const exp = expr.args[1];\n if (!exp || exp.kind !== 'symbol' || !isLiteral(exp.name)) {\n throw new Unsupported();\n }\n return `(${renderGensym(expr.args[0], gensymOf, meta)})^${Number(exp.name)}`;\n }\n if (expr.args.length === 0) throw new Unsupported();\n const parts = expr.args.map((a) => `(${renderGensym(a, gensymOf, meta)})`);\n return `(${parts.join(expr.op)})`;\n }\n default:\n throw new Unsupported(); // integral / derivative / tensor arms\n }\n}\n\nconst lit = (v: number): ExprNode => ({ kind: 'symbol', name: String(v), dim: DIMENSIONLESS });\n\n/** Walk a simplified MathTS node back to an ExprNode, un-gensym'ing leaves and\n * rejecting anything outside UPT's integer-exponent scalar model (→ throws\n * `Unsupported`, a graceful no-op). */\nfunction walkBack(node: MathNode, meta: Map<string, LeafMeta>): ExprNode {\n switch (node.type) {\n case 'ConstantNode': {\n if (typeof node.value !== 'number' || !Number.isFinite(node.value)) {\n throw new Unsupported();\n }\n return lit(node.value);\n }\n case 'SymbolNode': {\n const m = node.name !== undefined ? meta.get(node.name) : undefined;\n if (!m) throw new Unsupported(); // a symbol we did not issue\n return { kind: 'symbol', name: m.name, dim: m.dim };\n }\n case 'ParenthesisNode':\n if (!node.content) throw new Unsupported();\n return walkBack(node.content, meta);\n case 'OperatorNode': {\n const op = node.op;\n const args = node.args ?? [];\n if (op === '^') {\n if (args.length !== 2) throw new Unsupported();\n const exp = args[1];\n if (\n exp.type !== 'ConstantNode' ||\n typeof exp.value !== 'number' ||\n !Number.isInteger(exp.value)\n ) {\n throw new Unsupported(); // non-integer exponent — not in ℤ⁷ model\n }\n return {\n kind: 'op',\n op: '^',\n args: [walkBack(args[0], meta), lit(exp.value)],\n };\n }\n if ((op === '+' || op === '-') && args.length === 1) {\n // unary minus → (-1) * arg\n return { kind: 'op', op: '*', args: [lit(-1), walkBack(args[0], meta)] };\n }\n if (op === '+' || op === '-' || op === '*' || op === '/') {\n if (args.length < 2) throw new Unsupported();\n return { kind: 'op', op, args: args.map((a) => walkBack(a, meta)) };\n }\n throw new Unsupported();\n }\n default:\n throw new Unsupported(); // FunctionNode (sqrt/cbrt/…) etc.\n }\n}\n\n// ---------------------------------------------------------------------------\n// Guards.\n// ---------------------------------------------------------------------------\n\nfunction symbolNames(expr: ExprNode, out: string[] = []): string[] {\n forEachScalarLeaf(expr, (leaf) => out.push(leaf.name), { integral: 'over+integrand', derivative: true });\n return out;\n}\n\nconst nonNumericSymbols = (expr: ExprNode): string[] =>\n symbolNames(expr).filter((n) => !isLiteral(n));\n\nconst PROBE_VALUES = [2.3, 3.7, 5.1, 7.9, 11.3, 13.1, 17.9, 19.3];\nconst PROBE_MULTIPLIERS = [1, 1.7, 0.41, 2.9];\n\n/** Numeric agreement of `original` and `candidate` over synthesized probes.\n * Free (non-constant) leaves get distinct, mutually-incommensurate values to\n * avoid accidental cancellation. <2 finite probes ⇒ 'insufficient' (cannot\n * verify — EVE-C). */\nfunction numericAgreement(\n original: ExprNode,\n candidate: ExprNode,\n): 'agree' | 'disagree' | 'insufficient' {\n const leaves = [...new Set(nonNumericSymbols(original))].filter(\n (n) => !isRegisteredConstant(n),\n );\n let finiteProbes = 0;\n for (const mult of PROBE_MULTIPLIERS) {\n const values: Record<string, number> = {};\n leaves.forEach((leaf, i) => {\n values[leaf] = PROBE_VALUES[i % PROBE_VALUES.length] * mult;\n });\n let a: number;\n let b: number;\n try {\n a = evalExpr(original, values);\n b = evalExpr(candidate, values);\n } catch {\n continue; // a probe drove evalExpr non-finite — skip it\n }\n if (!Number.isFinite(a) || !Number.isFinite(b)) continue;\n finiteProbes++;\n if (Math.abs(a - b) / Math.abs(b || 1) > 1e-9) return 'disagree';\n }\n return finiteProbes >= 2 ? 'agree' : 'insufficient';\n}\n\n// ---------------------------------------------------------------------------\n// Public entry points.\n// ---------------------------------------------------------------------------\n\n/** The result of attempting to simplify an expression. */\ninterface SimplifyResult {\n readonly expr: ExprNode;\n /** True iff MathTS was present AND produced a guard-passing, distinct form. */\n readonly simplified: boolean;\n}\n\n/**\n * Whether the optional MathTS simplifier peer is installed AND passes its\n * smoke test.\n *\n * {@link simplifyExpr} returns `simplified: false` both when the peer is absent\n * and when it is present but could not reduce the expression, so a caller that\n * must report WHY nothing happened (the atlas witness runner's `peer-absent`\n * versus `not-simplified`) needs this separate signal. Shares the same cached\n * detection, so it costs nothing after the first call.\n *\n * @internal\n */\nexport async function isSimplifierAvailable(): Promise<boolean> {\n return (await loadSimplifier()) !== null;\n}\n\n/**\n * Simplify a scalar `ExprNode` via MathTS, guarded. Returns the original\n * unchanged (`simplified:false`) when the peer is absent or the result cannot\n * be represented/verified; THROWS {@link SimplificationError} only when a\n * representable result disagrees dimensionally/numerically. See module docs.\n *\n * @internal\n */\nexport async function simplifyExpr(expr: ExprNode): Promise<SimplifyResult> {\n const mod = await loadSimplifier();\n if (!mod) return { expr, simplified: false };\n\n const gensymOf = new Map<string, string>();\n const meta = new Map<string, LeafMeta>();\n let candidate: ExprNode;\n try {\n const str = renderGensym(expr, gensymOf, meta);\n // The peer can THROW on some forms (e.g. a known mathts `simplify` BigInt\n // bug on nested `a/(b/c²)`); that, like an unsupported node, is a graceful\n // no-op, not an error. The console is not touched here: the peer's first\n // use already ran inside `detect`'s load window.\n const simplifiedNode = mod.simplify(mod.parse(str));\n candidate = walkBack(simplifiedNode, meta);\n } catch {\n return { expr, simplified: false }; // unsupported / unrepresentable / peer threw\n }\n\n // Guard 1 — dimensional. Inability to validate ⇒ no-op; a CHANGED dimension\n // is a representable disagreement ⇒ throw.\n const origDim = validate(expr).inferredDimension;\n // A literal ZERO carries every dimension: `x − x` with `x` a length is a zero\n // LENGTH, but the CAS hands back a bare dimensionless `0`. Re-stamp it with\n // the original dimension, or this guard would reject every exact\n // cancellation of a dimensioned expression as a \"changed dimension\".\n if (\n origDim !== null &&\n candidate.kind === 'symbol' &&\n candidate.name.trim() !== '' &&\n Number(candidate.name) === 0\n ) {\n candidate = { kind: 'symbol', name: '0', dim: origDim };\n }\n const newResult = validate(candidate);\n if (origDim === null || !newResult.ok || newResult.inferredDimension === null) {\n return { expr, simplified: false };\n }\n if (!equals(origDim, newResult.inferredDimension)) {\n throw new SimplificationError(\n `simplifyExpr: the simplified form changed dimension — a CAS or ` +\n `walk-back error.`,\n );\n }\n\n // Guard 2 — structural subset (no non-numeric leaf invented).\n const origSyms = new Set(nonNumericSymbols(expr));\n for (const s of nonNumericSymbols(candidate)) {\n if (!origSyms.has(s)) return { expr, simplified: false }; // suspicious ⇒ no-op\n }\n\n // Guard 3 — numeric agreement.\n const verdict = numericAgreement(expr, candidate);\n if (verdict === 'disagree') {\n throw new SimplificationError(\n `simplifyExpr: the simplified form disagrees numerically with the ` +\n `original — a CAS or walk-back error.`,\n );\n }\n if (verdict === 'insufficient') return { expr, simplified: false };\n\n // Identical-structure ⇒ nothing gained; report not simplified.\n const changed = symbolNames(candidate).length !== symbolNames(expr).length;\n return { expr: candidate, simplified: changed };\n}\n\n/**\n * Simplify a composed {@link Observable}: returns a freshly-RECONSTRUCTED\n * Observable (new strict `evaluate` closure over the simplified `expr` +\n * recomputed `leaves`) when simplification succeeds, else the original\n * unchanged. See module docs.\n *\n * @internal\n */\nexport async function simplifyObservable(obs: Observable): Promise<Observable> {\n const { expr, simplified } = await simplifyExpr(obs.expr);\n if (!simplified) return obs;\n return makeObservable(obs.name, obs.symbol, obs.dim, expr);\n}\n"]}
@@ -9,14 +9,33 @@
9
9
  *
10
10
  * @module composition/formula-shape
11
11
  */
12
+ import { Fraction } from '@danielsimonjr/mathts-core';
12
13
  import type { ExprNode } from '../dimensional/ast-types.js';
13
14
  /** `monomial` is a product of powers. `dimensional-sum` adds dimensionful terms. */
14
15
  type FormulaShape = 'monomial' | 'dimensional-sum';
15
16
  /**
16
- * Exponents of every symbol in a product, quotient, or literal integer power.
17
- * Undefined for a sum or any node that is not that monomial. The one reader
18
- * of a monomial's exponents: the canonical graph reads a count's exponent
19
- * from it, and a composed edge reads the junction's exponent from it.
17
+ * The rational a literal exponent stands for: a bounded-denominator scan at
18
+ * the fit's tolerance reads `0.3333333333333333` as `1/3`; a decimal that
19
+ * is no such rational (`0.3333`) is kept as the exact decimal it spells.
20
+ *
21
+ * @internal
22
+ */
23
+ export declare function rationalExponentOf(name: string): Fraction | undefined;
24
+ /**
25
+ * Exact exponents of every symbol in a product, quotient, or literal power,
26
+ * as core `Fraction`s. Undefined for a sum or any node that is not that
27
+ * monomial. A cancellation is an exact zero: `(x^(1/3))^3 / x` carries `x`
28
+ * at `0`, not at `2.2e-16`.
29
+ *
30
+ * @internal
31
+ */
32
+ export declare function monomialExponentsExact(node: ExprNode | undefined): Map<string, Fraction> | undefined;
33
+ /**
34
+ * Exponents of every symbol in a product, quotient, or literal power, as
35
+ * numbers: the projection of {@link monomialExponentsExact}. Undefined for a
36
+ * sum or any node that is not that monomial. The canonical graph reads a
37
+ * count's exponent from it, and a composed edge reads the junction's
38
+ * exponent from it.
20
39
  *
21
40
  * @internal
22
41
  */
@@ -1 +1 @@
1
- {"version":3,"file":"formula-shape.d.ts","sourceRoot":"","sources":["../../src/composition/formula-shape.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAK5D,oFAAoF;AACpF,KAAK,YAAY,GAAG,UAAU,GAAG,iBAAiB,CAAC;AAInD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAiC7F;AAuFD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,YAAY,CAEzD"}
1
+ {"version":3,"file":"formula-shape.d.ts","sourceRoot":"","sources":["../../src/composition/formula-shape.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAO5D,oFAAoF;AACpF,KAAK,YAAY,GAAG,UAAU,GAAG,iBAAiB,CAAC;AAEnD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAWrE;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,SAAS,CAiCpG;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAI7F;AAuFD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,YAAY,CAEzD"}