universal-physics-tensor 10.0.0 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (720) hide show
  1. package/README.md +4 -3
  2. package/bin/upt.mjs +13 -1
  3. package/data/atlas/atlas.json +25 -25
  4. package/data/atlas/atlas.jsonld +1 -1
  5. package/data/atlas/diffusion.json +6 -6
  6. package/data/atlas/oscillators.json +7 -7
  7. package/data/atlas/waves.json +14 -14
  8. package/data/atlas/witness-results.json +11 -11
  9. package/data/bridge-catalog.json +371 -228
  10. package/data/bridge-catalog.schema.json +45 -7
  11. package/dist/atlas/applicability.d.ts.map +1 -1
  12. package/dist/atlas/applicability.js +21 -15
  13. package/dist/atlas/applicability.js.map +1 -1
  14. package/dist/atlas/benchmark/hybrid-retrieval.d.ts +9 -1
  15. package/dist/atlas/benchmark/hybrid-retrieval.d.ts.map +1 -1
  16. package/dist/atlas/benchmark/hybrid-retrieval.js +15 -13
  17. package/dist/atlas/benchmark/hybrid-retrieval.js.map +1 -1
  18. package/dist/atlas/benchmark/loader.js +2 -2
  19. package/dist/atlas/benchmark/loader.js.map +1 -1
  20. package/dist/atlas/benchmark/stats.d.ts +2 -2
  21. package/dist/atlas/benchmark/stats.d.ts.map +1 -1
  22. package/dist/atlas/benchmark/stats.js +15 -7
  23. package/dist/atlas/benchmark/stats.js.map +1 -1
  24. package/dist/atlas/catalog-formal-ref.d.ts +26 -3
  25. package/dist/atlas/catalog-formal-ref.d.ts.map +1 -1
  26. package/dist/atlas/catalog-formal-ref.js +52 -5
  27. package/dist/atlas/catalog-formal-ref.js.map +1 -1
  28. package/dist/atlas/chain-pipeline.d.ts.map +1 -1
  29. package/dist/atlas/chain-pipeline.js +7 -8
  30. package/dist/atlas/chain-pipeline.js.map +1 -1
  31. package/dist/atlas/diffusion/bridges-closure.d.ts +0 -4
  32. package/dist/atlas/diffusion/bridges-closure.d.ts.map +1 -1
  33. package/dist/atlas/diffusion/bridges-closure.js +8 -12
  34. package/dist/atlas/diffusion/bridges-closure.js.map +1 -1
  35. package/dist/atlas/diffusion/bridges.d.ts.map +1 -1
  36. package/dist/atlas/diffusion/bridges.js +27 -39
  37. package/dist/atlas/diffusion/bridges.js.map +1 -1
  38. package/dist/atlas/diffusion/dimensions.d.ts +6 -14
  39. package/dist/atlas/diffusion/dimensions.d.ts.map +1 -1
  40. package/dist/atlas/diffusion/dimensions.js +8 -16
  41. package/dist/atlas/diffusion/dimensions.js.map +1 -1
  42. package/dist/atlas/diffusion/models.d.ts +3 -3
  43. package/dist/atlas/diffusion/models.d.ts.map +1 -1
  44. package/dist/atlas/diffusion/models.js +5 -10
  45. package/dist/atlas/diffusion/models.js.map +1 -1
  46. package/dist/atlas/diffusion/numerics.d.ts +16 -4
  47. package/dist/atlas/diffusion/numerics.d.ts.map +1 -1
  48. package/dist/atlas/diffusion/numerics.js +38 -24
  49. package/dist/atlas/diffusion/numerics.js.map +1 -1
  50. package/dist/atlas/link-prediction.d.ts +106 -3
  51. package/dist/atlas/link-prediction.d.ts.map +1 -1
  52. package/dist/atlas/link-prediction.js +212 -66
  53. package/dist/atlas/link-prediction.js.map +1 -1
  54. package/dist/atlas/oscillators/bridges-coarse.d.ts.map +1 -1
  55. package/dist/atlas/oscillators/bridges-coarse.js +7 -11
  56. package/dist/atlas/oscillators/bridges-coarse.js.map +1 -1
  57. package/dist/atlas/oscillators/bridges-exact.d.ts.map +1 -1
  58. package/dist/atlas/oscillators/bridges-exact.js +6 -7
  59. package/dist/atlas/oscillators/bridges-exact.js.map +1 -1
  60. package/dist/atlas/oscillators/bridges-limits.d.ts +3 -16
  61. package/dist/atlas/oscillators/bridges-limits.d.ts.map +1 -1
  62. package/dist/atlas/oscillators/bridges-limits.js +23 -34
  63. package/dist/atlas/oscillators/bridges-limits.js.map +1 -1
  64. package/dist/atlas/oscillators/dimensions.d.ts +9 -21
  65. package/dist/atlas/oscillators/dimensions.d.ts.map +1 -1
  66. package/dist/atlas/oscillators/dimensions.js +9 -21
  67. package/dist/atlas/oscillators/dimensions.js.map +1 -1
  68. package/dist/atlas/oscillators/limit-witnesses.d.ts +2 -2
  69. package/dist/atlas/oscillators/limit-witnesses.d.ts.map +1 -1
  70. package/dist/atlas/oscillators/limit-witnesses.js +17 -15
  71. package/dist/atlas/oscillators/limit-witnesses.js.map +1 -1
  72. package/dist/atlas/oscillators/models.d.ts.map +1 -1
  73. package/dist/atlas/oscillators/models.js +2 -6
  74. package/dist/atlas/oscillators/models.js.map +1 -1
  75. package/dist/atlas/oscillators/pendulum-motion.d.ts +29 -6
  76. package/dist/atlas/oscillators/pendulum-motion.d.ts.map +1 -1
  77. package/dist/atlas/oscillators/pendulum-motion.js +60 -40
  78. package/dist/atlas/oscillators/pendulum-motion.js.map +1 -1
  79. package/dist/atlas/oscillators/phase-translation.d.ts +0 -11
  80. package/dist/atlas/oscillators/phase-translation.d.ts.map +1 -1
  81. package/dist/atlas/oscillators/phase-translation.js +3 -4
  82. package/dist/atlas/oscillators/phase-translation.js.map +1 -1
  83. package/dist/atlas/oscillators/position-translation.d.ts +68 -7
  84. package/dist/atlas/oscillators/position-translation.d.ts.map +1 -1
  85. package/dist/atlas/oscillators/position-translation.js +123 -12
  86. package/dist/atlas/oscillators/position-translation.js.map +1 -1
  87. package/dist/atlas/oscillators/rejections.d.ts +0 -2
  88. package/dist/atlas/oscillators/rejections.d.ts.map +1 -1
  89. package/dist/atlas/oscillators/rejections.js +0 -7
  90. package/dist/atlas/oscillators/rejections.js.map +1 -1
  91. package/dist/atlas/physjs-entries.generated.d.ts +25 -24
  92. package/dist/atlas/physjs-entries.generated.d.ts.map +1 -1
  93. package/dist/atlas/physjs-entries.generated.js +25 -24
  94. package/dist/atlas/physjs-entries.generated.js.map +1 -1
  95. package/dist/atlas/physjs-ref.d.ts +34 -31
  96. package/dist/atlas/physjs-ref.d.ts.map +1 -1
  97. package/dist/atlas/physjs-ref.js +55 -53
  98. package/dist/atlas/physjs-ref.js.map +1 -1
  99. package/dist/atlas/physjs-reviewed.d.ts +1 -1
  100. package/dist/atlas/physjs-reviewed.js +15 -15
  101. package/dist/atlas/physjs-reviewed.js.map +1 -1
  102. package/dist/atlas/poster/statements.d.ts +0 -19
  103. package/dist/atlas/poster/statements.d.ts.map +1 -1
  104. package/dist/atlas/poster/statements.js +1 -1
  105. package/dist/atlas/poster/statements.js.map +1 -1
  106. package/dist/atlas/proof-target.d.ts +1 -1
  107. package/dist/atlas/proof-target.js +1 -1
  108. package/dist/atlas/proof-target.js.map +1 -1
  109. package/dist/atlas/regime.d.ts +1 -1
  110. package/dist/atlas/regime.d.ts.map +1 -1
  111. package/dist/atlas/regime.js +1 -1
  112. package/dist/atlas/regime.js.map +1 -1
  113. package/dist/atlas/text-overlap.d.ts +23 -0
  114. package/dist/atlas/text-overlap.d.ts.map +1 -0
  115. package/dist/atlas/text-overlap.js +41 -0
  116. package/dist/atlas/text-overlap.js.map +1 -0
  117. package/dist/atlas/waves/bridges-closure.d.ts.map +1 -1
  118. package/dist/atlas/waves/bridges-closure.js +2 -6
  119. package/dist/atlas/waves/bridges-closure.js.map +1 -1
  120. package/dist/atlas/waves/bridges.d.ts.map +1 -1
  121. package/dist/atlas/waves/bridges.js +32 -48
  122. package/dist/atlas/waves/bridges.js.map +1 -1
  123. package/dist/atlas/waves/models.d.ts +5 -6
  124. package/dist/atlas/waves/models.d.ts.map +1 -1
  125. package/dist/atlas/waves/models.js +7 -13
  126. package/dist/atlas/waves/models.js.map +1 -1
  127. package/dist/atlas/waves/numerics.d.ts.map +1 -1
  128. package/dist/atlas/waves/numerics.js +10 -3
  129. package/dist/atlas/waves/numerics.js.map +1 -1
  130. package/dist/atlas/witness-numeric.d.ts +30 -0
  131. package/dist/atlas/witness-numeric.d.ts.map +1 -1
  132. package/dist/atlas/witness-numeric.js +53 -0
  133. package/dist/atlas/witness-numeric.js.map +1 -1
  134. package/dist/atlas/witness-specs.d.ts.map +1 -1
  135. package/dist/atlas/witness-specs.js +19 -0
  136. package/dist/atlas/witness-specs.js.map +1 -1
  137. package/dist/atlas/witness-symbolic.d.ts +75 -3
  138. package/dist/atlas/witness-symbolic.d.ts.map +1 -1
  139. package/dist/atlas/witness-symbolic.js +116 -10
  140. package/dist/atlas/witness-symbolic.js.map +1 -1
  141. package/dist/bridges/catalog-load.d.ts.map +1 -1
  142. package/dist/bridges/catalog-load.js +13 -8
  143. package/dist/bridges/catalog-load.js.map +1 -1
  144. package/dist/bridges/catalog-types.d.ts +26 -2
  145. package/dist/bridges/catalog-types.d.ts.map +1 -1
  146. package/dist/bridges/catalog-types.js +11 -1
  147. package/dist/bridges/catalog-types.js.map +1 -1
  148. package/dist/bridges/evaluation-errors.d.ts +31 -1
  149. package/dist/bridges/evaluation-errors.d.ts.map +1 -1
  150. package/dist/bridges/evaluation-errors.js +20 -2
  151. package/dist/bridges/evaluation-errors.js.map +1 -1
  152. package/dist/bridges/evaluator-inputs.d.ts.map +1 -1
  153. package/dist/bridges/evaluator-inputs.js +7 -5
  154. package/dist/bridges/evaluator-inputs.js.map +1 -1
  155. package/dist/bridges/evaluators.d.ts.map +1 -1
  156. package/dist/bridges/evaluators.js +27 -12
  157. package/dist/bridges/evaluators.js.map +1 -1
  158. package/dist/bridges/expr-parse.d.ts +11 -0
  159. package/dist/bridges/expr-parse.d.ts.map +1 -1
  160. package/dist/bridges/expr-parse.js +14 -5
  161. package/dist/bridges/expr-parse.js.map +1 -1
  162. package/dist/bridges/holds.d.ts +35 -3
  163. package/dist/bridges/holds.d.ts.map +1 -1
  164. package/dist/bridges/holds.js +117 -23
  165. package/dist/bridges/holds.js.map +1 -1
  166. package/dist/bridges/notices.d.ts.map +1 -1
  167. package/dist/bridges/notices.js +5 -5
  168. package/dist/bridges/notices.js.map +1 -1
  169. package/dist/bridges/relation-eval.d.ts +4 -4
  170. package/dist/bridges/relation-eval.d.ts.map +1 -1
  171. package/dist/bridges/relation-eval.js +15 -16
  172. package/dist/bridges/relation-eval.js.map +1 -1
  173. package/dist/bridges/sensitivity.d.ts.map +1 -1
  174. package/dist/bridges/sensitivity.js +3 -3
  175. package/dist/bridges/sensitivity.js.map +1 -1
  176. package/dist/bridges/validity.d.ts +33 -0
  177. package/dist/bridges/validity.d.ts.map +1 -0
  178. package/dist/bridges/validity.js +67 -0
  179. package/dist/bridges/validity.js.map +1 -0
  180. package/dist/canonical/entries/atomic.js +1 -3
  181. package/dist/canonical/entries/atomic.js.map +1 -1
  182. package/dist/canonical/entries/condensed-matter.d.ts.map +1 -1
  183. package/dist/canonical/entries/condensed-matter.js +4 -5
  184. package/dist/canonical/entries/condensed-matter.js.map +1 -1
  185. package/dist/canonical/entries/dimensional-classics.d.ts.map +1 -1
  186. package/dist/canonical/entries/dimensional-classics.js +3 -4
  187. package/dist/canonical/entries/dimensional-classics.js.map +1 -1
  188. package/dist/canonical/entries/electromagnetism.d.ts.map +1 -1
  189. package/dist/canonical/entries/electromagnetism.js +4 -10
  190. package/dist/canonical/entries/electromagnetism.js.map +1 -1
  191. package/dist/canonical/entries/fluids-waves.d.ts.map +1 -1
  192. package/dist/canonical/entries/fluids-waves.js +3 -7
  193. package/dist/canonical/entries/fluids-waves.js.map +1 -1
  194. package/dist/canonical/entries/mechanics.d.ts.map +1 -1
  195. package/dist/canonical/entries/mechanics.js +4 -6
  196. package/dist/canonical/entries/mechanics.js.map +1 -1
  197. package/dist/canonical/entries/nonmonomial.d.ts.map +1 -1
  198. package/dist/canonical/entries/nonmonomial.js +9 -17
  199. package/dist/canonical/entries/nonmonomial.js.map +1 -1
  200. package/dist/canonical/entries/relativity.d.ts.map +1 -1
  201. package/dist/canonical/entries/relativity.js +6 -6
  202. package/dist/canonical/entries/relativity.js.map +1 -1
  203. package/dist/canonical/entries/thermo-nuclear-cosmo.d.ts.map +1 -1
  204. package/dist/canonical/entries/thermo-nuclear-cosmo.js +6 -10
  205. package/dist/canonical/entries/thermo-nuclear-cosmo.js.map +1 -1
  206. package/dist/canonical/fixed-points.d.ts +94 -0
  207. package/dist/canonical/fixed-points.d.ts.map +1 -0
  208. package/dist/canonical/fixed-points.js +81 -0
  209. package/dist/canonical/fixed-points.js.map +1 -0
  210. package/dist/canonical/linkage.d.ts.map +1 -1
  211. package/dist/canonical/linkage.js +25 -44
  212. package/dist/canonical/linkage.js.map +1 -1
  213. package/dist/canonical/normal-form.d.ts.map +1 -1
  214. package/dist/canonical/normal-form.js +5 -11
  215. package/dist/canonical/normal-form.js.map +1 -1
  216. package/dist/canonical/structural.d.ts +21 -21
  217. package/dist/canonical/structural.d.ts.map +1 -1
  218. package/dist/canonical/structural.js +40 -19
  219. package/dist/canonical/structural.js.map +1 -1
  220. package/dist/cases/brownian-sphere.d.ts +3 -3
  221. package/dist/cases/brownian-sphere.d.ts.map +1 -1
  222. package/dist/cases/brownian-sphere.js +6 -5
  223. package/dist/cases/brownian-sphere.js.map +1 -1
  224. package/dist/cases/damped-resonator.d.ts.map +1 -1
  225. package/dist/cases/damped-resonator.js +6 -9
  226. package/dist/cases/damped-resonator.js.map +1 -1
  227. package/dist/cases/kepler-rv.d.ts +1 -1
  228. package/dist/cases/kepler-rv.d.ts.map +1 -1
  229. package/dist/cases/kepler-rv.js +3 -2
  230. package/dist/cases/kepler-rv.js.map +1 -1
  231. package/dist/cases/lumped-cooling.d.ts +8 -3
  232. package/dist/cases/lumped-cooling.d.ts.map +1 -1
  233. package/dist/cases/lumped-cooling.js +21 -23
  234. package/dist/cases/lumped-cooling.js.map +1 -1
  235. package/dist/cases/quadrature.d.ts +7 -9
  236. package/dist/cases/quadrature.d.ts.map +1 -1
  237. package/dist/cases/quadrature.js +28 -32
  238. package/dist/cases/quadrature.js.map +1 -1
  239. package/dist/cases/resistor-noise.js +4 -4
  240. package/dist/cases/resistor-noise.js.map +1 -1
  241. package/dist/cases/skin-depth.d.ts +0 -4
  242. package/dist/cases/skin-depth.d.ts.map +1 -1
  243. package/dist/cases/skin-depth.js +3 -7
  244. package/dist/cases/skin-depth.js.map +1 -1
  245. package/dist/cli/args.d.ts +23 -1
  246. package/dist/cli/args.d.ts.map +1 -1
  247. package/dist/cli/args.js +30 -8
  248. package/dist/cli/args.js.map +1 -1
  249. package/dist/cli/bindings.d.ts.map +1 -1
  250. package/dist/cli/bindings.js +5 -4
  251. package/dist/cli/bindings.js.map +1 -1
  252. package/dist/cli/command.d.ts +8 -1
  253. package/dist/cli/command.d.ts.map +1 -1
  254. package/dist/cli/command.js.map +1 -1
  255. package/dist/cli/commands/_atlas-map.d.ts +0 -9
  256. package/dist/cli/commands/_atlas-map.d.ts.map +1 -1
  257. package/dist/cli/commands/_atlas-map.js +8 -18
  258. package/dist/cli/commands/_atlas-map.js.map +1 -1
  259. package/dist/cli/commands/_atlas-route.d.ts.map +1 -1
  260. package/dist/cli/commands/_atlas-route.js +6 -2
  261. package/dist/cli/commands/_atlas-route.js.map +1 -1
  262. package/dist/cli/commands/_discovery-opts.d.ts.map +1 -1
  263. package/dist/cli/commands/_discovery-opts.js +8 -9
  264. package/dist/cli/commands/_discovery-opts.js.map +1 -1
  265. package/dist/cli/commands/atlas.d.ts.map +1 -1
  266. package/dist/cli/commands/atlas.js +8 -5
  267. package/dist/cli/commands/atlas.js.map +1 -1
  268. package/dist/cli/commands/audit.d.ts.map +1 -1
  269. package/dist/cli/commands/audit.js +8 -1
  270. package/dist/cli/commands/audit.js.map +1 -1
  271. package/dist/cli/commands/axes.d.ts.map +1 -1
  272. package/dist/cli/commands/axes.js +20 -1
  273. package/dist/cli/commands/axes.js.map +1 -1
  274. package/dist/cli/commands/confront.d.ts.map +1 -1
  275. package/dist/cli/commands/confront.js +8 -14
  276. package/dist/cli/commands/confront.js.map +1 -1
  277. package/dist/cli/commands/derive.d.ts.map +1 -1
  278. package/dist/cli/commands/derive.js +22 -22
  279. package/dist/cli/commands/derive.js.map +1 -1
  280. package/dist/cli/commands/discover.d.ts.map +1 -1
  281. package/dist/cli/commands/discover.js +6 -2
  282. package/dist/cli/commands/discover.js.map +1 -1
  283. package/dist/cli/commands/eval.d.ts.map +1 -1
  284. package/dist/cli/commands/eval.js +1 -0
  285. package/dist/cli/commands/eval.js.map +1 -1
  286. package/dist/cli/commands/evaluate.d.ts.map +1 -1
  287. package/dist/cli/commands/evaluate.js +65 -37
  288. package/dist/cli/commands/evaluate.js.map +1 -1
  289. package/dist/cli/commands/explain.d.ts.map +1 -1
  290. package/dist/cli/commands/explain.js +2 -1
  291. package/dist/cli/commands/explain.js.map +1 -1
  292. package/dist/cli/commands/ground.d.ts.map +1 -1
  293. package/dist/cli/commands/ground.js +1 -0
  294. package/dist/cli/commands/ground.js.map +1 -1
  295. package/dist/cli/commands/map.d.ts.map +1 -1
  296. package/dist/cli/commands/map.js +75 -5
  297. package/dist/cli/commands/map.js.map +1 -1
  298. package/dist/cli/commands/metric.d.ts.map +1 -1
  299. package/dist/cli/commands/metric.js +12 -9
  300. package/dist/cli/commands/metric.js.map +1 -1
  301. package/dist/cli/commands/path.d.ts +10 -0
  302. package/dist/cli/commands/path.d.ts.map +1 -1
  303. package/dist/cli/commands/path.js +25 -3
  304. package/dist/cli/commands/path.js.map +1 -1
  305. package/dist/cli/commands/probe.d.ts.map +1 -1
  306. package/dist/cli/commands/probe.js +59 -16
  307. package/dist/cli/commands/probe.js.map +1 -1
  308. package/dist/cli/commands/regime.d.ts.map +1 -1
  309. package/dist/cli/commands/regime.js +1 -0
  310. package/dist/cli/commands/regime.js.map +1 -1
  311. package/dist/cli/commands/retrieve.d.ts.map +1 -1
  312. package/dist/cli/commands/retrieve.js +1 -0
  313. package/dist/cli/commands/retrieve.js.map +1 -1
  314. package/dist/cli/commands/search.d.ts.map +1 -1
  315. package/dist/cli/commands/search.js +1 -0
  316. package/dist/cli/commands/search.js.map +1 -1
  317. package/dist/cli/commands/symbolic.d.ts.map +1 -1
  318. package/dist/cli/commands/symbolic.js +19 -28
  319. package/dist/cli/commands/symbolic.js.map +1 -1
  320. package/dist/cli/commands/testplan.d.ts.map +1 -1
  321. package/dist/cli/commands/testplan.js +4 -2
  322. package/dist/cli/commands/testplan.js.map +1 -1
  323. package/dist/cli/expr-print.d.ts +0 -2
  324. package/dist/cli/expr-print.d.ts.map +1 -1
  325. package/dist/cli/expr-print.js +7 -31
  326. package/dist/cli/expr-print.js.map +1 -1
  327. package/dist/cli/main.d.ts +7 -0
  328. package/dist/cli/main.d.ts.map +1 -1
  329. package/dist/cli/main.js +18 -3
  330. package/dist/cli/main.js.map +1 -1
  331. package/dist/cli/numeric-flag.d.ts +12 -0
  332. package/dist/cli/numeric-flag.d.ts.map +1 -0
  333. package/dist/cli/numeric-flag.js +44 -0
  334. package/dist/cli/numeric-flag.js.map +1 -0
  335. package/dist/cli/output.d.ts +20 -0
  336. package/dist/cli/output.d.ts.map +1 -1
  337. package/dist/cli/output.js +15 -0
  338. package/dist/cli/output.js.map +1 -1
  339. package/dist/cli/record-reach.js +2 -2
  340. package/dist/cli/record-reach.js.map +1 -1
  341. package/dist/cli/record-tables.d.ts.map +1 -1
  342. package/dist/cli/record-tables.js +6 -5
  343. package/dist/cli/record-tables.js.map +1 -1
  344. package/dist/cli/record.d.ts +1 -5
  345. package/dist/cli/record.d.ts.map +1 -1
  346. package/dist/cli/record.js +9 -8
  347. package/dist/cli/record.js.map +1 -1
  348. package/dist/cli/search-index.d.ts.map +1 -1
  349. package/dist/cli/search-index.js +7 -6
  350. package/dist/cli/search-index.js.map +1 -1
  351. package/dist/cli/statuses.d.ts +0 -2
  352. package/dist/cli/statuses.d.ts.map +1 -1
  353. package/dist/cli/statuses.js +0 -7
  354. package/dist/cli/statuses.js.map +1 -1
  355. package/dist/cli/stored-results.d.ts +7 -0
  356. package/dist/cli/stored-results.d.ts.map +1 -0
  357. package/dist/cli/stored-results.js +23 -0
  358. package/dist/cli/stored-results.js.map +1 -0
  359. package/dist/cli/version.d.ts.map +1 -1
  360. package/dist/cli/version.js +7 -5
  361. package/dist/cli/version.js.map +1 -1
  362. package/dist/cli-api.d.ts +34 -5
  363. package/dist/cli-api.d.ts.map +1 -1
  364. package/dist/cli-api.js +28 -4
  365. package/dist/cli-api.js.map +1 -1
  366. package/dist/composition/algebraic-equivalence.d.ts +43 -0
  367. package/dist/composition/algebraic-equivalence.d.ts.map +1 -0
  368. package/dist/composition/algebraic-equivalence.js +115 -0
  369. package/dist/composition/algebraic-equivalence.js.map +1 -0
  370. package/dist/composition/axes.d.ts +0 -6
  371. package/dist/composition/axes.d.ts.map +1 -1
  372. package/dist/composition/axes.js +6 -6
  373. package/dist/composition/axes.js.map +1 -1
  374. package/dist/composition/axis-audit.d.ts +47 -20
  375. package/dist/composition/axis-audit.d.ts.map +1 -1
  376. package/dist/composition/axis-audit.js +82 -9
  377. package/dist/composition/axis-audit.js.map +1 -1
  378. package/dist/composition/bridge-analysis.d.ts +17 -0
  379. package/dist/composition/bridge-analysis.d.ts.map +1 -1
  380. package/dist/composition/bridge-analysis.js +102 -55
  381. package/dist/composition/bridge-analysis.js.map +1 -1
  382. package/dist/composition/canonical-compare.d.ts +40 -0
  383. package/dist/composition/canonical-compare.d.ts.map +1 -1
  384. package/dist/composition/canonical-compare.js +122 -24
  385. package/dist/composition/canonical-compare.js.map +1 -1
  386. package/dist/composition/canonical-graph.d.ts +1 -1
  387. package/dist/composition/canonical-graph.d.ts.map +1 -1
  388. package/dist/composition/canonical-graph.js +9 -36
  389. package/dist/composition/canonical-graph.js.map +1 -1
  390. package/dist/composition/canonical-json.js +2 -2
  391. package/dist/composition/canonical-json.js.map +1 -1
  392. package/dist/composition/catalog-graph.d.ts.map +1 -1
  393. package/dist/composition/catalog-graph.js +2 -5
  394. package/dist/composition/catalog-graph.js.map +1 -1
  395. package/dist/composition/chain-candidate.d.ts +8 -0
  396. package/dist/composition/chain-candidate.d.ts.map +1 -1
  397. package/dist/composition/chain-candidate.js +9 -2
  398. package/dist/composition/chain-candidate.js.map +1 -1
  399. package/dist/composition/chain-match.d.ts +6 -3
  400. package/dist/composition/chain-match.d.ts.map +1 -1
  401. package/dist/composition/chain-match.js +4 -1
  402. package/dist/composition/chain-match.js.map +1 -1
  403. package/dist/composition/chain-result.d.ts.map +1 -1
  404. package/dist/composition/chain-result.js +2 -14
  405. package/dist/composition/chain-result.js.map +1 -1
  406. package/dist/composition/compose-symbolic.d.ts.map +1 -1
  407. package/dist/composition/compose-symbolic.js +3 -2
  408. package/dist/composition/compose-symbolic.js.map +1 -1
  409. package/dist/composition/compose.d.ts.map +1 -1
  410. package/dist/composition/compose.js +13 -5
  411. package/dist/composition/compose.js.map +1 -1
  412. package/dist/composition/composition-recovery.d.ts.map +1 -1
  413. package/dist/composition/composition-recovery.js +4 -7
  414. package/dist/composition/composition-recovery.js.map +1 -1
  415. package/dist/composition/discovery.d.ts +56 -0
  416. package/dist/composition/discovery.d.ts.map +1 -1
  417. package/dist/composition/discovery.js +114 -60
  418. package/dist/composition/discovery.js.map +1 -1
  419. package/dist/composition/edge.d.ts +21 -2
  420. package/dist/composition/edge.d.ts.map +1 -1
  421. package/dist/composition/edge.js +23 -1
  422. package/dist/composition/edge.js.map +1 -1
  423. package/dist/composition/enumerate.d.ts.map +1 -1
  424. package/dist/composition/enumerate.js +18 -3
  425. package/dist/composition/enumerate.js.map +1 -1
  426. package/dist/composition/evaluate-relation.d.ts +35 -11
  427. package/dist/composition/evaluate-relation.d.ts.map +1 -1
  428. package/dist/composition/evaluate-relation.js +60 -39
  429. package/dist/composition/evaluate-relation.js.map +1 -1
  430. package/dist/composition/explain.d.ts +3 -12
  431. package/dist/composition/explain.d.ts.map +1 -1
  432. package/dist/composition/explain.js +7 -20
  433. package/dist/composition/explain.js.map +1 -1
  434. package/dist/composition/expr-eval.d.ts.map +1 -1
  435. package/dist/composition/expr-eval.js +2 -11
  436. package/dist/composition/expr-eval.js.map +1 -1
  437. package/dist/composition/expr-simplify.d.ts +16 -0
  438. package/dist/composition/expr-simplify.d.ts.map +1 -1
  439. package/dist/composition/expr-simplify.js +15 -20
  440. package/dist/composition/expr-simplify.js.map +1 -1
  441. package/dist/composition/formula-shape.d.ts +23 -4
  442. package/dist/composition/formula-shape.d.ts.map +1 -1
  443. package/dist/composition/formula-shape.js +57 -17
  444. package/dist/composition/formula-shape.js.map +1 -1
  445. package/dist/composition/graph-structure.d.ts +98 -0
  446. package/dist/composition/graph-structure.d.ts.map +1 -0
  447. package/dist/composition/graph-structure.js +167 -0
  448. package/dist/composition/graph-structure.js.map +1 -0
  449. package/dist/composition/graph-viz-svg.d.ts.map +1 -1
  450. package/dist/composition/graph-viz-svg.js +1 -1
  451. package/dist/composition/graph-viz-svg.js.map +1 -1
  452. package/dist/composition/graph-viz.d.ts.map +1 -1
  453. package/dist/composition/graph-viz.js +8 -37
  454. package/dist/composition/graph-viz.js.map +1 -1
  455. package/dist/composition/identifiability.d.ts +91 -4
  456. package/dist/composition/identifiability.d.ts.map +1 -1
  457. package/dist/composition/identifiability.js +363 -6
  458. package/dist/composition/identifiability.js.map +1 -1
  459. package/dist/composition/index.d.ts +8 -4
  460. package/dist/composition/index.d.ts.map +1 -1
  461. package/dist/composition/index.js +3 -2
  462. package/dist/composition/index.js.map +1 -1
  463. package/dist/composition/mathts-quiet.d.ts +4 -3
  464. package/dist/composition/mathts-quiet.d.ts.map +1 -1
  465. package/dist/composition/mathts-quiet.js +4 -3
  466. package/dist/composition/mathts-quiet.js.map +1 -1
  467. package/dist/composition/mathts-scalar-symbols.d.ts.map +1 -1
  468. package/dist/composition/mathts-scalar-symbols.js +2 -1
  469. package/dist/composition/mathts-scalar-symbols.js.map +1 -1
  470. package/dist/composition/probe/corpus.d.ts +4 -2
  471. package/dist/composition/probe/corpus.d.ts.map +1 -1
  472. package/dist/composition/probe/corpus.js +20 -9
  473. package/dist/composition/probe/corpus.js.map +1 -1
  474. package/dist/composition/probe/dataset.d.ts +17 -0
  475. package/dist/composition/probe/dataset.d.ts.map +1 -1
  476. package/dist/composition/probe/dataset.js +95 -50
  477. package/dist/composition/probe/dataset.js.map +1 -1
  478. package/dist/composition/probe/experiment-design.d.ts +5 -1
  479. package/dist/composition/probe/experiment-design.d.ts.map +1 -1
  480. package/dist/composition/probe/experiment-design.js +44 -24
  481. package/dist/composition/probe/experiment-design.js.map +1 -1
  482. package/dist/composition/probe/falsify.d.ts.map +1 -1
  483. package/dist/composition/probe/falsify.js +2 -0
  484. package/dist/composition/probe/falsify.js.map +1 -1
  485. package/dist/composition/probe/fit.d.ts +6 -0
  486. package/dist/composition/probe/fit.d.ts.map +1 -1
  487. package/dist/composition/probe/fit.js +46 -22
  488. package/dist/composition/probe/fit.js.map +1 -1
  489. package/dist/composition/probe/frontier.d.ts.map +1 -1
  490. package/dist/composition/probe/frontier.js +33 -15
  491. package/dist/composition/probe/frontier.js.map +1 -1
  492. package/dist/composition/probe/generator.d.ts +27 -1
  493. package/dist/composition/probe/generator.d.ts.map +1 -1
  494. package/dist/composition/probe/generator.js +53 -30
  495. package/dist/composition/probe/generator.js.map +1 -1
  496. package/dist/composition/probe/index.d.ts +14 -0
  497. package/dist/composition/probe/index.d.ts.map +1 -1
  498. package/dist/composition/probe/index.js +6 -0
  499. package/dist/composition/probe/index.js.map +1 -1
  500. package/dist/composition/probe/limits.d.ts +24 -1
  501. package/dist/composition/probe/limits.d.ts.map +1 -1
  502. package/dist/composition/probe/limits.js +53 -11
  503. package/dist/composition/probe/limits.js.map +1 -1
  504. package/dist/composition/probe/pipeline.d.ts.map +1 -1
  505. package/dist/composition/probe/pipeline.js +10 -4
  506. package/dist/composition/probe/pipeline.js.map +1 -1
  507. package/dist/composition/probe/power-law.d.ts +121 -0
  508. package/dist/composition/probe/power-law.d.ts.map +1 -0
  509. package/dist/composition/probe/power-law.js +255 -0
  510. package/dist/composition/probe/power-law.js.map +1 -0
  511. package/dist/composition/probe/problem.d.ts +7 -4
  512. package/dist/composition/probe/problem.d.ts.map +1 -1
  513. package/dist/composition/probe/problem.js +177 -49
  514. package/dist/composition/probe/problem.js.map +1 -1
  515. package/dist/composition/probe/report.js +1 -1
  516. package/dist/composition/probe/report.js.map +1 -1
  517. package/dist/composition/probe/residual.d.ts +6 -1
  518. package/dist/composition/probe/residual.d.ts.map +1 -1
  519. package/dist/composition/probe/residual.js +9 -7
  520. package/dist/composition/probe/residual.js.map +1 -1
  521. package/dist/composition/probe/structure.d.ts +82 -17
  522. package/dist/composition/probe/structure.d.ts.map +1 -1
  523. package/dist/composition/probe/structure.js +129 -55
  524. package/dist/composition/probe/structure.js.map +1 -1
  525. package/dist/composition/probe/study.d.ts +31 -9
  526. package/dist/composition/probe/study.d.ts.map +1 -1
  527. package/dist/composition/probe/study.js +236 -181
  528. package/dist/composition/probe/study.js.map +1 -1
  529. package/dist/composition/probe/t-tail.d.ts +17 -0
  530. package/dist/composition/probe/t-tail.d.ts.map +1 -0
  531. package/dist/composition/probe/t-tail.js +32 -0
  532. package/dist/composition/probe/t-tail.js.map +1 -0
  533. package/dist/composition/probe/types.d.ts +3 -0
  534. package/dist/composition/probe/types.d.ts.map +1 -1
  535. package/dist/composition/probe/types.js.map +1 -1
  536. package/dist/composition/proposed-bridges.d.ts +41 -10
  537. package/dist/composition/proposed-bridges.d.ts.map +1 -1
  538. package/dist/composition/proposed-bridges.js +100 -55
  539. package/dist/composition/proposed-bridges.js.map +1 -1
  540. package/dist/composition/quantity-clusters.d.ts +48 -0
  541. package/dist/composition/quantity-clusters.d.ts.map +1 -0
  542. package/dist/composition/quantity-clusters.js +98 -0
  543. package/dist/composition/quantity-clusters.js.map +1 -0
  544. package/dist/composition/rational-exponent.d.ts +40 -0
  545. package/dist/composition/rational-exponent.d.ts.map +1 -0
  546. package/dist/composition/rational-exponent.js +65 -0
  547. package/dist/composition/rational-exponent.js.map +1 -0
  548. package/dist/composition/representative-values.d.ts +22 -0
  549. package/dist/composition/representative-values.d.ts.map +1 -1
  550. package/dist/composition/representative-values.js +23 -0
  551. package/dist/composition/representative-values.js.map +1 -1
  552. package/dist/composition/retrodiction.d.ts.map +1 -1
  553. package/dist/composition/retrodiction.js +2 -1
  554. package/dist/composition/retrodiction.js.map +1 -1
  555. package/dist/composition/user-equation.d.ts.map +1 -1
  556. package/dist/composition/user-equation.js +2 -2
  557. package/dist/composition/user-equation.js.map +1 -1
  558. package/dist/core/assignment.d.ts +19 -0
  559. package/dist/core/assignment.d.ts.map +1 -0
  560. package/dist/core/assignment.js +19 -0
  561. package/dist/core/assignment.js.map +1 -0
  562. package/dist/core/compare.d.ts +32 -0
  563. package/dist/core/compare.d.ts.map +1 -0
  564. package/dist/core/compare.js +46 -0
  565. package/dist/core/compare.js.map +1 -0
  566. package/dist/core/constants.d.ts +30 -30
  567. package/dist/core/constants.d.ts.map +1 -1
  568. package/dist/core/constants.js +47 -30
  569. package/dist/core/constants.js.map +1 -1
  570. package/dist/core/data-file.d.ts +7 -0
  571. package/dist/core/data-file.d.ts.map +1 -1
  572. package/dist/core/data-file.js +17 -0
  573. package/dist/core/data-file.js.map +1 -1
  574. package/dist/core/format.d.ts +36 -0
  575. package/dist/core/format.d.ts.map +1 -0
  576. package/dist/core/format.js +39 -0
  577. package/dist/core/format.js.map +1 -0
  578. package/dist/core/hash.d.ts +14 -0
  579. package/dist/core/hash.d.ts.map +1 -0
  580. package/dist/core/hash.js +17 -0
  581. package/dist/core/hash.js.map +1 -0
  582. package/dist/core/json-schema.d.ts +2 -0
  583. package/dist/core/json-schema.d.ts.map +1 -1
  584. package/dist/core/json-schema.js +14 -13
  585. package/dist/core/json-schema.js.map +1 -1
  586. package/dist/core/labeled-tensor.d.ts.map +1 -1
  587. package/dist/core/labeled-tensor.js +0 -8
  588. package/dist/core/labeled-tensor.js.map +1 -1
  589. package/dist/core/mathts-read.d.ts +25 -0
  590. package/dist/core/mathts-read.d.ts.map +1 -0
  591. package/dist/core/mathts-read.js +51 -0
  592. package/dist/core/mathts-read.js.map +1 -0
  593. package/dist/core/tensor.d.ts.map +1 -1
  594. package/dist/core/tensor.js +24 -0
  595. package/dist/core/tensor.js.map +1 -1
  596. package/dist/core/types.d.ts +5 -5
  597. package/dist/diff/bridge-gradient.d.ts +19 -6
  598. package/dist/diff/bridge-gradient.d.ts.map +1 -1
  599. package/dist/diff/bridge-gradient.js +19 -11
  600. package/dist/diff/bridge-gradient.js.map +1 -1
  601. package/dist/diff/bridge-specs.d.ts.map +1 -1
  602. package/dist/diff/bridge-specs.js +3 -0
  603. package/dist/diff/bridge-specs.js.map +1 -1
  604. package/dist/dimensional/algebra.d.ts +18 -0
  605. package/dist/dimensional/algebra.d.ts.map +1 -1
  606. package/dist/dimensional/algebra.js +41 -1
  607. package/dist/dimensional/algebra.js.map +1 -1
  608. package/dist/dimensional/ast-builders.d.ts +7 -0
  609. package/dist/dimensional/ast-builders.d.ts.map +1 -1
  610. package/dist/dimensional/ast-builders.js +11 -0
  611. package/dist/dimensional/ast-builders.js.map +1 -1
  612. package/dist/dimensional/ast-leaves.d.ts +81 -0
  613. package/dist/dimensional/ast-leaves.d.ts.map +1 -0
  614. package/dist/dimensional/ast-leaves.js +146 -0
  615. package/dist/dimensional/ast-leaves.js.map +1 -0
  616. package/dist/dimensional/buckingham.d.ts.map +1 -1
  617. package/dist/dimensional/buckingham.js +15 -27
  618. package/dist/dimensional/buckingham.js.map +1 -1
  619. package/dist/dimensional/constant-rows.js +9 -9
  620. package/dist/dimensional/constant-rows.js.map +1 -1
  621. package/dist/dimensional/dimension-inference.d.ts.map +1 -1
  622. package/dist/dimensional/dimension-inference.js +1 -2
  623. package/dist/dimensional/dimension-inference.js.map +1 -1
  624. package/dist/dimensional/errors.d.ts +1 -1
  625. package/dist/dimensional/errors.d.ts.map +1 -1
  626. package/dist/dimensional/errors.js +1 -15
  627. package/dist/dimensional/errors.js.map +1 -1
  628. package/dist/dimensional/exact-scale.d.ts +0 -17
  629. package/dist/dimensional/exact-scale.d.ts.map +1 -1
  630. package/dist/dimensional/exact-scale.js +8 -8
  631. package/dist/dimensional/exact-scale.js.map +1 -1
  632. package/dist/dimensional/gauge-field.d.ts.map +1 -1
  633. package/dist/dimensional/gauge-field.js +2 -2
  634. package/dist/dimensional/gauge-field.js.map +1 -1
  635. package/dist/dimensional/hyphen-names.d.ts +12 -2
  636. package/dist/dimensional/hyphen-names.d.ts.map +1 -1
  637. package/dist/dimensional/hyphen-names.js +44 -19
  638. package/dist/dimensional/hyphen-names.js.map +1 -1
  639. package/dist/dimensional/metric.d.ts.map +1 -1
  640. package/dist/dimensional/metric.js +0 -1
  641. package/dist/dimensional/metric.js.map +1 -1
  642. package/dist/dimensional/symbolic-constants.d.ts +9 -0
  643. package/dist/dimensional/symbolic-constants.d.ts.map +1 -1
  644. package/dist/dimensional/symbolic-constants.js +13 -1
  645. package/dist/dimensional/symbolic-constants.js.map +1 -1
  646. package/dist/dimensional/types.d.ts +36 -0
  647. package/dist/dimensional/types.d.ts.map +1 -1
  648. package/dist/dimensional/types.js +45 -7
  649. package/dist/dimensional/types.js.map +1 -1
  650. package/dist/dimensional/unit-data.js +2 -2
  651. package/dist/dimensional/unit-data.js.map +1 -1
  652. package/dist/index.d.ts +9 -3
  653. package/dist/index.d.ts.map +1 -1
  654. package/dist/index.js +10 -4
  655. package/dist/index.js.map +1 -1
  656. package/dist/numerical/christoffel-flat.d.ts.map +1 -1
  657. package/dist/numerical/christoffel-flat.js +3 -2
  658. package/dist/numerical/christoffel-flat.js.map +1 -1
  659. package/dist/numerical/covariant-eikonal.d.ts.map +1 -1
  660. package/dist/numerical/covariant-eikonal.js +34 -11
  661. package/dist/numerical/covariant-eikonal.js.map +1 -1
  662. package/dist/numerical/curvature-lowering-helpers.js +3 -2
  663. package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
  664. package/dist/numerical/errors.d.ts.map +1 -1
  665. package/dist/numerical/errors.js +0 -3
  666. package/dist/numerical/errors.js.map +1 -1
  667. package/dist/numerical/finite-difference.d.ts +22 -0
  668. package/dist/numerical/finite-difference.d.ts.map +1 -0
  669. package/dist/numerical/finite-difference.js +27 -0
  670. package/dist/numerical/finite-difference.js.map +1 -0
  671. package/dist/numerical/geodesic-integrator.d.ts.map +1 -1
  672. package/dist/numerical/geodesic-integrator.js +22 -14
  673. package/dist/numerical/geodesic-integrator.js.map +1 -1
  674. package/dist/numerical/geometrized.d.ts.map +1 -1
  675. package/dist/numerical/geometrized.js +0 -1
  676. package/dist/numerical/geometrized.js.map +1 -1
  677. package/dist/numerical/mathts-engine.d.ts.map +1 -1
  678. package/dist/numerical/mathts-engine.js +10 -24
  679. package/dist/numerical/mathts-engine.js.map +1 -1
  680. package/dist/numerical/metric-inverse.d.ts.map +1 -1
  681. package/dist/numerical/metric-inverse.js +83 -46
  682. package/dist/numerical/metric-inverse.js.map +1 -1
  683. package/dist/numerical/null-ray-integrator.d.ts +2 -1
  684. package/dist/numerical/null-ray-integrator.d.ts.map +1 -1
  685. package/dist/numerical/null-ray-integrator.js +12 -12
  686. package/dist/numerical/null-ray-integrator.js.map +1 -1
  687. package/dist/numerical/painleve-gullstrand-metric.js +2 -2
  688. package/dist/numerical/painleve-gullstrand-metric.js.map +1 -1
  689. package/dist/numerical/perihelion-finder.d.ts +0 -36
  690. package/dist/numerical/perihelion-finder.d.ts.map +1 -1
  691. package/dist/numerical/perihelion-finder.js +41 -87
  692. package/dist/numerical/perihelion-finder.js.map +1 -1
  693. package/dist/numerical/quadrature.d.ts.map +1 -1
  694. package/dist/numerical/quadrature.js +8 -10
  695. package/dist/numerical/quadrature.js.map +1 -1
  696. package/dist/numerical/rk4-trajectory.d.ts +10 -0
  697. package/dist/numerical/rk4-trajectory.d.ts.map +1 -0
  698. package/dist/numerical/rk4-trajectory.js +37 -0
  699. package/dist/numerical/rk4-trajectory.js.map +1 -0
  700. package/dist/numerical/schwarzschild.d.ts +14 -0
  701. package/dist/numerical/schwarzschild.d.ts.map +1 -0
  702. package/dist/numerical/schwarzschild.js +17 -0
  703. package/dist/numerical/schwarzschild.js.map +1 -0
  704. package/dist/numerical/spacetime-metrics.d.ts +12 -0
  705. package/dist/numerical/spacetime-metrics.d.ts.map +1 -1
  706. package/dist/numerical/spacetime-metrics.js +72 -56
  707. package/dist/numerical/spacetime-metrics.js.map +1 -1
  708. package/dist/numerical/statistics.d.ts +24 -0
  709. package/dist/numerical/statistics.d.ts.map +1 -0
  710. package/dist/numerical/statistics.js +52 -0
  711. package/dist/numerical/statistics.js.map +1 -0
  712. package/dist/numerical/tensor-engine.d.ts +21 -0
  713. package/dist/numerical/tensor-engine.d.ts.map +1 -1
  714. package/dist/numerical/tensor-engine.js +12 -0
  715. package/dist/numerical/tensor-engine.js.map +1 -1
  716. package/dist/relations/regime.d.ts +10 -0
  717. package/dist/relations/regime.d.ts.map +1 -1
  718. package/dist/relations/regime.js +18 -1
  719. package/dist/relations/regime.js.map +1 -1
  720. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"retrieve.js","sourceRoot":"","sources":["../../../src/cli/commands/retrieve.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `upt retrieve <claim>` — optional embedding proposals, atlas acceptance.\n *\n * The default does not call out of process. `--embed` asks a local Ollama\n * model. The embedding order is a proposal. `rankByStructure` is what is\n * accepted. If Ollama cannot be used, the atlas search is still the answer\n * and the output names the reason. That is exit 0.\n */\nimport type { FlagSpec } from '../args.js';\nimport { registerCommand, type Command, type CommandCtx } from '../command.js';\nimport { commandHelp, JSON_FLAG } from '../flag-help.js';\nimport { UsageError } from '../errors.js';\nimport { emitJson } from '../output.js';\n\n/** Where `--embed` looks for Ollama when `--ollama-url` is not given. */\nconst OLLAMA_DEFAULT_URL = 'http://127.0.0.1:11434';\n\nconst FLAGS: FlagSpec[] = [\n JSON_FLAG,\n {\n name: '--embed',\n valueStyle: 'none',\n description: 'Ask a local Ollama model for an order. Acceptance stays the atlas search. A failure of Ollama still prints that search and exits 0.',\n },\n {\n name: '--ollama-url',\n valueStyle: 'attached',\n description: 'Ollama base URL. Used only with --embed.',\n defaultValue: OLLAMA_DEFAULT_URL,\n },\n];\n\nconst HELP = `upt retrieve <claim> [--embed] [--ollama-url=URL]\n Propose canonical relations for a claim. The default is the atlas\n search (typed structural ranking) and does not call out of process. The output\n says so. --embed asks a local Ollama model, qwen3-embedding:4b, for\n an order. That order is a proposal, not evidence. Acceptance stays\n the atlas search, and cosine similarity does not enter its score.\n If Ollama cannot be used, the same atlas search is printed and the\n reason is named: the process is not there, the model is not there,\n the server answered an error status, the reply is not a vector or its\n length is not the length stored in the frozen file, or the call does\n not finish. A fallback exits 0.\n --ollama-url is used only with --embed (default ${OLLAMA_DEFAULT_URL}).\n A claim is text. It has no expression, so the atlas search accepts\n nothing: it ranks by structure, and a text claim has none to rank.\n The command does not invent one. --embed still proposes an order.\n e.g. upt retrieve period of a pendulum\n upt retrieve period of a pendulum --embed`;\n\nconst EPISTEMICS =\n 'An embedding order is a proposal, not evidence. Acceptance is the atlas search. Cosine similarity does not enter that score.';\n\nasync function run(ctx: CommandCtx): Promise<number> {\n const { args, out, api } = ctx;\n const claim = args.positionals.join(' ').trim();\n if (claim.length === 0) {\n throw new UsageError('upt retrieve: give a claim, e.g. `upt retrieve period of a pendulum`');\n }\n const embed = args.flags.has('embed');\n const ollamaUrl = args.flags.get('ollama-url')?.[0] ?? OLLAMA_DEFAULT_URL;\n const corpus = api.canonicalRetrievalCorpus();\n const result = await api.retrieveHybrid({\n query: { text: claim },\n corpus,\n embeddings: embed,\n embedder: embed\n ? api.ollamaEmbedder({ baseUrl: ollamaUrl })\n : undefined,\n });\n if (args.flags.has('json')) {\n emitJson(\n {\n command: 'retrieve',\n epistemics: EPISTEMICS,\n options: { embed, ollamaUrl: embed ? ollamaUrl : null },\n result,\n },\n ctx.write,\n );\n return 0;\n }\n out(`upt retrieve — ${result.embeddings === 'used' ? 'embedding proposal and atlas search' : 'atlas search'}`);\n out(result.note);\n if (result.fallback !== null) out(` fallback reason: ${result.fallback} (Ollama at ${ollamaUrl})`);\n if (result.proposals !== null) {\n out(' proposed (cosine, not accepted):');\n for (const id of result.proposals) out(` ${id}`);\n }\n out(' accepted (atlas search):');\n if (result.accepted.length === 0) out(' none — the claim has no expression to rank by structure');\n for (const id of result.accepted) out(` ${id}`);\n return 0;\n}\n\nexport const command: Command = {\n name: 'retrieve',\n aliases: [],\n flags: FLAGS,\n help: commandHelp(HELP, FLAGS),\n summary: 'Search the atlas for a claim. --embed asks a local Ollama model and does not accept that order.',\n example: 'upt retrieve period of a pendulum',\n group: 'data',\n run,\n};\nregisterCommand(command);\n"]}
1
+ {"version":3,"file":"retrieve.js","sourceRoot":"","sources":["../../../src/cli/commands/retrieve.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,eAAe,EAAiC,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,yEAAyE;AACzE,MAAM,kBAAkB,GAAG,wBAAwB,CAAC;AAEpD,MAAM,KAAK,GAAe;IACxB,SAAS;IACT;QACE,IAAI,EAAE,SAAS;QACf,UAAU,EAAE,MAAM;QAClB,WAAW,EAAE,qIAAqI;KACnJ;IACD;QACE,IAAI,EAAE,cAAc;QACpB,UAAU,EAAE,UAAU;QACtB,WAAW,EAAE,0CAA0C;QACvD,YAAY,EAAE,kBAAkB;KACjC;CACF,CAAC;AAEF,MAAM,IAAI,GAAG;;;;;;;;;;;0DAW6C,kBAAkB;;;;;wDAKpB,CAAC;AAEzD,MAAM,UAAU,GACd,8HAA8H,CAAC;AAEjI,KAAK,UAAU,GAAG,CAAC,GAAe;IAChC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,UAAU,CAAC,sEAAsE,CAAC,CAAC;IAC/F,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC;IAC1E,MAAM,MAAM,GAAG,GAAG,CAAC,wBAAwB,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC;QACtC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACtB,MAAM;QACN,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,KAAK;YACb,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;YAC5C,CAAC,CAAC,SAAS;KACd,CAAC,CAAC;IACH,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,QAAQ,CACN;YACE,OAAO,EAAE,UAAU;YACnB,UAAU,EAAE,UAAU;YACtB,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE;YACvD,MAAM;SACP,EACD,GAAG,CAAC,KAAK,CACV,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,GAAG,CAAC,kBAAkB,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;IAC/G,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjB,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI;QAAE,GAAG,CAAC,sBAAsB,MAAM,CAAC,QAAQ,eAAe,SAAS,GAAG,CAAC,CAAC;IACpG,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QAC9B,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAC1C,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,SAAS;YAAE,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAClC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,GAAG,CAAC,6DAA6D,CAAC,CAAC;IACrG,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,QAAQ;QAAE,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAY;IAC9B,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,EAAE;IACX,WAAW,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE;IAC9B,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC;IAC9B,OAAO,EAAE,iGAAiG;IAC1G,OAAO,EAAE,mCAAmC;IAC5C,KAAK,EAAE,MAAM;IACb,GAAG;CACJ,CAAC;AACF,eAAe,CAAC,OAAO,CAAC,CAAC","sourcesContent":["/**\n * `upt retrieve <claim>` — optional embedding proposals, atlas acceptance.\n *\n * The default does not call out of process. `--embed` asks a local Ollama\n * model. The embedding order is a proposal. `rankByStructure` is what is\n * accepted. If Ollama cannot be used, the atlas search is still the answer\n * and the output names the reason. That is exit 0.\n */\nimport type { FlagSpec } from '../args.js';\nimport { registerCommand, type Command, type CommandCtx } from '../command.js';\nimport { commandHelp, JSON_FLAG } from '../flag-help.js';\nimport { UsageError } from '../errors.js';\nimport { emitJson } from '../output.js';\n\n/** Where `--embed` looks for Ollama when `--ollama-url` is not given. */\nconst OLLAMA_DEFAULT_URL = 'http://127.0.0.1:11434';\n\nconst FLAGS: FlagSpec[] = [\n JSON_FLAG,\n {\n name: '--embed',\n valueStyle: 'none',\n description: 'Ask a local Ollama model for an order. Acceptance stays the atlas search. A failure of Ollama still prints that search and exits 0.',\n },\n {\n name: '--ollama-url',\n valueStyle: 'attached',\n description: 'Ollama base URL. Used only with --embed.',\n defaultValue: OLLAMA_DEFAULT_URL,\n },\n];\n\nconst HELP = `upt retrieve <claim> [--embed] [--ollama-url=URL]\n Propose canonical relations for a claim. The default is the atlas\n search (typed structural ranking) and does not call out of process. The output\n says so. --embed asks a local Ollama model, qwen3-embedding:4b, for\n an order. That order is a proposal, not evidence. Acceptance stays\n the atlas search, and cosine similarity does not enter its score.\n If Ollama cannot be used, the same atlas search is printed and the\n reason is named: the process is not there, the model is not there,\n the server answered an error status, the reply is not a vector or its\n length is not the length stored in the frozen file, or the call does\n not finish. A fallback exits 0.\n --ollama-url is used only with --embed (default ${OLLAMA_DEFAULT_URL}).\n A claim is text. It has no expression, so the atlas search accepts\n nothing: it ranks by structure, and a text claim has none to rank.\n The command does not invent one. --embed still proposes an order.\n e.g. upt retrieve period of a pendulum\n upt retrieve period of a pendulum --embed`;\n\nconst EPISTEMICS =\n 'An embedding order is a proposal, not evidence. Acceptance is the atlas search. Cosine similarity does not enter that score.';\n\nasync function run(ctx: CommandCtx): Promise<number> {\n const { args, out, api } = ctx;\n const claim = args.positionals.join(' ').trim();\n if (claim.length === 0) {\n throw new UsageError('upt retrieve: give a claim, e.g. `upt retrieve period of a pendulum`');\n }\n const embed = args.flags.has('embed');\n const ollamaUrl = args.flags.get('ollama-url')?.[0] ?? OLLAMA_DEFAULT_URL;\n const corpus = api.canonicalRetrievalCorpus();\n const result = await api.retrieveHybrid({\n query: { text: claim },\n corpus,\n embeddings: embed,\n embedder: embed\n ? api.ollamaEmbedder({ baseUrl: ollamaUrl })\n : undefined,\n });\n if (args.flags.has('json')) {\n emitJson(\n {\n command: 'retrieve',\n epistemics: EPISTEMICS,\n options: { embed, ollamaUrl: embed ? ollamaUrl : null },\n result,\n },\n ctx.write,\n );\n return 0;\n }\n out(`upt retrieve — ${result.embeddings === 'used' ? 'embedding proposal and atlas search' : 'atlas search'}`);\n out(result.note);\n if (result.fallback !== null) out(` fallback reason: ${result.fallback} (Ollama at ${ollamaUrl})`);\n if (result.proposals !== null) {\n out(' proposed (cosine, not accepted):');\n for (const id of result.proposals) out(` ${id}`);\n }\n out(' accepted (atlas search):');\n if (result.accepted.length === 0) out(' none — the claim has no expression to rank by structure');\n for (const id of result.accepted) out(` ${id}`);\n return 0;\n}\n\nexport const command: Command = {\n name: 'retrieve',\n aliases: [],\n positionals: { max: Infinity },\n flags: FLAGS,\n help: commandHelp(HELP, FLAGS),\n summary: 'Search the atlas for a claim. --embed asks a local Ollama model and does not accept that order.',\n example: 'upt retrieve period of a pendulum',\n group: 'data',\n run,\n};\nregisterCommand(command);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/search.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAmB,KAAK,OAAO,EAAmB,MAAM,eAAe,CAAC;AA+F/E,eAAO,MAAM,OAAO,EAAE,OASrB,CAAC"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/search.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAmB,KAAK,OAAO,EAAmB,MAAM,eAAe,CAAC;AA+F/E,eAAO,MAAM,OAAO,EAAE,OAUrB,CAAC"}
@@ -89,6 +89,7 @@ async function run(ctx) {
89
89
  export const command = {
90
90
  name: 'search',
91
91
  aliases: [],
92
+ positionals: { max: Infinity },
92
93
  flags: FLAGS,
93
94
  help: commandHelp(HELP, FLAGS),
94
95
  summary: 'Find a bridge, equation, model, quantity, case, or regime by the words in its record.',
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/cli/commands/search.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `upt search <word> ...` — find a law, model, bridge or quantity by the words\n * a physicist would use, and name the command that inspects it.\n *\n * Audit §14 I5. `explain schrodinger-equation` failed because the name was a\n * model, not a quantity, and its suggestions were edit-distance neighbours.\n * This command searches every registry the CLI exposes by WORD: names, ids,\n * symbols, genuine aliases (`resolveQuantityName`) and catalog-bridge\n * descriptions. An equal dimension is never a match: a radius is not a\n * wavelength, and angular frequency is not frequency, even where the two share\n * a dimension.\n *\n * A word of one or two letters is a symbol, not an English word: it matches a\n * quantity symbol, an alias or a whole id segment exactly, and never a stray\n * letter inside a description.\n */\nimport type { FlagSpec } from '../args.js';\nimport { registerCommand, type Command, type CommandCtx } from '../command.js';\nimport { commandHelp, JSON_FLAG } from '../flag-help.js';\nimport { CliError, UsageError } from '../errors.js';\nimport { emitJson } from '../output.js';\nimport { buildSearchIndex, fold, matchEveryWord, queryWords, SEARCH_SECTIONS, STOP_WORDS } from '../search-index.js';\n\nconst FLAGS: FlagSpec[] = [JSON_FLAG];\n\nconst HELP = `upt search <word> ...\n Find a catalog bridge, canonical equation, atlas model, atlas bridge,\n quantity, applied case, or regime registration by the words in its name, id, symbol, alias\n or bridge description, and print the command that inspects each match. Every\n word must match. Two or more words that share a field must sit together\n there, in either order, and a word in that phrase is not a prefix of a\n longer word. A trailing parenthetical is a gloss. A gloss does not\n combine with the title, so a query split across them matches nothing,\n and a query that is the gloss says so. Words that never share a\n non-gloss field still match. A space inside one argument, and a hyphen, are word\n breaks, so a quoted phrase and a hyphenated name are several words.\n An equal dimension is never a match (a radius is not\n a wavelength). A word of one or two letters matches a symbol or alias\n exactly. A longer word that only continues the query is named as a\n prefix, so landau is not reported as Landauer without saying so.\n A catalog bridge with no evaluator and a formalRef routes to\n upt atlas, and the hit quotes that reference's covers line.\n No match is a result: exit 0, naming the registries searched.\n e.g. upt search Schrödinger\n upt search thermal noise`;\n\nconst PER_SECTION = 10;\n\nasync function run(ctx: CommandCtx): Promise<number> {\n const { args, api, out } = ctx;\n const raw = [...args.positionals];\n if (raw.length === 0) throw new UsageError('upt search: give at least one word, e.g. `upt search thermal noise`');\n const query = queryWords(raw);\n if (query.length === 0) throw new UsageError('upt search: give at least one word, e.g. `upt search thermal noise`');\n const index = buildSearchIndex(api);\n const significant = query.length > 1 ? query.filter((q) => !STOP_WORDS.has(fold(q))) : query;\n if (significant.length === 0) throw new UsageError(`upt search: '${query.join(' ')}' has only stop words`);\n const matches = matchEveryWord(api, index, significant);\n\n const counts = SEARCH_SECTIONS.map(([k, title]) => `${index.filter((e) => e.kind === k).length} ${title}`).join(', ');\n const scope = `searched ${counts}; this registry only`;\n\n if (args.flags.has('json')) {\n emitJson(\n {\n command: 'search',\n epistemics:\n 'Matched by the words of names, ids, symbols, genuine aliases and catalog-bridge descriptions. ' +\n 'An equal dimension is never a match. No match means none in these registries, not none in physics.',\n options: { query },\n result: {\n scope,\n matches: matches.map((m) => ({\n kind: m.entry.kind,\n id: m.entry.id,\n summary: m.entry.line,\n matchedIn: m.matchedIn,\n ...(m.alias === undefined ? {} : { alias: m.alias }),\n command: m.entry.command,\n ...(m.prefixes === undefined ? {} : { prefixes: m.prefixes }),\n })),\n },\n },\n ctx.write,\n );\n return 0;\n }\n\n // No match is the result the search computed, not an error: exit 0, and the\n // scope is printed because an empty result is an absence from this registry.\n if (matches.length === 0) {\n out(`upt search ${query.join(' ')} — no entry matches every word of '${query.join(' ')}'`);\n out(` ${scope}; an absence here is not an absence from physics`);\n return 0;\n }\n out(`\\nupt search ${query.join(' ')} — ${matches.length} match(es); every word matched`);\n out(' matched by words, symbols and genuine aliases; an equal dimension is never a match (a radius is not a wavelength)');\n for (const [kind, title] of SEARCH_SECTIONS) {\n const inKind = matches.filter((m) => m.entry.kind === kind);\n if (inKind.length === 0) continue;\n out(`\\n${title}:`);\n for (const m of inKind.slice(0, PER_SECTION)) {\n const prefix = (m.prefixes ?? []).map((p) => `${p.query} is a prefix of ${p.word}`).join('; ');\n out(` ${m.entry.line}${m.alias === undefined ? '' : ` (alias ${m.alias})`} [words in: ${m.matchedIn.join(', ')}${prefix === '' ? '' : `; ${prefix}`}]`);\n out(` ${m.entry.commandLabel}: ${m.entry.command}${m.entry.note === undefined ? '' : ` (${m.entry.note})`}`);\n }\n if (inKind.length > PER_SECTION) out(` … and ${inKind.length - PER_SECTION} more (--json lists every match)`);\n }\n out(`\\n${scope}.`);\n return 0;\n}\n\nexport const command: Command = {\n name: 'search',\n aliases: [],\n flags: FLAGS,\n help: commandHelp(HELP, FLAGS),\n summary: 'Find a bridge, equation, model, quantity, case, or regime by the words in its record.',\n example: 'upt search thermal noise',\n group: 'explore',\n run,\n};\nregisterCommand(command);\n"]}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/cli/commands/search.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `upt search <word> ...` — find a law, model, bridge or quantity by the words\n * a physicist would use, and name the command that inspects it.\n *\n * Audit §14 I5. `explain schrodinger-equation` failed because the name was a\n * model, not a quantity, and its suggestions were edit-distance neighbours.\n * This command searches every registry the CLI exposes by WORD: names, ids,\n * symbols, genuine aliases (`resolveQuantityName`) and catalog-bridge\n * descriptions. An equal dimension is never a match: a radius is not a\n * wavelength, and angular frequency is not frequency, even where the two share\n * a dimension.\n *\n * A word of one or two letters is a symbol, not an English word: it matches a\n * quantity symbol, an alias or a whole id segment exactly, and never a stray\n * letter inside a description.\n */\nimport type { FlagSpec } from '../args.js';\nimport { registerCommand, type Command, type CommandCtx } from '../command.js';\nimport { commandHelp, JSON_FLAG } from '../flag-help.js';\nimport { CliError, UsageError } from '../errors.js';\nimport { emitJson } from '../output.js';\nimport { buildSearchIndex, fold, matchEveryWord, queryWords, SEARCH_SECTIONS, STOP_WORDS } from '../search-index.js';\n\nconst FLAGS: FlagSpec[] = [JSON_FLAG];\n\nconst HELP = `upt search <word> ...\n Find a catalog bridge, canonical equation, atlas model, atlas bridge,\n quantity, applied case, or regime registration by the words in its name, id, symbol, alias\n or bridge description, and print the command that inspects each match. Every\n word must match. Two or more words that share a field must sit together\n there, in either order, and a word in that phrase is not a prefix of a\n longer word. A trailing parenthetical is a gloss. A gloss does not\n combine with the title, so a query split across them matches nothing,\n and a query that is the gloss says so. Words that never share a\n non-gloss field still match. A space inside one argument, and a hyphen, are word\n breaks, so a quoted phrase and a hyphenated name are several words.\n An equal dimension is never a match (a radius is not\n a wavelength). A word of one or two letters matches a symbol or alias\n exactly. A longer word that only continues the query is named as a\n prefix, so landau is not reported as Landauer without saying so.\n A catalog bridge with no evaluator and a formalRef routes to\n upt atlas, and the hit quotes that reference's covers line.\n No match is a result: exit 0, naming the registries searched.\n e.g. upt search Schrödinger\n upt search thermal noise`;\n\nconst PER_SECTION = 10;\n\nasync function run(ctx: CommandCtx): Promise<number> {\n const { args, api, out } = ctx;\n const raw = [...args.positionals];\n if (raw.length === 0) throw new UsageError('upt search: give at least one word, e.g. `upt search thermal noise`');\n const query = queryWords(raw);\n if (query.length === 0) throw new UsageError('upt search: give at least one word, e.g. `upt search thermal noise`');\n const index = buildSearchIndex(api);\n const significant = query.length > 1 ? query.filter((q) => !STOP_WORDS.has(fold(q))) : query;\n if (significant.length === 0) throw new UsageError(`upt search: '${query.join(' ')}' has only stop words`);\n const matches = matchEveryWord(api, index, significant);\n\n const counts = SEARCH_SECTIONS.map(([k, title]) => `${index.filter((e) => e.kind === k).length} ${title}`).join(', ');\n const scope = `searched ${counts}; this registry only`;\n\n if (args.flags.has('json')) {\n emitJson(\n {\n command: 'search',\n epistemics:\n 'Matched by the words of names, ids, symbols, genuine aliases and catalog-bridge descriptions. ' +\n 'An equal dimension is never a match. No match means none in these registries, not none in physics.',\n options: { query },\n result: {\n scope,\n matches: matches.map((m) => ({\n kind: m.entry.kind,\n id: m.entry.id,\n summary: m.entry.line,\n matchedIn: m.matchedIn,\n ...(m.alias === undefined ? {} : { alias: m.alias }),\n command: m.entry.command,\n ...(m.prefixes === undefined ? {} : { prefixes: m.prefixes }),\n })),\n },\n },\n ctx.write,\n );\n return 0;\n }\n\n // No match is the result the search computed, not an error: exit 0, and the\n // scope is printed because an empty result is an absence from this registry.\n if (matches.length === 0) {\n out(`upt search ${query.join(' ')} — no entry matches every word of '${query.join(' ')}'`);\n out(` ${scope}; an absence here is not an absence from physics`);\n return 0;\n }\n out(`\\nupt search ${query.join(' ')} — ${matches.length} match(es); every word matched`);\n out(' matched by words, symbols and genuine aliases; an equal dimension is never a match (a radius is not a wavelength)');\n for (const [kind, title] of SEARCH_SECTIONS) {\n const inKind = matches.filter((m) => m.entry.kind === kind);\n if (inKind.length === 0) continue;\n out(`\\n${title}:`);\n for (const m of inKind.slice(0, PER_SECTION)) {\n const prefix = (m.prefixes ?? []).map((p) => `${p.query} is a prefix of ${p.word}`).join('; ');\n out(` ${m.entry.line}${m.alias === undefined ? '' : ` (alias ${m.alias})`} [words in: ${m.matchedIn.join(', ')}${prefix === '' ? '' : `; ${prefix}`}]`);\n out(` ${m.entry.commandLabel}: ${m.entry.command}${m.entry.note === undefined ? '' : ` (${m.entry.note})`}`);\n }\n if (inKind.length > PER_SECTION) out(` … and ${inKind.length - PER_SECTION} more (--json lists every match)`);\n }\n out(`\\n${scope}.`);\n return 0;\n}\n\nexport const command: Command = {\n name: 'search',\n aliases: [],\n positionals: { max: Infinity },\n flags: FLAGS,\n help: commandHelp(HELP, FLAGS),\n summary: 'Find a bridge, equation, model, quantity, case, or regime by the words in its record.',\n example: 'upt search thermal noise',\n group: 'explore',\n run,\n};\nregisterCommand(command);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"symbolic.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/symbolic.ts"],"names":[],"mappings":"AAOA,OAAO,EAAmB,KAAK,OAAO,EAAmB,MAAM,eAAe,CAAC;AAiP/E,eAAO,MAAM,OAAO,EAAE,OASrB,CAAC"}
1
+ {"version":3,"file":"symbolic.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/symbolic.ts"],"names":[],"mappings":"AAOA,OAAO,EAAmB,KAAK,OAAO,EAAmB,MAAM,eAAe,CAAC;AA4O/E,eAAO,MAAM,OAAO,EAAE,OASrB,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { registerCommand } from '../command.js';
2
2
  import { commandHelp, JSON_FLAG } from '../flag-help.js';
3
3
  import { emitJson } from '../output.js';
4
- import { EVAL_STUBS, printDisplay, printEval, printLatex, latexName, siUnitOf } from '../expr-print.js';
4
+ import { EVAL_STUBS, printDisplay, printEval, printLatex, latexName } from '../expr-print.js';
5
5
  const FLAGS = [
6
6
  {
7
7
  name: '--simplify',
@@ -28,25 +28,21 @@ function exprToString(n) {
28
28
  * and leaf bound, so copying it reproduces the printed value. `null` when the
29
29
  * AST holds a node the scalar evaluator cannot take.
30
30
  */
31
- function evalFormOf(n, constants, point) {
31
+ function evalFormOf(n, api, point) {
32
32
  const formula = printEval(n);
33
33
  if (formula === null)
34
34
  return null;
35
35
  const names = [];
36
- const collect = (e) => {
37
- if (e.kind === 'symbol') {
38
- if (!names.includes(e.name))
39
- names.push(e.name);
40
- }
41
- else if (e.kind === 'op')
42
- e.args.forEach(collect);
43
- };
44
- collect(n);
36
+ // The leaves under `op` arguments only: a node the scalar evaluator cannot take has no eval form.
37
+ api.forEachScalarLeaf(n, (leaf) => {
38
+ if (!names.includes(leaf.name))
39
+ names.push(leaf.name);
40
+ }, {});
45
41
  const bindings = [];
46
42
  for (const name of names) {
47
- if (name in EVAL_STUBS || Number.isFinite(Number(name)))
43
+ if (name in EVAL_STUBS || api.isDecimalLiteral(name))
48
44
  continue;
49
- const value = constants[name]?.value ?? point[name];
45
+ const value = api.CONSTANTS[name]?.value ?? point[name];
50
46
  if (value === undefined)
51
47
  return null;
52
48
  bindings.push(`${name}=${value}`);
@@ -62,15 +58,10 @@ const SOLAR_MASS_SOURCE = 'evaluation point: the solar mass 1.989e30 kg, the rou
62
58
  */
63
59
  function symbolTable(n, api, inputs, point) {
64
60
  const names = [];
65
- const collect = (e) => {
66
- if (e.kind === 'symbol') {
67
- if (!names.includes(e.name) && !Number.isFinite(Number(e.name)))
68
- names.push(e.name);
69
- }
70
- else if (e.kind === 'op')
71
- e.args.forEach(collect);
72
- };
73
- collect(n);
61
+ api.forEachScalarLeaf(n, (leaf) => {
62
+ if (!names.includes(leaf.name) && !api.isDecimalLiteral(leaf.name))
63
+ names.push(leaf.name);
64
+ }, {});
74
65
  const rows = [];
75
66
  for (const name of names) {
76
67
  const c = api.CONSTANTS[name];
@@ -87,7 +78,7 @@ function symbolTable(n, api, inputs, point) {
87
78
  symbol: name,
88
79
  meaning: `input quantity ${q.name} (symbol ${q.symbol}), ${api.format(q.dim)}`,
89
80
  value: v,
90
- unit: siUnitOf(q.dim),
81
+ unit: api.siUnitOf(q.dim),
91
82
  source: name === 'mass' && v === api.M_SUN_KG ? SOLAR_MASS_SOURCE : 'evaluation point',
92
83
  });
93
84
  }
@@ -136,7 +127,7 @@ async function run(ctx) {
136
127
  const graded = [first, second].filter((edge) => edge.beId !== null && api.catalogEntry(edge.beId)?.status !== 'established');
137
128
  const grade = graded.length === 0
138
129
  ? null
139
- : { confidence: api.composeEdges(first, second).confidence, gradedBy: graded.map((edge) => `be-${edge.beId}`) };
130
+ : { confidence: api.composeEdges(first, second).confidence, gradedBy: graded.map((edge) => api.catalogEdgeKey(edge.beId)) };
140
131
  if (!isJson) {
141
132
  out(` ● ${label}`);
142
133
  out(` composed: ${obs.name}(${obs.leaves.join(',')}) = ${exprToString(obs.expr)}`);
@@ -151,7 +142,7 @@ async function run(ctx) {
151
142
  leaves: s.leaves,
152
143
  expr: exprToString(s.expr),
153
144
  latex: latexOf(s.name, s.leaves, s.expr),
154
- evalForm: evalFormOf(s.expr, api.CONSTANTS, point),
145
+ evalForm: evalFormOf(s.expr, api, point),
155
146
  symbols: symbolTable(s.expr, api, inputs, point),
156
147
  dim: api.format(s.dim),
157
148
  value: sNum,
@@ -163,7 +154,7 @@ async function run(ctx) {
163
154
  const tag = s.expr === obs.expr ? ' (unchanged — minimal, or not reducible here)' : '';
164
155
  out(` simplified: ${s.name}(${s.leaves.join(',')}) = ${exprToString(s.expr)}${tag}`);
165
156
  out(` latex: ${latexOf(s.name, s.leaves, s.expr) ?? 'none (a node the printer cannot take)'}`);
166
- out(` eval form: ${showEvalForm(evalFormOf(s.expr, api.CONSTANTS, point))}`);
157
+ out(` eval form: ${showEvalForm(evalFormOf(s.expr, api, point))}`);
167
158
  showSymbolTable(symbolTable(s.expr, api, inputs, point), out);
168
159
  out(` value @ mass = M_sun: ${api.formatQuantity(sNum)} (= composed, ${api.format(s.dim)})`);
169
160
  }
@@ -175,7 +166,7 @@ async function run(ctx) {
175
166
  leaves: obs.leaves,
176
167
  expr: exprToString(obs.expr),
177
168
  latex: latexOf(obs.name, obs.leaves, obs.expr),
178
- evalForm: evalFormOf(obs.expr, api.CONSTANTS, point),
169
+ evalForm: evalFormOf(obs.expr, api, point),
179
170
  symbols: symbolTable(obs.expr, api, inputs, point),
180
171
  dim: api.format(obs.dim),
181
172
  value: num,
@@ -184,7 +175,7 @@ async function run(ctx) {
184
175
  }
185
176
  else {
186
177
  out(` latex: ${latexOf(obs.name, obs.leaves, obs.expr) ?? 'none (a node the printer cannot take)'}`);
187
- out(` eval form: ${showEvalForm(evalFormOf(obs.expr, api.CONSTANTS, point))}`);
178
+ out(` eval form: ${showEvalForm(evalFormOf(obs.expr, api, point))}`);
188
179
  showSymbolTable(symbolTable(obs.expr, api, inputs, point), out);
189
180
  out(` dimension: ${api.format(obs.dim)} (validated on the composed AST)`);
190
181
  out(` value @ mass = M_sun: ${api.formatQuantity(num)}`);
@@ -1 +1 @@
1
- {"version":3,"file":"symbolic.js","sourceRoot":"","sources":["../../../src/cli/commands/symbolic.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAiC,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAExG,MAAM,KAAK,GAAe;IACxB;QACE,IAAI,EAAE,YAAY;QAClB,UAAU,EAAE,MAAM;QAClB,WAAW,EAAE,wFAAwF;KACtG;IACD,SAAS;CACV,CAAC;AAEF,MAAM,IAAI,GAAG;;;;;;;;;4EAS+D,CAAC;AAE7E,SAAS,YAAY,CAAC,CAAW;IAC/B,OAAO,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CACjB,CAAW,EACX,SAAyC,EACzC,KAAuC;IAEvC,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,CAAC,CAAW,EAAQ,EAAE;QACpC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI;YAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC,CAAC;IACF,OAAO,CAAC,CAAC,CAAC,CAAC;IACX,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,IAAI,UAAU,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAAE,SAAS;QAClE,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACrC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,CAAiD,EAAU,EAAE,CACjF,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,gDAAgD,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAWpH,MAAM,iBAAiB,GACrB,kHAAkH,CAAC;AAErH;;;;GAIG;AACH,SAAS,WAAW,CAClB,CAAW,EACX,GAAsB,EACtB,MAAoG,EACpG,KAAuC;IAEvC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,CAAC,CAAW,EAAQ,EAAE;QACpC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtF,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI;YAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC,CAAC;IACF,OAAO,CAAC,CAAC,CAAC,CAAC;IACX,MAAM,IAAI,GAAgB,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACzG,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC;YACR,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,kBAAkB,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;YAC9E,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;YACrB,MAAM,EAAE,IAAI,KAAK,MAAM,IAAI,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,kBAAkB;SACvF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,IAAiC,EAAE,GAAsB;IAChF,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,GAAG,CAAC,+EAA+E,CAAC,CAAC;QACrF,OAAO;IACT,CAAC;IACD,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACtB,MAAM,CAAC,GAAG,CAAC,CAAkB,EAAU,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5F,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5E,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAClI,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,MAAyB,EAAE,CAAW,EAAiB,EAAE;IACtF,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC1B,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;AAClG,CAAC,CAAC;AACF,KAAK,UAAU,GAAG,CAAC,GAAe;IAChC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;IAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,GAAG,CAAC,kBAAkB,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG;QACb,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,6EAA6E,EAAE;QACpI;YACE,KAAK,EAAE,IAAI,CAAC,aAAa;YACzB,MAAM,EAAE,IAAI,CAAC,gBAAgB;YAC7B,KAAK,EAAE,qFAAqF;SAC7F;KACF,CAAC;IAEF,MAAM,UAAU,GAAc,EAAE,CAAC;IAEjC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,GAAG,CAAC,gFAAgF,CAAC,CAAC;QACtF,GAAG,CAAC,4FAA4F,CAAC,CAAC;IACpG,CAAC;IAED,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,MAAM,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QACrD,wFAAwF;QACxF,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,CACnC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,aAAa,CACtF,CAAC;QACF,MAAM,KAAK,GACT,MAAM,CAAC,MAAM,KAAK,CAAC;YACjB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAEpH,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;YACpB,GAAG,CAAC,qBAAqB,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5F,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YAChD,IAAI,MAAM,EAAE,CAAC;gBACX,UAAU,CAAC,IAAI,CAAC;oBACd,KAAK;oBACL,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;oBAC1B,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;oBACxC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC;oBAClD,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC;oBAChD,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;oBACtB,KAAK,EAAE,IAAI;oBACX,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;oBAChB,UAAU,EAAE,IAAI;iBACjB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,gDAAgD,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxF,GAAG,CAAC,qBAAqB,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;gBAC1F,GAAG,CAAC,qBAAqB,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,uCAAuC,EAAE,CAAC,CAAC;gBACzG,GAAG,CAAC,qBAAqB,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBACnF,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;gBAC9D,GAAG,CAAC,gCAAgC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,kBAAkB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACtG,CAAC;QACH,CAAC;aAAM,IAAI,MAAM,EAAE,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC;gBACd,KAAK;gBACL,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC5B,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC;gBAC9C,QAAQ,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC;gBACpD,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC;gBAClD,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;gBACxB,KAAK,EAAE,GAAG;gBACV,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;aACjB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,qBAAqB,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,uCAAuC,EAAE,CAAC,CAAC;YAC/G,GAAG,CAAC,qBAAqB,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACrF,eAAe,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;YAChE,GAAG,CAAC,oBAAoB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YACjF,GAAG,CAAC,gCAAgC,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3C,GAAG,CACD,qBAAqB,KAAK,CAAC,UAAU,kCAAkC;gBACrE,aAAa,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,+CAA+C,CAAC,CAAC,CAAC,+CAA+C,cAAc,CAC9J,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM;YAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,QAAQ,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QACjE,OAAO,CAAC,CAAC;IACX,CAAC;IAED,GAAG,CAAC,uFAAuF,CAAC,CAAC;IAC7F,GAAG,CACD,gCAAgC;UAC5B,CAAC,UAAU;YACX,CAAC,CAAC,wFAAwF;YAC1F,CAAC,CAAC,uDAAuD,CAAC,CAC/D,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAY;IAC9B,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,CAAC,kBAAkB,CAAC;IAC7B,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC;IAC9B,OAAO,EAAE,6DAA6D;IACtE,OAAO,EAAE,cAAc;IACvB,KAAK,EAAE,UAAU;IACjB,GAAG;CACJ,CAAC;AAEF,eAAe,CAAC,OAAO,CAAC,CAAC","sourcesContent":["/**\n * `upt symbolic` — compose bridges' SYMBOLIC (AST) forms, not just their\n * numeric evaluators (the Observable contract). Transposed verbatim from\n * bin/upt.mjs's `symbolicCmd()` + `exprToString()` (lines 734-777), plus\n * `--json`.\n */\nimport type { FlagSpec } from '../args.js';\nimport { registerCommand, type Command, type CommandCtx } from '../command.js';\nimport { commandHelp, JSON_FLAG } from '../flag-help.js';\nimport { emitJson } from '../output.js';\nimport type { ExprNode } from '../../dimensional/validator.js';\nimport { EVAL_STUBS, printDisplay, printEval, printLatex, latexName, siUnitOf } from '../expr-print.js';\n\nconst FLAGS: FlagSpec[] = [\n {\n name: '--simplify',\n valueStyle: 'none',\n description: 'Fold each composed AST with MathTS, then check the fold dimensionally and numerically.',\n },\n JSON_FLAG,\n];\n\nconst HELP = `upt symbolic [--simplify]\n Compose bridges' SYMBOLIC (AST) forms, not just their numeric\n evaluators (the Observable contract). Shows the CT-1 / CT-1b chains\n composed by substitution, dimensionally validated and evaluable.\n With --simplify, folds the composed AST via MathTS (k_B cancels),\n re-validated dimensionally + numerically. Each chain also prints an\n 'eval form': a runnable \\`upt eval\\` command, fully grouped, that\n reproduces the printed value, a LaTeX form (\\\\frac for every\n division) and a symbol table: each symbol's meaning, value, SI unit\n and the source of a constant or the point an input is evaluated at.`;\n\nfunction exprToString(n: ExprNode): string {\n return printDisplay(n) ?? `⟨${n.kind}⟩`;\n}\n\n/**\n * The composed formula as a runnable `upt eval` input, with every constant\n * and leaf bound, so copying it reproduces the printed value. `null` when the\n * AST holds a node the scalar evaluator cannot take.\n */\nfunction evalFormOf(\n n: ExprNode,\n constants: CommandCtx['api']['CONSTANTS'],\n point: Readonly<Record<string, number>>,\n): { formula: string; bindings: string[] } | null {\n const formula = printEval(n);\n if (formula === null) return null;\n const names: string[] = [];\n const collect = (e: ExprNode): void => {\n if (e.kind === 'symbol') {\n if (!names.includes(e.name)) names.push(e.name);\n } else if (e.kind === 'op') e.args.forEach(collect);\n };\n collect(n);\n const bindings: string[] = [];\n for (const name of names) {\n if (name in EVAL_STUBS || Number.isFinite(Number(name))) continue;\n const value = constants[name]?.value ?? point[name];\n if (value === undefined) return null;\n bindings.push(`${name}=${value}`);\n }\n return { formula, bindings };\n}\n\nconst showEvalForm = (f: { formula: string; bindings: string[] } | null): string =>\n f === null ? 'none (a node the scalar evaluator cannot take)' : `upt eval \"${f.formula}\" ${f.bindings.join(' ')}`;\n\n/** One row of the symbol table (audit I10). */\ninterface SymbolRow {\n readonly symbol: string;\n readonly meaning: string;\n readonly value: number;\n readonly unit: string;\n readonly source: string;\n}\n\nconst SOLAR_MASS_SOURCE =\n 'evaluation point: the solar mass 1.989e30 kg, the rounded value the repository uses (core/constants.ts M_SUN_SI)';\n\n/**\n * Every named symbol of the formula, in order of first use: a registered constant with its meaning,\n * unit and source; an input with its quantity and the point it is evaluated at. Numeric literals are\n * not symbols. `null` when a name is neither, so no row is ever invented.\n */\nfunction symbolTable(\n n: ExprNode,\n api: CommandCtx['api'],\n inputs: readonly { name: string; symbol: string; dim: Parameters<CommandCtx['api']['format']>[0] }[],\n point: Readonly<Record<string, number>>,\n): SymbolRow[] | null {\n const names: string[] = [];\n const collect = (e: ExprNode): void => {\n if (e.kind === 'symbol') {\n if (!names.includes(e.name) && !Number.isFinite(Number(e.name))) names.push(e.name);\n } else if (e.kind === 'op') e.args.forEach(collect);\n };\n collect(n);\n const rows: SymbolRow[] = [];\n for (const name of names) {\n const c = api.CONSTANTS[name];\n const info = api.CONSTANT_PROVENANCE[name];\n if (c !== undefined && info !== undefined) {\n rows.push({ symbol: name, meaning: info.meaning, value: c.value, unit: info.unit, source: info.source });\n continue;\n }\n const q = inputs.find((i) => i.name === name);\n const v = point[name];\n if (q === undefined || v === undefined) return null;\n rows.push({\n symbol: name,\n meaning: `input quantity ${q.name} (symbol ${q.symbol}), ${api.format(q.dim)}`,\n value: v,\n unit: siUnitOf(q.dim),\n source: name === 'mass' && v === api.M_SUN_KG ? SOLAR_MASS_SOURCE : 'evaluation point',\n });\n }\n return rows;\n}\n\nfunction showSymbolTable(rows: readonly SymbolRow[] | null, out: CommandCtx['out']): void {\n if (rows === null) {\n out(' symbols: none (a name is neither a registered constant nor an input)');\n return;\n }\n out(' symbols:');\n const w = (k: keyof SymbolRow): number => Math.max(...rows.map((r) => String(r[k]).length));\n const [ws, wm, wv, wu] = [w('symbol'), w('meaning'), w('value'), w('unit')];\n for (const r of rows) {\n out(` ${r.symbol.padEnd(ws)} ${r.meaning.padEnd(wm)} ${String(r.value).padEnd(wv)} ${r.unit.padEnd(wu)} ${r.source}`);\n }\n}\n\nconst latexOf = (name: string, leaves: readonly string[], n: ExprNode): string | null => {\n const rhs = printLatex(n);\n return rhs === null ? null : `${latexName(name)}(${leaves.map(latexName).join(', ')}) = ${rhs}`;\n};\nasync function run(ctx: CommandCtx): Promise<number> {\n const { args, api, out } = ctx;\n const doSimplify = args.flags.has('simplify');\n const isJson = args.flags.has('json');\n const demo = api.demonstrationEdges();\n const chains = [\n { first: demo.hawking, second: demo.landauer, label: 'CT-1 (Hawking temperature composed with Landauer erasure, via temperature)' },\n {\n first: demo.schwarzschild,\n second: demo.hawkingViaRadius,\n label: 'CT-1b (Schwarzschild radius composed with Hawking temperature, name-match junction)',\n },\n ];\n\n const jsonResult: unknown[] = [];\n\n if (!isJson) {\n out('\\nSymbolic bridge composition — composing the SYMBOLIC forms, not just numbers');\n out('(the Observable contract: composed AST, dimensionally validated + numerically evaluable)\\n');\n }\n\n for (const { first, second, label } of chains) {\n const obs = api.composeSymbolic(first, second);\n const point = { mass: api.M_SUN_KG };\n const num = obs.evaluate(point);\n const inputs = [...first.sources, ...second.sources];\n // Every edge whose catalog status is below established grades the chain; name each one.\n const graded = [first, second].filter(\n (edge) => edge.beId !== null && api.catalogEntry(edge.beId)?.status !== 'established',\n );\n const grade =\n graded.length === 0\n ? null\n : { confidence: api.composeEdges(first, second).confidence, gradedBy: graded.map((edge) => `be-${edge.beId}`) };\n\n if (!isJson) {\n out(` ● ${label}`);\n out(` composed: ${obs.name}(${obs.leaves.join(',')}) = ${exprToString(obs.expr)}`);\n }\n\n if (doSimplify) {\n const s = await api.simplifyObservable(obs);\n const sNum = s.evaluate({ mass: api.M_SUN_KG });\n if (isJson) {\n jsonResult.push({\n label,\n name: s.name,\n leaves: s.leaves,\n expr: exprToString(s.expr),\n latex: latexOf(s.name, s.leaves, s.expr),\n evalForm: evalFormOf(s.expr, api.CONSTANTS, point),\n symbols: symbolTable(s.expr, api, inputs, point),\n dim: api.format(s.dim),\n value: sNum,\n ...(grade ?? {}),\n simplified: true,\n });\n } else {\n const tag = s.expr === obs.expr ? ' (unchanged — minimal, or not reducible here)' : '';\n out(` simplified: ${s.name}(${s.leaves.join(',')}) = ${exprToString(s.expr)}${tag}`);\n out(` latex: ${latexOf(s.name, s.leaves, s.expr) ?? 'none (a node the printer cannot take)'}`);\n out(` eval form: ${showEvalForm(evalFormOf(s.expr, api.CONSTANTS, point))}`);\n showSymbolTable(symbolTable(s.expr, api, inputs, point), out);\n out(` value @ mass = M_sun: ${api.formatQuantity(sNum)} (= composed, ${api.format(s.dim)})`);\n }\n } else if (isJson) {\n jsonResult.push({\n label,\n name: obs.name,\n leaves: obs.leaves,\n expr: exprToString(obs.expr),\n latex: latexOf(obs.name, obs.leaves, obs.expr),\n evalForm: evalFormOf(obs.expr, api.CONSTANTS, point),\n symbols: symbolTable(obs.expr, api, inputs, point),\n dim: api.format(obs.dim),\n value: num,\n ...(grade ?? {}),\n });\n } else {\n out(` latex: ${latexOf(obs.name, obs.leaves, obs.expr) ?? 'none (a node the printer cannot take)'}`);\n out(` eval form: ${showEvalForm(evalFormOf(obs.expr, api.CONSTANTS, point))}`);\n showSymbolTable(symbolTable(obs.expr, api, inputs, point), out);\n out(` dimension: ${api.format(obs.dim)} (validated on the composed AST)`);\n out(` value @ mass = M_sun: ${api.formatQuantity(num)}`);\n }\n if (!isJson && grade !== null) {\n const pages = grade.gradedBy.join(' and ');\n out(\n ` confidence: ${grade.confidence}. This chain stays provisional. ` +\n `upt atlas ${pages} ${graded.length === 1 ? \"shows that edge's formalRef; that page is not\" : \"show those edges' formalRefs; neither page is\"} this grade.`,\n );\n }\n if (!isJson) out('');\n }\n\n if (isJson) {\n emitJson({ command: 'symbolic', result: jsonResult }, ctx.write);\n return 0;\n }\n\n out(' Both compose by AST substitution at the junction and match the numeric composeEdges');\n out(\n ' pipeline to float precision.'\n + (doSimplify\n ? ' --simplify folds the composed AST via MathTS (k_B cancels), guarded by re-validation.'\n : ' Pass --simplify to fold the composed AST via MathTS.')\n );\n return 0;\n}\n\nexport const command: Command = {\n name: 'symbolic',\n aliases: ['compose-symbolic'],\n flags: FLAGS,\n help: commandHelp(HELP, FLAGS),\n summary: 'Compose the symbolic forms of the registered bridge chains.',\n example: 'upt symbolic',\n group: 'evaluate',\n run,\n};\n\nregisterCommand(command);\n"]}
1
+ {"version":3,"file":"symbolic.js","sourceRoot":"","sources":["../../../src/cli/commands/symbolic.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `upt symbolic` — compose bridges' SYMBOLIC (AST) forms, not just their\n * numeric evaluators (the Observable contract). Transposed verbatim from\n * bin/upt.mjs's `symbolicCmd()` + `exprToString()` (lines 734-777), plus\n * `--json`.\n */\nimport type { FlagSpec } from '../args.js';\nimport { registerCommand, type Command, type CommandCtx } from '../command.js';\nimport { commandHelp, JSON_FLAG } from '../flag-help.js';\nimport { emitJson } from '../output.js';\nimport type { ExprNode } from '../../dimensional/validator.js';\nimport { EVAL_STUBS, printDisplay, printEval, printLatex, latexName } from '../expr-print.js';\n\nconst FLAGS: FlagSpec[] = [\n {\n name: '--simplify',\n valueStyle: 'none',\n description: 'Fold each composed AST with MathTS, then check the fold dimensionally and numerically.',\n },\n JSON_FLAG,\n];\n\nconst HELP = `upt symbolic [--simplify]\n Compose bridges' SYMBOLIC (AST) forms, not just their numeric\n evaluators (the Observable contract). Shows the CT-1 / CT-1b chains\n composed by substitution, dimensionally validated and evaluable.\n With --simplify, folds the composed AST via MathTS (k_B cancels),\n re-validated dimensionally + numerically. Each chain also prints an\n 'eval form': a runnable \\`upt eval\\` command, fully grouped, that\n reproduces the printed value, a LaTeX form (\\\\frac for every\n division) and a symbol table: each symbol's meaning, value, SI unit\n and the source of a constant or the point an input is evaluated at.`;\n\nfunction exprToString(n: ExprNode): string {\n return printDisplay(n) ?? `⟨${n.kind}⟩`;\n}\n\n/**\n * The composed formula as a runnable `upt eval` input, with every constant\n * and leaf bound, so copying it reproduces the printed value. `null` when the\n * AST holds a node the scalar evaluator cannot take.\n */\nfunction evalFormOf(\n n: ExprNode,\n api: CommandCtx['api'],\n point: Readonly<Record<string, number>>,\n): { formula: string; bindings: string[] } | null {\n const formula = printEval(n);\n if (formula === null) return null;\n const names: string[] = [];\n // The leaves under `op` arguments only: a node the scalar evaluator cannot take has no eval form.\n api.forEachScalarLeaf(n, (leaf) => {\n if (!names.includes(leaf.name)) names.push(leaf.name);\n }, {});\n const bindings: string[] = [];\n for (const name of names) {\n if (name in EVAL_STUBS || api.isDecimalLiteral(name)) continue;\n const value = api.CONSTANTS[name]?.value ?? point[name];\n if (value === undefined) return null;\n bindings.push(`${name}=${value}`);\n }\n return { formula, bindings };\n}\n\nconst showEvalForm = (f: { formula: string; bindings: string[] } | null): string =>\n f === null ? 'none (a node the scalar evaluator cannot take)' : `upt eval \"${f.formula}\" ${f.bindings.join(' ')}`;\n\n/** One row of the symbol table (audit I10). */\ninterface SymbolRow {\n readonly symbol: string;\n readonly meaning: string;\n readonly value: number;\n readonly unit: string;\n readonly source: string;\n}\n\nconst SOLAR_MASS_SOURCE =\n 'evaluation point: the solar mass 1.989e30 kg, the rounded value the repository uses (core/constants.ts M_SUN_SI)';\n\n/**\n * Every named symbol of the formula, in order of first use: a registered constant with its meaning,\n * unit and source; an input with its quantity and the point it is evaluated at. Numeric literals are\n * not symbols. `null` when a name is neither, so no row is ever invented.\n */\nfunction symbolTable(\n n: ExprNode,\n api: CommandCtx['api'],\n inputs: readonly { name: string; symbol: string; dim: Parameters<CommandCtx['api']['format']>[0] }[],\n point: Readonly<Record<string, number>>,\n): SymbolRow[] | null {\n const names: string[] = [];\n api.forEachScalarLeaf(n, (leaf) => {\n if (!names.includes(leaf.name) && !api.isDecimalLiteral(leaf.name)) names.push(leaf.name);\n }, {});\n const rows: SymbolRow[] = [];\n for (const name of names) {\n const c = api.CONSTANTS[name];\n const info = api.CONSTANT_PROVENANCE[name];\n if (c !== undefined && info !== undefined) {\n rows.push({ symbol: name, meaning: info.meaning, value: c.value, unit: info.unit, source: info.source });\n continue;\n }\n const q = inputs.find((i) => i.name === name);\n const v = point[name];\n if (q === undefined || v === undefined) return null;\n rows.push({\n symbol: name,\n meaning: `input quantity ${q.name} (symbol ${q.symbol}), ${api.format(q.dim)}`,\n value: v,\n unit: api.siUnitOf(q.dim),\n source: name === 'mass' && v === api.M_SUN_KG ? SOLAR_MASS_SOURCE : 'evaluation point',\n });\n }\n return rows;\n}\n\nfunction showSymbolTable(rows: readonly SymbolRow[] | null, out: CommandCtx['out']): void {\n if (rows === null) {\n out(' symbols: none (a name is neither a registered constant nor an input)');\n return;\n }\n out(' symbols:');\n const w = (k: keyof SymbolRow): number => Math.max(...rows.map((r) => String(r[k]).length));\n const [ws, wm, wv, wu] = [w('symbol'), w('meaning'), w('value'), w('unit')];\n for (const r of rows) {\n out(` ${r.symbol.padEnd(ws)} ${r.meaning.padEnd(wm)} ${String(r.value).padEnd(wv)} ${r.unit.padEnd(wu)} ${r.source}`);\n }\n}\n\nconst latexOf = (name: string, leaves: readonly string[], n: ExprNode): string | null => {\n const rhs = printLatex(n);\n return rhs === null ? null : `${latexName(name)}(${leaves.map(latexName).join(', ')}) = ${rhs}`;\n};\nasync function run(ctx: CommandCtx): Promise<number> {\n const { args, api, out } = ctx;\n const doSimplify = args.flags.has('simplify');\n const isJson = args.flags.has('json');\n const demo = api.demonstrationEdges();\n const chains = [\n { first: demo.hawking, second: demo.landauer, label: 'CT-1 (Hawking temperature composed with Landauer erasure, via temperature)' },\n {\n first: demo.schwarzschild,\n second: demo.hawkingViaRadius,\n label: 'CT-1b (Schwarzschild radius composed with Hawking temperature, name-match junction)',\n },\n ];\n\n const jsonResult: unknown[] = [];\n\n if (!isJson) {\n out('\\nSymbolic bridge composition — composing the SYMBOLIC forms, not just numbers');\n out('(the Observable contract: composed AST, dimensionally validated + numerically evaluable)\\n');\n }\n\n for (const { first, second, label } of chains) {\n const obs = api.composeSymbolic(first, second);\n const point = { mass: api.M_SUN_KG };\n const num = obs.evaluate(point);\n const inputs = [...first.sources, ...second.sources];\n // Every edge whose catalog status is below established grades the chain; name each one.\n const graded = [first, second].filter(\n (edge) => edge.beId !== null && api.catalogEntry(edge.beId)?.status !== 'established',\n );\n const grade =\n graded.length === 0\n ? null\n : { confidence: api.composeEdges(first, second).confidence, gradedBy: graded.map((edge) => api.catalogEdgeKey(edge.beId!)) };\n\n if (!isJson) {\n out(` ● ${label}`);\n out(` composed: ${obs.name}(${obs.leaves.join(',')}) = ${exprToString(obs.expr)}`);\n }\n\n if (doSimplify) {\n const s = await api.simplifyObservable(obs);\n const sNum = s.evaluate({ mass: api.M_SUN_KG });\n if (isJson) {\n jsonResult.push({\n label,\n name: s.name,\n leaves: s.leaves,\n expr: exprToString(s.expr),\n latex: latexOf(s.name, s.leaves, s.expr),\n evalForm: evalFormOf(s.expr, api, point),\n symbols: symbolTable(s.expr, api, inputs, point),\n dim: api.format(s.dim),\n value: sNum,\n ...(grade ?? {}),\n simplified: true,\n });\n } else {\n const tag = s.expr === obs.expr ? ' (unchanged — minimal, or not reducible here)' : '';\n out(` simplified: ${s.name}(${s.leaves.join(',')}) = ${exprToString(s.expr)}${tag}`);\n out(` latex: ${latexOf(s.name, s.leaves, s.expr) ?? 'none (a node the printer cannot take)'}`);\n out(` eval form: ${showEvalForm(evalFormOf(s.expr, api, point))}`);\n showSymbolTable(symbolTable(s.expr, api, inputs, point), out);\n out(` value @ mass = M_sun: ${api.formatQuantity(sNum)} (= composed, ${api.format(s.dim)})`);\n }\n } else if (isJson) {\n jsonResult.push({\n label,\n name: obs.name,\n leaves: obs.leaves,\n expr: exprToString(obs.expr),\n latex: latexOf(obs.name, obs.leaves, obs.expr),\n evalForm: evalFormOf(obs.expr, api, point),\n symbols: symbolTable(obs.expr, api, inputs, point),\n dim: api.format(obs.dim),\n value: num,\n ...(grade ?? {}),\n });\n } else {\n out(` latex: ${latexOf(obs.name, obs.leaves, obs.expr) ?? 'none (a node the printer cannot take)'}`);\n out(` eval form: ${showEvalForm(evalFormOf(obs.expr, api, point))}`);\n showSymbolTable(symbolTable(obs.expr, api, inputs, point), out);\n out(` dimension: ${api.format(obs.dim)} (validated on the composed AST)`);\n out(` value @ mass = M_sun: ${api.formatQuantity(num)}`);\n }\n if (!isJson && grade !== null) {\n const pages = grade.gradedBy.join(' and ');\n out(\n ` confidence: ${grade.confidence}. This chain stays provisional. ` +\n `upt atlas ${pages} ${graded.length === 1 ? \"shows that edge's formalRef; that page is not\" : \"show those edges' formalRefs; neither page is\"} this grade.`,\n );\n }\n if (!isJson) out('');\n }\n\n if (isJson) {\n emitJson({ command: 'symbolic', result: jsonResult }, ctx.write);\n return 0;\n }\n\n out(' Both compose by AST substitution at the junction and match the numeric composeEdges');\n out(\n ' pipeline to float precision.'\n + (doSimplify\n ? ' --simplify folds the composed AST via MathTS (k_B cancels), guarded by re-validation.'\n : ' Pass --simplify to fold the composed AST via MathTS.')\n );\n return 0;\n}\n\nexport const command: Command = {\n name: 'symbolic',\n aliases: ['compose-symbolic'],\n flags: FLAGS,\n help: commandHelp(HELP, FLAGS),\n summary: 'Compose the symbolic forms of the registered bridge chains.',\n example: 'upt symbolic',\n group: 'evaluate',\n run,\n};\n\nregisterCommand(command);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"testplan.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/testplan.ts"],"names":[],"mappings":"AAQA,OAAO,EAAmB,KAAK,OAAO,EAAmB,MAAM,eAAe,CAAC;AA0J/E,eAAO,MAAM,OAAO,EAAE,OASrB,CAAC"}
1
+ {"version":3,"file":"testplan.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/testplan.ts"],"names":[],"mappings":"AAQA,OAAO,EAAmB,KAAK,OAAO,EAAmB,MAAM,eAAe,CAAC;AA2J/E,eAAO,MAAM,OAAO,EAAE,OAUrB,CAAC"}
@@ -69,15 +69,16 @@ function fromConfrontation(api, id) {
69
69
  throw new CliError(`upt testplan: no confrontation be-${id}`);
70
70
  const outcome = entry.run();
71
71
  const { confirm, falsify } = linesOf(outcome);
72
+ const key = api.catalogEdgeKey(id);
72
73
  return {
73
- id: `be-${id}`,
74
+ id: key,
74
75
  title: entry.title,
75
76
  observable: `${outcome.kind} comparison`,
76
77
  confirm,
77
78
  falsify,
78
79
  notIncluded: [],
79
80
  measurement: [],
80
- links: [`be-${id}`],
81
+ links: [key],
81
82
  preprocessing: outcome.preprocessing.state === 'recorded' ? outcome.preprocessing.statement : 'preprocessing: not-recorded',
82
83
  independence: outcome.independence.state === 'not-recorded' ? 'independence: not-recorded' : outcome.independence.statement,
83
84
  };
@@ -130,6 +131,7 @@ async function run(ctx) {
130
131
  export const command = {
131
132
  name: 'testplan',
132
133
  aliases: [],
134
+ positionals: { max: 1 },
133
135
  flags: FLAGS,
134
136
  help: commandHelp(HELP, FLAGS),
135
137
  summary: 'Print the measurement plan stored on a confrontation or an applied case.',
@@ -1 +1 @@
1
- {"version":3,"file":"testplan.js","sourceRoot":"","sources":["../../../src/cli/commands/testplan.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `upt testplan` — the measurement plan already stored on a case or a\n * confrontation: what would confirm it, what would falsify it, and what the\n * record leaves out. Generated from those records, not from a writeup.\n *\n * @module cli/commands/testplan\n */\nimport type { FlagSpec } from '../args.js';\nimport { registerCommand, type Command, type CommandCtx } from '../command.js';\nimport { commandHelp, JSON_FLAG } from '../flag-help.js';\nimport { emitJson } from '../output.js';\nimport { UsageError, CliError } from '../errors.js';\nimport type { AppliedCase } from '../../cases/types.js';\nimport type { ConfrontationOutcome } from '../../bridges/observations/types.js';\n\nconst FLAGS: FlagSpec[] = [JSON_FLAG];\n\nconst HELP = `upt testplan <be-NN | case-id> [--json]\n The measurement plan for one bridge confrontation or one applied case:\n the observable, the confirm and falsify criteria the record already\n states, what is not included, and the links. Markdown by default,\n JSON with --json. \\`upt help testplan\\` describes every flag.\n e.g. upt testplan be-58\n upt testplan case-brownian-sphere\n upt testplan case-skin-depth --json`;\n\ninterface Plan {\n readonly id: string;\n readonly title: string;\n readonly observable: string;\n readonly confirm: readonly string[];\n readonly falsify: readonly string[];\n readonly notIncluded: readonly string[];\n readonly measurement: readonly string[];\n readonly links: readonly string[];\n readonly preprocessing?: string;\n readonly independence?: string;\n}\n\nfunction linesOf(outcome: ConfrontationOutcome): { confirm: string[]; falsify: string[] } {\n if (outcome.kind === 'value') {\n return {\n confirm: [\n `predicted ${outcome.predicted} ${outcome.units}, observed ${outcome.observed} ± ${outcome.sigma} ${outcome.units}`,\n `within the stated comparison: ${outcome.withinObserved}`,\n ],\n falsify: [\n outcome.withinObserved\n ? 'a later measurement outside that comparison falsifies the recorded agreement'\n : 'the recorded comparison is already outside the stated band',\n ],\n };\n }\n if (outcome.kind === 'upper-bound') {\n return {\n confirm: [`predicted ${outcome.predicted}, observed bound ${outcome.bound}, satisfied: ${outcome.satisfied}`],\n falsify: ['an observed bound that fails the recorded comparison falsifies it'],\n };\n }\n if (outcome.kind === 'table') {\n return {\n confirm: outcome.rows.map(\n (r) => `${r.label}: predicted ${r.predicted}, observed ${r.observed} ± ${r.sigma} ${outcome.units}`,\n ),\n falsify: ['a row whose residual leaves the recorded comparison falsifies that row'],\n };\n }\n return {\n confirm: [\n `predicted ${outcome.predicted}, approaches ${outcome.approaches}, fractional gap ${outcome.fractionalGap} (${outcome.fractionalGapIs})`,\n ],\n falsify: ['a fractional gap outside the record\\'s stated comparison falsifies it'],\n };\n}\n\nfunction fromCase(api: CommandCtx['api'], c: AppliedCase): Plan {\n const { inputs } = api.resolveEvaluatorInputs(c.parameters, c.examples.valid.args);\n const result = api.runAppliedCase(c.id, inputs);\n const held = result.checks.filter((k) => k.holds).map((k) => `${k.id}: ${k.quantity} ${k.op} ${k.bound} — ${k.premise}`);\n const broken = result.checks.filter((k) => !k.holds).map((k) => `${k.id} violated at the worked point`);\n return {\n id: c.id,\n title: c.title,\n observable: `${c.observable} — ${c.outputs.find((o) => o.key === c.observable)?.meaning ?? ''}`,\n confirm: [`worked point: ${c.examples.valid.args.join(' ')} (${c.examples.valid.note})`, ...held],\n falsify: [\n ...c.examples.failures.map((f) => `${f.args.join(' ')} fails ${f.fails.join(', ')} — ${f.note}`),\n ...broken,\n ],\n notIncluded: [...c.notIncluded],\n measurement: [...c.measurement],\n links: c.links.map((l) => `${l.id}: ${l.role}`),\n };\n}\n\nfunction fromConfrontation(api: CommandCtx['api'], id: number): Plan {\n const entry = api.CONFRONTATIONS.get(id);\n if (entry === undefined) throw new CliError(`upt testplan: no confrontation be-${id}`);\n const outcome = entry.run();\n const { confirm, falsify } = linesOf(outcome);\n return {\n id: `be-${id}`,\n title: entry.title,\n observable: `${outcome.kind} comparison`,\n confirm,\n falsify,\n notIncluded: [],\n measurement: [],\n links: [`be-${id}`],\n preprocessing: outcome.preprocessing.state === 'recorded' ? outcome.preprocessing.statement : 'preprocessing: not-recorded',\n independence: outcome.independence.state === 'not-recorded' ? 'independence: not-recorded' : outcome.independence.statement,\n };\n}\n\nfunction markdown(plan: Plan): string {\n const block = (title: string, rows: readonly string[]) =>\n [`## ${title}`, ...(rows.length === 0 ? ['- (none recorded)'] : rows.map((r) => `- ${r}`))].join('\\n');\n return [\n `# Test plan: ${plan.id}`,\n plan.title,\n '',\n `Observable: ${plan.observable}`,\n '',\n block('Confirm', plan.confirm),\n '',\n block('Falsify', plan.falsify),\n '',\n block('Not included', plan.notIncluded),\n '',\n block('Measurement', plan.measurement),\n '',\n block('Links', plan.links),\n ...(plan.preprocessing === undefined ? [] : ['', `Preprocessing: ${plan.preprocessing}`]),\n ...(plan.independence === undefined ? [] : [`Independence: ${plan.independence}`]),\n '',\n ].join('\\n');\n}\n\nasync function run(ctx: CommandCtx): Promise<number> {\n const { args, api, out } = ctx;\n const target = args.positionals[0];\n if (!target) throw new UsageError('upt testplan needs a be-NN id or a case id. See `upt help testplan`.');\n const caseHit = api.APPLIED_CASES.get(target.toLowerCase());\n let plan: Plan;\n if (caseHit !== undefined) plan = fromCase(api, caseHit);\n else {\n const n = api.catalogIdNumber(target);\n if (n === undefined || !api.CONFRONTATIONS.has(n)) {\n throw new CliError(\n `upt testplan: '${target}' is not a case (${[...api.APPLIED_CASES.keys()].join(', ')}) or a confrontation id.`,\n );\n }\n plan = fromConfrontation(api, n);\n }\n if (args.flags.has('json')) {\n emitJson({ command: 'testplan', result: plan }, ctx.write);\n return 0;\n }\n out(markdown(plan));\n return 0;\n}\n\nexport const command: Command = {\n name: 'testplan',\n aliases: [],\n flags: FLAGS,\n help: commandHelp(HELP, FLAGS),\n summary: 'Print the measurement plan stored on a confrontation or an applied case.',\n example: 'upt testplan be-58',\n group: 'data',\n run,\n};\nregisterCommand(command);\n"]}
1
+ {"version":3,"file":"testplan.js","sourceRoot":"","sources":["../../../src/cli/commands/testplan.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,eAAe,EAAiC,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAIpD,MAAM,KAAK,GAAe,CAAC,SAAS,CAAC,CAAC;AAEtC,MAAM,IAAI,GAAG;;;;;;;kDAOqC,CAAC;AAenD,SAAS,OAAO,CAAC,OAA6B;IAC5C,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO;YACL,OAAO,EAAE;gBACP,aAAa,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,KAAK,cAAc,OAAO,CAAC,QAAQ,MAAM,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE;gBACnH,iCAAiC,OAAO,CAAC,cAAc,EAAE;aAC1D;YACD,OAAO,EAAE;gBACP,OAAO,CAAC,cAAc;oBACpB,CAAC,CAAC,8EAA8E;oBAChF,CAAC,CAAC,4DAA4D;aACjE;SACF,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACnC,OAAO;YACL,OAAO,EAAE,CAAC,aAAa,OAAO,CAAC,SAAS,oBAAoB,OAAO,CAAC,KAAK,gBAAgB,OAAO,CAAC,SAAS,EAAE,CAAC;YAC7G,OAAO,EAAE,CAAC,mEAAmE,CAAC;SAC/E,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CACvB,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,eAAe,CAAC,CAAC,SAAS,cAAc,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CACpG;YACD,OAAO,EAAE,CAAC,wEAAwE,CAAC;SACpF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,OAAO,EAAE;YACP,aAAa,OAAO,CAAC,SAAS,gBAAgB,OAAO,CAAC,UAAU,oBAAoB,OAAO,CAAC,aAAa,KAAK,OAAO,CAAC,eAAe,GAAG;SACzI;QACD,OAAO,EAAE,CAAC,uEAAuE,CAAC;KACnF,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,GAAsB,EAAE,CAAc;IACtD,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACzH,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,+BAA+B,CAAC,CAAC;IACxG,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,UAAU,EAAE,GAAG,CAAC,CAAC,UAAU,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,EAAE,OAAO,IAAI,EAAE,EAAE;QAC/F,OAAO,EAAE,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC;QACjG,OAAO,EAAE;YACP,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YAChG,GAAG,MAAM;SACV;QACD,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC;QAC/B,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC;QAC/B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;KAChD,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAsB,EAAE,EAAU;IAC3D,MAAM,KAAK,GAAG,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzC,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,QAAQ,CAAC,qCAAqC,EAAE,EAAE,CAAC,CAAC;IACvF,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;IAC5B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IACnC,OAAO;QACL,EAAE,EAAE,GAAG;QACP,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,aAAa;QACxC,OAAO;QACP,OAAO;QACP,WAAW,EAAE,EAAE;QACf,WAAW,EAAE,EAAE;QACf,KAAK,EAAE,CAAC,GAAG,CAAC;QACZ,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,6BAA6B;QAC3H,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,KAAK,cAAc,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS;KAC5H,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,IAAU;IAC1B,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,IAAuB,EAAE,EAAE,CACvD,CAAC,MAAM,KAAK,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzG,OAAO;QACL,gBAAgB,IAAI,CAAC,EAAE,EAAE;QACzB,IAAI,CAAC,KAAK;QACV,EAAE;QACF,eAAe,IAAI,CAAC,UAAU,EAAE;QAChC,EAAE;QACF,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;QAC9B,EAAE;QACF,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;QAC9B,EAAE;QACF,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC;QACvC,EAAE;QACF,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC;QACtC,EAAE;QACF,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;QAC1B,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,kBAAkB,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QACzF,GAAG,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAClF,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,KAAK,UAAU,GAAG,CAAC,GAAe;IAChC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,UAAU,CAAC,sEAAsE,CAAC,CAAC;IAC1G,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5D,IAAI,IAAU,CAAC;IACf,IAAI,OAAO,KAAK,SAAS;QAAE,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;SACpD,CAAC;QACJ,MAAM,CAAC,GAAG,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,QAAQ,CAChB,kBAAkB,MAAM,oBAAoB,CAAC,GAAG,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAC/G,CAAC;QACJ,CAAC;QACD,IAAI,GAAG,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,QAAQ,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3D,OAAO,CAAC,CAAC;IACX,CAAC;IACD,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACpB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAY;IAC9B,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,EAAE;IACX,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE;IACvB,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC;IAC9B,OAAO,EAAE,0EAA0E;IACnF,OAAO,EAAE,oBAAoB;IAC7B,KAAK,EAAE,MAAM;IACb,GAAG;CACJ,CAAC;AACF,eAAe,CAAC,OAAO,CAAC,CAAC","sourcesContent":["/**\n * `upt testplan` — the measurement plan already stored on a case or a\n * confrontation: what would confirm it, what would falsify it, and what the\n * record leaves out. Generated from those records, not from a writeup.\n *\n * @module cli/commands/testplan\n */\nimport type { FlagSpec } from '../args.js';\nimport { registerCommand, type Command, type CommandCtx } from '../command.js';\nimport { commandHelp, JSON_FLAG } from '../flag-help.js';\nimport { emitJson } from '../output.js';\nimport { UsageError, CliError } from '../errors.js';\nimport type { AppliedCase } from '../../cases/types.js';\nimport type { ConfrontationOutcome } from '../../bridges/observations/types.js';\n\nconst FLAGS: FlagSpec[] = [JSON_FLAG];\n\nconst HELP = `upt testplan <be-NN | case-id> [--json]\n The measurement plan for one bridge confrontation or one applied case:\n the observable, the confirm and falsify criteria the record already\n states, what is not included, and the links. Markdown by default,\n JSON with --json. \\`upt help testplan\\` describes every flag.\n e.g. upt testplan be-58\n upt testplan case-brownian-sphere\n upt testplan case-skin-depth --json`;\n\ninterface Plan {\n readonly id: string;\n readonly title: string;\n readonly observable: string;\n readonly confirm: readonly string[];\n readonly falsify: readonly string[];\n readonly notIncluded: readonly string[];\n readonly measurement: readonly string[];\n readonly links: readonly string[];\n readonly preprocessing?: string;\n readonly independence?: string;\n}\n\nfunction linesOf(outcome: ConfrontationOutcome): { confirm: string[]; falsify: string[] } {\n if (outcome.kind === 'value') {\n return {\n confirm: [\n `predicted ${outcome.predicted} ${outcome.units}, observed ${outcome.observed} ± ${outcome.sigma} ${outcome.units}`,\n `within the stated comparison: ${outcome.withinObserved}`,\n ],\n falsify: [\n outcome.withinObserved\n ? 'a later measurement outside that comparison falsifies the recorded agreement'\n : 'the recorded comparison is already outside the stated band',\n ],\n };\n }\n if (outcome.kind === 'upper-bound') {\n return {\n confirm: [`predicted ${outcome.predicted}, observed bound ${outcome.bound}, satisfied: ${outcome.satisfied}`],\n falsify: ['an observed bound that fails the recorded comparison falsifies it'],\n };\n }\n if (outcome.kind === 'table') {\n return {\n confirm: outcome.rows.map(\n (r) => `${r.label}: predicted ${r.predicted}, observed ${r.observed} ± ${r.sigma} ${outcome.units}`,\n ),\n falsify: ['a row whose residual leaves the recorded comparison falsifies that row'],\n };\n }\n return {\n confirm: [\n `predicted ${outcome.predicted}, approaches ${outcome.approaches}, fractional gap ${outcome.fractionalGap} (${outcome.fractionalGapIs})`,\n ],\n falsify: ['a fractional gap outside the record\\'s stated comparison falsifies it'],\n };\n}\n\nfunction fromCase(api: CommandCtx['api'], c: AppliedCase): Plan {\n const { inputs } = api.resolveEvaluatorInputs(c.parameters, c.examples.valid.args);\n const result = api.runAppliedCase(c.id, inputs);\n const held = result.checks.filter((k) => k.holds).map((k) => `${k.id}: ${k.quantity} ${k.op} ${k.bound} — ${k.premise}`);\n const broken = result.checks.filter((k) => !k.holds).map((k) => `${k.id} violated at the worked point`);\n return {\n id: c.id,\n title: c.title,\n observable: `${c.observable} — ${c.outputs.find((o) => o.key === c.observable)?.meaning ?? ''}`,\n confirm: [`worked point: ${c.examples.valid.args.join(' ')} (${c.examples.valid.note})`, ...held],\n falsify: [\n ...c.examples.failures.map((f) => `${f.args.join(' ')} fails ${f.fails.join(', ')} — ${f.note}`),\n ...broken,\n ],\n notIncluded: [...c.notIncluded],\n measurement: [...c.measurement],\n links: c.links.map((l) => `${l.id}: ${l.role}`),\n };\n}\n\nfunction fromConfrontation(api: CommandCtx['api'], id: number): Plan {\n const entry = api.CONFRONTATIONS.get(id);\n if (entry === undefined) throw new CliError(`upt testplan: no confrontation be-${id}`);\n const outcome = entry.run();\n const { confirm, falsify } = linesOf(outcome);\n const key = api.catalogEdgeKey(id);\n return {\n id: key,\n title: entry.title,\n observable: `${outcome.kind} comparison`,\n confirm,\n falsify,\n notIncluded: [],\n measurement: [],\n links: [key],\n preprocessing: outcome.preprocessing.state === 'recorded' ? outcome.preprocessing.statement : 'preprocessing: not-recorded',\n independence: outcome.independence.state === 'not-recorded' ? 'independence: not-recorded' : outcome.independence.statement,\n };\n}\n\nfunction markdown(plan: Plan): string {\n const block = (title: string, rows: readonly string[]) =>\n [`## ${title}`, ...(rows.length === 0 ? ['- (none recorded)'] : rows.map((r) => `- ${r}`))].join('\\n');\n return [\n `# Test plan: ${plan.id}`,\n plan.title,\n '',\n `Observable: ${plan.observable}`,\n '',\n block('Confirm', plan.confirm),\n '',\n block('Falsify', plan.falsify),\n '',\n block('Not included', plan.notIncluded),\n '',\n block('Measurement', plan.measurement),\n '',\n block('Links', plan.links),\n ...(plan.preprocessing === undefined ? [] : ['', `Preprocessing: ${plan.preprocessing}`]),\n ...(plan.independence === undefined ? [] : [`Independence: ${plan.independence}`]),\n '',\n ].join('\\n');\n}\n\nasync function run(ctx: CommandCtx): Promise<number> {\n const { args, api, out } = ctx;\n const target = args.positionals[0];\n if (!target) throw new UsageError('upt testplan needs a be-NN id or a case id. See `upt help testplan`.');\n const caseHit = api.APPLIED_CASES.get(target.toLowerCase());\n let plan: Plan;\n if (caseHit !== undefined) plan = fromCase(api, caseHit);\n else {\n const n = api.catalogIdNumber(target);\n if (n === undefined || !api.CONFRONTATIONS.has(n)) {\n throw new CliError(\n `upt testplan: '${target}' is not a case (${[...api.APPLIED_CASES.keys()].join(', ')}) or a confrontation id.`,\n );\n }\n plan = fromConfrontation(api, n);\n }\n if (args.flags.has('json')) {\n emitJson({ command: 'testplan', result: plan }, ctx.write);\n return 0;\n }\n out(markdown(plan));\n return 0;\n}\n\nexport const command: Command = {\n name: 'testplan',\n aliases: [],\n positionals: { max: 1 },\n flags: FLAGS,\n help: commandHelp(HELP, FLAGS),\n summary: 'Print the measurement plan stored on a confrontation or an applied case.',\n example: 'upt testplan be-58',\n group: 'data',\n run,\n};\nregisterCommand(command);\n"]}
@@ -47,6 +47,4 @@ export declare function coherentUnits(rows: ReadonlyMap<string, {
47
47
  * unreadable. Presentation only: the dimension is the fact, the label is a reading of it.
48
48
  */
49
49
  export declare function derivedUnitOf(dim: Dimension, units: readonly CoherentUnit[]): string;
50
- /** The SI base-unit form of a dimension (`m/s`, `kg*m^2/(s^3*A)`), `1` when dimensionless. */
51
- export declare function siUnitOf(dim: Dimension): string;
52
50
  //# sourceMappingURL=expr-print.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"expr-print.d.ts","sourceRoot":"","sources":["../../src/cli/expr-print.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAUzD,6DAA6D;AAC7D,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKvD,CAAC;AAkCF,eAAO,MAAM,YAAY,MAAO,QAAQ,KAAG,MAAM,GAAG,IAA8B,CAAC;AACnF,eAAO,MAAM,SAAS,MAAO,QAAQ,KAAG,MAAM,GAAG,IAA2B,CAAC;AAe7E,mGAAmG;AACnG,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CA4BrD;AAoBD,+EAA+E;AAC/E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,WAAW,CACf,MAAM,EACN;IAAE,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAA;CAAE,CACjJ,GACA,YAAY,EAAE,CAgBhB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAKpF;AAED,8FAA8F;AAC9F,wBAAgB,QAAQ,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,CAQ/C"}
1
+ {"version":3,"file":"expr-print.d.ts","sourceRoot":"","sources":["../../src/cli/expr-print.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAYzD,6DAA6D;AAC7D,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKvD,CAAC;AAkCF,eAAO,MAAM,YAAY,MAAO,QAAQ,KAAG,MAAM,GAAG,IAA8B,CAAC;AACnF,eAAO,MAAM,SAAS,MAAO,QAAQ,KAAG,MAAM,GAAG,IAA2B,CAAC;AAe7E,mGAAmG;AACnG,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM9C;AAED,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CA4BrD;AAGD,+EAA+E;AAC/E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,WAAW,CACf,MAAM,EACN;IAAE,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAA;CAAE,CACjJ,GACA,YAAY,EAAE,CAgBhB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAKpF"}
@@ -1,3 +1,5 @@
1
+ import { BASES, exactlyEquals, isDimensionless, SI_BASE, siUnitOf } from '../dimensional/algebra.js';
2
+ import { isDecimalLiteral } from '../dimensional/ast-leaves.js';
1
3
  const DISPLAY = { times: '·', divide: ' / ', symbol: (name) => name };
2
4
  /** Named numeric stubs spelled so `upt eval` parses them. */
3
5
  export const EVAL_STUBS = {
@@ -58,7 +60,8 @@ export function latexName(name) {
58
60
  const known = LATEX_NAMES[name];
59
61
  if (known !== undefined)
60
62
  return known;
61
- if (/^[A-Za-z]$/.test(name) || Number.isFinite(Number(name)))
63
+ // A decimal literal prints as is; `Number()` also read '' and '0x10' as numbers.
64
+ if (/^[A-Za-z]$/.test(name) || isDecimalLiteral(name))
62
65
  return name;
63
66
  return name.includes('-') ? `\\text{${name}}` : `\\mathrm{${name.replace(/_/g, '\\_')}}`;
64
67
  }
@@ -95,20 +98,6 @@ export function printLatex(n) {
95
98
  : args.map((s, i) => (i > 0 && isOp(n.args[i], '+', '-') ? paren(s) : s)).join(' - ');
96
99
  }
97
100
  }
98
- const SI_BASE = [
99
- ['M', 'kg'],
100
- ['L', 'm'],
101
- ['T', 's'],
102
- ['I', 'A'],
103
- ['Theta', 'K'],
104
- ['N', 'mol'],
105
- ['J', 'cd'],
106
- ];
107
- const DIM_KEYS = ['L', 'M', 'T', 'I', 'Theta', 'N', 'J'];
108
- const dimEqual = (a, b) => DIM_KEYS.every((k) => (a[k] ?? 0) === (b[k] ?? 0));
109
- const dimPow = (a, n) => Object.fromEntries(DIM_KEYS.map((k) => [k, (a[k] ?? 0) * n]));
110
- const dimMul = (a, b) => Object.fromEntries(DIM_KEYS.map((k) => [k, (a[k] ?? 0) + (b[k] ?? 0)]));
111
- const isDimensionless = (d) => DIM_KEYS.every((k) => (d[k] ?? 0) === 0);
112
101
  /**
113
102
  * The coherent named SI units of a unit table (`unitRows()`): scale exactly 1,
114
103
  * not dimensionless, the first spelling the table gives for each dimension
@@ -121,7 +110,7 @@ export function coherentUnits(rows) {
121
110
  const out = [];
122
111
  const seen = [];
123
112
  const add = (name, dim) => {
124
- if (isDimensionless(dim) || seen.some((d) => dimEqual(d, dim)))
113
+ if (isDimensionless(dim) || seen.some((d) => exactlyEquals(d, dim)))
125
114
  return;
126
115
  seen.push(dim);
127
116
  out.push({ name, dim });
@@ -133,7 +122,7 @@ export function coherentUnits(rows) {
133
122
  add(name, row.dim);
134
123
  }
135
124
  for (const [k, u] of SI_BASE) {
136
- add(u, Object.fromEntries(DIM_KEYS.map((key) => [key, key === k ? 1 : 0])));
125
+ add(u, Object.fromEntries(BASES.map((key) => [key, key === k ? 1 : 0])));
137
126
  }
138
127
  return out;
139
128
  }
@@ -148,20 +137,7 @@ export function derivedUnitOf(dim, units) {
148
137
  if (isDimensionless(dim))
149
138
  return '1';
150
139
  const base = new Set(SI_BASE.map(([, u]) => u));
151
- const named = units.find((u) => !base.has(u.name) && dimEqual(u.dim, dim));
140
+ const named = units.find((u) => !base.has(u.name) && exactlyEquals(u.dim, dim));
152
141
  return named === undefined ? siUnitOf(dim) : named.name;
153
142
  }
154
- /** The SI base-unit form of a dimension (`m/s`, `kg*m^2/(s^3*A)`), `1` when dimensionless. */
155
- export function siUnitOf(dim) {
156
- const factor = (u, e) => (e === 1 ? u : `${u}^${e}`);
157
- const num = SI_BASE.filter(([k]) => dim[k] > 0).map(([k, u]) => factor(u, dim[k]));
158
- const den = SI_BASE.filter(([k]) => dim[k] < 0).map(([k, u]) => factor(u, -dim[k]));
159
- if (num.length === 0 && den.length === 0)
160
- return '1';
161
- if (num.length === 0)
162
- return SI_BASE.filter(([k]) => dim[k] < 0).map(([k, u]) => factor(u, dim[k])).join('*');
163
- if (den.length === 0)
164
- return num.join('*');
165
- return `${num.join('*')}/${den.length === 1 ? den[0] : `(${den.join('*')})`}`;
166
- }
167
143
  //# sourceMappingURL=expr-print.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"expr-print.js","sourceRoot":"","sources":["../../src/cli/expr-print.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The three printed forms of a scalar composed AST (`upt symbolic`, audit F12 and I10):\n *\n * - DISPLAY: plain text for the reader, `·` for a product.\n * - EVAL: a formula `upt eval` parses, every named factor spelled so it evaluates (`8pi` → `(8*pi)`).\n * - LATEX: `\\frac` for every division, `\\cdot` for a product, braces for every exponent.\n *\n * Only `symbol` and `op` nodes are printed; any other node gives `null`, never a guess.\n */\nimport type { ExprNode } from '../dimensional/validator.js';\nimport type { Dimension } from '../dimensional/types.js';\n\ninterface PrintStyle {\n readonly times: string;\n readonly divide: string;\n readonly symbol: (name: string) => string;\n}\n\nconst DISPLAY: PrintStyle = { times: '·', divide: ' / ', symbol: (name) => name };\n\n/** Named numeric stubs spelled so `upt eval` parses them. */\nexport const EVAL_STUBS: Readonly<Record<string, string>> = {\n '8pi': '(8*pi)',\n '4pi': '(4*pi)',\n '2pi': '(2*pi)',\n ln2: 'ln(2)',\n};\nconst EVAL: PrintStyle = { times: '*', divide: '/', symbol: (name) => EVAL_STUBS[name] ?? name };\n\n/**\n * Precedence-aware printing. Every divisor that is not a bare power is\n * grouped, so `a / (b·c)` never prints as `a / b·c` (audit F12); a quotient\n * inside a product or as a dividend is grouped too, for the reader.\n */\nfunction printInfix(n: ExprNode, style: PrintStyle): string | null {\n if (n.kind === 'symbol') return style.symbol(n.name);\n if (n.kind !== 'op') return null;\n const parts: string[] = [];\n for (let i = 0; i < n.args.length; i++) {\n const a = n.args[i]!;\n const s = printInfix(a, style);\n if (s === null) return null;\n const aOp = a.kind === 'op' ? a.op : null;\n const group =\n aOp !== null &&\n (n.op === '^'\n ? true\n : n.op === '/'\n ? i === 0\n ? aOp === '+' || aOp === '-' || aOp === '/'\n : aOp !== '^'\n : n.op === '*'\n ? aOp === '+' || aOp === '-' || aOp === '/'\n : n.op === '-' && i > 0 && (aOp === '+' || aOp === '-'));\n parts.push(group ? `(${s})` : s);\n }\n const sep = n.op === '*' ? style.times : n.op === '/' ? style.divide : n.op === '^' ? '^' : ` ${n.op} `;\n return parts.join(sep);\n}\n\nexport const printDisplay = (n: ExprNode): string | null => printInfix(n, DISPLAY);\nexport const printEval = (n: ExprNode): string | null => printInfix(n, EVAL);\n\n/** LaTeX for the constant and stub names; any other name is spelled by {@link latexName}. */\nconst LATEX_NAMES: Readonly<Record<string, string>> = {\n hbar: '\\\\hbar',\n k_B: 'k_{\\\\mathrm{B}}',\n '8pi': '8\\\\pi',\n '4pi': '4\\\\pi',\n '2pi': '2\\\\pi',\n ln2: '\\\\ln 2',\n pi: '\\\\pi',\n epsilon_0: '\\\\varepsilon_{0}',\n sigma_sb: '\\\\sigma_{\\\\mathrm{SB}}',\n};\n\n/** A name in LaTeX: one letter or a number as is, a hyphenated name as text, otherwise upright. */\nexport function latexName(name: string): string {\n const known = LATEX_NAMES[name];\n if (known !== undefined) return known;\n if (/^[A-Za-z]$/.test(name) || Number.isFinite(Number(name))) return name;\n return name.includes('-') ? `\\\\text{${name}}` : `\\\\mathrm{${name.replace(/_/g, '\\\\_')}}`;\n}\n\n/** The AST in LaTeX; `null` for a node other than `symbol` or `op`. */\nexport function printLatex(n: ExprNode): string | null {\n if (n.kind === 'symbol') return latexName(n.name);\n if (n.kind !== 'op') return null;\n const args: string[] = [];\n for (const a of n.args) {\n const s = printLatex(a);\n if (s === null) return null;\n args.push(s);\n }\n const isOp = (a: ExprNode, ...ops: string[]): boolean => a.kind === 'op' && ops.includes(a.op);\n const paren = (s: string): string => `\\\\left(${s}\\\\right)`;\n switch (n.op) {\n case '/':\n return args.slice(1).reduce((num, den) => `\\\\frac{${num}}{${den}}`, args[0]!);\n case '*':\n return args.map((s, i) => (isOp(n.args[i]!, '+', '-') ? paren(s) : s)).join(' \\\\cdot ');\n case '^': {\n // The validator's arity guard makes `^` binary; a base that is not a symbol is grouped.\n const base = n.args[0]!.kind === 'symbol' ? args[0]! : paren(args[0]!);\n return `{${base}}^{${args[1]}}`;\n }\n case '+':\n return args.join(' + ');\n case '-':\n return args.length === 1\n ? `-${isOp(n.args[0]!, '+', '-') ? paren(args[0]!) : args[0]}`\n : args.map((s, i) => (i > 0 && isOp(n.args[i]!, '+', '-') ? paren(s) : s)).join(' - ');\n }\n}\n\nconst SI_BASE: readonly (readonly [keyof Dimension, string])[] = [\n ['M', 'kg'],\n ['L', 'm'],\n ['T', 's'],\n ['I', 'A'],\n ['Theta', 'K'],\n ['N', 'mol'],\n ['J', 'cd'],\n];\n\nconst DIM_KEYS: readonly (keyof Dimension)[] = ['L', 'M', 'T', 'I', 'Theta', 'N', 'J'];\nconst dimEqual = (a: Dimension, b: Dimension): boolean => DIM_KEYS.every((k) => (a[k] ?? 0) === (b[k] ?? 0));\nconst dimPow = (a: Dimension, n: number): Dimension =>\n Object.fromEntries(DIM_KEYS.map((k) => [k, (a[k] ?? 0) * n])) as unknown as Dimension;\nconst dimMul = (a: Dimension, b: Dimension): Dimension =>\n Object.fromEntries(DIM_KEYS.map((k) => [k, (a[k] ?? 0) + (b[k] ?? 0)])) as unknown as Dimension;\nconst isDimensionless = (d: Dimension): boolean => DIM_KEYS.every((k) => (d[k] ?? 0) === 0);\n\n/** One coherent SI unit of the table: a scale of exactly 1 and a dimension. */\nexport interface CoherentUnit {\n readonly name: string;\n readonly dim: Dimension;\n}\n\n/**\n * The coherent named SI units of a unit table (`unitRows()`): scale exactly 1,\n * not dimensionless, the first spelling the table gives for each dimension\n * (`ohm` before `Ω`). The seven base units are added so a label can mix them.\n * A cycle-counting unit (`Hz`, `rpm`; the table's `cycles` flag) is never a\n * label: a 1/s output may be an angular frequency, and `Hz` would say it\n * counts cycles. Such an output reads `1/s`, which is its dimension.\n */\nexport function coherentUnits(\n rows: ReadonlyMap<\n string,\n { readonly scale: { readonly num: bigint; readonly den: bigint; readonly irrational: number }; readonly dim: Dimension; readonly cycles?: true }\n >,\n): CoherentUnit[] {\n const out: CoherentUnit[] = [];\n const seen: Dimension[] = [];\n const add = (name: string, dim: Dimension): void => {\n if (isDimensionless(dim) || seen.some((d) => dimEqual(d, dim))) return;\n seen.push(dim);\n out.push({ name, dim });\n };\n for (const [name, row] of rows) {\n if (row.cycles === true) continue;\n if (row.scale.num === 1n && row.scale.den === 1n && row.scale.irrational === 1) add(name, row.dim);\n }\n for (const [k, u] of SI_BASE) {\n add(u, Object.fromEntries(DIM_KEYS.map((key) => [key, key === k ? 1 : 0])) as unknown as Dimension);\n }\n return out;\n}\n\n/**\n * A dimension's label: the one coherent named unit whose dimension it is (`Pa`, `J`, `V`,\n * `ohm`, `T`), else the SI base form (`m/s`, `kg^2*m^4/(s^5*A^2)`). A product of two\n * named units is never chosen: a search over pairs once labelled a velocity `W/N` and a\n * voltage-noise density `J*ohm`, readings that are dimensionally right and physically\n * unreadable. Presentation only: the dimension is the fact, the label is a reading of it.\n */\nexport function derivedUnitOf(dim: Dimension, units: readonly CoherentUnit[]): string {\n if (isDimensionless(dim)) return '1';\n const base = new Set(SI_BASE.map(([, u]) => u));\n const named = units.find((u) => !base.has(u.name) && dimEqual(u.dim, dim));\n return named === undefined ? siUnitOf(dim) : named.name;\n}\n\n/** The SI base-unit form of a dimension (`m/s`, `kg*m^2/(s^3*A)`), `1` when dimensionless. */\nexport function siUnitOf(dim: Dimension): string {\n const factor = (u: string, e: number): string => (e === 1 ? u : `${u}^${e}`);\n const num = SI_BASE.filter(([k]) => dim[k] > 0).map(([k, u]) => factor(u, dim[k]));\n const den = SI_BASE.filter(([k]) => dim[k] < 0).map(([k, u]) => factor(u, -dim[k]));\n if (num.length === 0 && den.length === 0) return '1';\n if (num.length === 0) return SI_BASE.filter(([k]) => dim[k] < 0).map(([k, u]) => factor(u, dim[k])).join('*');\n if (den.length === 0) return num.join('*');\n return `${num.join('*')}/${den.length === 1 ? den[0] : `(${den.join('*')})`}`;\n}\n"]}
1
+ {"version":3,"file":"expr-print.js","sourceRoot":"","sources":["../../src/cli/expr-print.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The three printed forms of a scalar composed AST (`upt symbolic`, audit F12 and I10):\n *\n * - DISPLAY: plain text for the reader, `·` for a product.\n * - EVAL: a formula `upt eval` parses, every named factor spelled so it evaluates (`8pi` → `(8*pi)`).\n * - LATEX: `\\frac` for every division, `\\cdot` for a product, braces for every exponent.\n *\n * Only `symbol` and `op` nodes are printed; any other node gives `null`, never a guess.\n */\nimport type { ExprNode } from '../dimensional/validator.js';\nimport type { Dimension } from '../dimensional/types.js';\nimport { BASES, exactlyEquals, isDimensionless, SI_BASE, siUnitOf } from '../dimensional/algebra.js';\nimport { isDecimalLiteral } from '../dimensional/ast-leaves.js';\n\ninterface PrintStyle {\n readonly times: string;\n readonly divide: string;\n readonly symbol: (name: string) => string;\n}\n\nconst DISPLAY: PrintStyle = { times: '·', divide: ' / ', symbol: (name) => name };\n\n/** Named numeric stubs spelled so `upt eval` parses them. */\nexport const EVAL_STUBS: Readonly<Record<string, string>> = {\n '8pi': '(8*pi)',\n '4pi': '(4*pi)',\n '2pi': '(2*pi)',\n ln2: 'ln(2)',\n};\nconst EVAL: PrintStyle = { times: '*', divide: '/', symbol: (name) => EVAL_STUBS[name] ?? name };\n\n/**\n * Precedence-aware printing. Every divisor that is not a bare power is\n * grouped, so `a / (b·c)` never prints as `a / b·c` (audit F12); a quotient\n * inside a product or as a dividend is grouped too, for the reader.\n */\nfunction printInfix(n: ExprNode, style: PrintStyle): string | null {\n if (n.kind === 'symbol') return style.symbol(n.name);\n if (n.kind !== 'op') return null;\n const parts: string[] = [];\n for (let i = 0; i < n.args.length; i++) {\n const a = n.args[i]!;\n const s = printInfix(a, style);\n if (s === null) return null;\n const aOp = a.kind === 'op' ? a.op : null;\n const group =\n aOp !== null &&\n (n.op === '^'\n ? true\n : n.op === '/'\n ? i === 0\n ? aOp === '+' || aOp === '-' || aOp === '/'\n : aOp !== '^'\n : n.op === '*'\n ? aOp === '+' || aOp === '-' || aOp === '/'\n : n.op === '-' && i > 0 && (aOp === '+' || aOp === '-'));\n parts.push(group ? `(${s})` : s);\n }\n const sep = n.op === '*' ? style.times : n.op === '/' ? style.divide : n.op === '^' ? '^' : ` ${n.op} `;\n return parts.join(sep);\n}\n\nexport const printDisplay = (n: ExprNode): string | null => printInfix(n, DISPLAY);\nexport const printEval = (n: ExprNode): string | null => printInfix(n, EVAL);\n\n/** LaTeX for the constant and stub names; any other name is spelled by {@link latexName}. */\nconst LATEX_NAMES: Readonly<Record<string, string>> = {\n hbar: '\\\\hbar',\n k_B: 'k_{\\\\mathrm{B}}',\n '8pi': '8\\\\pi',\n '4pi': '4\\\\pi',\n '2pi': '2\\\\pi',\n ln2: '\\\\ln 2',\n pi: '\\\\pi',\n epsilon_0: '\\\\varepsilon_{0}',\n sigma_sb: '\\\\sigma_{\\\\mathrm{SB}}',\n};\n\n/** A name in LaTeX: one letter or a number as is, a hyphenated name as text, otherwise upright. */\nexport function latexName(name: string): string {\n const known = LATEX_NAMES[name];\n if (known !== undefined) return known;\n // A decimal literal prints as is; `Number()` also read '' and '0x10' as numbers.\n if (/^[A-Za-z]$/.test(name) || isDecimalLiteral(name)) return name;\n return name.includes('-') ? `\\\\text{${name}}` : `\\\\mathrm{${name.replace(/_/g, '\\\\_')}}`;\n}\n\n/** The AST in LaTeX; `null` for a node other than `symbol` or `op`. */\nexport function printLatex(n: ExprNode): string | null {\n if (n.kind === 'symbol') return latexName(n.name);\n if (n.kind !== 'op') return null;\n const args: string[] = [];\n for (const a of n.args) {\n const s = printLatex(a);\n if (s === null) return null;\n args.push(s);\n }\n const isOp = (a: ExprNode, ...ops: string[]): boolean => a.kind === 'op' && ops.includes(a.op);\n const paren = (s: string): string => `\\\\left(${s}\\\\right)`;\n switch (n.op) {\n case '/':\n return args.slice(1).reduce((num, den) => `\\\\frac{${num}}{${den}}`, args[0]!);\n case '*':\n return args.map((s, i) => (isOp(n.args[i]!, '+', '-') ? paren(s) : s)).join(' \\\\cdot ');\n case '^': {\n // The validator's arity guard makes `^` binary; a base that is not a symbol is grouped.\n const base = n.args[0]!.kind === 'symbol' ? args[0]! : paren(args[0]!);\n return `{${base}}^{${args[1]}}`;\n }\n case '+':\n return args.join(' + ');\n case '-':\n return args.length === 1\n ? `-${isOp(n.args[0]!, '+', '-') ? paren(args[0]!) : args[0]}`\n : args.map((s, i) => (i > 0 && isOp(n.args[i]!, '+', '-') ? paren(s) : s)).join(' - ');\n }\n}\n\n\n/** One coherent SI unit of the table: a scale of exactly 1 and a dimension. */\nexport interface CoherentUnit {\n readonly name: string;\n readonly dim: Dimension;\n}\n\n/**\n * The coherent named SI units of a unit table (`unitRows()`): scale exactly 1,\n * not dimensionless, the first spelling the table gives for each dimension\n * (`ohm` before `Ω`). The seven base units are added so a label can mix them.\n * A cycle-counting unit (`Hz`, `rpm`; the table's `cycles` flag) is never a\n * label: a 1/s output may be an angular frequency, and `Hz` would say it\n * counts cycles. Such an output reads `1/s`, which is its dimension.\n */\nexport function coherentUnits(\n rows: ReadonlyMap<\n string,\n { readonly scale: { readonly num: bigint; readonly den: bigint; readonly irrational: number }; readonly dim: Dimension; readonly cycles?: true }\n >,\n): CoherentUnit[] {\n const out: CoherentUnit[] = [];\n const seen: Dimension[] = [];\n const add = (name: string, dim: Dimension): void => {\n if (isDimensionless(dim) || seen.some((d) => exactlyEquals(d, dim))) return;\n seen.push(dim);\n out.push({ name, dim });\n };\n for (const [name, row] of rows) {\n if (row.cycles === true) continue;\n if (row.scale.num === 1n && row.scale.den === 1n && row.scale.irrational === 1) add(name, row.dim);\n }\n for (const [k, u] of SI_BASE) {\n add(u, Object.fromEntries(BASES.map((key) => [key, key === k ? 1 : 0])) as unknown as Dimension);\n }\n return out;\n}\n\n/**\n * A dimension's label: the one coherent named unit whose dimension it is (`Pa`, `J`, `V`,\n * `ohm`, `T`), else the SI base form (`m/s`, `kg^2*m^4/(s^5*A^2)`). A product of two\n * named units is never chosen: a search over pairs once labelled a velocity `W/N` and a\n * voltage-noise density `J*ohm`, readings that are dimensionally right and physically\n * unreadable. Presentation only: the dimension is the fact, the label is a reading of it.\n */\nexport function derivedUnitOf(dim: Dimension, units: readonly CoherentUnit[]): string {\n if (isDimensionless(dim)) return '1';\n const base = new Set(SI_BASE.map(([, u]) => u));\n const named = units.find((u) => !base.has(u.name) && exactlyEquals(u.dim, dim));\n return named === undefined ? siUnitOf(dim) : named.name;\n}\n"]}
@@ -15,5 +15,12 @@
15
15
  */
16
16
  import { type Io } from './record.js';
17
17
  import './commands/index.js';
18
+ /**
19
+ * The last-resort handler `bin/upt.mjs` calls when `runCli` rethrows: a defect, since every
20
+ * usage error and value refusal was mapped to an exit code inside `runCli`. Prints one line,
21
+ * `upt: internal error: <message>` (the message, not the stack), and returns 70 (EX_SOFTWARE).
22
+ * A thrown value that is not an Error, or an Error with no message, prints as its string.
23
+ */
24
+ export declare function reportInternalError(error: unknown, io?: Pick<Io, 'err'>): number;
18
25
  export declare function runCli(argv: string[], io?: Io): Promise<number>;
19
26
  //# sourceMappingURL=main.d.ts.map