universal-physics-tensor 10.0.0 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (835) hide show
  1. package/README.md +39 -36
  2. package/bin/upt.mjs +13 -1
  3. package/data/applied-cases.json +1892 -0
  4. package/data/applied-cases.schema.json +194 -0
  5. package/data/atlas/atlas.json +25 -25
  6. package/data/atlas/atlas.jsonld +1 -1
  7. package/data/atlas/diffusion.json +6 -6
  8. package/data/atlas/oscillators.json +7 -7
  9. package/data/atlas/waves.json +14 -14
  10. package/data/atlas/witness-results.json +11 -11
  11. package/data/bridge-catalog.json +389 -230
  12. package/data/bridge-catalog.schema.json +45 -7
  13. package/data/units.json +6 -25
  14. package/dist/atlas/applicability.d.ts.map +1 -1
  15. package/dist/atlas/applicability.js +21 -15
  16. package/dist/atlas/applicability.js.map +1 -1
  17. package/dist/atlas/benchmark/hybrid-retrieval.d.ts +9 -1
  18. package/dist/atlas/benchmark/hybrid-retrieval.d.ts.map +1 -1
  19. package/dist/atlas/benchmark/hybrid-retrieval.js +15 -13
  20. package/dist/atlas/benchmark/hybrid-retrieval.js.map +1 -1
  21. package/dist/atlas/benchmark/loader.js +2 -2
  22. package/dist/atlas/benchmark/loader.js.map +1 -1
  23. package/dist/atlas/benchmark/stats.d.ts +2 -2
  24. package/dist/atlas/benchmark/stats.d.ts.map +1 -1
  25. package/dist/atlas/benchmark/stats.js +9 -15
  26. package/dist/atlas/benchmark/stats.js.map +1 -1
  27. package/dist/atlas/catalog-formal-ref.d.ts +26 -3
  28. package/dist/atlas/catalog-formal-ref.d.ts.map +1 -1
  29. package/dist/atlas/catalog-formal-ref.js +52 -5
  30. package/dist/atlas/catalog-formal-ref.js.map +1 -1
  31. package/dist/atlas/chain-pipeline.d.ts.map +1 -1
  32. package/dist/atlas/chain-pipeline.js +7 -8
  33. package/dist/atlas/chain-pipeline.js.map +1 -1
  34. package/dist/atlas/diffusion/bridges-closure.d.ts +0 -4
  35. package/dist/atlas/diffusion/bridges-closure.d.ts.map +1 -1
  36. package/dist/atlas/diffusion/bridges-closure.js +8 -12
  37. package/dist/atlas/diffusion/bridges-closure.js.map +1 -1
  38. package/dist/atlas/diffusion/bridges.d.ts.map +1 -1
  39. package/dist/atlas/diffusion/bridges.js +27 -39
  40. package/dist/atlas/diffusion/bridges.js.map +1 -1
  41. package/dist/atlas/diffusion/dimensions.d.ts +6 -14
  42. package/dist/atlas/diffusion/dimensions.d.ts.map +1 -1
  43. package/dist/atlas/diffusion/dimensions.js +8 -16
  44. package/dist/atlas/diffusion/dimensions.js.map +1 -1
  45. package/dist/atlas/diffusion/models.d.ts +3 -3
  46. package/dist/atlas/diffusion/models.d.ts.map +1 -1
  47. package/dist/atlas/diffusion/models.js +5 -10
  48. package/dist/atlas/diffusion/models.js.map +1 -1
  49. package/dist/atlas/diffusion/numerics.d.ts +16 -4
  50. package/dist/atlas/diffusion/numerics.d.ts.map +1 -1
  51. package/dist/atlas/diffusion/numerics.js +38 -24
  52. package/dist/atlas/diffusion/numerics.js.map +1 -1
  53. package/dist/atlas/link-prediction.d.ts +106 -3
  54. package/dist/atlas/link-prediction.d.ts.map +1 -1
  55. package/dist/atlas/link-prediction.js +212 -66
  56. package/dist/atlas/link-prediction.js.map +1 -1
  57. package/dist/atlas/oscillators/bridges-coarse.d.ts.map +1 -1
  58. package/dist/atlas/oscillators/bridges-coarse.js +7 -11
  59. package/dist/atlas/oscillators/bridges-coarse.js.map +1 -1
  60. package/dist/atlas/oscillators/bridges-exact.d.ts.map +1 -1
  61. package/dist/atlas/oscillators/bridges-exact.js +6 -7
  62. package/dist/atlas/oscillators/bridges-exact.js.map +1 -1
  63. package/dist/atlas/oscillators/bridges-limits.d.ts +3 -16
  64. package/dist/atlas/oscillators/bridges-limits.d.ts.map +1 -1
  65. package/dist/atlas/oscillators/bridges-limits.js +23 -34
  66. package/dist/atlas/oscillators/bridges-limits.js.map +1 -1
  67. package/dist/atlas/oscillators/dimensions.d.ts +9 -21
  68. package/dist/atlas/oscillators/dimensions.d.ts.map +1 -1
  69. package/dist/atlas/oscillators/dimensions.js +9 -21
  70. package/dist/atlas/oscillators/dimensions.js.map +1 -1
  71. package/dist/atlas/oscillators/limit-witnesses.d.ts +2 -2
  72. package/dist/atlas/oscillators/limit-witnesses.d.ts.map +1 -1
  73. package/dist/atlas/oscillators/limit-witnesses.js +17 -15
  74. package/dist/atlas/oscillators/limit-witnesses.js.map +1 -1
  75. package/dist/atlas/oscillators/models.d.ts.map +1 -1
  76. package/dist/atlas/oscillators/models.js +2 -6
  77. package/dist/atlas/oscillators/models.js.map +1 -1
  78. package/dist/atlas/oscillators/pendulum-motion.d.ts +29 -6
  79. package/dist/atlas/oscillators/pendulum-motion.d.ts.map +1 -1
  80. package/dist/atlas/oscillators/pendulum-motion.js +60 -40
  81. package/dist/atlas/oscillators/pendulum-motion.js.map +1 -1
  82. package/dist/atlas/oscillators/phase-translation.d.ts +0 -11
  83. package/dist/atlas/oscillators/phase-translation.d.ts.map +1 -1
  84. package/dist/atlas/oscillators/phase-translation.js +3 -4
  85. package/dist/atlas/oscillators/phase-translation.js.map +1 -1
  86. package/dist/atlas/oscillators/position-translation.d.ts +68 -7
  87. package/dist/atlas/oscillators/position-translation.d.ts.map +1 -1
  88. package/dist/atlas/oscillators/position-translation.js +123 -12
  89. package/dist/atlas/oscillators/position-translation.js.map +1 -1
  90. package/dist/atlas/oscillators/rejections.d.ts +0 -2
  91. package/dist/atlas/oscillators/rejections.d.ts.map +1 -1
  92. package/dist/atlas/oscillators/rejections.js +0 -7
  93. package/dist/atlas/oscillators/rejections.js.map +1 -1
  94. package/dist/atlas/physjs-entries.generated.d.ts +35 -25
  95. package/dist/atlas/physjs-entries.generated.d.ts.map +1 -1
  96. package/dist/atlas/physjs-entries.generated.js +37 -25
  97. package/dist/atlas/physjs-entries.generated.js.map +1 -1
  98. package/dist/atlas/physjs-ref.d.ts +34 -31
  99. package/dist/atlas/physjs-ref.d.ts.map +1 -1
  100. package/dist/atlas/physjs-ref.js +55 -53
  101. package/dist/atlas/physjs-ref.js.map +1 -1
  102. package/dist/atlas/physjs-reviewed.d.ts +1 -1
  103. package/dist/atlas/physjs-reviewed.js +15 -15
  104. package/dist/atlas/physjs-reviewed.js.map +1 -1
  105. package/dist/atlas/poster/statements.d.ts +0 -19
  106. package/dist/atlas/poster/statements.d.ts.map +1 -1
  107. package/dist/atlas/poster/statements.js +1 -1
  108. package/dist/atlas/poster/statements.js.map +1 -1
  109. package/dist/atlas/proof-target.d.ts +1 -1
  110. package/dist/atlas/proof-target.js +1 -1
  111. package/dist/atlas/proof-target.js.map +1 -1
  112. package/dist/atlas/regime.d.ts +1 -1
  113. package/dist/atlas/regime.d.ts.map +1 -1
  114. package/dist/atlas/regime.js +1 -1
  115. package/dist/atlas/regime.js.map +1 -1
  116. package/dist/atlas/text-overlap.d.ts +23 -0
  117. package/dist/atlas/text-overlap.d.ts.map +1 -0
  118. package/dist/atlas/text-overlap.js +41 -0
  119. package/dist/atlas/text-overlap.js.map +1 -0
  120. package/dist/atlas/waves/bridges-closure.d.ts.map +1 -1
  121. package/dist/atlas/waves/bridges-closure.js +2 -6
  122. package/dist/atlas/waves/bridges-closure.js.map +1 -1
  123. package/dist/atlas/waves/bridges.d.ts.map +1 -1
  124. package/dist/atlas/waves/bridges.js +32 -48
  125. package/dist/atlas/waves/bridges.js.map +1 -1
  126. package/dist/atlas/waves/models.d.ts +5 -6
  127. package/dist/atlas/waves/models.d.ts.map +1 -1
  128. package/dist/atlas/waves/models.js +7 -13
  129. package/dist/atlas/waves/models.js.map +1 -1
  130. package/dist/atlas/waves/numerics.d.ts.map +1 -1
  131. package/dist/atlas/waves/numerics.js +10 -3
  132. package/dist/atlas/waves/numerics.js.map +1 -1
  133. package/dist/atlas/witness-numeric.d.ts +30 -0
  134. package/dist/atlas/witness-numeric.d.ts.map +1 -1
  135. package/dist/atlas/witness-numeric.js +53 -0
  136. package/dist/atlas/witness-numeric.js.map +1 -1
  137. package/dist/atlas/witness-specs.d.ts.map +1 -1
  138. package/dist/atlas/witness-specs.js +19 -0
  139. package/dist/atlas/witness-specs.js.map +1 -1
  140. package/dist/atlas/witness-symbolic.d.ts +75 -3
  141. package/dist/atlas/witness-symbolic.d.ts.map +1 -1
  142. package/dist/atlas/witness-symbolic.js +116 -10
  143. package/dist/atlas/witness-symbolic.js.map +1 -1
  144. package/dist/bridges/catalog-load.d.ts.map +1 -1
  145. package/dist/bridges/catalog-load.js +13 -8
  146. package/dist/bridges/catalog-load.js.map +1 -1
  147. package/dist/bridges/catalog-types.d.ts +26 -2
  148. package/dist/bridges/catalog-types.d.ts.map +1 -1
  149. package/dist/bridges/catalog-types.js +11 -1
  150. package/dist/bridges/catalog-types.js.map +1 -1
  151. package/dist/bridges/evaluation-errors.d.ts +31 -1
  152. package/dist/bridges/evaluation-errors.d.ts.map +1 -1
  153. package/dist/bridges/evaluation-errors.js +20 -2
  154. package/dist/bridges/evaluation-errors.js.map +1 -1
  155. package/dist/bridges/evaluator-inputs.d.ts.map +1 -1
  156. package/dist/bridges/evaluator-inputs.js +7 -5
  157. package/dist/bridges/evaluator-inputs.js.map +1 -1
  158. package/dist/bridges/evaluators.d.ts.map +1 -1
  159. package/dist/bridges/evaluators.js +27 -12
  160. package/dist/bridges/evaluators.js.map +1 -1
  161. package/dist/bridges/expr-parse.d.ts +11 -0
  162. package/dist/bridges/expr-parse.d.ts.map +1 -1
  163. package/dist/bridges/expr-parse.js +14 -5
  164. package/dist/bridges/expr-parse.js.map +1 -1
  165. package/dist/bridges/holds.d.ts +35 -3
  166. package/dist/bridges/holds.d.ts.map +1 -1
  167. package/dist/bridges/holds.js +117 -23
  168. package/dist/bridges/holds.js.map +1 -1
  169. package/dist/bridges/notices.d.ts.map +1 -1
  170. package/dist/bridges/notices.js +5 -5
  171. package/dist/bridges/notices.js.map +1 -1
  172. package/dist/bridges/relation-eval.d.ts +4 -4
  173. package/dist/bridges/relation-eval.d.ts.map +1 -1
  174. package/dist/bridges/relation-eval.js +15 -16
  175. package/dist/bridges/relation-eval.js.map +1 -1
  176. package/dist/bridges/sensitivity.d.ts.map +1 -1
  177. package/dist/bridges/sensitivity.js +3 -3
  178. package/dist/bridges/sensitivity.js.map +1 -1
  179. package/dist/bridges/validity.d.ts +33 -0
  180. package/dist/bridges/validity.d.ts.map +1 -0
  181. package/dist/bridges/validity.js +67 -0
  182. package/dist/bridges/validity.js.map +1 -0
  183. package/dist/canonical/entries/atomic.js +1 -3
  184. package/dist/canonical/entries/atomic.js.map +1 -1
  185. package/dist/canonical/entries/condensed-matter.d.ts.map +1 -1
  186. package/dist/canonical/entries/condensed-matter.js +4 -5
  187. package/dist/canonical/entries/condensed-matter.js.map +1 -1
  188. package/dist/canonical/entries/dimensional-classics.d.ts.map +1 -1
  189. package/dist/canonical/entries/dimensional-classics.js +3 -4
  190. package/dist/canonical/entries/dimensional-classics.js.map +1 -1
  191. package/dist/canonical/entries/electromagnetism.d.ts.map +1 -1
  192. package/dist/canonical/entries/electromagnetism.js +4 -10
  193. package/dist/canonical/entries/electromagnetism.js.map +1 -1
  194. package/dist/canonical/entries/fluids-waves.d.ts.map +1 -1
  195. package/dist/canonical/entries/fluids-waves.js +3 -7
  196. package/dist/canonical/entries/fluids-waves.js.map +1 -1
  197. package/dist/canonical/entries/mechanics.d.ts.map +1 -1
  198. package/dist/canonical/entries/mechanics.js +4 -6
  199. package/dist/canonical/entries/mechanics.js.map +1 -1
  200. package/dist/canonical/entries/nonmonomial.d.ts.map +1 -1
  201. package/dist/canonical/entries/nonmonomial.js +9 -17
  202. package/dist/canonical/entries/nonmonomial.js.map +1 -1
  203. package/dist/canonical/entries/relativity.d.ts.map +1 -1
  204. package/dist/canonical/entries/relativity.js +6 -6
  205. package/dist/canonical/entries/relativity.js.map +1 -1
  206. package/dist/canonical/entries/thermo-nuclear-cosmo.d.ts.map +1 -1
  207. package/dist/canonical/entries/thermo-nuclear-cosmo.js +6 -10
  208. package/dist/canonical/entries/thermo-nuclear-cosmo.js.map +1 -1
  209. package/dist/canonical/fixed-points.d.ts +94 -0
  210. package/dist/canonical/fixed-points.d.ts.map +1 -0
  211. package/dist/canonical/fixed-points.js +81 -0
  212. package/dist/canonical/fixed-points.js.map +1 -0
  213. package/dist/canonical/linkage.d.ts.map +1 -1
  214. package/dist/canonical/linkage.js +25 -44
  215. package/dist/canonical/linkage.js.map +1 -1
  216. package/dist/canonical/normal-form.d.ts.map +1 -1
  217. package/dist/canonical/normal-form.js +5 -11
  218. package/dist/canonical/normal-form.js.map +1 -1
  219. package/dist/canonical/structural.d.ts +21 -21
  220. package/dist/canonical/structural.d.ts.map +1 -1
  221. package/dist/canonical/structural.js +40 -19
  222. package/dist/canonical/structural.js.map +1 -1
  223. package/dist/cases/catalog-checks.d.ts +10 -0
  224. package/dist/cases/catalog-checks.d.ts.map +1 -0
  225. package/dist/cases/catalog-checks.js +241 -0
  226. package/dist/cases/catalog-checks.js.map +1 -0
  227. package/dist/cases/catalog.d.ts +83 -0
  228. package/dist/cases/catalog.d.ts.map +1 -0
  229. package/dist/cases/catalog.js +118 -0
  230. package/dist/cases/catalog.js.map +1 -0
  231. package/dist/cases/engine.d.ts +13 -0
  232. package/dist/cases/engine.d.ts.map +1 -0
  233. package/dist/cases/engine.js +179 -0
  234. package/dist/cases/engine.js.map +1 -0
  235. package/dist/cases/index.d.ts.map +1 -1
  236. package/dist/cases/index.js +5 -7
  237. package/dist/cases/index.js.map +1 -1
  238. package/dist/cases/methods.d.ts +215 -0
  239. package/dist/cases/methods.d.ts.map +1 -0
  240. package/dist/cases/methods.js +743 -0
  241. package/dist/cases/methods.js.map +1 -0
  242. package/dist/cases/quadrature.d.ts +7 -9
  243. package/dist/cases/quadrature.d.ts.map +1 -1
  244. package/dist/cases/quadrature.js +28 -32
  245. package/dist/cases/quadrature.js.map +1 -1
  246. package/dist/cases/types.d.ts +12 -0
  247. package/dist/cases/types.d.ts.map +1 -1
  248. package/dist/cases/types.js.map +1 -1
  249. package/dist/cli/args.d.ts +25 -1
  250. package/dist/cli/args.d.ts.map +1 -1
  251. package/dist/cli/args.js +30 -8
  252. package/dist/cli/args.js.map +1 -1
  253. package/dist/cli/bindings.d.ts.map +1 -1
  254. package/dist/cli/bindings.js +5 -4
  255. package/dist/cli/bindings.js.map +1 -1
  256. package/dist/cli/command.d.ts +11 -1
  257. package/dist/cli/command.d.ts.map +1 -1
  258. package/dist/cli/command.js.map +1 -1
  259. package/dist/cli/commands/_atlas-map.d.ts +0 -9
  260. package/dist/cli/commands/_atlas-map.d.ts.map +1 -1
  261. package/dist/cli/commands/_atlas-map.js +8 -18
  262. package/dist/cli/commands/_atlas-map.js.map +1 -1
  263. package/dist/cli/commands/_atlas-route.d.ts.map +1 -1
  264. package/dist/cli/commands/_atlas-route.js +6 -2
  265. package/dist/cli/commands/_atlas-route.js.map +1 -1
  266. package/dist/cli/commands/_discovery-opts.d.ts +1 -0
  267. package/dist/cli/commands/_discovery-opts.d.ts.map +1 -1
  268. package/dist/cli/commands/_discovery-opts.js +9 -9
  269. package/dist/cli/commands/_discovery-opts.js.map +1 -1
  270. package/dist/cli/commands/atlas.d.ts.map +1 -1
  271. package/dist/cli/commands/atlas.js +8 -5
  272. package/dist/cli/commands/atlas.js.map +1 -1
  273. package/dist/cli/commands/audit.d.ts.map +1 -1
  274. package/dist/cli/commands/audit.js +8 -1
  275. package/dist/cli/commands/audit.js.map +1 -1
  276. package/dist/cli/commands/axes.d.ts.map +1 -1
  277. package/dist/cli/commands/axes.js +20 -1
  278. package/dist/cli/commands/axes.js.map +1 -1
  279. package/dist/cli/commands/confront.d.ts.map +1 -1
  280. package/dist/cli/commands/confront.js +8 -14
  281. package/dist/cli/commands/confront.js.map +1 -1
  282. package/dist/cli/commands/derive.d.ts.map +1 -1
  283. package/dist/cli/commands/derive.js +22 -22
  284. package/dist/cli/commands/derive.js.map +1 -1
  285. package/dist/cli/commands/discover.d.ts.map +1 -1
  286. package/dist/cli/commands/discover.js +122 -73
  287. package/dist/cli/commands/discover.js.map +1 -1
  288. package/dist/cli/commands/eval.d.ts.map +1 -1
  289. package/dist/cli/commands/eval.js +1 -0
  290. package/dist/cli/commands/eval.js.map +1 -1
  291. package/dist/cli/commands/evaluate.d.ts.map +1 -1
  292. package/dist/cli/commands/evaluate.js +67 -39
  293. package/dist/cli/commands/evaluate.js.map +1 -1
  294. package/dist/cli/commands/explain.d.ts.map +1 -1
  295. package/dist/cli/commands/explain.js +24 -3
  296. package/dist/cli/commands/explain.js.map +1 -1
  297. package/dist/cli/commands/ground.d.ts.map +1 -1
  298. package/dist/cli/commands/ground.js +7 -1
  299. package/dist/cli/commands/ground.js.map +1 -1
  300. package/dist/cli/commands/map.d.ts.map +1 -1
  301. package/dist/cli/commands/map.js +84 -11
  302. package/dist/cli/commands/map.js.map +1 -1
  303. package/dist/cli/commands/metric.d.ts.map +1 -1
  304. package/dist/cli/commands/metric.js +12 -9
  305. package/dist/cli/commands/metric.js.map +1 -1
  306. package/dist/cli/commands/path.d.ts +10 -0
  307. package/dist/cli/commands/path.d.ts.map +1 -1
  308. package/dist/cli/commands/path.js +25 -3
  309. package/dist/cli/commands/path.js.map +1 -1
  310. package/dist/cli/commands/probe.d.ts.map +1 -1
  311. package/dist/cli/commands/probe.js +59 -16
  312. package/dist/cli/commands/probe.js.map +1 -1
  313. package/dist/cli/commands/regime.d.ts.map +1 -1
  314. package/dist/cli/commands/regime.js +1 -0
  315. package/dist/cli/commands/regime.js.map +1 -1
  316. package/dist/cli/commands/retrieve.d.ts.map +1 -1
  317. package/dist/cli/commands/retrieve.js +1 -0
  318. package/dist/cli/commands/retrieve.js.map +1 -1
  319. package/dist/cli/commands/search.d.ts.map +1 -1
  320. package/dist/cli/commands/search.js +1 -0
  321. package/dist/cli/commands/search.js.map +1 -1
  322. package/dist/cli/commands/symbolic.d.ts.map +1 -1
  323. package/dist/cli/commands/symbolic.js +19 -28
  324. package/dist/cli/commands/symbolic.js.map +1 -1
  325. package/dist/cli/commands/testplan.d.ts.map +1 -1
  326. package/dist/cli/commands/testplan.js +4 -2
  327. package/dist/cli/commands/testplan.js.map +1 -1
  328. package/dist/cli/determination.d.ts +1 -0
  329. package/dist/cli/determination.d.ts.map +1 -1
  330. package/dist/cli/determination.js.map +1 -1
  331. package/dist/cli/expr-print.d.ts +0 -2
  332. package/dist/cli/expr-print.d.ts.map +1 -1
  333. package/dist/cli/expr-print.js +7 -31
  334. package/dist/cli/expr-print.js.map +1 -1
  335. package/dist/cli/flag-help.d.ts +1 -0
  336. package/dist/cli/flag-help.d.ts.map +1 -1
  337. package/dist/cli/flag-help.js +1 -0
  338. package/dist/cli/flag-help.js.map +1 -1
  339. package/dist/cli/graphs.d.ts +2 -0
  340. package/dist/cli/graphs.d.ts.map +1 -1
  341. package/dist/cli/graphs.js +1 -0
  342. package/dist/cli/graphs.js.map +1 -1
  343. package/dist/cli/main.d.ts +8 -0
  344. package/dist/cli/main.d.ts.map +1 -1
  345. package/dist/cli/main.js +19 -3
  346. package/dist/cli/main.js.map +1 -1
  347. package/dist/cli/numeric-flag.d.ts +12 -0
  348. package/dist/cli/numeric-flag.d.ts.map +1 -0
  349. package/dist/cli/numeric-flag.js +44 -0
  350. package/dist/cli/numeric-flag.js.map +1 -0
  351. package/dist/cli/output.d.ts +28 -0
  352. package/dist/cli/output.d.ts.map +1 -1
  353. package/dist/cli/output.js +23 -0
  354. package/dist/cli/output.js.map +1 -1
  355. package/dist/cli/record-reach.js +2 -2
  356. package/dist/cli/record-reach.js.map +1 -1
  357. package/dist/cli/record-tables.d.ts.map +1 -1
  358. package/dist/cli/record-tables.js +6 -5
  359. package/dist/cli/record-tables.js.map +1 -1
  360. package/dist/cli/record.d.ts +1 -5
  361. package/dist/cli/record.d.ts.map +1 -1
  362. package/dist/cli/record.js +9 -8
  363. package/dist/cli/record.js.map +1 -1
  364. package/dist/cli/search-index.d.ts.map +1 -1
  365. package/dist/cli/search-index.js +7 -6
  366. package/dist/cli/search-index.js.map +1 -1
  367. package/dist/cli/statuses.d.ts +0 -2
  368. package/dist/cli/statuses.d.ts.map +1 -1
  369. package/dist/cli/statuses.js +12 -9
  370. package/dist/cli/statuses.js.map +1 -1
  371. package/dist/cli/stored-results.d.ts +7 -0
  372. package/dist/cli/stored-results.d.ts.map +1 -0
  373. package/dist/cli/stored-results.js +23 -0
  374. package/dist/cli/stored-results.js.map +1 -0
  375. package/dist/cli/version.d.ts +1 -0
  376. package/dist/cli/version.d.ts.map +1 -1
  377. package/dist/cli/version.js +8 -5
  378. package/dist/cli/version.js.map +1 -1
  379. package/dist/cli-api.d.ts +36 -5
  380. package/dist/cli-api.d.ts.map +1 -1
  381. package/dist/cli-api.js +30 -4
  382. package/dist/cli-api.js.map +1 -1
  383. package/dist/composition/algebraic-equivalence.d.ts +43 -0
  384. package/dist/composition/algebraic-equivalence.d.ts.map +1 -0
  385. package/dist/composition/algebraic-equivalence.js +115 -0
  386. package/dist/composition/algebraic-equivalence.js.map +1 -0
  387. package/dist/composition/axes.d.ts +0 -6
  388. package/dist/composition/axes.d.ts.map +1 -1
  389. package/dist/composition/axes.js +6 -6
  390. package/dist/composition/axes.js.map +1 -1
  391. package/dist/composition/axis-audit.d.ts +47 -20
  392. package/dist/composition/axis-audit.d.ts.map +1 -1
  393. package/dist/composition/axis-audit.js +82 -9
  394. package/dist/composition/axis-audit.js.map +1 -1
  395. package/dist/composition/bridge-analysis.d.ts +17 -0
  396. package/dist/composition/bridge-analysis.d.ts.map +1 -1
  397. package/dist/composition/bridge-analysis.js +102 -55
  398. package/dist/composition/bridge-analysis.js.map +1 -1
  399. package/dist/composition/canonical-compare.d.ts +40 -0
  400. package/dist/composition/canonical-compare.d.ts.map +1 -1
  401. package/dist/composition/canonical-compare.js +122 -24
  402. package/dist/composition/canonical-compare.js.map +1 -1
  403. package/dist/composition/canonical-graph.d.ts +3 -3
  404. package/dist/composition/canonical-graph.d.ts.map +1 -1
  405. package/dist/composition/canonical-graph.js +11 -38
  406. package/dist/composition/canonical-graph.js.map +1 -1
  407. package/dist/composition/canonical-json.js +2 -2
  408. package/dist/composition/canonical-json.js.map +1 -1
  409. package/dist/composition/catalog-graph.d.ts.map +1 -1
  410. package/dist/composition/catalog-graph.js +2 -5
  411. package/dist/composition/catalog-graph.js.map +1 -1
  412. package/dist/composition/chain-candidate.d.ts +8 -0
  413. package/dist/composition/chain-candidate.d.ts.map +1 -1
  414. package/dist/composition/chain-candidate.js +9 -2
  415. package/dist/composition/chain-candidate.js.map +1 -1
  416. package/dist/composition/chain-match.d.ts +6 -3
  417. package/dist/composition/chain-match.d.ts.map +1 -1
  418. package/dist/composition/chain-match.js +4 -1
  419. package/dist/composition/chain-match.js.map +1 -1
  420. package/dist/composition/chain-result.d.ts.map +1 -1
  421. package/dist/composition/chain-result.js +2 -14
  422. package/dist/composition/chain-result.js.map +1 -1
  423. package/dist/composition/compose-symbolic.d.ts.map +1 -1
  424. package/dist/composition/compose-symbolic.js +3 -2
  425. package/dist/composition/compose-symbolic.js.map +1 -1
  426. package/dist/composition/compose.d.ts.map +1 -1
  427. package/dist/composition/compose.js +13 -5
  428. package/dist/composition/compose.js.map +1 -1
  429. package/dist/composition/composition-recovery.d.ts.map +1 -1
  430. package/dist/composition/composition-recovery.js +4 -7
  431. package/dist/composition/composition-recovery.js.map +1 -1
  432. package/dist/composition/consequence.d.ts +15 -5
  433. package/dist/composition/consequence.d.ts.map +1 -1
  434. package/dist/composition/consequence.js +6 -4
  435. package/dist/composition/consequence.js.map +1 -1
  436. package/dist/composition/discovery.d.ts +129 -9
  437. package/dist/composition/discovery.d.ts.map +1 -1
  438. package/dist/composition/discovery.js +171 -67
  439. package/dist/composition/discovery.js.map +1 -1
  440. package/dist/composition/edge.d.ts +21 -2
  441. package/dist/composition/edge.d.ts.map +1 -1
  442. package/dist/composition/edge.js +23 -1
  443. package/dist/composition/edge.js.map +1 -1
  444. package/dist/composition/enumerate.d.ts.map +1 -1
  445. package/dist/composition/enumerate.js +18 -3
  446. package/dist/composition/enumerate.js.map +1 -1
  447. package/dist/composition/evaluate-relation.d.ts +35 -11
  448. package/dist/composition/evaluate-relation.d.ts.map +1 -1
  449. package/dist/composition/evaluate-relation.js +60 -39
  450. package/dist/composition/evaluate-relation.js.map +1 -1
  451. package/dist/composition/explain.d.ts +3 -12
  452. package/dist/composition/explain.d.ts.map +1 -1
  453. package/dist/composition/explain.js +7 -20
  454. package/dist/composition/explain.js.map +1 -1
  455. package/dist/composition/expr-eval.d.ts +1 -1
  456. package/dist/composition/expr-eval.d.ts.map +1 -1
  457. package/dist/composition/expr-eval.js +6 -15
  458. package/dist/composition/expr-eval.js.map +1 -1
  459. package/dist/composition/expr-simplify.d.ts +26 -14
  460. package/dist/composition/expr-simplify.d.ts.map +1 -1
  461. package/dist/composition/expr-simplify.js +64 -72
  462. package/dist/composition/expr-simplify.js.map +1 -1
  463. package/dist/composition/formula-shape.d.ts +23 -4
  464. package/dist/composition/formula-shape.d.ts.map +1 -1
  465. package/dist/composition/formula-shape.js +57 -17
  466. package/dist/composition/formula-shape.js.map +1 -1
  467. package/dist/composition/graph-structure.d.ts +98 -0
  468. package/dist/composition/graph-structure.d.ts.map +1 -0
  469. package/dist/composition/graph-structure.js +167 -0
  470. package/dist/composition/graph-structure.js.map +1 -0
  471. package/dist/composition/graph-viz-svg.d.ts.map +1 -1
  472. package/dist/composition/graph-viz-svg.js +1 -1
  473. package/dist/composition/graph-viz-svg.js.map +1 -1
  474. package/dist/composition/graph-viz.d.ts.map +1 -1
  475. package/dist/composition/graph-viz.js +8 -37
  476. package/dist/composition/graph-viz.js.map +1 -1
  477. package/dist/composition/grounding.d.ts.map +1 -1
  478. package/dist/composition/grounding.js +19 -7
  479. package/dist/composition/grounding.js.map +1 -1
  480. package/dist/composition/identifiability.d.ts +91 -4
  481. package/dist/composition/identifiability.d.ts.map +1 -1
  482. package/dist/composition/identifiability.js +363 -6
  483. package/dist/composition/identifiability.js.map +1 -1
  484. package/dist/composition/index.d.ts +8 -4
  485. package/dist/composition/index.d.ts.map +1 -1
  486. package/dist/composition/index.js +3 -2
  487. package/dist/composition/index.js.map +1 -1
  488. package/dist/composition/mathts-quiet.d.ts +7 -8
  489. package/dist/composition/mathts-quiet.d.ts.map +1 -1
  490. package/dist/composition/mathts-quiet.js +7 -16
  491. package/dist/composition/mathts-quiet.js.map +1 -1
  492. package/dist/composition/mathts-scalar-symbols.d.ts.map +1 -1
  493. package/dist/composition/mathts-scalar-symbols.js +2 -1
  494. package/dist/composition/mathts-scalar-symbols.js.map +1 -1
  495. package/dist/composition/own-equation-magnitude.d.ts +95 -0
  496. package/dist/composition/own-equation-magnitude.d.ts.map +1 -0
  497. package/dist/composition/own-equation-magnitude.js +270 -0
  498. package/dist/composition/own-equation-magnitude.js.map +1 -0
  499. package/dist/composition/probe/backend-protocol.d.ts +3 -0
  500. package/dist/composition/probe/backend-protocol.d.ts.map +1 -1
  501. package/dist/composition/probe/backend-protocol.js.map +1 -1
  502. package/dist/composition/probe/candidate-store.d.ts +1 -0
  503. package/dist/composition/probe/candidate-store.d.ts.map +1 -1
  504. package/dist/composition/probe/candidate-store.js +1 -0
  505. package/dist/composition/probe/candidate-store.js.map +1 -1
  506. package/dist/composition/probe/corpus.d.ts +8 -4
  507. package/dist/composition/probe/corpus.d.ts.map +1 -1
  508. package/dist/composition/probe/corpus.js +23 -12
  509. package/dist/composition/probe/corpus.js.map +1 -1
  510. package/dist/composition/probe/dataset.d.ts +18 -0
  511. package/dist/composition/probe/dataset.d.ts.map +1 -1
  512. package/dist/composition/probe/dataset.js +95 -50
  513. package/dist/composition/probe/dataset.js.map +1 -1
  514. package/dist/composition/probe/experiment-design.d.ts +7 -1
  515. package/dist/composition/probe/experiment-design.d.ts.map +1 -1
  516. package/dist/composition/probe/experiment-design.js +44 -24
  517. package/dist/composition/probe/experiment-design.js.map +1 -1
  518. package/dist/composition/probe/falsify.d.ts +2 -0
  519. package/dist/composition/probe/falsify.d.ts.map +1 -1
  520. package/dist/composition/probe/falsify.js +2 -0
  521. package/dist/composition/probe/falsify.js.map +1 -1
  522. package/dist/composition/probe/fit.d.ts +7 -0
  523. package/dist/composition/probe/fit.d.ts.map +1 -1
  524. package/dist/composition/probe/fit.js +46 -22
  525. package/dist/composition/probe/fit.js.map +1 -1
  526. package/dist/composition/probe/frontier.d.ts.map +1 -1
  527. package/dist/composition/probe/frontier.js +33 -15
  528. package/dist/composition/probe/frontier.js.map +1 -1
  529. package/dist/composition/probe/generator.d.ts +30 -1
  530. package/dist/composition/probe/generator.d.ts.map +1 -1
  531. package/dist/composition/probe/generator.js +58 -36
  532. package/dist/composition/probe/generator.js.map +1 -1
  533. package/dist/composition/probe/index.d.ts +14 -0
  534. package/dist/composition/probe/index.d.ts.map +1 -1
  535. package/dist/composition/probe/index.js +6 -0
  536. package/dist/composition/probe/index.js.map +1 -1
  537. package/dist/composition/probe/limits.d.ts +25 -1
  538. package/dist/composition/probe/limits.d.ts.map +1 -1
  539. package/dist/composition/probe/limits.js +53 -11
  540. package/dist/composition/probe/limits.js.map +1 -1
  541. package/dist/composition/probe/pipeline.d.ts +5 -0
  542. package/dist/composition/probe/pipeline.d.ts.map +1 -1
  543. package/dist/composition/probe/pipeline.js +73 -24
  544. package/dist/composition/probe/pipeline.js.map +1 -1
  545. package/dist/composition/probe/power-law.d.ts +121 -0
  546. package/dist/composition/probe/power-law.d.ts.map +1 -0
  547. package/dist/composition/probe/power-law.js +251 -0
  548. package/dist/composition/probe/power-law.js.map +1 -0
  549. package/dist/composition/probe/problem.d.ts +8 -4
  550. package/dist/composition/probe/problem.d.ts.map +1 -1
  551. package/dist/composition/probe/problem.js +177 -49
  552. package/dist/composition/probe/problem.js.map +1 -1
  553. package/dist/composition/probe/report.js +1 -1
  554. package/dist/composition/probe/report.js.map +1 -1
  555. package/dist/composition/probe/residual.d.ts +7 -1
  556. package/dist/composition/probe/residual.d.ts.map +1 -1
  557. package/dist/composition/probe/residual.js +10 -7
  558. package/dist/composition/probe/residual.js.map +1 -1
  559. package/dist/composition/probe/run-manifest.d.ts +1 -0
  560. package/dist/composition/probe/run-manifest.d.ts.map +1 -1
  561. package/dist/composition/probe/run-manifest.js.map +1 -1
  562. package/dist/composition/probe/scalar-search.d.ts +50 -0
  563. package/dist/composition/probe/scalar-search.d.ts.map +1 -0
  564. package/dist/composition/probe/scalar-search.js +169 -0
  565. package/dist/composition/probe/scalar-search.js.map +1 -0
  566. package/dist/composition/probe/scoring.d.ts +1 -0
  567. package/dist/composition/probe/scoring.d.ts.map +1 -1
  568. package/dist/composition/probe/scoring.js.map +1 -1
  569. package/dist/composition/probe/structure.d.ts +82 -17
  570. package/dist/composition/probe/structure.d.ts.map +1 -1
  571. package/dist/composition/probe/structure.js +129 -55
  572. package/dist/composition/probe/structure.js.map +1 -1
  573. package/dist/composition/probe/study.d.ts +31 -9
  574. package/dist/composition/probe/study.d.ts.map +1 -1
  575. package/dist/composition/probe/study.js +235 -184
  576. package/dist/composition/probe/study.js.map +1 -1
  577. package/dist/composition/probe/t-tail.d.ts +16 -0
  578. package/dist/composition/probe/t-tail.d.ts.map +1 -0
  579. package/dist/composition/probe/t-tail.js +29 -0
  580. package/dist/composition/probe/t-tail.js.map +1 -0
  581. package/dist/composition/probe/types.d.ts +3 -0
  582. package/dist/composition/probe/types.d.ts.map +1 -1
  583. package/dist/composition/probe/types.js.map +1 -1
  584. package/dist/composition/proposed-bridges.d.ts +52 -12
  585. package/dist/composition/proposed-bridges.d.ts.map +1 -1
  586. package/dist/composition/proposed-bridges.js +107 -60
  587. package/dist/composition/proposed-bridges.js.map +1 -1
  588. package/dist/composition/quantity-clusters.d.ts +48 -0
  589. package/dist/composition/quantity-clusters.d.ts.map +1 -0
  590. package/dist/composition/quantity-clusters.js +98 -0
  591. package/dist/composition/quantity-clusters.js.map +1 -0
  592. package/dist/composition/rational-exponent.d.ts +40 -0
  593. package/dist/composition/rational-exponent.d.ts.map +1 -0
  594. package/dist/composition/rational-exponent.js +65 -0
  595. package/dist/composition/rational-exponent.js.map +1 -0
  596. package/dist/composition/representative-values.d.ts +22 -0
  597. package/dist/composition/representative-values.d.ts.map +1 -1
  598. package/dist/composition/representative-values.js +29 -0
  599. package/dist/composition/representative-values.js.map +1 -1
  600. package/dist/composition/retrodiction.d.ts +15 -0
  601. package/dist/composition/retrodiction.d.ts.map +1 -1
  602. package/dist/composition/retrodiction.js +12 -4
  603. package/dist/composition/retrodiction.js.map +1 -1
  604. package/dist/composition/user-equation.d.ts +1 -0
  605. package/dist/composition/user-equation.d.ts.map +1 -1
  606. package/dist/composition/user-equation.js +3 -2
  607. package/dist/composition/user-equation.js.map +1 -1
  608. package/dist/core/assignment.d.ts +19 -0
  609. package/dist/core/assignment.d.ts.map +1 -0
  610. package/dist/core/assignment.js +19 -0
  611. package/dist/core/assignment.js.map +1 -0
  612. package/dist/core/compare.d.ts +32 -0
  613. package/dist/core/compare.d.ts.map +1 -0
  614. package/dist/core/compare.js +46 -0
  615. package/dist/core/compare.js.map +1 -0
  616. package/dist/core/constants.d.ts +42 -41
  617. package/dist/core/constants.d.ts.map +1 -1
  618. package/dist/core/constants.js +71 -51
  619. package/dist/core/constants.js.map +1 -1
  620. package/dist/core/data-file.d.ts +7 -0
  621. package/dist/core/data-file.d.ts.map +1 -1
  622. package/dist/core/data-file.js +17 -0
  623. package/dist/core/data-file.js.map +1 -1
  624. package/dist/core/format.d.ts +36 -0
  625. package/dist/core/format.d.ts.map +1 -0
  626. package/dist/core/format.js +39 -0
  627. package/dist/core/format.js.map +1 -0
  628. package/dist/core/hash.d.ts +14 -0
  629. package/dist/core/hash.d.ts.map +1 -0
  630. package/dist/core/hash.js +17 -0
  631. package/dist/core/hash.js.map +1 -0
  632. package/dist/core/json-schema.d.ts +2 -0
  633. package/dist/core/json-schema.d.ts.map +1 -1
  634. package/dist/core/json-schema.js +14 -13
  635. package/dist/core/json-schema.js.map +1 -1
  636. package/dist/core/labeled-tensor.d.ts.map +1 -1
  637. package/dist/core/labeled-tensor.js +0 -8
  638. package/dist/core/labeled-tensor.js.map +1 -1
  639. package/dist/core/mathts-read.d.ts +25 -0
  640. package/dist/core/mathts-read.d.ts.map +1 -0
  641. package/dist/core/mathts-read.js +51 -0
  642. package/dist/core/mathts-read.js.map +1 -0
  643. package/dist/core/tensor.d.ts.map +1 -1
  644. package/dist/core/tensor.js +24 -0
  645. package/dist/core/tensor.js.map +1 -1
  646. package/dist/core/types.d.ts +5 -5
  647. package/dist/diff/bridge-ast-gradient.d.ts +27 -23
  648. package/dist/diff/bridge-ast-gradient.d.ts.map +1 -1
  649. package/dist/diff/bridge-ast-gradient.js +75 -173
  650. package/dist/diff/bridge-ast-gradient.js.map +1 -1
  651. package/dist/diff/bridge-gradient.d.ts +19 -6
  652. package/dist/diff/bridge-gradient.d.ts.map +1 -1
  653. package/dist/diff/bridge-gradient.js +19 -11
  654. package/dist/diff/bridge-gradient.js.map +1 -1
  655. package/dist/diff/bridge-specs.d.ts.map +1 -1
  656. package/dist/diff/bridge-specs.js +3 -0
  657. package/dist/diff/bridge-specs.js.map +1 -1
  658. package/dist/dimensional/algebra.d.ts +18 -0
  659. package/dist/dimensional/algebra.d.ts.map +1 -1
  660. package/dist/dimensional/algebra.js +41 -1
  661. package/dist/dimensional/algebra.js.map +1 -1
  662. package/dist/dimensional/ast-builders.d.ts +7 -0
  663. package/dist/dimensional/ast-builders.d.ts.map +1 -1
  664. package/dist/dimensional/ast-builders.js +11 -0
  665. package/dist/dimensional/ast-builders.js.map +1 -1
  666. package/dist/dimensional/ast-leaves.d.ts +81 -0
  667. package/dist/dimensional/ast-leaves.d.ts.map +1 -0
  668. package/dist/dimensional/ast-leaves.js +146 -0
  669. package/dist/dimensional/ast-leaves.js.map +1 -0
  670. package/dist/dimensional/ast-types.d.ts +15 -0
  671. package/dist/dimensional/ast-types.d.ts.map +1 -1
  672. package/dist/dimensional/ast-types.js.map +1 -1
  673. package/dist/dimensional/buckingham.d.ts.map +1 -1
  674. package/dist/dimensional/buckingham.js +15 -27
  675. package/dist/dimensional/buckingham.js.map +1 -1
  676. package/dist/dimensional/constant-rows.js +9 -9
  677. package/dist/dimensional/constant-rows.js.map +1 -1
  678. package/dist/dimensional/curvature-composite.d.ts +1 -1
  679. package/dist/dimensional/curvature-composite.js.map +1 -1
  680. package/dist/dimensional/dimension-inference.d.ts.map +1 -1
  681. package/dist/dimensional/dimension-inference.js +1 -2
  682. package/dist/dimensional/dimension-inference.js.map +1 -1
  683. package/dist/dimensional/errors.d.ts +1 -1
  684. package/dist/dimensional/errors.d.ts.map +1 -1
  685. package/dist/dimensional/errors.js +1 -15
  686. package/dist/dimensional/errors.js.map +1 -1
  687. package/dist/dimensional/exact-scale.d.ts +24 -11
  688. package/dist/dimensional/exact-scale.d.ts.map +1 -1
  689. package/dist/dimensional/exact-scale.js +122 -130
  690. package/dist/dimensional/exact-scale.js.map +1 -1
  691. package/dist/dimensional/gauge-field.d.ts.map +1 -1
  692. package/dist/dimensional/gauge-field.js +2 -2
  693. package/dist/dimensional/gauge-field.js.map +1 -1
  694. package/dist/dimensional/hyphen-names.d.ts +12 -2
  695. package/dist/dimensional/hyphen-names.d.ts.map +1 -1
  696. package/dist/dimensional/hyphen-names.js +44 -19
  697. package/dist/dimensional/hyphen-names.js.map +1 -1
  698. package/dist/dimensional/mathts-unit-delegation.d.ts +29 -0
  699. package/dist/dimensional/mathts-unit-delegation.d.ts.map +1 -0
  700. package/dist/dimensional/mathts-unit-delegation.js +187 -0
  701. package/dist/dimensional/mathts-unit-delegation.js.map +1 -0
  702. package/dist/dimensional/mathts-unit-wrapper.d.ts +33 -0
  703. package/dist/dimensional/mathts-unit-wrapper.d.ts.map +1 -0
  704. package/dist/dimensional/mathts-unit-wrapper.js +190 -0
  705. package/dist/dimensional/mathts-unit-wrapper.js.map +1 -0
  706. package/dist/dimensional/metric.d.ts.map +1 -1
  707. package/dist/dimensional/metric.js +0 -1
  708. package/dist/dimensional/metric.js.map +1 -1
  709. package/dist/dimensional/scalar-lowering.d.ts +21 -0
  710. package/dist/dimensional/scalar-lowering.d.ts.map +1 -0
  711. package/dist/dimensional/scalar-lowering.js +45 -0
  712. package/dist/dimensional/scalar-lowering.js.map +1 -0
  713. package/dist/dimensional/symbolic-constants.d.ts +9 -0
  714. package/dist/dimensional/symbolic-constants.d.ts.map +1 -1
  715. package/dist/dimensional/symbolic-constants.js +13 -1
  716. package/dist/dimensional/symbolic-constants.js.map +1 -1
  717. package/dist/dimensional/types.d.ts +36 -0
  718. package/dist/dimensional/types.d.ts.map +1 -1
  719. package/dist/dimensional/types.js +45 -7
  720. package/dist/dimensional/types.js.map +1 -1
  721. package/dist/dimensional/unit-data.d.ts +5 -1
  722. package/dist/dimensional/unit-data.d.ts.map +1 -1
  723. package/dist/dimensional/unit-data.js +30 -6
  724. package/dist/dimensional/unit-data.js.map +1 -1
  725. package/dist/dimensional/units.d.ts +2 -0
  726. package/dist/dimensional/units.d.ts.map +1 -1
  727. package/dist/dimensional/units.js +59 -3
  728. package/dist/dimensional/units.js.map +1 -1
  729. package/dist/dimensional/validator.d.ts +2 -0
  730. package/dist/dimensional/validator.d.ts.map +1 -1
  731. package/dist/dimensional/validator.js.map +1 -1
  732. package/dist/index.d.ts +9 -3
  733. package/dist/index.d.ts.map +1 -1
  734. package/dist/index.js +10 -4
  735. package/dist/index.js.map +1 -1
  736. package/dist/numerical/christoffel-flat.d.ts.map +1 -1
  737. package/dist/numerical/christoffel-flat.js +3 -2
  738. package/dist/numerical/christoffel-flat.js.map +1 -1
  739. package/dist/numerical/connection-lowering-helpers.d.ts +3 -1
  740. package/dist/numerical/connection-lowering-helpers.d.ts.map +1 -1
  741. package/dist/numerical/connection-lowering-helpers.js +11 -15
  742. package/dist/numerical/connection-lowering-helpers.js.map +1 -1
  743. package/dist/numerical/covariant-eikonal.d.ts.map +1 -1
  744. package/dist/numerical/covariant-eikonal.js +34 -11
  745. package/dist/numerical/covariant-eikonal.js.map +1 -1
  746. package/dist/numerical/curvature-lowering-helpers.js +3 -2
  747. package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
  748. package/dist/numerical/errors.d.ts.map +1 -1
  749. package/dist/numerical/errors.js +0 -3
  750. package/dist/numerical/errors.js.map +1 -1
  751. package/dist/numerical/finite-difference.d.ts +22 -0
  752. package/dist/numerical/finite-difference.d.ts.map +1 -0
  753. package/dist/numerical/finite-difference.js +27 -0
  754. package/dist/numerical/finite-difference.js.map +1 -0
  755. package/dist/numerical/geodesic-integrator.d.ts.map +1 -1
  756. package/dist/numerical/geodesic-integrator.js +22 -14
  757. package/dist/numerical/geodesic-integrator.js.map +1 -1
  758. package/dist/numerical/geometrized.d.ts.map +1 -1
  759. package/dist/numerical/geometrized.js +0 -1
  760. package/dist/numerical/geometrized.js.map +1 -1
  761. package/dist/numerical/mathts-engine.d.ts.map +1 -1
  762. package/dist/numerical/mathts-engine.js +10 -24
  763. package/dist/numerical/mathts-engine.js.map +1 -1
  764. package/dist/numerical/metric-inverse.d.ts.map +1 -1
  765. package/dist/numerical/metric-inverse.js +83 -46
  766. package/dist/numerical/metric-inverse.js.map +1 -1
  767. package/dist/numerical/null-ray-integrator.d.ts +2 -1
  768. package/dist/numerical/null-ray-integrator.d.ts.map +1 -1
  769. package/dist/numerical/null-ray-integrator.js +12 -12
  770. package/dist/numerical/null-ray-integrator.js.map +1 -1
  771. package/dist/numerical/painleve-gullstrand-metric.js +2 -2
  772. package/dist/numerical/painleve-gullstrand-metric.js.map +1 -1
  773. package/dist/numerical/pderiv.d.ts.map +1 -1
  774. package/dist/numerical/pderiv.js +2 -6
  775. package/dist/numerical/pderiv.js.map +1 -1
  776. package/dist/numerical/perihelion-finder.d.ts +0 -36
  777. package/dist/numerical/perihelion-finder.d.ts.map +1 -1
  778. package/dist/numerical/perihelion-finder.js +41 -87
  779. package/dist/numerical/perihelion-finder.js.map +1 -1
  780. package/dist/numerical/quadrature.d.ts.map +1 -1
  781. package/dist/numerical/quadrature.js +11 -13
  782. package/dist/numerical/quadrature.js.map +1 -1
  783. package/dist/numerical/rk4-trajectory.d.ts +10 -0
  784. package/dist/numerical/rk4-trajectory.d.ts.map +1 -0
  785. package/dist/numerical/rk4-trajectory.js +37 -0
  786. package/dist/numerical/rk4-trajectory.js.map +1 -0
  787. package/dist/numerical/schwarzschild.d.ts +14 -0
  788. package/dist/numerical/schwarzschild.d.ts.map +1 -0
  789. package/dist/numerical/schwarzschild.js +17 -0
  790. package/dist/numerical/schwarzschild.js.map +1 -0
  791. package/dist/numerical/spacetime-metrics.d.ts +12 -0
  792. package/dist/numerical/spacetime-metrics.d.ts.map +1 -1
  793. package/dist/numerical/spacetime-metrics.js +72 -56
  794. package/dist/numerical/spacetime-metrics.js.map +1 -1
  795. package/dist/numerical/statistics.d.ts +24 -0
  796. package/dist/numerical/statistics.d.ts.map +1 -0
  797. package/dist/numerical/statistics.js +52 -0
  798. package/dist/numerical/statistics.js.map +1 -0
  799. package/dist/numerical/strides.d.ts +3 -2
  800. package/dist/numerical/strides.d.ts.map +1 -1
  801. package/dist/numerical/strides.js +3 -10
  802. package/dist/numerical/strides.js.map +1 -1
  803. package/dist/numerical/tensor-engine.d.ts +21 -0
  804. package/dist/numerical/tensor-engine.d.ts.map +1 -1
  805. package/dist/numerical/tensor-engine.js +12 -0
  806. package/dist/numerical/tensor-engine.js.map +1 -1
  807. package/dist/relations/regime.d.ts +10 -0
  808. package/dist/relations/regime.d.ts.map +1 -1
  809. package/dist/relations/regime.js +18 -1
  810. package/dist/relations/regime.js.map +1 -1
  811. package/package.json +9 -12
  812. package/dist/cases/brownian-sphere.d.ts +0 -68
  813. package/dist/cases/brownian-sphere.d.ts.map +0 -1
  814. package/dist/cases/brownian-sphere.js +0 -354
  815. package/dist/cases/brownian-sphere.js.map +0 -1
  816. package/dist/cases/damped-resonator.d.ts +0 -23
  817. package/dist/cases/damped-resonator.d.ts.map +0 -1
  818. package/dist/cases/damped-resonator.js +0 -224
  819. package/dist/cases/damped-resonator.js.map +0 -1
  820. package/dist/cases/kepler-rv.d.ts +0 -13
  821. package/dist/cases/kepler-rv.d.ts.map +0 -1
  822. package/dist/cases/kepler-rv.js +0 -172
  823. package/dist/cases/kepler-rv.js.map +0 -1
  824. package/dist/cases/lumped-cooling.d.ts +0 -46
  825. package/dist/cases/lumped-cooling.d.ts.map +0 -1
  826. package/dist/cases/lumped-cooling.js +0 -261
  827. package/dist/cases/lumped-cooling.js.map +0 -1
  828. package/dist/cases/resistor-noise.d.ts +0 -14
  829. package/dist/cases/resistor-noise.d.ts.map +0 -1
  830. package/dist/cases/resistor-noise.js +0 -215
  831. package/dist/cases/resistor-noise.js.map +0 -1
  832. package/dist/cases/skin-depth.d.ts +0 -21
  833. package/dist/cases/skin-depth.d.ts.map +0 -1
  834. package/dist/cases/skin-depth.js +0 -174
  835. package/dist/cases/skin-depth.js.map +0 -1
@@ -13,8 +13,10 @@
13
13
  * @module atlas/benchmark/stats
14
14
  * @internal
15
15
  */
16
- /** The two-sided 95% normal quantile. @internal */
17
- export const Z95 = 1.959963984540054;
16
+ import { binomialTest, normalQuantile } from '@danielsimonjr/mathts-functions';
17
+ import { numberFrom } from '../../core/mathts-read.js';
18
+ /** The two-sided 95% normal quantile, MathTS `normalQuantile(0.975)` (1.959963984540054). @internal */
19
+ export const Z95 = normalQuantile(0.975);
18
20
  /**
19
21
  * Wilson score interval for a binomial proportion.
20
22
  *
@@ -39,13 +41,6 @@ export function wilsonInterval(successes, n, z = Z95) {
39
41
  upper: successes === n ? 1 : Math.min(1, centre + half),
40
42
  };
41
43
  }
42
- /** `ln C(n, k)`, summed; exact enough for the n here. */
43
- function logChoose(n, k) {
44
- let s = 0;
45
- for (let i = 1; i <= k; i++)
46
- s += Math.log(n - k + i) - Math.log(i);
47
- return s;
48
- }
49
44
  /**
50
45
  * McNemar's paired test. The EXACT binomial p-value is the one to report at
51
46
  * these sample sizes; the χ² is given because readers expect it.
@@ -54,14 +49,13 @@ function logChoose(n, k) {
54
49
  */
55
50
  export function mcnemar(table) {
56
51
  const n = table.b + table.c;
57
- if (n === 0)
52
+ // No discordant pair, or an equal split: every outcome is at most as likely as the observed one, so p = 1 exactly.
53
+ if (table.b === table.c)
58
54
  return { chiSquared: 0, exactP: 1 };
59
55
  const chiSquared = Math.max(0, Math.abs(table.b - table.c) - 1) ** 2 / n;
60
- const k = Math.min(table.b, table.c);
61
- let tail = 0;
62
- for (let i = 0; i <= k; i++)
63
- tail += Math.exp(logChoose(n, i) - n * Math.LN2);
64
- return { chiSquared, exactP: Math.min(1, 2 * tail) };
56
+ // MathTS `binomialTest` sums every outcome no more likely than the observed one; at p = ½ that is twice the smaller tail.
57
+ const exactP = numberFrom('binomialTest', binomialTest(Math.min(table.b, table.c), n).pValue);
58
+ return { chiSquared, exactP };
65
59
  }
66
60
  /**
67
61
  * Newcombe's method 10: a 95% interval for the PAIRED difference in proportions
@@ -1 +1 @@
1
- {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/atlas/benchmark/stats.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Atlas Phase 5, S5.4 — the benchmark's statistics and power report.\n *\n * Design note: `docs/planning/Atlas-Phase-5-Design.md` §8.\n *\n * Every function here is tested against a value computed independently, not\n * against its own output: the Wilson intervals against the plan's textbook\n * values, McNemar against a hand-computed 2×2 table, and κ against a hand-computed\n * confusion matrix. The paired-difference interval (Newcombe's method 10) has no\n * textbook value in the repository; it is tested by properties that pin it to\n * Wilson and to the unpaired square-and-add interval where those must agree.\n *\n * @module atlas/benchmark/stats\n * @internal\n */\n\n/** The two-sided 95% normal quantile. @internal */\nexport const Z95 = 1.959963984540054;\n\n/** A closed interval. @internal */\nexport interface Interval {\n readonly lower: number;\n readonly upper: number;\n}\n\n/**\n * Wilson score interval for a binomial proportion.\n *\n * @throws Error when `n` is not a positive integer or `successes` is outside `[0, n]`.\n * @internal\n */\nexport function wilsonInterval(successes: number, n: number, z = Z95): Interval {\n if (!Number.isInteger(n) || n <= 0) throw new Error(`wilsonInterval: n must be a positive integer, got ${n}`);\n if (!Number.isInteger(successes) || successes < 0 || successes > n) {\n throw new Error(`wilsonInterval: successes must be an integer in [0, n], got ${successes}`);\n }\n const p = successes / n;\n const z2 = z * z;\n const denom = 1 + z2 / n;\n const centre = (p + z2 / (2 * n)) / denom;\n const half = (z / denom) * Math.sqrt((p * (1 - p)) / n + z2 / (4 * n * n));\n // At x = 0 the lower bound, and at x = n the upper bound, are EXACTLY 0 and 1\n // analytically; the formula reaches them only to within float rounding.\n return {\n lower: successes === 0 ? 0 : Math.max(0, centre - half),\n upper: successes === n ? 1 : Math.min(1, centre + half),\n };\n}\n\n/** A paired 2×2 table: a = both right, b = only A right, c = only B right, d = both wrong. @internal */\nexport interface PairedTable {\n readonly a: number;\n readonly b: number;\n readonly c: number;\n readonly d: number;\n}\n\n/** McNemar's test on the discordant cells. @internal */\nexport interface McNemarResult {\n /** Continuity-corrected χ² = max(0, |b − c| − 1)² / (b + c); 0 when b + c = 0. The correction never goes negative (Edwards 1948). */\n readonly chiSquared: number;\n /** Exact two-sided p-value from Binomial(b + c, ½); 1 when b + c = 0. */\n readonly exactP: number;\n}\n\n/** `ln C(n, k)`, summed; exact enough for the n here. */\nfunction logChoose(n: number, k: number): number {\n let s = 0;\n for (let i = 1; i <= k; i++) s += Math.log(n - k + i) - Math.log(i);\n return s;\n}\n\n/**\n * McNemar's paired test. The EXACT binomial p-value is the one to report at\n * these sample sizes; the χ² is given because readers expect it.\n *\n * @internal\n */\nexport function mcnemar(table: PairedTable): McNemarResult {\n const n = table.b + table.c;\n if (n === 0) return { chiSquared: 0, exactP: 1 };\n const chiSquared = Math.max(0, Math.abs(table.b - table.c) - 1) ** 2 / n;\n const k = Math.min(table.b, table.c);\n let tail = 0;\n for (let i = 0; i <= k; i++) tail += Math.exp(logChoose(n, i) - n * Math.LN2);\n return { chiSquared, exactP: Math.min(1, 2 * tail) };\n}\n\n/**\n * Newcombe's method 10: a 95% interval for the PAIRED difference in proportions\n * p_A − p_B = (b − c)/n, built from the two marginal Wilson intervals and a\n * correlation correction φ. Pre-registered criterion: the interval for the\n * atlas-minus-baseline difference must exclude zero.\n *\n * Newcombe, Statistics in Medicine 17 (1998) 2635.\n *\n * @internal\n */\nexport function pairedDifferenceInterval(table: PairedTable, z = Z95): Interval & { readonly diff: number } {\n const { a, b, c, d } = table;\n const n = a + b + c + d;\n if (n === 0) throw new Error('pairedDifferenceInterval: empty table');\n const p1 = (a + b) / n;\n const p2 = (a + c) / n;\n const w1 = wilsonInterval(a + b, n, z);\n const w2 = wilsonInterval(a + c, n, z);\n const denom = Math.sqrt((a + b) * (c + d) * (a + c) * (b + d));\n let phi = 0;\n if (denom > 0) {\n const cross = a * d - b * c;\n // Newcombe's continuity adjustment of φ, applied only when ad > bc.\n phi = (cross > 0 ? Math.max(cross - n / 2, 0) : cross) / denom;\n }\n const diff = p1 - p2;\n const dl1 = p1 - w1.lower;\n const du1 = w1.upper - p1;\n const dl2 = p2 - w2.lower;\n const du2 = w2.upper - p2;\n const lower = diff - Math.sqrt(Math.max(0, dl1 * dl1 - 2 * phi * dl1 * du2 + du2 * du2));\n const upper = diff + Math.sqrt(Math.max(0, du1 * du1 - 2 * phi * du1 * dl2 + dl2 * dl2));\n return { diff, lower: Math.max(-1, lower), upper: Math.min(1, upper) };\n}\n\n/**\n * Cohen's κ for two raters over the same items, from a square confusion matrix\n * (`matrix[i][j]` = items rater 1 put in category i and rater 2 in category j).\n *\n * @returns NaN when chance agreement is 1 (κ is undefined there), never 1.\n * @internal\n */\nexport function cohensKappa(matrix: readonly (readonly number[])[]): number {\n const k = matrix.length;\n if (k === 0 || matrix.some((row) => row.length !== k)) throw new Error('cohensKappa: matrix must be square and non-empty');\n let n = 0;\n let agree = 0;\n const rows = new Array<number>(k).fill(0);\n const cols = new Array<number>(k).fill(0);\n for (let i = 0; i < k; i++) {\n for (let j = 0; j < k; j++) {\n const v = matrix[i]![j]!;\n n += v;\n rows[i]! += v;\n cols[j]! += v;\n if (i === j) agree += v;\n }\n }\n if (n === 0) throw new Error('cohensKappa: no ratings');\n const po = agree / n;\n let pe = 0;\n for (let i = 0; i < k; i++) pe += (rows[i]! / n) * (cols[i]! / n);\n if (pe === 1) return Number.NaN;\n return (po - pe) / (1 - pe);\n}\n\n/** What a frozen set of a given size can and cannot resolve. @internal */\nexport interface PowerReport {\n readonly nPerClass: number;\n /** The assumed per-class accuracy the interval is computed at. */\n readonly assumedAccuracy: number;\n readonly interval: Interval;\n /** Half the interval width: differences smaller than about twice this are not resolvable. */\n readonly halfWidth: number;\n readonly statement: string;\n}\n\n/**\n * The interval a frozen set of `nPerClass` items per class can afford at an\n * assumed accuracy. This is the \"report the interval it can afford rather than\n * the claim it cannot\" line of ROADMAP Phase 5.\n *\n * @internal\n */\nexport function powerReport(nPerClass: number, assumedAccuracy = 0.8): PowerReport {\n const successes = Math.round(assumedAccuracy * nPerClass);\n const interval = wilsonInterval(successes, nPerClass);\n const halfWidth = (interval.upper - interval.lower) / 2;\n const pct = (x: number): string => `${(100 * x).toFixed(1)}%`;\n return {\n nPerClass,\n assumedAccuracy,\n interval,\n halfWidth,\n statement:\n `With ${nPerClass} items per class at ${pct(assumedAccuracy)} accuracy, the 95% Wilson interval ` +\n `is [${pct(interval.lower)}, ${pct(interval.upper)}] (±${pct(halfWidth)}). Two methods whose ` +\n `accuracies differ by less than about ${pct(2 * halfWidth)} cannot be separated on this set ` +\n 'by unpaired intervals; the paired McNemar design is what narrows it.',\n };\n}\n"]}
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/atlas/benchmark/stats.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Atlas Phase 5, S5.4 — the benchmark's statistics and power report.\n *\n * Design note: `docs/planning/Atlas-Phase-5-Design.md` §8.\n *\n * Every function here is tested against a value computed independently, not\n * against its own output: the Wilson intervals against the plan's textbook\n * values, McNemar against a hand-computed 2×2 table, and κ against a hand-computed\n * confusion matrix. The paired-difference interval (Newcombe's method 10) has no\n * textbook value in the repository; it is tested by properties that pin it to\n * Wilson and to the unpaired square-and-add interval where those must agree.\n *\n * @module atlas/benchmark/stats\n * @internal\n */\n\nimport { binomialTest, normalQuantile } from '@danielsimonjr/mathts-functions';\nimport { numberFrom } from '../../core/mathts-read.js';\n\n/** The two-sided 95% normal quantile, MathTS `normalQuantile(0.975)` (1.959963984540054). @internal */\nexport const Z95: number = normalQuantile(0.975);\n\n/** A closed interval. @internal */\nexport interface Interval {\n readonly lower: number;\n readonly upper: number;\n}\n\n/**\n * Wilson score interval for a binomial proportion.\n *\n * @throws Error when `n` is not a positive integer or `successes` is outside `[0, n]`.\n * @internal\n */\nexport function wilsonInterval(successes: number, n: number, z = Z95): Interval {\n if (!Number.isInteger(n) || n <= 0) throw new Error(`wilsonInterval: n must be a positive integer, got ${n}`);\n if (!Number.isInteger(successes) || successes < 0 || successes > n) {\n throw new Error(`wilsonInterval: successes must be an integer in [0, n], got ${successes}`);\n }\n const p = successes / n;\n const z2 = z * z;\n const denom = 1 + z2 / n;\n const centre = (p + z2 / (2 * n)) / denom;\n const half = (z / denom) * Math.sqrt((p * (1 - p)) / n + z2 / (4 * n * n));\n // At x = 0 the lower bound, and at x = n the upper bound, are EXACTLY 0 and 1\n // analytically; the formula reaches them only to within float rounding.\n return {\n lower: successes === 0 ? 0 : Math.max(0, centre - half),\n upper: successes === n ? 1 : Math.min(1, centre + half),\n };\n}\n\n/** A paired 2×2 table: a = both right, b = only A right, c = only B right, d = both wrong. @internal */\nexport interface PairedTable {\n readonly a: number;\n readonly b: number;\n readonly c: number;\n readonly d: number;\n}\n\n/** McNemar's test on the discordant cells. @internal */\nexport interface McNemarResult {\n /** Continuity-corrected χ² = max(0, |b − c| − 1)² / (b + c); 0 when b + c = 0. The correction never goes negative (Edwards 1948). */\n readonly chiSquared: number;\n /** Exact two-sided p-value from Binomial(b + c, ½); 1 when b + c = 0. */\n readonly exactP: number;\n}\n\n/**\n * McNemar's paired test. The EXACT binomial p-value is the one to report at\n * these sample sizes; the χ² is given because readers expect it.\n *\n * @internal\n */\nexport function mcnemar(table: PairedTable): McNemarResult {\n const n = table.b + table.c;\n // No discordant pair, or an equal split: every outcome is at most as likely as the observed one, so p = 1 exactly.\n if (table.b === table.c) return { chiSquared: 0, exactP: 1 };\n const chiSquared = Math.max(0, Math.abs(table.b - table.c) - 1) ** 2 / n;\n // MathTS `binomialTest` sums every outcome no more likely than the observed one; at p = ½ that is twice the smaller tail.\n const exactP = numberFrom('binomialTest', binomialTest(Math.min(table.b, table.c), n).pValue);\n return { chiSquared, exactP };\n}\n\n/**\n * Newcombe's method 10: a 95% interval for the PAIRED difference in proportions\n * p_A − p_B = (b − c)/n, built from the two marginal Wilson intervals and a\n * correlation correction φ. Pre-registered criterion: the interval for the\n * atlas-minus-baseline difference must exclude zero.\n *\n * Newcombe, Statistics in Medicine 17 (1998) 2635.\n *\n * @internal\n */\nexport function pairedDifferenceInterval(table: PairedTable, z = Z95): Interval & { readonly diff: number } {\n const { a, b, c, d } = table;\n const n = a + b + c + d;\n if (n === 0) throw new Error('pairedDifferenceInterval: empty table');\n const p1 = (a + b) / n;\n const p2 = (a + c) / n;\n const w1 = wilsonInterval(a + b, n, z);\n const w2 = wilsonInterval(a + c, n, z);\n const denom = Math.sqrt((a + b) * (c + d) * (a + c) * (b + d));\n let phi = 0;\n if (denom > 0) {\n const cross = a * d - b * c;\n // Newcombe's continuity adjustment of φ, applied only when ad > bc.\n phi = (cross > 0 ? Math.max(cross - n / 2, 0) : cross) / denom;\n }\n const diff = p1 - p2;\n const dl1 = p1 - w1.lower;\n const du1 = w1.upper - p1;\n const dl2 = p2 - w2.lower;\n const du2 = w2.upper - p2;\n const lower = diff - Math.sqrt(Math.max(0, dl1 * dl1 - 2 * phi * dl1 * du2 + du2 * du2));\n const upper = diff + Math.sqrt(Math.max(0, du1 * du1 - 2 * phi * du1 * dl2 + dl2 * dl2));\n return { diff, lower: Math.max(-1, lower), upper: Math.min(1, upper) };\n}\n\n/**\n * Cohen's κ for two raters over the same items, from a square confusion matrix\n * (`matrix[i][j]` = items rater 1 put in category i and rater 2 in category j).\n *\n * @returns NaN when chance agreement is 1 (κ is undefined there), never 1.\n * @internal\n */\nexport function cohensKappa(matrix: readonly (readonly number[])[]): number {\n const k = matrix.length;\n if (k === 0 || matrix.some((row) => row.length !== k)) throw new Error('cohensKappa: matrix must be square and non-empty');\n let n = 0;\n let agree = 0;\n const rows = new Array<number>(k).fill(0);\n const cols = new Array<number>(k).fill(0);\n for (let i = 0; i < k; i++) {\n for (let j = 0; j < k; j++) {\n const v = matrix[i]![j]!;\n n += v;\n rows[i]! += v;\n cols[j]! += v;\n if (i === j) agree += v;\n }\n }\n if (n === 0) throw new Error('cohensKappa: no ratings');\n const po = agree / n;\n let pe = 0;\n for (let i = 0; i < k; i++) pe += (rows[i]! / n) * (cols[i]! / n);\n if (pe === 1) return Number.NaN;\n return (po - pe) / (1 - pe);\n}\n\n/** What a frozen set of a given size can and cannot resolve. @internal */\nexport interface PowerReport {\n readonly nPerClass: number;\n /** The assumed per-class accuracy the interval is computed at. */\n readonly assumedAccuracy: number;\n readonly interval: Interval;\n /** Half the interval width: differences smaller than about twice this are not resolvable. */\n readonly halfWidth: number;\n readonly statement: string;\n}\n\n/**\n * The interval a frozen set of `nPerClass` items per class can afford at an\n * assumed accuracy. This is the \"report the interval it can afford rather than\n * the claim it cannot\" line of ROADMAP Phase 5.\n *\n * @internal\n */\nexport function powerReport(nPerClass: number, assumedAccuracy = 0.8): PowerReport {\n const successes = Math.round(assumedAccuracy * nPerClass);\n const interval = wilsonInterval(successes, nPerClass);\n const halfWidth = (interval.upper - interval.lower) / 2;\n const pct = (x: number): string => `${(100 * x).toFixed(1)}%`;\n return {\n nPerClass,\n assumedAccuracy,\n interval,\n halfWidth,\n statement:\n `With ${nPerClass} items per class at ${pct(assumedAccuracy)} accuracy, the 95% Wilson interval ` +\n `is [${pct(interval.lower)}, ${pct(interval.upper)}] (±${pct(halfWidth)}). Two methods whose ` +\n `accuracies differ by less than about ${pct(2 * halfWidth)} cannot be separated on this set ` +\n 'by unpaired intervals; the paired McNemar design is what narrows it.',\n };\n}\n"]}
@@ -1,13 +1,17 @@
1
1
  /**
2
2
  * Catalog formal references.
3
3
  *
4
- * The catalog row stores the manifest key. This module asks PhysJS for that
5
- * key. It does not parse an id out of text, and it does not store an evidence
6
- * tag.
4
+ * The catalog row stores the manifest key, and beside it two projections of
5
+ * the manifest: the theorem that key names and the record's proof status.
6
+ * This module builds the reference from the key, derives the status from
7
+ * that reference, and reports a row whose stored projections disagree with
8
+ * the derivation. It does not parse an id out of text, and it does not store
9
+ * an evidence tag.
7
10
  *
8
11
  * @module atlas/catalog-formal-ref
9
12
  */
10
13
  import type { FormalRef } from '../relations/types.js';
14
+ import type { CatalogEntry, ProofStatus } from '../bridges/catalog-types.js';
11
15
  /**
12
16
  * The reviewed PhysJS reference for a catalog id, or `undefined` when the
13
17
  * row records no manifest key.
@@ -15,4 +19,23 @@ import type { FormalRef } from '../relations/types.js';
15
19
  * @internal
16
20
  */
17
21
  export declare function catalogFormalRef(id: number): FormalRef | undefined;
22
+ /**
23
+ * The proof status a record earns, derived from its reference: `pending` with
24
+ * no formalKey, `full` for a reviewed kind-`bridge` reference, `weak` for any
25
+ * other reference. `reference` is the record's {@link catalogFormalRef}.
26
+ *
27
+ * @internal
28
+ */
29
+ export declare function deriveProofStatus(reference: FormalRef | undefined): ProofStatus;
30
+ /**
31
+ * Records whose stored `theorem` or `proofStatus` disagree with the manifest:
32
+ * a theorem that is not the one the manifest entry of `formalKey` names, a
33
+ * theorem on a record with no `formalKey` (or none on a record with one), and
34
+ * a status other than {@link deriveProofStatus}. Empty means every record's
35
+ * projections are the manifest's. `referenceOf` defaults to the manifest's
36
+ * reference for the key; a test passes a changed one.
37
+ *
38
+ * @internal
39
+ */
40
+ export declare function catalogProofProblems(entries?: readonly CatalogEntry[], referenceOf?: (key: string) => FormalRef): string[];
18
41
  //# sourceMappingURL=catalog-formal-ref.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"catalog-formal-ref.d.ts","sourceRoot":"","sources":["../../src/atlas/catalog-formal-ref.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAOvD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAMlE"}
1
+ {"version":3,"file":"catalog-formal-ref.d.ts","sourceRoot":"","sources":["../../src/atlas/catalog-formal-ref.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAO7E;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAUlE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAG/E;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,SAAS,YAAY,EAAqB,EACnD,WAAW,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAA2B,GACxD,MAAM,EAAE,CAeV"}
@@ -1,13 +1,16 @@
1
1
  /**
2
2
  * Catalog formal references.
3
3
  *
4
- * The catalog row stores the manifest key. This module asks PhysJS for that
5
- * key. It does not parse an id out of text, and it does not store an evidence
6
- * tag.
4
+ * The catalog row stores the manifest key, and beside it two projections of
5
+ * the manifest: the theorem that key names and the record's proof status.
6
+ * This module builds the reference from the key, derives the status from
7
+ * that reference, and reports a row whose stored projections disagree with
8
+ * the derivation. It does not parse an id out of text, and it does not store
9
+ * an evidence tag.
7
10
  *
8
11
  * @module atlas/catalog-formal-ref
9
12
  */
10
- import { catalogEntry } from '../bridges/catalog-load.js';
13
+ import { catalogEntries, catalogEntry } from '../bridges/catalog-load.js';
11
14
  import { physjsFormalRef } from './physjs-ref.js';
12
15
  /** Memo of the PhysJS reference already built for a catalog id. */
13
16
  const byId = new Map();
@@ -20,9 +23,53 @@ const byId = new Map();
20
23
  export function catalogFormalRef(id) {
21
24
  if (byId.has(id))
22
25
  return byId.get(id);
23
- const key = catalogEntry(id)?.formalKey;
26
+ const entry = catalogEntry(id);
27
+ const key = entry?.formalKey;
24
28
  const ref = key === undefined ? undefined : physjsFormalRef(key);
29
+ if (ref !== undefined && entry?.theorem !== ref.statement) {
30
+ throw new Error(`catalog id ${id} names theorem '${entry?.theorem}', the manifest entry '${key}' names '${ref.statement}'`);
31
+ }
25
32
  byId.set(id, ref);
26
33
  return ref;
27
34
  }
35
+ /**
36
+ * The proof status a record earns, derived from its reference: `pending` with
37
+ * no formalKey, `full` for a reviewed kind-`bridge` reference, `weak` for any
38
+ * other reference. `reference` is the record's {@link catalogFormalRef}.
39
+ *
40
+ * @internal
41
+ */
42
+ export function deriveProofStatus(reference) {
43
+ if (reference === undefined)
44
+ return 'pending';
45
+ return reference.kind === 'bridge' && reference.fidelity !== 'unreviewed' ? 'full' : 'weak';
46
+ }
47
+ /**
48
+ * Records whose stored `theorem` or `proofStatus` disagree with the manifest:
49
+ * a theorem that is not the one the manifest entry of `formalKey` names, a
50
+ * theorem on a record with no `formalKey` (or none on a record with one), and
51
+ * a status other than {@link deriveProofStatus}. Empty means every record's
52
+ * projections are the manifest's. `referenceOf` defaults to the manifest's
53
+ * reference for the key; a test passes a changed one.
54
+ *
55
+ * @internal
56
+ */
57
+ export function catalogProofProblems(entries = catalogEntries(), referenceOf = physjsFormalRef) {
58
+ const problems = [];
59
+ for (const entry of entries) {
60
+ const reference = entry.formalKey === undefined ? undefined : referenceOf(entry.formalKey);
61
+ if (reference === undefined) {
62
+ if (entry.theorem !== undefined)
63
+ problems.push(`catalog id ${entry.id} names theorem '${entry.theorem}' and has no formalKey`);
64
+ }
65
+ else if (entry.theorem !== reference.statement) {
66
+ problems.push(`catalog id ${entry.id} theorem is '${entry.theorem ?? '(none)'}', the manifest entry '${entry.formalKey}' names '${reference.statement}'`);
67
+ }
68
+ const derived = deriveProofStatus(reference);
69
+ if (entry.proofStatus !== derived) {
70
+ problems.push(`catalog id ${entry.id} proofStatus is '${entry.proofStatus}', derived '${derived}'`);
71
+ }
72
+ }
73
+ return problems;
74
+ }
28
75
  //# sourceMappingURL=catalog-formal-ref.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"catalog-formal-ref.js","sourceRoot":"","sources":["../../src/atlas/catalog-formal-ref.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,mEAAmE;AACnE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAiC,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAU;IACzC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;IACxC,MAAM,GAAG,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IACjE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAClB,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["/**\n * Catalog formal references.\n *\n * The catalog row stores the manifest key. This module asks PhysJS for that\n * key. It does not parse an id out of text, and it does not store an evidence\n * tag.\n *\n * @module atlas/catalog-formal-ref\n */\n\nimport type { FormalRef } from '../relations/types.js';\nimport { catalogEntry } from '../bridges/catalog-load.js';\nimport { physjsFormalRef } from './physjs-ref.js';\n\n/** Memo of the PhysJS reference already built for a catalog id. */\nconst byId = new Map<number, FormalRef | undefined>();\n\n/**\n * The reviewed PhysJS reference for a catalog id, or `undefined` when the\n * row records no manifest key.\n *\n * @internal\n */\nexport function catalogFormalRef(id: number): FormalRef | undefined {\n if (byId.has(id)) return byId.get(id);\n const key = catalogEntry(id)?.formalKey;\n const ref = key === undefined ? undefined : physjsFormalRef(key);\n byId.set(id, ref);\n return ref;\n}\n"]}
1
+ {"version":3,"file":"catalog-formal-ref.js","sourceRoot":"","sources":["../../src/atlas/catalog-formal-ref.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,mEAAmE;AACnE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAiC,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAU;IACzC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,KAAK,EAAE,SAAS,CAAC;IAC7B,MAAM,GAAG,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IACjE,IAAI,GAAG,KAAK,SAAS,IAAI,KAAK,EAAE,OAAO,KAAK,GAAG,CAAC,SAAS,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,cAAc,EAAE,mBAAmB,KAAK,EAAE,OAAO,0BAA0B,GAAG,YAAY,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC;IAC9H,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAClB,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAgC;IAChE,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC9C,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;AAC9F,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAO,GAA4B,cAAc,EAAE,EACnD,WAAW,GAA+B,eAAe;IAEzD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC3F,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;gBAAE,QAAQ,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,EAAE,mBAAmB,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;QACjI,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,SAAS,EAAE,CAAC;YACjD,QAAQ,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,EAAE,gBAAgB,KAAK,CAAC,OAAO,IAAI,QAAQ,0BAA0B,KAAK,CAAC,SAAS,YAAY,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC;QAC5J,CAAC;QACD,MAAM,OAAO,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YAClC,QAAQ,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,EAAE,oBAAoB,KAAK,CAAC,WAAW,eAAe,OAAO,GAAG,CAAC,CAAC;QACtG,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["/**\n * Catalog formal references.\n *\n * The catalog row stores the manifest key, and beside it two projections of\n * the manifest: the theorem that key names and the record's proof status.\n * This module builds the reference from the key, derives the status from\n * that reference, and reports a row whose stored projections disagree with\n * the derivation. It does not parse an id out of text, and it does not store\n * an evidence tag.\n *\n * @module atlas/catalog-formal-ref\n */\n\nimport type { FormalRef } from '../relations/types.js';\nimport type { CatalogEntry, ProofStatus } from '../bridges/catalog-types.js';\nimport { catalogEntries, catalogEntry } from '../bridges/catalog-load.js';\nimport { physjsFormalRef } from './physjs-ref.js';\n\n/** Memo of the PhysJS reference already built for a catalog id. */\nconst byId = new Map<number, FormalRef | undefined>();\n\n/**\n * The reviewed PhysJS reference for a catalog id, or `undefined` when the\n * row records no manifest key.\n *\n * @internal\n */\nexport function catalogFormalRef(id: number): FormalRef | undefined {\n if (byId.has(id)) return byId.get(id);\n const entry = catalogEntry(id);\n const key = entry?.formalKey;\n const ref = key === undefined ? undefined : physjsFormalRef(key);\n if (ref !== undefined && entry?.theorem !== ref.statement) {\n throw new Error(`catalog id ${id} names theorem '${entry?.theorem}', the manifest entry '${key}' names '${ref.statement}'`);\n }\n byId.set(id, ref);\n return ref;\n}\n\n/**\n * The proof status a record earns, derived from its reference: `pending` with\n * no formalKey, `full` for a reviewed kind-`bridge` reference, `weak` for any\n * other reference. `reference` is the record's {@link catalogFormalRef}.\n *\n * @internal\n */\nexport function deriveProofStatus(reference: FormalRef | undefined): ProofStatus {\n if (reference === undefined) return 'pending';\n return reference.kind === 'bridge' && reference.fidelity !== 'unreviewed' ? 'full' : 'weak';\n}\n\n/**\n * Records whose stored `theorem` or `proofStatus` disagree with the manifest:\n * a theorem that is not the one the manifest entry of `formalKey` names, a\n * theorem on a record with no `formalKey` (or none on a record with one), and\n * a status other than {@link deriveProofStatus}. Empty means every record's\n * projections are the manifest's. `referenceOf` defaults to the manifest's\n * reference for the key; a test passes a changed one.\n *\n * @internal\n */\nexport function catalogProofProblems(\n entries: readonly CatalogEntry[] = catalogEntries(),\n referenceOf: (key: string) => FormalRef = physjsFormalRef,\n): string[] {\n const problems: string[] = [];\n for (const entry of entries) {\n const reference = entry.formalKey === undefined ? undefined : referenceOf(entry.formalKey);\n if (reference === undefined) {\n if (entry.theorem !== undefined) problems.push(`catalog id ${entry.id} names theorem '${entry.theorem}' and has no formalKey`);\n } else if (entry.theorem !== reference.statement) {\n problems.push(`catalog id ${entry.id} theorem is '${entry.theorem ?? '(none)'}', the manifest entry '${entry.formalKey}' names '${reference.statement}'`);\n }\n const derived = deriveProofStatus(reference);\n if (entry.proofStatus !== derived) {\n problems.push(`catalog id ${entry.id} proofStatus is '${entry.proofStatus}', derived '${derived}'`);\n }\n }\n return problems;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"chain-pipeline.d.ts","sourceRoot":"","sources":["../../src/atlas/chain-pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAIzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAKzD,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAsB,KAAK,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAK9F,2FAA2F;AAC3F,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,6FAA6F;AAC7F,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,mEAAmE;AACnE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,6BAA6B,CAAC;IAC7C,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,0FAA0F;AAC1F,MAAM,MAAM,mBAAmB,GAC3B,uBAAuB,GACvB,sBAAsB,GACtB,eAAe,GACf,mBAAmB,GACnB,uBAAuB,CAAC;AAY5B;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,SAAS,CAAA;CAAE,EAAE,CASlG;AAyCD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,YAAY,GAAE,SAAS,MAAM,EAAO,GACnC,mBAAmB,CAyBrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,SAAS,mBAAmB,EAAE,CAqD7F"}
1
+ {"version":3,"file":"chain-pipeline.d.ts","sourceRoot":"","sources":["../../src/atlas/chain-pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAKzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAKzD,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAsB,KAAK,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAK9F,2FAA2F;AAC3F,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,6FAA6F;AAC7F,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,mEAAmE;AACnE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,6BAA6B,CAAC;IAC7C,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,0FAA0F;AAC1F,MAAM,MAAM,mBAAmB,GAC3B,uBAAuB,GACvB,sBAAsB,GACtB,eAAe,GACf,mBAAmB,GACnB,uBAAuB,CAAC;AAQ5B;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,SAAS,CAAA;CAAE,EAAE,CASlG;AAyCD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,YAAY,GAAE,SAAS,MAAM,EAAO,GACnC,mBAAmB,CAyBrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,SAAS,mBAAmB,EAAE,CAqD7F"}
@@ -13,9 +13,11 @@
13
13
  *
14
14
  * @module atlas/chain-pipeline
15
15
  */
16
+ import { byKey } from '../core/compare.js';
16
17
  import { DIMENSIONLESS } from '../dimensional/types.js';
17
18
  import { equals } from '../dimensional/algebra.js';
18
- import { CONSTANTS } from '../dimensional/symbolic-constants.js';
19
+ import { CONSTANTS, isRegisteredConstant } from '../dimensional/symbolic-constants.js';
20
+ import { isDecimalLiteral } from '../dimensional/ast-leaves.js';
19
21
  import { enumerateCompositionsWithRefusals } from '../composition/enumerate.js';
20
22
  import { buckinghamFilter } from '../composition/buckingham-filter.js';
21
23
  import { matchChain } from '../composition/chain-match.js';
@@ -25,14 +27,11 @@ import { joinRegimeMismatch } from '../composition/chain-regime.js';
25
27
  import { bridgeSeedKeys, physjsTheorem } from './physjs-ref.js';
26
28
  import { emitProofTarget } from './proof-target.js';
27
29
  import { scalarSymbolsFromMathTs } from '../composition/mathts-scalar-symbols.js';
28
- function isNumericName(name) {
29
- return /^\d+(\.\d+)?$/.test(name);
30
- }
30
+ /** A registered constant whose dimension is none, or a `pi` multiple (`2pi`). Own keys only. */
31
31
  function isDimensionlessConstant(name) {
32
32
  if (/^\d*pi$/.test(name))
33
33
  return true;
34
- const registered = CONSTANTS[name];
35
- return registered !== undefined && equals(registered.dim, DIMENSIONLESS);
34
+ return isRegisteredConstant(name) && equals(CONSTANTS[name].dim, DIMENSIONLESS);
36
35
  }
37
36
  /**
38
37
  * Dimensioned leaves of the composed formula, excluding the target name.
@@ -47,11 +46,11 @@ export function governingOf(expr, targetName) {
47
46
  for (const leaf of scalarSymbolsFromMathTs(expr)) {
48
47
  if (leaf.name === targetName)
49
48
  continue;
50
- if (isNumericName(leaf.name) || isDimensionlessConstant(leaf.name))
49
+ if (isDecimalLiteral(leaf.name) || isDimensionlessConstant(leaf.name))
51
50
  continue;
52
51
  vars.push(leaf);
53
52
  }
54
- vars.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
53
+ vars.sort(byKey((v) => v.name));
55
54
  return vars;
56
55
  }
57
56
  function theoremsFor(edgeIds) {
@@ -1 +1 @@
1
- {"version":3,"file":"chain-pipeline.js","sourceRoot":"","sources":["../../src/atlas/chain-pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAEjE,OAAO,EAAE,iCAAiC,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAuB,MAAM,mCAAmC,CAAC;AAC7F,OAAO,EACL,aAAa,EACb,iBAAiB,GAElB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAA4B,MAAM,gCAAgC,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AA+ClF,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAY;IAC3C,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,UAAU,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;AAC3E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,IAAc,EAAE,UAAkB;IAC5D,MAAM,IAAI,GAAuC,EAAE,CAAC;IACpD,KAAK,MAAM,IAAI,IAAI,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;YAAE,SAAS;QACvC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7E,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,OAA0B;IAC7C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,0DAA0D,EAAE,GAAG,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,MAAmB;IACzC,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC;IAC5C,MAAM,OAAO,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;IACzD,IAAI,MAAM,CAAC,cAAc,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAClD,OAAO;YACL,IAAI;YACJ,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,SAAS;YAC1C,GAAG,OAAO;SACX,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,cAAc,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACjD,OAAO;YACL,IAAI;YACJ,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,WAAW,EAAE,MAAM,CAAC,cAAc,CAAC,WAAW;YAC9C,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,cAAc;YACpD,GAAG,OAAO;SACX,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI;QACJ,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,EAAE,EAAE,MAAM,CAAC,cAAc,CAAC,EAAE;QAC5B,GAAG,OAAO;KACX,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAmB,EACnB,YAAY,GAAsB,EAAE;IAEpC,IAAI,MAAM,CAAC,cAAc,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAClD,OAAO;YACL,IAAI,EAAE,cAAc;YACpB,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,SAAS;YAC1C,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,cAAc,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACjD,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,MAAM,CAAC,cAAc,CAAC,WAAW;YAC9C,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,cAAc;YACpD,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC;IAC1D,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,IAAI,SAAS,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAC/D,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,EAAE;QACF,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,eAAe,CAAC,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,EAAE,YAAY,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAA4B;IAC3D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,iCAAiC,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,UAAU,GAAkB,EAAE,CAAC;IACrC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,gBAAgB,CAC/B,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAClE,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CACpD,CAAC;QACF,IAAI,QAAQ,KAAK,SAAS;YAAE,SAAS;QACrC,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACpF,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpD,MAAM,MAAM,GAAgB;YAC1B,OAAO;YACP,cAAc;YACd,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,QAAQ,EAAE,SAAS;YACnB,uEAAuE;YACvE,uEAAuE;YACvE,sEAAsE;YACtE,8DAA8D;YAC9D,mBAAmB,EAAE,SAAS;SAC/B,CAAC;QACF,IAAI,cAAc,CAAC,IAAI,KAAK,cAAc,IAAI,cAAc,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACpF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACjE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YACzC,SAAS;QACX,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IACD,MAAM,iBAAiB,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACtD,mBAAmB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAC1C,CAAC;IACF,MAAM,aAAa,GAA8B,KAAK,CAAC,gBAAgB;SACpE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACb,IAAI,EAAE,6BAAsC;QAC5C,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAqB;QAC1D,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7D,OAAO;QACL,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAC3C,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CACvD;QACD,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC/D,GAAG,aAAa;KACjB,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Internal bridge-discovery pipeline.\n *\n * Seeds, then seed-filtered symbolic enumeration, the Buckingham filter,\n * the structural classifier, the regime join gate, the chain order,\n * and the proof-target stub.\n * A confirmation reports the catalog id. A restatement reports the\n * pre-declared canonical equation. A regime mismatch is recorded and\n * is not a stub. Any other survivor is a statement skeleton. Nothing\n * is written into the catalog.\n *\n * No command calls this. `discovery.ts` and the probe are not inputs.\n *\n * @module atlas/chain-pipeline\n */\n\nimport type { ExprNode } from '../dimensional/validator.js';\nimport type { Dimension } from '../dimensional/types.js';\nimport { DIMENSIONLESS } from '../dimensional/types.js';\nimport { equals } from '../dimensional/algebra.js';\nimport { CONSTANTS } from '../dimensional/symbolic-constants.js';\nimport type { BridgeEdge } from '../composition/edge.js';\nimport { enumerateCompositionsWithRefusals } from '../composition/enumerate.js';\nimport { buckinghamFilter } from '../composition/buckingham-filter.js';\nimport { matchChain } from '../composition/chain-match.js';\nimport { compareChainEdgeIds, type ChainCandidate } from '../composition/chain-candidate.js';\nimport {\n chainOrderKey,\n orderChainRecords,\n type ChainRecord,\n} from '../composition/chain-result.js';\nimport { joinRegimeMismatch, type ChainRegimeMismatch } from '../composition/chain-regime.js';\nimport { bridgeSeedKeys, physjsTheorem } from './physjs-ref.js';\nimport { emitProofTarget } from './proof-target.js';\nimport { scalarSymbolsFromMathTs } from '../composition/mathts-scalar-symbols.js';\n\n/** A chain whose normal form matches a catalog equation. Nothing was written. @internal */\nexport interface ChainConfirmationRecord {\n readonly kind: 'confirmation';\n readonly catalogId: number;\n readonly edgeIds: readonly string[];\n}\n\n/** A chain the registry pre-declared with `restatesBridge`. Not a new equation. @internal */\nexport interface ChainRestatementRecord {\n readonly kind: 'restatement';\n readonly canonicalId: string;\n readonly restatesBridge: string;\n readonly edgeIds: readonly string[];\n}\n\n/** A provisional chain, as a Lean statement skeleton. @internal */\nexport interface ChainStubRecord {\n readonly kind: 'stub';\n readonly id: string;\n readonly edgeIds: readonly string[];\n readonly text: string;\n}\n\n/**\n * A pair the composition table refused.\n *\n * The message is `UndefinedCompositionError`. A dimension mismatch is not\n * this record.\n *\n * @internal\n */\nexport interface ChainCompositionRefusal {\n readonly kind: 'rejected: composition table';\n readonly edgeIds: readonly [string, string];\n readonly message: string;\n}\n\n/** One ordered survivor, a regime rejection, or a composition-table refusal. @internal */\nexport type ChainPipelineResult =\n | ChainConfirmationRecord\n | ChainRestatementRecord\n | ChainStubRecord\n | ChainRegimeMismatch\n | ChainCompositionRefusal;\n\nfunction isNumericName(name: string): boolean {\n return /^\\d+(\\.\\d+)?$/.test(name);\n}\n\nfunction isDimensionlessConstant(name: string): boolean {\n if (/^\\d*pi$/.test(name)) return true;\n const registered = CONSTANTS[name];\n return registered !== undefined && equals(registered.dim, DIMENSIONLESS);\n}\n\n/**\n * Dimensioned leaves of the composed formula, excluding the target name.\n * The names are the MathTS symbol filter. A dimensionless constant is not\n * a governing symbol. The elementary charge is, because its dimension is\n * charge.\n *\n * @internal\n */\nexport function governingOf(expr: ExprNode, targetName: string): { name: string; dim: Dimension }[] {\n const vars: { name: string; dim: Dimension }[] = [];\n for (const leaf of scalarSymbolsFromMathTs(expr)) {\n if (leaf.name === targetName) continue;\n if (isNumericName(leaf.name) || isDimensionlessConstant(leaf.name)) continue;\n vars.push(leaf);\n }\n vars.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));\n return vars;\n}\n\nfunction theoremsFor(edgeIds: readonly string[]): string[] {\n return edgeIds.map((id) => {\n const name = physjsTheorem(id);\n if (name === undefined) {\n throw new Error(`chain pipeline: manifest copy has no theorem for seed '${id}'`);\n }\n return name;\n });\n}\n\nfunction proofCandidate(record: ChainRecord): ChainCandidate {\n const kind = chainOrderKey(record);\n const theorem = record.theorem ?? undefined;\n const carried = theorem === undefined ? {} : { theorem };\n if (record.classification.kind === 'confirmation') {\n return {\n kind,\n edgeIds: record.edgeIds,\n catalogId: record.classification.catalogId,\n ...carried,\n };\n }\n if (record.classification.kind === 'restatement') {\n return {\n kind,\n edgeIds: record.edgeIds,\n canonicalId: record.classification.canonicalId,\n restatesBridge: record.classification.restatesBridge,\n ...carried,\n };\n }\n return {\n kind,\n edgeIds: record.edgeIds,\n id: record.classification.id,\n ...carried,\n };\n}\n\n/**\n * The orchestrator view of one {@link ChainRecord}.\n *\n * A confirmation and a restatement ignore `mismatch`. A provisional\n * record with a mismatch is that rejection. Any other provisional record\n * is a stub whose id and theorem come from the same record the order key\n * reads.\n *\n * @internal\n */\nexport function renderChainRecord(\n record: ChainRecord,\n seedTheorems: readonly string[] = [],\n): ChainPipelineResult {\n if (record.classification.kind === 'confirmation') {\n return {\n kind: 'confirmation',\n catalogId: record.classification.catalogId,\n edgeIds: record.edgeIds,\n };\n }\n if (record.classification.kind === 'restatement') {\n return {\n kind: 'restatement',\n canonicalId: record.classification.canonicalId,\n restatesBridge: record.classification.restatesBridge,\n edgeIds: record.edgeIds,\n };\n }\n if (record.mismatch !== undefined) return record.mismatch;\n const candidate = proofCandidate(record);\n const id = candidate.id ?? `chain-${record.edgeIds.join('-')}`;\n return {\n kind: 'stub',\n id,\n edgeIds: record.edgeIds,\n text: emitProofTarget({ ...candidate, id }, seedTheorems),\n };\n}\n\n/**\n * Run the pipeline on `edges`.\n *\n * A manifest key whose derived kind is not `bridge` is not a premise.\n * A chain the Buckingham filter drops is absent. A confirmation or a\n * restatement is not sent to the regime gate. Any other mismatch is\n * `rejected: regime mismatch` and is not a stub. A composition-table\n * refusal is `rejected: composition table` and is not a dimension\n * failure. The catalog array is not modified.\n *\n * @internal\n */\nexport function runChainPipeline(edges: readonly BridgeEdge[]): readonly ChainPipelineResult[] {\n const seedIds = new Set(bridgeSeedKeys());\n const found = enumerateCompositionsWithRefusals(edges, { seedIds });\n const report = found.report;\n const records: ChainRecord[] = [];\n const rejections: ChainRecord[] = [];\n for (const target of report.proofTargets) {\n const filtered = buckinghamFilter(\n { name: target.second.target.name, dim: target.second.target.dim },\n governingOf(target.expr, target.second.target.name),\n );\n if (filtered === undefined) continue;\n const classification = matchChain(target.expr, [target.first.id, target.second.id]);\n const edgeIds = [target.first.id, target.second.id];\n const record: ChainRecord = {\n edgeIds,\n classification,\n theorem: filtered.theorem,\n mismatch: undefined,\n // A quantity edge stores a quantity name, not a category object id, so\n // no step can state a category claim for the pair. Unset, and the pair\n // is not dropped. The sentence that a function computed this value is\n // the record from before it was found to return nothing else.\n categoryComposition: undefined,\n };\n if (classification.kind === 'confirmation' || classification.kind === 'restatement') {\n records.push(record);\n continue;\n }\n const mismatch = joinRegimeMismatch(target.first, target.second);\n if (mismatch !== undefined) {\n rejections.push({ ...record, mismatch });\n continue;\n }\n records.push(record);\n }\n const orderedRejections = [...rejections].sort((a, b) =>\n compareChainEdgeIds(a.edgeIds, b.edgeIds),\n );\n const tableRefusals: ChainCompositionRefusal[] = found.relationRefusals\n .map((row) => ({\n kind: 'rejected: composition table' as const,\n edgeIds: [row.first.id, row.second.id] as [string, string],\n message: row.message,\n }))\n .sort((a, b) => compareChainEdgeIds(a.edgeIds, b.edgeIds));\n return [\n ...orderChainRecords(records).map((record) =>\n renderChainRecord(record, theoremsFor(record.edgeIds)),\n ),\n ...orderedRejections.map((record) => renderChainRecord(record)),\n ...tableRefusals,\n ];\n}\n"]}
1
+ {"version":3,"file":"chain-pipeline.js","sourceRoot":"","sources":["../../src/atlas/chain-pipeline.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Internal bridge-discovery pipeline.\n *\n * Seeds, then seed-filtered symbolic enumeration, the Buckingham filter,\n * the structural classifier, the regime join gate, the chain order,\n * and the proof-target stub.\n * A confirmation reports the catalog id. A restatement reports the\n * pre-declared canonical equation. A regime mismatch is recorded and\n * is not a stub. Any other survivor is a statement skeleton. Nothing\n * is written into the catalog.\n *\n * No command calls this. `discovery.ts` and the probe are not inputs.\n *\n * @module atlas/chain-pipeline\n */\n\nimport { byKey } from '../core/compare.js';\nimport type { ExprNode } from '../dimensional/validator.js';\nimport type { Dimension } from '../dimensional/types.js';\nimport { DIMENSIONLESS } from '../dimensional/types.js';\nimport { equals } from '../dimensional/algebra.js';\nimport { CONSTANTS, isRegisteredConstant } from '../dimensional/symbolic-constants.js';\nimport { isDecimalLiteral } from '../dimensional/ast-leaves.js';\nimport type { BridgeEdge } from '../composition/edge.js';\nimport { enumerateCompositionsWithRefusals } from '../composition/enumerate.js';\nimport { buckinghamFilter } from '../composition/buckingham-filter.js';\nimport { matchChain } from '../composition/chain-match.js';\nimport { compareChainEdgeIds, type ChainCandidate } from '../composition/chain-candidate.js';\nimport {\n chainOrderKey,\n orderChainRecords,\n type ChainRecord,\n} from '../composition/chain-result.js';\nimport { joinRegimeMismatch, type ChainRegimeMismatch } from '../composition/chain-regime.js';\nimport { bridgeSeedKeys, physjsTheorem } from './physjs-ref.js';\nimport { emitProofTarget } from './proof-target.js';\nimport { scalarSymbolsFromMathTs } from '../composition/mathts-scalar-symbols.js';\n\n/** A chain whose normal form matches a catalog equation. Nothing was written. @internal */\nexport interface ChainConfirmationRecord {\n readonly kind: 'confirmation';\n readonly catalogId: number;\n readonly edgeIds: readonly string[];\n}\n\n/** A chain the registry pre-declared with `restatesBridge`. Not a new equation. @internal */\nexport interface ChainRestatementRecord {\n readonly kind: 'restatement';\n readonly canonicalId: string;\n readonly restatesBridge: string;\n readonly edgeIds: readonly string[];\n}\n\n/** A provisional chain, as a Lean statement skeleton. @internal */\nexport interface ChainStubRecord {\n readonly kind: 'stub';\n readonly id: string;\n readonly edgeIds: readonly string[];\n readonly text: string;\n}\n\n/**\n * A pair the composition table refused.\n *\n * The message is `UndefinedCompositionError`. A dimension mismatch is not\n * this record.\n *\n * @internal\n */\nexport interface ChainCompositionRefusal {\n readonly kind: 'rejected: composition table';\n readonly edgeIds: readonly [string, string];\n readonly message: string;\n}\n\n/** One ordered survivor, a regime rejection, or a composition-table refusal. @internal */\nexport type ChainPipelineResult =\n | ChainConfirmationRecord\n | ChainRestatementRecord\n | ChainStubRecord\n | ChainRegimeMismatch\n | ChainCompositionRefusal;\n\n/** A registered constant whose dimension is none, or a `pi` multiple (`2pi`). Own keys only. */\nfunction isDimensionlessConstant(name: string): boolean {\n if (/^\\d*pi$/.test(name)) return true;\n return isRegisteredConstant(name) && equals(CONSTANTS[name]!.dim, DIMENSIONLESS);\n}\n\n/**\n * Dimensioned leaves of the composed formula, excluding the target name.\n * The names are the MathTS symbol filter. A dimensionless constant is not\n * a governing symbol. The elementary charge is, because its dimension is\n * charge.\n *\n * @internal\n */\nexport function governingOf(expr: ExprNode, targetName: string): { name: string; dim: Dimension }[] {\n const vars: { name: string; dim: Dimension }[] = [];\n for (const leaf of scalarSymbolsFromMathTs(expr)) {\n if (leaf.name === targetName) continue;\n if (isDecimalLiteral(leaf.name) || isDimensionlessConstant(leaf.name)) continue;\n vars.push(leaf);\n }\n vars.sort(byKey((v) => v.name));\n return vars;\n}\n\nfunction theoremsFor(edgeIds: readonly string[]): string[] {\n return edgeIds.map((id) => {\n const name = physjsTheorem(id);\n if (name === undefined) {\n throw new Error(`chain pipeline: manifest copy has no theorem for seed '${id}'`);\n }\n return name;\n });\n}\n\nfunction proofCandidate(record: ChainRecord): ChainCandidate {\n const kind = chainOrderKey(record);\n const theorem = record.theorem ?? undefined;\n const carried = theorem === undefined ? {} : { theorem };\n if (record.classification.kind === 'confirmation') {\n return {\n kind,\n edgeIds: record.edgeIds,\n catalogId: record.classification.catalogId,\n ...carried,\n };\n }\n if (record.classification.kind === 'restatement') {\n return {\n kind,\n edgeIds: record.edgeIds,\n canonicalId: record.classification.canonicalId,\n restatesBridge: record.classification.restatesBridge,\n ...carried,\n };\n }\n return {\n kind,\n edgeIds: record.edgeIds,\n id: record.classification.id,\n ...carried,\n };\n}\n\n/**\n * The orchestrator view of one {@link ChainRecord}.\n *\n * A confirmation and a restatement ignore `mismatch`. A provisional\n * record with a mismatch is that rejection. Any other provisional record\n * is a stub whose id and theorem come from the same record the order key\n * reads.\n *\n * @internal\n */\nexport function renderChainRecord(\n record: ChainRecord,\n seedTheorems: readonly string[] = [],\n): ChainPipelineResult {\n if (record.classification.kind === 'confirmation') {\n return {\n kind: 'confirmation',\n catalogId: record.classification.catalogId,\n edgeIds: record.edgeIds,\n };\n }\n if (record.classification.kind === 'restatement') {\n return {\n kind: 'restatement',\n canonicalId: record.classification.canonicalId,\n restatesBridge: record.classification.restatesBridge,\n edgeIds: record.edgeIds,\n };\n }\n if (record.mismatch !== undefined) return record.mismatch;\n const candidate = proofCandidate(record);\n const id = candidate.id ?? `chain-${record.edgeIds.join('-')}`;\n return {\n kind: 'stub',\n id,\n edgeIds: record.edgeIds,\n text: emitProofTarget({ ...candidate, id }, seedTheorems),\n };\n}\n\n/**\n * Run the pipeline on `edges`.\n *\n * A manifest key whose derived kind is not `bridge` is not a premise.\n * A chain the Buckingham filter drops is absent. A confirmation or a\n * restatement is not sent to the regime gate. Any other mismatch is\n * `rejected: regime mismatch` and is not a stub. A composition-table\n * refusal is `rejected: composition table` and is not a dimension\n * failure. The catalog array is not modified.\n *\n * @internal\n */\nexport function runChainPipeline(edges: readonly BridgeEdge[]): readonly ChainPipelineResult[] {\n const seedIds = new Set(bridgeSeedKeys());\n const found = enumerateCompositionsWithRefusals(edges, { seedIds });\n const report = found.report;\n const records: ChainRecord[] = [];\n const rejections: ChainRecord[] = [];\n for (const target of report.proofTargets) {\n const filtered = buckinghamFilter(\n { name: target.second.target.name, dim: target.second.target.dim },\n governingOf(target.expr, target.second.target.name),\n );\n if (filtered === undefined) continue;\n const classification = matchChain(target.expr, [target.first.id, target.second.id]);\n const edgeIds = [target.first.id, target.second.id];\n const record: ChainRecord = {\n edgeIds,\n classification,\n theorem: filtered.theorem,\n mismatch: undefined,\n // A quantity edge stores a quantity name, not a category object id, so\n // no step can state a category claim for the pair. Unset, and the pair\n // is not dropped. The sentence that a function computed this value is\n // the record from before it was found to return nothing else.\n categoryComposition: undefined,\n };\n if (classification.kind === 'confirmation' || classification.kind === 'restatement') {\n records.push(record);\n continue;\n }\n const mismatch = joinRegimeMismatch(target.first, target.second);\n if (mismatch !== undefined) {\n rejections.push({ ...record, mismatch });\n continue;\n }\n records.push(record);\n }\n const orderedRejections = [...rejections].sort((a, b) =>\n compareChainEdgeIds(a.edgeIds, b.edgeIds),\n );\n const tableRefusals: ChainCompositionRefusal[] = found.relationRefusals\n .map((row) => ({\n kind: 'rejected: composition table' as const,\n edgeIds: [row.first.id, row.second.id] as [string, string],\n message: row.message,\n }))\n .sort((a, b) => compareChainEdgeIds(a.edgeIds, b.edgeIds));\n return [\n ...orderChainRecords(records).map((record) =>\n renderChainRecord(record, theoremsFor(record.edgeIds)),\n ),\n ...orderedRejections.map((record) => renderChainRecord(record)),\n ...tableRefusals,\n ];\n}\n"]}
@@ -20,14 +20,10 @@
20
20
  * @module atlas/diffusion/bridges-closure
21
21
  */
22
22
  import type { AtlasBridge } from '../types.js';
23
- /** τ_p/t ceiling of the Langevin → Fick regime: WD4's fine resolution, t = 100 τ_p. @internal */
24
- export declare const LANGEVIN_MAX_TAU_RATIO = 0.01;
25
23
  /** ε = τDq² ceiling of the telegraph → Fick domain. @internal */
26
24
  export declare const TELEGRAPH_FICK_MAX_EPS = 0.05;
27
25
  /** ε = τDq² floor of the telegraph → wave domain. @internal */
28
26
  export declare const TELEGRAPH_WAVE_MIN_EPS = 25;
29
- /** Fourier-number floor of the steady-state restriction. @internal */
30
- export declare const STEADY_MIN_FOURIER = 1;
31
27
  /** Bridge: Langevin → Fick, the Einstein coarse-graining D = k_BT/γ. @internal */
32
28
  export declare const BRIDGE_LANGEVIN_DIFFUSION: AtlasBridge;
33
29
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"bridges-closure.d.ts","sourceRoot":"","sources":["../../../src/atlas/diffusion/bridges-closure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAS/C,iGAAiG;AACjG,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C,iEAAiE;AACjE,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C,+DAA+D;AAC/D,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,sEAAsE;AACtE,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAwBpC,kFAAkF;AAClF,eAAO,MAAM,yBAAyB,EAAE,WAyDvC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,EAAE,WA4DpC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,0BAA0B,EAAE,WA0ExC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAkDnC,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,mBAAmB,EAAE,WAqCjC,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,yBAAyB,EAAE,SAAS,WAAW,EAM3D,CAAC"}
1
+ {"version":3,"file":"bridges-closure.d.ts","sourceRoot":"","sources":["../../../src/atlas/diffusion/bridges-closure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAY/C,iEAAiE;AACjE,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C,+DAA+D;AAC/D,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAuBzC,kFAAkF;AAClF,eAAO,MAAM,yBAAyB,EAAE,WAyDvC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,EAAE,WA4DpC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,0BAA0B,EAAE,WA0ExC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAkDnC,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,mBAAmB,EAAE,WAqCjC,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,yBAAyB,EAAE,SAAS,WAAW,EAM3D,CAAC"}
@@ -22,29 +22,25 @@
22
22
  import { ENERGY, LENGTH, MASS, TIME, VELOCITY } from '../../dimensional/types.js';
23
23
  import { makeApproximation } from '../oscillators/bridges-limits.js';
24
24
  import { DAMPING } from '../oscillators/dimensions.js';
25
- import { deriveRegimeGroups } from '../regime.js';
25
+ import { makeRegime } from '../regime.js';
26
26
  import { physjsFormalRef } from '../physjs-ref.js';
27
27
  import { WAVENUMBER } from '../waves/models.js';
28
28
  import { DENSITY, DIFFUSIVITY, SPECIFIC_HEAT, THERMAL_CONDUCTIVITY } from './dimensions.js';
29
29
  import { DIFFUSION_FAMILY_NAME, VISCOSITY } from './models.js';
30
- import { telegraphSlowRateRatio, telegraphWaveFrequencyRatio } from './numerics.js';
30
+ import { telegraphSlowRateExcess, telegraphWaveFrequencyRatio } from './numerics.js';
31
31
  const TEST = 'tests/atlas/closure.test.ts';
32
32
  const WITNESS_RESULTS_TEST = 'tests/atlas/witness-results.test.ts';
33
33
  /** τ_p/t ceiling of the Langevin → Fick regime: WD4's fine resolution, t = 100 τ_p. @internal */
34
- export const LANGEVIN_MAX_TAU_RATIO = 0.01;
34
+ const LANGEVIN_MAX_TAU_RATIO = 0.01;
35
35
  /** ε = τDq² ceiling of the telegraph → Fick domain. @internal */
36
36
  export const TELEGRAPH_FICK_MAX_EPS = 0.05;
37
37
  /** ε = τDq² floor of the telegraph → wave domain. @internal */
38
38
  export const TELEGRAPH_WAVE_MIN_EPS = 25;
39
39
  /** Fourier-number floor of the steady-state restriction. @internal */
40
- export const STEADY_MIN_FOURIER = 1;
40
+ const STEADY_MIN_FOURIER = 1;
41
41
  const regime = (parameters, inequalities) => regimeWithInputs(parameters, [], inequalities);
42
42
  /** A regime whose coordinates also include dimensionless model inputs (such as Re). */
43
- const regimeWithInputs = (parameters, dimensionlessInputs, inequalities) => ({
44
- family: DIFFUSION_FAMILY_NAME,
45
- inequalities,
46
- groupDefinitions: deriveRegimeGroups(DIFFUSION_FAMILY_NAME, parameters, dimensionlessInputs),
47
- });
43
+ const regimeWithInputs = (parameters, dimensionlessInputs, inequalities) => makeRegime(DIFFUSION_FAMILY_NAME, parameters, dimensionlessInputs, inequalities);
48
44
  /** Reynolds-number ceiling of the Stokes–Einstein derivation: a chosen threshold for Re ≪ 1. @internal */
49
45
  const STOKES_MAX_RE = 0.1;
50
46
  /** Ceiling of τ_p/t = m/(γt) for the overdamped limit: a chosen threshold for ≪ 1. @internal */
@@ -193,8 +189,8 @@ export const BRIDGE_TELEGRAPH_DIFFUSION = {
193
189
  sideConditions: ['ε = τDq² ≤ 0.05', 'after the initial layer: t ≫ τ'],
194
190
  bound: makeApproximation({
195
191
  K: 1,
196
- delta: telegraphSlowRateRatio(TELEGRAPH_FICK_MAX_EPS, 1, 1) - 1,
197
- deltaAt: (p) => telegraphSlowRateRatio(p['tau'] ?? Number.NaN, p['D'] ?? Number.NaN, p['q'] ?? Number.NaN) - 1,
192
+ delta: telegraphSlowRateExcess(TELEGRAPH_FICK_MAX_EPS, 1, 1),
193
+ deltaAt: (p) => telegraphSlowRateExcess(p['tau'] ?? Number.NaN, p['D'] ?? Number.NaN, p['q'] ?? Number.NaN),
198
194
  deltaAtBasis: 'closed-form',
199
195
  norm: 'relative error of the slow-mode decay rate of a Fourier mode, normalized by the value of the reduced model',
200
196
  domain: 'ε = τDq² ≤ 0.05',
@@ -204,7 +200,7 @@ export const BRIDGE_TELEGRAPH_DIFFUSION = {
204
200
  const { tau, D, q } = p;
205
201
  if (tau === undefined || D === undefined || q === undefined)
206
202
  return false;
207
- const delta = telegraphSlowRateRatio(tau, D, q) - 1;
203
+ const delta = telegraphSlowRateExcess(tau, D, q);
208
204
  if (!Number.isFinite(delta))
209
205
  return false;
210
206
  if (t <= 5 * tau)
@@ -1 +1 @@
1
- {"version":3,"file":"bridges-closure.js","sourceRoot":"","sources":["../../../src/atlas/diffusion/bridges-closure.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Atlas Phase 4 — the five diffusion-family bridges added to close Sprint 4's\n * \"≥ 20 bridges\" exit criterion.\n *\n * Design note: `docs/planning/Atlas-Phase-4-Design.md` §4 (Sprint 4 closure).\n *\n * | Bridge | Relation | Witnesses |\n * |---|---|---|\n * | Langevin → Fick | `coarse-graining` | WD4 (convergence), WD4b (ballistic regime) |\n * | Langevin + Stokes drag → Fick | `derivation`, **hyperedge** | WD5 (canonical + water), WD5s (CAS) |\n * | telegraph → Fick | `approximation` (singular, τ → 0) | WD6 (convergence), WD6b (oscillatory modes) |\n * | telegraph → 1-D wave | `approximation` (τDq² → ∞, t ≪ τ) | WD7 (convergence) |\n * | heat → Laplace | `restriction` (steady state) | WD8 (convergence in time) |\n *\n * Every regime inequality keys a `PiGroup.formula` derived from the dimension\n * matrix. Every `delta` is the EXACT error at its domain edge; every error\n * function used for it is monotone on the domain, so the edge value is the\n * supremum.\n *\n * @module atlas/diffusion/bridges-closure\n */\n\nimport { ENERGY, LENGTH, MASS, TIME, VELOCITY } from '../../dimensional/types.js';\nimport { makeApproximation } from '../oscillators/bridges-limits.js';\nimport { DAMPING } from '../oscillators/dimensions.js';\nimport { deriveRegimeGroups } from '../regime.js';\nimport { physjsFormalRef } from '../physjs-ref.js';\nimport type { AtlasBridge } from '../types.js';\nimport { WAVENUMBER } from '../waves/models.js';\nimport { DENSITY, DIFFUSIVITY, SPECIFIC_HEAT, THERMAL_CONDUCTIVITY } from './dimensions.js';\nimport { DIFFUSION_FAMILY_NAME, VISCOSITY } from './models.js';\nimport { telegraphSlowRateRatio, telegraphWaveFrequencyRatio } from './numerics.js';\n\nconst TEST = 'tests/atlas/closure.test.ts';\nconst WITNESS_RESULTS_TEST = 'tests/atlas/witness-results.test.ts';\n\n/** τ_p/t ceiling of the Langevin → Fick regime: WD4's fine resolution, t = 100 τ_p. @internal */\nexport const LANGEVIN_MAX_TAU_RATIO = 0.01;\n\n/** ε = τDq² ceiling of the telegraph → Fick domain. @internal */\nexport const TELEGRAPH_FICK_MAX_EPS = 0.05;\n\n/** ε = τDq² floor of the telegraph → wave domain. @internal */\nexport const TELEGRAPH_WAVE_MIN_EPS = 25;\n\n/** Fourier-number floor of the steady-state restriction. @internal */\nexport const STEADY_MIN_FOURIER = 1;\n\nconst regime = (\n parameters: readonly { name: string; dim: import('../../dimensional/types.js').Dimension }[],\n inequalities: AtlasBridge['regime']['inequalities'],\n): AtlasBridge['regime'] => regimeWithInputs(parameters, [], inequalities);\n\n/** A regime whose coordinates also include dimensionless model inputs (such as Re). */\nconst regimeWithInputs = (\n parameters: readonly { name: string; dim: import('../../dimensional/types.js').Dimension }[],\n dimensionlessInputs: readonly string[],\n inequalities: AtlasBridge['regime']['inequalities'],\n): AtlasBridge['regime'] => ({\n family: DIFFUSION_FAMILY_NAME,\n inequalities,\n groupDefinitions: deriveRegimeGroups(DIFFUSION_FAMILY_NAME, parameters, dimensionlessInputs),\n});\n\n/** Reynolds-number ceiling of the Stokes–Einstein derivation: a chosen threshold for Re ≪ 1. @internal */\nconst STOKES_MAX_RE = 0.1;\n\n/** Ceiling of τ_p/t = m/(γt) for the overdamped limit: a chosen threshold for ≪ 1. @internal */\nconst STOKES_MAX_TAU_RATIO = 0.01;\n\n/** Bridge: Langevin → Fick, the Einstein coarse-graining D = k_BT/γ. @internal */\nexport const BRIDGE_LANGEVIN_DIFFUSION: AtlasBridge = {\n id: 'ab-langevin-diffusion',\n relation: 'coarse-graining',\n premises: ['model-langevin'],\n conclusion: 'model-fick',\n transformation: 'average over times t ≫ τ_p = m/γ: ⟨x²⟩ → 2Dt with D = k_B T/γ (Einstein)',\n preserves: ['the long-time mean-square displacement', 'the equilibrium velocity variance k_B T/m'],\n doesNotPreserve: [\n 'the velocity as a state variable',\n 'the ballistic regime t ≲ τ_p, where ⟨x²⟩ ≈ (k_B T/m) t²',\n 'the momentum relaxation time τ_p as an independent scale',\n ],\n sideConditions: ['overdamped observation times: τ_p/t ≪ 1', 'white thermal noise, fluctuation–dissipation 2γk_BT'],\n regime: regime(\n [\n { name: 'm', dim: MASS },\n { name: 'gamma', dim: DAMPING },\n { name: 'kT', dim: ENERGY },\n { name: 'D', dim: DIFFUSIVITY },\n { name: 't', dim: TIME },\n ],\n [\n {\n group: 'm · gamma^-1 · t^-1',\n op: '<=',\n bound: LANGEVIN_MAX_TAU_RATIO,\n alias: 'τ_p/t ≪ 1 (machine form ≤ 0.01)',\n },\n ],\n ),\n counterexamples: [\n {\n description:\n 'At t = 0.1 τ_p the Langevin mean-square displacement is 0.048 of 2Dt: the particle is ' +\n 'still ballistic, ⟨x²⟩ ≈ (k_BT/m)t², and the diffusion model does not describe it.',\n witness: 'WD4b',\n },\n ],\n witnesses: [\n {\n id: 'WD4',\n kind: 'numeric',\n test: TEST,\n tolerance: '⟨x²⟩/(2Dt) within 0.02 of 1 at t = 100 τ_p, from the Langevin moment equations by RK4',\n },\n {\n id: 'WD4b',\n kind: 'numeric',\n test: TEST,\n tolerance: '⟨x²⟩/(2Dt) = 0.0484 at t = 0.1 τ_p',\n },\n ],\n citations: [\n 'Uhlenbeck & Ornstein, Phys. Rev. 36 (1930) 823 - On the theory of the Brownian motion',\n 'Einstein, Ann. Phys. 17 (1905) 549 - the relation D = k_B T/γ',\n ],\n reviewStatus: 'proposed',\n};\n\n/**\n * Bridge: Langevin + Stokes drag → Fick with the Stokes–Einstein coefficient.\n *\n * A HYPEREDGE: the Langevin model supplies D = k_BT/γ with γ free; Stokes drag\n * supplies γ = 6πηa for a sphere. Neither alone gives D in terms of the fluid.\n *\n * @internal\n */\nexport const BRIDGE_STOKES_EINSTEIN: AtlasBridge = {\n id: 'ab-stokes-einstein',\n relation: 'derivation',\n premises: ['model-langevin', 'model-stokes-drag'],\n conclusion: 'model-fick',\n transformation: 'substitute γ = 6πηa into D = k_B T/γ: D = k_B T/(6πηa)',\n preserves: ['the long-time diffusion coefficient of a sphere'],\n doesNotPreserve: ['the particle mass (it drops out)', 'the shape beyond the radius a'],\n sideConditions: [\n 'creeping flow around the sphere, Re ≪ 1 (machine form Re ≤ 0.1: a chosen threshold for \"≪ 1\")',\n 'no-slip boundary',\n 'overdamped times t ≫ m/γ (machine form m/(γt) ≤ 0.01: a chosen threshold for \"≪ 1\", as in ab-langevin-diffusion)',\n ],\n // The prose conditions were not machine-checked, so `upt regime` reported this\n // bridge VACUOUS and \"valid\" at Re = 1000 (persona finding L8). Re is a\n // dimensionless input of the flow; m/(γt) is listed first so its π-group key is\n // the one ab-langevin-diffusion uses, and one --at value checks both bridges.\n regime: regimeWithInputs(\n [\n { name: 'm', dim: MASS },\n { name: 'gamma', dim: DAMPING },\n { name: 't', dim: TIME },\n { name: 'kT', dim: ENERGY },\n { name: 'eta', dim: VISCOSITY },\n { name: 'a', dim: LENGTH },\n { name: 'D', dim: DIFFUSIVITY },\n ],\n ['Re'],\n [\n { group: 'Re', op: '<=', bound: STOKES_MAX_RE, alias: 'Re ≪ 1 (machine form Re ≤ 0.1)' },\n {\n group: 'm · gamma^-1 · t^-1',\n op: '<=',\n bound: STOKES_MAX_TAU_RATIO,\n alias: 'τ_p/t ≪ 1 (machine form m/(γt) ≤ 0.01)',\n },\n ],\n ),\n counterexamples: [],\n witnesses: [\n {\n id: 'WD5',\n kind: 'numeric',\n test: TEST,\n tolerance:\n 'agrees with CE-stokes-einstein to 1e-12 relative; a sphere of radius a = 0.5 µm (1 µm diameter) in water ' +\n 'at T = 293.15 K, η = 1.0016e-3 Pa·s gives D = 4.29e-13 m²/s',\n },\n {\n id: 'WD5s',\n kind: 'symbolic',\n test: WITNESS_RESULTS_TEST,\n tolerance: 'CAS: k_BT/γ under γ ↦ 6πηa minus k_BT/(6πηa) simplifies to literal 0',\n },\n ],\n citations: [\n 'Einstein, Ann. Phys. 17 (1905) 549 - Brownian motion of a sphere, D = k_B T/(6πηa)',\n 'Stokes, Trans. Camb. Phil. Soc. 9 (1851) 8 - the drag on a sphere in creeping flow',\n ],\n reviewStatus: 'proposed',\n};\n\n/**\n * Bridge: telegraph → Fick, the SINGULAR limit τ → 0.\n *\n * Singular because the highest time derivative is lost: the telegraph equation\n * needs two initial conditions and diffusion takes one, so a fast mode\n * `e^{−t/τ}` forms an initial layer. The bound therefore holds only AFTER that\n * layer, and the machine horizon has a LOWER edge as well as an upper one.\n *\n * @internal\n */\nexport const BRIDGE_TELEGRAPH_DIFFUSION: AtlasBridge = {\n id: 'ab-telegraph-diffusion',\n relation: 'approximation',\n premises: ['model-telegraph'],\n conclusion: 'model-fick',\n transformation: 'drop τ u_tt: the slow mode decays at Dq²(1 + ε + 2ε² + …) → Dq², ε = τDq²',\n preserves: ['the slow decay rate of each Fourier mode to O(ε)', 'the total amount ∫u dx'],\n doesNotPreserve: [\n 'the finite signal speed √(D/τ)',\n 'the second initial condition u_t(x, 0)',\n 'oscillatory modes, which exist for ε > 1/4',\n ],\n sideConditions: ['ε = τDq² ≤ 0.05', 'after the initial layer: t ≫ τ'],\n bound: makeApproximation({\n K: 1,\n delta: telegraphSlowRateRatio(TELEGRAPH_FICK_MAX_EPS, 1, 1) - 1,\n deltaAt: (p) =>\n telegraphSlowRateRatio(p['tau'] ?? Number.NaN, p['D'] ?? Number.NaN, p['q'] ?? Number.NaN) - 1,\n deltaAtBasis: 'closed-form',\n norm: 'relative error of the slow-mode decay rate of a Fourier mode, normalized by the value of the reduced model',\n domain: 'ε = τDq² ≤ 0.05',\n horizon:\n 'τ ≪ t ≪ 1/(δ D q²): after the initial layer and before the decay-rate error accumulates; ' +\n 'machine form 5τ < t < 0.1/(δ D q²)',\n horizonHolds: (t, p) => {\n const { tau, D, q } = p;\n if (tau === undefined || D === undefined || q === undefined) return false;\n const delta = telegraphSlowRateRatio(tau, D, q) - 1;\n if (!Number.isFinite(delta)) return false;\n if (t <= 5 * tau) return false;\n return delta === 0 || t < 0.1 / (delta * D * q * q);\n },\n parameterRange: 'ε = τDq² ≤ 0.05',\n limitCharacter: 'singular',\n // A slow-mode decay-rate error. The horizon says that error accumulates,\n // so time is not listed.\n uniformity: ['slow-mode decay rate of one Fourier mode, for ε = τDq² ≤ 0.05'],\n }),\n regime: regime(\n [\n { name: 'tau', dim: TIME },\n { name: 'D', dim: DIFFUSIVITY },\n { name: 'q', dim: WAVENUMBER },\n ],\n [{ group: 'tau · D · q^2', op: '<=', bound: TELEGRAPH_FICK_MAX_EPS, alias: 'ε = τDq² ≤ 0.05' }],\n ),\n counterexamples: [\n {\n description:\n 'At ε = τDq² = 1 the telegraph mode is OSCILLATORY (complex rate, NaN on the slow branch): ' +\n 'no diffusion mode oscillates.',\n witness: 'WD6b',\n },\n ],\n witnesses: [\n {\n id: 'WD6',\n kind: 'numeric',\n test: TEST,\n tolerance: 'slow rate / Dq² within 0.03 of 1 at τ = 0.025 (D = q = 1); error halves with τ',\n },\n {\n id: 'WD6b',\n kind: 'numeric',\n test: TEST,\n tolerance: 'no real slow rate at ε = 1',\n },\n ],\n citations: [\n 'Cattaneo, Atti Sem. Mat. Fis. Univ. Modena 3 (1948) 83 - heat conduction with a relaxation time',\n 'Goldstein, Q. J. Mech. Appl. Math. 4 (1951) 129 - On diffusion by discontinuous movements, and on the telegraph equation',\n ],\n reviewStatus: 'proposed',\n formalRef: physjsFormalRef('ab-telegraph-diffusion'),\n};\n\n/**\n * Bridge: telegraph → 1-D wave, for strongly underdamped modes over short times.\n *\n * @internal\n */\nexport const BRIDGE_TELEGRAPH_WAVE: AtlasBridge = {\n id: 'ab-telegraph-wave',\n relation: 'approximation',\n premises: ['model-telegraph'],\n conclusion: 'model-wave-1d',\n transformation: 'drop u_t: τ u_tt = D u_xx, a wave with c² = D/τ',\n preserves: ['the signal speed √(D/τ)', 'the oscillation frequency to O(1/ε)'],\n doesNotPreserve: ['damping: telegraph modes decay as e^{−t/(2τ)}', 'relaxation to diffusion at long times'],\n sideConditions: ['ε = τDq² ≥ 25', 'short times t ≪ τ (the bound is not uniform in time)'],\n bound: makeApproximation({\n K: 1,\n delta: 1 - telegraphWaveFrequencyRatio(TELEGRAPH_WAVE_MIN_EPS, 1, 1),\n deltaAt: (p) =>\n 1 - telegraphWaveFrequencyRatio(p['tau'] ?? Number.NaN, p['D'] ?? Number.NaN, p['q'] ?? Number.NaN),\n deltaAtBasis: 'closed-form',\n norm: 'relative error of the oscillation frequency of a Fourier mode, normalized by the value of the reduced model',\n domain: 'ε = τDq² ≥ 25',\n horizon:\n 't ≪ τ: before damping e^{−t/(2τ)} removes 10% of the amplitude; machine form t < 2τ ln(10/9)',\n horizonHolds: (t, p) => {\n const { tau } = p;\n if (tau === undefined || !(tau > 0)) return false;\n return t >= 0 && t < 2 * tau * Math.log(10 / 9);\n },\n parameterRange: 'ε = τDq² ≥ 25',\n limitCharacter: 'regular',\n // An oscillation-frequency error. The record says it is not uniform in time.\n uniformity: ['oscillation frequency of one Fourier mode, for ε = τDq² ≥ 25'],\n }),\n regime: regime(\n [\n { name: 'tau', dim: TIME },\n { name: 'D', dim: DIFFUSIVITY },\n { name: 'q', dim: WAVENUMBER },\n { name: 'c', dim: VELOCITY },\n ],\n [{ group: 'tau · D · q^2', op: '>=', bound: TELEGRAPH_WAVE_MIN_EPS, alias: 'ε = τDq² ≥ 25' }],\n ),\n counterexamples: [],\n witnesses: [\n {\n id: 'WD7',\n kind: 'numeric',\n test: TEST,\n tolerance: 'frequency ratio within 3e-3 of 1 at ε = 50; error halves as ε doubles',\n },\n ],\n citations: ['Goldstein, Q. J. Mech. Appl. Math. 4 (1951) 129 - On diffusion by discontinuous movements, and on the telegraph equation'],\n reviewStatus: 'proposed',\n formalRef: physjsFormalRef('ab-telegraph-wave'),\n};\n\n/** Bridge: heat → Laplace, the steady-state restriction. @internal */\nexport const BRIDGE_HEAT_LAPLACE: AtlasBridge = {\n id: 'ab-heat-laplace',\n relation: 'restriction',\n premises: ['model-heat'],\n conclusion: 'model-laplace-1d',\n transformation: '∂T/∂t = 0: κ T_xx = 0, T linear between the end temperatures',\n preserves: ['the end temperatures', 'the steady heat flux κ(T_b − T_a)/ℓ'],\n doesNotPreserve: ['the transient', 'ρ and c_p, which drop out of the steady state'],\n sideConditions: ['fixed end temperatures', 'Fourier number αt/ℓ² ≥ 1 (transients decayed)'],\n regime: regime(\n [\n { name: 'kappa', dim: THERMAL_CONDUCTIVITY },\n { name: 'rho', dim: DENSITY },\n { name: 'cp', dim: SPECIFIC_HEAT },\n { name: 'ell', dim: LENGTH },\n { name: 't', dim: TIME },\n ],\n [\n {\n group: 'kappa · rho^-1 · cp^-1 · ell^-2 · t',\n op: '>=',\n bound: STEADY_MIN_FOURIER,\n alias: 'Fo = αt/ℓ² ≥ 1',\n },\n ],\n ),\n counterexamples: [],\n witnesses: [\n {\n id: 'WD8',\n kind: 'numeric',\n test: TEST,\n tolerance: 'max deviation from the linear profile below 0.025 at αt/ℓ² = 0.4; shrinks with time',\n },\n ],\n citations: ['Carslaw & Jaeger, Conduction of Heat in Solids - steady linear flow in a slab'],\n reviewStatus: 'proposed',\n};\n\n/** The diffusion-family closure bridges. @internal */\nexport const DIFFUSION_CLOSURE_BRIDGES: readonly AtlasBridge[] = [\n BRIDGE_LANGEVIN_DIFFUSION,\n BRIDGE_STOKES_EINSTEIN,\n BRIDGE_TELEGRAPH_DIFFUSION,\n BRIDGE_TELEGRAPH_WAVE,\n BRIDGE_HEAT_LAPLACE,\n];\n"]}
1
+ {"version":3,"file":"bridges-closure.js","sourceRoot":"","sources":["../../../src/atlas/diffusion/bridges-closure.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Atlas Phase 4 — the five diffusion-family bridges added to close Sprint 4's\n * \"≥ 20 bridges\" exit criterion.\n *\n * Design note: `docs/planning/Atlas-Phase-4-Design.md` §4 (Sprint 4 closure).\n *\n * | Bridge | Relation | Witnesses |\n * |---|---|---|\n * | Langevin → Fick | `coarse-graining` | WD4 (convergence), WD4b (ballistic regime) |\n * | Langevin + Stokes drag → Fick | `derivation`, **hyperedge** | WD5 (canonical + water), WD5s (CAS) |\n * | telegraph → Fick | `approximation` (singular, τ → 0) | WD6 (convergence), WD6b (oscillatory modes) |\n * | telegraph → 1-D wave | `approximation` (τDq² → ∞, t ≪ τ) | WD7 (convergence) |\n * | heat → Laplace | `restriction` (steady state) | WD8 (convergence in time) |\n *\n * Every regime inequality keys a `PiGroup.formula` derived from the dimension\n * matrix. Every `delta` is the EXACT error at its domain edge; every error\n * function used for it is monotone on the domain, so the edge value is the\n * supremum.\n *\n * @module atlas/diffusion/bridges-closure\n */\n\nimport { ENERGY, LENGTH, MASS, TIME, VELOCITY } from '../../dimensional/types.js';\nimport { makeApproximation } from '../oscillators/bridges-limits.js';\nimport { DAMPING } from '../oscillators/dimensions.js';\nimport { makeRegime } from '../regime.js';\nimport { physjsFormalRef } from '../physjs-ref.js';\nimport type { AtlasBridge } from '../types.js';\nimport { WAVENUMBER } from '../waves/models.js';\nimport { DENSITY, DIFFUSIVITY, SPECIFIC_HEAT, THERMAL_CONDUCTIVITY } from './dimensions.js';\nimport { DIFFUSION_FAMILY_NAME, VISCOSITY } from './models.js';\nimport { telegraphSlowRateExcess, telegraphWaveFrequencyRatio } from './numerics.js';\n\nconst TEST = 'tests/atlas/closure.test.ts';\nconst WITNESS_RESULTS_TEST = 'tests/atlas/witness-results.test.ts';\n\n/** τ_p/t ceiling of the Langevin → Fick regime: WD4's fine resolution, t = 100 τ_p. @internal */\nconst LANGEVIN_MAX_TAU_RATIO = 0.01;\n\n/** ε = τDq² ceiling of the telegraph → Fick domain. @internal */\nexport const TELEGRAPH_FICK_MAX_EPS = 0.05;\n\n/** ε = τDq² floor of the telegraph → wave domain. @internal */\nexport const TELEGRAPH_WAVE_MIN_EPS = 25;\n\n/** Fourier-number floor of the steady-state restriction. @internal */\nconst STEADY_MIN_FOURIER = 1;\n\nconst regime = (\n parameters: readonly { name: string; dim: import('../../dimensional/types.js').Dimension }[],\n inequalities: AtlasBridge['regime']['inequalities'],\n): AtlasBridge['regime'] => regimeWithInputs(parameters, [], inequalities);\n\n/** A regime whose coordinates also include dimensionless model inputs (such as Re). */\nconst regimeWithInputs = (\n parameters: readonly { name: string; dim: import('../../dimensional/types.js').Dimension }[],\n dimensionlessInputs: readonly string[],\n inequalities: AtlasBridge['regime']['inequalities'],\n): AtlasBridge['regime'] => makeRegime(DIFFUSION_FAMILY_NAME, parameters, dimensionlessInputs, inequalities);\n\n/** Reynolds-number ceiling of the Stokes–Einstein derivation: a chosen threshold for Re ≪ 1. @internal */\nconst STOKES_MAX_RE = 0.1;\n\n/** Ceiling of τ_p/t = m/(γt) for the overdamped limit: a chosen threshold for ≪ 1. @internal */\nconst STOKES_MAX_TAU_RATIO = 0.01;\n\n/** Bridge: Langevin → Fick, the Einstein coarse-graining D = k_BT/γ. @internal */\nexport const BRIDGE_LANGEVIN_DIFFUSION: AtlasBridge = {\n id: 'ab-langevin-diffusion',\n relation: 'coarse-graining',\n premises: ['model-langevin'],\n conclusion: 'model-fick',\n transformation: 'average over times t ≫ τ_p = m/γ: ⟨x²⟩ → 2Dt with D = k_B T/γ (Einstein)',\n preserves: ['the long-time mean-square displacement', 'the equilibrium velocity variance k_B T/m'],\n doesNotPreserve: [\n 'the velocity as a state variable',\n 'the ballistic regime t ≲ τ_p, where ⟨x²⟩ ≈ (k_B T/m) t²',\n 'the momentum relaxation time τ_p as an independent scale',\n ],\n sideConditions: ['overdamped observation times: τ_p/t ≪ 1', 'white thermal noise, fluctuation–dissipation 2γk_BT'],\n regime: regime(\n [\n { name: 'm', dim: MASS },\n { name: 'gamma', dim: DAMPING },\n { name: 'kT', dim: ENERGY },\n { name: 'D', dim: DIFFUSIVITY },\n { name: 't', dim: TIME },\n ],\n [\n {\n group: 'm · gamma^-1 · t^-1',\n op: '<=',\n bound: LANGEVIN_MAX_TAU_RATIO,\n alias: 'τ_p/t ≪ 1 (machine form ≤ 0.01)',\n },\n ],\n ),\n counterexamples: [\n {\n description:\n 'At t = 0.1 τ_p the Langevin mean-square displacement is 0.048 of 2Dt: the particle is ' +\n 'still ballistic, ⟨x²⟩ ≈ (k_BT/m)t², and the diffusion model does not describe it.',\n witness: 'WD4b',\n },\n ],\n witnesses: [\n {\n id: 'WD4',\n kind: 'numeric',\n test: TEST,\n tolerance: '⟨x²⟩/(2Dt) within 0.02 of 1 at t = 100 τ_p, from the Langevin moment equations by RK4',\n },\n {\n id: 'WD4b',\n kind: 'numeric',\n test: TEST,\n tolerance: '⟨x²⟩/(2Dt) = 0.0484 at t = 0.1 τ_p',\n },\n ],\n citations: [\n 'Uhlenbeck & Ornstein, Phys. Rev. 36 (1930) 823 - On the theory of the Brownian motion',\n 'Einstein, Ann. Phys. 17 (1905) 549 - the relation D = k_B T/γ',\n ],\n reviewStatus: 'proposed',\n};\n\n/**\n * Bridge: Langevin + Stokes drag → Fick with the Stokes–Einstein coefficient.\n *\n * A HYPEREDGE: the Langevin model supplies D = k_BT/γ with γ free; Stokes drag\n * supplies γ = 6πηa for a sphere. Neither alone gives D in terms of the fluid.\n *\n * @internal\n */\nexport const BRIDGE_STOKES_EINSTEIN: AtlasBridge = {\n id: 'ab-stokes-einstein',\n relation: 'derivation',\n premises: ['model-langevin', 'model-stokes-drag'],\n conclusion: 'model-fick',\n transformation: 'substitute γ = 6πηa into D = k_B T/γ: D = k_B T/(6πηa)',\n preserves: ['the long-time diffusion coefficient of a sphere'],\n doesNotPreserve: ['the particle mass (it drops out)', 'the shape beyond the radius a'],\n sideConditions: [\n 'creeping flow around the sphere, Re ≪ 1 (machine form Re ≤ 0.1: a chosen threshold for \"≪ 1\")',\n 'no-slip boundary',\n 'overdamped times t ≫ m/γ (machine form m/(γt) ≤ 0.01: a chosen threshold for \"≪ 1\", as in ab-langevin-diffusion)',\n ],\n // The prose conditions were not machine-checked, so `upt regime` reported this\n // bridge VACUOUS and \"valid\" at Re = 1000 (persona finding L8). Re is a\n // dimensionless input of the flow; m/(γt) is listed first so its π-group key is\n // the one ab-langevin-diffusion uses, and one --at value checks both bridges.\n regime: regimeWithInputs(\n [\n { name: 'm', dim: MASS },\n { name: 'gamma', dim: DAMPING },\n { name: 't', dim: TIME },\n { name: 'kT', dim: ENERGY },\n { name: 'eta', dim: VISCOSITY },\n { name: 'a', dim: LENGTH },\n { name: 'D', dim: DIFFUSIVITY },\n ],\n ['Re'],\n [\n { group: 'Re', op: '<=', bound: STOKES_MAX_RE, alias: 'Re ≪ 1 (machine form Re ≤ 0.1)' },\n {\n group: 'm · gamma^-1 · t^-1',\n op: '<=',\n bound: STOKES_MAX_TAU_RATIO,\n alias: 'τ_p/t ≪ 1 (machine form m/(γt) ≤ 0.01)',\n },\n ],\n ),\n counterexamples: [],\n witnesses: [\n {\n id: 'WD5',\n kind: 'numeric',\n test: TEST,\n tolerance:\n 'agrees with CE-stokes-einstein to 1e-12 relative; a sphere of radius a = 0.5 µm (1 µm diameter) in water ' +\n 'at T = 293.15 K, η = 1.0016e-3 Pa·s gives D = 4.29e-13 m²/s',\n },\n {\n id: 'WD5s',\n kind: 'symbolic',\n test: WITNESS_RESULTS_TEST,\n tolerance: 'CAS: k_BT/γ under γ ↦ 6πηa minus k_BT/(6πηa) simplifies to literal 0',\n },\n ],\n citations: [\n 'Einstein, Ann. Phys. 17 (1905) 549 - Brownian motion of a sphere, D = k_B T/(6πηa)',\n 'Stokes, Trans. Camb. Phil. Soc. 9 (1851) 8 - the drag on a sphere in creeping flow',\n ],\n reviewStatus: 'proposed',\n};\n\n/**\n * Bridge: telegraph → Fick, the SINGULAR limit τ → 0.\n *\n * Singular because the highest time derivative is lost: the telegraph equation\n * needs two initial conditions and diffusion takes one, so a fast mode\n * `e^{−t/τ}` forms an initial layer. The bound therefore holds only AFTER that\n * layer, and the machine horizon has a LOWER edge as well as an upper one.\n *\n * @internal\n */\nexport const BRIDGE_TELEGRAPH_DIFFUSION: AtlasBridge = {\n id: 'ab-telegraph-diffusion',\n relation: 'approximation',\n premises: ['model-telegraph'],\n conclusion: 'model-fick',\n transformation: 'drop τ u_tt: the slow mode decays at Dq²(1 + ε + 2ε² + …) → Dq², ε = τDq²',\n preserves: ['the slow decay rate of each Fourier mode to O(ε)', 'the total amount ∫u dx'],\n doesNotPreserve: [\n 'the finite signal speed √(D/τ)',\n 'the second initial condition u_t(x, 0)',\n 'oscillatory modes, which exist for ε > 1/4',\n ],\n sideConditions: ['ε = τDq² ≤ 0.05', 'after the initial layer: t ≫ τ'],\n bound: makeApproximation({\n K: 1,\n delta: telegraphSlowRateExcess(TELEGRAPH_FICK_MAX_EPS, 1, 1),\n deltaAt: (p) =>\n telegraphSlowRateExcess(p['tau'] ?? Number.NaN, p['D'] ?? Number.NaN, p['q'] ?? Number.NaN),\n deltaAtBasis: 'closed-form',\n norm: 'relative error of the slow-mode decay rate of a Fourier mode, normalized by the value of the reduced model',\n domain: 'ε = τDq² ≤ 0.05',\n horizon:\n 'τ ≪ t ≪ 1/(δ D q²): after the initial layer and before the decay-rate error accumulates; ' +\n 'machine form 5τ < t < 0.1/(δ D q²)',\n horizonHolds: (t, p) => {\n const { tau, D, q } = p;\n if (tau === undefined || D === undefined || q === undefined) return false;\n const delta = telegraphSlowRateExcess(tau, D, q);\n if (!Number.isFinite(delta)) return false;\n if (t <= 5 * tau) return false;\n return delta === 0 || t < 0.1 / (delta * D * q * q);\n },\n parameterRange: 'ε = τDq² ≤ 0.05',\n limitCharacter: 'singular',\n // A slow-mode decay-rate error. The horizon says that error accumulates,\n // so time is not listed.\n uniformity: ['slow-mode decay rate of one Fourier mode, for ε = τDq² ≤ 0.05'],\n }),\n regime: regime(\n [\n { name: 'tau', dim: TIME },\n { name: 'D', dim: DIFFUSIVITY },\n { name: 'q', dim: WAVENUMBER },\n ],\n [{ group: 'tau · D · q^2', op: '<=', bound: TELEGRAPH_FICK_MAX_EPS, alias: 'ε = τDq² ≤ 0.05' }],\n ),\n counterexamples: [\n {\n description:\n 'At ε = τDq² = 1 the telegraph mode is OSCILLATORY (complex rate, NaN on the slow branch): ' +\n 'no diffusion mode oscillates.',\n witness: 'WD6b',\n },\n ],\n witnesses: [\n {\n id: 'WD6',\n kind: 'numeric',\n test: TEST,\n tolerance: 'slow rate / Dq² within 0.03 of 1 at τ = 0.025 (D = q = 1); error halves with τ',\n },\n {\n id: 'WD6b',\n kind: 'numeric',\n test: TEST,\n tolerance: 'no real slow rate at ε = 1',\n },\n ],\n citations: [\n 'Cattaneo, Atti Sem. Mat. Fis. Univ. Modena 3 (1948) 83 - heat conduction with a relaxation time',\n 'Goldstein, Q. J. Mech. Appl. Math. 4 (1951) 129 - On diffusion by discontinuous movements, and on the telegraph equation',\n ],\n reviewStatus: 'proposed',\n formalRef: physjsFormalRef('ab-telegraph-diffusion'),\n};\n\n/**\n * Bridge: telegraph → 1-D wave, for strongly underdamped modes over short times.\n *\n * @internal\n */\nexport const BRIDGE_TELEGRAPH_WAVE: AtlasBridge = {\n id: 'ab-telegraph-wave',\n relation: 'approximation',\n premises: ['model-telegraph'],\n conclusion: 'model-wave-1d',\n transformation: 'drop u_t: τ u_tt = D u_xx, a wave with c² = D/τ',\n preserves: ['the signal speed √(D/τ)', 'the oscillation frequency to O(1/ε)'],\n doesNotPreserve: ['damping: telegraph modes decay as e^{−t/(2τ)}', 'relaxation to diffusion at long times'],\n sideConditions: ['ε = τDq² ≥ 25', 'short times t ≪ τ (the bound is not uniform in time)'],\n bound: makeApproximation({\n K: 1,\n delta: 1 - telegraphWaveFrequencyRatio(TELEGRAPH_WAVE_MIN_EPS, 1, 1),\n deltaAt: (p) =>\n 1 - telegraphWaveFrequencyRatio(p['tau'] ?? Number.NaN, p['D'] ?? Number.NaN, p['q'] ?? Number.NaN),\n deltaAtBasis: 'closed-form',\n norm: 'relative error of the oscillation frequency of a Fourier mode, normalized by the value of the reduced model',\n domain: 'ε = τDq² ≥ 25',\n horizon:\n 't ≪ τ: before damping e^{−t/(2τ)} removes 10% of the amplitude; machine form t < 2τ ln(10/9)',\n horizonHolds: (t, p) => {\n const { tau } = p;\n if (tau === undefined || !(tau > 0)) return false;\n return t >= 0 && t < 2 * tau * Math.log(10 / 9);\n },\n parameterRange: 'ε = τDq² ≥ 25',\n limitCharacter: 'regular',\n // An oscillation-frequency error. The record says it is not uniform in time.\n uniformity: ['oscillation frequency of one Fourier mode, for ε = τDq² ≥ 25'],\n }),\n regime: regime(\n [\n { name: 'tau', dim: TIME },\n { name: 'D', dim: DIFFUSIVITY },\n { name: 'q', dim: WAVENUMBER },\n { name: 'c', dim: VELOCITY },\n ],\n [{ group: 'tau · D · q^2', op: '>=', bound: TELEGRAPH_WAVE_MIN_EPS, alias: 'ε = τDq² ≥ 25' }],\n ),\n counterexamples: [],\n witnesses: [\n {\n id: 'WD7',\n kind: 'numeric',\n test: TEST,\n tolerance: 'frequency ratio within 3e-3 of 1 at ε = 50; error halves as ε doubles',\n },\n ],\n citations: ['Goldstein, Q. J. Mech. Appl. Math. 4 (1951) 129 - On diffusion by discontinuous movements, and on the telegraph equation'],\n reviewStatus: 'proposed',\n formalRef: physjsFormalRef('ab-telegraph-wave'),\n};\n\n/** Bridge: heat → Laplace, the steady-state restriction. @internal */\nexport const BRIDGE_HEAT_LAPLACE: AtlasBridge = {\n id: 'ab-heat-laplace',\n relation: 'restriction',\n premises: ['model-heat'],\n conclusion: 'model-laplace-1d',\n transformation: '∂T/∂t = 0: κ T_xx = 0, T linear between the end temperatures',\n preserves: ['the end temperatures', 'the steady heat flux κ(T_b − T_a)/ℓ'],\n doesNotPreserve: ['the transient', 'ρ and c_p, which drop out of the steady state'],\n sideConditions: ['fixed end temperatures', 'Fourier number αt/ℓ² ≥ 1 (transients decayed)'],\n regime: regime(\n [\n { name: 'kappa', dim: THERMAL_CONDUCTIVITY },\n { name: 'rho', dim: DENSITY },\n { name: 'cp', dim: SPECIFIC_HEAT },\n { name: 'ell', dim: LENGTH },\n { name: 't', dim: TIME },\n ],\n [\n {\n group: 'kappa · rho^-1 · cp^-1 · ell^-2 · t',\n op: '>=',\n bound: STEADY_MIN_FOURIER,\n alias: 'Fo = αt/ℓ² ≥ 1',\n },\n ],\n ),\n counterexamples: [],\n witnesses: [\n {\n id: 'WD8',\n kind: 'numeric',\n test: TEST,\n tolerance: 'max deviation from the linear profile below 0.025 at αt/ℓ² = 0.4; shrinks with time',\n },\n ],\n citations: ['Carslaw & Jaeger, Conduction of Heat in Solids - steady linear flow in a slab'],\n reviewStatus: 'proposed',\n};\n\n/** The diffusion-family closure bridges. @internal */\nexport const DIFFUSION_CLOSURE_BRIDGES: readonly AtlasBridge[] = [\n BRIDGE_LANGEVIN_DIFFUSION,\n BRIDGE_STOKES_EINSTEIN,\n BRIDGE_TELEGRAPH_DIFFUSION,\n BRIDGE_TELEGRAPH_WAVE,\n BRIDGE_HEAT_LAPLACE,\n];\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"bridges.d.ts","sourceRoot":"","sources":["../../../src/atlas/diffusion/bridges.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAO/C,qGAAqG;AACrG,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C,kFAAkF;AAClF,eAAO,MAAM,qBAAqB,EAAE,WAuEnC,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,EAAE,WA0DnC,CAAC;AAEF,6EAA6E;AAC7E,eAAO,MAAM,4BAA4B,EAAE,WAkE1C,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,iBAAiB,EAAE,SAAS,WAAW,EAInD,CAAC"}
1
+ {"version":3,"file":"bridges.d.ts","sourceRoot":"","sources":["../../../src/atlas/diffusion/bridges.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAO/C,qGAAqG;AACrG,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C,kFAAkF;AAClF,eAAO,MAAM,qBAAqB,EAAE,WAoEnC,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,EAAE,WAuDnC,CAAC;AAEF,6EAA6E;AAC7E,eAAO,MAAM,4BAA4B,EAAE,WA+D1C,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,iBAAiB,EAAE,SAAS,WAAW,EAInD,CAAC"}