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
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Equality of two scalar expressions up to a dimensionless constant, decided
3
+ * by MathTS `simplify` (proposal 2).
4
+ *
5
+ * `normalForm` is the cheap structural key: it flattens products and drops
6
+ * dimensionless constants, but `a/(b/c)` and `a·c/b`, or `a·a` and `a²`, hash
7
+ * differently, and a chain that recovers a known law in another spelling was
8
+ * filed as provisional. This module answers the question the hash cannot: it
9
+ * renders both sides to the gensym string `expr-simplify.ts` uses (one gensym
10
+ * per leaf NAME, shared by both sides, so the same leaf cancels; a
11
+ * dimensionless registered constant becomes its number, as the hash drops
12
+ * it), asks `simplify` for `(A)/(B)`, and reads a constant node as "equal up
13
+ * to that constant". Anything else, a symbol left over, an arm the renderer
14
+ * does not carry, a throw inside the simplifier, is NOT SHOWN EQUAL: a
15
+ * negative answer here is an absence of proof, never a proof of difference.
16
+ *
17
+ * MathTS `symbolicEqual` is not used. Before `@danielsimonjr/mathts-functions`
18
+ * 0.68.4 it passed an empty rule list and compared every pair false; from
19
+ * 0.68.4 it simplifies with the default rules, and it is the same simplifier
20
+ * this step calls, so it would be the same method, not a second one.
21
+ *
22
+ * The first use runs inside the one console-silencing window
23
+ * `mathts-quiet.ts` describes, as `mathts-scalar-symbols.ts` does for its
24
+ * first parse; every later call runs with the console untouched.
25
+ *
26
+ * @module composition/algebraic-equivalence
27
+ */
28
+ import type { ExprNode } from '../dimensional/validator.js';
29
+ /** The outcome: equal with the constant `A/B`, or not shown equal. @internal */
30
+ export type AlgebraicEquivalence = {
31
+ readonly equal: true;
32
+ readonly constant: number;
33
+ } | {
34
+ readonly equal: false;
35
+ };
36
+ /**
37
+ * Whether `a` and `b` are equal up to a dimensionless constant, and that
38
+ * constant (`a/b`). See the module docs for what a negative answer means.
39
+ *
40
+ * @internal
41
+ */
42
+ export declare function equalUpToConstant(a: ExprNode, b: ExprNode): AlgebraicEquivalence;
43
+ //# sourceMappingURL=algebraic-equivalence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"algebraic-equivalence.d.ts","sourceRoot":"","sources":["../../src/composition/algebraic-equivalence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAQ5D,gFAAgF;AAChF,MAAM,MAAM,oBAAoB,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAuEnH;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG,oBAAoB,CAqBhF"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Equality of two scalar expressions up to a dimensionless constant, decided
3
+ * by MathTS `simplify` (proposal 2).
4
+ *
5
+ * `normalForm` is the cheap structural key: it flattens products and drops
6
+ * dimensionless constants, but `a/(b/c)` and `a·c/b`, or `a·a` and `a²`, hash
7
+ * differently, and a chain that recovers a known law in another spelling was
8
+ * filed as provisional. This module answers the question the hash cannot: it
9
+ * renders both sides to the gensym string `expr-simplify.ts` uses (one gensym
10
+ * per leaf NAME, shared by both sides, so the same leaf cancels; a
11
+ * dimensionless registered constant becomes its number, as the hash drops
12
+ * it), asks `simplify` for `(A)/(B)`, and reads a constant node as "equal up
13
+ * to that constant". Anything else, a symbol left over, an arm the renderer
14
+ * does not carry, a throw inside the simplifier, is NOT SHOWN EQUAL: a
15
+ * negative answer here is an absence of proof, never a proof of difference.
16
+ *
17
+ * MathTS `symbolicEqual` is not used. Before `@danielsimonjr/mathts-functions`
18
+ * 0.68.4 it passed an empty rule list and compared every pair false; from
19
+ * 0.68.4 it simplifies with the default rules, and it is the same simplifier
20
+ * this step calls, so it would be the same method, not a second one.
21
+ *
22
+ * The first use runs inside the one console-silencing window
23
+ * `mathts-quiet.ts` describes, as `mathts-scalar-symbols.ts` does for its
24
+ * first parse; every later call runs with the console untouched.
25
+ *
26
+ * @module composition/algebraic-equivalence
27
+ */
28
+ import { parse as mathtsParse, simplify as mathtsSimplify } from '@danielsimonjr/mathts-functions';
29
+ import { mapScalarLeaves } from '../dimensional/ast-leaves.js';
30
+ import { equals } from '../dimensional/algebra.js';
31
+ import { DIMENSIONLESS } from '../dimensional/types.js';
32
+ import { CONSTANTS, isRegisteredConstant, piMultipleValue } from '../dimensional/symbolic-constants.js';
33
+ import { renderGensym } from './expr-simplify.js';
34
+ import { quietlySync } from './mathts-quiet.js';
35
+ const NOT_EQUAL = { equal: false };
36
+ let cached;
37
+ /**
38
+ * `simplify ∘ parse`, bound once, after a smoke test that it CANCELS
39
+ * (`(g0*g1)/(g1*g0)` must come back as the constant 1). A simplifier that
40
+ * fails the smoke is `null`, and every answer is then "not shown equal".
41
+ */
42
+ function simplifier() {
43
+ if (cached !== undefined)
44
+ return cached;
45
+ cached = quietlySync(() => {
46
+ try {
47
+ const run = (text) => mathtsSimplify(mathtsParse(text));
48
+ const smoke = run('(g0*g1)/(g1*g0)');
49
+ return isConstant(smoke) && smoke.value === 1 ? run : null;
50
+ }
51
+ catch {
52
+ return null;
53
+ }
54
+ });
55
+ return cached;
56
+ }
57
+ /** A finite numeric constant node. */
58
+ function isConstant(node) {
59
+ return ((node.isConstantNode === true || node.type === 'ConstantNode') &&
60
+ typeof node.value === 'number' &&
61
+ Number.isFinite(node.value));
62
+ }
63
+ /**
64
+ * The number a dimensionless leaf stands for when `normalForm` would drop it
65
+ * as a constant: a registered dimensionless constant, a spelled multiple of
66
+ * π, or BE-16's `ln_2_constant`. Undefined for every other leaf.
67
+ */
68
+ function droppableConstantValue(name) {
69
+ if (name === 'ln_2_constant')
70
+ return Math.LN2;
71
+ if (isRegisteredConstant(name)) {
72
+ const c = CONSTANTS[name];
73
+ return equals(c.dim, DIMENSIONLESS) ? c.value : undefined;
74
+ }
75
+ return piMultipleValue(name);
76
+ }
77
+ /** Dimensionless named constants become literals, so the ratio of two forms that differ by one is a number. */
78
+ function constantsAsLiterals(expr) {
79
+ return mapScalarLeaves(expr, (leaf) => {
80
+ const value = droppableConstantValue(leaf.name);
81
+ return value === undefined ? leaf : { kind: 'symbol', name: String(value), dim: DIMENSIONLESS };
82
+ }, {});
83
+ }
84
+ /**
85
+ * Whether `a` and `b` are equal up to a dimensionless constant, and that
86
+ * constant (`a/b`). See the module docs for what a negative answer means.
87
+ *
88
+ * @internal
89
+ */
90
+ export function equalUpToConstant(a, b) {
91
+ const run = simplifier();
92
+ if (run === null)
93
+ return NOT_EQUAL;
94
+ const gensymOf = new Map();
95
+ const meta = new Map();
96
+ let text;
97
+ try {
98
+ // One gensym table for both sides: the same leaf name is the same symbol.
99
+ const left = renderGensym(constantsAsLiterals(a), gensymOf, meta);
100
+ const right = renderGensym(constantsAsLiterals(b), gensymOf, meta);
101
+ text = `(${left})/(${right})`;
102
+ }
103
+ catch {
104
+ return NOT_EQUAL; // an arm the renderer does not carry
105
+ }
106
+ let node;
107
+ try {
108
+ node = run(text);
109
+ }
110
+ catch {
111
+ return NOT_EQUAL; // the simplifier threw: not shown equal
112
+ }
113
+ return isConstant(node) ? { equal: true, constant: node.value } : NOT_EQUAL;
114
+ }
115
+ //# sourceMappingURL=algebraic-equivalence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"algebraic-equivalence.js","sourceRoot":"","sources":["../../src/composition/algebraic-equivalence.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Equality of two scalar expressions up to a dimensionless constant, decided\n * by MathTS `simplify` (proposal 2).\n *\n * `normalForm` is the cheap structural key: it flattens products and drops\n * dimensionless constants, but `a/(b/c)` and `a·c/b`, or `a·a` and `a²`, hash\n * differently, and a chain that recovers a known law in another spelling was\n * filed as provisional. This module answers the question the hash cannot: it\n * renders both sides to the gensym string `expr-simplify.ts` uses (one gensym\n * per leaf NAME, shared by both sides, so the same leaf cancels; a\n * dimensionless registered constant becomes its number, as the hash drops\n * it), asks `simplify` for `(A)/(B)`, and reads a constant node as \"equal up\n * to that constant\". Anything else, a symbol left over, an arm the renderer\n * does not carry, a throw inside the simplifier, is NOT SHOWN EQUAL: a\n * negative answer here is an absence of proof, never a proof of difference.\n *\n * MathTS `symbolicEqual` is not used. Before `@danielsimonjr/mathts-functions`\n * 0.68.4 it passed an empty rule list and compared every pair false; from\n * 0.68.4 it simplifies with the default rules, and it is the same simplifier\n * this step calls, so it would be the same method, not a second one.\n *\n * The first use runs inside the one console-silencing window\n * `mathts-quiet.ts` describes, as `mathts-scalar-symbols.ts` does for its\n * first parse; every later call runs with the console untouched.\n *\n * @module composition/algebraic-equivalence\n */\n\nimport { parse as mathtsParse, simplify as mathtsSimplify } from '@danielsimonjr/mathts-functions';\nimport type { ExprNode } from '../dimensional/validator.js';\nimport { mapScalarLeaves } from '../dimensional/ast-leaves.js';\nimport { equals } from '../dimensional/algebra.js';\nimport { DIMENSIONLESS } from '../dimensional/types.js';\nimport { CONSTANTS, isRegisteredConstant, piMultipleValue } from '../dimensional/symbolic-constants.js';\nimport { renderGensym, type LeafMeta } from './expr-simplify.js';\nimport { quietlySync } from './mathts-quiet.js';\n\n/** The outcome: equal with the constant `A/B`, or not shown equal. @internal */\nexport type AlgebraicEquivalence = { readonly equal: true; readonly constant: number } | { readonly equal: false };\n\n/** The bits of a simplified MathTS node this module reads. */\ninterface MathNode {\n readonly type?: string;\n readonly isConstantNode?: boolean;\n readonly value?: unknown;\n}\n\ninterface Simplifier {\n (text: string): MathNode;\n}\n\nconst NOT_EQUAL: AlgebraicEquivalence = { equal: false };\n\nlet cached: Simplifier | null | undefined;\n\n/**\n * `simplify ∘ parse`, bound once, after a smoke test that it CANCELS\n * (`(g0*g1)/(g1*g0)` must come back as the constant 1). A simplifier that\n * fails the smoke is `null`, and every answer is then \"not shown equal\".\n */\nfunction simplifier(): Simplifier | null {\n if (cached !== undefined) return cached;\n cached = quietlySync(() => {\n try {\n const run: Simplifier = (text) => mathtsSimplify(mathtsParse(text)) as unknown as MathNode;\n const smoke = run('(g0*g1)/(g1*g0)');\n return isConstant(smoke) && smoke.value === 1 ? run : null;\n } catch {\n return null;\n }\n });\n return cached;\n}\n\n/** A finite numeric constant node. */\nfunction isConstant(node: MathNode): node is MathNode & { readonly value: number } {\n return (\n (node.isConstantNode === true || node.type === 'ConstantNode') &&\n typeof node.value === 'number' &&\n Number.isFinite(node.value)\n );\n}\n\n/**\n * The number a dimensionless leaf stands for when `normalForm` would drop it\n * as a constant: a registered dimensionless constant, a spelled multiple of\n * π, or BE-16's `ln_2_constant`. Undefined for every other leaf.\n */\nfunction droppableConstantValue(name: string): number | undefined {\n if (name === 'ln_2_constant') return Math.LN2;\n if (isRegisteredConstant(name)) {\n const c = CONSTANTS[name]!;\n return equals(c.dim, DIMENSIONLESS) ? c.value : undefined;\n }\n return piMultipleValue(name);\n}\n\n/** Dimensionless named constants become literals, so the ratio of two forms that differ by one is a number. */\nfunction constantsAsLiterals(expr: ExprNode): ExprNode {\n return mapScalarLeaves(\n expr,\n (leaf) => {\n const value = droppableConstantValue(leaf.name);\n return value === undefined ? leaf : { kind: 'symbol', name: String(value), dim: DIMENSIONLESS };\n },\n {},\n );\n}\n\n/**\n * Whether `a` and `b` are equal up to a dimensionless constant, and that\n * constant (`a/b`). See the module docs for what a negative answer means.\n *\n * @internal\n */\nexport function equalUpToConstant(a: ExprNode, b: ExprNode): AlgebraicEquivalence {\n const run = simplifier();\n if (run === null) return NOT_EQUAL;\n const gensymOf = new Map<string, string>();\n const meta = new Map<string, LeafMeta>();\n let text: string;\n try {\n // One gensym table for both sides: the same leaf name is the same symbol.\n const left = renderGensym(constantsAsLiterals(a), gensymOf, meta);\n const right = renderGensym(constantsAsLiterals(b), gensymOf, meta);\n text = `(${left})/(${right})`;\n } catch {\n return NOT_EQUAL; // an arm the renderer does not carry\n }\n let node: MathNode;\n try {\n node = run(text);\n } catch {\n return NOT_EQUAL; // the simplifier threw: not shown equal\n }\n return isConstant(node) ? { equal: true, constant: node.value } : NOT_EQUAL;\n}\n"]}
@@ -34,14 +34,8 @@ export type StatisticsAxis = 'bosonic' | 'fermionic' | 'anyonic' | 'parastatisti
34
34
  export declare const SCALE_AXIS_VALUES: readonly ScaleAxis[];
35
35
  /** The force values. @internal */
36
36
  export declare const FORCE_AXIS_VALUES: readonly ForceAxis[];
37
- /** The information-measure values. @internal */
38
- export declare const INFORMATION_AXIS_VALUES: readonly InformationAxis[];
39
37
  /** The symmetry values. @internal */
40
38
  export declare const SYMMETRY_AXIS_VALUES: readonly SymmetryAxis[];
41
- /** The topology values. @internal */
42
- export declare const TOPOLOGY_AXIS_VALUES: readonly TopologyAxis[];
43
- /** The statistics values. @internal */
44
- export declare const STATISTICS_AXIS_VALUES: readonly StatisticsAxis[];
45
39
  /** A classification-axis specification. @internal */
46
40
  export interface AxisSpec {
47
41
  /** The axis key, matching the `RegimeAttributes` field name. */
@@ -1 +1 @@
1
- {"version":3,"file":"axes.d.ts","sourceRoot":"","sources":["../../src/composition/axes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,4CAA4C;AAC5C,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,CAAC;AAChF,yCAAyC;AACzC,MAAM,MAAM,SAAS,GACjB,eAAe,GACf,iBAAiB,GACjB,MAAM,GACN,QAAQ,GACR,UAAU,CAAC;AACf,qCAAqC;AACrC,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,CAAC;AACnF,gCAAgC;AAChC,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,CAAC;AACpF,6DAA6D;AAC7D,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC;AAC5E,iFAAiF;AACjF,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,eAAe,CAAC;AAEnF,+FAA+F;AAC/F,eAAO,MAAM,iBAAiB,EAAE,SAAS,SAAS,EAA2D,CAAC;AAC9G,kCAAkC;AAClC,eAAO,MAAM,iBAAiB,EAAE,SAAS,SAAS,EAAuE,CAAC;AAC1H,gDAAgD;AAChD,eAAO,MAAM,uBAAuB,EAAE,SAAS,eAAe,EAAwD,CAAC;AACvH,qCAAqC;AACrC,eAAO,MAAM,oBAAoB,EAAE,SAAS,YAAY,EAA2D,CAAC;AACpH,qCAAqC;AACrC,eAAO,MAAM,oBAAoB,EAAE,SAAS,YAAY,EAAmD,CAAC;AAC5G,uCAAuC;AACvC,eAAO,MAAM,sBAAsB,EAAE,SAAS,cAAc,EAAyD,CAAC;AAEtH,qDAAqD;AACrD,MAAM,WAAW,QAAQ;IACvB,gEAAgE;IAChE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mFAAmF;IACnF,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,EAAE,SAAS,QAAQ,EAqCnC,CAAC;AAEF,6FAA6F;AAC7F,eAAO,MAAM,SAAS,EAAE,SAAS,MAAM,EAAmD,CAAC"}
1
+ {"version":3,"file":"axes.d.ts","sourceRoot":"","sources":["../../src/composition/axes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,4CAA4C;AAC5C,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,CAAC;AAChF,yCAAyC;AACzC,MAAM,MAAM,SAAS,GACjB,eAAe,GACf,iBAAiB,GACjB,MAAM,GACN,QAAQ,GACR,UAAU,CAAC;AACf,qCAAqC;AACrC,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,CAAC;AACnF,gCAAgC;AAChC,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,CAAC;AACpF,6DAA6D;AAC7D,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC;AAC5E,iFAAiF;AACjF,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,eAAe,CAAC;AAEnF,+FAA+F;AAC/F,eAAO,MAAM,iBAAiB,EAAE,SAAS,SAAS,EAA2D,CAAC;AAC9G,kCAAkC;AAClC,eAAO,MAAM,iBAAiB,EAAE,SAAS,SAAS,EAAuE,CAAC;AAG1H,qCAAqC;AACrC,eAAO,MAAM,oBAAoB,EAAE,SAAS,YAAY,EAA2D,CAAC;AAMpH,qDAAqD;AACrD,MAAM,WAAW,QAAQ;IACvB,gEAAgE;IAChE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mFAAmF;IACnF,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,EAAE,SAAS,QAAQ,EAqCnC,CAAC;AAEF,6FAA6F;AAC7F,eAAO,MAAM,SAAS,EAAE,SAAS,MAAM,EAAmD,CAAC"}
@@ -22,14 +22,14 @@
22
22
  export const SCALE_AXIS_VALUES = ['quantum', 'mesoscopic', 'classical', 'cosmological'];
23
23
  /** The force values. @internal */
24
24
  export const FORCE_AXIS_VALUES = ['gravitational', 'electromagnetic', 'weak', 'strong', 'emergent'];
25
- /** The information-measure values. @internal */
26
- export const INFORMATION_AXIS_VALUES = ['von-neumann', 'shannon', 'kolmogorov', 'discord'];
25
+ /** The information-measure values; read by its `AXES` row alone, so not exported. */
26
+ const INFORMATION_AXIS_VALUES = ['von-neumann', 'shannon', 'kolmogorov', 'discord'];
27
27
  /** The symmetry values. @internal */
28
28
  export const SYMMETRY_AXIS_VALUES = ['poincare', 'gauge', 'conformal', 'susy', 'emergent'];
29
- /** The topology values. @internal */
30
- export const TOPOLOGY_AXIS_VALUES = ['trivial', 'chern', 'winding', 'z2', 'berry'];
31
- /** The statistics values. @internal */
32
- export const STATISTICS_AXIS_VALUES = ['bosonic', 'fermionic', 'anyonic', 'parastatistic'];
29
+ /** The topology values; read by its `AXES` row alone, so not exported. */
30
+ const TOPOLOGY_AXIS_VALUES = ['trivial', 'chern', 'winding', 'z2', 'berry'];
31
+ /** The statistics values; read by its `AXES` row alone, so not exported. */
32
+ const STATISTICS_AXIS_VALUES = ['bosonic', 'fermionic', 'anyonic', 'parastatistic'];
33
33
  /**
34
34
  * The classification-axis registry. `gated` reflects measured discrimination:
35
35
  * scale/force fire on the current catalog; the rest abstain (too little attribute
@@ -1 +1 @@
1
- {"version":3,"file":"axes.js","sourceRoot":"","sources":["../../src/composition/axes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAoBH,+FAA+F;AAC/F,MAAM,CAAC,MAAM,iBAAiB,GAAyB,CAAC,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;AAC9G,kCAAkC;AAClC,MAAM,CAAC,MAAM,iBAAiB,GAAyB,CAAC,eAAe,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC1H,gDAAgD;AAChD,MAAM,CAAC,MAAM,uBAAuB,GAA+B,CAAC,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AACvH,qCAAqC;AACrC,MAAM,CAAC,MAAM,oBAAoB,GAA4B,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AACpH,qCAAqC;AACrC,MAAM,CAAC,MAAM,oBAAoB,GAA4B,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5G,uCAAuC;AACvC,MAAM,CAAC,MAAM,sBAAsB,GAA8B,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;AAiBtH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,IAAI,GAAwB;IACvC;QACE,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,iBAAiB;QACzB,KAAK,EAAE,IAAI;QACX,WAAW,EAAE,sDAAsD;KACpE;IACD;QACE,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,iBAAiB;QACzB,KAAK,EAAE,IAAI;QACX,WAAW,EAAE,kDAAkD;KAChE;IACD;QACE,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,uBAAuB;QAC/B,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,kFAAkF;KAChG;IACD;QACE,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,oBAAoB;QAC5B,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,iFAAiF;KAC/F;IACD;QACE,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,oBAAoB;QAC5B,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,uFAAuF;KACrG;IACD;QACE,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,sBAAsB;QAC9B,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,qJAAqJ;KACnK;CACF,CAAC;AAEF,6FAA6F;AAC7F,MAAM,CAAC,MAAM,SAAS,GAAsB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC","sourcesContent":["/**\n * The extensible tensor-axis registry — the single source for UPT's classification\n * axes (the regime/attribute layer the discovery funnel and quantities use).\n *\n * Each axis is BOTH a typed union (compile-time safety) AND an {@link AxisSpec}\n * registry entry (runtime — drives the discovery falsifier and the discrimination\n * audit). Adding an axis is one union + one registry line + tagging quantities;\n * enabling its falsifier gate is a one-line `gated: true` flip — but only after the\n * discrimination audit (`axis-audit.ts`) shows it actually fires. Rank grows on\n * measured physics, not vision — an axis that only ever abstains stays ungated.\n *\n * NOTE: the SI `Dimension` axis is deliberately NOT here — it is the complete 7-base\n * system in `dimensional/` (conflating it would break Buckingham-π). The tensor-config\n * types in `core/types.ts` (`PhysicalScale`/`Force`/… consumed by `UniversalTensor`)\n * are a separate concern; this registry is the discovery/attribute layer.\n *\n * Leaf module — no intra-`composition` imports (keeps the type-only cycle count at 0).\n *\n * @module composition/axes\n */\n\n/** Length/energy scale regime. @internal */\nexport type ScaleAxis = 'quantum' | 'mesoscopic' | 'classical' | 'cosmological';\n/** Fundamental interaction. @internal */\nexport type ForceAxis =\n | 'gravitational'\n | 'electromagnetic'\n | 'weak'\n | 'strong'\n | 'emergent';\n/** Information measure. @internal */\nexport type InformationAxis = 'von-neumann' | 'shannon' | 'kolmogorov' | 'discord';\n/** Symmetry class. @internal */\nexport type SymmetryAxis = 'poincare' | 'gauge' | 'conformal' | 'susy' | 'emergent';\n/** Topological classification (invariant type). @internal */\nexport type TopologyAxis = 'trivial' | 'chern' | 'winding' | 'z2' | 'berry';\n/** Quantum statistics (the 7th axis — orthogonal to the other six). @internal */\nexport type StatisticsAxis = 'bosonic' | 'fermionic' | 'anyonic' | 'parastatistic';\n\n/** The scale values, the one list the registry row and every typed consumer read. @internal */\nexport const SCALE_AXIS_VALUES: readonly ScaleAxis[] = ['quantum', 'mesoscopic', 'classical', 'cosmological'];\n/** The force values. @internal */\nexport const FORCE_AXIS_VALUES: readonly ForceAxis[] = ['gravitational', 'electromagnetic', 'weak', 'strong', 'emergent'];\n/** The information-measure values. @internal */\nexport const INFORMATION_AXIS_VALUES: readonly InformationAxis[] = ['von-neumann', 'shannon', 'kolmogorov', 'discord'];\n/** The symmetry values. @internal */\nexport const SYMMETRY_AXIS_VALUES: readonly SymmetryAxis[] = ['poincare', 'gauge', 'conformal', 'susy', 'emergent'];\n/** The topology values. @internal */\nexport const TOPOLOGY_AXIS_VALUES: readonly TopologyAxis[] = ['trivial', 'chern', 'winding', 'z2', 'berry'];\n/** The statistics values. @internal */\nexport const STATISTICS_AXIS_VALUES: readonly StatisticsAxis[] = ['bosonic', 'fermionic', 'anyonic', 'parastatistic'];\n\n/** A classification-axis specification. @internal */\nexport interface AxisSpec {\n /** The axis key, matching the `RegimeAttributes` field name. */\n readonly name: string;\n /** The axis's allowed values at runtime (must equal the typed union's members). */\n readonly values: readonly string[];\n /**\n * Whether the discovery axis-falsifier gates on this axis. Flipped to `true`\n * ONLY when `auditAxisDiscrimination` shows the axis actually clashes on real\n * candidates — never on vision alone.\n */\n readonly gated: boolean;\n readonly description: string;\n}\n\n/**\n * The classification-axis registry. `gated` reflects measured discrimination:\n * scale/force fire on the current catalog; the rest abstain (too little attribute\n * coverage yet) and stay ungated until the branch expansion + audit earn them a gate.\n *\n * @internal\n */\nexport const AXES: readonly AxisSpec[] = [\n {\n name: 'scale',\n values: SCALE_AXIS_VALUES,\n gated: true,\n description: 'Length/energy-scale regime (quantum → cosmological).',\n },\n {\n name: 'force',\n values: FORCE_AXIS_VALUES,\n gated: true,\n description: 'Fundamental (or emergent effective) interaction.',\n },\n {\n name: 'information',\n values: INFORMATION_AXIS_VALUES,\n gated: false,\n description: 'Information measure — authored, not gated (see discovery precision calibration).',\n },\n {\n name: 'symmetry',\n values: SYMMETRY_AXIS_VALUES,\n gated: false,\n description: 'Symmetry class — first-class attribute; ungated until coverage + audit earn it.',\n },\n {\n name: 'topology',\n values: TOPOLOGY_AXIS_VALUES,\n gated: false,\n description: 'Topological invariant type — populates the rank-6 Topology axis; ungated until audit.',\n },\n {\n name: 'statistics',\n values: STATISTICS_AXIS_VALUES,\n gated: false,\n description: 'Quantum statistics (the 7th axis). NOTE: spin-statistics ties it to symmetry — the audit must confirm it discriminates independently before gating.',\n },\n];\n\n/** The axis names the discovery falsifier gates on (derived from the registry). @internal */\nexport const GATE_AXES: readonly string[] = AXES.filter((a) => a.gated).map((a) => a.name);\n"]}
1
+ {"version":3,"file":"axes.js","sourceRoot":"","sources":["../../src/composition/axes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAoBH,+FAA+F;AAC/F,MAAM,CAAC,MAAM,iBAAiB,GAAyB,CAAC,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;AAC9G,kCAAkC;AAClC,MAAM,CAAC,MAAM,iBAAiB,GAAyB,CAAC,eAAe,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC1H,qFAAqF;AACrF,MAAM,uBAAuB,GAA+B,CAAC,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAChH,qCAAqC;AACrC,MAAM,CAAC,MAAM,oBAAoB,GAA4B,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AACpH,0EAA0E;AAC1E,MAAM,oBAAoB,GAA4B,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AACrG,4EAA4E;AAC5E,MAAM,sBAAsB,GAA8B,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;AAiB/G;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,IAAI,GAAwB;IACvC;QACE,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,iBAAiB;QACzB,KAAK,EAAE,IAAI;QACX,WAAW,EAAE,sDAAsD;KACpE;IACD;QACE,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,iBAAiB;QACzB,KAAK,EAAE,IAAI;QACX,WAAW,EAAE,kDAAkD;KAChE;IACD;QACE,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,uBAAuB;QAC/B,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,kFAAkF;KAChG;IACD;QACE,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,oBAAoB;QAC5B,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,iFAAiF;KAC/F;IACD;QACE,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,oBAAoB;QAC5B,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,uFAAuF;KACrG;IACD;QACE,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,sBAAsB;QAC9B,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,qJAAqJ;KACnK;CACF,CAAC;AAEF,6FAA6F;AAC7F,MAAM,CAAC,MAAM,SAAS,GAAsB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC","sourcesContent":["/**\n * The extensible tensor-axis registry — the single source for UPT's classification\n * axes (the regime/attribute layer the discovery funnel and quantities use).\n *\n * Each axis is BOTH a typed union (compile-time safety) AND an {@link AxisSpec}\n * registry entry (runtime — drives the discovery falsifier and the discrimination\n * audit). Adding an axis is one union + one registry line + tagging quantities;\n * enabling its falsifier gate is a one-line `gated: true` flip — but only after the\n * discrimination audit (`axis-audit.ts`) shows it actually fires. Rank grows on\n * measured physics, not vision — an axis that only ever abstains stays ungated.\n *\n * NOTE: the SI `Dimension` axis is deliberately NOT here — it is the complete 7-base\n * system in `dimensional/` (conflating it would break Buckingham-π). The tensor-config\n * types in `core/types.ts` (`PhysicalScale`/`Force`/… consumed by `UniversalTensor`)\n * are a separate concern; this registry is the discovery/attribute layer.\n *\n * Leaf module — no intra-`composition` imports (keeps the type-only cycle count at 0).\n *\n * @module composition/axes\n */\n\n/** Length/energy scale regime. @internal */\nexport type ScaleAxis = 'quantum' | 'mesoscopic' | 'classical' | 'cosmological';\n/** Fundamental interaction. @internal */\nexport type ForceAxis =\n | 'gravitational'\n | 'electromagnetic'\n | 'weak'\n | 'strong'\n | 'emergent';\n/** Information measure. @internal */\nexport type InformationAxis = 'von-neumann' | 'shannon' | 'kolmogorov' | 'discord';\n/** Symmetry class. @internal */\nexport type SymmetryAxis = 'poincare' | 'gauge' | 'conformal' | 'susy' | 'emergent';\n/** Topological classification (invariant type). @internal */\nexport type TopologyAxis = 'trivial' | 'chern' | 'winding' | 'z2' | 'berry';\n/** Quantum statistics (the 7th axis — orthogonal to the other six). @internal */\nexport type StatisticsAxis = 'bosonic' | 'fermionic' | 'anyonic' | 'parastatistic';\n\n/** The scale values, the one list the registry row and every typed consumer read. @internal */\nexport const SCALE_AXIS_VALUES: readonly ScaleAxis[] = ['quantum', 'mesoscopic', 'classical', 'cosmological'];\n/** The force values. @internal */\nexport const FORCE_AXIS_VALUES: readonly ForceAxis[] = ['gravitational', 'electromagnetic', 'weak', 'strong', 'emergent'];\n/** The information-measure values; read by its `AXES` row alone, so not exported. */\nconst INFORMATION_AXIS_VALUES: readonly InformationAxis[] = ['von-neumann', 'shannon', 'kolmogorov', 'discord'];\n/** The symmetry values. @internal */\nexport const SYMMETRY_AXIS_VALUES: readonly SymmetryAxis[] = ['poincare', 'gauge', 'conformal', 'susy', 'emergent'];\n/** The topology values; read by its `AXES` row alone, so not exported. */\nconst TOPOLOGY_AXIS_VALUES: readonly TopologyAxis[] = ['trivial', 'chern', 'winding', 'z2', 'berry'];\n/** The statistics values; read by its `AXES` row alone, so not exported. */\nconst STATISTICS_AXIS_VALUES: readonly StatisticsAxis[] = ['bosonic', 'fermionic', 'anyonic', 'parastatistic'];\n\n/** A classification-axis specification. @internal */\nexport interface AxisSpec {\n /** The axis key, matching the `RegimeAttributes` field name. */\n readonly name: string;\n /** The axis's allowed values at runtime (must equal the typed union's members). */\n readonly values: readonly string[];\n /**\n * Whether the discovery axis-falsifier gates on this axis. Flipped to `true`\n * ONLY when `auditAxisDiscrimination` shows the axis actually clashes on real\n * candidates — never on vision alone.\n */\n readonly gated: boolean;\n readonly description: string;\n}\n\n/**\n * The classification-axis registry. `gated` reflects measured discrimination:\n * scale/force fire on the current catalog; the rest abstain (too little attribute\n * coverage yet) and stay ungated until the branch expansion + audit earn them a gate.\n *\n * @internal\n */\nexport const AXES: readonly AxisSpec[] = [\n {\n name: 'scale',\n values: SCALE_AXIS_VALUES,\n gated: true,\n description: 'Length/energy-scale regime (quantum → cosmological).',\n },\n {\n name: 'force',\n values: FORCE_AXIS_VALUES,\n gated: true,\n description: 'Fundamental (or emergent effective) interaction.',\n },\n {\n name: 'information',\n values: INFORMATION_AXIS_VALUES,\n gated: false,\n description: 'Information measure — authored, not gated (see discovery precision calibration).',\n },\n {\n name: 'symmetry',\n values: SYMMETRY_AXIS_VALUES,\n gated: false,\n description: 'Symmetry class — first-class attribute; ungated until coverage + audit earn it.',\n },\n {\n name: 'topology',\n values: TOPOLOGY_AXIS_VALUES,\n gated: false,\n description: 'Topological invariant type — populates the rank-6 Topology axis; ungated until audit.',\n },\n {\n name: 'statistics',\n values: STATISTICS_AXIS_VALUES,\n gated: false,\n description: 'Quantum statistics (the 7th axis). NOTE: spin-statistics ties it to symmetry — the audit must confirm it discriminates independently before gating.',\n },\n];\n\n/** The axis names the discovery falsifier gates on (derived from the registry). @internal */\nexport const GATE_AXES: readonly string[] = AXES.filter((a) => a.gated).map((a) => a.name);\n"]}
@@ -1,23 +1,36 @@
1
+ import type { BridgeEdge } from './edge.js';
2
+ import type { RegimeAttributes } from './quantity.js';
3
+ import type { QuantityIdentification } from './compose.js';
4
+ import type { DiscoveryOptions } from './discovery.js';
1
5
  /**
2
- * Axis-discrimination audit — the anti-inert-metadata gate for the extensible
3
- * axis registry (`axes.ts`).
4
- *
5
- * A classification axis is only load-bearing when it actually SEPARATES real
6
- * candidates. This audit runs the discovery link-candidate enumeration and, for
7
- * EVERY registry axis (gated or not), measures how often the axis FIRES (both
8
- * endpoints carry the attribute and they differ → an axis-clash), ABSTAINS (at
9
- * least one endpoint lacks the attribute), and is CHECKED (both carry it).
6
+ * The level at which an axis is `earned`: 0.05, the conventional two-sided level, fixed before
7
+ * any table was read. Six axes are audited at once, so a reader who wants a family-wise level
8
+ * divides by six (0.0083); the flag is per axis and says so here rather than hiding a
9
+ * correction. Small tables (about twenty magnitude clashes on the catalog) are why the test is
10
+ * exact and not a χ².
10
11
  *
11
- * Use: an axis stays `gated: false` in the registry until this audit shows it
12
- * fires; an axis that only ever abstains is inert and must not be gated. As the
13
- * catalog grows into new branches of physics, re-run this and flip the gates the
14
- * measurement earns. Rank grows on evidence, not vision.
12
+ * @internal
13
+ */
14
+ export declare const AUDIT_ALPHA = 0.05;
15
+ /**
16
+ * Fisher's exact evidence of one axis against the magnitude falsifier, over the candidates
17
+ * where BOTH gates ran (both endpoints carry the axis, and both have a magnitude).
15
18
  *
16
- * @module composition/axis-audit
19
+ * @internal
17
20
  */
18
- import type { BridgeEdge } from './edge.js';
19
- import type { RegimeAttributes } from './quantity.js';
20
- import type { QuantityIdentification } from './compose.js';
21
+ export interface AxisEvidence {
22
+ /**
23
+ * `[[fires ∧ clash, fires ∧ no clash], [silent ∧ clash, silent ∧ no clash]]`: rows are the
24
+ * axis's verdict, columns the magnitude falsifier's.
25
+ */
26
+ readonly table: readonly [readonly [number, number], readonly [number, number]];
27
+ /** Sample odds ratio `ad/bc`, as MathTS reports it; `null` when a zero cell leaves it undefined. */
28
+ readonly oddsRatio: number | null;
29
+ /** Two-sided Fisher exact p; 1 when a margin is zero (only one table is possible). */
30
+ readonly pValue: number;
31
+ /** Candidates where both gates ran (the table's total). */
32
+ readonly n: number;
33
+ }
21
34
  /** Per-axis discrimination measurement over the candidate funnel. @internal */
22
35
  export interface AxisDiscrimination {
23
36
  readonly axis: string;
@@ -32,15 +45,29 @@ export interface AxisDiscrimination {
32
45
  /** fires / checked (0 when nothing is checked). */
33
46
  readonly clashRate: number;
34
47
  /**
35
- * A gate is EARNED when the axis fires at all. `false` here on an ungated axis
36
- * = inert (do not gate); `false` on a gated axis = a regression to investigate.
48
+ * The registry's criterion: a gate is EARNED when the axis fires at all. `false` here on an
49
+ * ungated axis = inert (do not gate); `false` on a gated axis = a regression to investigate.
50
+ * Not changed by `evidence`.
37
51
  */
38
52
  readonly discriminates: boolean;
53
+ /** Fisher's exact test of the axis's fires against the magnitude falsifier's clashes. */
54
+ readonly evidence: AxisEvidence;
55
+ /**
56
+ * The axis's fires coincide with the independent falsifier's clashes more often than chance:
57
+ * `evidence.pValue < AUDIT_ALPHA` AND the association is positive (`a·d > b·c`; an axis whose
58
+ * fires avoid the clashes is not earned, however small its p). Reported beside
59
+ * `discriminates`; it changes no gate.
60
+ */
61
+ readonly earned: boolean;
39
62
  }
63
+ /** The inputs of the magnitude gate an audit may override (a synthetic table for a test). @internal */
64
+ export type AxisAuditOptions = Pick<DiscoveryOptions, 'representativeValues' | 'groundTruth' | 'maxOrdersOfMagnitude'>;
40
65
  /**
41
- * Audit every registry axis's discrimination over the discovery candidate funnel.
66
+ * Audit every registry axis's discrimination over the discovery candidate funnel, with Fisher
67
+ * evidence against the magnitude falsifier. The magnitude gate runs once per candidate from one
68
+ * discovery context (`buildDiscoveryContext`), not the whole funnel.
42
69
  *
43
70
  * @internal
44
71
  */
45
- export declare function auditAxisDiscrimination(edges: readonly BridgeEdge[], attributesByName?: ReadonlyMap<string, RegimeAttributes>, identifications?: readonly QuantityIdentification[]): AxisDiscrimination[];
72
+ export declare function auditAxisDiscrimination(edges: readonly BridgeEdge[], attributesByName?: ReadonlyMap<string, RegimeAttributes>, identifications?: readonly QuantityIdentification[], options?: AxisAuditOptions): AxisDiscrimination[];
46
73
  //# sourceMappingURL=axis-audit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"axis-audit.d.ts","sourceRoot":"","sources":["../../src/composition/axis-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAM3D,+EAA+E;AAC/E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,gEAAgE;IAChE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,mDAAmD;IACnD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,gBAAgB,GAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAA+B,EACrF,eAAe,GAAE,SAAS,sBAAsB,EAA6B,GAC5E,kBAAkB,EAAE,CAkCtB"}
1
+ {"version":3,"file":"axis-audit.d.ts","sourceRoot":"","sources":["../../src/composition/axis-audit.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAK3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,OAAO,CAAC;AAEhC;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChF,oGAAoG;IACpG,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,sFAAsF;IACtF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,2DAA2D;IAC3D,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,+EAA+E;AAC/E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,gEAAgE;IAChE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,mDAAmD;IACnD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,yFAAyF;IACzF,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,uGAAuG;AACvG,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,EAAE,sBAAsB,GAAG,aAAa,GAAG,sBAAsB,CAAC,CAAC;AAavH;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,gBAAgB,GAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAA+B,EACrF,eAAe,GAAE,SAAS,sBAAsB,EAA6B,EAC7E,OAAO,GAAE,gBAAqB,GAC7B,kBAAkB,EAAE,CAuDtB"}
@@ -1,31 +1,102 @@
1
+ /**
2
+ * Axis-discrimination audit — the anti-inert-metadata gate for the extensible
3
+ * axis registry (`axes.ts`).
4
+ *
5
+ * A classification axis is only load-bearing when it actually SEPARATES real
6
+ * candidates. This audit runs the discovery link-candidate enumeration and, for
7
+ * EVERY registry axis (gated or not), measures how often the axis FIRES (both
8
+ * endpoints carry the attribute and they differ → an axis-clash), ABSTAINS (at
9
+ * least one endpoint lacks the attribute), and is CHECKED (both carry it).
10
+ *
11
+ * Beside the firing count, each axis carries EVIDENCE: Fisher's exact test (MathTS
12
+ * `fisherExact`) of its fires against the clashes of the INDEPENDENT magnitude falsifier
13
+ * (`discovery.ts`, `magnitudeGate`) over the candidates where both gates ran, and an `earned`
14
+ * flag at {@link AUDIT_ALPHA}. Firing is activity; agreeing with an independent falsifier more
15
+ * often than chance is evidence. The `discriminates` flag (fires > 0) is the registry's current
16
+ * criterion and is not changed by the evidence; `GATE_AXES` reads the registry, not this audit.
17
+ *
18
+ * Use: an axis stays `gated: false` in the registry until this audit shows it
19
+ * fires; an axis that only ever abstains is inert and must not be gated. As the
20
+ * catalog grows into new branches of physics, re-run this and flip the gates the
21
+ * measurement earns. Rank grows on evidence, not vision.
22
+ *
23
+ * @module composition/axis-audit
24
+ */
25
+ import { fisherExact } from '@danielsimonjr/mathts-functions';
1
26
  import { AXES } from './axes.js';
2
27
  import { proposeLinkCandidates } from './bridge-analysis.js';
3
28
  import { effectiveAttributes, QUANTITY_IDENTIFICATIONS } from './compose.js';
4
- import { REGISTRY_ATTRIBUTES_BY_NAME } from './discovery.js';
29
+ import { buildDiscoveryContext, magnitudeGate, REGISTRY_ATTRIBUTES_BY_NAME } from './discovery.js';
30
+ /**
31
+ * The level at which an axis is `earned`: 0.05, the conventional two-sided level, fixed before
32
+ * any table was read. Six axes are audited at once, so a reader who wants a family-wise level
33
+ * divides by six (0.0083); the flag is per axis and says so here rather than hiding a
34
+ * correction. Small tables (about twenty magnitude clashes on the catalog) are why the test is
35
+ * exact and not a χ².
36
+ *
37
+ * @internal
38
+ */
39
+ export const AUDIT_ALPHA = 0.05;
40
+ /** The one Fisher call, read back for what MathTS returns: a number or `null` odds ratio, a number p. */
41
+ function fisher(table) {
42
+ const r = fisherExact([[...table[0]], [...table[1]]]);
43
+ const oddsRatio = r.oddsRatio;
44
+ const pValue = r.pValue;
45
+ if (typeof pValue !== 'number' || !(pValue >= 0 && pValue <= 1)) {
46
+ throw new TypeError(`fisherExact returned p = ${String(pValue)} for ${JSON.stringify(table)}`);
47
+ }
48
+ return { oddsRatio: typeof oddsRatio === 'number' && Number.isFinite(oddsRatio) ? oddsRatio : null, pValue };
49
+ }
5
50
  /**
6
- * Audit every registry axis's discrimination over the discovery candidate funnel.
51
+ * Audit every registry axis's discrimination over the discovery candidate funnel, with Fisher
52
+ * evidence against the magnitude falsifier. The magnitude gate runs once per candidate from one
53
+ * discovery context (`buildDiscoveryContext`), not the whole funnel.
7
54
  *
8
55
  * @internal
9
56
  */
10
- export function auditAxisDiscrimination(edges, attributesByName = REGISTRY_ATTRIBUTES_BY_NAME, identifications = QUANTITY_IDENTIFICATIONS) {
57
+ export function auditAxisDiscrimination(edges, attributesByName = REGISTRY_ATTRIBUTES_BY_NAME, identifications = QUANTITY_IDENTIFICATIONS, options = {}) {
11
58
  const candidates = proposeLinkCandidates(edges);
59
+ const ctx = buildDiscoveryContext(edges, { ...options, identifications, quantityAttributes: attributesByName });
60
+ const magnitudes = candidates.map((c) => magnitudeGate(c, ctx));
12
61
  return AXES.map((spec) => {
13
62
  let checked = 0;
14
63
  let fires = 0;
15
64
  let abstains = 0;
16
- for (const c of candidates) {
17
- const attrsA = effectiveAttributes(c.a, attributesByName, identifications);
18
- const attrsB = effectiveAttributes(c.b, attributesByName, identifications);
65
+ // The 2×2 table over candidates where both gates ran.
66
+ let a = 0; // fires ∧ clash
67
+ let b = 0; // fires ∧ no clash
68
+ let c = 0; // silent ∧ clash
69
+ let d = 0; // silent ∧ no clash
70
+ candidates.forEach((cand, i) => {
71
+ const attrsA = effectiveAttributes(cand.a, attributesByName, identifications);
72
+ const attrsB = effectiveAttributes(cand.b, attributesByName, identifications);
19
73
  const av = attrsA[spec.name];
20
74
  const bv = attrsB[spec.name];
21
75
  if (av === undefined || bv === undefined) {
22
76
  abstains++;
23
- continue;
77
+ return;
24
78
  }
25
79
  checked++;
26
- if (av !== bv)
80
+ const fired = av !== bv;
81
+ if (fired)
27
82
  fires++;
28
- }
83
+ const gate = magnitudes[i];
84
+ if (!gate.checked)
85
+ return; // the falsifier abstained: no row for this candidate
86
+ if (fired && gate.clash)
87
+ a++;
88
+ else if (fired)
89
+ b++;
90
+ else if (gate.clash)
91
+ c++;
92
+ else
93
+ d++;
94
+ });
95
+ const table = [
96
+ [a, b],
97
+ [c, d],
98
+ ];
99
+ const { oddsRatio, pValue } = fisher(table);
29
100
  return {
30
101
  axis: spec.name,
31
102
  gated: spec.gated,
@@ -34,6 +105,8 @@ export function auditAxisDiscrimination(edges, attributesByName = REGISTRY_ATTRI
34
105
  abstains,
35
106
  clashRate: checked > 0 ? fires / checked : 0,
36
107
  discriminates: fires > 0,
108
+ evidence: { table, oddsRatio, pValue, n: a + b + c + d },
109
+ earned: pValue < AUDIT_ALPHA && a * d > b * c,
37
110
  };
38
111
  });
39
112
  }
@@ -1 +1 @@
1
- {"version":3,"file":"axis-audit.js","sourceRoot":"","sources":["../../src/composition/axis-audit.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAsB7D;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CACrC,KAA4B,EAC5B,gBAAgB,GAA0C,2BAA2B,EACrF,eAAe,GAAsC,wBAAwB;IAE7E,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAChD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACvB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,eAAe,CAGxE,CAAC;YACF,MAAM,MAAM,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,eAAe,CAGxE,CAAC;YACF,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;gBACzC,QAAQ,EAAE,CAAC;gBACX,SAAS;YACX,CAAC;YACD,OAAO,EAAE,CAAC;YACV,IAAI,EAAE,KAAK,EAAE;gBAAE,KAAK,EAAE,CAAC;QACzB,CAAC;QACD,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO;YACP,KAAK;YACL,QAAQ;YACR,SAAS,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC5C,aAAa,EAAE,KAAK,GAAG,CAAC;SACzB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["/**\n * Axis-discrimination audit — the anti-inert-metadata gate for the extensible\n * axis registry (`axes.ts`).\n *\n * A classification axis is only load-bearing when it actually SEPARATES real\n * candidates. This audit runs the discovery link-candidate enumeration and, for\n * EVERY registry axis (gated or not), measures how often the axis FIRES (both\n * endpoints carry the attribute and they differ → an axis-clash), ABSTAINS (at\n * least one endpoint lacks the attribute), and is CHECKED (both carry it).\n *\n * Use: an axis stays `gated: false` in the registry until this audit shows it\n * fires; an axis that only ever abstains is inert and must not be gated. As the\n * catalog grows into new branches of physics, re-run this and flip the gates the\n * measurement earns. Rank grows on evidence, not vision.\n *\n * @module composition/axis-audit\n */\nimport type { BridgeEdge } from './edge.js';\nimport type { RegimeAttributes } from './quantity.js';\nimport type { QuantityIdentification } from './compose.js';\nimport { AXES } from './axes.js';\nimport { proposeLinkCandidates } from './bridge-analysis.js';\nimport { effectiveAttributes, QUANTITY_IDENTIFICATIONS } from './compose.js';\nimport { REGISTRY_ATTRIBUTES_BY_NAME } from './discovery.js';\n\n/** Per-axis discrimination measurement over the candidate funnel. @internal */\nexport interface AxisDiscrimination {\n readonly axis: string;\n /** The registry's current gate flag for this axis. */\n readonly gated: boolean;\n /** Candidate pairs where BOTH endpoints carry the attribute. */\n readonly checked: number;\n /** Of the checked pairs, how many DIFFER (the axis fires → a clash). */\n readonly fires: number;\n /** Pairs where at least one endpoint lacks the attribute (the axis abstains). */\n readonly abstains: number;\n /** fires / checked (0 when nothing is checked). */\n readonly clashRate: number;\n /**\n * A gate is EARNED when the axis fires at all. `false` here on an ungated axis\n * = inert (do not gate); `false` on a gated axis = a regression to investigate.\n */\n readonly discriminates: boolean;\n}\n\n/**\n * Audit every registry axis's discrimination over the discovery candidate funnel.\n *\n * @internal\n */\nexport function auditAxisDiscrimination(\n edges: readonly BridgeEdge[],\n attributesByName: ReadonlyMap<string, RegimeAttributes> = REGISTRY_ATTRIBUTES_BY_NAME,\n identifications: readonly QuantityIdentification[] = QUANTITY_IDENTIFICATIONS,\n): AxisDiscrimination[] {\n const candidates = proposeLinkCandidates(edges);\n return AXES.map((spec) => {\n let checked = 0;\n let fires = 0;\n let abstains = 0;\n for (const c of candidates) {\n const attrsA = effectiveAttributes(c.a, attributesByName, identifications) as Record<\n string,\n string | undefined\n >;\n const attrsB = effectiveAttributes(c.b, attributesByName, identifications) as Record<\n string,\n string | undefined\n >;\n const av = attrsA[spec.name];\n const bv = attrsB[spec.name];\n if (av === undefined || bv === undefined) {\n abstains++;\n continue;\n }\n checked++;\n if (av !== bv) fires++;\n }\n return {\n axis: spec.name,\n gated: spec.gated,\n checked,\n fires,\n abstains,\n clashRate: checked > 0 ? fires / checked : 0,\n discriminates: fires > 0,\n };\n });\n}\n"]}
1
+ {"version":3,"file":"axis-audit.js","sourceRoot":"","sources":["../../src/composition/axis-audit.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Axis-discrimination audit — the anti-inert-metadata gate for the extensible\n * axis registry (`axes.ts`).\n *\n * A classification axis is only load-bearing when it actually SEPARATES real\n * candidates. This audit runs the discovery link-candidate enumeration and, for\n * EVERY registry axis (gated or not), measures how often the axis FIRES (both\n * endpoints carry the attribute and they differ → an axis-clash), ABSTAINS (at\n * least one endpoint lacks the attribute), and is CHECKED (both carry it).\n *\n * Beside the firing count, each axis carries EVIDENCE: Fisher's exact test (MathTS\n * `fisherExact`) of its fires against the clashes of the INDEPENDENT magnitude falsifier\n * (`discovery.ts`, `magnitudeGate`) over the candidates where both gates ran, and an `earned`\n * flag at {@link AUDIT_ALPHA}. Firing is activity; agreeing with an independent falsifier more\n * often than chance is evidence. The `discriminates` flag (fires > 0) is the registry's current\n * criterion and is not changed by the evidence; `GATE_AXES` reads the registry, not this audit.\n *\n * Use: an axis stays `gated: false` in the registry until this audit shows it\n * fires; an axis that only ever abstains is inert and must not be gated. As the\n * catalog grows into new branches of physics, re-run this and flip the gates the\n * measurement earns. Rank grows on evidence, not vision.\n *\n * @module composition/axis-audit\n */\nimport { fisherExact } from '@danielsimonjr/mathts-functions';\nimport type { BridgeEdge } from './edge.js';\nimport type { RegimeAttributes } from './quantity.js';\nimport type { QuantityIdentification } from './compose.js';\nimport { AXES } from './axes.js';\nimport { proposeLinkCandidates } from './bridge-analysis.js';\nimport { effectiveAttributes, QUANTITY_IDENTIFICATIONS } from './compose.js';\nimport { buildDiscoveryContext, magnitudeGate, REGISTRY_ATTRIBUTES_BY_NAME } from './discovery.js';\nimport type { DiscoveryOptions } from './discovery.js';\n\n/**\n * The level at which an axis is `earned`: 0.05, the conventional two-sided level, fixed before\n * any table was read. Six axes are audited at once, so a reader who wants a family-wise level\n * divides by six (0.0083); the flag is per axis and says so here rather than hiding a\n * correction. Small tables (about twenty magnitude clashes on the catalog) are why the test is\n * exact and not a χ².\n *\n * @internal\n */\nexport const AUDIT_ALPHA = 0.05;\n\n/**\n * Fisher's exact evidence of one axis against the magnitude falsifier, over the candidates\n * where BOTH gates ran (both endpoints carry the axis, and both have a magnitude).\n *\n * @internal\n */\nexport interface AxisEvidence {\n /**\n * `[[fires ∧ clash, fires ∧ no clash], [silent ∧ clash, silent ∧ no clash]]`: rows are the\n * axis's verdict, columns the magnitude falsifier's.\n */\n readonly table: readonly [readonly [number, number], readonly [number, number]];\n /** Sample odds ratio `ad/bc`, as MathTS reports it; `null` when a zero cell leaves it undefined. */\n readonly oddsRatio: number | null;\n /** Two-sided Fisher exact p; 1 when a margin is zero (only one table is possible). */\n readonly pValue: number;\n /** Candidates where both gates ran (the table's total). */\n readonly n: number;\n}\n\n/** Per-axis discrimination measurement over the candidate funnel. @internal */\nexport interface AxisDiscrimination {\n readonly axis: string;\n /** The registry's current gate flag for this axis. */\n readonly gated: boolean;\n /** Candidate pairs where BOTH endpoints carry the attribute. */\n readonly checked: number;\n /** Of the checked pairs, how many DIFFER (the axis fires → a clash). */\n readonly fires: number;\n /** Pairs where at least one endpoint lacks the attribute (the axis abstains). */\n readonly abstains: number;\n /** fires / checked (0 when nothing is checked). */\n readonly clashRate: number;\n /**\n * The registry's criterion: a gate is EARNED when the axis fires at all. `false` here on an\n * ungated axis = inert (do not gate); `false` on a gated axis = a regression to investigate.\n * Not changed by `evidence`.\n */\n readonly discriminates: boolean;\n /** Fisher's exact test of the axis's fires against the magnitude falsifier's clashes. */\n readonly evidence: AxisEvidence;\n /**\n * The axis's fires coincide with the independent falsifier's clashes more often than chance:\n * `evidence.pValue < AUDIT_ALPHA` AND the association is positive (`a·d > b·c`; an axis whose\n * fires avoid the clashes is not earned, however small its p). Reported beside\n * `discriminates`; it changes no gate.\n */\n readonly earned: boolean;\n}\n\n/** The inputs of the magnitude gate an audit may override (a synthetic table for a test). @internal */\nexport type AxisAuditOptions = Pick<DiscoveryOptions, 'representativeValues' | 'groundTruth' | 'maxOrdersOfMagnitude'>;\n\n/** The one Fisher call, read back for what MathTS returns: a number or `null` odds ratio, a number p. */\nfunction fisher(table: AxisEvidence['table']): Pick<AxisEvidence, 'oddsRatio' | 'pValue'> {\n const r = fisherExact([[...table[0]], [...table[1]]]);\n const oddsRatio: unknown = r.oddsRatio;\n const pValue: unknown = r.pValue;\n if (typeof pValue !== 'number' || !(pValue >= 0 && pValue <= 1)) {\n throw new TypeError(`fisherExact returned p = ${String(pValue)} for ${JSON.stringify(table)}`);\n }\n return { oddsRatio: typeof oddsRatio === 'number' && Number.isFinite(oddsRatio) ? oddsRatio : null, pValue };\n}\n\n/**\n * Audit every registry axis's discrimination over the discovery candidate funnel, with Fisher\n * evidence against the magnitude falsifier. The magnitude gate runs once per candidate from one\n * discovery context (`buildDiscoveryContext`), not the whole funnel.\n *\n * @internal\n */\nexport function auditAxisDiscrimination(\n edges: readonly BridgeEdge[],\n attributesByName: ReadonlyMap<string, RegimeAttributes> = REGISTRY_ATTRIBUTES_BY_NAME,\n identifications: readonly QuantityIdentification[] = QUANTITY_IDENTIFICATIONS,\n options: AxisAuditOptions = {},\n): AxisDiscrimination[] {\n const candidates = proposeLinkCandidates(edges);\n const ctx = buildDiscoveryContext(edges, { ...options, identifications, quantityAttributes: attributesByName });\n const magnitudes = candidates.map((c) => magnitudeGate(c, ctx));\n return AXES.map((spec) => {\n let checked = 0;\n let fires = 0;\n let abstains = 0;\n // The 2×2 table over candidates where both gates ran.\n let a = 0; // fires ∧ clash\n let b = 0; // fires ∧ no clash\n let c = 0; // silent ∧ clash\n let d = 0; // silent ∧ no clash\n candidates.forEach((cand, i) => {\n const attrsA = effectiveAttributes(cand.a, attributesByName, identifications) as Record<\n string,\n string | undefined\n >;\n const attrsB = effectiveAttributes(cand.b, attributesByName, identifications) as Record<\n string,\n string | undefined\n >;\n const av = attrsA[spec.name];\n const bv = attrsB[spec.name];\n if (av === undefined || bv === undefined) {\n abstains++;\n return;\n }\n checked++;\n const fired = av !== bv;\n if (fired) fires++;\n const gate = magnitudes[i];\n if (!gate.checked) return; // the falsifier abstained: no row for this candidate\n if (fired && gate.clash) a++;\n else if (fired) b++;\n else if (gate.clash) c++;\n else d++;\n });\n const table: AxisEvidence['table'] = [\n [a, b],\n [c, d],\n ];\n const { oddsRatio, pValue } = fisher(table);\n return {\n axis: spec.name,\n gated: spec.gated,\n checked,\n fires,\n abstains,\n clashRate: checked > 0 ? fires / checked : 0,\n discriminates: fires > 0,\n evidence: { table, oddsRatio, pValue, n: a + b + c + d },\n earned: pValue < AUDIT_ALPHA && a * d > b * c,\n };\n });\n}\n"]}
@@ -30,6 +30,21 @@ import type { BridgeEdge } from './edge.js';
30
30
  * dimensionless statement (monomial or decoy); k = monomial × F(k ratios).
31
31
  */
32
32
  export declare function dimensionalFreedom(e: BridgeEdge): number;
33
+ /**
34
+ * The exact form of a clean dimensionless prefactor, or `undefined` when
35
+ * the number is not one. A prefactor `r` is clean when `r = p / (π^a · ln2^b)`
36
+ * for `a ∈ −2..2`, `b ∈ −1..1` and a rational `p` with denominator at most
37
+ * 720, and numerator at most 720, that reproduces it to the relative 1e-9 the
38
+ * derivation fit uses; or
39
+ * when `r²` is, which names `√π`, `√(2π)` and their kin. The simplest
40
+ * `(a, b)` that fits is the one reported, so `2` is `2` and not `2π/π`.
41
+ * The rule replaces a list of seventeen constants matched at 1e-3; `9/8`
42
+ * (be-80) and `π/ln 2` (be-84) were not on it, and `π²/60`, the
43
+ * Stefan–Boltzmann closed form, is a hit under this rule.
44
+ *
45
+ * @internal
46
+ */
47
+ export declare function cleanPrefactorForm(p: number): string | undefined;
33
48
  /**
34
49
  * The outcome of trying to derive a bridge dimensionally + verify it.
35
50
  * `not-a-monomial` means the encoded formula adds dimensionful terms, so a
@@ -43,6 +58,8 @@ interface DerivationResult {
43
58
  readonly prefactor?: number;
44
59
  /** True when derived AND the prefactor is a recognizable constant. */
45
60
  readonly cleanPrefactor?: boolean;
61
+ /** The exact form of a clean prefactor (`9/8`, `π/ln 2`); absent when it is not clean. */
62
+ readonly prefactorForm?: string;
46
63
  }
47
64
  /**
48
65
  * Attempt to derive a bridge: the first constant-subset that dimensionally
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-analysis.d.ts","sourceRoot":"","sources":["../../src/composition/bridge-analysis.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bridge-analysis.d.ts","sourceRoot":"","sources":["../../src/composition/bridge-analysis.ts"],"names":[],"mappings":"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"}