universal-physics-tensor 10.0.0 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (835) hide show
  1. package/README.md +39 -36
  2. package/bin/upt.mjs +13 -1
  3. package/data/applied-cases.json +1892 -0
  4. package/data/applied-cases.schema.json +194 -0
  5. package/data/atlas/atlas.json +25 -25
  6. package/data/atlas/atlas.jsonld +1 -1
  7. package/data/atlas/diffusion.json +6 -6
  8. package/data/atlas/oscillators.json +7 -7
  9. package/data/atlas/waves.json +14 -14
  10. package/data/atlas/witness-results.json +11 -11
  11. package/data/bridge-catalog.json +389 -230
  12. package/data/bridge-catalog.schema.json +45 -7
  13. package/data/units.json +6 -25
  14. package/dist/atlas/applicability.d.ts.map +1 -1
  15. package/dist/atlas/applicability.js +21 -15
  16. package/dist/atlas/applicability.js.map +1 -1
  17. package/dist/atlas/benchmark/hybrid-retrieval.d.ts +9 -1
  18. package/dist/atlas/benchmark/hybrid-retrieval.d.ts.map +1 -1
  19. package/dist/atlas/benchmark/hybrid-retrieval.js +15 -13
  20. package/dist/atlas/benchmark/hybrid-retrieval.js.map +1 -1
  21. package/dist/atlas/benchmark/loader.js +2 -2
  22. package/dist/atlas/benchmark/loader.js.map +1 -1
  23. package/dist/atlas/benchmark/stats.d.ts +2 -2
  24. package/dist/atlas/benchmark/stats.d.ts.map +1 -1
  25. package/dist/atlas/benchmark/stats.js +9 -15
  26. package/dist/atlas/benchmark/stats.js.map +1 -1
  27. package/dist/atlas/catalog-formal-ref.d.ts +26 -3
  28. package/dist/atlas/catalog-formal-ref.d.ts.map +1 -1
  29. package/dist/atlas/catalog-formal-ref.js +52 -5
  30. package/dist/atlas/catalog-formal-ref.js.map +1 -1
  31. package/dist/atlas/chain-pipeline.d.ts.map +1 -1
  32. package/dist/atlas/chain-pipeline.js +7 -8
  33. package/dist/atlas/chain-pipeline.js.map +1 -1
  34. package/dist/atlas/diffusion/bridges-closure.d.ts +0 -4
  35. package/dist/atlas/diffusion/bridges-closure.d.ts.map +1 -1
  36. package/dist/atlas/diffusion/bridges-closure.js +8 -12
  37. package/dist/atlas/diffusion/bridges-closure.js.map +1 -1
  38. package/dist/atlas/diffusion/bridges.d.ts.map +1 -1
  39. package/dist/atlas/diffusion/bridges.js +27 -39
  40. package/dist/atlas/diffusion/bridges.js.map +1 -1
  41. package/dist/atlas/diffusion/dimensions.d.ts +6 -14
  42. package/dist/atlas/diffusion/dimensions.d.ts.map +1 -1
  43. package/dist/atlas/diffusion/dimensions.js +8 -16
  44. package/dist/atlas/diffusion/dimensions.js.map +1 -1
  45. package/dist/atlas/diffusion/models.d.ts +3 -3
  46. package/dist/atlas/diffusion/models.d.ts.map +1 -1
  47. package/dist/atlas/diffusion/models.js +5 -10
  48. package/dist/atlas/diffusion/models.js.map +1 -1
  49. package/dist/atlas/diffusion/numerics.d.ts +16 -4
  50. package/dist/atlas/diffusion/numerics.d.ts.map +1 -1
  51. package/dist/atlas/diffusion/numerics.js +38 -24
  52. package/dist/atlas/diffusion/numerics.js.map +1 -1
  53. package/dist/atlas/link-prediction.d.ts +106 -3
  54. package/dist/atlas/link-prediction.d.ts.map +1 -1
  55. package/dist/atlas/link-prediction.js +212 -66
  56. package/dist/atlas/link-prediction.js.map +1 -1
  57. package/dist/atlas/oscillators/bridges-coarse.d.ts.map +1 -1
  58. package/dist/atlas/oscillators/bridges-coarse.js +7 -11
  59. package/dist/atlas/oscillators/bridges-coarse.js.map +1 -1
  60. package/dist/atlas/oscillators/bridges-exact.d.ts.map +1 -1
  61. package/dist/atlas/oscillators/bridges-exact.js +6 -7
  62. package/dist/atlas/oscillators/bridges-exact.js.map +1 -1
  63. package/dist/atlas/oscillators/bridges-limits.d.ts +3 -16
  64. package/dist/atlas/oscillators/bridges-limits.d.ts.map +1 -1
  65. package/dist/atlas/oscillators/bridges-limits.js +23 -34
  66. package/dist/atlas/oscillators/bridges-limits.js.map +1 -1
  67. package/dist/atlas/oscillators/dimensions.d.ts +9 -21
  68. package/dist/atlas/oscillators/dimensions.d.ts.map +1 -1
  69. package/dist/atlas/oscillators/dimensions.js +9 -21
  70. package/dist/atlas/oscillators/dimensions.js.map +1 -1
  71. package/dist/atlas/oscillators/limit-witnesses.d.ts +2 -2
  72. package/dist/atlas/oscillators/limit-witnesses.d.ts.map +1 -1
  73. package/dist/atlas/oscillators/limit-witnesses.js +17 -15
  74. package/dist/atlas/oscillators/limit-witnesses.js.map +1 -1
  75. package/dist/atlas/oscillators/models.d.ts.map +1 -1
  76. package/dist/atlas/oscillators/models.js +2 -6
  77. package/dist/atlas/oscillators/models.js.map +1 -1
  78. package/dist/atlas/oscillators/pendulum-motion.d.ts +29 -6
  79. package/dist/atlas/oscillators/pendulum-motion.d.ts.map +1 -1
  80. package/dist/atlas/oscillators/pendulum-motion.js +60 -40
  81. package/dist/atlas/oscillators/pendulum-motion.js.map +1 -1
  82. package/dist/atlas/oscillators/phase-translation.d.ts +0 -11
  83. package/dist/atlas/oscillators/phase-translation.d.ts.map +1 -1
  84. package/dist/atlas/oscillators/phase-translation.js +3 -4
  85. package/dist/atlas/oscillators/phase-translation.js.map +1 -1
  86. package/dist/atlas/oscillators/position-translation.d.ts +68 -7
  87. package/dist/atlas/oscillators/position-translation.d.ts.map +1 -1
  88. package/dist/atlas/oscillators/position-translation.js +123 -12
  89. package/dist/atlas/oscillators/position-translation.js.map +1 -1
  90. package/dist/atlas/oscillators/rejections.d.ts +0 -2
  91. package/dist/atlas/oscillators/rejections.d.ts.map +1 -1
  92. package/dist/atlas/oscillators/rejections.js +0 -7
  93. package/dist/atlas/oscillators/rejections.js.map +1 -1
  94. package/dist/atlas/physjs-entries.generated.d.ts +35 -25
  95. package/dist/atlas/physjs-entries.generated.d.ts.map +1 -1
  96. package/dist/atlas/physjs-entries.generated.js +37 -25
  97. package/dist/atlas/physjs-entries.generated.js.map +1 -1
  98. package/dist/atlas/physjs-ref.d.ts +34 -31
  99. package/dist/atlas/physjs-ref.d.ts.map +1 -1
  100. package/dist/atlas/physjs-ref.js +55 -53
  101. package/dist/atlas/physjs-ref.js.map +1 -1
  102. package/dist/atlas/physjs-reviewed.d.ts +1 -1
  103. package/dist/atlas/physjs-reviewed.js +15 -15
  104. package/dist/atlas/physjs-reviewed.js.map +1 -1
  105. package/dist/atlas/poster/statements.d.ts +0 -19
  106. package/dist/atlas/poster/statements.d.ts.map +1 -1
  107. package/dist/atlas/poster/statements.js +1 -1
  108. package/dist/atlas/poster/statements.js.map +1 -1
  109. package/dist/atlas/proof-target.d.ts +1 -1
  110. package/dist/atlas/proof-target.js +1 -1
  111. package/dist/atlas/proof-target.js.map +1 -1
  112. package/dist/atlas/regime.d.ts +1 -1
  113. package/dist/atlas/regime.d.ts.map +1 -1
  114. package/dist/atlas/regime.js +1 -1
  115. package/dist/atlas/regime.js.map +1 -1
  116. package/dist/atlas/text-overlap.d.ts +23 -0
  117. package/dist/atlas/text-overlap.d.ts.map +1 -0
  118. package/dist/atlas/text-overlap.js +41 -0
  119. package/dist/atlas/text-overlap.js.map +1 -0
  120. package/dist/atlas/waves/bridges-closure.d.ts.map +1 -1
  121. package/dist/atlas/waves/bridges-closure.js +2 -6
  122. package/dist/atlas/waves/bridges-closure.js.map +1 -1
  123. package/dist/atlas/waves/bridges.d.ts.map +1 -1
  124. package/dist/atlas/waves/bridges.js +32 -48
  125. package/dist/atlas/waves/bridges.js.map +1 -1
  126. package/dist/atlas/waves/models.d.ts +5 -6
  127. package/dist/atlas/waves/models.d.ts.map +1 -1
  128. package/dist/atlas/waves/models.js +7 -13
  129. package/dist/atlas/waves/models.js.map +1 -1
  130. package/dist/atlas/waves/numerics.d.ts.map +1 -1
  131. package/dist/atlas/waves/numerics.js +10 -3
  132. package/dist/atlas/waves/numerics.js.map +1 -1
  133. package/dist/atlas/witness-numeric.d.ts +30 -0
  134. package/dist/atlas/witness-numeric.d.ts.map +1 -1
  135. package/dist/atlas/witness-numeric.js +53 -0
  136. package/dist/atlas/witness-numeric.js.map +1 -1
  137. package/dist/atlas/witness-specs.d.ts.map +1 -1
  138. package/dist/atlas/witness-specs.js +19 -0
  139. package/dist/atlas/witness-specs.js.map +1 -1
  140. package/dist/atlas/witness-symbolic.d.ts +75 -3
  141. package/dist/atlas/witness-symbolic.d.ts.map +1 -1
  142. package/dist/atlas/witness-symbolic.js +116 -10
  143. package/dist/atlas/witness-symbolic.js.map +1 -1
  144. package/dist/bridges/catalog-load.d.ts.map +1 -1
  145. package/dist/bridges/catalog-load.js +13 -8
  146. package/dist/bridges/catalog-load.js.map +1 -1
  147. package/dist/bridges/catalog-types.d.ts +26 -2
  148. package/dist/bridges/catalog-types.d.ts.map +1 -1
  149. package/dist/bridges/catalog-types.js +11 -1
  150. package/dist/bridges/catalog-types.js.map +1 -1
  151. package/dist/bridges/evaluation-errors.d.ts +31 -1
  152. package/dist/bridges/evaluation-errors.d.ts.map +1 -1
  153. package/dist/bridges/evaluation-errors.js +20 -2
  154. package/dist/bridges/evaluation-errors.js.map +1 -1
  155. package/dist/bridges/evaluator-inputs.d.ts.map +1 -1
  156. package/dist/bridges/evaluator-inputs.js +7 -5
  157. package/dist/bridges/evaluator-inputs.js.map +1 -1
  158. package/dist/bridges/evaluators.d.ts.map +1 -1
  159. package/dist/bridges/evaluators.js +27 -12
  160. package/dist/bridges/evaluators.js.map +1 -1
  161. package/dist/bridges/expr-parse.d.ts +11 -0
  162. package/dist/bridges/expr-parse.d.ts.map +1 -1
  163. package/dist/bridges/expr-parse.js +14 -5
  164. package/dist/bridges/expr-parse.js.map +1 -1
  165. package/dist/bridges/holds.d.ts +35 -3
  166. package/dist/bridges/holds.d.ts.map +1 -1
  167. package/dist/bridges/holds.js +117 -23
  168. package/dist/bridges/holds.js.map +1 -1
  169. package/dist/bridges/notices.d.ts.map +1 -1
  170. package/dist/bridges/notices.js +5 -5
  171. package/dist/bridges/notices.js.map +1 -1
  172. package/dist/bridges/relation-eval.d.ts +4 -4
  173. package/dist/bridges/relation-eval.d.ts.map +1 -1
  174. package/dist/bridges/relation-eval.js +15 -16
  175. package/dist/bridges/relation-eval.js.map +1 -1
  176. package/dist/bridges/sensitivity.d.ts.map +1 -1
  177. package/dist/bridges/sensitivity.js +3 -3
  178. package/dist/bridges/sensitivity.js.map +1 -1
  179. package/dist/bridges/validity.d.ts +33 -0
  180. package/dist/bridges/validity.d.ts.map +1 -0
  181. package/dist/bridges/validity.js +67 -0
  182. package/dist/bridges/validity.js.map +1 -0
  183. package/dist/canonical/entries/atomic.js +1 -3
  184. package/dist/canonical/entries/atomic.js.map +1 -1
  185. package/dist/canonical/entries/condensed-matter.d.ts.map +1 -1
  186. package/dist/canonical/entries/condensed-matter.js +4 -5
  187. package/dist/canonical/entries/condensed-matter.js.map +1 -1
  188. package/dist/canonical/entries/dimensional-classics.d.ts.map +1 -1
  189. package/dist/canonical/entries/dimensional-classics.js +3 -4
  190. package/dist/canonical/entries/dimensional-classics.js.map +1 -1
  191. package/dist/canonical/entries/electromagnetism.d.ts.map +1 -1
  192. package/dist/canonical/entries/electromagnetism.js +4 -10
  193. package/dist/canonical/entries/electromagnetism.js.map +1 -1
  194. package/dist/canonical/entries/fluids-waves.d.ts.map +1 -1
  195. package/dist/canonical/entries/fluids-waves.js +3 -7
  196. package/dist/canonical/entries/fluids-waves.js.map +1 -1
  197. package/dist/canonical/entries/mechanics.d.ts.map +1 -1
  198. package/dist/canonical/entries/mechanics.js +4 -6
  199. package/dist/canonical/entries/mechanics.js.map +1 -1
  200. package/dist/canonical/entries/nonmonomial.d.ts.map +1 -1
  201. package/dist/canonical/entries/nonmonomial.js +9 -17
  202. package/dist/canonical/entries/nonmonomial.js.map +1 -1
  203. package/dist/canonical/entries/relativity.d.ts.map +1 -1
  204. package/dist/canonical/entries/relativity.js +6 -6
  205. package/dist/canonical/entries/relativity.js.map +1 -1
  206. package/dist/canonical/entries/thermo-nuclear-cosmo.d.ts.map +1 -1
  207. package/dist/canonical/entries/thermo-nuclear-cosmo.js +6 -10
  208. package/dist/canonical/entries/thermo-nuclear-cosmo.js.map +1 -1
  209. package/dist/canonical/fixed-points.d.ts +94 -0
  210. package/dist/canonical/fixed-points.d.ts.map +1 -0
  211. package/dist/canonical/fixed-points.js +81 -0
  212. package/dist/canonical/fixed-points.js.map +1 -0
  213. package/dist/canonical/linkage.d.ts.map +1 -1
  214. package/dist/canonical/linkage.js +25 -44
  215. package/dist/canonical/linkage.js.map +1 -1
  216. package/dist/canonical/normal-form.d.ts.map +1 -1
  217. package/dist/canonical/normal-form.js +5 -11
  218. package/dist/canonical/normal-form.js.map +1 -1
  219. package/dist/canonical/structural.d.ts +21 -21
  220. package/dist/canonical/structural.d.ts.map +1 -1
  221. package/dist/canonical/structural.js +40 -19
  222. package/dist/canonical/structural.js.map +1 -1
  223. package/dist/cases/catalog-checks.d.ts +10 -0
  224. package/dist/cases/catalog-checks.d.ts.map +1 -0
  225. package/dist/cases/catalog-checks.js +241 -0
  226. package/dist/cases/catalog-checks.js.map +1 -0
  227. package/dist/cases/catalog.d.ts +83 -0
  228. package/dist/cases/catalog.d.ts.map +1 -0
  229. package/dist/cases/catalog.js +118 -0
  230. package/dist/cases/catalog.js.map +1 -0
  231. package/dist/cases/engine.d.ts +13 -0
  232. package/dist/cases/engine.d.ts.map +1 -0
  233. package/dist/cases/engine.js +179 -0
  234. package/dist/cases/engine.js.map +1 -0
  235. package/dist/cases/index.d.ts.map +1 -1
  236. package/dist/cases/index.js +5 -7
  237. package/dist/cases/index.js.map +1 -1
  238. package/dist/cases/methods.d.ts +215 -0
  239. package/dist/cases/methods.d.ts.map +1 -0
  240. package/dist/cases/methods.js +743 -0
  241. package/dist/cases/methods.js.map +1 -0
  242. package/dist/cases/quadrature.d.ts +7 -9
  243. package/dist/cases/quadrature.d.ts.map +1 -1
  244. package/dist/cases/quadrature.js +28 -32
  245. package/dist/cases/quadrature.js.map +1 -1
  246. package/dist/cases/types.d.ts +12 -0
  247. package/dist/cases/types.d.ts.map +1 -1
  248. package/dist/cases/types.js.map +1 -1
  249. package/dist/cli/args.d.ts +25 -1
  250. package/dist/cli/args.d.ts.map +1 -1
  251. package/dist/cli/args.js +30 -8
  252. package/dist/cli/args.js.map +1 -1
  253. package/dist/cli/bindings.d.ts.map +1 -1
  254. package/dist/cli/bindings.js +5 -4
  255. package/dist/cli/bindings.js.map +1 -1
  256. package/dist/cli/command.d.ts +11 -1
  257. package/dist/cli/command.d.ts.map +1 -1
  258. package/dist/cli/command.js.map +1 -1
  259. package/dist/cli/commands/_atlas-map.d.ts +0 -9
  260. package/dist/cli/commands/_atlas-map.d.ts.map +1 -1
  261. package/dist/cli/commands/_atlas-map.js +8 -18
  262. package/dist/cli/commands/_atlas-map.js.map +1 -1
  263. package/dist/cli/commands/_atlas-route.d.ts.map +1 -1
  264. package/dist/cli/commands/_atlas-route.js +6 -2
  265. package/dist/cli/commands/_atlas-route.js.map +1 -1
  266. package/dist/cli/commands/_discovery-opts.d.ts +1 -0
  267. package/dist/cli/commands/_discovery-opts.d.ts.map +1 -1
  268. package/dist/cli/commands/_discovery-opts.js +9 -9
  269. package/dist/cli/commands/_discovery-opts.js.map +1 -1
  270. package/dist/cli/commands/atlas.d.ts.map +1 -1
  271. package/dist/cli/commands/atlas.js +8 -5
  272. package/dist/cli/commands/atlas.js.map +1 -1
  273. package/dist/cli/commands/audit.d.ts.map +1 -1
  274. package/dist/cli/commands/audit.js +8 -1
  275. package/dist/cli/commands/audit.js.map +1 -1
  276. package/dist/cli/commands/axes.d.ts.map +1 -1
  277. package/dist/cli/commands/axes.js +20 -1
  278. package/dist/cli/commands/axes.js.map +1 -1
  279. package/dist/cli/commands/confront.d.ts.map +1 -1
  280. package/dist/cli/commands/confront.js +8 -14
  281. package/dist/cli/commands/confront.js.map +1 -1
  282. package/dist/cli/commands/derive.d.ts.map +1 -1
  283. package/dist/cli/commands/derive.js +22 -22
  284. package/dist/cli/commands/derive.js.map +1 -1
  285. package/dist/cli/commands/discover.d.ts.map +1 -1
  286. package/dist/cli/commands/discover.js +122 -73
  287. package/dist/cli/commands/discover.js.map +1 -1
  288. package/dist/cli/commands/eval.d.ts.map +1 -1
  289. package/dist/cli/commands/eval.js +1 -0
  290. package/dist/cli/commands/eval.js.map +1 -1
  291. package/dist/cli/commands/evaluate.d.ts.map +1 -1
  292. package/dist/cli/commands/evaluate.js +67 -39
  293. package/dist/cli/commands/evaluate.js.map +1 -1
  294. package/dist/cli/commands/explain.d.ts.map +1 -1
  295. package/dist/cli/commands/explain.js +24 -3
  296. package/dist/cli/commands/explain.js.map +1 -1
  297. package/dist/cli/commands/ground.d.ts.map +1 -1
  298. package/dist/cli/commands/ground.js +7 -1
  299. package/dist/cli/commands/ground.js.map +1 -1
  300. package/dist/cli/commands/map.d.ts.map +1 -1
  301. package/dist/cli/commands/map.js +84 -11
  302. package/dist/cli/commands/map.js.map +1 -1
  303. package/dist/cli/commands/metric.d.ts.map +1 -1
  304. package/dist/cli/commands/metric.js +12 -9
  305. package/dist/cli/commands/metric.js.map +1 -1
  306. package/dist/cli/commands/path.d.ts +10 -0
  307. package/dist/cli/commands/path.d.ts.map +1 -1
  308. package/dist/cli/commands/path.js +25 -3
  309. package/dist/cli/commands/path.js.map +1 -1
  310. package/dist/cli/commands/probe.d.ts.map +1 -1
  311. package/dist/cli/commands/probe.js +59 -16
  312. package/dist/cli/commands/probe.js.map +1 -1
  313. package/dist/cli/commands/regime.d.ts.map +1 -1
  314. package/dist/cli/commands/regime.js +1 -0
  315. package/dist/cli/commands/regime.js.map +1 -1
  316. package/dist/cli/commands/retrieve.d.ts.map +1 -1
  317. package/dist/cli/commands/retrieve.js +1 -0
  318. package/dist/cli/commands/retrieve.js.map +1 -1
  319. package/dist/cli/commands/search.d.ts.map +1 -1
  320. package/dist/cli/commands/search.js +1 -0
  321. package/dist/cli/commands/search.js.map +1 -1
  322. package/dist/cli/commands/symbolic.d.ts.map +1 -1
  323. package/dist/cli/commands/symbolic.js +19 -28
  324. package/dist/cli/commands/symbolic.js.map +1 -1
  325. package/dist/cli/commands/testplan.d.ts.map +1 -1
  326. package/dist/cli/commands/testplan.js +4 -2
  327. package/dist/cli/commands/testplan.js.map +1 -1
  328. package/dist/cli/determination.d.ts +1 -0
  329. package/dist/cli/determination.d.ts.map +1 -1
  330. package/dist/cli/determination.js.map +1 -1
  331. package/dist/cli/expr-print.d.ts +0 -2
  332. package/dist/cli/expr-print.d.ts.map +1 -1
  333. package/dist/cli/expr-print.js +7 -31
  334. package/dist/cli/expr-print.js.map +1 -1
  335. package/dist/cli/flag-help.d.ts +1 -0
  336. package/dist/cli/flag-help.d.ts.map +1 -1
  337. package/dist/cli/flag-help.js +1 -0
  338. package/dist/cli/flag-help.js.map +1 -1
  339. package/dist/cli/graphs.d.ts +2 -0
  340. package/dist/cli/graphs.d.ts.map +1 -1
  341. package/dist/cli/graphs.js +1 -0
  342. package/dist/cli/graphs.js.map +1 -1
  343. package/dist/cli/main.d.ts +8 -0
  344. package/dist/cli/main.d.ts.map +1 -1
  345. package/dist/cli/main.js +19 -3
  346. package/dist/cli/main.js.map +1 -1
  347. package/dist/cli/numeric-flag.d.ts +12 -0
  348. package/dist/cli/numeric-flag.d.ts.map +1 -0
  349. package/dist/cli/numeric-flag.js +44 -0
  350. package/dist/cli/numeric-flag.js.map +1 -0
  351. package/dist/cli/output.d.ts +28 -0
  352. package/dist/cli/output.d.ts.map +1 -1
  353. package/dist/cli/output.js +23 -0
  354. package/dist/cli/output.js.map +1 -1
  355. package/dist/cli/record-reach.js +2 -2
  356. package/dist/cli/record-reach.js.map +1 -1
  357. package/dist/cli/record-tables.d.ts.map +1 -1
  358. package/dist/cli/record-tables.js +6 -5
  359. package/dist/cli/record-tables.js.map +1 -1
  360. package/dist/cli/record.d.ts +1 -5
  361. package/dist/cli/record.d.ts.map +1 -1
  362. package/dist/cli/record.js +9 -8
  363. package/dist/cli/record.js.map +1 -1
  364. package/dist/cli/search-index.d.ts.map +1 -1
  365. package/dist/cli/search-index.js +7 -6
  366. package/dist/cli/search-index.js.map +1 -1
  367. package/dist/cli/statuses.d.ts +0 -2
  368. package/dist/cli/statuses.d.ts.map +1 -1
  369. package/dist/cli/statuses.js +12 -9
  370. package/dist/cli/statuses.js.map +1 -1
  371. package/dist/cli/stored-results.d.ts +7 -0
  372. package/dist/cli/stored-results.d.ts.map +1 -0
  373. package/dist/cli/stored-results.js +23 -0
  374. package/dist/cli/stored-results.js.map +1 -0
  375. package/dist/cli/version.d.ts +1 -0
  376. package/dist/cli/version.d.ts.map +1 -1
  377. package/dist/cli/version.js +8 -5
  378. package/dist/cli/version.js.map +1 -1
  379. package/dist/cli-api.d.ts +36 -5
  380. package/dist/cli-api.d.ts.map +1 -1
  381. package/dist/cli-api.js +30 -4
  382. package/dist/cli-api.js.map +1 -1
  383. package/dist/composition/algebraic-equivalence.d.ts +43 -0
  384. package/dist/composition/algebraic-equivalence.d.ts.map +1 -0
  385. package/dist/composition/algebraic-equivalence.js +115 -0
  386. package/dist/composition/algebraic-equivalence.js.map +1 -0
  387. package/dist/composition/axes.d.ts +0 -6
  388. package/dist/composition/axes.d.ts.map +1 -1
  389. package/dist/composition/axes.js +6 -6
  390. package/dist/composition/axes.js.map +1 -1
  391. package/dist/composition/axis-audit.d.ts +47 -20
  392. package/dist/composition/axis-audit.d.ts.map +1 -1
  393. package/dist/composition/axis-audit.js +82 -9
  394. package/dist/composition/axis-audit.js.map +1 -1
  395. package/dist/composition/bridge-analysis.d.ts +17 -0
  396. package/dist/composition/bridge-analysis.d.ts.map +1 -1
  397. package/dist/composition/bridge-analysis.js +102 -55
  398. package/dist/composition/bridge-analysis.js.map +1 -1
  399. package/dist/composition/canonical-compare.d.ts +40 -0
  400. package/dist/composition/canonical-compare.d.ts.map +1 -1
  401. package/dist/composition/canonical-compare.js +122 -24
  402. package/dist/composition/canonical-compare.js.map +1 -1
  403. package/dist/composition/canonical-graph.d.ts +3 -3
  404. package/dist/composition/canonical-graph.d.ts.map +1 -1
  405. package/dist/composition/canonical-graph.js +11 -38
  406. package/dist/composition/canonical-graph.js.map +1 -1
  407. package/dist/composition/canonical-json.js +2 -2
  408. package/dist/composition/canonical-json.js.map +1 -1
  409. package/dist/composition/catalog-graph.d.ts.map +1 -1
  410. package/dist/composition/catalog-graph.js +2 -5
  411. package/dist/composition/catalog-graph.js.map +1 -1
  412. package/dist/composition/chain-candidate.d.ts +8 -0
  413. package/dist/composition/chain-candidate.d.ts.map +1 -1
  414. package/dist/composition/chain-candidate.js +9 -2
  415. package/dist/composition/chain-candidate.js.map +1 -1
  416. package/dist/composition/chain-match.d.ts +6 -3
  417. package/dist/composition/chain-match.d.ts.map +1 -1
  418. package/dist/composition/chain-match.js +4 -1
  419. package/dist/composition/chain-match.js.map +1 -1
  420. package/dist/composition/chain-result.d.ts.map +1 -1
  421. package/dist/composition/chain-result.js +2 -14
  422. package/dist/composition/chain-result.js.map +1 -1
  423. package/dist/composition/compose-symbolic.d.ts.map +1 -1
  424. package/dist/composition/compose-symbolic.js +3 -2
  425. package/dist/composition/compose-symbolic.js.map +1 -1
  426. package/dist/composition/compose.d.ts.map +1 -1
  427. package/dist/composition/compose.js +13 -5
  428. package/dist/composition/compose.js.map +1 -1
  429. package/dist/composition/composition-recovery.d.ts.map +1 -1
  430. package/dist/composition/composition-recovery.js +4 -7
  431. package/dist/composition/composition-recovery.js.map +1 -1
  432. package/dist/composition/consequence.d.ts +15 -5
  433. package/dist/composition/consequence.d.ts.map +1 -1
  434. package/dist/composition/consequence.js +6 -4
  435. package/dist/composition/consequence.js.map +1 -1
  436. package/dist/composition/discovery.d.ts +129 -9
  437. package/dist/composition/discovery.d.ts.map +1 -1
  438. package/dist/composition/discovery.js +171 -67
  439. package/dist/composition/discovery.js.map +1 -1
  440. package/dist/composition/edge.d.ts +21 -2
  441. package/dist/composition/edge.d.ts.map +1 -1
  442. package/dist/composition/edge.js +23 -1
  443. package/dist/composition/edge.js.map +1 -1
  444. package/dist/composition/enumerate.d.ts.map +1 -1
  445. package/dist/composition/enumerate.js +18 -3
  446. package/dist/composition/enumerate.js.map +1 -1
  447. package/dist/composition/evaluate-relation.d.ts +35 -11
  448. package/dist/composition/evaluate-relation.d.ts.map +1 -1
  449. package/dist/composition/evaluate-relation.js +60 -39
  450. package/dist/composition/evaluate-relation.js.map +1 -1
  451. package/dist/composition/explain.d.ts +3 -12
  452. package/dist/composition/explain.d.ts.map +1 -1
  453. package/dist/composition/explain.js +7 -20
  454. package/dist/composition/explain.js.map +1 -1
  455. package/dist/composition/expr-eval.d.ts +1 -1
  456. package/dist/composition/expr-eval.d.ts.map +1 -1
  457. package/dist/composition/expr-eval.js +6 -15
  458. package/dist/composition/expr-eval.js.map +1 -1
  459. package/dist/composition/expr-simplify.d.ts +26 -14
  460. package/dist/composition/expr-simplify.d.ts.map +1 -1
  461. package/dist/composition/expr-simplify.js +64 -72
  462. package/dist/composition/expr-simplify.js.map +1 -1
  463. package/dist/composition/formula-shape.d.ts +23 -4
  464. package/dist/composition/formula-shape.d.ts.map +1 -1
  465. package/dist/composition/formula-shape.js +57 -17
  466. package/dist/composition/formula-shape.js.map +1 -1
  467. package/dist/composition/graph-structure.d.ts +98 -0
  468. package/dist/composition/graph-structure.d.ts.map +1 -0
  469. package/dist/composition/graph-structure.js +167 -0
  470. package/dist/composition/graph-structure.js.map +1 -0
  471. package/dist/composition/graph-viz-svg.d.ts.map +1 -1
  472. package/dist/composition/graph-viz-svg.js +1 -1
  473. package/dist/composition/graph-viz-svg.js.map +1 -1
  474. package/dist/composition/graph-viz.d.ts.map +1 -1
  475. package/dist/composition/graph-viz.js +8 -37
  476. package/dist/composition/graph-viz.js.map +1 -1
  477. package/dist/composition/grounding.d.ts.map +1 -1
  478. package/dist/composition/grounding.js +19 -7
  479. package/dist/composition/grounding.js.map +1 -1
  480. package/dist/composition/identifiability.d.ts +91 -4
  481. package/dist/composition/identifiability.d.ts.map +1 -1
  482. package/dist/composition/identifiability.js +363 -6
  483. package/dist/composition/identifiability.js.map +1 -1
  484. package/dist/composition/index.d.ts +8 -4
  485. package/dist/composition/index.d.ts.map +1 -1
  486. package/dist/composition/index.js +3 -2
  487. package/dist/composition/index.js.map +1 -1
  488. package/dist/composition/mathts-quiet.d.ts +7 -8
  489. package/dist/composition/mathts-quiet.d.ts.map +1 -1
  490. package/dist/composition/mathts-quiet.js +7 -16
  491. package/dist/composition/mathts-quiet.js.map +1 -1
  492. package/dist/composition/mathts-scalar-symbols.d.ts.map +1 -1
  493. package/dist/composition/mathts-scalar-symbols.js +2 -1
  494. package/dist/composition/mathts-scalar-symbols.js.map +1 -1
  495. package/dist/composition/own-equation-magnitude.d.ts +95 -0
  496. package/dist/composition/own-equation-magnitude.d.ts.map +1 -0
  497. package/dist/composition/own-equation-magnitude.js +270 -0
  498. package/dist/composition/own-equation-magnitude.js.map +1 -0
  499. package/dist/composition/probe/backend-protocol.d.ts +3 -0
  500. package/dist/composition/probe/backend-protocol.d.ts.map +1 -1
  501. package/dist/composition/probe/backend-protocol.js.map +1 -1
  502. package/dist/composition/probe/candidate-store.d.ts +1 -0
  503. package/dist/composition/probe/candidate-store.d.ts.map +1 -1
  504. package/dist/composition/probe/candidate-store.js +1 -0
  505. package/dist/composition/probe/candidate-store.js.map +1 -1
  506. package/dist/composition/probe/corpus.d.ts +8 -4
  507. package/dist/composition/probe/corpus.d.ts.map +1 -1
  508. package/dist/composition/probe/corpus.js +23 -12
  509. package/dist/composition/probe/corpus.js.map +1 -1
  510. package/dist/composition/probe/dataset.d.ts +18 -0
  511. package/dist/composition/probe/dataset.d.ts.map +1 -1
  512. package/dist/composition/probe/dataset.js +95 -50
  513. package/dist/composition/probe/dataset.js.map +1 -1
  514. package/dist/composition/probe/experiment-design.d.ts +7 -1
  515. package/dist/composition/probe/experiment-design.d.ts.map +1 -1
  516. package/dist/composition/probe/experiment-design.js +44 -24
  517. package/dist/composition/probe/experiment-design.js.map +1 -1
  518. package/dist/composition/probe/falsify.d.ts +2 -0
  519. package/dist/composition/probe/falsify.d.ts.map +1 -1
  520. package/dist/composition/probe/falsify.js +2 -0
  521. package/dist/composition/probe/falsify.js.map +1 -1
  522. package/dist/composition/probe/fit.d.ts +7 -0
  523. package/dist/composition/probe/fit.d.ts.map +1 -1
  524. package/dist/composition/probe/fit.js +46 -22
  525. package/dist/composition/probe/fit.js.map +1 -1
  526. package/dist/composition/probe/frontier.d.ts.map +1 -1
  527. package/dist/composition/probe/frontier.js +33 -15
  528. package/dist/composition/probe/frontier.js.map +1 -1
  529. package/dist/composition/probe/generator.d.ts +30 -1
  530. package/dist/composition/probe/generator.d.ts.map +1 -1
  531. package/dist/composition/probe/generator.js +58 -36
  532. package/dist/composition/probe/generator.js.map +1 -1
  533. package/dist/composition/probe/index.d.ts +14 -0
  534. package/dist/composition/probe/index.d.ts.map +1 -1
  535. package/dist/composition/probe/index.js +6 -0
  536. package/dist/composition/probe/index.js.map +1 -1
  537. package/dist/composition/probe/limits.d.ts +25 -1
  538. package/dist/composition/probe/limits.d.ts.map +1 -1
  539. package/dist/composition/probe/limits.js +53 -11
  540. package/dist/composition/probe/limits.js.map +1 -1
  541. package/dist/composition/probe/pipeline.d.ts +5 -0
  542. package/dist/composition/probe/pipeline.d.ts.map +1 -1
  543. package/dist/composition/probe/pipeline.js +73 -24
  544. package/dist/composition/probe/pipeline.js.map +1 -1
  545. package/dist/composition/probe/power-law.d.ts +121 -0
  546. package/dist/composition/probe/power-law.d.ts.map +1 -0
  547. package/dist/composition/probe/power-law.js +251 -0
  548. package/dist/composition/probe/power-law.js.map +1 -0
  549. package/dist/composition/probe/problem.d.ts +8 -4
  550. package/dist/composition/probe/problem.d.ts.map +1 -1
  551. package/dist/composition/probe/problem.js +177 -49
  552. package/dist/composition/probe/problem.js.map +1 -1
  553. package/dist/composition/probe/report.js +1 -1
  554. package/dist/composition/probe/report.js.map +1 -1
  555. package/dist/composition/probe/residual.d.ts +7 -1
  556. package/dist/composition/probe/residual.d.ts.map +1 -1
  557. package/dist/composition/probe/residual.js +10 -7
  558. package/dist/composition/probe/residual.js.map +1 -1
  559. package/dist/composition/probe/run-manifest.d.ts +1 -0
  560. package/dist/composition/probe/run-manifest.d.ts.map +1 -1
  561. package/dist/composition/probe/run-manifest.js.map +1 -1
  562. package/dist/composition/probe/scalar-search.d.ts +50 -0
  563. package/dist/composition/probe/scalar-search.d.ts.map +1 -0
  564. package/dist/composition/probe/scalar-search.js +169 -0
  565. package/dist/composition/probe/scalar-search.js.map +1 -0
  566. package/dist/composition/probe/scoring.d.ts +1 -0
  567. package/dist/composition/probe/scoring.d.ts.map +1 -1
  568. package/dist/composition/probe/scoring.js.map +1 -1
  569. package/dist/composition/probe/structure.d.ts +82 -17
  570. package/dist/composition/probe/structure.d.ts.map +1 -1
  571. package/dist/composition/probe/structure.js +129 -55
  572. package/dist/composition/probe/structure.js.map +1 -1
  573. package/dist/composition/probe/study.d.ts +31 -9
  574. package/dist/composition/probe/study.d.ts.map +1 -1
  575. package/dist/composition/probe/study.js +235 -184
  576. package/dist/composition/probe/study.js.map +1 -1
  577. package/dist/composition/probe/t-tail.d.ts +16 -0
  578. package/dist/composition/probe/t-tail.d.ts.map +1 -0
  579. package/dist/composition/probe/t-tail.js +29 -0
  580. package/dist/composition/probe/t-tail.js.map +1 -0
  581. package/dist/composition/probe/types.d.ts +3 -0
  582. package/dist/composition/probe/types.d.ts.map +1 -1
  583. package/dist/composition/probe/types.js.map +1 -1
  584. package/dist/composition/proposed-bridges.d.ts +52 -12
  585. package/dist/composition/proposed-bridges.d.ts.map +1 -1
  586. package/dist/composition/proposed-bridges.js +107 -60
  587. package/dist/composition/proposed-bridges.js.map +1 -1
  588. package/dist/composition/quantity-clusters.d.ts +48 -0
  589. package/dist/composition/quantity-clusters.d.ts.map +1 -0
  590. package/dist/composition/quantity-clusters.js +98 -0
  591. package/dist/composition/quantity-clusters.js.map +1 -0
  592. package/dist/composition/rational-exponent.d.ts +40 -0
  593. package/dist/composition/rational-exponent.d.ts.map +1 -0
  594. package/dist/composition/rational-exponent.js +65 -0
  595. package/dist/composition/rational-exponent.js.map +1 -0
  596. package/dist/composition/representative-values.d.ts +22 -0
  597. package/dist/composition/representative-values.d.ts.map +1 -1
  598. package/dist/composition/representative-values.js +29 -0
  599. package/dist/composition/representative-values.js.map +1 -1
  600. package/dist/composition/retrodiction.d.ts +15 -0
  601. package/dist/composition/retrodiction.d.ts.map +1 -1
  602. package/dist/composition/retrodiction.js +12 -4
  603. package/dist/composition/retrodiction.js.map +1 -1
  604. package/dist/composition/user-equation.d.ts +1 -0
  605. package/dist/composition/user-equation.d.ts.map +1 -1
  606. package/dist/composition/user-equation.js +3 -2
  607. package/dist/composition/user-equation.js.map +1 -1
  608. package/dist/core/assignment.d.ts +19 -0
  609. package/dist/core/assignment.d.ts.map +1 -0
  610. package/dist/core/assignment.js +19 -0
  611. package/dist/core/assignment.js.map +1 -0
  612. package/dist/core/compare.d.ts +32 -0
  613. package/dist/core/compare.d.ts.map +1 -0
  614. package/dist/core/compare.js +46 -0
  615. package/dist/core/compare.js.map +1 -0
  616. package/dist/core/constants.d.ts +42 -41
  617. package/dist/core/constants.d.ts.map +1 -1
  618. package/dist/core/constants.js +71 -51
  619. package/dist/core/constants.js.map +1 -1
  620. package/dist/core/data-file.d.ts +7 -0
  621. package/dist/core/data-file.d.ts.map +1 -1
  622. package/dist/core/data-file.js +17 -0
  623. package/dist/core/data-file.js.map +1 -1
  624. package/dist/core/format.d.ts +36 -0
  625. package/dist/core/format.d.ts.map +1 -0
  626. package/dist/core/format.js +39 -0
  627. package/dist/core/format.js.map +1 -0
  628. package/dist/core/hash.d.ts +14 -0
  629. package/dist/core/hash.d.ts.map +1 -0
  630. package/dist/core/hash.js +17 -0
  631. package/dist/core/hash.js.map +1 -0
  632. package/dist/core/json-schema.d.ts +2 -0
  633. package/dist/core/json-schema.d.ts.map +1 -1
  634. package/dist/core/json-schema.js +14 -13
  635. package/dist/core/json-schema.js.map +1 -1
  636. package/dist/core/labeled-tensor.d.ts.map +1 -1
  637. package/dist/core/labeled-tensor.js +0 -8
  638. package/dist/core/labeled-tensor.js.map +1 -1
  639. package/dist/core/mathts-read.d.ts +25 -0
  640. package/dist/core/mathts-read.d.ts.map +1 -0
  641. package/dist/core/mathts-read.js +51 -0
  642. package/dist/core/mathts-read.js.map +1 -0
  643. package/dist/core/tensor.d.ts.map +1 -1
  644. package/dist/core/tensor.js +24 -0
  645. package/dist/core/tensor.js.map +1 -1
  646. package/dist/core/types.d.ts +5 -5
  647. package/dist/diff/bridge-ast-gradient.d.ts +27 -23
  648. package/dist/diff/bridge-ast-gradient.d.ts.map +1 -1
  649. package/dist/diff/bridge-ast-gradient.js +75 -173
  650. package/dist/diff/bridge-ast-gradient.js.map +1 -1
  651. package/dist/diff/bridge-gradient.d.ts +19 -6
  652. package/dist/diff/bridge-gradient.d.ts.map +1 -1
  653. package/dist/diff/bridge-gradient.js +19 -11
  654. package/dist/diff/bridge-gradient.js.map +1 -1
  655. package/dist/diff/bridge-specs.d.ts.map +1 -1
  656. package/dist/diff/bridge-specs.js +3 -0
  657. package/dist/diff/bridge-specs.js.map +1 -1
  658. package/dist/dimensional/algebra.d.ts +18 -0
  659. package/dist/dimensional/algebra.d.ts.map +1 -1
  660. package/dist/dimensional/algebra.js +41 -1
  661. package/dist/dimensional/algebra.js.map +1 -1
  662. package/dist/dimensional/ast-builders.d.ts +7 -0
  663. package/dist/dimensional/ast-builders.d.ts.map +1 -1
  664. package/dist/dimensional/ast-builders.js +11 -0
  665. package/dist/dimensional/ast-builders.js.map +1 -1
  666. package/dist/dimensional/ast-leaves.d.ts +81 -0
  667. package/dist/dimensional/ast-leaves.d.ts.map +1 -0
  668. package/dist/dimensional/ast-leaves.js +146 -0
  669. package/dist/dimensional/ast-leaves.js.map +1 -0
  670. package/dist/dimensional/ast-types.d.ts +15 -0
  671. package/dist/dimensional/ast-types.d.ts.map +1 -1
  672. package/dist/dimensional/ast-types.js.map +1 -1
  673. package/dist/dimensional/buckingham.d.ts.map +1 -1
  674. package/dist/dimensional/buckingham.js +15 -27
  675. package/dist/dimensional/buckingham.js.map +1 -1
  676. package/dist/dimensional/constant-rows.js +9 -9
  677. package/dist/dimensional/constant-rows.js.map +1 -1
  678. package/dist/dimensional/curvature-composite.d.ts +1 -1
  679. package/dist/dimensional/curvature-composite.js.map +1 -1
  680. package/dist/dimensional/dimension-inference.d.ts.map +1 -1
  681. package/dist/dimensional/dimension-inference.js +1 -2
  682. package/dist/dimensional/dimension-inference.js.map +1 -1
  683. package/dist/dimensional/errors.d.ts +1 -1
  684. package/dist/dimensional/errors.d.ts.map +1 -1
  685. package/dist/dimensional/errors.js +1 -15
  686. package/dist/dimensional/errors.js.map +1 -1
  687. package/dist/dimensional/exact-scale.d.ts +24 -11
  688. package/dist/dimensional/exact-scale.d.ts.map +1 -1
  689. package/dist/dimensional/exact-scale.js +122 -130
  690. package/dist/dimensional/exact-scale.js.map +1 -1
  691. package/dist/dimensional/gauge-field.d.ts.map +1 -1
  692. package/dist/dimensional/gauge-field.js +2 -2
  693. package/dist/dimensional/gauge-field.js.map +1 -1
  694. package/dist/dimensional/hyphen-names.d.ts +12 -2
  695. package/dist/dimensional/hyphen-names.d.ts.map +1 -1
  696. package/dist/dimensional/hyphen-names.js +44 -19
  697. package/dist/dimensional/hyphen-names.js.map +1 -1
  698. package/dist/dimensional/mathts-unit-delegation.d.ts +29 -0
  699. package/dist/dimensional/mathts-unit-delegation.d.ts.map +1 -0
  700. package/dist/dimensional/mathts-unit-delegation.js +187 -0
  701. package/dist/dimensional/mathts-unit-delegation.js.map +1 -0
  702. package/dist/dimensional/mathts-unit-wrapper.d.ts +33 -0
  703. package/dist/dimensional/mathts-unit-wrapper.d.ts.map +1 -0
  704. package/dist/dimensional/mathts-unit-wrapper.js +190 -0
  705. package/dist/dimensional/mathts-unit-wrapper.js.map +1 -0
  706. package/dist/dimensional/metric.d.ts.map +1 -1
  707. package/dist/dimensional/metric.js +0 -1
  708. package/dist/dimensional/metric.js.map +1 -1
  709. package/dist/dimensional/scalar-lowering.d.ts +21 -0
  710. package/dist/dimensional/scalar-lowering.d.ts.map +1 -0
  711. package/dist/dimensional/scalar-lowering.js +45 -0
  712. package/dist/dimensional/scalar-lowering.js.map +1 -0
  713. package/dist/dimensional/symbolic-constants.d.ts +9 -0
  714. package/dist/dimensional/symbolic-constants.d.ts.map +1 -1
  715. package/dist/dimensional/symbolic-constants.js +13 -1
  716. package/dist/dimensional/symbolic-constants.js.map +1 -1
  717. package/dist/dimensional/types.d.ts +36 -0
  718. package/dist/dimensional/types.d.ts.map +1 -1
  719. package/dist/dimensional/types.js +45 -7
  720. package/dist/dimensional/types.js.map +1 -1
  721. package/dist/dimensional/unit-data.d.ts +5 -1
  722. package/dist/dimensional/unit-data.d.ts.map +1 -1
  723. package/dist/dimensional/unit-data.js +30 -6
  724. package/dist/dimensional/unit-data.js.map +1 -1
  725. package/dist/dimensional/units.d.ts +2 -0
  726. package/dist/dimensional/units.d.ts.map +1 -1
  727. package/dist/dimensional/units.js +59 -3
  728. package/dist/dimensional/units.js.map +1 -1
  729. package/dist/dimensional/validator.d.ts +2 -0
  730. package/dist/dimensional/validator.d.ts.map +1 -1
  731. package/dist/dimensional/validator.js.map +1 -1
  732. package/dist/index.d.ts +9 -3
  733. package/dist/index.d.ts.map +1 -1
  734. package/dist/index.js +10 -4
  735. package/dist/index.js.map +1 -1
  736. package/dist/numerical/christoffel-flat.d.ts.map +1 -1
  737. package/dist/numerical/christoffel-flat.js +3 -2
  738. package/dist/numerical/christoffel-flat.js.map +1 -1
  739. package/dist/numerical/connection-lowering-helpers.d.ts +3 -1
  740. package/dist/numerical/connection-lowering-helpers.d.ts.map +1 -1
  741. package/dist/numerical/connection-lowering-helpers.js +11 -15
  742. package/dist/numerical/connection-lowering-helpers.js.map +1 -1
  743. package/dist/numerical/covariant-eikonal.d.ts.map +1 -1
  744. package/dist/numerical/covariant-eikonal.js +34 -11
  745. package/dist/numerical/covariant-eikonal.js.map +1 -1
  746. package/dist/numerical/curvature-lowering-helpers.js +3 -2
  747. package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
  748. package/dist/numerical/errors.d.ts.map +1 -1
  749. package/dist/numerical/errors.js +0 -3
  750. package/dist/numerical/errors.js.map +1 -1
  751. package/dist/numerical/finite-difference.d.ts +22 -0
  752. package/dist/numerical/finite-difference.d.ts.map +1 -0
  753. package/dist/numerical/finite-difference.js +27 -0
  754. package/dist/numerical/finite-difference.js.map +1 -0
  755. package/dist/numerical/geodesic-integrator.d.ts.map +1 -1
  756. package/dist/numerical/geodesic-integrator.js +22 -14
  757. package/dist/numerical/geodesic-integrator.js.map +1 -1
  758. package/dist/numerical/geometrized.d.ts.map +1 -1
  759. package/dist/numerical/geometrized.js +0 -1
  760. package/dist/numerical/geometrized.js.map +1 -1
  761. package/dist/numerical/mathts-engine.d.ts.map +1 -1
  762. package/dist/numerical/mathts-engine.js +10 -24
  763. package/dist/numerical/mathts-engine.js.map +1 -1
  764. package/dist/numerical/metric-inverse.d.ts.map +1 -1
  765. package/dist/numerical/metric-inverse.js +83 -46
  766. package/dist/numerical/metric-inverse.js.map +1 -1
  767. package/dist/numerical/null-ray-integrator.d.ts +2 -1
  768. package/dist/numerical/null-ray-integrator.d.ts.map +1 -1
  769. package/dist/numerical/null-ray-integrator.js +12 -12
  770. package/dist/numerical/null-ray-integrator.js.map +1 -1
  771. package/dist/numerical/painleve-gullstrand-metric.js +2 -2
  772. package/dist/numerical/painleve-gullstrand-metric.js.map +1 -1
  773. package/dist/numerical/pderiv.d.ts.map +1 -1
  774. package/dist/numerical/pderiv.js +2 -6
  775. package/dist/numerical/pderiv.js.map +1 -1
  776. package/dist/numerical/perihelion-finder.d.ts +0 -36
  777. package/dist/numerical/perihelion-finder.d.ts.map +1 -1
  778. package/dist/numerical/perihelion-finder.js +41 -87
  779. package/dist/numerical/perihelion-finder.js.map +1 -1
  780. package/dist/numerical/quadrature.d.ts.map +1 -1
  781. package/dist/numerical/quadrature.js +11 -13
  782. package/dist/numerical/quadrature.js.map +1 -1
  783. package/dist/numerical/rk4-trajectory.d.ts +10 -0
  784. package/dist/numerical/rk4-trajectory.d.ts.map +1 -0
  785. package/dist/numerical/rk4-trajectory.js +37 -0
  786. package/dist/numerical/rk4-trajectory.js.map +1 -0
  787. package/dist/numerical/schwarzschild.d.ts +14 -0
  788. package/dist/numerical/schwarzschild.d.ts.map +1 -0
  789. package/dist/numerical/schwarzschild.js +17 -0
  790. package/dist/numerical/schwarzschild.js.map +1 -0
  791. package/dist/numerical/spacetime-metrics.d.ts +12 -0
  792. package/dist/numerical/spacetime-metrics.d.ts.map +1 -1
  793. package/dist/numerical/spacetime-metrics.js +72 -56
  794. package/dist/numerical/spacetime-metrics.js.map +1 -1
  795. package/dist/numerical/statistics.d.ts +24 -0
  796. package/dist/numerical/statistics.d.ts.map +1 -0
  797. package/dist/numerical/statistics.js +52 -0
  798. package/dist/numerical/statistics.js.map +1 -0
  799. package/dist/numerical/strides.d.ts +3 -2
  800. package/dist/numerical/strides.d.ts.map +1 -1
  801. package/dist/numerical/strides.js +3 -10
  802. package/dist/numerical/strides.js.map +1 -1
  803. package/dist/numerical/tensor-engine.d.ts +21 -0
  804. package/dist/numerical/tensor-engine.d.ts.map +1 -1
  805. package/dist/numerical/tensor-engine.js +12 -0
  806. package/dist/numerical/tensor-engine.js.map +1 -1
  807. package/dist/relations/regime.d.ts +10 -0
  808. package/dist/relations/regime.d.ts.map +1 -1
  809. package/dist/relations/regime.js +18 -1
  810. package/dist/relations/regime.js.map +1 -1
  811. package/package.json +9 -12
  812. package/dist/cases/brownian-sphere.d.ts +0 -68
  813. package/dist/cases/brownian-sphere.d.ts.map +0 -1
  814. package/dist/cases/brownian-sphere.js +0 -354
  815. package/dist/cases/brownian-sphere.js.map +0 -1
  816. package/dist/cases/damped-resonator.d.ts +0 -23
  817. package/dist/cases/damped-resonator.d.ts.map +0 -1
  818. package/dist/cases/damped-resonator.js +0 -224
  819. package/dist/cases/damped-resonator.js.map +0 -1
  820. package/dist/cases/kepler-rv.d.ts +0 -13
  821. package/dist/cases/kepler-rv.d.ts.map +0 -1
  822. package/dist/cases/kepler-rv.js +0 -172
  823. package/dist/cases/kepler-rv.js.map +0 -1
  824. package/dist/cases/lumped-cooling.d.ts +0 -46
  825. package/dist/cases/lumped-cooling.d.ts.map +0 -1
  826. package/dist/cases/lumped-cooling.js +0 -261
  827. package/dist/cases/lumped-cooling.js.map +0 -1
  828. package/dist/cases/resistor-noise.d.ts +0 -14
  829. package/dist/cases/resistor-noise.d.ts.map +0 -1
  830. package/dist/cases/resistor-noise.js +0 -215
  831. package/dist/cases/resistor-noise.js.map +0 -1
  832. package/dist/cases/skin-depth.d.ts +0 -21
  833. package/dist/cases/skin-depth.d.ts.map +0 -1
  834. package/dist/cases/skin-depth.js +0 -174
  835. package/dist/cases/skin-depth.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "title": "UPT Bridge Catalog Artifact",
4
- "description": "The bridge catalog. data/bridge-catalog.json is the source; src/bridges/catalog-load.ts (and the dimension projection in src/dimensional/bridge-check.ts, through the same src/core/data-file.ts reader) validates it against this schema when it loads, with the keyword subset src/core/json-schema.ts reads, then derives each relation's confidence from its row and the sign clauses from the evaluator flags. type is required on every record. formalRef is derived from formalKey and is not stored. Every field declared here has a reader in src/; a field nothing reads is not declared.",
4
+ "description": "The bridge catalog. data/bridge-catalog.json is the source; src/bridges/catalog-load.ts (and the dimension projection in src/dimensional/bridge-check.ts, through the same src/core/data-file.ts reader) validates it against this schema when it loads, with the keyword subset src/core/json-schema.ts reads, then derives each relation's confidence from its row and the sign clauses from the evaluator flags. type is required on every record. formalRef is derived from formalKey and is not stored; theorem and proofStatus are its checked projections (catalogProofProblems). Every field declared here has a reader in src/; a field nothing reads is not declared.",
5
5
  "type": "object",
6
6
  "required": [
7
7
  "schemaVersion",
@@ -271,7 +271,8 @@
271
271
  "references",
272
272
  "dependencies",
273
273
  "known_issues",
274
- "notes"
274
+ "notes",
275
+ "proofStatus"
275
276
  ],
276
277
  "additionalProperties": false,
277
278
  "properties": {
@@ -313,6 +314,14 @@
313
314
  "invalid"
314
315
  ]
315
316
  },
317
+ "proofStatus": {
318
+ "enum": [
319
+ "full",
320
+ "weak",
321
+ "pending"
322
+ ],
323
+ "description": "How far lean/ proves this record, best first: full (its Lean theorem is kind bridge and reviewed: it states the catalogued equation, and the catalog path passes it to deriveEvidence), weak (its theorem proves part of the equation: a derivation-step, limit, reduction, property or cross-check, or its row is unreviewed), pending (no Lean theorem; no formalKey). A projection of formalKey and formal/lean/manifest.json, checked by catalogProofProblems (src/atlas/catalog-formal-ref.ts) in tests/atlas/catalog-proof-status.test.ts and in the formalRef gate; it is never set by hand to anything else."
324
+ },
316
325
  "formula_latex": {
317
326
  "type": [
318
327
  "string",
@@ -421,7 +430,12 @@
421
430
  "formalKey": {
422
431
  "type": "string",
423
432
  "pattern": "^be-[a-z0-9-]+$",
424
- "description": "The PhysJS manifest key. formalRef, its kind included, is read from that manifest entry. The catalog stores no kind of its own."
433
+ "description": "The key of this record's entry in formal/lean/manifest.json. formalRef, its kind included, is read from that manifest entry. The catalog stores no kind of its own."
434
+ },
435
+ "theorem": {
436
+ "type": "string",
437
+ "pattern": "^PhysJS(\\.[A-Za-z_][A-Za-z0-9_']*)+$",
438
+ "description": "The Lean theorem the manifest entry of formalKey names, declared in lean/ (formal/lean/theorem-files.json gives the file). Present exactly when formalKey is. catalogFormalRef refuses a record whose theorem is not the manifest's; tests/atlas/catalog-proof-status.test.ts checks every record."
425
439
  },
426
440
  "dimension": {
427
441
  "type": "object"
@@ -547,6 +561,34 @@
547
561
  "const": true,
548
562
  "description": "The row's adjudication is contested (recorded in the negative catalog's commentary); it stays out of the null-result list until a membership rejection or a confrontation adjudicates it."
549
563
  }
564
+ },
565
+ "if": {
566
+ "required": [
567
+ "formalKey"
568
+ ]
569
+ },
570
+ "then": {
571
+ "required": [
572
+ "theorem"
573
+ ],
574
+ "properties": {
575
+ "proofStatus": {
576
+ "enum": [
577
+ "full",
578
+ "weak"
579
+ ]
580
+ }
581
+ }
582
+ },
583
+ "else": {
584
+ "propertyNames": {
585
+ "pattern": "^(?!theorem$)"
586
+ },
587
+ "properties": {
588
+ "proofStatus": {
589
+ "const": "pending"
590
+ }
591
+ }
550
592
  }
551
593
  }
552
594
  },
@@ -565,7 +607,6 @@
565
607
  "sources",
566
608
  "aliases",
567
609
  "holds",
568
- "domain",
569
610
  "citation"
570
611
  ],
571
612
  "additionalProperties": false,
@@ -618,9 +659,6 @@
618
659
  "type": "string",
619
660
  "minLength": 1
620
661
  },
621
- "domain": {
622
- "type": "string"
623
- },
624
662
  "confidence": {
625
663
  "enum": [
626
664
  "established",
package/data/units.json CHANGED
@@ -627,7 +627,8 @@
627
627
  },
628
628
  {
629
629
  "symbols": [
630
- "arcsec"
630
+ "arcsec",
631
+ "arcsecond"
631
632
  ],
632
633
  "scale": "pi/648000",
633
634
  "dimension": {},
@@ -1058,33 +1059,13 @@
1058
1059
  }
1059
1060
  ],
1060
1061
  "refused": [
1061
- {
1062
- "symbol": "dB",
1063
- "reason": "dB is a logarithmic unit; give the quantity in its linear unit, or a reference level"
1064
- },
1065
- {
1066
- "symbol": "dBm",
1067
- "reason": "dBm is a logarithmic unit (decibels over 1 mW); give watts"
1068
- },
1069
- {
1070
- "symbol": "dBW",
1071
- "reason": "dBW is a logarithmic unit (decibels over 1 W); give watts"
1072
- },
1073
- {
1074
- "symbol": "Np",
1075
- "reason": "Np is a logarithmic unit (the neper); give the quantity in its linear unit, or a reference level"
1076
- },
1077
- {
1078
- "symbol": "Mach",
1079
- "reason": "Mach is a ratio to the local speed of sound; give m/s, or the ratio as a bare number"
1080
- },
1081
- {
1082
- "symbol": "mach",
1083
- "reason": "mach is a ratio to the local speed of sound; give m/s, or the ratio as a bare number"
1084
- },
1085
1062
  {
1086
1063
  "symbol": "ton",
1087
1064
  "reason": "'ton' is ambiguous: short ton (907.185 kg), long ton (1016.047 kg), or metric tonne (1000 kg); write tonne"
1065
+ },
1066
+ {
1067
+ "symbol": "tons",
1068
+ "reason": "'tons' is ambiguous: short ton (907.185 kg), long ton (1016.047 kg), or metric tonne (1000 kg); write tonne"
1088
1069
  }
1089
1070
  ],
1090
1071
  "prefixLetterUnits": {
@@ -1 +1 @@
1
- {"version":3,"file":"applicability.d.ts","sourceRoot":"","sources":["../../src/atlas/applicability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAE5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,qFAAqF;AACrF,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,UAAU,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,MAAM,wBAAwB,GAChC,2BAA2B,GAC3B,qBAAqB,GACrB,uBAAuB,GACvB,oBAAoB,GACpB,kBAAkB,GAClB,yBAAyB,GACzB,uBAAuB,CAAC;AAE5B,+EAA+E;AAC/E,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC;IACzC,sDAAsD;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IACjC,6DAA6D;IAC7D,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC;IACxB,yFAAyF;IACzF,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,iDAAiD;IACjD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,WAAW,CAAC;IAC1C,oDAAoD;IACpD,QAAQ,CAAC,qBAAqB,CAAC,EAAE,WAAW,CAAC;IAC7C,iCAAiC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC1C,kCAAkC;IAClC,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;CACnE;AAgMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,kBAAkB,GACxB,SAAS,oBAAoB,EAAE,CAkFjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,SAAS,oBAAoB,EAAE,GACxC,SAAS,oBAAoB,EAAE,CAEjC"}
1
+ {"version":3,"file":"applicability.d.ts","sourceRoot":"","sources":["../../src/atlas/applicability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAE5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,qFAAqF;AACrF,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,UAAU,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,MAAM,wBAAwB,GAChC,2BAA2B,GAC3B,qBAAqB,GACrB,uBAAuB,GACvB,oBAAoB,GACpB,kBAAkB,GAClB,yBAAyB,GACzB,uBAAuB,CAAC;AAE5B,+EAA+E;AAC/E,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC;IACzC,sDAAsD;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IACjC,6DAA6D;IAC7D,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC;IACxB,yFAAyF;IACzF,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,iDAAiD;IACjD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,WAAW,CAAC;IAC1C,oDAAoD;IACpD,QAAQ,CAAC,qBAAqB,CAAC,EAAE,WAAW,CAAC;IAC7C,iCAAiC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC1C,kCAAkC;IAClC,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;CACnE;AAwMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,kBAAkB,GACxB,SAAS,oBAAoB,EAAE,CAkFjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,SAAS,oBAAoB,EAAE,GACxC,SAAS,oBAAoB,EAAE,CAEjC"}
@@ -31,6 +31,7 @@
31
31
  */
32
32
  import { validate } from '../dimensional/validator.js';
33
33
  import { checkConventions, unknownConventionKeys } from './conventions.js';
34
+ import { forEachScalarLeaf, isDecimalLiteral, literalValue as leafLiteral } from '../dimensional/ast-leaves.js';
34
35
  /**
35
36
  * Non-vanishing markers a side condition may use. Matched case-insensitively
36
37
  * against the side-condition prose.
@@ -55,14 +56,21 @@ const NONVANISHING_MARKERS = [
55
56
  '>0',
56
57
  'positive',
57
58
  ];
58
- /** Free symbol names appearing anywhere in a subtree. */
59
+ /**
60
+ * The arms this checker descends into: every scalar child {@link childNodes} lists, and no
61
+ * tensor-product argument (a tensor node has no children here).
62
+ */
63
+ const SCALAR_ARMS = {
64
+ transcendental: true,
65
+ abs: true,
66
+ diracDelta: true,
67
+ integral: 'all',
68
+ derivative: true,
69
+ variationalDerivative: true,
70
+ };
71
+ /** Symbol names (literals included, as a divisor's names always were) appearing anywhere in a subtree. */
59
72
  function symbolNames(node, into = new Set()) {
60
- if (node.kind === 'symbol') {
61
- into.add(node.name);
62
- return into;
63
- }
64
- for (const child of childNodes(node))
65
- symbolNames(child, into);
73
+ forEachScalarLeaf(node, (leaf) => into.add(leaf.name), SCALAR_ARMS);
66
74
  return into;
67
75
  }
68
76
  /**
@@ -96,17 +104,15 @@ function childNodes(node) {
96
104
  /**
97
105
  * The numeric value of a leaf that IS a literal, or `null`.
98
106
  *
99
- * Literals are `symbol` leaves whose `name` parses as a number — the same
100
- * convention `validator.ts` uses to recognise a literal exponent, so the two
101
- * cannot disagree about what a literal is.
107
+ * Literals are `symbol` leaves whose `name` is a decimal literal under the one
108
+ * rule (`isDecimalLiteral`, `dimensional/ast-leaves.ts`, the validator's), and
109
+ * whose value is finite.
102
110
  */
103
111
  function literalValue(node) {
104
- if (node.kind !== 'symbol')
105
- return null;
106
- if (node.name.trim() === '')
112
+ if (node.kind !== 'symbol' || !isDecimalLiteral(node.name))
107
113
  return null;
108
- const v = Number(node.name);
109
- return Number.isFinite(v) ? v : null;
114
+ const v = leafLiteral(node);
115
+ return v !== undefined && Number.isFinite(v) ? v : null;
110
116
  }
111
117
  /** The word-like tokens of a side condition: runs of letters, digits and underscores, lower-cased. */
112
118
  function wordTokens(text) {
@@ -1 +1 @@
1
- {"version":3,"file":"applicability.js","sourceRoot":"","sources":["../../src/atlas/applicability.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Atlas Phase 4, S4.1 — the applicability checker.\n *\n * Design note: `docs/planning/Atlas-Phase-4-Design.md` §1.\n *\n * **This module answers \"what about this bridge is not checked?\", and it\n * returns FINDINGS rather than a boolean.** A boolean would have to choose\n * between \"unchecked\" and \"wrong\", and those are the two states the module\n * exists to keep apart. Every finding therefore carries a\n * {@link ApplicabilitySeverity}:\n *\n * - `'blocking'` — the data CONTRADICTS ITSELF. A dimensional failure, two\n * records declaring opposite conventions, a literal zero divisor.\n * - `'question'` — the data is SILENT. A divisor nobody guarded, a convention\n * only one side declares, two premise models whose relationship is\n * unrecorded.\n *\n * `src/atlas/conventions.ts` already argues this asymmetry at length for the\n * convention comparison: absence is not disagreement. The same reasoning\n * governs every rule here. Collapsing the two severities would report \"four\n * findings\" for a record whose only defect is that nobody wrote something\n * down, and would bury a genuine contradiction among them.\n *\n * **Nothing here mutates a record and nothing here is a verdict.** The checker\n * has no authority to promote or reject: it produces the list a reviewer reads.\n * That is the same firewall the rest of the repo keeps — no machine verdict\n * mutates a catalog.\n *\n * @module atlas/applicability\n * @internal\n */\n\nimport type { ExprNode } from '../dimensional/ast-types.js';\nimport { validate } from '../dimensional/validator.js';\nimport type { AtlasModel } from './model.js';\nimport type { Conventions } from './types.js';\nimport { checkConventions, unknownConventionKeys } from './conventions.js';\n\n/** Whether a finding is a contradiction in the data or a silence in it. @internal */\nexport type ApplicabilitySeverity = 'blocking' | 'question';\n\n/**\n * The rule that produced a finding. A closed union so a caller can filter by\n * rule without matching on prose.\n *\n * @internal\n */\nexport type ApplicabilityFindingKind =\n | 'dimensional-inconsistency'\n | 'convention-mismatch'\n | 'convention-undeclared'\n | 'division-unguarded'\n | 'division-by-zero'\n | 'squaring-adds-solutions'\n | 'model-incompatibility';\n\n/** One thing a reviewer must resolve before believing the record. @internal */\nexport interface ApplicabilityFinding {\n readonly kind: ApplicabilityFindingKind;\n readonly severity: ApplicabilitySeverity;\n /** Human-readable statement of what is unresolved. */\n readonly detail: string;\n /**\n * Where it was found: an AST path (`'args[1]'`), a convention key, or a\n * model id. Absent when the finding is about the record as a whole.\n */\n readonly where?: string;\n}\n\n/**\n * What the checker is given. Every field is optional EXCEPT the side\n * conditions, which are required so that \"this record states none\" is a\n * written choice (`[]`) rather than a forgotten argument — the same reasoning\n * that made `passingWitnessIds` required in `derive-evidence.ts`.\n *\n * @internal\n */\nexport interface ApplicabilityInput {\n /** The transformation's AST, when the record encodes one. */\n readonly ast?: ExprNode;\n /** The record's stated side conditions, as free prose. REQUIRED; `[]` is a statement. */\n readonly sideConditions: readonly string[];\n /** The premise records' declared conventions. */\n readonly premiseConventions?: Conventions;\n /** The conclusion record's declared conventions. */\n readonly conclusionConventions?: Conventions;\n /** The premise models (many). */\n readonly premises?: readonly AtlasModel[];\n /** The conclusion model (one). */\n readonly conclusion?: AtlasModel;\n /**\n * Family pairs already bridged, so a genuine cross-family step is not\n * reported as unrecorded. Unordered: `['a','b']` covers `['b','a']`.\n */\n readonly declaredBridges?: readonly (readonly [string, string])[];\n}\n\n/**\n * Non-vanishing markers a side condition may use. Matched case-insensitively\n * against the side-condition prose.\n *\n * ⚠ **Shallow by design, and the asymmetry is the point** (design note §1.3).\n * A side condition is free text and no parser exists for it. The failure mode\n * is a FALSE QUESTION — a genuinely guarded divisor phrased in words this list\n * does not know — never a false clearance, because a divisor absent from the\n * prose cannot match any marker. The check over-asks rather than over-clears.\n */\nconst NONVANISHING_MARKERS: readonly string[] = [\n '≠ 0',\n '≠0',\n '!= 0',\n '!=0',\n '<> 0',\n '<>0',\n 'nonzero',\n 'non-zero',\n 'non zero',\n '> 0',\n '>0',\n 'positive',\n];\n\n/** Free symbol names appearing anywhere in a subtree. */\nfunction symbolNames(node: ExprNode, into: Set<string> = new Set()): Set<string> {\n if (node.kind === 'symbol') {\n into.add(node.name);\n return into;\n }\n for (const child of childNodes(node)) symbolNames(child, into);\n return into;\n}\n\n/**\n * The `ExprNode` children of a node, for the scalar grammar this checker\n * reasons about. Tensor and curvature node families have no children here and\n * return `[]`: the side-condition and squaring rules are statements about\n * scalar algebra, and silently descending into a tensor node would invite\n * findings whose `where` path means nothing to a reader.\n */\nfunction childNodes(node: ExprNode): readonly ExprNode[] {\n switch (node.kind) {\n case 'op':\n return node.args;\n case 'integral':\n return [node.over, node.integrand, ...(node.lower ? [node.lower] : []),\n ...(node.upper ? [node.upper] : [])];\n case 'derivative':\n return [node.of, node.wrt];\n case 'dirac-delta':\n return [node.arg];\n case 'variational-derivative':\n return [node.functional, node.field, node.over];\n case 'transcendental':\n return [node.arg];\n case 'abs':\n return [node.arg];\n default:\n return [];\n }\n}\n\n/**\n * The numeric value of a leaf that IS a literal, or `null`.\n *\n * Literals are `symbol` leaves whose `name` parses as a number — the same\n * convention `validator.ts` uses to recognise a literal exponent, so the two\n * cannot disagree about what a literal is.\n */\nfunction literalValue(node: ExprNode): number | null {\n if (node.kind !== 'symbol') return null;\n if (node.name.trim() === '') return null;\n const v = Number(node.name);\n return Number.isFinite(v) ? v : null;\n}\n\n/** The word-like tokens of a side condition: runs of letters, digits and underscores, lower-cased. */\nfunction wordTokens(text: string): Set<string> {\n return new Set(text.toLowerCase().match(/[\\p{L}\\p{N}_]+/gu) ?? []);\n}\n\n/**\n * Is `name` guarded as non-vanishing by any of the stated side conditions?\n *\n * The name must appear as a WHOLE token of the condition: `a` is not guarded\n * by \"the amplitude is positive\", although that sentence contains the letter\n * `a` beside a marker. A substring match cleared every one-letter divisor on\n * most prose; that was the audit's A14.\n */\nfunction isGuarded(name: string, sideConditions: readonly string[]): boolean {\n const needle = name.toLowerCase();\n return sideConditions.some((raw) => {\n if (!wordTokens(raw).has(needle)) return false;\n const s = raw.toLowerCase();\n return NONVANISHING_MARKERS.some((m) => s.includes(m));\n });\n}\n\n/** An even, integer literal exponent, or `null` when the exponent is anything else. */\nfunction evenLiteralExponent(node: ExprNode): number | null {\n if (node.kind !== 'op' || node.op !== '^') return null;\n const exp = node.args[1];\n if (exp === undefined) return null;\n const v = literalValue(exp);\n if (v === null || !Number.isInteger(v) || v === 0) return null;\n return v % 2 === 0 ? v : null;\n}\n\n/** Walk the AST, applying the side-condition and squaring rules. */\nfunction checkAst(\n node: ExprNode,\n sideConditions: readonly string[],\n path: string,\n out: ApplicabilityFinding[],\n): void {\n if (node.kind === 'op' && node.op === '/') {\n const divisor = node.args[1];\n if (divisor !== undefined) {\n const lit = literalValue(divisor);\n if (lit === 0) {\n out.push({\n kind: 'division-by-zero',\n severity: 'blocking',\n detail: 'Division by the literal 0.',\n where: `${path}args[1]`,\n });\n } else if (lit === null) {\n // Not a literal: it needs a stated non-vanishing side condition.\n const names = [...symbolNames(divisor)];\n const unguarded = names.filter((n) => !isGuarded(n, sideConditions));\n // Every name guarded ⇒ nothing to ask. A divisor with NO symbols and no\n // literal value (a tensor leaf, say) is reported, because nothing about\n // it can be checked and silence there would read as clearance.\n if (names.length === 0 || unguarded.length > 0) {\n const subject = names.length === 0 ? 'the divisor' : unguarded.join(', ');\n out.push({\n kind: 'division-unguarded',\n severity: 'question',\n detail:\n `Division whose divisor (${subject}) has no stated non-vanishing side ` +\n 'condition. This is a question, not a defect: the divisor may well be ' +\n 'non-zero and simply unstated.',\n where: `${path}args[1]`,\n });\n }\n }\n }\n }\n\n // Difference (or sum) of two equal even powers ⇒ the relation was obtained by\n // squaring, which admits the sign-flipped branch. See design note §1.4 for why\n // an isolated even power is NOT reported.\n if (node.kind === 'op' && (node.op === '-' || node.op === '+')) {\n const exps = node.args.map(evenLiteralExponent);\n for (let i = 0; i < exps.length; i += 1) {\n for (let j = i + 1; j < exps.length; j += 1) {\n const a = exps[i];\n if (a !== null && a !== undefined && a === exps[j]) {\n out.push({\n kind: 'squaring-adds-solutions',\n severity: 'question',\n detail:\n `Two terms raised to the same even power (${a}) are equated. Raising a ` +\n 'relation to an even power admits the sign-flipped branch, so a side ' +\n 'condition fixing the sign is needed for the step to be reversible.',\n where: `${path}args[${i}]`,\n });\n }\n }\n }\n }\n\n const children = childNodes(node);\n for (let i = 0; i < children.length; i += 1) {\n const child = children[i];\n if (child !== undefined) checkAst(child, sideConditions, `${path}args[${i}].`, out);\n }\n}\n\n/** Is this family pair recorded as already bridged? Unordered. */\nfunction bridgeDeclared(\n a: string,\n b: string,\n declared: readonly (readonly [string, string])[],\n): boolean {\n return declared.some(([x, y]) => (x === a && y === b) || (x === b && y === a));\n}\n\n/**\n * Every unresolved question and contradiction the checker can see in a record.\n *\n * An EMPTY result means \"no rule fired\", which is weaker than \"this bridge is\n * valid\" and must not be reported as the latter. The rules in hand cover\n * dimensions, declared conventions, division guards, even-power equating and\n * model families; a bridge can be wrong in ways none of them reaches.\n *\n * @param input - the record's checkable parts. `sideConditions` is required.\n * @returns findings in rule order (dimensions, conventions, AST, models);\n * never `null`, never throws on a malformed AST.\n * @internal\n */\nexport function checkApplicability(\n input: ApplicabilityInput,\n): readonly ApplicabilityFinding[] {\n const out: ApplicabilityFinding[] = [];\n\n // 1. Dimensions — the existing validator, unchanged.\n if (input.ast !== undefined) {\n const result = validate(input.ast);\n for (const v of result.violations) {\n // A warning-severity violation does not make the record inconsistent;\n // reporting it as blocking would contradict `validate`'s own verdict.\n const severity: ApplicabilitySeverity =\n (v.severity ?? 'error') === 'error' ? 'blocking' : 'question';\n out.push({\n kind: 'dimensional-inconsistency',\n severity,\n detail: v.note,\n where: v.location === '' ? undefined : v.location,\n });\n }\n if (result.inferredDimension === null && result.violations.length === 0) {\n out.push({\n kind: 'dimensional-inconsistency',\n severity: 'blocking',\n detail: 'No dimension could be inferred for the transformation AST.',\n });\n }\n }\n\n // 2. Conventions — mismatches block, asymmetric declarations are questions.\n const mismatches = checkConventions(input.premiseConventions, input.conclusionConventions);\n for (const key of mismatches) {\n out.push({\n kind: 'convention-mismatch',\n severity: 'blocking',\n detail:\n `Premise and conclusion declare different values for '${key}'. Two records ` +\n 'that disagree on a sign or unit choice are not directly comparable.',\n where: key,\n });\n }\n for (const key of unknownConventionKeys(\n input.premiseConventions,\n input.conclusionConventions,\n )) {\n out.push({\n kind: 'convention-undeclared',\n severity: 'question',\n detail:\n `Exactly one side declares '${key}'. Silence is not agreement: the other ` +\n 'record may use the opposite choice and simply never said.',\n where: key,\n });\n }\n\n // 3. Side conditions over the AST.\n if (input.ast !== undefined) checkAst(input.ast, input.sideConditions, '', out);\n\n // 4. Model compatibility.\n const premises = input.premises ?? [];\n const declared = input.declaredBridges ?? [];\n const conclusionFamily = input.conclusion?.family;\n const families = new Set(premises.map((m) => m.family));\n if (conclusionFamily !== undefined) families.add(conclusionFamily);\n const familyList = [...families];\n for (let i = 0; i < familyList.length; i += 1) {\n for (let j = i + 1; j < familyList.length; j += 1) {\n const a = familyList[i];\n const b = familyList[j];\n if (a === undefined || b === undefined) continue;\n if (bridgeDeclared(a, b, declared)) continue;\n out.push({\n kind: 'model-incompatibility',\n severity: 'question',\n detail:\n `Models span families '${a}' and '${b}' with no declared bridge between ` +\n 'them. An unrecorded cross-family step is exactly what the atlas exists ' +\n 'to make visible.',\n where: `${a}|${b}`,\n });\n }\n }\n\n return out;\n}\n\n/**\n * The `'blocking'` subset of {@link checkApplicability}.\n *\n * Offered because the two severities are read by different callers — a report\n * shows both, a gate looks only at contradictions — and filtering on the\n * severity string at every call site is how one of them eventually filters on\n * the wrong one.\n *\n * @internal\n */\nexport function blockingFindings(\n findings: readonly ApplicabilityFinding[],\n): readonly ApplicabilityFinding[] {\n return findings.filter((f) => f.severity === 'blocking');\n}\n"]}
1
+ {"version":3,"file":"applicability.js","sourceRoot":"","sources":["../../src/atlas/applicability.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Atlas Phase 4, S4.1 — the applicability checker.\n *\n * Design note: `docs/planning/Atlas-Phase-4-Design.md` §1.\n *\n * **This module answers \"what about this bridge is not checked?\", and it\n * returns FINDINGS rather than a boolean.** A boolean would have to choose\n * between \"unchecked\" and \"wrong\", and those are the two states the module\n * exists to keep apart. Every finding therefore carries a\n * {@link ApplicabilitySeverity}:\n *\n * - `'blocking'` — the data CONTRADICTS ITSELF. A dimensional failure, two\n * records declaring opposite conventions, a literal zero divisor.\n * - `'question'` — the data is SILENT. A divisor nobody guarded, a convention\n * only one side declares, two premise models whose relationship is\n * unrecorded.\n *\n * `src/atlas/conventions.ts` already argues this asymmetry at length for the\n * convention comparison: absence is not disagreement. The same reasoning\n * governs every rule here. Collapsing the two severities would report \"four\n * findings\" for a record whose only defect is that nobody wrote something\n * down, and would bury a genuine contradiction among them.\n *\n * **Nothing here mutates a record and nothing here is a verdict.** The checker\n * has no authority to promote or reject: it produces the list a reviewer reads.\n * That is the same firewall the rest of the repo keeps — no machine verdict\n * mutates a catalog.\n *\n * @module atlas/applicability\n * @internal\n */\n\nimport type { ExprNode } from '../dimensional/ast-types.js';\nimport { validate } from '../dimensional/validator.js';\nimport type { AtlasModel } from './model.js';\nimport type { Conventions } from './types.js';\nimport { checkConventions, unknownConventionKeys } from './conventions.js';\nimport { forEachScalarLeaf, isDecimalLiteral, literalValue as leafLiteral, type LeafWalkArms } from '../dimensional/ast-leaves.js';\n\n/** Whether a finding is a contradiction in the data or a silence in it. @internal */\nexport type ApplicabilitySeverity = 'blocking' | 'question';\n\n/**\n * The rule that produced a finding. A closed union so a caller can filter by\n * rule without matching on prose.\n *\n * @internal\n */\nexport type ApplicabilityFindingKind =\n | 'dimensional-inconsistency'\n | 'convention-mismatch'\n | 'convention-undeclared'\n | 'division-unguarded'\n | 'division-by-zero'\n | 'squaring-adds-solutions'\n | 'model-incompatibility';\n\n/** One thing a reviewer must resolve before believing the record. @internal */\nexport interface ApplicabilityFinding {\n readonly kind: ApplicabilityFindingKind;\n readonly severity: ApplicabilitySeverity;\n /** Human-readable statement of what is unresolved. */\n readonly detail: string;\n /**\n * Where it was found: an AST path (`'args[1]'`), a convention key, or a\n * model id. Absent when the finding is about the record as a whole.\n */\n readonly where?: string;\n}\n\n/**\n * What the checker is given. Every field is optional EXCEPT the side\n * conditions, which are required so that \"this record states none\" is a\n * written choice (`[]`) rather than a forgotten argument — the same reasoning\n * that made `passingWitnessIds` required in `derive-evidence.ts`.\n *\n * @internal\n */\nexport interface ApplicabilityInput {\n /** The transformation's AST, when the record encodes one. */\n readonly ast?: ExprNode;\n /** The record's stated side conditions, as free prose. REQUIRED; `[]` is a statement. */\n readonly sideConditions: readonly string[];\n /** The premise records' declared conventions. */\n readonly premiseConventions?: Conventions;\n /** The conclusion record's declared conventions. */\n readonly conclusionConventions?: Conventions;\n /** The premise models (many). */\n readonly premises?: readonly AtlasModel[];\n /** The conclusion model (one). */\n readonly conclusion?: AtlasModel;\n /**\n * Family pairs already bridged, so a genuine cross-family step is not\n * reported as unrecorded. Unordered: `['a','b']` covers `['b','a']`.\n */\n readonly declaredBridges?: readonly (readonly [string, string])[];\n}\n\n/**\n * Non-vanishing markers a side condition may use. Matched case-insensitively\n * against the side-condition prose.\n *\n * ⚠ **Shallow by design, and the asymmetry is the point** (design note §1.3).\n * A side condition is free text and no parser exists for it. The failure mode\n * is a FALSE QUESTION — a genuinely guarded divisor phrased in words this list\n * does not know — never a false clearance, because a divisor absent from the\n * prose cannot match any marker. The check over-asks rather than over-clears.\n */\nconst NONVANISHING_MARKERS: readonly string[] = [\n '≠ 0',\n '≠0',\n '!= 0',\n '!=0',\n '<> 0',\n '<>0',\n 'nonzero',\n 'non-zero',\n 'non zero',\n '> 0',\n '>0',\n 'positive',\n];\n\n/**\n * The arms this checker descends into: every scalar child {@link childNodes} lists, and no\n * tensor-product argument (a tensor node has no children here).\n */\nconst SCALAR_ARMS: LeafWalkArms = {\n transcendental: true,\n abs: true,\n diracDelta: true,\n integral: 'all',\n derivative: true,\n variationalDerivative: true,\n};\n\n/** Symbol names (literals included, as a divisor's names always were) appearing anywhere in a subtree. */\nfunction symbolNames(node: ExprNode, into: Set<string> = new Set()): Set<string> {\n forEachScalarLeaf(node, (leaf) => into.add(leaf.name), SCALAR_ARMS);\n return into;\n}\n\n/**\n * The `ExprNode` children of a node, for the scalar grammar this checker\n * reasons about. Tensor and curvature node families have no children here and\n * return `[]`: the side-condition and squaring rules are statements about\n * scalar algebra, and silently descending into a tensor node would invite\n * findings whose `where` path means nothing to a reader.\n */\nfunction childNodes(node: ExprNode): readonly ExprNode[] {\n switch (node.kind) {\n case 'op':\n return node.args;\n case 'integral':\n return [node.over, node.integrand, ...(node.lower ? [node.lower] : []),\n ...(node.upper ? [node.upper] : [])];\n case 'derivative':\n return [node.of, node.wrt];\n case 'dirac-delta':\n return [node.arg];\n case 'variational-derivative':\n return [node.functional, node.field, node.over];\n case 'transcendental':\n return [node.arg];\n case 'abs':\n return [node.arg];\n default:\n return [];\n }\n}\n\n/**\n * The numeric value of a leaf that IS a literal, or `null`.\n *\n * Literals are `symbol` leaves whose `name` is a decimal literal under the one\n * rule (`isDecimalLiteral`, `dimensional/ast-leaves.ts`, the validator's), and\n * whose value is finite.\n */\nfunction literalValue(node: ExprNode): number | null {\n if (node.kind !== 'symbol' || !isDecimalLiteral(node.name)) return null;\n const v = leafLiteral(node);\n return v !== undefined && Number.isFinite(v) ? v : null;\n}\n\n/** The word-like tokens of a side condition: runs of letters, digits and underscores, lower-cased. */\nfunction wordTokens(text: string): Set<string> {\n return new Set(text.toLowerCase().match(/[\\p{L}\\p{N}_]+/gu) ?? []);\n}\n\n/**\n * Is `name` guarded as non-vanishing by any of the stated side conditions?\n *\n * The name must appear as a WHOLE token of the condition: `a` is not guarded\n * by \"the amplitude is positive\", although that sentence contains the letter\n * `a` beside a marker. A substring match cleared every one-letter divisor on\n * most prose; that was the audit's A14.\n */\nfunction isGuarded(name: string, sideConditions: readonly string[]): boolean {\n const needle = name.toLowerCase();\n return sideConditions.some((raw) => {\n if (!wordTokens(raw).has(needle)) return false;\n const s = raw.toLowerCase();\n return NONVANISHING_MARKERS.some((m) => s.includes(m));\n });\n}\n\n/** An even, integer literal exponent, or `null` when the exponent is anything else. */\nfunction evenLiteralExponent(node: ExprNode): number | null {\n if (node.kind !== 'op' || node.op !== '^') return null;\n const exp = node.args[1];\n if (exp === undefined) return null;\n const v = literalValue(exp);\n if (v === null || !Number.isInteger(v) || v === 0) return null;\n return v % 2 === 0 ? v : null;\n}\n\n/** Walk the AST, applying the side-condition and squaring rules. */\nfunction checkAst(\n node: ExprNode,\n sideConditions: readonly string[],\n path: string,\n out: ApplicabilityFinding[],\n): void {\n if (node.kind === 'op' && node.op === '/') {\n const divisor = node.args[1];\n if (divisor !== undefined) {\n const lit = literalValue(divisor);\n if (lit === 0) {\n out.push({\n kind: 'division-by-zero',\n severity: 'blocking',\n detail: 'Division by the literal 0.',\n where: `${path}args[1]`,\n });\n } else if (lit === null) {\n // Not a literal: it needs a stated non-vanishing side condition.\n const names = [...symbolNames(divisor)];\n const unguarded = names.filter((n) => !isGuarded(n, sideConditions));\n // Every name guarded ⇒ nothing to ask. A divisor with NO symbols and no\n // literal value (a tensor leaf, say) is reported, because nothing about\n // it can be checked and silence there would read as clearance.\n if (names.length === 0 || unguarded.length > 0) {\n const subject = names.length === 0 ? 'the divisor' : unguarded.join(', ');\n out.push({\n kind: 'division-unguarded',\n severity: 'question',\n detail:\n `Division whose divisor (${subject}) has no stated non-vanishing side ` +\n 'condition. This is a question, not a defect: the divisor may well be ' +\n 'non-zero and simply unstated.',\n where: `${path}args[1]`,\n });\n }\n }\n }\n }\n\n // Difference (or sum) of two equal even powers ⇒ the relation was obtained by\n // squaring, which admits the sign-flipped branch. See design note §1.4 for why\n // an isolated even power is NOT reported.\n if (node.kind === 'op' && (node.op === '-' || node.op === '+')) {\n const exps = node.args.map(evenLiteralExponent);\n for (let i = 0; i < exps.length; i += 1) {\n for (let j = i + 1; j < exps.length; j += 1) {\n const a = exps[i];\n if (a !== null && a !== undefined && a === exps[j]) {\n out.push({\n kind: 'squaring-adds-solutions',\n severity: 'question',\n detail:\n `Two terms raised to the same even power (${a}) are equated. Raising a ` +\n 'relation to an even power admits the sign-flipped branch, so a side ' +\n 'condition fixing the sign is needed for the step to be reversible.',\n where: `${path}args[${i}]`,\n });\n }\n }\n }\n }\n\n const children = childNodes(node);\n for (let i = 0; i < children.length; i += 1) {\n const child = children[i];\n if (child !== undefined) checkAst(child, sideConditions, `${path}args[${i}].`, out);\n }\n}\n\n/** Is this family pair recorded as already bridged? Unordered. */\nfunction bridgeDeclared(\n a: string,\n b: string,\n declared: readonly (readonly [string, string])[],\n): boolean {\n return declared.some(([x, y]) => (x === a && y === b) || (x === b && y === a));\n}\n\n/**\n * Every unresolved question and contradiction the checker can see in a record.\n *\n * An EMPTY result means \"no rule fired\", which is weaker than \"this bridge is\n * valid\" and must not be reported as the latter. The rules in hand cover\n * dimensions, declared conventions, division guards, even-power equating and\n * model families; a bridge can be wrong in ways none of them reaches.\n *\n * @param input - the record's checkable parts. `sideConditions` is required.\n * @returns findings in rule order (dimensions, conventions, AST, models);\n * never `null`, never throws on a malformed AST.\n * @internal\n */\nexport function checkApplicability(\n input: ApplicabilityInput,\n): readonly ApplicabilityFinding[] {\n const out: ApplicabilityFinding[] = [];\n\n // 1. Dimensions — the existing validator, unchanged.\n if (input.ast !== undefined) {\n const result = validate(input.ast);\n for (const v of result.violations) {\n // A warning-severity violation does not make the record inconsistent;\n // reporting it as blocking would contradict `validate`'s own verdict.\n const severity: ApplicabilitySeverity =\n (v.severity ?? 'error') === 'error' ? 'blocking' : 'question';\n out.push({\n kind: 'dimensional-inconsistency',\n severity,\n detail: v.note,\n where: v.location === '' ? undefined : v.location,\n });\n }\n if (result.inferredDimension === null && result.violations.length === 0) {\n out.push({\n kind: 'dimensional-inconsistency',\n severity: 'blocking',\n detail: 'No dimension could be inferred for the transformation AST.',\n });\n }\n }\n\n // 2. Conventions — mismatches block, asymmetric declarations are questions.\n const mismatches = checkConventions(input.premiseConventions, input.conclusionConventions);\n for (const key of mismatches) {\n out.push({\n kind: 'convention-mismatch',\n severity: 'blocking',\n detail:\n `Premise and conclusion declare different values for '${key}'. Two records ` +\n 'that disagree on a sign or unit choice are not directly comparable.',\n where: key,\n });\n }\n for (const key of unknownConventionKeys(\n input.premiseConventions,\n input.conclusionConventions,\n )) {\n out.push({\n kind: 'convention-undeclared',\n severity: 'question',\n detail:\n `Exactly one side declares '${key}'. Silence is not agreement: the other ` +\n 'record may use the opposite choice and simply never said.',\n where: key,\n });\n }\n\n // 3. Side conditions over the AST.\n if (input.ast !== undefined) checkAst(input.ast, input.sideConditions, '', out);\n\n // 4. Model compatibility.\n const premises = input.premises ?? [];\n const declared = input.declaredBridges ?? [];\n const conclusionFamily = input.conclusion?.family;\n const families = new Set(premises.map((m) => m.family));\n if (conclusionFamily !== undefined) families.add(conclusionFamily);\n const familyList = [...families];\n for (let i = 0; i < familyList.length; i += 1) {\n for (let j = i + 1; j < familyList.length; j += 1) {\n const a = familyList[i];\n const b = familyList[j];\n if (a === undefined || b === undefined) continue;\n if (bridgeDeclared(a, b, declared)) continue;\n out.push({\n kind: 'model-incompatibility',\n severity: 'question',\n detail:\n `Models span families '${a}' and '${b}' with no declared bridge between ` +\n 'them. An unrecorded cross-family step is exactly what the atlas exists ' +\n 'to make visible.',\n where: `${a}|${b}`,\n });\n }\n }\n\n return out;\n}\n\n/**\n * The `'blocking'` subset of {@link checkApplicability}.\n *\n * Offered because the two severities are read by different callers — a report\n * shows both, a gate looks only at contradictions — and filtering on the\n * severity string at every call site is how one of them eventually filters on\n * the wrong one.\n *\n * @internal\n */\nexport function blockingFindings(\n findings: readonly ApplicabilityFinding[],\n): readonly ApplicabilityFinding[] {\n return findings.filter((f) => f.severity === 'blocking');\n}\n"]}
@@ -62,7 +62,15 @@ export declare function queryInput(claim: string): string;
62
62
  export declare function stubVector(text: string): readonly number[];
63
63
  /** The stub embedder. It does not open a socket. @internal */
64
64
  export declare const stubEmbedder: Embedder;
65
- /** Cosine similarity. Unequal lengths are not a similarity. @internal */
65
+ /**
66
+ * Cosine similarity, from MathTS core's `pairwiseDot` (pairwise summation over
67
+ * any `ArrayLike<number>`, the frozen `Float32Array` vectors included; the
68
+ * typed `dot` of the functions package takes a plain array or a `Float64Array`
69
+ * only, and routes the latter to an async path). The norms are the same dot
70
+ * product, so a vector against itself is exactly 1 (`√(x·x) = x`).
71
+ * Unequal lengths are not a similarity.
72
+ * @internal
73
+ */
66
74
  export declare function cosine(a: ArrayLike<number>, b: ArrayLike<number>): number;
67
75
  /**
68
76
  * Best cosine first. A tie breaks by record id, so the order does not depend
@@ -1 +1 @@
1
- {"version":3,"file":"hybrid-retrieval.d.ts","sourceRoot":"","sources":["../../../src/atlas/benchmark/hybrid-retrieval.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hybrid-retrieval.d.ts","sourceRoot":"","sources":["../../../src/atlas/benchmark/hybrid-retrieval.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,8 @@
12
12
  * @module atlas/benchmark/hybrid-retrieval
13
13
  * @internal
14
14
  */
15
+ import { pairwiseDot } from '@danielsimonjr/mathts-core';
16
+ import { compareCodepoint } from '../../core/compare.js';
15
17
  import { CANONICAL_EQUATIONS } from '../../canonical/registry.js';
16
18
  import { rankByStructure } from './baselines.js';
17
19
  /** The instruction line registered with the embedding condition. @internal */
@@ -74,24 +76,24 @@ export function stubVector(text) {
74
76
  }
75
77
  /** The stub embedder. It does not open a socket. @internal */
76
78
  export const stubEmbedder = async (texts) => texts.map((text) => stubVector(text));
77
- /** Cosine similarity. Unequal lengths are not a similarity. @internal */
79
+ /**
80
+ * Cosine similarity, from MathTS core's `pairwiseDot` (pairwise summation over
81
+ * any `ArrayLike<number>`, the frozen `Float32Array` vectors included; the
82
+ * typed `dot` of the functions package takes a plain array or a `Float64Array`
83
+ * only, and routes the latter to an async path). The norms are the same dot
84
+ * product, so a vector against itself is exactly 1 (`√(x·x) = x`).
85
+ * Unequal lengths are not a similarity.
86
+ * @internal
87
+ */
78
88
  export function cosine(a, b) {
79
89
  if (a.length !== b.length) {
80
90
  throw new EmbeddingUnavailable('reply-not-a-vector');
81
91
  }
82
- let dot = 0;
83
- let na = 0;
84
- let nb = 0;
85
- for (let i = 0; i < a.length; i++) {
86
- const x = a[i];
87
- const y = b[i];
88
- dot += x * y;
89
- na += x * x;
90
- nb += y * y;
91
- }
92
+ const na = pairwiseDot(a, a);
93
+ const nb = pairwiseDot(b, b);
92
94
  if (na === 0 || nb === 0)
93
95
  return 0;
94
- return dot / Math.sqrt(na * nb);
96
+ return pairwiseDot(a, b) / Math.sqrt(na * nb);
95
97
  }
96
98
  /**
97
99
  * Best cosine first. A tie breaks by record id, so the order does not depend
@@ -101,7 +103,7 @@ export function cosine(a, b) {
101
103
  export function rankByCosine(query, records) {
102
104
  return records
103
105
  .map((r) => ({ id: r.id, s: cosine(query, r.vector) }))
104
- .sort((a, b) => (b.s !== a.s ? b.s - a.s : a.id < b.id ? -1 : a.id > b.id ? 1 : 0))
106
+ .sort((a, b) => (b.s !== a.s ? b.s - a.s : compareCodepoint(a.id, b.id)))
105
107
  .map((x) => x.id);
106
108
  }
107
109
  /** Decode a little-endian float32 vector stored as base64, the frozen file's encoding. @internal */
@@ -1 +1 @@
1
- {"version":3,"file":"hybrid-retrieval.js","sourceRoot":"","sources":["../../../src/atlas/benchmark/hybrid-retrieval.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Optional embedding retrieval. An embedder proposes an order. `rankByStructure`\n * decides what is accepted. Cosine similarity does not enter that score.\n *\n * The Ollama implementation speaks HTTP to a local process. Nothing here\n * imports an embedding library, and nothing calls out of process unless a\n * caller asks for embeddings and supplies that implementation.\n *\n * The query form is the one registered in pre-registration Amendment 11.\n * Corpus records are embedded as their text, with no instruction prefix.\n *\n * @module atlas/benchmark/hybrid-retrieval\n * @internal\n */\n\nimport { CANONICAL_EQUATIONS } from '../../canonical/registry.js';\nimport { rankByStructure, type CorpusRecord, type RetrievalQuery } from './baselines.js';\n\n/** The instruction line registered with the embedding condition. @internal */\nexport const EMBEDDING_INSTRUCTION =\n 'Given a physics claim, retrieve the established physical relation that the claim restates or misuses';\n\n/** qwen3-embedding:4b, the model the design names. The package does not install it. @internal */\nexport const OLLAMA_EMBEDDING_MODEL = 'qwen3-embedding:4b';\n\n/**\n * Length stored in the frozen vector file\n * `docs/research/criterion3/embeddings/qwen3-embedding-4b.json`.\n * A live reply of another length is not that file's vector.\n * @internal\n */\nexport const FROZEN_VECTOR_DIMS = 2560;\n\n/** SHA-256 of that frozen file, as registered in Amendment 11. @internal */\nexport const FROZEN_VECTOR_SHA256 = '8fd79d2c6aaaf95c67f9a29ceb5fe4b88b42970c8e514d98c72c00a2c519cbdc';\n\n/**\n * How long a local Ollama call may run before it counts as not finishing.\n * The design names that outcome and does not name a duration.\n * @internal\n */\nexport const OLLAMA_TIMEOUT_MS = 5000;\n\n/** What the caller hears when embeddings were not asked for. @internal */\nexport const ATLAS_ONLY_NOTE = 'Embeddings were not requested. This is the atlas search.';\n\n/** What the caller hears when an embedding order was computed and then not accepted. @internal */\nexport const PROPOSAL_NOTE =\n 'The embedding order is a proposal, not evidence and not an acceptance. The atlas search accepted a separate order. Cosine similarity does not enter that score.';\n\nconst REASON_TEXT = {\n 'process-not-there': 'the process is not there',\n 'model-not-there': 'the model is not there',\n 'server-error': 'the server answered an error status',\n 'reply-not-a-vector':\n 'the reply is not a vector, or its length is not the length stored in the frozen file',\n 'call-did-not-finish': 'the call does not finish',\n} as const;\n\n/** Why an embedding request fell back to the atlas search. @internal */\nexport type EmbeddingFallbackReason = keyof typeof REASON_TEXT;\n\n/** An embedding request that cannot be used. The atlas search still answers. @internal */\nexport class EmbeddingUnavailable extends Error {\n readonly reason: EmbeddingFallbackReason;\n constructor(reason: EmbeddingFallbackReason, detail?: string) {\n super(detail === undefined ? REASON_TEXT[reason] : `${REASON_TEXT[reason]} (${detail})`);\n this.name = 'EmbeddingUnavailable';\n this.reason = reason;\n }\n}\n\n/** One vector per string, every vector the same length. @internal */\nexport type Embedder = (texts: readonly string[]) => Promise<readonly (readonly number[])[]>;\n\n/** `Instruct: …` newline `Query: …`, the registered query form. @internal */\nexport function queryInput(claim: string): string {\n return `Instruct: ${EMBEDDING_INSTRUCTION}\\nQuery: ${claim}`;\n}\n\n/**\n * A pure function of the text. The same text is the same vector.\n * `v = [sum of char codes, sum of (index+1) times char code]`.\n * @internal\n */\nexport function stubVector(text: string): readonly number[] {\n let sum = 0;\n let weighted = 0;\n for (let i = 0; i < text.length; i++) {\n const code = text.charCodeAt(i);\n sum += code;\n weighted += (i + 1) * code;\n }\n return [sum, weighted];\n}\n\n/** The stub embedder. It does not open a socket. @internal */\nexport const stubEmbedder: Embedder = async (texts) => texts.map((text) => stubVector(text));\n\n/** Cosine similarity. Unequal lengths are not a similarity. @internal */\nexport function cosine(a: ArrayLike<number>, b: ArrayLike<number>): number {\n if (a.length !== b.length) {\n throw new EmbeddingUnavailable('reply-not-a-vector');\n }\n let dot = 0;\n let na = 0;\n let nb = 0;\n for (let i = 0; i < a.length; i++) {\n const x = a[i]!;\n const y = b[i]!;\n dot += x * y;\n na += x * x;\n nb += y * y;\n }\n if (na === 0 || nb === 0) return 0;\n return dot / Math.sqrt(na * nb);\n}\n\n/**\n * Best cosine first. A tie breaks by record id, so the order does not depend\n * on which vector was computed last.\n * @internal\n */\nexport function rankByCosine(\n query: ArrayLike<number>,\n records: readonly { readonly id: string; readonly vector: ArrayLike<number> }[],\n): string[] {\n return records\n .map((r) => ({ id: r.id, s: cosine(query, r.vector) }))\n .sort((a, b) => (b.s !== a.s ? b.s - a.s : a.id < b.id ? -1 : a.id > b.id ? 1 : 0))\n .map((x) => x.id);\n}\n\n/** Decode a little-endian float32 vector stored as base64, the frozen file's encoding. @internal */\nexport function decodeFloat32(encoded: string): Float32Array {\n const bytes = Buffer.from(encoded, 'base64');\n if (bytes.byteLength === 0 || bytes.byteLength % 4 !== 0) {\n throw new EmbeddingUnavailable('reply-not-a-vector');\n }\n return new Float32Array(bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength));\n}\n\n/** The live canonical registry as retrieval records. Text is the name and the latex. @internal */\nexport function canonicalRetrievalCorpus(): CorpusRecord[] {\n return CANONICAL_EQUATIONS.map((equation) => ({\n id: equation.id,\n text: `${equation.name}. ${equation.formula_latex}`,\n ...(equation.scalarAst === undefined ? {} : { expr: equation.scalarAst }),\n }));\n}\n\n/** Where an Ollama embedder reaches the server, which model it asks for, and the vector width it expects. @internal */\nexport interface OllamaEmbedderOptions {\n readonly baseUrl: string;\n readonly model?: string;\n readonly expectedDims?: number;\n readonly timeoutMs?: number;\n readonly fetchImpl?: (url: string, init?: RequestInit) => Promise<Response>;\n}\n\n/** A local Ollama embedder. Off unless a caller constructs it. @internal */\nexport function ollamaEmbedder(options: OllamaEmbedderOptions): Embedder {\n const model = options.model ?? OLLAMA_EMBEDDING_MODEL;\n const expectedDims = options.expectedDims ?? FROZEN_VECTOR_DIMS;\n const timeoutMs = options.timeoutMs ?? OLLAMA_TIMEOUT_MS;\n const fetchImpl = options.fetchImpl ?? fetch;\n const base = options.baseUrl.replace(/\\/$/, '');\n return async (texts) => {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n let response: Response;\n try {\n response = await fetchImpl(`${base}/api/embed`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ model, input: [...texts] }),\n signal: controller.signal,\n });\n } catch {\n if (controller.signal.aborted) throw new EmbeddingUnavailable('call-did-not-finish');\n throw new EmbeddingUnavailable('process-not-there');\n }\n // Ollama answers an unknown model with 404; the status is the signal, not the body's text.\n if (response.status === 404) throw new EmbeddingUnavailable('model-not-there');\n // Any other error status is the server refusing the call: not an absent\n // model, and not a reply whose shape was read and found wanting.\n if (!response.ok) throw new EmbeddingUnavailable('server-error', `status ${response.status}`);\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n throw new EmbeddingUnavailable('reply-not-a-vector');\n }\n const embeddings = (body as { embeddings?: unknown }).embeddings;\n if (!Array.isArray(embeddings) || embeddings.length !== texts.length) {\n throw new EmbeddingUnavailable('reply-not-a-vector');\n }\n const vectors: number[][] = [];\n for (const row of embeddings) {\n if (!Array.isArray(row) || row.length !== expectedDims || row.some((x) => typeof x !== 'number' || !Number.isFinite(x))) {\n throw new EmbeddingUnavailable('reply-not-a-vector');\n }\n vectors.push(row);\n }\n return vectors;\n } finally {\n clearTimeout(timer);\n }\n };\n}\n\n/** Both orders, kept apart. `accepted` is always `rankByStructure`. @internal */\nexport interface HybridRetrieval {\n readonly embeddings: 'not-requested' | 'used' | 'fallback';\n readonly fallback: EmbeddingFallbackReason | null;\n readonly proposals: readonly string[] | null;\n readonly accepted: readonly string[];\n readonly note: string;\n}\n\nfunction noteFor(base: string, query: RetrievalQuery): string {\n if (query.expr !== undefined) return base;\n return `${base} The claim has no expression, so nothing is accepted: the atlas search ranks by structure, and a text claim has none to rank.`;\n}\n\n/** The atlas acceptance: by structure when the query has an expression; nothing for a text claim. */\nfunction acceptedFor(query: RetrievalQuery, corpus: readonly CorpusRecord[]): readonly string[] {\n return query.expr === undefined ? [] : rankByStructure(query, corpus);\n}\n\nfunction fallbackResult(query: RetrievalQuery, accepted: readonly string[], reason: EmbeddingFallbackReason): HybridRetrieval {\n return {\n embeddings: 'fallback',\n fallback: reason,\n proposals: null,\n accepted,\n note: noteFor(`Embeddings were requested, but they could not be used: ${REASON_TEXT[reason]}. This is the atlas search.`, query),\n };\n}\n\n/**\n * Atlas search, optionally after an embedding proposal. A fallback is the\n * atlas answer plus a named reason. It does not throw.\n * @internal\n */\nexport async function retrieveHybrid(args: {\n readonly query: RetrievalQuery;\n readonly corpus: readonly CorpusRecord[];\n readonly embeddings?: boolean;\n readonly embedder?: Embedder;\n}): Promise<HybridRetrieval> {\n const accepted = acceptedFor(args.query, args.corpus);\n if (args.embeddings !== true) {\n return {\n embeddings: 'not-requested',\n fallback: null,\n proposals: null,\n accepted,\n note: noteFor(ATLAS_ONLY_NOTE, args.query),\n };\n }\n if (args.embedder === undefined) {\n return fallbackResult(args.query, accepted, 'process-not-there');\n }\n const inputs = [queryInput(args.query.text), ...args.corpus.map((record) => record.text)];\n let vectors: readonly (readonly number[])[];\n try {\n vectors = await args.embedder(inputs);\n } catch (error) {\n if (error instanceof EmbeddingUnavailable) return fallbackResult(args.query, accepted, error.reason);\n throw error;\n }\n if (vectors.length !== inputs.length) return fallbackResult(args.query, accepted, 'reply-not-a-vector');\n try {\n const proposals = rankByCosine(\n vectors[0]!,\n args.corpus.map((record, index) => ({ id: record.id, vector: vectors[index + 1]! })),\n );\n return {\n embeddings: 'used',\n fallback: null,\n proposals,\n accepted,\n note: noteFor(PROPOSAL_NOTE, args.query),\n };\n } catch (error) {\n if (error instanceof EmbeddingUnavailable) return fallbackResult(args.query, accepted, error.reason);\n throw error;\n }\n}\n"]}
1
+ {"version":3,"file":"hybrid-retrieval.js","sourceRoot":"","sources":["../../../src/atlas/benchmark/hybrid-retrieval.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Optional embedding retrieval. An embedder proposes an order. `rankByStructure`\n * decides what is accepted. Cosine similarity does not enter that score.\n *\n * The Ollama implementation speaks HTTP to a local process. Nothing here\n * imports an embedding library, and nothing calls out of process unless a\n * caller asks for embeddings and supplies that implementation.\n *\n * The query form is the one registered in pre-registration Amendment 11.\n * Corpus records are embedded as their text, with no instruction prefix.\n *\n * @module atlas/benchmark/hybrid-retrieval\n * @internal\n */\n\nimport { pairwiseDot } from '@danielsimonjr/mathts-core';\nimport { compareCodepoint } from '../../core/compare.js';\nimport { CANONICAL_EQUATIONS } from '../../canonical/registry.js';\nimport { rankByStructure, type CorpusRecord, type RetrievalQuery } from './baselines.js';\n\n/** The instruction line registered with the embedding condition. @internal */\nexport const EMBEDDING_INSTRUCTION =\n 'Given a physics claim, retrieve the established physical relation that the claim restates or misuses';\n\n/** qwen3-embedding:4b, the model the design names. The package does not install it. @internal */\nexport const OLLAMA_EMBEDDING_MODEL = 'qwen3-embedding:4b';\n\n/**\n * Length stored in the frozen vector file\n * `docs/research/criterion3/embeddings/qwen3-embedding-4b.json`.\n * A live reply of another length is not that file's vector.\n * @internal\n */\nexport const FROZEN_VECTOR_DIMS = 2560;\n\n/** SHA-256 of that frozen file, as registered in Amendment 11. @internal */\nexport const FROZEN_VECTOR_SHA256 = '8fd79d2c6aaaf95c67f9a29ceb5fe4b88b42970c8e514d98c72c00a2c519cbdc';\n\n/**\n * How long a local Ollama call may run before it counts as not finishing.\n * The design names that outcome and does not name a duration.\n * @internal\n */\nexport const OLLAMA_TIMEOUT_MS = 5000;\n\n/** What the caller hears when embeddings were not asked for. @internal */\nexport const ATLAS_ONLY_NOTE = 'Embeddings were not requested. This is the atlas search.';\n\n/** What the caller hears when an embedding order was computed and then not accepted. @internal */\nexport const PROPOSAL_NOTE =\n 'The embedding order is a proposal, not evidence and not an acceptance. The atlas search accepted a separate order. Cosine similarity does not enter that score.';\n\nconst REASON_TEXT = {\n 'process-not-there': 'the process is not there',\n 'model-not-there': 'the model is not there',\n 'server-error': 'the server answered an error status',\n 'reply-not-a-vector':\n 'the reply is not a vector, or its length is not the length stored in the frozen file',\n 'call-did-not-finish': 'the call does not finish',\n} as const;\n\n/** Why an embedding request fell back to the atlas search. @internal */\nexport type EmbeddingFallbackReason = keyof typeof REASON_TEXT;\n\n/** An embedding request that cannot be used. The atlas search still answers. @internal */\nexport class EmbeddingUnavailable extends Error {\n readonly reason: EmbeddingFallbackReason;\n constructor(reason: EmbeddingFallbackReason, detail?: string) {\n super(detail === undefined ? REASON_TEXT[reason] : `${REASON_TEXT[reason]} (${detail})`);\n this.name = 'EmbeddingUnavailable';\n this.reason = reason;\n }\n}\n\n/** One vector per string, every vector the same length. @internal */\nexport type Embedder = (texts: readonly string[]) => Promise<readonly (readonly number[])[]>;\n\n/** `Instruct: …` newline `Query: …`, the registered query form. @internal */\nexport function queryInput(claim: string): string {\n return `Instruct: ${EMBEDDING_INSTRUCTION}\\nQuery: ${claim}`;\n}\n\n/**\n * A pure function of the text. The same text is the same vector.\n * `v = [sum of char codes, sum of (index+1) times char code]`.\n * @internal\n */\nexport function stubVector(text: string): readonly number[] {\n let sum = 0;\n let weighted = 0;\n for (let i = 0; i < text.length; i++) {\n const code = text.charCodeAt(i);\n sum += code;\n weighted += (i + 1) * code;\n }\n return [sum, weighted];\n}\n\n/** The stub embedder. It does not open a socket. @internal */\nexport const stubEmbedder: Embedder = async (texts) => texts.map((text) => stubVector(text));\n\n/**\n * Cosine similarity, from MathTS core's `pairwiseDot` (pairwise summation over\n * any `ArrayLike<number>`, the frozen `Float32Array` vectors included; the\n * typed `dot` of the functions package takes a plain array or a `Float64Array`\n * only, and routes the latter to an async path). The norms are the same dot\n * product, so a vector against itself is exactly 1 (`√(x·x) = x`).\n * Unequal lengths are not a similarity.\n * @internal\n */\nexport function cosine(a: ArrayLike<number>, b: ArrayLike<number>): number {\n if (a.length !== b.length) {\n throw new EmbeddingUnavailable('reply-not-a-vector');\n }\n const na = pairwiseDot(a, a);\n const nb = pairwiseDot(b, b);\n if (na === 0 || nb === 0) return 0;\n return pairwiseDot(a, b) / Math.sqrt(na * nb);\n}\n\n/**\n * Best cosine first. A tie breaks by record id, so the order does not depend\n * on which vector was computed last.\n * @internal\n */\nexport function rankByCosine(\n query: ArrayLike<number>,\n records: readonly { readonly id: string; readonly vector: ArrayLike<number> }[],\n): string[] {\n return records\n .map((r) => ({ id: r.id, s: cosine(query, r.vector) }))\n .sort((a, b) => (b.s !== a.s ? b.s - a.s : compareCodepoint(a.id, b.id)))\n .map((x) => x.id);\n}\n\n/** Decode a little-endian float32 vector stored as base64, the frozen file's encoding. @internal */\nexport function decodeFloat32(encoded: string): Float32Array {\n const bytes = Buffer.from(encoded, 'base64');\n if (bytes.byteLength === 0 || bytes.byteLength % 4 !== 0) {\n throw new EmbeddingUnavailable('reply-not-a-vector');\n }\n return new Float32Array(bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength));\n}\n\n/** The live canonical registry as retrieval records. Text is the name and the latex. @internal */\nexport function canonicalRetrievalCorpus(): CorpusRecord[] {\n return CANONICAL_EQUATIONS.map((equation) => ({\n id: equation.id,\n text: `${equation.name}. ${equation.formula_latex}`,\n ...(equation.scalarAst === undefined ? {} : { expr: equation.scalarAst }),\n }));\n}\n\n/** Where an Ollama embedder reaches the server, which model it asks for, and the vector width it expects. @internal */\nexport interface OllamaEmbedderOptions {\n readonly baseUrl: string;\n readonly model?: string;\n readonly expectedDims?: number;\n readonly timeoutMs?: number;\n readonly fetchImpl?: (url: string, init?: RequestInit) => Promise<Response>;\n}\n\n/** A local Ollama embedder. Off unless a caller constructs it. @internal */\nexport function ollamaEmbedder(options: OllamaEmbedderOptions): Embedder {\n const model = options.model ?? OLLAMA_EMBEDDING_MODEL;\n const expectedDims = options.expectedDims ?? FROZEN_VECTOR_DIMS;\n const timeoutMs = options.timeoutMs ?? OLLAMA_TIMEOUT_MS;\n const fetchImpl = options.fetchImpl ?? fetch;\n const base = options.baseUrl.replace(/\\/$/, '');\n return async (texts) => {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n let response: Response;\n try {\n response = await fetchImpl(`${base}/api/embed`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ model, input: [...texts] }),\n signal: controller.signal,\n });\n } catch {\n if (controller.signal.aborted) throw new EmbeddingUnavailable('call-did-not-finish');\n throw new EmbeddingUnavailable('process-not-there');\n }\n // Ollama answers an unknown model with 404; the status is the signal, not the body's text.\n if (response.status === 404) throw new EmbeddingUnavailable('model-not-there');\n // Any other error status is the server refusing the call: not an absent\n // model, and not a reply whose shape was read and found wanting.\n if (!response.ok) throw new EmbeddingUnavailable('server-error', `status ${response.status}`);\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n throw new EmbeddingUnavailable('reply-not-a-vector');\n }\n const embeddings = (body as { embeddings?: unknown }).embeddings;\n if (!Array.isArray(embeddings) || embeddings.length !== texts.length) {\n throw new EmbeddingUnavailable('reply-not-a-vector');\n }\n const vectors: number[][] = [];\n for (const row of embeddings) {\n if (!Array.isArray(row) || row.length !== expectedDims || row.some((x) => typeof x !== 'number' || !Number.isFinite(x))) {\n throw new EmbeddingUnavailable('reply-not-a-vector');\n }\n vectors.push(row);\n }\n return vectors;\n } finally {\n clearTimeout(timer);\n }\n };\n}\n\n/** Both orders, kept apart. `accepted` is always `rankByStructure`. @internal */\nexport interface HybridRetrieval {\n readonly embeddings: 'not-requested' | 'used' | 'fallback';\n readonly fallback: EmbeddingFallbackReason | null;\n readonly proposals: readonly string[] | null;\n readonly accepted: readonly string[];\n readonly note: string;\n}\n\nfunction noteFor(base: string, query: RetrievalQuery): string {\n if (query.expr !== undefined) return base;\n return `${base} The claim has no expression, so nothing is accepted: the atlas search ranks by structure, and a text claim has none to rank.`;\n}\n\n/** The atlas acceptance: by structure when the query has an expression; nothing for a text claim. */\nfunction acceptedFor(query: RetrievalQuery, corpus: readonly CorpusRecord[]): readonly string[] {\n return query.expr === undefined ? [] : rankByStructure(query, corpus);\n}\n\nfunction fallbackResult(query: RetrievalQuery, accepted: readonly string[], reason: EmbeddingFallbackReason): HybridRetrieval {\n return {\n embeddings: 'fallback',\n fallback: reason,\n proposals: null,\n accepted,\n note: noteFor(`Embeddings were requested, but they could not be used: ${REASON_TEXT[reason]}. This is the atlas search.`, query),\n };\n}\n\n/**\n * Atlas search, optionally after an embedding proposal. A fallback is the\n * atlas answer plus a named reason. It does not throw.\n * @internal\n */\nexport async function retrieveHybrid(args: {\n readonly query: RetrievalQuery;\n readonly corpus: readonly CorpusRecord[];\n readonly embeddings?: boolean;\n readonly embedder?: Embedder;\n}): Promise<HybridRetrieval> {\n const accepted = acceptedFor(args.query, args.corpus);\n if (args.embeddings !== true) {\n return {\n embeddings: 'not-requested',\n fallback: null,\n proposals: null,\n accepted,\n note: noteFor(ATLAS_ONLY_NOTE, args.query),\n };\n }\n if (args.embedder === undefined) {\n return fallbackResult(args.query, accepted, 'process-not-there');\n }\n const inputs = [queryInput(args.query.text), ...args.corpus.map((record) => record.text)];\n let vectors: readonly (readonly number[])[];\n try {\n vectors = await args.embedder(inputs);\n } catch (error) {\n if (error instanceof EmbeddingUnavailable) return fallbackResult(args.query, accepted, error.reason);\n throw error;\n }\n if (vectors.length !== inputs.length) return fallbackResult(args.query, accepted, 'reply-not-a-vector');\n try {\n const proposals = rankByCosine(\n vectors[0]!,\n args.corpus.map((record, index) => ({ id: record.id, vector: vectors[index + 1]! })),\n );\n return {\n embeddings: 'used',\n fallback: null,\n proposals,\n accepted,\n note: noteFor(PROPOSAL_NOTE, args.query),\n };\n } catch (error) {\n if (error instanceof EmbeddingUnavailable) return fallbackResult(args.query, accepted, error.reason);\n throw error;\n }\n}\n"]}
@@ -16,7 +16,7 @@
16
16
  * @module atlas/benchmark/loader
17
17
  * @internal
18
18
  */
19
- import { readFileSync } from 'node:fs';
19
+ import { readJsonFile } from '../../core/data-file.js';
20
20
  import { join } from 'node:path';
21
21
  import { HELD_OUT_FAMILY } from './types.js';
22
22
  /**
@@ -69,7 +69,7 @@ export class BenchmarkAdmissionError extends Error {
69
69
  }
70
70
  }
71
71
  function readItems(file) {
72
- const parsed = JSON.parse(readFileSync(file, 'utf-8'));
72
+ const parsed = readJsonFile(file);
73
73
  if (!Array.isArray(parsed))
74
74
  throw new Error(`${file}: expected a JSON array of items`);
75
75
  return parsed;
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/atlas/benchmark/loader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Atlas Phase 5, S5.1 — load and validate benchmark items.\n *\n * Design note: `docs/planning/Atlas-Phase-5-Design.md` §0, §2.\n *\n * This module reads the PUBLIC half of a benchmark directory and nothing else.\n * The answers live in a sibling half that no `src/` file may read;\n * `tests/atlas/benchmark.test.ts` holds the import guard, with a positive\n * control proving the guard can fire.\n *\n * **The loader enforces the one part of the independence rule that code CAN\n * enforce: a frozen item whose `authorship` is not `'independent'` is refused.**\n * Whether the author really was independent is a fact about people, recorded in\n * the pre-registration note and checked by review.\n *\n * @module atlas/benchmark/loader\n * @internal\n */\n\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { HELD_OUT_FAMILY } from './types.js';\nimport type { BenchmarkItem } from './types.js';\n\n/** One reason an item set is not admissible. @internal */\nexport interface ItemProblem {\n readonly id: string;\n readonly problem: string;\n}\n\n/**\n * Validate an item set against the schema and the rules that make it a benchmark.\n *\n * @param items - the items, as parsed.\n * @param frozen - true for the frozen set (authorship must be `'independent'`),\n * false for the contested staging area (authorship must be `'contested-draft'`).\n * @returns every problem found; empty means admissible. Never throws, so a\n * caller sees ALL problems at once rather than the first.\n * @internal\n */\nexport function validateItems(items: readonly BenchmarkItem[], frozen: boolean): ItemProblem[] {\n const problems: ItemProblem[] = [];\n const seen = new Set<string>();\n for (const item of items) {\n const p = (problem: string): void => {\n problems.push({ id: item.id, problem });\n };\n if (seen.has(item.id)) p('duplicate id');\n seen.add(item.id);\n\n const wanted = frozen ? 'independent' : 'contested-draft';\n if (item.authorship !== wanted) {\n p(`authorship '${item.authorship}' where the ${frozen ? 'frozen' : 'contested'} set requires '${wanted}'`);\n }\n // The answer lives in the scorer half. A public item that carries it would\n // hand the key to any condition that reads the public file.\n if ('kind' in item || 'failureKind' in item) {\n p('the public half carries the answer (kind/failureKind); it belongs in scorer/labels.json');\n }\n if ((item.family === HELD_OUT_FAMILY) !== (item.split === 'held-out')) {\n p(`the held-out split is exactly the '${HELD_OUT_FAMILY}' family; got family '${item.family}' in split '${item.split}'`);\n }\n if (item.premises.length === 0) p('no premises');\n if (item.source.trim() === '') p('no source');\n }\n return problems;\n}\n\n/** Thrown when a benchmark directory holds an inadmissible item set. @internal */\nexport class BenchmarkAdmissionError extends Error {\n constructor(readonly problems: readonly ItemProblem[]) {\n super(\n `benchmark items are not admissible: ${problems\n .map((p) => `${p.id}: ${p.problem}`)\n .join('; ')}`,\n );\n }\n}\n\nfunction readItems(file: string): BenchmarkItem[] {\n const parsed = JSON.parse(readFileSync(file, 'utf-8')) as unknown;\n if (!Array.isArray(parsed)) throw new Error(`${file}: expected a JSON array of items`);\n return parsed as BenchmarkItem[];\n}\n\n/**\n * Load the FROZEN items from `<benchmarkDir>/public/items.json`.\n *\n * @throws BenchmarkAdmissionError when any item is inadmissible — a frozen set\n * with one contested draft in it is not a smaller benchmark, it is a broken one.\n * @internal\n */\nexport function loadFrozenItems(benchmarkDir: string): BenchmarkItem[] {\n const items = readItems(join(benchmarkDir, 'public', 'items.json'));\n const problems = validateItems(items, true);\n if (problems.length > 0) throw new BenchmarkAdmissionError(problems);\n return items;\n}\n\n/**\n * Load the CONTESTED drafts from `<benchmarkDir>/contested/items.json`. These are\n * never scored; they wait for an independent author to accept or rewrite them.\n *\n * @internal\n */\nexport function loadContestedDrafts(benchmarkDir: string): BenchmarkItem[] {\n const items = readItems(join(benchmarkDir, 'contested', 'items.json'));\n const problems = validateItems(items, false);\n if (problems.length > 0) throw new BenchmarkAdmissionError(problems);\n return items;\n}\n"]}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/atlas/benchmark/loader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Atlas Phase 5, S5.1 — load and validate benchmark items.\n *\n * Design note: `docs/planning/Atlas-Phase-5-Design.md` §0, §2.\n *\n * This module reads the PUBLIC half of a benchmark directory and nothing else.\n * The answers live in a sibling half that no `src/` file may read;\n * `tests/atlas/benchmark.test.ts` holds the import guard, with a positive\n * control proving the guard can fire.\n *\n * **The loader enforces the one part of the independence rule that code CAN\n * enforce: a frozen item whose `authorship` is not `'independent'` is refused.**\n * Whether the author really was independent is a fact about people, recorded in\n * the pre-registration note and checked by review.\n *\n * @module atlas/benchmark/loader\n * @internal\n */\n\nimport { readJsonFile } from '../../core/data-file.js';\nimport { join } from 'node:path';\nimport { HELD_OUT_FAMILY } from './types.js';\nimport type { BenchmarkItem } from './types.js';\n\n/** One reason an item set is not admissible. @internal */\nexport interface ItemProblem {\n readonly id: string;\n readonly problem: string;\n}\n\n/**\n * Validate an item set against the schema and the rules that make it a benchmark.\n *\n * @param items - the items, as parsed.\n * @param frozen - true for the frozen set (authorship must be `'independent'`),\n * false for the contested staging area (authorship must be `'contested-draft'`).\n * @returns every problem found; empty means admissible. Never throws, so a\n * caller sees ALL problems at once rather than the first.\n * @internal\n */\nexport function validateItems(items: readonly BenchmarkItem[], frozen: boolean): ItemProblem[] {\n const problems: ItemProblem[] = [];\n const seen = new Set<string>();\n for (const item of items) {\n const p = (problem: string): void => {\n problems.push({ id: item.id, problem });\n };\n if (seen.has(item.id)) p('duplicate id');\n seen.add(item.id);\n\n const wanted = frozen ? 'independent' : 'contested-draft';\n if (item.authorship !== wanted) {\n p(`authorship '${item.authorship}' where the ${frozen ? 'frozen' : 'contested'} set requires '${wanted}'`);\n }\n // The answer lives in the scorer half. A public item that carries it would\n // hand the key to any condition that reads the public file.\n if ('kind' in item || 'failureKind' in item) {\n p('the public half carries the answer (kind/failureKind); it belongs in scorer/labels.json');\n }\n if ((item.family === HELD_OUT_FAMILY) !== (item.split === 'held-out')) {\n p(`the held-out split is exactly the '${HELD_OUT_FAMILY}' family; got family '${item.family}' in split '${item.split}'`);\n }\n if (item.premises.length === 0) p('no premises');\n if (item.source.trim() === '') p('no source');\n }\n return problems;\n}\n\n/** Thrown when a benchmark directory holds an inadmissible item set. @internal */\nexport class BenchmarkAdmissionError extends Error {\n constructor(readonly problems: readonly ItemProblem[]) {\n super(\n `benchmark items are not admissible: ${problems\n .map((p) => `${p.id}: ${p.problem}`)\n .join('; ')}`,\n );\n }\n}\n\nfunction readItems(file: string): BenchmarkItem[] {\n const parsed = readJsonFile(file);\n if (!Array.isArray(parsed)) throw new Error(`${file}: expected a JSON array of items`);\n return parsed as BenchmarkItem[];\n}\n\n/**\n * Load the FROZEN items from `<benchmarkDir>/public/items.json`.\n *\n * @throws BenchmarkAdmissionError when any item is inadmissible — a frozen set\n * with one contested draft in it is not a smaller benchmark, it is a broken one.\n * @internal\n */\nexport function loadFrozenItems(benchmarkDir: string): BenchmarkItem[] {\n const items = readItems(join(benchmarkDir, 'public', 'items.json'));\n const problems = validateItems(items, true);\n if (problems.length > 0) throw new BenchmarkAdmissionError(problems);\n return items;\n}\n\n/**\n * Load the CONTESTED drafts from `<benchmarkDir>/contested/items.json`. These are\n * never scored; they wait for an independent author to accept or rewrite them.\n *\n * @internal\n */\nexport function loadContestedDrafts(benchmarkDir: string): BenchmarkItem[] {\n const items = readItems(join(benchmarkDir, 'contested', 'items.json'));\n const problems = validateItems(items, false);\n if (problems.length > 0) throw new BenchmarkAdmissionError(problems);\n return items;\n}\n"]}
@@ -13,8 +13,8 @@
13
13
  * @module atlas/benchmark/stats
14
14
  * @internal
15
15
  */
16
- /** The two-sided 95% normal quantile. @internal */
17
- export declare const Z95 = 1.959963984540054;
16
+ /** The two-sided 95% normal quantile, MathTS `normalQuantile(0.975)` (1.959963984540054). @internal */
17
+ export declare const Z95: number;
18
18
  /** A closed interval. @internal */
19
19
  export interface Interval {
20
20
  readonly lower: number;
@@ -1 +1 @@
1
- {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/atlas/benchmark/stats.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,mDAAmD;AACnD,eAAO,MAAM,GAAG,oBAAoB,CAAC;AAErC,mCAAmC;AACnC,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,SAAM,GAAG,QAAQ,CAgB9E;AAED,wGAAwG;AACxG,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wDAAwD;AACxD,MAAM,WAAW,aAAa;IAC5B,qIAAqI;IACrI,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,yEAAyE;IACzE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AASD;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,aAAa,CAQzD;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,SAAM,GAAG,QAAQ,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAuB1G;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,CAsB1E;AAED,0EAA0E;AAC1E,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,kEAAkE;IAClE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,6FAA6F;IAC7F,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,SAAM,GAAG,WAAW,CAgBjF"}
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/atlas/benchmark/stats.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,uGAAuG;AACvG,eAAO,MAAM,GAAG,EAAE,MAA8B,CAAC;AAEjD,mCAAmC;AACnC,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,SAAM,GAAG,QAAQ,CAgB9E;AAED,wGAAwG;AACxG,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wDAAwD;AACxD,MAAM,WAAW,aAAa;IAC5B,qIAAqI;IACrI,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,yEAAyE;IACzE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,aAAa,CAQzD;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,SAAM,GAAG,QAAQ,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAuB1G;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,CAsB1E;AAED,0EAA0E;AAC1E,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,kEAAkE;IAClE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,6FAA6F;IAC7F,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,SAAM,GAAG,WAAW,CAgBjF"}