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
@@ -10,13 +10,14 @@ export declare function isGapKind(s: string): s is FrontierGapKind;
10
10
  /** Residual / unexplained-observation gap template. @internal */
11
11
  export declare function makeResidualGap(id: string, summary: string, kind?: FrontierGapKind): FrontierGap;
12
12
  /**
13
- * A JSON file that is not a search-problem file: a field it must carry is missing or holds a
14
- * value of another kind. The message names the field; it never reports what a JavaScript engine
15
- * said on reading it. @internal
13
+ * A JSON file that is not a search-problem file, or not an expression file: a field it must carry
14
+ * is missing or holds a value of another kind. The message names the field; it never reports what
15
+ * a JavaScript engine said on reading it. @internal
16
16
  */
17
17
  export declare class ProblemFileError extends Error {
18
18
  constructor(message: string);
19
19
  }
20
+ /** The JSON shape of a probe problem file, as read before validation. */
20
21
  export interface ProblemFile {
21
22
  readonly gap?: {
22
23
  readonly id?: string;
@@ -50,6 +51,9 @@ export declare function loadSearchProblemFromJson(path: string): SearchProblem;
50
51
  export declare function resolveObservationsPath(raw: Pick<ProblemFile, 'observationsPath'>, source?: string): string | null;
51
52
  /** Build a SearchProblem from an already-parsed problem file. @internal */
52
53
  export declare function searchProblemFromFile(raw: ProblemFile, source?: string): SearchProblem;
53
- /** Load an ExprNode from a JSON file (`{expression}` wrapper or bare node). @internal */
54
+ /**
55
+ * Load an ExprNode from a JSON file (`{expression}` wrapper or bare node). The node shape is
56
+ * checked recursively; a file that is not an expression raises {@link ProblemFileError}. @internal
57
+ */
54
58
  export declare function parseExprJson(path: string): ExprNode;
55
59
  //# sourceMappingURL=problem.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"problem.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/problem.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,EAEV,qBAAqB,EACrB,WAAW,EACX,eAAe,EAEf,aAAa,EACd,MAAM,YAAY,CAAC;AAIpB,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,eAAe,CAazD;AAED,iEAAiE;AACjE,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,eAA2C,GAChD,WAAW,CAuBb;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AA6BD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE;QACb,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,QAAQ,CAAC,SAAS,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/E,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,qBAAqB,CAAC;IAC7C,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC1C,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,qBAAqB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpD;AAED,yFAAyF;AACzF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAGrE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,EAAE,MAAM,SAAW,GAAG,MAAM,GAAG,IAAI,CAKpH;AAED,2EAA2E;AAC3E,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,SAAW,GAAG,aAAa,CA2DxF;AAiCD,yFAAyF;AACzF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAYpD"}
1
+ {"version":3,"file":"problem.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/problem.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,EAEV,qBAAqB,EACrB,WAAW,EACX,eAAe,EAEf,aAAa,EACd,MAAM,YAAY,CAAC;AAIpB,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,eAAe,CAazD;AAED,iEAAiE;AACjE,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,eAA2C,GAChD,WAAW,CAuBb;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAiCD,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE;QACb,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,QAAQ,CAAC,SAAS,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/E,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,qBAAqB,CAAC;IAC7C,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC1C,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,qBAAqB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpD;AAED,yFAAyF;AACzF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAGrE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,EAAE,MAAM,SAAW,GAAG,MAAM,GAAG,IAAI,CAKpH;AAED,2EAA2E;AAC3E,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,SAAW,GAAG,aAAa,CAiExF;AA+ID;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAOpD"}
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * @internal
5
5
  */
6
- import { readFileSync } from 'node:fs';
6
+ import { readJsonFile } from '../../core/data-file.js';
7
+ import { isPlainObject } from '../../core/json-schema.js';
7
8
  import { dirname, isAbsolute, resolve } from 'node:path';
8
9
  import { parseDimensionSpec } from '../../dimensional/dimension-spec.js';
9
10
  import { problemFromResidualGap } from './frontier.js';
@@ -47,9 +48,9 @@ export function makeResidualGap(id, summary, kind = 'unexplained-observation') {
47
48
  };
48
49
  }
49
50
  /**
50
- * A JSON file that is not a search-problem file: a field it must carry is missing or holds a
51
- * value of another kind. The message names the field; it never reports what a JavaScript engine
52
- * said on reading it. @internal
51
+ * A JSON file that is not a search-problem file, or not an expression file: a field it must carry
52
+ * is missing or holds a value of another kind. The message names the field; it never reports what
53
+ * a JavaScript engine said on reading it. @internal
53
54
  */
54
55
  export class ProblemFileError extends Error {
55
56
  constructor(message) {
@@ -57,6 +58,11 @@ export class ProblemFileError extends Error {
57
58
  this.name = 'ProblemFileError';
58
59
  }
59
60
  }
61
+ /** The `DiscrepancyKind` union as a runtime set, for a file's `discrepancy.kind`. */
62
+ const DISCREPANCY_KINDS = new Set([
63
+ 'additive', 'relative', 'log-ratio', 'standardized', 'likelihood',
64
+ 'vector', 'tensor', 'distributional', 'operator', 'custom',
65
+ ]);
60
66
  /** What a JSON value is, in the words a file author would use. */
61
67
  function kindOf(v) {
62
68
  if (v === null)
@@ -71,10 +77,9 @@ function kindOf(v) {
71
77
  return 'true or false';
72
78
  return typeof v === 'object' ? 'an object' : typeof v;
73
79
  }
74
- const isRecord = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
75
80
  /** A `{"name", "dim"}` variable, read from `raw` and located by `where` in any refusal. */
76
81
  function varFromJson(raw, where) {
77
- if (!isRecord(raw)) {
82
+ if (!isPlainObject(raw)) {
78
83
  throw new ProblemFileError(`${where} must be {"name": text, "dim": text} (found ${kindOf(raw)})`);
79
84
  }
80
85
  const { name, dim } = raw;
@@ -88,7 +93,7 @@ function varFromJson(raw, where) {
88
93
  }
89
94
  /** Load a SearchProblem from a JSON file (optionally with inline datasets). @internal */
90
95
  export function loadSearchProblemFromJson(path) {
91
- const raw = JSON.parse(readFileSync(path, 'utf8'));
96
+ const raw = readJsonFile(path);
92
97
  return searchProblemFromFile(raw, path);
93
98
  }
94
99
  /**
@@ -107,7 +112,7 @@ export function searchProblemFromFile(raw, source = 'inline') {
107
112
  // `ProblemFile` is what a well-formed file holds; a file read from disk is any JSON value, so
108
113
  // each field is checked here before it is read, and a refusal names the field.
109
114
  const file = raw;
110
- if (!isRecord(file)) {
115
+ if (!isPlainObject(file)) {
111
116
  throw new ProblemFileError(`the top level must be a JSON object with "target" and "governing" (found ${kindOf(file)})`);
112
117
  }
113
118
  if (file.target === undefined)
@@ -117,7 +122,7 @@ export function searchProblemFromFile(raw, source = 'inline') {
117
122
  if (!Array.isArray(file.governing)) {
118
123
  throw new ProblemFileError(`"governing" must be a list of {"name": text, "dim": text} (found ${kindOf(file.governing)})`);
119
124
  }
120
- if (file.gap !== undefined && !isRecord(file.gap)) {
125
+ if (file.gap !== undefined && !isPlainObject(file.gap)) {
121
126
  throw new ProblemFileError(`"gap" must be an object (found ${kindOf(file.gap)})`);
122
127
  }
123
128
  for (const field of ['id', 'kind', 'summary']) {
@@ -142,6 +147,9 @@ export function searchProblemFromFile(raw, source = 'inline') {
142
147
  const governing = raw.governing.map((g, i) => varFromJson(g, `governing[${i}]`));
143
148
  let exploratory;
144
149
  let holdout;
150
+ if (file.observationsPath !== undefined && typeof file.observationsPath !== 'string') {
151
+ throw new ProblemFileError(`"observationsPath" must be text (found ${kindOf(file.observationsPath)})`);
152
+ }
145
153
  const observationsPath = resolveObservationsPath(raw, source);
146
154
  if (observationsPath !== null) {
147
155
  const split = loadSplitDatasetsFromJson(observationsPath);
@@ -155,57 +163,177 @@ export function searchProblemFromFile(raw, source = 'inline') {
155
163
  holdout = asDatasetSafe(raw.holdout, `${source}#holdout`, 'validation-holdout');
156
164
  }
157
165
  const problem = problemFromResidualGap(gap, target, governing, exploratory, holdout);
166
+ // The secondary fields. Each was once passed through unread, so `limits: 5` or
167
+ // `assumptions: "x"` reached `runProbeSearch` and threw a raw TypeError there.
158
168
  return {
159
169
  ...problem,
160
- baseline: raw.baseline,
161
- discrepancy: raw.discrepancy ?? problem.discrepancy,
162
- assumptions: raw.assumptions ?? gap.assumptions,
163
- limits: raw.limits,
164
- claimedRegimes: raw.claimedRegimes,
165
- observationalBoundIds: raw.observationalBoundIds,
170
+ baseline: file.baseline === undefined ? undefined : assertExprNode(file.baseline, '"baseline"'),
171
+ discrepancy: file.discrepancy === undefined ? problem.discrepancy : discrepancyFromJson(file.discrepancy),
172
+ assumptions: file.assumptions === undefined ? gap.assumptions : textList(file.assumptions, 'assumptions'),
173
+ limits: file.limits === undefined ? undefined : limitsFromJson(file.limits),
174
+ claimedRegimes: file.claimedRegimes === undefined ? undefined : textRecord(file.claimedRegimes, 'claimedRegimes'),
175
+ observationalBoundIds: file.observationalBoundIds === undefined ? undefined : textList(file.observationalBoundIds, 'observationalBoundIds'),
166
176
  };
167
177
  }
168
- function assertMinimalExprNode(raw, path) {
169
- if (!raw || typeof raw !== 'object' || !('kind' in raw)) {
170
- throw new Error(`${path} is not an ExprNode JSON object`);
171
- }
172
- const node = raw;
173
- if (node.kind === 'symbol') {
174
- const sym = raw;
175
- if (typeof sym.name !== 'string' || sym.name.length === 0) {
176
- throw new Error(`${path} symbol node missing name`);
178
+ /** A list of text, located by its field name. */
179
+ function textList(raw, field) {
180
+ const label = field.includes('.') ? field : `"${field}"`;
181
+ if (!Array.isArray(raw))
182
+ throw new ProblemFileError(`${label} must be a list of text (found ${kindOf(raw)})`);
183
+ return raw.map((v, i) => {
184
+ if (typeof v !== 'string')
185
+ throw new ProblemFileError(`${field}[${i}] must be text (found ${kindOf(v)})`);
186
+ return v;
187
+ });
188
+ }
189
+ /** A `{name: text}` object, located by its field name. */
190
+ function textRecord(raw, field) {
191
+ if (!isPlainObject(raw))
192
+ throw new ProblemFileError(`"${field}" must be {name: text} (found ${kindOf(raw)})`);
193
+ const out = {};
194
+ for (const [k, v] of Object.entries(raw)) {
195
+ if (typeof v !== 'string')
196
+ throw new ProblemFileError(`${field}.${k} must be text (found ${kindOf(v)})`);
197
+ out[k] = v;
198
+ }
199
+ return out;
200
+ }
201
+ function discrepancyFromJson(raw) {
202
+ if (!isPlainObject(raw))
203
+ throw new ProblemFileError(`"discrepancy" must be {"kind": text, "observableIds": [text]} (found ${kindOf(raw)})`);
204
+ if (typeof raw.kind !== 'string' || !DISCREPANCY_KINDS.has(raw.kind)) {
205
+ throw new ProblemFileError(`discrepancy.kind '${String(raw.kind)}' is not a discrepancy kind (${[...DISCREPANCY_KINDS].join(', ')})`);
206
+ }
207
+ const observableIds = textList(raw.observableIds, 'discrepancy.observableIds');
208
+ for (const key of ['covarianceRef', 'implementationRef']) {
209
+ if (raw[key] !== undefined && typeof raw[key] !== 'string') {
210
+ throw new ProblemFileError(`discrepancy.${key} must be text (found ${kindOf(raw[key])})`);
177
211
  }
178
- if (!sym.dim || typeof sym.dim !== 'object') {
179
- throw new Error(`${path} symbol node missing dim`);
212
+ }
213
+ return {
214
+ kind: raw.kind,
215
+ observableIds,
216
+ ...(typeof raw.covarianceRef === 'string' ? { covarianceRef: raw.covarianceRef } : {}),
217
+ ...(typeof raw.implementationRef === 'string' ? { implementationRef: raw.implementationRef } : {}),
218
+ };
219
+ }
220
+ function limitsFromJson(raw) {
221
+ const shape = '{"id": text, "regime": {name: text}}';
222
+ if (!Array.isArray(raw))
223
+ throw new ProblemFileError(`"limits" must be a list of ${shape} (found ${kindOf(raw)})`);
224
+ return raw.map((l, i) => {
225
+ if (!isPlainObject(l))
226
+ throw new ProblemFileError(`limits[${i}] must be ${shape} (found ${kindOf(l)})`);
227
+ if (typeof l.id !== 'string' || l.id === '')
228
+ throw new ProblemFileError(`limits[${i}].id must be text`);
229
+ if (!isPlainObject(l.regime))
230
+ throw new ProblemFileError(`limits[${i}].regime must be {name: text} (found ${kindOf(l.regime)})`);
231
+ const regime = textRecord(l.regime, `limits[${i}].regime`);
232
+ if (l.description !== undefined && typeof l.description !== 'string') {
233
+ throw new ProblemFileError(`limits[${i}].description must be text (found ${kindOf(l.description)})`);
180
234
  }
181
- return raw;
235
+ return { id: l.id, regime, ...(typeof l.description === 'string' ? { description: l.description } : {}) };
236
+ });
237
+ }
238
+ /** The scalar operators an `op` node may carry. */
239
+ const SCALAR_OPS = new Set(['+', '-', '*', '/', '^']);
240
+ /** The `TranscendentalFn` union as a runtime set. */
241
+ const TRANSCENDENTAL_FNS = new Set(['exp', 'ln', 'log2', 'log10', 'sin', 'cos', 'tan', 'sinh', 'cosh', 'tanh']);
242
+ /** A decimal literal, as the validator reads a numeric-literal symbol. */
243
+ const DECIMAL_LITERAL = /^[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?$/;
244
+ const DIM_KEYS = ['L', 'M', 'T', 'I', 'Theta', 'N', 'J'];
245
+ const SCALAR_KINDS = 'symbol, op, integral, derivative, dirac-delta, variational-derivative, transcendental, abs';
246
+ /** `raw[field]` as a child node, or a refusal that names the field. */
247
+ function child(raw, field, path, what) {
248
+ if (raw[field] === undefined)
249
+ throw new ProblemFileError(`${path} ${what} node needs ${field === 'args' ? '' : 'an '}"${field}" node`);
250
+ return assertExprNode(raw[field], `${path}#${field}`);
251
+ }
252
+ /**
253
+ * Check that a JSON value has the shape of a scalar `ExprNode`, recursively:
254
+ * a kind per node, the children each kind owns, a finite literal where a
255
+ * symbol's name is a decimal literal, and the seven dimension exponents on a
256
+ * symbol. A tensor kind is refused here: the probe evaluates scalars.
257
+ * Refusals are {@link ProblemFileError}, located by `path`.
258
+ */
259
+ function assertExprNode(raw, path) {
260
+ if (!isPlainObject(raw) || !('kind' in raw)) {
261
+ throw new ProblemFileError(`${path} is not an ExprNode JSON object (found ${kindOf(raw)})`);
182
262
  }
183
- if (node.kind === 'op') {
184
- const op = raw;
185
- if (typeof op.op !== 'string' || !Array.isArray(op.args)) {
186
- throw new Error(`${path} op node missing op/args`);
263
+ const kind = raw.kind;
264
+ if (typeof kind !== 'string' || kind.length === 0) {
265
+ throw new ProblemFileError(`${path} has invalid kind (found ${kindOf(kind)})`);
266
+ }
267
+ switch (kind) {
268
+ case 'symbol': {
269
+ if (typeof raw.name !== 'string' || raw.name.length === 0) {
270
+ throw new ProblemFileError(`${path} symbol node missing name (needs "name": text)`);
271
+ }
272
+ if (!isPlainObject(raw.dim))
273
+ throw new ProblemFileError(`${path} symbol node missing dim`);
274
+ for (const k of DIM_KEYS) {
275
+ if (!(k in raw.dim))
276
+ throw new ProblemFileError(`${path} symbol node dim needs the exponents ${DIM_KEYS.join(', ')}`);
277
+ if (typeof raw.dim[k] !== 'number' || !Number.isFinite(raw.dim[k])) {
278
+ throw new ProblemFileError(`${path} symbol node dim.${k} must be a finite number (found ${kindOf(raw.dim[k])})`);
279
+ }
280
+ }
281
+ if (DECIMAL_LITERAL.test(raw.name) && !Number.isFinite(Number(raw.name))) {
282
+ throw new ProblemFileError(`${path} literal '${raw.name}' is not a finite number`);
283
+ }
284
+ return raw;
187
285
  }
188
- for (let i = 0; i < op.args.length; i++) {
189
- assertMinimalExprNode(op.args[i], `${path}#args[${i}]`);
286
+ case 'op': {
287
+ if (typeof raw.op !== 'string' || !Array.isArray(raw.args)) {
288
+ throw new ProblemFileError(`${path} op node needs "op" and an "args" list (op node missing op/args)`);
289
+ }
290
+ if (!SCALAR_OPS.has(raw.op))
291
+ throw new ProblemFileError(`${path} op node has op '${raw.op}', not one of + - * / ^`);
292
+ raw.args.forEach((a, i) => assertExprNode(a, `${path}#args[${i}]`));
293
+ return raw;
190
294
  }
191
- return raw;
192
- }
193
- if (typeof node.kind !== 'string' || node.kind.length === 0) {
194
- throw new Error(`${path} has invalid kind`);
295
+ case 'integral': {
296
+ child(raw, 'over', path, 'integral');
297
+ child(raw, 'integrand', path, 'integral');
298
+ for (const bound of ['lower', 'upper'])
299
+ if (raw[bound] !== undefined)
300
+ assertExprNode(raw[bound], `${path}#${bound}`);
301
+ return raw;
302
+ }
303
+ case 'derivative':
304
+ child(raw, 'of', path, 'derivative');
305
+ child(raw, 'wrt', path, 'derivative');
306
+ return raw;
307
+ case 'dirac-delta':
308
+ case 'abs':
309
+ child(raw, 'arg', path, kind);
310
+ return raw;
311
+ case 'variational-derivative':
312
+ for (const f of ['functional', 'field', 'over'])
313
+ child(raw, f, path, kind);
314
+ return raw;
315
+ case 'transcendental': {
316
+ if (typeof raw.fn !== 'string' || !TRANSCENDENTAL_FNS.has(raw.fn)) {
317
+ throw new ProblemFileError(`${path} transcendental node has fn '${String(raw.fn)}', not one of ${[...TRANSCENDENTAL_FNS].join(', ')}`);
318
+ }
319
+ child(raw, 'arg', path, kind);
320
+ return raw;
321
+ }
322
+ default:
323
+ throw new ProblemFileError(`${path} has kind '${kind}', which is not a scalar expression node (${SCALAR_KINDS})`);
195
324
  }
196
- return raw;
197
325
  }
198
- /** Load an ExprNode from a JSON file (`{expression}` wrapper or bare node). @internal */
326
+ /**
327
+ * Load an ExprNode from a JSON file (`{expression}` wrapper or bare node). The node shape is
328
+ * checked recursively; a file that is not an expression raises {@link ProblemFileError}. @internal
329
+ */
199
330
  export function parseExprJson(path) {
200
- const raw = JSON.parse(readFileSync(path, 'utf8'));
201
- if (raw && typeof raw === 'object' && 'kind' in raw)
202
- return assertMinimalExprNode(raw, path);
203
- if (raw &&
204
- typeof raw === 'object' &&
205
- 'expression' in raw &&
206
- raw.expression) {
207
- return assertMinimalExprNode(raw.expression, path);
208
- }
209
- throw new Error(`${path} is not an ExprNode JSON object`);
331
+ const raw = readJsonFile(path);
332
+ if (isPlainObject(raw) && 'kind' in raw)
333
+ return assertExprNode(raw, path);
334
+ if (isPlainObject(raw) && 'expression' in raw && raw.expression) {
335
+ return assertExprNode(raw.expression, path);
336
+ }
337
+ throw new ProblemFileError(`${path} is not an ExprNode JSON object`);
210
338
  }
211
339
  //# sourceMappingURL=problem.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"problem.js","sourceRoot":"","sources":["../../../src/composition/probe/problem.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Search-problem construction and JSON loading for Product B.\n *\n * @internal\n */\n\nimport { readFileSync } from 'node:fs';\nimport { dirname, isAbsolute, resolve } from 'node:path';\nimport { parseDimensionSpec } from '../../dimensional/dimension-spec.js';\nimport type { ExprNode } from '../../dimensional/ast-types.js';\nimport type {\n DimensionalVariableRef,\n DiscrepancyDefinition,\n FrontierGap,\n FrontierGapKind,\n ProbeDataset,\n SearchProblem,\n} from './types.js';\nimport { problemFromResidualGap } from './frontier.js';\nimport { asDatasetSafe, loadSplitDatasetsFromJson } from './dataset.js';\n\n/** Return whether a string names a supported frontier-gap kind for probe problems. @internal */\nexport function isGapKind(s: string): s is FrontierGapKind {\n return (\n s === 'prediction-residual' ||\n s === 'relation-link' ||\n s === 'regime-transition' ||\n s === 'parameter-tension' ||\n s === 'assumption-conflict' ||\n s === 'missing-operator' ||\n s === 'unexplained-observation' ||\n s === 'model-disagreement' ||\n s === 'causal-mechanism' ||\n s === 'other'\n );\n}\n\n/** Residual / unexplained-observation gap template. @internal */\nexport function makeResidualGap(\n id: string,\n summary: string,\n kind: FrontierGapKind = 'unexplained-observation',\n): FrontierGap {\n if (!id.startsWith('fg-')) {\n throw new RangeError(`makeResidualGap: id must start with 'fg-' (got '${id}')`);\n }\n if (kind === 'relation-link' || kind === 'regime-transition') {\n throw new RangeError(`makeResidualGap: ${kind} is Product A — use upt discover, not probe`);\n }\n return {\n id,\n kind,\n participants: [],\n observations: [],\n regimes: [],\n assumptions: [],\n constraints: [],\n evidence: { summary, sourceIds: [] },\n identifiability: {\n kind: 'parametric',\n parametric: { status: 'unknown', reasons: ['not yet assessed'] },\n },\n searchability: { searchable: true, reasons: ['residual gap'] },\n status: 'identified',\n };\n}\n\n/**\n * A JSON file that is not a search-problem file: a field it must carry is missing or holds a\n * value of another kind. The message names the field; it never reports what a JavaScript engine\n * said on reading it. @internal\n */\nexport class ProblemFileError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ProblemFileError';\n }\n}\n\n/** What a JSON value is, in the words a file author would use. */\nfunction kindOf(v: unknown): string {\n if (v === null) return 'null';\n if (Array.isArray(v)) return 'a list';\n if (typeof v === 'string') return 'text';\n if (typeof v === 'number') return 'a number';\n if (typeof v === 'boolean') return 'true or false';\n return typeof v === 'object' ? 'an object' : typeof v;\n}\n\nconst isRecord = (v: unknown): v is Record<string, unknown> => typeof v === 'object' && v !== null && !Array.isArray(v);\n\n/** A `{\"name\", \"dim\"}` variable, read from `raw` and located by `where` in any refusal. */\nfunction varFromJson(raw: unknown, where: string): DimensionalVariableRef {\n if (!isRecord(raw)) {\n throw new ProblemFileError(`${where} must be {\"name\": text, \"dim\": text} (found ${kindOf(raw)})`);\n }\n const { name, dim } = raw;\n if (typeof name !== 'string' || name === '') {\n throw new ProblemFileError(`${where} needs a \"name\" (text)${name === undefined ? '' : `, found ${kindOf(name)}`}`);\n }\n if (typeof dim !== 'string' || dim === '') {\n throw new ProblemFileError(`${where} needs a \"dim\" (text)${dim === undefined ? '' : `, found ${kindOf(dim)}`}`);\n }\n return { name, dim: parseDimensionSpec(dim) };\n}\n\nexport interface ProblemFile {\n readonly gap?: {\n readonly id?: string;\n readonly kind?: string;\n readonly summary?: string;\n };\n readonly target: { readonly name: string; readonly dim: string };\n readonly governing: readonly { readonly name: string; readonly dim: string }[];\n readonly exploratory?: unknown;\n readonly holdout?: unknown;\n readonly observationsPath?: string;\n readonly baseline?: ExprNode;\n readonly discrepancy?: DiscrepancyDefinition;\n readonly assumptions?: readonly string[];\n readonly limits?: SearchProblem['limits'];\n readonly claimedRegimes?: Readonly<Record<string, string>>;\n readonly observationalBoundIds?: readonly string[];\n}\n\n/** Load a SearchProblem from a JSON file (optionally with inline datasets). @internal */\nexport function loadSearchProblemFromJson(path: string): SearchProblem {\n const raw = JSON.parse(readFileSync(path, 'utf8')) as ProblemFile;\n return searchProblemFromFile(raw, path);\n}\n\n/**\n * The observations file a problem file names, resolved against the problem file's directory\n * (the working directory for an inline problem), or null when it names none. @internal\n */\nexport function resolveObservationsPath(raw: Pick<ProblemFile, 'observationsPath'>, source = 'inline'): string | null {\n if (!raw.observationsPath) return null;\n return isAbsolute(raw.observationsPath)\n ? raw.observationsPath\n : resolve(source === 'inline' ? process.cwd() : dirname(source), raw.observationsPath);\n}\n\n/** Build a SearchProblem from an already-parsed problem file. @internal */\nexport function searchProblemFromFile(raw: ProblemFile, source = 'inline'): SearchProblem {\n // `ProblemFile` is what a well-formed file holds; a file read from disk is any JSON value, so\n // each field is checked here before it is read, and a refusal names the field.\n const file: unknown = raw;\n if (!isRecord(file)) {\n throw new ProblemFileError(`the top level must be a JSON object with \"target\" and \"governing\" (found ${kindOf(file)})`);\n }\n if (file.target === undefined) throw new ProblemFileError('it has no \"target\" ({\"name\": text, \"dim\": text})');\n if (file.governing === undefined) throw new ProblemFileError('it has no \"governing\" list ([{\"name\": text, \"dim\": text}, ...])');\n if (!Array.isArray(file.governing)) {\n throw new ProblemFileError(`\"governing\" must be a list of {\"name\": text, \"dim\": text} (found ${kindOf(file.governing)})`);\n }\n if (file.gap !== undefined && !isRecord(file.gap)) {\n throw new ProblemFileError(`\"gap\" must be an object (found ${kindOf(file.gap)})`);\n }\n for (const field of ['id', 'kind', 'summary'] as const) {\n const v: unknown = raw.gap?.[field];\n if (v !== undefined && typeof v !== 'string') {\n throw new ProblemFileError(`gap.${field} must be text (found ${kindOf(v)})`);\n }\n }\n const kindRaw = raw.gap?.kind ?? 'unexplained-observation';\n if (!isGapKind(kindRaw)) {\n throw new ProblemFileError(`unknown gap kind '${kindRaw}' in gap.kind (see \\`upt help probe\\`, PROBLEM FILE)`);\n }\n if (kindRaw === 'relation-link' || kindRaw === 'regime-transition') {\n throw new ProblemFileError(`gap.kind '${kindRaw}' is a Product A gap: use \\`upt discover\\`, not probe`);\n }\n const gapId = raw.gap?.id ?? 'fg-inline';\n if (!gapId.startsWith('fg-')) {\n throw new ProblemFileError(`gap.id '${gapId}' must start with \"fg-\"`);\n }\n const gap = makeResidualGap(gapId, raw.gap?.summary ?? `search problem from ${source}`, kindRaw);\n const target = varFromJson(raw.target, '\"target\"');\n const governing = raw.governing.map((g, i) => varFromJson(g, `governing[${i}]`));\n let exploratory: ProbeDataset | undefined;\n let holdout: ProbeDataset | undefined;\n const observationsPath = resolveObservationsPath(raw, source);\n if (observationsPath !== null) {\n const split = loadSplitDatasetsFromJson(observationsPath);\n exploratory = split.exploratory;\n holdout = split.holdout;\n }\n if (raw.exploratory) {\n exploratory = asDatasetSafe(raw.exploratory, `${source}#exploratory`, 'exploratory-fit');\n }\n if (raw.holdout) {\n holdout = asDatasetSafe(raw.holdout, `${source}#holdout`, 'validation-holdout');\n }\n const problem = problemFromResidualGap(gap, target, governing, exploratory, holdout);\n return {\n ...problem,\n baseline: raw.baseline,\n discrepancy: raw.discrepancy ?? problem.discrepancy,\n assumptions: raw.assumptions ?? gap.assumptions,\n limits: raw.limits,\n claimedRegimes: raw.claimedRegimes,\n observationalBoundIds: raw.observationalBoundIds,\n };\n}\n\nfunction assertMinimalExprNode(raw: unknown, path: string): ExprNode {\n if (!raw || typeof raw !== 'object' || !('kind' in raw)) {\n throw new Error(`${path} is not an ExprNode JSON object`);\n }\n const node = raw as { kind: unknown };\n if (node.kind === 'symbol') {\n const sym = raw as { name?: unknown; dim?: unknown };\n if (typeof sym.name !== 'string' || sym.name.length === 0) {\n throw new Error(`${path} symbol node missing name`);\n }\n if (!sym.dim || typeof sym.dim !== 'object') {\n throw new Error(`${path} symbol node missing dim`);\n }\n return raw as ExprNode;\n }\n if (node.kind === 'op') {\n const op = raw as { op?: unknown; args?: unknown };\n if (typeof op.op !== 'string' || !Array.isArray(op.args)) {\n throw new Error(`${path} op node missing op/args`);\n }\n for (let i = 0; i < op.args.length; i++) {\n assertMinimalExprNode(op.args[i], `${path}#args[${i}]`);\n }\n return raw as ExprNode;\n }\n if (typeof node.kind !== 'string' || node.kind.length === 0) {\n throw new Error(`${path} has invalid kind`);\n }\n return raw as ExprNode;\n}\n\n/** Load an ExprNode from a JSON file (`{expression}` wrapper or bare node). @internal */\nexport function parseExprJson(path: string): ExprNode {\n const raw = JSON.parse(readFileSync(path, 'utf8')) as { expression?: ExprNode } | ExprNode;\n if (raw && typeof raw === 'object' && 'kind' in raw) return assertMinimalExprNode(raw, path);\n if (\n raw &&\n typeof raw === 'object' &&\n 'expression' in raw &&\n (raw as { expression?: ExprNode }).expression\n ) {\n return assertMinimalExprNode((raw as { expression: unknown }).expression, path);\n }\n throw new Error(`${path} is not an ExprNode JSON object`);\n}\n"]}
1
+ {"version":3,"file":"problem.js","sourceRoot":"","sources":["../../../src/composition/probe/problem.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Search-problem construction and JSON loading for Product B.\n *\n * @internal\n */\n\nimport { readJsonFile } from '../../core/data-file.js';\nimport { isPlainObject } from '../../core/json-schema.js';\nimport { dirname, isAbsolute, resolve } from 'node:path';\nimport { parseDimensionSpec } from '../../dimensional/dimension-spec.js';\nimport type { ExprNode } from '../../dimensional/ast-types.js';\nimport type {\n DimensionalVariableRef,\n DiscrepancyDefinition,\n FrontierGap,\n FrontierGapKind,\n ProbeDataset,\n SearchProblem,\n} from './types.js';\nimport { problemFromResidualGap } from './frontier.js';\nimport { asDatasetSafe, loadSplitDatasetsFromJson } from './dataset.js';\n\n/** Return whether a string names a supported frontier-gap kind for probe problems. @internal */\nexport function isGapKind(s: string): s is FrontierGapKind {\n return (\n s === 'prediction-residual' ||\n s === 'relation-link' ||\n s === 'regime-transition' ||\n s === 'parameter-tension' ||\n s === 'assumption-conflict' ||\n s === 'missing-operator' ||\n s === 'unexplained-observation' ||\n s === 'model-disagreement' ||\n s === 'causal-mechanism' ||\n s === 'other'\n );\n}\n\n/** Residual / unexplained-observation gap template. @internal */\nexport function makeResidualGap(\n id: string,\n summary: string,\n kind: FrontierGapKind = 'unexplained-observation',\n): FrontierGap {\n if (!id.startsWith('fg-')) {\n throw new RangeError(`makeResidualGap: id must start with 'fg-' (got '${id}')`);\n }\n if (kind === 'relation-link' || kind === 'regime-transition') {\n throw new RangeError(`makeResidualGap: ${kind} is Product A — use upt discover, not probe`);\n }\n return {\n id,\n kind,\n participants: [],\n observations: [],\n regimes: [],\n assumptions: [],\n constraints: [],\n evidence: { summary, sourceIds: [] },\n identifiability: {\n kind: 'parametric',\n parametric: { status: 'unknown', reasons: ['not yet assessed'] },\n },\n searchability: { searchable: true, reasons: ['residual gap'] },\n status: 'identified',\n };\n}\n\n/**\n * A JSON file that is not a search-problem file, or not an expression file: a field it must carry\n * is missing or holds a value of another kind. The message names the field; it never reports what\n * a JavaScript engine said on reading it. @internal\n */\nexport class ProblemFileError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ProblemFileError';\n }\n}\n\n/** The `DiscrepancyKind` union as a runtime set, for a file's `discrepancy.kind`. */\nconst DISCREPANCY_KINDS: ReadonlySet<string> = new Set([\n 'additive', 'relative', 'log-ratio', 'standardized', 'likelihood',\n 'vector', 'tensor', 'distributional', 'operator', 'custom',\n]);\n\n/** What a JSON value is, in the words a file author would use. */\nfunction kindOf(v: unknown): string {\n if (v === null) return 'null';\n if (Array.isArray(v)) return 'a list';\n if (typeof v === 'string') return 'text';\n if (typeof v === 'number') return 'a number';\n if (typeof v === 'boolean') return 'true or false';\n return typeof v === 'object' ? 'an object' : typeof v;\n}\n\n/** A `{\"name\", \"dim\"}` variable, read from `raw` and located by `where` in any refusal. */\nfunction varFromJson(raw: unknown, where: string): DimensionalVariableRef {\n if (!isPlainObject(raw)) {\n throw new ProblemFileError(`${where} must be {\"name\": text, \"dim\": text} (found ${kindOf(raw)})`);\n }\n const { name, dim } = raw;\n if (typeof name !== 'string' || name === '') {\n throw new ProblemFileError(`${where} needs a \"name\" (text)${name === undefined ? '' : `, found ${kindOf(name)}`}`);\n }\n if (typeof dim !== 'string' || dim === '') {\n throw new ProblemFileError(`${where} needs a \"dim\" (text)${dim === undefined ? '' : `, found ${kindOf(dim)}`}`);\n }\n return { name, dim: parseDimensionSpec(dim) };\n}\n\n/** The JSON shape of a probe problem file, as read before validation. */\nexport interface ProblemFile {\n readonly gap?: {\n readonly id?: string;\n readonly kind?: string;\n readonly summary?: string;\n };\n readonly target: { readonly name: string; readonly dim: string };\n readonly governing: readonly { readonly name: string; readonly dim: string }[];\n readonly exploratory?: unknown;\n readonly holdout?: unknown;\n readonly observationsPath?: string;\n readonly baseline?: ExprNode;\n readonly discrepancy?: DiscrepancyDefinition;\n readonly assumptions?: readonly string[];\n readonly limits?: SearchProblem['limits'];\n readonly claimedRegimes?: Readonly<Record<string, string>>;\n readonly observationalBoundIds?: readonly string[];\n}\n\n/** Load a SearchProblem from a JSON file (optionally with inline datasets). @internal */\nexport function loadSearchProblemFromJson(path: string): SearchProblem {\n const raw = readJsonFile(path) as ProblemFile;\n return searchProblemFromFile(raw, path);\n}\n\n/**\n * The observations file a problem file names, resolved against the problem file's directory\n * (the working directory for an inline problem), or null when it names none. @internal\n */\nexport function resolveObservationsPath(raw: Pick<ProblemFile, 'observationsPath'>, source = 'inline'): string | null {\n if (!raw.observationsPath) return null;\n return isAbsolute(raw.observationsPath)\n ? raw.observationsPath\n : resolve(source === 'inline' ? process.cwd() : dirname(source), raw.observationsPath);\n}\n\n/** Build a SearchProblem from an already-parsed problem file. @internal */\nexport function searchProblemFromFile(raw: ProblemFile, source = 'inline'): SearchProblem {\n // `ProblemFile` is what a well-formed file holds; a file read from disk is any JSON value, so\n // each field is checked here before it is read, and a refusal names the field.\n const file: unknown = raw;\n if (!isPlainObject(file)) {\n throw new ProblemFileError(`the top level must be a JSON object with \"target\" and \"governing\" (found ${kindOf(file)})`);\n }\n if (file.target === undefined) throw new ProblemFileError('it has no \"target\" ({\"name\": text, \"dim\": text})');\n if (file.governing === undefined) throw new ProblemFileError('it has no \"governing\" list ([{\"name\": text, \"dim\": text}, ...])');\n if (!Array.isArray(file.governing)) {\n throw new ProblemFileError(`\"governing\" must be a list of {\"name\": text, \"dim\": text} (found ${kindOf(file.governing)})`);\n }\n if (file.gap !== undefined && !isPlainObject(file.gap)) {\n throw new ProblemFileError(`\"gap\" must be an object (found ${kindOf(file.gap)})`);\n }\n for (const field of ['id', 'kind', 'summary'] as const) {\n const v: unknown = raw.gap?.[field];\n if (v !== undefined && typeof v !== 'string') {\n throw new ProblemFileError(`gap.${field} must be text (found ${kindOf(v)})`);\n }\n }\n const kindRaw = raw.gap?.kind ?? 'unexplained-observation';\n if (!isGapKind(kindRaw)) {\n throw new ProblemFileError(`unknown gap kind '${kindRaw}' in gap.kind (see \\`upt help probe\\`, PROBLEM FILE)`);\n }\n if (kindRaw === 'relation-link' || kindRaw === 'regime-transition') {\n throw new ProblemFileError(`gap.kind '${kindRaw}' is a Product A gap: use \\`upt discover\\`, not probe`);\n }\n const gapId = raw.gap?.id ?? 'fg-inline';\n if (!gapId.startsWith('fg-')) {\n throw new ProblemFileError(`gap.id '${gapId}' must start with \"fg-\"`);\n }\n const gap = makeResidualGap(gapId, raw.gap?.summary ?? `search problem from ${source}`, kindRaw);\n const target = varFromJson(raw.target, '\"target\"');\n const governing = raw.governing.map((g, i) => varFromJson(g, `governing[${i}]`));\n let exploratory: ProbeDataset | undefined;\n let holdout: ProbeDataset | undefined;\n if (file.observationsPath !== undefined && typeof file.observationsPath !== 'string') {\n throw new ProblemFileError(`\"observationsPath\" must be text (found ${kindOf(file.observationsPath)})`);\n }\n const observationsPath = resolveObservationsPath(raw, source);\n if (observationsPath !== null) {\n const split = loadSplitDatasetsFromJson(observationsPath);\n exploratory = split.exploratory;\n holdout = split.holdout;\n }\n if (raw.exploratory) {\n exploratory = asDatasetSafe(raw.exploratory, `${source}#exploratory`, 'exploratory-fit');\n }\n if (raw.holdout) {\n holdout = asDatasetSafe(raw.holdout, `${source}#holdout`, 'validation-holdout');\n }\n const problem = problemFromResidualGap(gap, target, governing, exploratory, holdout);\n // The secondary fields. Each was once passed through unread, so `limits: 5` or\n // `assumptions: \"x\"` reached `runProbeSearch` and threw a raw TypeError there.\n return {\n ...problem,\n baseline: file.baseline === undefined ? undefined : assertExprNode(file.baseline, '\"baseline\"'),\n discrepancy: file.discrepancy === undefined ? problem.discrepancy : discrepancyFromJson(file.discrepancy),\n assumptions: file.assumptions === undefined ? gap.assumptions : textList(file.assumptions, 'assumptions'),\n limits: file.limits === undefined ? undefined : limitsFromJson(file.limits),\n claimedRegimes: file.claimedRegimes === undefined ? undefined : textRecord(file.claimedRegimes, 'claimedRegimes'),\n observationalBoundIds:\n file.observationalBoundIds === undefined ? undefined : textList(file.observationalBoundIds, 'observationalBoundIds'),\n };\n}\n\n/** A list of text, located by its field name. */\nfunction textList(raw: unknown, field: string): readonly string[] {\n const label = field.includes('.') ? field : `\"${field}\"`;\n if (!Array.isArray(raw)) throw new ProblemFileError(`${label} must be a list of text (found ${kindOf(raw)})`);\n return raw.map((v, i) => {\n if (typeof v !== 'string') throw new ProblemFileError(`${field}[${i}] must be text (found ${kindOf(v)})`);\n return v;\n });\n}\n\n/** A `{name: text}` object, located by its field name. */\nfunction textRecord(raw: unknown, field: string): Readonly<Record<string, string>> {\n if (!isPlainObject(raw)) throw new ProblemFileError(`\"${field}\" must be {name: text} (found ${kindOf(raw)})`);\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(raw)) {\n if (typeof v !== 'string') throw new ProblemFileError(`${field}.${k} must be text (found ${kindOf(v)})`);\n out[k] = v;\n }\n return out;\n}\n\nfunction discrepancyFromJson(raw: unknown): DiscrepancyDefinition {\n if (!isPlainObject(raw)) throw new ProblemFileError(`\"discrepancy\" must be {\"kind\": text, \"observableIds\": [text]} (found ${kindOf(raw)})`);\n if (typeof raw.kind !== 'string' || !DISCREPANCY_KINDS.has(raw.kind)) {\n throw new ProblemFileError(\n `discrepancy.kind '${String(raw.kind)}' is not a discrepancy kind (${[...DISCREPANCY_KINDS].join(', ')})`,\n );\n }\n const observableIds = textList(raw.observableIds, 'discrepancy.observableIds');\n for (const key of ['covarianceRef', 'implementationRef'] as const) {\n if (raw[key] !== undefined && typeof raw[key] !== 'string') {\n throw new ProblemFileError(`discrepancy.${key} must be text (found ${kindOf(raw[key])})`);\n }\n }\n return {\n kind: raw.kind as DiscrepancyDefinition['kind'],\n observableIds,\n ...(typeof raw.covarianceRef === 'string' ? { covarianceRef: raw.covarianceRef } : {}),\n ...(typeof raw.implementationRef === 'string' ? { implementationRef: raw.implementationRef } : {}),\n };\n}\n\nfunction limitsFromJson(raw: unknown): NonNullable<SearchProblem['limits']> {\n const shape = '{\"id\": text, \"regime\": {name: text}}';\n if (!Array.isArray(raw)) throw new ProblemFileError(`\"limits\" must be a list of ${shape} (found ${kindOf(raw)})`);\n return raw.map((l, i) => {\n if (!isPlainObject(l)) throw new ProblemFileError(`limits[${i}] must be ${shape} (found ${kindOf(l)})`);\n if (typeof l.id !== 'string' || l.id === '') throw new ProblemFileError(`limits[${i}].id must be text`);\n if (!isPlainObject(l.regime)) throw new ProblemFileError(`limits[${i}].regime must be {name: text} (found ${kindOf(l.regime)})`);\n const regime = textRecord(l.regime, `limits[${i}].regime`);\n if (l.description !== undefined && typeof l.description !== 'string') {\n throw new ProblemFileError(`limits[${i}].description must be text (found ${kindOf(l.description)})`);\n }\n return { id: l.id, regime, ...(typeof l.description === 'string' ? { description: l.description } : {}) };\n });\n}\n\n/** The scalar operators an `op` node may carry. */\nconst SCALAR_OPS: ReadonlySet<string> = new Set(['+', '-', '*', '/', '^']);\n/** The `TranscendentalFn` union as a runtime set. */\nconst TRANSCENDENTAL_FNS: ReadonlySet<string> = new Set(['exp', 'ln', 'log2', 'log10', 'sin', 'cos', 'tan', 'sinh', 'cosh', 'tanh']);\n/** A decimal literal, as the validator reads a numeric-literal symbol. */\nconst DECIMAL_LITERAL = /^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?$/;\nconst DIM_KEYS = ['L', 'M', 'T', 'I', 'Theta', 'N', 'J'] as const;\nconst SCALAR_KINDS = 'symbol, op, integral, derivative, dirac-delta, variational-derivative, transcendental, abs';\n\n/** `raw[field]` as a child node, or a refusal that names the field. */\nfunction child(raw: Record<string, unknown>, field: string, path: string, what: string): ExprNode {\n if (raw[field] === undefined) throw new ProblemFileError(`${path} ${what} node needs ${field === 'args' ? '' : 'an '}\"${field}\" node`);\n return assertExprNode(raw[field], `${path}#${field}`);\n}\n\n/**\n * Check that a JSON value has the shape of a scalar `ExprNode`, recursively:\n * a kind per node, the children each kind owns, a finite literal where a\n * symbol's name is a decimal literal, and the seven dimension exponents on a\n * symbol. A tensor kind is refused here: the probe evaluates scalars.\n * Refusals are {@link ProblemFileError}, located by `path`.\n */\nfunction assertExprNode(raw: unknown, path: string): ExprNode {\n if (!isPlainObject(raw) || !('kind' in raw)) {\n throw new ProblemFileError(`${path} is not an ExprNode JSON object (found ${kindOf(raw)})`);\n }\n const kind = raw.kind;\n if (typeof kind !== 'string' || kind.length === 0) {\n throw new ProblemFileError(`${path} has invalid kind (found ${kindOf(kind)})`);\n }\n switch (kind) {\n case 'symbol': {\n if (typeof raw.name !== 'string' || raw.name.length === 0) {\n throw new ProblemFileError(`${path} symbol node missing name (needs \"name\": text)`);\n }\n if (!isPlainObject(raw.dim)) throw new ProblemFileError(`${path} symbol node missing dim`);\n for (const k of DIM_KEYS) {\n if (!(k in raw.dim)) throw new ProblemFileError(`${path} symbol node dim needs the exponents ${DIM_KEYS.join(', ')}`);\n if (typeof raw.dim[k] !== 'number' || !Number.isFinite(raw.dim[k])) {\n throw new ProblemFileError(`${path} symbol node dim.${k} must be a finite number (found ${kindOf(raw.dim[k])})`);\n }\n }\n if (DECIMAL_LITERAL.test(raw.name) && !Number.isFinite(Number(raw.name))) {\n throw new ProblemFileError(`${path} literal '${raw.name}' is not a finite number`);\n }\n return raw as unknown as ExprNode;\n }\n case 'op': {\n if (typeof raw.op !== 'string' || !Array.isArray(raw.args)) {\n throw new ProblemFileError(`${path} op node needs \"op\" and an \"args\" list (op node missing op/args)`);\n }\n if (!SCALAR_OPS.has(raw.op)) throw new ProblemFileError(`${path} op node has op '${raw.op}', not one of + - * / ^`);\n raw.args.forEach((a, i) => assertExprNode(a, `${path}#args[${i}]`));\n return raw as unknown as ExprNode;\n }\n case 'integral': {\n child(raw, 'over', path, 'integral');\n child(raw, 'integrand', path, 'integral');\n for (const bound of ['lower', 'upper']) if (raw[bound] !== undefined) assertExprNode(raw[bound], `${path}#${bound}`);\n return raw as unknown as ExprNode;\n }\n case 'derivative':\n child(raw, 'of', path, 'derivative');\n child(raw, 'wrt', path, 'derivative');\n return raw as unknown as ExprNode;\n case 'dirac-delta':\n case 'abs':\n child(raw, 'arg', path, kind);\n return raw as unknown as ExprNode;\n case 'variational-derivative':\n for (const f of ['functional', 'field', 'over']) child(raw, f, path, kind);\n return raw as unknown as ExprNode;\n case 'transcendental': {\n if (typeof raw.fn !== 'string' || !TRANSCENDENTAL_FNS.has(raw.fn)) {\n throw new ProblemFileError(`${path} transcendental node has fn '${String(raw.fn)}', not one of ${[...TRANSCENDENTAL_FNS].join(', ')}`);\n }\n child(raw, 'arg', path, kind);\n return raw as unknown as ExprNode;\n }\n default:\n throw new ProblemFileError(`${path} has kind '${kind}', which is not a scalar expression node (${SCALAR_KINDS})`);\n }\n}\n\n/**\n * Load an ExprNode from a JSON file (`{expression}` wrapper or bare node). The node shape is\n * checked recursively; a file that is not an expression raises {@link ProblemFileError}. @internal\n */\nexport function parseExprJson(path: string): ExprNode {\n const raw: unknown = readJsonFile(path);\n if (isPlainObject(raw) && 'kind' in raw) return assertExprNode(raw, path);\n if (isPlainObject(raw) && 'expression' in raw && raw.expression) {\n return assertExprNode(raw.expression, path);\n }\n throw new ProblemFileError(`${path} is not an ExprNode JSON object`);\n}\n"]}
@@ -50,7 +50,7 @@ export function formatProbeReport(result) {
50
50
  const mark = item.pareto ? '●' : '·';
51
51
  const fit = result.fits[rec.id];
52
52
  const fitBit = fit
53
- ? ` ĉ=${fit.prefactor.toPrecision(4)} RMSE_ex=${fit.exploratoryRmse.toPrecision(3)}` +
53
+ ? ` ĉ=${fit.prefactor.toPrecision(4)}${fit.prefactorStderr !== null ? `±${fit.prefactorStderr.toPrecision(2)}` : ''} RMSE_ex=${fit.exploratoryRmse.toPrecision(3)}` +
54
54
  (fit.holdoutRmse != null ? ` RMSE_ho=${fit.holdoutRmse.toPrecision(3)}` : '')
55
55
  : '';
56
56
  lines.push(` ${mark} ${rec.id} [${STATUS_LINE[rec.status]}] validity=${item.scores.validity.toFixed(2)} emp=${item.scores.empirical.toFixed(2)} parsimony=${item.scores.parsimony.toFixed(2)}${fitBit}`);
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/composition/probe/report.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Scientist-facing probe reports. Never prints a status stronger than the\n * stored candidate status. Novelty wording is always corpus-relative.\n *\n * @internal\n */\n\nimport { bodyExpression } from './fingerprint.js';\nimport { corpusRelativeWording } from './corpus.js';\nimport type { ProbeSearchResult } from './pipeline.js';\nimport type { FrontierGap, ProbeCandidateRecord, ProbeCandidateStatus } from './types.js';\n\nconst STATUS_LINE: Record<ProbeCandidateStatus, string> = {\n generated: 'generated (not yet validated)',\n 'structurally-valid': 'structurally valid (not yet fit)',\n 'empirically-fit': 'fit on exploratory data only (holdout not passed)',\n 'heldout-supported': 'supported on locked holdout (not yet falsified)',\n 'falsification-survivor': 'survived declared falsification batteries',\n 'expert-review-required': 'requires expert review — not a published discovery',\n rejected: 'rejected',\n falsified: 'falsified',\n 'equivalent-known': 'algebraically equivalent to a known corpus relation (not novel)',\n 'insufficient-evidence': 'insufficient evidence (no data or no holdout)',\n};\n\nfunction exprSummary(record: ProbeCandidateRecord): string {\n const expr = bodyExpression(record.body);\n try {\n return JSON.stringify(expr);\n } catch {\n return record.id;\n }\n}\n\n/** Format a Product B search result. @internal */\nexport function formatProbeReport(result: ProbeSearchResult): string {\n const lines: string[] = [];\n lines.push(`upt probe — experimental expression/residual search [run ${result.manifest.runId}]`);\n lines.push('⚠ Product B is experimental. `upt discover` remains the quantity-identification funnel.');\n lines.push(` stop: ${result.stopReason}`);\n lines.push(` candidates: ${result.candidates.length} · rejections: ${result.rejections.length}`);\n if (result.wording.length > 0) {\n lines.push('');\n for (const w of result.wording.slice(0, 8)) lines.push(` ${w}`);\n }\n lines.push('');\n if (result.ranked.length === 0) {\n lines.push(' no candidates to rank.');\n return lines.join('\\n');\n }\n lines.push(' ranked (Pareto front first; scores are not a discovery claim):');\n for (const item of result.ranked) {\n const rec = item.record;\n const mark = item.pareto ? '●' : '·';\n const fit = result.fits[rec.id];\n const fitBit = fit\n ? ` ĉ=${fit.prefactor.toPrecision(4)} RMSE_ex=${fit.exploratoryRmse.toPrecision(3)}` +\n (fit.holdoutRmse != null ? ` RMSE_ho=${fit.holdoutRmse.toPrecision(3)}` : '')\n : '';\n lines.push(\n ` ${mark} ${rec.id} [${STATUS_LINE[rec.status]}] validity=${item.scores.validity.toFixed(2)} emp=${item.scores.empirical.toFixed(2)} parsimony=${item.scores.parsimony.toFixed(2)}${fitBit}`,\n );\n const corp = result.corpus[rec.id];\n if (corp) lines.push(` ${corpusRelativeWording(corp)}`);\n for (const note of result.prefactorNotes[rec.id] ?? []) lines.push(` ${note}`);\n lines.push(` ${exprSummary(rec).slice(0, 180)}`);\n }\n return lines.join('\\n');\n}\n\n/** Format a frontier scan. @internal */\nexport function formatFrontierScan(gaps: readonly FrontierGap[]): string {\n const lines: string[] = [];\n lines.push('upt probe scan — typed frontier gaps');\n lines.push('⚠ relation-link / regime-transition gaps are Product A review surfaces (`upt discover`).');\n lines.push(` ${gaps.length} gap(s)\\n`);\n for (const g of gaps) {\n const search = g.searchability.searchable ? 'searchable' : 'not-searchable';\n lines.push(` ${g.id} [${g.kind} / ${search}]`);\n lines.push(` ${g.evidence.summary}`);\n if (!g.searchability.searchable) {\n lines.push(` → ${g.searchability.reasons.join('; ')}`);\n }\n }\n return lines.join('\\n');\n}\n\n/** Format a single gap. @internal */\nexport function formatFrontierGap(gap: FrontierGap): string {\n return [\n `upt probe show ${gap.id}`,\n ` kind: ${gap.kind}`,\n ` status: ${gap.status}`,\n ` searchable: ${gap.searchability.searchable} (${gap.searchability.reasons.join('; ')})`,\n ` identifiability: ${gap.identifiability.kind} ${gap.identifiability.parametric?.status ?? ''}`,\n ` ${gap.evidence.summary}`,\n ].join('\\n');\n}\n"]}
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/composition/probe/report.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Scientist-facing probe reports. Never prints a status stronger than the\n * stored candidate status. Novelty wording is always corpus-relative.\n *\n * @internal\n */\n\nimport { bodyExpression } from './fingerprint.js';\nimport { corpusRelativeWording } from './corpus.js';\nimport type { ProbeSearchResult } from './pipeline.js';\nimport type { FrontierGap, ProbeCandidateRecord, ProbeCandidateStatus } from './types.js';\n\nconst STATUS_LINE: Record<ProbeCandidateStatus, string> = {\n generated: 'generated (not yet validated)',\n 'structurally-valid': 'structurally valid (not yet fit)',\n 'empirically-fit': 'fit on exploratory data only (holdout not passed)',\n 'heldout-supported': 'supported on locked holdout (not yet falsified)',\n 'falsification-survivor': 'survived declared falsification batteries',\n 'expert-review-required': 'requires expert review — not a published discovery',\n rejected: 'rejected',\n falsified: 'falsified',\n 'equivalent-known': 'algebraically equivalent to a known corpus relation (not novel)',\n 'insufficient-evidence': 'insufficient evidence (no data or no holdout)',\n};\n\nfunction exprSummary(record: ProbeCandidateRecord): string {\n const expr = bodyExpression(record.body);\n try {\n return JSON.stringify(expr);\n } catch {\n return record.id;\n }\n}\n\n/** Format a Product B search result. @internal */\nexport function formatProbeReport(result: ProbeSearchResult): string {\n const lines: string[] = [];\n lines.push(`upt probe — experimental expression/residual search [run ${result.manifest.runId}]`);\n lines.push('⚠ Product B is experimental. `upt discover` remains the quantity-identification funnel.');\n lines.push(` stop: ${result.stopReason}`);\n lines.push(` candidates: ${result.candidates.length} · rejections: ${result.rejections.length}`);\n if (result.wording.length > 0) {\n lines.push('');\n for (const w of result.wording.slice(0, 8)) lines.push(` ${w}`);\n }\n lines.push('');\n if (result.ranked.length === 0) {\n lines.push(' no candidates to rank.');\n return lines.join('\\n');\n }\n lines.push(' ranked (Pareto front first; scores are not a discovery claim):');\n for (const item of result.ranked) {\n const rec = item.record;\n const mark = item.pareto ? '●' : '·';\n const fit = result.fits[rec.id];\n const fitBit = fit\n ? ` ĉ=${fit.prefactor.toPrecision(4)}${fit.prefactorStderr !== null ? `±${fit.prefactorStderr.toPrecision(2)}` : ''} RMSE_ex=${fit.exploratoryRmse.toPrecision(3)}` +\n (fit.holdoutRmse != null ? ` RMSE_ho=${fit.holdoutRmse.toPrecision(3)}` : '')\n : '';\n lines.push(\n ` ${mark} ${rec.id} [${STATUS_LINE[rec.status]}] validity=${item.scores.validity.toFixed(2)} emp=${item.scores.empirical.toFixed(2)} parsimony=${item.scores.parsimony.toFixed(2)}${fitBit}`,\n );\n const corp = result.corpus[rec.id];\n if (corp) lines.push(` ${corpusRelativeWording(corp)}`);\n for (const note of result.prefactorNotes[rec.id] ?? []) lines.push(` ${note}`);\n lines.push(` ${exprSummary(rec).slice(0, 180)}`);\n }\n return lines.join('\\n');\n}\n\n/** Format a frontier scan. @internal */\nexport function formatFrontierScan(gaps: readonly FrontierGap[]): string {\n const lines: string[] = [];\n lines.push('upt probe scan — typed frontier gaps');\n lines.push('⚠ relation-link / regime-transition gaps are Product A review surfaces (`upt discover`).');\n lines.push(` ${gaps.length} gap(s)\\n`);\n for (const g of gaps) {\n const search = g.searchability.searchable ? 'searchable' : 'not-searchable';\n lines.push(` ${g.id} [${g.kind} / ${search}]`);\n lines.push(` ${g.evidence.summary}`);\n if (!g.searchability.searchable) {\n lines.push(` → ${g.searchability.reasons.join('; ')}`);\n }\n }\n return lines.join('\\n');\n}\n\n/** Format a single gap. @internal */\nexport function formatFrontierGap(gap: FrontierGap): string {\n return [\n `upt probe show ${gap.id}`,\n ` kind: ${gap.kind}`,\n ` status: ${gap.status}`,\n ` searchable: ${gap.searchability.searchable} (${gap.searchability.reasons.join('; ')})`,\n ` identifiability: ${gap.identifiability.kind} ${gap.identifiability.parametric?.status ?? ''}`,\n ` ${gap.evidence.summary}`,\n ].join('\\n');\n}\n"]}
@@ -5,6 +5,7 @@
5
5
  * @module composition/probe/residual
6
6
  */
7
7
  import type { DiscrepancyDefinition, DiscrepancyKind } from './types.js';
8
+ /** The error that residual evaluation throws, for example on a non-finite value. */
8
9
  export declare class ResidualError extends Error {
9
10
  constructor(message: string);
10
11
  }
@@ -15,6 +16,11 @@ export declare class ResidualError extends Error {
15
16
  * @internal
16
17
  */
17
18
  export declare function scalarDiscrepancy(observed: number, predicted: number, kind: DiscrepancyKind, scale?: number): number;
18
- /** RMSE of a discrepancy over paired samples. @internal */
19
+ /**
20
+ * RMSE of a discrepancy over paired samples: core `norm2` of the discrepancies
21
+ * (the scaled, overflow-safe 2-norm) over √n. Empty or unequal-length samples
22
+ * are refused, as before; a non-finite sample still throws from
23
+ * {@link scalarDiscrepancy}. @internal
24
+ */
19
25
  export declare function rmse(observed: readonly number[], predicted: readonly number[], def: DiscrepancyDefinition, scale?: number): number;
20
26
  //# sourceMappingURL=residual.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"residual.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/residual.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEzE,qBAAa,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,eAAe,EACrB,KAAK,SAAI,GACR,MAAM,CAyCR;AAED,2DAA2D;AAC3D,wBAAgB,IAAI,CAClB,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,GAAG,EAAE,qBAAqB,EAC1B,KAAK,SAAI,GACR,MAAM,CAUR"}
1
+ {"version":3,"file":"residual.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/residual.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEzE,oFAAoF;AACpF,qBAAa,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,eAAe,EACrB,KAAK,SAAI,GACR,MAAM,CAyCR;AAED;;;;;GAKG;AACH,wBAAgB,IAAI,CAClB,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,GAAG,EAAE,qBAAqB,EAC1B,KAAK,SAAI,GACR,MAAM,CAMR"}
@@ -4,6 +4,8 @@
4
4
  *
5
5
  * @module composition/probe/residual
6
6
  */
7
+ import { norm2 } from '@danielsimonjr/mathts-core';
8
+ /** The error that residual evaluation throws, for example on a non-finite value. */
7
9
  export class ResidualError extends Error {
8
10
  constructor(message) {
9
11
  super(message);
@@ -57,16 +59,17 @@ export function scalarDiscrepancy(observed, predicted, kind, scale = 1) {
57
59
  }
58
60
  }
59
61
  }
60
- /** RMSE of a discrepancy over paired samples. @internal */
62
+ /**
63
+ * RMSE of a discrepancy over paired samples: core `norm2` of the discrepancies
64
+ * (the scaled, overflow-safe 2-norm) over √n. Empty or unequal-length samples
65
+ * are refused, as before; a non-finite sample still throws from
66
+ * {@link scalarDiscrepancy}. @internal
67
+ */
61
68
  export function rmse(observed, predicted, def, scale = 1) {
62
69
  if (observed.length !== predicted.length || observed.length === 0) {
63
70
  throw new ResidualError('rmse: nonempty equal-length samples required');
64
71
  }
65
- let acc = 0;
66
- for (let i = 0; i < observed.length; i++) {
67
- const r = scalarDiscrepancy(observed[i], predicted[i], def.kind, scale);
68
- acc += r * r;
69
- }
70
- return Math.sqrt(acc / observed.length);
72
+ const residuals = observed.map((o, i) => scalarDiscrepancy(o, predicted[i], def.kind, scale));
73
+ return norm2(residuals) / Math.sqrt(residuals.length);
71
74
  }
72
75
  //# sourceMappingURL=residual.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"residual.js","sourceRoot":"","sources":["../../../src/composition/probe/residual.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Explicit residual / discrepancy evaluation. Does not replace\n * `residualInSigma` on the confrontation spine.\n *\n * @module composition/probe/residual\n */\n\nimport type { DiscrepancyDefinition, DiscrepancyKind } from './types.js';\n\nexport class ResidualError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ResidualError';\n }\n}\n\n/**\n * Scalar discrepancy. Covariance-standardized with a non-diagonal Σ is\n * unsupported and throws rather than silently using diagonal σ.\n *\n * @internal\n */\nexport function scalarDiscrepancy(\n observed: number,\n predicted: number,\n kind: DiscrepancyKind,\n scale = 1,\n): number {\n if (!Number.isFinite(observed) || !Number.isFinite(predicted)) {\n throw new ResidualError('scalarDiscrepancy: observed and predicted must be finite');\n }\n switch (kind) {\n case 'additive':\n return observed - predicted;\n case 'relative': {\n const s = scale !== 0 && Number.isFinite(scale) ? scale : Math.abs(predicted) || 1;\n return (observed - predicted) / s;\n }\n case 'log-ratio': {\n if (!(observed > 0 && predicted > 0)) {\n throw new ResidualError('log-ratio residual requires positive observed and predicted');\n }\n return Math.log(observed / predicted);\n }\n case 'standardized': {\n if (!(scale > 0 && Number.isFinite(scale))) {\n throw new ResidualError('standardized residual requires positive finite sigma');\n }\n return (observed - predicted) / scale;\n }\n case 'likelihood': {\n if (!(scale > 0)) throw new ResidualError('likelihood residual requires positive sigma');\n const z = (observed - predicted) / scale;\n return 0.5 * z * z + Math.log(scale * Math.sqrt(2 * Math.PI));\n }\n case 'vector':\n case 'tensor':\n case 'distributional':\n case 'operator':\n case 'custom':\n throw new ResidualError(\n `${kind} discrepancy is not implemented on the scalar path — abstain`,\n );\n default: {\n const _never: never = kind;\n return _never;\n }\n }\n}\n\n/** RMSE of a discrepancy over paired samples. @internal */\nexport function rmse(\n observed: readonly number[],\n predicted: readonly number[],\n def: DiscrepancyDefinition,\n scale = 1,\n): number {\n if (observed.length !== predicted.length || observed.length === 0) {\n throw new ResidualError('rmse: nonempty equal-length samples required');\n }\n let acc = 0;\n for (let i = 0; i < observed.length; i++) {\n const r = scalarDiscrepancy(observed[i], predicted[i], def.kind, scale);\n acc += r * r;\n }\n return Math.sqrt(acc / observed.length);\n}\n"]}
1
+ {"version":3,"file":"residual.js","sourceRoot":"","sources":["../../../src/composition/probe/residual.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Explicit residual / discrepancy evaluation. Does not replace\n * `residualInSigma` on the confrontation spine.\n *\n * @module composition/probe/residual\n */\n\nimport { norm2 } from '@danielsimonjr/mathts-core';\nimport type { DiscrepancyDefinition, DiscrepancyKind } from './types.js';\n\n/** The error that residual evaluation throws, for example on a non-finite value. */\nexport class ResidualError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ResidualError';\n }\n}\n\n/**\n * Scalar discrepancy. Covariance-standardized with a non-diagonal Σ is\n * unsupported and throws rather than silently using diagonal σ.\n *\n * @internal\n */\nexport function scalarDiscrepancy(\n observed: number,\n predicted: number,\n kind: DiscrepancyKind,\n scale = 1,\n): number {\n if (!Number.isFinite(observed) || !Number.isFinite(predicted)) {\n throw new ResidualError('scalarDiscrepancy: observed and predicted must be finite');\n }\n switch (kind) {\n case 'additive':\n return observed - predicted;\n case 'relative': {\n const s = scale !== 0 && Number.isFinite(scale) ? scale : Math.abs(predicted) || 1;\n return (observed - predicted) / s;\n }\n case 'log-ratio': {\n if (!(observed > 0 && predicted > 0)) {\n throw new ResidualError('log-ratio residual requires positive observed and predicted');\n }\n return Math.log(observed / predicted);\n }\n case 'standardized': {\n if (!(scale > 0 && Number.isFinite(scale))) {\n throw new ResidualError('standardized residual requires positive finite sigma');\n }\n return (observed - predicted) / scale;\n }\n case 'likelihood': {\n if (!(scale > 0)) throw new ResidualError('likelihood residual requires positive sigma');\n const z = (observed - predicted) / scale;\n return 0.5 * z * z + Math.log(scale * Math.sqrt(2 * Math.PI));\n }\n case 'vector':\n case 'tensor':\n case 'distributional':\n case 'operator':\n case 'custom':\n throw new ResidualError(\n `${kind} discrepancy is not implemented on the scalar path — abstain`,\n );\n default: {\n const _never: never = kind;\n return _never;\n }\n }\n}\n\n/**\n * RMSE of a discrepancy over paired samples: core `norm2` of the discrepancies\n * (the scaled, overflow-safe 2-norm) over √n. Empty or unequal-length samples\n * are refused, as before; a non-finite sample still throws from\n * {@link scalarDiscrepancy}. @internal\n */\nexport function rmse(\n observed: readonly number[],\n predicted: readonly number[],\n def: DiscrepancyDefinition,\n scale = 1,\n): number {\n if (observed.length !== predicted.length || observed.length === 0) {\n throw new ResidualError('rmse: nonempty equal-length samples required');\n }\n const residuals = observed.map((o, i) => scalarDiscrepancy(o, predicted[i]!, def.kind, scale));\n return norm2(residuals) / Math.sqrt(residuals.length);\n}\n"]}