universal-physics-tensor 10.0.0 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (720) hide show
  1. package/README.md +4 -3
  2. package/bin/upt.mjs +13 -1
  3. package/data/atlas/atlas.json +25 -25
  4. package/data/atlas/atlas.jsonld +1 -1
  5. package/data/atlas/diffusion.json +6 -6
  6. package/data/atlas/oscillators.json +7 -7
  7. package/data/atlas/waves.json +14 -14
  8. package/data/atlas/witness-results.json +11 -11
  9. package/data/bridge-catalog.json +371 -228
  10. package/data/bridge-catalog.schema.json +45 -7
  11. package/dist/atlas/applicability.d.ts.map +1 -1
  12. package/dist/atlas/applicability.js +21 -15
  13. package/dist/atlas/applicability.js.map +1 -1
  14. package/dist/atlas/benchmark/hybrid-retrieval.d.ts +9 -1
  15. package/dist/atlas/benchmark/hybrid-retrieval.d.ts.map +1 -1
  16. package/dist/atlas/benchmark/hybrid-retrieval.js +15 -13
  17. package/dist/atlas/benchmark/hybrid-retrieval.js.map +1 -1
  18. package/dist/atlas/benchmark/loader.js +2 -2
  19. package/dist/atlas/benchmark/loader.js.map +1 -1
  20. package/dist/atlas/benchmark/stats.d.ts +2 -2
  21. package/dist/atlas/benchmark/stats.d.ts.map +1 -1
  22. package/dist/atlas/benchmark/stats.js +15 -7
  23. package/dist/atlas/benchmark/stats.js.map +1 -1
  24. package/dist/atlas/catalog-formal-ref.d.ts +26 -3
  25. package/dist/atlas/catalog-formal-ref.d.ts.map +1 -1
  26. package/dist/atlas/catalog-formal-ref.js +52 -5
  27. package/dist/atlas/catalog-formal-ref.js.map +1 -1
  28. package/dist/atlas/chain-pipeline.d.ts.map +1 -1
  29. package/dist/atlas/chain-pipeline.js +7 -8
  30. package/dist/atlas/chain-pipeline.js.map +1 -1
  31. package/dist/atlas/diffusion/bridges-closure.d.ts +0 -4
  32. package/dist/atlas/diffusion/bridges-closure.d.ts.map +1 -1
  33. package/dist/atlas/diffusion/bridges-closure.js +8 -12
  34. package/dist/atlas/diffusion/bridges-closure.js.map +1 -1
  35. package/dist/atlas/diffusion/bridges.d.ts.map +1 -1
  36. package/dist/atlas/diffusion/bridges.js +27 -39
  37. package/dist/atlas/diffusion/bridges.js.map +1 -1
  38. package/dist/atlas/diffusion/dimensions.d.ts +6 -14
  39. package/dist/atlas/diffusion/dimensions.d.ts.map +1 -1
  40. package/dist/atlas/diffusion/dimensions.js +8 -16
  41. package/dist/atlas/diffusion/dimensions.js.map +1 -1
  42. package/dist/atlas/diffusion/models.d.ts +3 -3
  43. package/dist/atlas/diffusion/models.d.ts.map +1 -1
  44. package/dist/atlas/diffusion/models.js +5 -10
  45. package/dist/atlas/diffusion/models.js.map +1 -1
  46. package/dist/atlas/diffusion/numerics.d.ts +16 -4
  47. package/dist/atlas/diffusion/numerics.d.ts.map +1 -1
  48. package/dist/atlas/diffusion/numerics.js +38 -24
  49. package/dist/atlas/diffusion/numerics.js.map +1 -1
  50. package/dist/atlas/link-prediction.d.ts +106 -3
  51. package/dist/atlas/link-prediction.d.ts.map +1 -1
  52. package/dist/atlas/link-prediction.js +212 -66
  53. package/dist/atlas/link-prediction.js.map +1 -1
  54. package/dist/atlas/oscillators/bridges-coarse.d.ts.map +1 -1
  55. package/dist/atlas/oscillators/bridges-coarse.js +7 -11
  56. package/dist/atlas/oscillators/bridges-coarse.js.map +1 -1
  57. package/dist/atlas/oscillators/bridges-exact.d.ts.map +1 -1
  58. package/dist/atlas/oscillators/bridges-exact.js +6 -7
  59. package/dist/atlas/oscillators/bridges-exact.js.map +1 -1
  60. package/dist/atlas/oscillators/bridges-limits.d.ts +3 -16
  61. package/dist/atlas/oscillators/bridges-limits.d.ts.map +1 -1
  62. package/dist/atlas/oscillators/bridges-limits.js +23 -34
  63. package/dist/atlas/oscillators/bridges-limits.js.map +1 -1
  64. package/dist/atlas/oscillators/dimensions.d.ts +9 -21
  65. package/dist/atlas/oscillators/dimensions.d.ts.map +1 -1
  66. package/dist/atlas/oscillators/dimensions.js +9 -21
  67. package/dist/atlas/oscillators/dimensions.js.map +1 -1
  68. package/dist/atlas/oscillators/limit-witnesses.d.ts +2 -2
  69. package/dist/atlas/oscillators/limit-witnesses.d.ts.map +1 -1
  70. package/dist/atlas/oscillators/limit-witnesses.js +17 -15
  71. package/dist/atlas/oscillators/limit-witnesses.js.map +1 -1
  72. package/dist/atlas/oscillators/models.d.ts.map +1 -1
  73. package/dist/atlas/oscillators/models.js +2 -6
  74. package/dist/atlas/oscillators/models.js.map +1 -1
  75. package/dist/atlas/oscillators/pendulum-motion.d.ts +29 -6
  76. package/dist/atlas/oscillators/pendulum-motion.d.ts.map +1 -1
  77. package/dist/atlas/oscillators/pendulum-motion.js +60 -40
  78. package/dist/atlas/oscillators/pendulum-motion.js.map +1 -1
  79. package/dist/atlas/oscillators/phase-translation.d.ts +0 -11
  80. package/dist/atlas/oscillators/phase-translation.d.ts.map +1 -1
  81. package/dist/atlas/oscillators/phase-translation.js +3 -4
  82. package/dist/atlas/oscillators/phase-translation.js.map +1 -1
  83. package/dist/atlas/oscillators/position-translation.d.ts +68 -7
  84. package/dist/atlas/oscillators/position-translation.d.ts.map +1 -1
  85. package/dist/atlas/oscillators/position-translation.js +123 -12
  86. package/dist/atlas/oscillators/position-translation.js.map +1 -1
  87. package/dist/atlas/oscillators/rejections.d.ts +0 -2
  88. package/dist/atlas/oscillators/rejections.d.ts.map +1 -1
  89. package/dist/atlas/oscillators/rejections.js +0 -7
  90. package/dist/atlas/oscillators/rejections.js.map +1 -1
  91. package/dist/atlas/physjs-entries.generated.d.ts +25 -24
  92. package/dist/atlas/physjs-entries.generated.d.ts.map +1 -1
  93. package/dist/atlas/physjs-entries.generated.js +25 -24
  94. package/dist/atlas/physjs-entries.generated.js.map +1 -1
  95. package/dist/atlas/physjs-ref.d.ts +34 -31
  96. package/dist/atlas/physjs-ref.d.ts.map +1 -1
  97. package/dist/atlas/physjs-ref.js +55 -53
  98. package/dist/atlas/physjs-ref.js.map +1 -1
  99. package/dist/atlas/physjs-reviewed.d.ts +1 -1
  100. package/dist/atlas/physjs-reviewed.js +15 -15
  101. package/dist/atlas/physjs-reviewed.js.map +1 -1
  102. package/dist/atlas/poster/statements.d.ts +0 -19
  103. package/dist/atlas/poster/statements.d.ts.map +1 -1
  104. package/dist/atlas/poster/statements.js +1 -1
  105. package/dist/atlas/poster/statements.js.map +1 -1
  106. package/dist/atlas/proof-target.d.ts +1 -1
  107. package/dist/atlas/proof-target.js +1 -1
  108. package/dist/atlas/proof-target.js.map +1 -1
  109. package/dist/atlas/regime.d.ts +1 -1
  110. package/dist/atlas/regime.d.ts.map +1 -1
  111. package/dist/atlas/regime.js +1 -1
  112. package/dist/atlas/regime.js.map +1 -1
  113. package/dist/atlas/text-overlap.d.ts +23 -0
  114. package/dist/atlas/text-overlap.d.ts.map +1 -0
  115. package/dist/atlas/text-overlap.js +41 -0
  116. package/dist/atlas/text-overlap.js.map +1 -0
  117. package/dist/atlas/waves/bridges-closure.d.ts.map +1 -1
  118. package/dist/atlas/waves/bridges-closure.js +2 -6
  119. package/dist/atlas/waves/bridges-closure.js.map +1 -1
  120. package/dist/atlas/waves/bridges.d.ts.map +1 -1
  121. package/dist/atlas/waves/bridges.js +32 -48
  122. package/dist/atlas/waves/bridges.js.map +1 -1
  123. package/dist/atlas/waves/models.d.ts +5 -6
  124. package/dist/atlas/waves/models.d.ts.map +1 -1
  125. package/dist/atlas/waves/models.js +7 -13
  126. package/dist/atlas/waves/models.js.map +1 -1
  127. package/dist/atlas/waves/numerics.d.ts.map +1 -1
  128. package/dist/atlas/waves/numerics.js +10 -3
  129. package/dist/atlas/waves/numerics.js.map +1 -1
  130. package/dist/atlas/witness-numeric.d.ts +30 -0
  131. package/dist/atlas/witness-numeric.d.ts.map +1 -1
  132. package/dist/atlas/witness-numeric.js +53 -0
  133. package/dist/atlas/witness-numeric.js.map +1 -1
  134. package/dist/atlas/witness-specs.d.ts.map +1 -1
  135. package/dist/atlas/witness-specs.js +19 -0
  136. package/dist/atlas/witness-specs.js.map +1 -1
  137. package/dist/atlas/witness-symbolic.d.ts +75 -3
  138. package/dist/atlas/witness-symbolic.d.ts.map +1 -1
  139. package/dist/atlas/witness-symbolic.js +116 -10
  140. package/dist/atlas/witness-symbolic.js.map +1 -1
  141. package/dist/bridges/catalog-load.d.ts.map +1 -1
  142. package/dist/bridges/catalog-load.js +13 -8
  143. package/dist/bridges/catalog-load.js.map +1 -1
  144. package/dist/bridges/catalog-types.d.ts +26 -2
  145. package/dist/bridges/catalog-types.d.ts.map +1 -1
  146. package/dist/bridges/catalog-types.js +11 -1
  147. package/dist/bridges/catalog-types.js.map +1 -1
  148. package/dist/bridges/evaluation-errors.d.ts +31 -1
  149. package/dist/bridges/evaluation-errors.d.ts.map +1 -1
  150. package/dist/bridges/evaluation-errors.js +20 -2
  151. package/dist/bridges/evaluation-errors.js.map +1 -1
  152. package/dist/bridges/evaluator-inputs.d.ts.map +1 -1
  153. package/dist/bridges/evaluator-inputs.js +7 -5
  154. package/dist/bridges/evaluator-inputs.js.map +1 -1
  155. package/dist/bridges/evaluators.d.ts.map +1 -1
  156. package/dist/bridges/evaluators.js +27 -12
  157. package/dist/bridges/evaluators.js.map +1 -1
  158. package/dist/bridges/expr-parse.d.ts +11 -0
  159. package/dist/bridges/expr-parse.d.ts.map +1 -1
  160. package/dist/bridges/expr-parse.js +14 -5
  161. package/dist/bridges/expr-parse.js.map +1 -1
  162. package/dist/bridges/holds.d.ts +35 -3
  163. package/dist/bridges/holds.d.ts.map +1 -1
  164. package/dist/bridges/holds.js +117 -23
  165. package/dist/bridges/holds.js.map +1 -1
  166. package/dist/bridges/notices.d.ts.map +1 -1
  167. package/dist/bridges/notices.js +5 -5
  168. package/dist/bridges/notices.js.map +1 -1
  169. package/dist/bridges/relation-eval.d.ts +4 -4
  170. package/dist/bridges/relation-eval.d.ts.map +1 -1
  171. package/dist/bridges/relation-eval.js +15 -16
  172. package/dist/bridges/relation-eval.js.map +1 -1
  173. package/dist/bridges/sensitivity.d.ts.map +1 -1
  174. package/dist/bridges/sensitivity.js +3 -3
  175. package/dist/bridges/sensitivity.js.map +1 -1
  176. package/dist/bridges/validity.d.ts +33 -0
  177. package/dist/bridges/validity.d.ts.map +1 -0
  178. package/dist/bridges/validity.js +67 -0
  179. package/dist/bridges/validity.js.map +1 -0
  180. package/dist/canonical/entries/atomic.js +1 -3
  181. package/dist/canonical/entries/atomic.js.map +1 -1
  182. package/dist/canonical/entries/condensed-matter.d.ts.map +1 -1
  183. package/dist/canonical/entries/condensed-matter.js +4 -5
  184. package/dist/canonical/entries/condensed-matter.js.map +1 -1
  185. package/dist/canonical/entries/dimensional-classics.d.ts.map +1 -1
  186. package/dist/canonical/entries/dimensional-classics.js +3 -4
  187. package/dist/canonical/entries/dimensional-classics.js.map +1 -1
  188. package/dist/canonical/entries/electromagnetism.d.ts.map +1 -1
  189. package/dist/canonical/entries/electromagnetism.js +4 -10
  190. package/dist/canonical/entries/electromagnetism.js.map +1 -1
  191. package/dist/canonical/entries/fluids-waves.d.ts.map +1 -1
  192. package/dist/canonical/entries/fluids-waves.js +3 -7
  193. package/dist/canonical/entries/fluids-waves.js.map +1 -1
  194. package/dist/canonical/entries/mechanics.d.ts.map +1 -1
  195. package/dist/canonical/entries/mechanics.js +4 -6
  196. package/dist/canonical/entries/mechanics.js.map +1 -1
  197. package/dist/canonical/entries/nonmonomial.d.ts.map +1 -1
  198. package/dist/canonical/entries/nonmonomial.js +9 -17
  199. package/dist/canonical/entries/nonmonomial.js.map +1 -1
  200. package/dist/canonical/entries/relativity.d.ts.map +1 -1
  201. package/dist/canonical/entries/relativity.js +6 -6
  202. package/dist/canonical/entries/relativity.js.map +1 -1
  203. package/dist/canonical/entries/thermo-nuclear-cosmo.d.ts.map +1 -1
  204. package/dist/canonical/entries/thermo-nuclear-cosmo.js +6 -10
  205. package/dist/canonical/entries/thermo-nuclear-cosmo.js.map +1 -1
  206. package/dist/canonical/fixed-points.d.ts +94 -0
  207. package/dist/canonical/fixed-points.d.ts.map +1 -0
  208. package/dist/canonical/fixed-points.js +81 -0
  209. package/dist/canonical/fixed-points.js.map +1 -0
  210. package/dist/canonical/linkage.d.ts.map +1 -1
  211. package/dist/canonical/linkage.js +25 -44
  212. package/dist/canonical/linkage.js.map +1 -1
  213. package/dist/canonical/normal-form.d.ts.map +1 -1
  214. package/dist/canonical/normal-form.js +5 -11
  215. package/dist/canonical/normal-form.js.map +1 -1
  216. package/dist/canonical/structural.d.ts +21 -21
  217. package/dist/canonical/structural.d.ts.map +1 -1
  218. package/dist/canonical/structural.js +40 -19
  219. package/dist/canonical/structural.js.map +1 -1
  220. package/dist/cases/brownian-sphere.d.ts +3 -3
  221. package/dist/cases/brownian-sphere.d.ts.map +1 -1
  222. package/dist/cases/brownian-sphere.js +6 -5
  223. package/dist/cases/brownian-sphere.js.map +1 -1
  224. package/dist/cases/damped-resonator.d.ts.map +1 -1
  225. package/dist/cases/damped-resonator.js +6 -9
  226. package/dist/cases/damped-resonator.js.map +1 -1
  227. package/dist/cases/kepler-rv.d.ts +1 -1
  228. package/dist/cases/kepler-rv.d.ts.map +1 -1
  229. package/dist/cases/kepler-rv.js +3 -2
  230. package/dist/cases/kepler-rv.js.map +1 -1
  231. package/dist/cases/lumped-cooling.d.ts +8 -3
  232. package/dist/cases/lumped-cooling.d.ts.map +1 -1
  233. package/dist/cases/lumped-cooling.js +21 -23
  234. package/dist/cases/lumped-cooling.js.map +1 -1
  235. package/dist/cases/quadrature.d.ts +7 -9
  236. package/dist/cases/quadrature.d.ts.map +1 -1
  237. package/dist/cases/quadrature.js +28 -32
  238. package/dist/cases/quadrature.js.map +1 -1
  239. package/dist/cases/resistor-noise.js +4 -4
  240. package/dist/cases/resistor-noise.js.map +1 -1
  241. package/dist/cases/skin-depth.d.ts +0 -4
  242. package/dist/cases/skin-depth.d.ts.map +1 -1
  243. package/dist/cases/skin-depth.js +3 -7
  244. package/dist/cases/skin-depth.js.map +1 -1
  245. package/dist/cli/args.d.ts +23 -1
  246. package/dist/cli/args.d.ts.map +1 -1
  247. package/dist/cli/args.js +30 -8
  248. package/dist/cli/args.js.map +1 -1
  249. package/dist/cli/bindings.d.ts.map +1 -1
  250. package/dist/cli/bindings.js +5 -4
  251. package/dist/cli/bindings.js.map +1 -1
  252. package/dist/cli/command.d.ts +8 -1
  253. package/dist/cli/command.d.ts.map +1 -1
  254. package/dist/cli/command.js.map +1 -1
  255. package/dist/cli/commands/_atlas-map.d.ts +0 -9
  256. package/dist/cli/commands/_atlas-map.d.ts.map +1 -1
  257. package/dist/cli/commands/_atlas-map.js +8 -18
  258. package/dist/cli/commands/_atlas-map.js.map +1 -1
  259. package/dist/cli/commands/_atlas-route.d.ts.map +1 -1
  260. package/dist/cli/commands/_atlas-route.js +6 -2
  261. package/dist/cli/commands/_atlas-route.js.map +1 -1
  262. package/dist/cli/commands/_discovery-opts.d.ts.map +1 -1
  263. package/dist/cli/commands/_discovery-opts.js +8 -9
  264. package/dist/cli/commands/_discovery-opts.js.map +1 -1
  265. package/dist/cli/commands/atlas.d.ts.map +1 -1
  266. package/dist/cli/commands/atlas.js +8 -5
  267. package/dist/cli/commands/atlas.js.map +1 -1
  268. package/dist/cli/commands/audit.d.ts.map +1 -1
  269. package/dist/cli/commands/audit.js +8 -1
  270. package/dist/cli/commands/audit.js.map +1 -1
  271. package/dist/cli/commands/axes.d.ts.map +1 -1
  272. package/dist/cli/commands/axes.js +20 -1
  273. package/dist/cli/commands/axes.js.map +1 -1
  274. package/dist/cli/commands/confront.d.ts.map +1 -1
  275. package/dist/cli/commands/confront.js +8 -14
  276. package/dist/cli/commands/confront.js.map +1 -1
  277. package/dist/cli/commands/derive.d.ts.map +1 -1
  278. package/dist/cli/commands/derive.js +22 -22
  279. package/dist/cli/commands/derive.js.map +1 -1
  280. package/dist/cli/commands/discover.d.ts.map +1 -1
  281. package/dist/cli/commands/discover.js +6 -2
  282. package/dist/cli/commands/discover.js.map +1 -1
  283. package/dist/cli/commands/eval.d.ts.map +1 -1
  284. package/dist/cli/commands/eval.js +1 -0
  285. package/dist/cli/commands/eval.js.map +1 -1
  286. package/dist/cli/commands/evaluate.d.ts.map +1 -1
  287. package/dist/cli/commands/evaluate.js +65 -37
  288. package/dist/cli/commands/evaluate.js.map +1 -1
  289. package/dist/cli/commands/explain.d.ts.map +1 -1
  290. package/dist/cli/commands/explain.js +2 -1
  291. package/dist/cli/commands/explain.js.map +1 -1
  292. package/dist/cli/commands/ground.d.ts.map +1 -1
  293. package/dist/cli/commands/ground.js +1 -0
  294. package/dist/cli/commands/ground.js.map +1 -1
  295. package/dist/cli/commands/map.d.ts.map +1 -1
  296. package/dist/cli/commands/map.js +75 -5
  297. package/dist/cli/commands/map.js.map +1 -1
  298. package/dist/cli/commands/metric.d.ts.map +1 -1
  299. package/dist/cli/commands/metric.js +12 -9
  300. package/dist/cli/commands/metric.js.map +1 -1
  301. package/dist/cli/commands/path.d.ts +10 -0
  302. package/dist/cli/commands/path.d.ts.map +1 -1
  303. package/dist/cli/commands/path.js +25 -3
  304. package/dist/cli/commands/path.js.map +1 -1
  305. package/dist/cli/commands/probe.d.ts.map +1 -1
  306. package/dist/cli/commands/probe.js +59 -16
  307. package/dist/cli/commands/probe.js.map +1 -1
  308. package/dist/cli/commands/regime.d.ts.map +1 -1
  309. package/dist/cli/commands/regime.js +1 -0
  310. package/dist/cli/commands/regime.js.map +1 -1
  311. package/dist/cli/commands/retrieve.d.ts.map +1 -1
  312. package/dist/cli/commands/retrieve.js +1 -0
  313. package/dist/cli/commands/retrieve.js.map +1 -1
  314. package/dist/cli/commands/search.d.ts.map +1 -1
  315. package/dist/cli/commands/search.js +1 -0
  316. package/dist/cli/commands/search.js.map +1 -1
  317. package/dist/cli/commands/symbolic.d.ts.map +1 -1
  318. package/dist/cli/commands/symbolic.js +19 -28
  319. package/dist/cli/commands/symbolic.js.map +1 -1
  320. package/dist/cli/commands/testplan.d.ts.map +1 -1
  321. package/dist/cli/commands/testplan.js +4 -2
  322. package/dist/cli/commands/testplan.js.map +1 -1
  323. package/dist/cli/expr-print.d.ts +0 -2
  324. package/dist/cli/expr-print.d.ts.map +1 -1
  325. package/dist/cli/expr-print.js +7 -31
  326. package/dist/cli/expr-print.js.map +1 -1
  327. package/dist/cli/main.d.ts +7 -0
  328. package/dist/cli/main.d.ts.map +1 -1
  329. package/dist/cli/main.js +18 -3
  330. package/dist/cli/main.js.map +1 -1
  331. package/dist/cli/numeric-flag.d.ts +12 -0
  332. package/dist/cli/numeric-flag.d.ts.map +1 -0
  333. package/dist/cli/numeric-flag.js +44 -0
  334. package/dist/cli/numeric-flag.js.map +1 -0
  335. package/dist/cli/output.d.ts +20 -0
  336. package/dist/cli/output.d.ts.map +1 -1
  337. package/dist/cli/output.js +15 -0
  338. package/dist/cli/output.js.map +1 -1
  339. package/dist/cli/record-reach.js +2 -2
  340. package/dist/cli/record-reach.js.map +1 -1
  341. package/dist/cli/record-tables.d.ts.map +1 -1
  342. package/dist/cli/record-tables.js +6 -5
  343. package/dist/cli/record-tables.js.map +1 -1
  344. package/dist/cli/record.d.ts +1 -5
  345. package/dist/cli/record.d.ts.map +1 -1
  346. package/dist/cli/record.js +9 -8
  347. package/dist/cli/record.js.map +1 -1
  348. package/dist/cli/search-index.d.ts.map +1 -1
  349. package/dist/cli/search-index.js +7 -6
  350. package/dist/cli/search-index.js.map +1 -1
  351. package/dist/cli/statuses.d.ts +0 -2
  352. package/dist/cli/statuses.d.ts.map +1 -1
  353. package/dist/cli/statuses.js +0 -7
  354. package/dist/cli/statuses.js.map +1 -1
  355. package/dist/cli/stored-results.d.ts +7 -0
  356. package/dist/cli/stored-results.d.ts.map +1 -0
  357. package/dist/cli/stored-results.js +23 -0
  358. package/dist/cli/stored-results.js.map +1 -0
  359. package/dist/cli/version.d.ts.map +1 -1
  360. package/dist/cli/version.js +7 -5
  361. package/dist/cli/version.js.map +1 -1
  362. package/dist/cli-api.d.ts +34 -5
  363. package/dist/cli-api.d.ts.map +1 -1
  364. package/dist/cli-api.js +28 -4
  365. package/dist/cli-api.js.map +1 -1
  366. package/dist/composition/algebraic-equivalence.d.ts +43 -0
  367. package/dist/composition/algebraic-equivalence.d.ts.map +1 -0
  368. package/dist/composition/algebraic-equivalence.js +115 -0
  369. package/dist/composition/algebraic-equivalence.js.map +1 -0
  370. package/dist/composition/axes.d.ts +0 -6
  371. package/dist/composition/axes.d.ts.map +1 -1
  372. package/dist/composition/axes.js +6 -6
  373. package/dist/composition/axes.js.map +1 -1
  374. package/dist/composition/axis-audit.d.ts +47 -20
  375. package/dist/composition/axis-audit.d.ts.map +1 -1
  376. package/dist/composition/axis-audit.js +82 -9
  377. package/dist/composition/axis-audit.js.map +1 -1
  378. package/dist/composition/bridge-analysis.d.ts +17 -0
  379. package/dist/composition/bridge-analysis.d.ts.map +1 -1
  380. package/dist/composition/bridge-analysis.js +102 -55
  381. package/dist/composition/bridge-analysis.js.map +1 -1
  382. package/dist/composition/canonical-compare.d.ts +40 -0
  383. package/dist/composition/canonical-compare.d.ts.map +1 -1
  384. package/dist/composition/canonical-compare.js +122 -24
  385. package/dist/composition/canonical-compare.js.map +1 -1
  386. package/dist/composition/canonical-graph.d.ts +1 -1
  387. package/dist/composition/canonical-graph.d.ts.map +1 -1
  388. package/dist/composition/canonical-graph.js +9 -36
  389. package/dist/composition/canonical-graph.js.map +1 -1
  390. package/dist/composition/canonical-json.js +2 -2
  391. package/dist/composition/canonical-json.js.map +1 -1
  392. package/dist/composition/catalog-graph.d.ts.map +1 -1
  393. package/dist/composition/catalog-graph.js +2 -5
  394. package/dist/composition/catalog-graph.js.map +1 -1
  395. package/dist/composition/chain-candidate.d.ts +8 -0
  396. package/dist/composition/chain-candidate.d.ts.map +1 -1
  397. package/dist/composition/chain-candidate.js +9 -2
  398. package/dist/composition/chain-candidate.js.map +1 -1
  399. package/dist/composition/chain-match.d.ts +6 -3
  400. package/dist/composition/chain-match.d.ts.map +1 -1
  401. package/dist/composition/chain-match.js +4 -1
  402. package/dist/composition/chain-match.js.map +1 -1
  403. package/dist/composition/chain-result.d.ts.map +1 -1
  404. package/dist/composition/chain-result.js +2 -14
  405. package/dist/composition/chain-result.js.map +1 -1
  406. package/dist/composition/compose-symbolic.d.ts.map +1 -1
  407. package/dist/composition/compose-symbolic.js +3 -2
  408. package/dist/composition/compose-symbolic.js.map +1 -1
  409. package/dist/composition/compose.d.ts.map +1 -1
  410. package/dist/composition/compose.js +13 -5
  411. package/dist/composition/compose.js.map +1 -1
  412. package/dist/composition/composition-recovery.d.ts.map +1 -1
  413. package/dist/composition/composition-recovery.js +4 -7
  414. package/dist/composition/composition-recovery.js.map +1 -1
  415. package/dist/composition/discovery.d.ts +56 -0
  416. package/dist/composition/discovery.d.ts.map +1 -1
  417. package/dist/composition/discovery.js +114 -60
  418. package/dist/composition/discovery.js.map +1 -1
  419. package/dist/composition/edge.d.ts +21 -2
  420. package/dist/composition/edge.d.ts.map +1 -1
  421. package/dist/composition/edge.js +23 -1
  422. package/dist/composition/edge.js.map +1 -1
  423. package/dist/composition/enumerate.d.ts.map +1 -1
  424. package/dist/composition/enumerate.js +18 -3
  425. package/dist/composition/enumerate.js.map +1 -1
  426. package/dist/composition/evaluate-relation.d.ts +35 -11
  427. package/dist/composition/evaluate-relation.d.ts.map +1 -1
  428. package/dist/composition/evaluate-relation.js +60 -39
  429. package/dist/composition/evaluate-relation.js.map +1 -1
  430. package/dist/composition/explain.d.ts +3 -12
  431. package/dist/composition/explain.d.ts.map +1 -1
  432. package/dist/composition/explain.js +7 -20
  433. package/dist/composition/explain.js.map +1 -1
  434. package/dist/composition/expr-eval.d.ts.map +1 -1
  435. package/dist/composition/expr-eval.js +2 -11
  436. package/dist/composition/expr-eval.js.map +1 -1
  437. package/dist/composition/expr-simplify.d.ts +16 -0
  438. package/dist/composition/expr-simplify.d.ts.map +1 -1
  439. package/dist/composition/expr-simplify.js +15 -20
  440. package/dist/composition/expr-simplify.js.map +1 -1
  441. package/dist/composition/formula-shape.d.ts +23 -4
  442. package/dist/composition/formula-shape.d.ts.map +1 -1
  443. package/dist/composition/formula-shape.js +57 -17
  444. package/dist/composition/formula-shape.js.map +1 -1
  445. package/dist/composition/graph-structure.d.ts +98 -0
  446. package/dist/composition/graph-structure.d.ts.map +1 -0
  447. package/dist/composition/graph-structure.js +167 -0
  448. package/dist/composition/graph-structure.js.map +1 -0
  449. package/dist/composition/graph-viz-svg.d.ts.map +1 -1
  450. package/dist/composition/graph-viz-svg.js +1 -1
  451. package/dist/composition/graph-viz-svg.js.map +1 -1
  452. package/dist/composition/graph-viz.d.ts.map +1 -1
  453. package/dist/composition/graph-viz.js +8 -37
  454. package/dist/composition/graph-viz.js.map +1 -1
  455. package/dist/composition/identifiability.d.ts +91 -4
  456. package/dist/composition/identifiability.d.ts.map +1 -1
  457. package/dist/composition/identifiability.js +363 -6
  458. package/dist/composition/identifiability.js.map +1 -1
  459. package/dist/composition/index.d.ts +8 -4
  460. package/dist/composition/index.d.ts.map +1 -1
  461. package/dist/composition/index.js +3 -2
  462. package/dist/composition/index.js.map +1 -1
  463. package/dist/composition/mathts-quiet.d.ts +4 -3
  464. package/dist/composition/mathts-quiet.d.ts.map +1 -1
  465. package/dist/composition/mathts-quiet.js +4 -3
  466. package/dist/composition/mathts-quiet.js.map +1 -1
  467. package/dist/composition/mathts-scalar-symbols.d.ts.map +1 -1
  468. package/dist/composition/mathts-scalar-symbols.js +2 -1
  469. package/dist/composition/mathts-scalar-symbols.js.map +1 -1
  470. package/dist/composition/probe/corpus.d.ts +4 -2
  471. package/dist/composition/probe/corpus.d.ts.map +1 -1
  472. package/dist/composition/probe/corpus.js +20 -9
  473. package/dist/composition/probe/corpus.js.map +1 -1
  474. package/dist/composition/probe/dataset.d.ts +17 -0
  475. package/dist/composition/probe/dataset.d.ts.map +1 -1
  476. package/dist/composition/probe/dataset.js +95 -50
  477. package/dist/composition/probe/dataset.js.map +1 -1
  478. package/dist/composition/probe/experiment-design.d.ts +5 -1
  479. package/dist/composition/probe/experiment-design.d.ts.map +1 -1
  480. package/dist/composition/probe/experiment-design.js +44 -24
  481. package/dist/composition/probe/experiment-design.js.map +1 -1
  482. package/dist/composition/probe/falsify.d.ts.map +1 -1
  483. package/dist/composition/probe/falsify.js +2 -0
  484. package/dist/composition/probe/falsify.js.map +1 -1
  485. package/dist/composition/probe/fit.d.ts +6 -0
  486. package/dist/composition/probe/fit.d.ts.map +1 -1
  487. package/dist/composition/probe/fit.js +46 -22
  488. package/dist/composition/probe/fit.js.map +1 -1
  489. package/dist/composition/probe/frontier.d.ts.map +1 -1
  490. package/dist/composition/probe/frontier.js +33 -15
  491. package/dist/composition/probe/frontier.js.map +1 -1
  492. package/dist/composition/probe/generator.d.ts +27 -1
  493. package/dist/composition/probe/generator.d.ts.map +1 -1
  494. package/dist/composition/probe/generator.js +53 -30
  495. package/dist/composition/probe/generator.js.map +1 -1
  496. package/dist/composition/probe/index.d.ts +14 -0
  497. package/dist/composition/probe/index.d.ts.map +1 -1
  498. package/dist/composition/probe/index.js +6 -0
  499. package/dist/composition/probe/index.js.map +1 -1
  500. package/dist/composition/probe/limits.d.ts +24 -1
  501. package/dist/composition/probe/limits.d.ts.map +1 -1
  502. package/dist/composition/probe/limits.js +53 -11
  503. package/dist/composition/probe/limits.js.map +1 -1
  504. package/dist/composition/probe/pipeline.d.ts.map +1 -1
  505. package/dist/composition/probe/pipeline.js +10 -4
  506. package/dist/composition/probe/pipeline.js.map +1 -1
  507. package/dist/composition/probe/power-law.d.ts +121 -0
  508. package/dist/composition/probe/power-law.d.ts.map +1 -0
  509. package/dist/composition/probe/power-law.js +255 -0
  510. package/dist/composition/probe/power-law.js.map +1 -0
  511. package/dist/composition/probe/problem.d.ts +7 -4
  512. package/dist/composition/probe/problem.d.ts.map +1 -1
  513. package/dist/composition/probe/problem.js +177 -49
  514. package/dist/composition/probe/problem.js.map +1 -1
  515. package/dist/composition/probe/report.js +1 -1
  516. package/dist/composition/probe/report.js.map +1 -1
  517. package/dist/composition/probe/residual.d.ts +6 -1
  518. package/dist/composition/probe/residual.d.ts.map +1 -1
  519. package/dist/composition/probe/residual.js +9 -7
  520. package/dist/composition/probe/residual.js.map +1 -1
  521. package/dist/composition/probe/structure.d.ts +82 -17
  522. package/dist/composition/probe/structure.d.ts.map +1 -1
  523. package/dist/composition/probe/structure.js +129 -55
  524. package/dist/composition/probe/structure.js.map +1 -1
  525. package/dist/composition/probe/study.d.ts +31 -9
  526. package/dist/composition/probe/study.d.ts.map +1 -1
  527. package/dist/composition/probe/study.js +236 -181
  528. package/dist/composition/probe/study.js.map +1 -1
  529. package/dist/composition/probe/t-tail.d.ts +17 -0
  530. package/dist/composition/probe/t-tail.d.ts.map +1 -0
  531. package/dist/composition/probe/t-tail.js +32 -0
  532. package/dist/composition/probe/t-tail.js.map +1 -0
  533. package/dist/composition/probe/types.d.ts +3 -0
  534. package/dist/composition/probe/types.d.ts.map +1 -1
  535. package/dist/composition/probe/types.js.map +1 -1
  536. package/dist/composition/proposed-bridges.d.ts +41 -10
  537. package/dist/composition/proposed-bridges.d.ts.map +1 -1
  538. package/dist/composition/proposed-bridges.js +100 -55
  539. package/dist/composition/proposed-bridges.js.map +1 -1
  540. package/dist/composition/quantity-clusters.d.ts +48 -0
  541. package/dist/composition/quantity-clusters.d.ts.map +1 -0
  542. package/dist/composition/quantity-clusters.js +98 -0
  543. package/dist/composition/quantity-clusters.js.map +1 -0
  544. package/dist/composition/rational-exponent.d.ts +40 -0
  545. package/dist/composition/rational-exponent.d.ts.map +1 -0
  546. package/dist/composition/rational-exponent.js +65 -0
  547. package/dist/composition/rational-exponent.js.map +1 -0
  548. package/dist/composition/representative-values.d.ts +22 -0
  549. package/dist/composition/representative-values.d.ts.map +1 -1
  550. package/dist/composition/representative-values.js +23 -0
  551. package/dist/composition/representative-values.js.map +1 -1
  552. package/dist/composition/retrodiction.d.ts.map +1 -1
  553. package/dist/composition/retrodiction.js +2 -1
  554. package/dist/composition/retrodiction.js.map +1 -1
  555. package/dist/composition/user-equation.d.ts.map +1 -1
  556. package/dist/composition/user-equation.js +2 -2
  557. package/dist/composition/user-equation.js.map +1 -1
  558. package/dist/core/assignment.d.ts +19 -0
  559. package/dist/core/assignment.d.ts.map +1 -0
  560. package/dist/core/assignment.js +19 -0
  561. package/dist/core/assignment.js.map +1 -0
  562. package/dist/core/compare.d.ts +32 -0
  563. package/dist/core/compare.d.ts.map +1 -0
  564. package/dist/core/compare.js +46 -0
  565. package/dist/core/compare.js.map +1 -0
  566. package/dist/core/constants.d.ts +30 -30
  567. package/dist/core/constants.d.ts.map +1 -1
  568. package/dist/core/constants.js +47 -30
  569. package/dist/core/constants.js.map +1 -1
  570. package/dist/core/data-file.d.ts +7 -0
  571. package/dist/core/data-file.d.ts.map +1 -1
  572. package/dist/core/data-file.js +17 -0
  573. package/dist/core/data-file.js.map +1 -1
  574. package/dist/core/format.d.ts +36 -0
  575. package/dist/core/format.d.ts.map +1 -0
  576. package/dist/core/format.js +39 -0
  577. package/dist/core/format.js.map +1 -0
  578. package/dist/core/hash.d.ts +14 -0
  579. package/dist/core/hash.d.ts.map +1 -0
  580. package/dist/core/hash.js +17 -0
  581. package/dist/core/hash.js.map +1 -0
  582. package/dist/core/json-schema.d.ts +2 -0
  583. package/dist/core/json-schema.d.ts.map +1 -1
  584. package/dist/core/json-schema.js +14 -13
  585. package/dist/core/json-schema.js.map +1 -1
  586. package/dist/core/labeled-tensor.d.ts.map +1 -1
  587. package/dist/core/labeled-tensor.js +0 -8
  588. package/dist/core/labeled-tensor.js.map +1 -1
  589. package/dist/core/mathts-read.d.ts +25 -0
  590. package/dist/core/mathts-read.d.ts.map +1 -0
  591. package/dist/core/mathts-read.js +51 -0
  592. package/dist/core/mathts-read.js.map +1 -0
  593. package/dist/core/tensor.d.ts.map +1 -1
  594. package/dist/core/tensor.js +24 -0
  595. package/dist/core/tensor.js.map +1 -1
  596. package/dist/core/types.d.ts +5 -5
  597. package/dist/diff/bridge-gradient.d.ts +19 -6
  598. package/dist/diff/bridge-gradient.d.ts.map +1 -1
  599. package/dist/diff/bridge-gradient.js +19 -11
  600. package/dist/diff/bridge-gradient.js.map +1 -1
  601. package/dist/diff/bridge-specs.d.ts.map +1 -1
  602. package/dist/diff/bridge-specs.js +3 -0
  603. package/dist/diff/bridge-specs.js.map +1 -1
  604. package/dist/dimensional/algebra.d.ts +18 -0
  605. package/dist/dimensional/algebra.d.ts.map +1 -1
  606. package/dist/dimensional/algebra.js +41 -1
  607. package/dist/dimensional/algebra.js.map +1 -1
  608. package/dist/dimensional/ast-builders.d.ts +7 -0
  609. package/dist/dimensional/ast-builders.d.ts.map +1 -1
  610. package/dist/dimensional/ast-builders.js +11 -0
  611. package/dist/dimensional/ast-builders.js.map +1 -1
  612. package/dist/dimensional/ast-leaves.d.ts +81 -0
  613. package/dist/dimensional/ast-leaves.d.ts.map +1 -0
  614. package/dist/dimensional/ast-leaves.js +146 -0
  615. package/dist/dimensional/ast-leaves.js.map +1 -0
  616. package/dist/dimensional/buckingham.d.ts.map +1 -1
  617. package/dist/dimensional/buckingham.js +15 -27
  618. package/dist/dimensional/buckingham.js.map +1 -1
  619. package/dist/dimensional/constant-rows.js +9 -9
  620. package/dist/dimensional/constant-rows.js.map +1 -1
  621. package/dist/dimensional/dimension-inference.d.ts.map +1 -1
  622. package/dist/dimensional/dimension-inference.js +1 -2
  623. package/dist/dimensional/dimension-inference.js.map +1 -1
  624. package/dist/dimensional/errors.d.ts +1 -1
  625. package/dist/dimensional/errors.d.ts.map +1 -1
  626. package/dist/dimensional/errors.js +1 -15
  627. package/dist/dimensional/errors.js.map +1 -1
  628. package/dist/dimensional/exact-scale.d.ts +0 -17
  629. package/dist/dimensional/exact-scale.d.ts.map +1 -1
  630. package/dist/dimensional/exact-scale.js +8 -8
  631. package/dist/dimensional/exact-scale.js.map +1 -1
  632. package/dist/dimensional/gauge-field.d.ts.map +1 -1
  633. package/dist/dimensional/gauge-field.js +2 -2
  634. package/dist/dimensional/gauge-field.js.map +1 -1
  635. package/dist/dimensional/hyphen-names.d.ts +12 -2
  636. package/dist/dimensional/hyphen-names.d.ts.map +1 -1
  637. package/dist/dimensional/hyphen-names.js +44 -19
  638. package/dist/dimensional/hyphen-names.js.map +1 -1
  639. package/dist/dimensional/metric.d.ts.map +1 -1
  640. package/dist/dimensional/metric.js +0 -1
  641. package/dist/dimensional/metric.js.map +1 -1
  642. package/dist/dimensional/symbolic-constants.d.ts +9 -0
  643. package/dist/dimensional/symbolic-constants.d.ts.map +1 -1
  644. package/dist/dimensional/symbolic-constants.js +13 -1
  645. package/dist/dimensional/symbolic-constants.js.map +1 -1
  646. package/dist/dimensional/types.d.ts +36 -0
  647. package/dist/dimensional/types.d.ts.map +1 -1
  648. package/dist/dimensional/types.js +45 -7
  649. package/dist/dimensional/types.js.map +1 -1
  650. package/dist/dimensional/unit-data.js +2 -2
  651. package/dist/dimensional/unit-data.js.map +1 -1
  652. package/dist/index.d.ts +9 -3
  653. package/dist/index.d.ts.map +1 -1
  654. package/dist/index.js +10 -4
  655. package/dist/index.js.map +1 -1
  656. package/dist/numerical/christoffel-flat.d.ts.map +1 -1
  657. package/dist/numerical/christoffel-flat.js +3 -2
  658. package/dist/numerical/christoffel-flat.js.map +1 -1
  659. package/dist/numerical/covariant-eikonal.d.ts.map +1 -1
  660. package/dist/numerical/covariant-eikonal.js +34 -11
  661. package/dist/numerical/covariant-eikonal.js.map +1 -1
  662. package/dist/numerical/curvature-lowering-helpers.js +3 -2
  663. package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
  664. package/dist/numerical/errors.d.ts.map +1 -1
  665. package/dist/numerical/errors.js +0 -3
  666. package/dist/numerical/errors.js.map +1 -1
  667. package/dist/numerical/finite-difference.d.ts +22 -0
  668. package/dist/numerical/finite-difference.d.ts.map +1 -0
  669. package/dist/numerical/finite-difference.js +27 -0
  670. package/dist/numerical/finite-difference.js.map +1 -0
  671. package/dist/numerical/geodesic-integrator.d.ts.map +1 -1
  672. package/dist/numerical/geodesic-integrator.js +22 -14
  673. package/dist/numerical/geodesic-integrator.js.map +1 -1
  674. package/dist/numerical/geometrized.d.ts.map +1 -1
  675. package/dist/numerical/geometrized.js +0 -1
  676. package/dist/numerical/geometrized.js.map +1 -1
  677. package/dist/numerical/mathts-engine.d.ts.map +1 -1
  678. package/dist/numerical/mathts-engine.js +10 -24
  679. package/dist/numerical/mathts-engine.js.map +1 -1
  680. package/dist/numerical/metric-inverse.d.ts.map +1 -1
  681. package/dist/numerical/metric-inverse.js +83 -46
  682. package/dist/numerical/metric-inverse.js.map +1 -1
  683. package/dist/numerical/null-ray-integrator.d.ts +2 -1
  684. package/dist/numerical/null-ray-integrator.d.ts.map +1 -1
  685. package/dist/numerical/null-ray-integrator.js +12 -12
  686. package/dist/numerical/null-ray-integrator.js.map +1 -1
  687. package/dist/numerical/painleve-gullstrand-metric.js +2 -2
  688. package/dist/numerical/painleve-gullstrand-metric.js.map +1 -1
  689. package/dist/numerical/perihelion-finder.d.ts +0 -36
  690. package/dist/numerical/perihelion-finder.d.ts.map +1 -1
  691. package/dist/numerical/perihelion-finder.js +41 -87
  692. package/dist/numerical/perihelion-finder.js.map +1 -1
  693. package/dist/numerical/quadrature.d.ts.map +1 -1
  694. package/dist/numerical/quadrature.js +8 -10
  695. package/dist/numerical/quadrature.js.map +1 -1
  696. package/dist/numerical/rk4-trajectory.d.ts +10 -0
  697. package/dist/numerical/rk4-trajectory.d.ts.map +1 -0
  698. package/dist/numerical/rk4-trajectory.js +37 -0
  699. package/dist/numerical/rk4-trajectory.js.map +1 -0
  700. package/dist/numerical/schwarzschild.d.ts +14 -0
  701. package/dist/numerical/schwarzschild.d.ts.map +1 -0
  702. package/dist/numerical/schwarzschild.js +17 -0
  703. package/dist/numerical/schwarzschild.js.map +1 -0
  704. package/dist/numerical/spacetime-metrics.d.ts +12 -0
  705. package/dist/numerical/spacetime-metrics.d.ts.map +1 -1
  706. package/dist/numerical/spacetime-metrics.js +72 -56
  707. package/dist/numerical/spacetime-metrics.js.map +1 -1
  708. package/dist/numerical/statistics.d.ts +24 -0
  709. package/dist/numerical/statistics.d.ts.map +1 -0
  710. package/dist/numerical/statistics.js +52 -0
  711. package/dist/numerical/statistics.js.map +1 -0
  712. package/dist/numerical/tensor-engine.d.ts +21 -0
  713. package/dist/numerical/tensor-engine.d.ts.map +1 -1
  714. package/dist/numerical/tensor-engine.js +12 -0
  715. package/dist/numerical/tensor-engine.js.map +1 -1
  716. package/dist/relations/regime.d.ts +10 -0
  717. package/dist/relations/regime.d.ts.map +1 -1
  718. package/dist/relations/regime.js +18 -1
  719. package/dist/relations/regime.js.map +1 -1
  720. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"limits.js","sourceRoot":"","sources":["../../../src/composition/probe/limits.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Declared-limit checks for probe candidates.\n *\n * A failed limit is **not automatically fatal**. It is fatal only when the\n * candidate claims the domain in which the limit fails.\n *\n * @internal\n */\n\nimport type { ExprNode } from '../../dimensional/ast-types.js';\nimport type { DeclaredLimit, ProbeDataset } from './types.js';\nimport { evalExpr } from '../expr-eval.js';\n\nexport interface LimitCheckResult {\n readonly id: string;\n readonly passed: boolean;\n readonly claimedDomain: boolean;\n readonly fatal: boolean;\n readonly detail: string;\n}\n\n/**\n * Evaluate `prefactor · expr` RMSE on `dataset`. When the candidate does not\n * claim `limit.regime`, a failure is recorded but not fatal.\n *\n * @internal\n */\nexport function checkDeclaredLimit(\n expr: ExprNode,\n dataset: ProbeDataset,\n prefactor: number,\n limit: DeclaredLimit,\n claimsDomain: boolean,\n): LimitCheckResult {\n if (dataset.rows.length === 0) {\n return {\n id: limit.id,\n passed: true,\n claimedDomain: claimsDomain,\n fatal: false,\n detail: `no observations for declared-limit ${limit.id}`,\n };\n }\n let sumSq = 0;\n let n = 0;\n for (const row of dataset.rows) {\n let predicted: number;\n try {\n predicted = prefactor * evalExpr(expr, row);\n } catch {\n continue;\n }\n const observed = row[dataset.observable];\n if (!Number.isFinite(predicted) || observed == null || !Number.isFinite(observed)) continue;\n const err = predicted - observed;\n sumSq += err * err;\n n += 1;\n }\n const rmse = n === 0 ? Number.POSITIVE_INFINITY : Math.sqrt(sumSq / n);\n const scale = Math.max(\n ...dataset.rows.map((r) => Math.abs(r[dataset.observable] ?? 0)),\n 1e-12,\n );\n const passed = Number.isFinite(rmse) && rmse <= 0.5 * scale;\n const fatal = !passed && claimsDomain;\n return {\n id: limit.id,\n passed,\n claimedDomain: claimsDomain,\n fatal,\n detail: passed\n ? `limit ${limit.id} held (rmse=${rmse})`\n : `limit ${limit.id} failed (rmse=${rmse})${fatal ? ' — fatal because candidate claims this domain' : ' — not fatal (domain not claimed)'}`,\n };\n}\n\n/** Run every declared limit. @internal */\nexport function checkDeclaredLimits(\n expr: ExprNode,\n dataset: ProbeDataset | undefined,\n prefactor: number,\n limits: readonly DeclaredLimit[],\n claimedRegimes: Readonly<Record<string, string>> = {},\n): readonly LimitCheckResult[] {\n const rows = dataset ?? {\n id: 'empty',\n role: 'falsification-only' as const,\n rows: [],\n observable: '',\n schemaVersion: '0',\n };\n return limits.map((limit) => {\n const claimsDomain = Object.entries(limit.regime).every(\n ([k, v]) => claimedRegimes[k] === v,\n );\n return checkDeclaredLimit(expr, rows, prefactor, limit, claimsDomain);\n });\n}\n"]}
1
+ {"version":3,"file":"limits.js","sourceRoot":"","sources":["../../../src/composition/probe/limits.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Declared-limit checks for probe candidates.\n *\n * A failed limit is **not automatically fatal**. It is fatal only when the\n * candidate claims the domain in which the limit fails. A limit whose rows\n * the candidate mostly could not be evaluated on is **undecided**, which is\n * neither a pass nor a failure and is never fatal.\n *\n * @internal\n */\n\nimport { norm2 } from '@danielsimonjr/mathts-core';\nimport type { ExprNode } from '../../dimensional/ast-types.js';\nimport type { DeclaredLimit, ProbeDataset } from './types.js';\nimport { evalExpr } from '../expr-eval.js';\n\n/** What a limit check found: the limit held, failed, or could not be decided on these rows. @internal */\nexport type LimitOutcome = 'held' | 'failed' | 'undecided';\n\nexport interface LimitCheckResult {\n readonly id: string;\n /** `outcome === 'held'`. */\n readonly passed: boolean;\n readonly outcome: LimitOutcome;\n /** Rows the candidate was evaluated on (finite prediction and a finite observation). */\n readonly evaluated: number;\n /** Rows the candidate threw on, or predicted a non-finite value for, or that have no finite observation. */\n readonly skipped: number;\n readonly claimedDomain: boolean;\n readonly fatal: boolean;\n readonly detail: string;\n}\n\n/**\n * Evaluate `prefactor · expr` RMSE on `dataset`. When the candidate does not\n * claim `limit.regime`, a failure is recorded but not fatal.\n *\n * A row the candidate throws on, or predicts a non-finite value for, is\n * skipped and COUNTED. When more rows were skipped than evaluated (or none\n * could be evaluated), the outcome is `undecided`: a candidate that throws on\n * nine rows of ten is not judged on the tenth. That threshold, skipped >\n * evaluated, is a choice stated here, not a measured one.\n *\n * The pass rule is LOOSE by design: the limit holds when the RMSE over the\n * evaluated rows is at most half the largest |observation| of the dataset. It\n * catches a candidate that is wrong by its own scale in a regime, not one that\n * is wrong by a few percent; the holdout tolerance is the quantitative test.\n * The RMSE is core `norm2` of the residuals over √n (overflow-safe), so a\n * residual of 1e200 is a number, not `Infinity`.\n *\n * @internal\n */\nexport function checkDeclaredLimit(\n expr: ExprNode,\n dataset: ProbeDataset,\n prefactor: number,\n limit: DeclaredLimit,\n claimsDomain: boolean,\n): LimitCheckResult {\n if (dataset.rows.length === 0) {\n return {\n id: limit.id,\n passed: true,\n outcome: 'held',\n evaluated: 0,\n skipped: 0,\n claimedDomain: claimsDomain,\n fatal: false,\n detail: `no observations for declared-limit ${limit.id}`,\n };\n }\n const residuals: number[] = [];\n let skipped = 0;\n for (const row of dataset.rows) {\n let predicted: number;\n try {\n predicted = prefactor * evalExpr(expr, row);\n } catch {\n skipped += 1;\n continue;\n }\n const observed = row[dataset.observable];\n if (!Number.isFinite(predicted) || observed === undefined || !Number.isFinite(observed)) {\n skipped += 1;\n continue;\n }\n residuals.push(predicted - observed);\n }\n const evaluated = residuals.length;\n const total = dataset.rows.length;\n if (evaluated === 0 || skipped > evaluated) {\n return {\n id: limit.id,\n passed: false,\n outcome: 'undecided',\n evaluated,\n skipped,\n claimedDomain: claimsDomain,\n fatal: false,\n detail: `limit ${limit.id} undecided: ${skipped} of ${total} rows could not be evaluated (${evaluated} could); not judged on so few`,\n };\n }\n const rmse = norm2(residuals) / Math.sqrt(evaluated);\n // A reduce, not `Math.max(...rows)`: a spread of a large dataset overflows the call stack.\n const scale = dataset.rows.reduce((m, r) => {\n const v = r[dataset.observable];\n return v !== undefined && Number.isFinite(v) ? Math.max(m, Math.abs(v)) : m;\n }, 1e-12);\n const passed = Number.isFinite(rmse) && rmse <= 0.5 * scale;\n const fatal = !passed && claimsDomain;\n const rows = skipped > 0 ? ` on ${evaluated} of ${total} rows (${skipped} skipped)` : '';\n return {\n id: limit.id,\n passed,\n outcome: passed ? 'held' : 'failed',\n evaluated,\n skipped,\n claimedDomain: claimsDomain,\n fatal,\n detail: passed\n ? `limit ${limit.id} held (rmse=${rmse})${rows}`\n : `limit ${limit.id} failed (rmse=${rmse})${rows}${fatal ? ' — fatal because candidate claims this domain' : ' — not fatal (domain not claimed)'}`,\n };\n}\n\n/** Run every declared limit. @internal */\nexport function checkDeclaredLimits(\n expr: ExprNode,\n dataset: ProbeDataset | undefined,\n prefactor: number,\n limits: readonly DeclaredLimit[],\n claimedRegimes: Readonly<Record<string, string>> = {},\n): readonly LimitCheckResult[] {\n const rows = dataset ?? {\n id: 'empty',\n role: 'falsification-only' as const,\n rows: [],\n observable: '',\n schemaVersion: '0',\n };\n return limits.map((limit) => {\n const claimsDomain = Object.entries(limit.regime).every(\n ([k, v]) => claimedRegimes[k] === v,\n );\n return checkDeclaredLimit(expr, rows, prefactor, limit, claimsDomain);\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EACV,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAKpB,OAAO,EAIL,KAAK,sBAAsB,EAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAoB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAIpE,OAAO,EAA8B,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAGhF,uEAAuE;AACvE,eAAO,MAAM,kBAAkB,sEAAsE,CAAC;AAEtG;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAEhE;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACrD,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACrD,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;IACjE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC;IAClE;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;IACrE,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;CACvC;AA8GD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,iBAAiB,CAAC,CA+S5B"}
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EACV,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAKpB,OAAO,EAIL,KAAK,sBAAsB,EAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAoB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAIpE,OAAO,EAA8B,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAGhF,uEAAuE;AACvE,eAAO,MAAM,kBAAkB,sEAAsE,CAAC;AAEtG;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAEhE;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACrD,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACrD,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;IACjE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC;IAClE;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;IACrE,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;CACvC;AA8GD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,iBAAiB,CAAC,CAqT5B"}
@@ -12,7 +12,7 @@ import { validate } from '../../dimensional/validator.js';
12
12
  import { equals } from '../../dimensional/algebra.js';
13
13
  import { DEFAULT_HOLDOUT_TOL, DEFAULT_SEARCH_BUDGET, SCHEMA_VERSION } from './types.js';
14
14
  import { openBudget, budgetStopReason } from './search-budget.js';
15
- import { generateNative, nativeDetermination } from './generator.js';
15
+ import { generateNative, nativeDetermination, powerLawDetermination, powerLawWording } from './generator.js';
16
16
  import { fingerprintExpr, complexityOf, bodyExpression } from './fingerprint.js';
17
17
  import { compareToCorpus, corpusPrefactorNotes, corpusRelativeWording, } from './corpus.js';
18
18
  import { fitPrefactor } from './fit.js';
@@ -147,8 +147,14 @@ export async function runProbeSearch(problem, opts = {}) {
147
147
  const { unsearched } = nativeDetermination(problem);
148
148
  if (unsearched.length > 0) {
149
149
  wording.push(`the monomial is taken from the dimensioned inputs; an unknown function of the ` +
150
- `dimensionless input(s) {${unsearched.join(', ')}} is not searched`);
150
+ `dimensionless input(s) {${unsearched.join(', ')}} is not searched as such`);
151
151
  }
152
+ // What the power-law fit over the π-groups found on the exploratory rows, or why it abstained
153
+ // (a negative result is a result); the generator ran the same fit to emit its candidate.
154
+ const powerLaw = hasAnyData(problem) ? powerLawDetermination(problem) : null;
155
+ const powerLawNote = powerLaw ? powerLawWording(powerLaw) : null;
156
+ if (powerLawNote !== null)
157
+ wording.push(powerLawNote);
152
158
  for (const raw of generateNative(problem, state)) {
153
159
  raws.push(raw);
154
160
  const stop = budgetStopReason(state);
@@ -303,7 +309,7 @@ export async function runProbeSearch(problem, opts = {}) {
303
309
  if (known) {
304
310
  // Equivalent up to a constant is not equal: compare the fitted constant
305
311
  // with the corpus one where the corpus records it (persona finding L7).
306
- prefactorNotes[rec.id] = corpusPrefactorNotes(corp, bodyExpression(rec.body), fit.prefactor, opts.holdoutTol ?? DEFAULT_HOLDOUT_TOL);
312
+ prefactorNotes[rec.id] = corpusPrefactorNotes(corp, bodyExpression(rec.body), fit.prefactor, opts.holdoutTol ?? DEFAULT_HOLDOUT_TOL, fit.prefactorStderr);
307
313
  rec = applyStatus(rec, 'equivalent-known', corpusRelativeWording(corp), runId, at);
308
314
  store.replace(rec);
309
315
  continue;
@@ -352,7 +358,7 @@ export async function runProbeSearch(problem, opts = {}) {
352
358
  wording.push(det.determined
353
359
  ? 'enumerator produced no dimensionally valid candidates'
354
360
  : `the target is not a unique monomial of the inputs (${det.reason}); ` +
355
- 'the native enumerator searches unique monomials only');
361
+ 'the native enumerator searches unique monomials and, with exploratory rows, a rational power law of the π-groups');
356
362
  }
357
363
  else if (hasAnyData(problem) &&
358
364
  all.every((c) => c.status === 'rejected' ||
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/composition/probe/pipeline.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Product B search orchestrator.\n *\n * Identifiability gate → native enumerator → fingerprint dedup → corpus\n * comparison → validate → exploratory fit (never holdout) → holdout →\n * falsify → Pareto. Relation-link / regime gaps abstain (`non-identifiable`)\n * and tell the caller to use `upt discover`.\n *\n * @internal\n */\n\nimport { validate } from '../../dimensional/validator.js';\nimport { equals } from '../../dimensional/algebra.js';\nimport type {\n ProbeCandidateRecord,\n ProbeRejectionRecord,\n SearchBudget,\n SearchProblem,\n SearchStopReason,\n DiscoveryRunManifest,\n} from './types.js';\nimport { DEFAULT_HOLDOUT_TOL, DEFAULT_SEARCH_BUDGET, SCHEMA_VERSION } from './types.js';\nimport { openBudget, budgetStopReason, type BudgetState } from './search-budget.js';\nimport { generateNative, nativeDetermination, type RawCandidate } from './generator.js';\nimport { fingerprintExpr, complexityOf, bodyExpression } from './fingerprint.js';\nimport {\n compareToCorpus,\n corpusPrefactorNotes,\n corpusRelativeWording,\n type CorpusComparisonResult,\n} from './corpus.js';\nimport { fitPrefactor, type FitResult } from './fit.js';\nimport { runFalsification, type FalsifyResult } from './falsify.js';\nimport { applyStatus, ProbeCandidateStore } from './candidate-store.js';\nimport { openManifest, closeManifest } from './run-manifest.js';\nimport { hashCanonical } from './serialize.js';\nimport { scoreCandidate, rankPareto, type RankedCandidate } from './scoring.js';\nimport { runBackendWorker } from './backend-protocol.js';\n\n/** Stop wording when the problem carried no holdout rows. @internal */\nexport const NO_HOLDOUT_WORDING = 'no holdout observations: no candidate was tested on withheld data';\n\n/**\n * The argv that runs a Node script as an NDJSON worker: this process's own Node, then the script.\n * @internal\n */\nexport function nodeWorkerArgv(script: string): readonly string[] {\n return [process.execPath, script];\n}\n\nexport interface ProbeSearchOptions {\n readonly budget?: SearchBudget;\n readonly runId?: string;\n readonly repositoryCommit?: string;\n readonly holdoutTol?: number;\n readonly backendArgv?: readonly string[];\n readonly corpusVersion?: string;\n readonly now?: string;\n}\n\nexport interface ProbeSearchResult {\n readonly manifest: DiscoveryRunManifest;\n readonly candidates: readonly ProbeCandidateRecord[];\n readonly ranked: readonly RankedCandidate[];\n readonly rejections: readonly ProbeRejectionRecord[];\n readonly fits: Readonly<Record<string, FitResult>>;\n readonly falsifications: Readonly<Record<string, FalsifyResult>>;\n readonly corpus: Readonly<Record<string, CorpusComparisonResult>>;\n /**\n * For a candidate equivalent to a corpus relation, the fitted prefactor\n * against that relation's prefactor (see `corpusPrefactorNotes`).\n */\n readonly prefactorNotes: Readonly<Record<string, readonly string[]>>;\n readonly wording: readonly string[];\n readonly stopReason: SearchStopReason;\n}\n\nfunction abstain(\n problem: SearchProblem,\n opts: ProbeSearchOptions,\n reason: SearchStopReason,\n wording: readonly string[],\n): ProbeSearchResult {\n const budget = opts.budget ?? DEFAULT_SEARCH_BUDGET;\n const runId = opts.runId ?? `dr-${hashCanonical(problem.gap.id).slice(0, 12)}`;\n const open = openManifest({\n runId,\n repositoryCommit: opts.repositoryCommit ?? 'unknown',\n problem,\n searchBudget: budget,\n startedAt: opts.now,\n });\n const manifest = closeManifest(open, reason, opts.now);\n return {\n manifest,\n candidates: [],\n ranked: [],\n rejections: [],\n fits: {},\n falsifications: {},\n corpus: {},\n prefactorNotes: {},\n wording,\n stopReason: reason,\n };\n}\n\nfunction gate(problem: SearchProblem): { ok: true } | { ok: false; wording: string } {\n if (problem.gap.kind === 'relation-link' || problem.gap.kind === 'regime-transition') {\n return {\n ok: false,\n wording: `${problem.gap.kind} gaps are Product A — use \\`upt discover\\`, not \\`upt probe run\\``,\n };\n }\n if (!problem.gap.searchability.searchable) {\n return {\n ok: false,\n wording: problem.gap.searchability.reasons.join('; ') || 'gap is not searchable',\n };\n }\n if (problem.gap.identifiability.parametric?.status === 'non-identifiable') {\n return {\n ok: false,\n wording:\n problem.gap.identifiability.parametric.reasons.join('; ') || 'parametrically non-identifiable',\n };\n }\n return { ok: true };\n}\n\nfunction referencesSymbol(expr: RawCandidate['expression'], name: string): boolean {\n switch (expr.kind) {\n case 'symbol':\n return expr.name === name;\n case 'op':\n return expr.args.some((arg) => referencesSymbol(arg, name));\n case 'integral':\n return referencesSymbol(expr.over, name) || referencesSymbol(expr.integrand, name);\n case 'derivative':\n return referencesSymbol(expr.of, name) || referencesSymbol(expr.wrt, name);\n case 'transcendental':\n case 'abs':\n case 'dirac-delta':\n return referencesSymbol(expr.arg, name);\n case 'variational-derivative':\n return (\n referencesSymbol(expr.functional, name) ||\n referencesSymbol(expr.field, name) ||\n referencesSymbol(expr.over, name)\n );\n default:\n return false;\n }\n}\n\nfunction makeGenerated(\n expr: RawCandidate['expression'],\n problem: SearchProblem,\n runId: string,\n at: string,\n origin: ProbeCandidateRecord['origin'],\n seq: number,\n): ProbeCandidateRecord {\n const fp = fingerprintExpr(\n expr,\n problem.regimeSignature ?? '',\n (problem.assumptions ?? []).join('|'),\n );\n return {\n id: `h-${seq}-${fp.canonicalAstHash.slice(0, 10)}`,\n gapId: problem.gap.id,\n body: { kind: 'scalar-expr', expression: expr },\n origin,\n assumptions: problem.assumptions ?? [],\n status: 'generated',\n statusHistory: [\n { at, from: 'none', to: 'generated', reason: 'enumerator', runId },\n ],\n evaluations: [],\n fingerprint: fp,\n complexity: complexityOf(expr),\n schemaVersion: SCHEMA_VERSION,\n };\n}\n\n/**\n * Run a bounded Product B search. Never mutates Product A catalogs.\n *\n * @internal\n */\nexport async function runProbeSearch(\n problem: SearchProblem,\n opts: ProbeSearchOptions = {},\n): Promise<ProbeSearchResult> {\n const blocked = gate(problem);\n if (!blocked.ok) {\n return abstain(problem, opts, 'non-identifiable', [blocked.wording]);\n }\n\n const budget = opts.budget ?? DEFAULT_SEARCH_BUDGET;\n const state: BudgetState = openBudget(budget);\n const runId = opts.runId ?? `dr-${hashCanonical({\n gap: problem.gap.id,\n target: problem.target.name,\n governing: problem.governing.map((g) => g.name),\n }).slice(0, 12)}`;\n const at = opts.now ?? new Date().toISOString();\n const corpusVersion = opts.corpusVersion ?? SCHEMA_VERSION;\n const store = new ProbeCandidateStore();\n const fits: Record<string, FitResult> = {};\n const falsifications: Record<string, FalsifyResult> = {};\n const corpus: Record<string, CorpusComparisonResult> = {};\n const prefactorNotes: Record<string, string[]> = {};\n const wording: string[] = [];\n const seenHash = new Set<string>();\n let seq = 0;\n\n const raws: RawCandidate[] = [];\n const { unsearched } = nativeDetermination(problem);\n if (unsearched.length > 0) {\n wording.push(\n `the monomial is taken from the dimensioned inputs; an unknown function of the ` +\n `dimensionless input(s) {${unsearched.join(', ')}} is not searched`,\n );\n }\n for (const raw of generateNative(problem, state)) {\n raws.push(raw);\n const stop = budgetStopReason(state);\n if (stop) break;\n }\n\n if (opts.backendArgv && opts.backendArgv.length > 0 && !budgetStopReason(state)) {\n const remainingMs = Math.max(1, budget.maxWallClockMs - (performance.now() - state.startedAtMs));\n const backend = await runBackendWorker(\n opts.backendArgv,\n {\n problemId: problem.gap.id,\n budgetMs: remainingMs,\n variables: problem.governing.map((g) => g.name),\n target: problem.target.name,\n },\n { timeoutMs: remainingMs },\n );\n if (!backend.ok) {\n wording.push(`backend abstained: ${backend.error ?? 'unknown error'}`);\n } else {\n for (const c of backend.candidates) {\n if (budgetStopReason(state)) break;\n state.candidates += 1;\n raws.push({\n expression: c.expression,\n monomial: null,\n originNote: 'external-backend',\n });\n }\n }\n }\n\n const open = openManifest({\n runId,\n repositoryCommit: opts.repositoryCommit ?? 'unknown',\n problem,\n datasetHashes: [\n ...(problem.exploratory ? [hashCanonical(problem.exploratory)] : []),\n ...(problem.holdout ? [hashCanonical(problem.holdout)] : []),\n ],\n tolerances: { holdoutRmse: opts.holdoutTol ?? DEFAULT_HOLDOUT_TOL },\n searchBudget: budget,\n startedAt: at,\n backendDescriptors: opts.backendArgv\n ? [\n {\n protocolVersion: '0',\n backendId: 'native',\n backendVersion: SCHEMA_VERSION,\n capabilities: ['grammar-enumerator'],\n deterministic: 'yes',\n },\n {\n protocolVersion: '0',\n backendId: opts.backendArgv.join(' '),\n backendVersion: 'external',\n capabilities: ['external-backend'],\n deterministic: 'unknown',\n },\n ]\n : undefined,\n });\n\n for (const raw of raws) {\n const stop = budgetStopReason(state);\n if (stop) break;\n\n const origin: ProbeCandidateRecord['origin'] = raw.originNote === 'external-backend'\n ? { kind: 'external-backend', backendId: 'external', runId }\n : { kind: 'grammar-enumerator', runId };\n seq += 1;\n let rec = makeGenerated(raw.expression, problem, runId, at, origin, seq);\n if (seenHash.has(rec.fingerprint.canonicalAstHash)) continue;\n seenHash.add(rec.fingerprint.canonicalAstHash);\n store.put(rec);\n\n const expr = bodyExpression(rec.body);\n if (referencesSymbol(expr, problem.target.name)) {\n rec = applyStatus(rec, 'rejected', `candidate reads target observable '${problem.target.name}'`, runId, at);\n store.replace(rec);\n store.rememberRejection({\n fingerprint: rec.fingerprint,\n reason: `target-observable self-reference: ${problem.target.name}`,\n context: problem.gap.id,\n timestamp: at,\n });\n continue;\n }\n\n const v = validate(expr);\n if (!v.ok || v.inferredDimension === null) {\n rec = applyStatus(rec, 'rejected', 'dimensionally invalid', runId, at);\n store.replace(rec);\n store.rememberRejection({\n fingerprint: rec.fingerprint,\n reason: 'dimensionally invalid',\n context: problem.gap.id,\n timestamp: at,\n });\n continue;\n }\n if (!equals(v.inferredDimension, problem.target.dim)) {\n rec = applyStatus(rec, 'rejected', 'candidate dimension does not match target observable', runId, at);\n store.replace(rec);\n store.rememberRejection({\n fingerprint: rec.fingerprint,\n reason: 'target-dimension mismatch',\n context: problem.gap.id,\n timestamp: at,\n });\n continue;\n }\n rec = applyStatus(rec, 'structurally-valid', 'validate() ok', runId, at);\n store.replace(rec);\n\n const corp = compareToCorpus(bodyExpression(rec.body), corpusVersion);\n corpus[rec.id] = corp;\n wording.push(corpusRelativeWording(corp));\n const known = corp.algebraicMatches.length > 0;\n const hasData = (problem.exploratory?.rows.length ?? 0) > 0;\n\n if (!hasData) {\n rec = applyStatus(\n rec,\n known ? 'equivalent-known' : 'insufficient-evidence',\n known ? corpusRelativeWording(corp) : 'no exploratory observations',\n runId,\n at,\n );\n store.replace(rec);\n continue;\n }\n\n state.evaluations += 1;\n let fit: FitResult;\n try {\n fit = fitPrefactor(\n bodyExpression(rec.body),\n problem.exploratory!,\n problem.holdout,\n opts.holdoutTol ?? DEFAULT_HOLDOUT_TOL,\n );\n } catch (err) {\n rec = applyStatus(\n rec,\n 'rejected',\n err instanceof Error ? err.message : String(err),\n runId,\n at,\n );\n store.replace(rec);\n continue;\n }\n fits[rec.id] = fit;\n rec = applyStatus(rec, 'empirically-fit', `exploratory RMSE ${fit.exploratoryRmse}`, runId, at);\n store.replace(rec);\n\n if (!problem.holdout || problem.holdout.rows.length === 0) {\n rec = applyStatus(rec, 'insufficient-evidence', 'no holdout observations', runId, at);\n store.replace(rec);\n continue;\n }\n if (!fit.holdoutSupported) {\n rec = applyStatus(rec, 'rejected', `holdout RMSE ${fit.holdoutRmse} exceeds tolerance`, runId, at);\n store.replace(rec);\n store.rememberRejection({\n fingerprint: rec.fingerprint,\n reason: `holdout RMSE ${fit.holdoutRmse}`,\n context: problem.gap.id,\n timestamp: at,\n });\n continue;\n }\n\n rec = applyStatus(rec, 'heldout-supported', `holdout RMSE ${fit.holdoutRmse}`, runId, at);\n store.replace(rec);\n\n if (known) {\n // Equivalent up to a constant is not equal: compare the fitted constant\n // with the corpus one where the corpus records it (persona finding L7).\n prefactorNotes[rec.id] = corpusPrefactorNotes(\n corp,\n bodyExpression(rec.body),\n fit.prefactor,\n opts.holdoutTol ?? DEFAULT_HOLDOUT_TOL,\n );\n rec = applyStatus(rec, 'equivalent-known', corpusRelativeWording(corp), runId, at);\n store.replace(rec);\n continue;\n }\n\n const fal = runFalsification({\n expr: bodyExpression(rec.body),\n dataset: problem.holdout,\n prefactor: fit.prefactor,\n claimedRegimes: problem.claimedRegimes,\n limits: problem.limits,\n });\n falsifications[rec.id] = fal;\n if (!fal.survived) {\n rec = applyStatus(rec, 'falsified', fal.records.filter((r) => r.outcome === 'fail').map((r) => r.detail).join('; '), runId, at);\n store.replace(rec);\n continue;\n }\n rec = applyStatus(rec, 'falsification-survivor', 'all fatal batteries passed', runId, at);\n rec = applyStatus(rec, 'expert-review-required', 'survived batteries; human review required', runId, at);\n store.replace(rec);\n }\n\n const all = store.all();\n const scored = all.map((record) => {\n const fit = fits[record.id];\n const emp = fit\n ? 1 / (1 + fit.exploratoryRmse)\n : record.status === 'equivalent-known'\n ? 0.5\n : 0;\n const corp = corpus[record.id];\n const dist = corp && corp.algebraicMatches.length > 0 ? 0 : 1;\n // Robustness is read from the batteries this record ran, not from its status.\n return { record, scores: scoreCandidate(record, emp, dist, falsifications[record.id]) };\n });\n const ranked = rankPareto(scored);\n\n const budgetStop = budgetStopReason(state);\n let stopReason: SearchStopReason;\n if (budgetStop) {\n stopReason = budgetStop;\n } else if (all.length === 0) {\n stopReason = 'no-credible-candidate';\n // Say WHY (persona finding C2): \"no dimensionally valid candidates\" was\n // printed even when the real reason was a non-unique monomial.\n const { det } = nativeDetermination(problem);\n wording.push(\n det.determined\n ? 'enumerator produced no dimensionally valid candidates'\n : `the target is not a unique monomial of the inputs (${det.reason}); ` +\n 'the native enumerator searches unique monomials only',\n );\n } else if (\n hasAnyData(problem) &&\n all.every(\n (c) =>\n c.status === 'rejected' ||\n c.status === 'falsified' ||\n c.status === 'insufficient-evidence',\n )\n ) {\n stopReason = 'no-credible-candidate';\n wording.push(\n (problem.holdout?.rows.length ?? 0) > 0\n ? 'no candidate survived holdout / falsification'\n : NO_HOLDOUT_WORDING,\n );\n } else {\n stopReason = 'exhausted-space';\n }\n\n return {\n manifest: closeManifest(open, stopReason, opts.now ?? new Date().toISOString()),\n candidates: all,\n ranked,\n rejections: store.rejectionList(),\n fits,\n falsifications,\n corpus,\n prefactorNotes,\n wording,\n stopReason,\n };\n}\n\nfunction hasAnyData(problem: SearchProblem): boolean {\n return (problem.exploratory?.rows.length ?? 0) > 0;\n}\n"]}
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/composition/probe/pipeline.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Product B search orchestrator.\n *\n * Identifiability gate → native enumerator → fingerprint dedup → corpus\n * comparison → validate → exploratory fit (never holdout) → holdout →\n * falsify → Pareto. Relation-link / regime gaps abstain (`non-identifiable`)\n * and tell the caller to use `upt discover`.\n *\n * @internal\n */\n\nimport { validate } from '../../dimensional/validator.js';\nimport { equals } from '../../dimensional/algebra.js';\nimport type {\n ProbeCandidateRecord,\n ProbeRejectionRecord,\n SearchBudget,\n SearchProblem,\n SearchStopReason,\n DiscoveryRunManifest,\n} from './types.js';\nimport { DEFAULT_HOLDOUT_TOL, DEFAULT_SEARCH_BUDGET, SCHEMA_VERSION } from './types.js';\nimport { openBudget, budgetStopReason, type BudgetState } from './search-budget.js';\nimport { generateNative, nativeDetermination, powerLawDetermination, powerLawWording, type RawCandidate } from './generator.js';\nimport { fingerprintExpr, complexityOf, bodyExpression } from './fingerprint.js';\nimport {\n compareToCorpus,\n corpusPrefactorNotes,\n corpusRelativeWording,\n type CorpusComparisonResult,\n} from './corpus.js';\nimport { fitPrefactor, type FitResult } from './fit.js';\nimport { runFalsification, type FalsifyResult } from './falsify.js';\nimport { applyStatus, ProbeCandidateStore } from './candidate-store.js';\nimport { openManifest, closeManifest } from './run-manifest.js';\nimport { hashCanonical } from './serialize.js';\nimport { scoreCandidate, rankPareto, type RankedCandidate } from './scoring.js';\nimport { runBackendWorker } from './backend-protocol.js';\n\n/** Stop wording when the problem carried no holdout rows. @internal */\nexport const NO_HOLDOUT_WORDING = 'no holdout observations: no candidate was tested on withheld data';\n\n/**\n * The argv that runs a Node script as an NDJSON worker: this process's own Node, then the script.\n * @internal\n */\nexport function nodeWorkerArgv(script: string): readonly string[] {\n return [process.execPath, script];\n}\n\nexport interface ProbeSearchOptions {\n readonly budget?: SearchBudget;\n readonly runId?: string;\n readonly repositoryCommit?: string;\n readonly holdoutTol?: number;\n readonly backendArgv?: readonly string[];\n readonly corpusVersion?: string;\n readonly now?: string;\n}\n\nexport interface ProbeSearchResult {\n readonly manifest: DiscoveryRunManifest;\n readonly candidates: readonly ProbeCandidateRecord[];\n readonly ranked: readonly RankedCandidate[];\n readonly rejections: readonly ProbeRejectionRecord[];\n readonly fits: Readonly<Record<string, FitResult>>;\n readonly falsifications: Readonly<Record<string, FalsifyResult>>;\n readonly corpus: Readonly<Record<string, CorpusComparisonResult>>;\n /**\n * For a candidate equivalent to a corpus relation, the fitted prefactor\n * against that relation's prefactor (see `corpusPrefactorNotes`).\n */\n readonly prefactorNotes: Readonly<Record<string, readonly string[]>>;\n readonly wording: readonly string[];\n readonly stopReason: SearchStopReason;\n}\n\nfunction abstain(\n problem: SearchProblem,\n opts: ProbeSearchOptions,\n reason: SearchStopReason,\n wording: readonly string[],\n): ProbeSearchResult {\n const budget = opts.budget ?? DEFAULT_SEARCH_BUDGET;\n const runId = opts.runId ?? `dr-${hashCanonical(problem.gap.id).slice(0, 12)}`;\n const open = openManifest({\n runId,\n repositoryCommit: opts.repositoryCommit ?? 'unknown',\n problem,\n searchBudget: budget,\n startedAt: opts.now,\n });\n const manifest = closeManifest(open, reason, opts.now);\n return {\n manifest,\n candidates: [],\n ranked: [],\n rejections: [],\n fits: {},\n falsifications: {},\n corpus: {},\n prefactorNotes: {},\n wording,\n stopReason: reason,\n };\n}\n\nfunction gate(problem: SearchProblem): { ok: true } | { ok: false; wording: string } {\n if (problem.gap.kind === 'relation-link' || problem.gap.kind === 'regime-transition') {\n return {\n ok: false,\n wording: `${problem.gap.kind} gaps are Product A — use \\`upt discover\\`, not \\`upt probe run\\``,\n };\n }\n if (!problem.gap.searchability.searchable) {\n return {\n ok: false,\n wording: problem.gap.searchability.reasons.join('; ') || 'gap is not searchable',\n };\n }\n if (problem.gap.identifiability.parametric?.status === 'non-identifiable') {\n return {\n ok: false,\n wording:\n problem.gap.identifiability.parametric.reasons.join('; ') || 'parametrically non-identifiable',\n };\n }\n return { ok: true };\n}\n\nfunction referencesSymbol(expr: RawCandidate['expression'], name: string): boolean {\n switch (expr.kind) {\n case 'symbol':\n return expr.name === name;\n case 'op':\n return expr.args.some((arg) => referencesSymbol(arg, name));\n case 'integral':\n return referencesSymbol(expr.over, name) || referencesSymbol(expr.integrand, name);\n case 'derivative':\n return referencesSymbol(expr.of, name) || referencesSymbol(expr.wrt, name);\n case 'transcendental':\n case 'abs':\n case 'dirac-delta':\n return referencesSymbol(expr.arg, name);\n case 'variational-derivative':\n return (\n referencesSymbol(expr.functional, name) ||\n referencesSymbol(expr.field, name) ||\n referencesSymbol(expr.over, name)\n );\n default:\n return false;\n }\n}\n\nfunction makeGenerated(\n expr: RawCandidate['expression'],\n problem: SearchProblem,\n runId: string,\n at: string,\n origin: ProbeCandidateRecord['origin'],\n seq: number,\n): ProbeCandidateRecord {\n const fp = fingerprintExpr(\n expr,\n problem.regimeSignature ?? '',\n (problem.assumptions ?? []).join('|'),\n );\n return {\n id: `h-${seq}-${fp.canonicalAstHash.slice(0, 10)}`,\n gapId: problem.gap.id,\n body: { kind: 'scalar-expr', expression: expr },\n origin,\n assumptions: problem.assumptions ?? [],\n status: 'generated',\n statusHistory: [\n { at, from: 'none', to: 'generated', reason: 'enumerator', runId },\n ],\n evaluations: [],\n fingerprint: fp,\n complexity: complexityOf(expr),\n schemaVersion: SCHEMA_VERSION,\n };\n}\n\n/**\n * Run a bounded Product B search. Never mutates Product A catalogs.\n *\n * @internal\n */\nexport async function runProbeSearch(\n problem: SearchProblem,\n opts: ProbeSearchOptions = {},\n): Promise<ProbeSearchResult> {\n const blocked = gate(problem);\n if (!blocked.ok) {\n return abstain(problem, opts, 'non-identifiable', [blocked.wording]);\n }\n\n const budget = opts.budget ?? DEFAULT_SEARCH_BUDGET;\n const state: BudgetState = openBudget(budget);\n const runId = opts.runId ?? `dr-${hashCanonical({\n gap: problem.gap.id,\n target: problem.target.name,\n governing: problem.governing.map((g) => g.name),\n }).slice(0, 12)}`;\n const at = opts.now ?? new Date().toISOString();\n const corpusVersion = opts.corpusVersion ?? SCHEMA_VERSION;\n const store = new ProbeCandidateStore();\n const fits: Record<string, FitResult> = {};\n const falsifications: Record<string, FalsifyResult> = {};\n const corpus: Record<string, CorpusComparisonResult> = {};\n const prefactorNotes: Record<string, string[]> = {};\n const wording: string[] = [];\n const seenHash = new Set<string>();\n let seq = 0;\n\n const raws: RawCandidate[] = [];\n const { unsearched } = nativeDetermination(problem);\n if (unsearched.length > 0) {\n wording.push(\n `the monomial is taken from the dimensioned inputs; an unknown function of the ` +\n `dimensionless input(s) {${unsearched.join(', ')}} is not searched as such`,\n );\n }\n // What the power-law fit over the π-groups found on the exploratory rows, or why it abstained\n // (a negative result is a result); the generator ran the same fit to emit its candidate.\n const powerLaw = hasAnyData(problem) ? powerLawDetermination(problem) : null;\n const powerLawNote = powerLaw ? powerLawWording(powerLaw) : null;\n if (powerLawNote !== null) wording.push(powerLawNote);\n for (const raw of generateNative(problem, state)) {\n raws.push(raw);\n const stop = budgetStopReason(state);\n if (stop) break;\n }\n\n if (opts.backendArgv && opts.backendArgv.length > 0 && !budgetStopReason(state)) {\n const remainingMs = Math.max(1, budget.maxWallClockMs - (performance.now() - state.startedAtMs));\n const backend = await runBackendWorker(\n opts.backendArgv,\n {\n problemId: problem.gap.id,\n budgetMs: remainingMs,\n variables: problem.governing.map((g) => g.name),\n target: problem.target.name,\n },\n { timeoutMs: remainingMs },\n );\n if (!backend.ok) {\n wording.push(`backend abstained: ${backend.error ?? 'unknown error'}`);\n } else {\n for (const c of backend.candidates) {\n if (budgetStopReason(state)) break;\n state.candidates += 1;\n raws.push({\n expression: c.expression,\n monomial: null,\n originNote: 'external-backend',\n });\n }\n }\n }\n\n const open = openManifest({\n runId,\n repositoryCommit: opts.repositoryCommit ?? 'unknown',\n problem,\n datasetHashes: [\n ...(problem.exploratory ? [hashCanonical(problem.exploratory)] : []),\n ...(problem.holdout ? [hashCanonical(problem.holdout)] : []),\n ],\n tolerances: { holdoutRmse: opts.holdoutTol ?? DEFAULT_HOLDOUT_TOL },\n searchBudget: budget,\n startedAt: at,\n backendDescriptors: opts.backendArgv\n ? [\n {\n protocolVersion: '0',\n backendId: 'native',\n backendVersion: SCHEMA_VERSION,\n capabilities: ['grammar-enumerator'],\n deterministic: 'yes',\n },\n {\n protocolVersion: '0',\n backendId: opts.backendArgv.join(' '),\n backendVersion: 'external',\n capabilities: ['external-backend'],\n deterministic: 'unknown',\n },\n ]\n : undefined,\n });\n\n for (const raw of raws) {\n const stop = budgetStopReason(state);\n if (stop) break;\n\n const origin: ProbeCandidateRecord['origin'] = raw.originNote === 'external-backend'\n ? { kind: 'external-backend', backendId: 'external', runId }\n : { kind: 'grammar-enumerator', runId };\n seq += 1;\n let rec = makeGenerated(raw.expression, problem, runId, at, origin, seq);\n if (seenHash.has(rec.fingerprint.canonicalAstHash)) continue;\n seenHash.add(rec.fingerprint.canonicalAstHash);\n store.put(rec);\n\n const expr = bodyExpression(rec.body);\n if (referencesSymbol(expr, problem.target.name)) {\n rec = applyStatus(rec, 'rejected', `candidate reads target observable '${problem.target.name}'`, runId, at);\n store.replace(rec);\n store.rememberRejection({\n fingerprint: rec.fingerprint,\n reason: `target-observable self-reference: ${problem.target.name}`,\n context: problem.gap.id,\n timestamp: at,\n });\n continue;\n }\n\n const v = validate(expr);\n if (!v.ok || v.inferredDimension === null) {\n rec = applyStatus(rec, 'rejected', 'dimensionally invalid', runId, at);\n store.replace(rec);\n store.rememberRejection({\n fingerprint: rec.fingerprint,\n reason: 'dimensionally invalid',\n context: problem.gap.id,\n timestamp: at,\n });\n continue;\n }\n if (!equals(v.inferredDimension, problem.target.dim)) {\n rec = applyStatus(rec, 'rejected', 'candidate dimension does not match target observable', runId, at);\n store.replace(rec);\n store.rememberRejection({\n fingerprint: rec.fingerprint,\n reason: 'target-dimension mismatch',\n context: problem.gap.id,\n timestamp: at,\n });\n continue;\n }\n rec = applyStatus(rec, 'structurally-valid', 'validate() ok', runId, at);\n store.replace(rec);\n\n const corp = compareToCorpus(bodyExpression(rec.body), corpusVersion);\n corpus[rec.id] = corp;\n wording.push(corpusRelativeWording(corp));\n const known = corp.algebraicMatches.length > 0;\n const hasData = (problem.exploratory?.rows.length ?? 0) > 0;\n\n if (!hasData) {\n rec = applyStatus(\n rec,\n known ? 'equivalent-known' : 'insufficient-evidence',\n known ? corpusRelativeWording(corp) : 'no exploratory observations',\n runId,\n at,\n );\n store.replace(rec);\n continue;\n }\n\n state.evaluations += 1;\n let fit: FitResult;\n try {\n fit = fitPrefactor(\n bodyExpression(rec.body),\n problem.exploratory!,\n problem.holdout,\n opts.holdoutTol ?? DEFAULT_HOLDOUT_TOL,\n );\n } catch (err) {\n rec = applyStatus(\n rec,\n 'rejected',\n err instanceof Error ? err.message : String(err),\n runId,\n at,\n );\n store.replace(rec);\n continue;\n }\n fits[rec.id] = fit;\n rec = applyStatus(rec, 'empirically-fit', `exploratory RMSE ${fit.exploratoryRmse}`, runId, at);\n store.replace(rec);\n\n if (!problem.holdout || problem.holdout.rows.length === 0) {\n rec = applyStatus(rec, 'insufficient-evidence', 'no holdout observations', runId, at);\n store.replace(rec);\n continue;\n }\n if (!fit.holdoutSupported) {\n rec = applyStatus(rec, 'rejected', `holdout RMSE ${fit.holdoutRmse} exceeds tolerance`, runId, at);\n store.replace(rec);\n store.rememberRejection({\n fingerprint: rec.fingerprint,\n reason: `holdout RMSE ${fit.holdoutRmse}`,\n context: problem.gap.id,\n timestamp: at,\n });\n continue;\n }\n\n rec = applyStatus(rec, 'heldout-supported', `holdout RMSE ${fit.holdoutRmse}`, runId, at);\n store.replace(rec);\n\n if (known) {\n // Equivalent up to a constant is not equal: compare the fitted constant\n // with the corpus one where the corpus records it (persona finding L7).\n prefactorNotes[rec.id] = corpusPrefactorNotes(\n corp,\n bodyExpression(rec.body),\n fit.prefactor,\n opts.holdoutTol ?? DEFAULT_HOLDOUT_TOL,\n fit.prefactorStderr,\n );\n rec = applyStatus(rec, 'equivalent-known', corpusRelativeWording(corp), runId, at);\n store.replace(rec);\n continue;\n }\n\n const fal = runFalsification({\n expr: bodyExpression(rec.body),\n dataset: problem.holdout,\n prefactor: fit.prefactor,\n claimedRegimes: problem.claimedRegimes,\n limits: problem.limits,\n });\n falsifications[rec.id] = fal;\n if (!fal.survived) {\n rec = applyStatus(rec, 'falsified', fal.records.filter((r) => r.outcome === 'fail').map((r) => r.detail).join('; '), runId, at);\n store.replace(rec);\n continue;\n }\n rec = applyStatus(rec, 'falsification-survivor', 'all fatal batteries passed', runId, at);\n rec = applyStatus(rec, 'expert-review-required', 'survived batteries; human review required', runId, at);\n store.replace(rec);\n }\n\n const all = store.all();\n const scored = all.map((record) => {\n const fit = fits[record.id];\n const emp = fit\n ? 1 / (1 + fit.exploratoryRmse)\n : record.status === 'equivalent-known'\n ? 0.5\n : 0;\n const corp = corpus[record.id];\n const dist = corp && corp.algebraicMatches.length > 0 ? 0 : 1;\n // Robustness is read from the batteries this record ran, not from its status.\n return { record, scores: scoreCandidate(record, emp, dist, falsifications[record.id]) };\n });\n const ranked = rankPareto(scored);\n\n const budgetStop = budgetStopReason(state);\n let stopReason: SearchStopReason;\n if (budgetStop) {\n stopReason = budgetStop;\n } else if (all.length === 0) {\n stopReason = 'no-credible-candidate';\n // Say WHY (persona finding C2): \"no dimensionally valid candidates\" was\n // printed even when the real reason was a non-unique monomial.\n const { det } = nativeDetermination(problem);\n wording.push(\n det.determined\n ? 'enumerator produced no dimensionally valid candidates'\n : `the target is not a unique monomial of the inputs (${det.reason}); ` +\n 'the native enumerator searches unique monomials and, with exploratory rows, a rational power law of the π-groups',\n );\n } else if (\n hasAnyData(problem) &&\n all.every(\n (c) =>\n c.status === 'rejected' ||\n c.status === 'falsified' ||\n c.status === 'insufficient-evidence',\n )\n ) {\n stopReason = 'no-credible-candidate';\n wording.push(\n (problem.holdout?.rows.length ?? 0) > 0\n ? 'no candidate survived holdout / falsification'\n : NO_HOLDOUT_WORDING,\n );\n } else {\n stopReason = 'exhausted-space';\n }\n\n return {\n manifest: closeManifest(open, stopReason, opts.now ?? new Date().toISOString()),\n candidates: all,\n ranked,\n rejections: store.rejectionList(),\n fits,\n falsifications,\n corpus,\n prefactorNotes,\n wording,\n stopReason,\n };\n}\n\nfunction hasAnyData(problem: SearchProblem): boolean {\n return (problem.exploratory?.rows.length ?? 0) > 0;\n}\n"]}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Power-law discovery over the Buckingham π-groups (proposal 8 of
3
+ * docs/planning/2026-10-15-map-maker-discoverer-proposals.md).
4
+ *
5
+ * When the governing variables leave k ≥ 1 dimensionless groups, dimensional
6
+ * analysis fixes the target only as `base · F(π₁, …, πₖ)` for an unknown F.
7
+ * This module fits the one family a monomial search can state, F = C Π πₖ^{aₖ}:
8
+ * `log(y/base) = log C + Σ aₖ log πₖ` by MathTS `ols` on the exploratory rows,
9
+ * reads the coefficients and their standard errors back, and rationalises each
10
+ * aₖ that lies within 2·stderr of a fraction with denominator ≤ 6 (a bounded
11
+ * scan, not `Fraction.fromNumber`, whose continued fraction can exceed its
12
+ * cap). An exponent that is not such a fraction is a NEGATIVE RESULT stated in
13
+ * the abstention, not a candidate with a decimal exponent.
14
+ *
15
+ * The fit reads `problem.exploratory` only: the holdout rows are never seen
16
+ * here, exactly as `fit.ts` never fits them.
17
+ *
18
+ * @internal
19
+ */
20
+ import { type PiGroup } from '../../dimensional/buckingham.js';
21
+ import type { DimensionalVariableRef, ObservationRow, SearchProblem } from './types.js';
22
+ /** One fitted π-group exponent: the estimate, its standard error, the 2σ interval and the fraction chosen in it. @internal */
23
+ export interface PowerLawExponent {
24
+ /** The π-group's display form, e.g. `a · b^-1`. */
25
+ readonly group: string;
26
+ /** The π-group's integer exponent per variable. */
27
+ readonly exponents: Readonly<Record<string, number>>;
28
+ readonly estimate: number;
29
+ readonly stderr: number;
30
+ /** estimate ± 2·stderr. */
31
+ readonly interval: readonly [number, number];
32
+ /** The fraction with the smallest denominator ≤ 6 inside the interval; null when there is none. */
33
+ readonly rational: {
34
+ readonly numerator: number;
35
+ readonly denominator: number;
36
+ } | null;
37
+ }
38
+ /** A recovered rational power law: `monomial` is base + Σ (pₖ/qₖ)·πₖ per variable. @internal */
39
+ export interface PowerLawFit {
40
+ readonly kind: 'fit';
41
+ /** The base monomial of the target over a maximal dimensionally independent subset of the governing set. */
42
+ readonly base: Readonly<Record<string, number>>;
43
+ readonly exponents: readonly PowerLawExponent[];
44
+ /** log C of the fit (the prefactor is refit on the linear scale by the pipeline, like any candidate's). */
45
+ readonly logPrefactor: number;
46
+ readonly r2: number;
47
+ /** Rows the fit used: a positive finite observation, base and every π. */
48
+ readonly nRows: number;
49
+ readonly skippedRows: number;
50
+ /** The combined exponent per governing variable, rational values as numbers. */
51
+ readonly monomial: Readonly<Record<string, number>>;
52
+ }
53
+ /** The outcome of {@link powerLawDetermination}. @internal */
54
+ export type PowerLawDetermination = PowerLawFit | {
55
+ readonly kind: 'not-applicable';
56
+ readonly reason: string;
57
+ } | {
58
+ readonly kind: 'abstained';
59
+ readonly reason: string;
60
+ readonly nRows: number;
61
+ readonly skippedRows: number;
62
+ };
63
+ /** The largest denominator the exponent scan admits. @internal */
64
+ export declare const MAX_EXPONENT_DENOMINATOR = 6;
65
+ /** A reduced fraction. @internal */
66
+ export interface Rational {
67
+ readonly numerator: number;
68
+ readonly denominator: number;
69
+ }
70
+ /**
71
+ * Every distinct reduced fraction p/q with q ≤ `maxDen` within `tol` of `x`,
72
+ * in order of denominator (so 1/2 comes before 2/3). Empty when none is near;
73
+ * more than one when the tolerance is too wide to tell them apart. @internal
74
+ */
75
+ export declare function rationalCandidates(x: number, tol: number, maxDen?: number): Rational[];
76
+ /**
77
+ * The one fraction p/q with q ≤ `maxDen` within `tol` of `x`, or null when
78
+ * there is none or more than one (an estimate whose interval holds two
79
+ * admissible fractions does not determine either). @internal
80
+ */
81
+ export declare function rationalizeExponent(x: number, tol: number, maxDen?: number): Rational | null;
82
+ /** The π-groups of the governing set and the target's base monomial over a maximal dimensionally independent subset. @internal */
83
+ export interface PiStructure {
84
+ readonly groups: readonly PiGroup[];
85
+ /** Null when the target's dimension is not in the span of the governing variables. */
86
+ readonly base: Readonly<Record<string, number>> | null;
87
+ }
88
+ /**
89
+ * The π-groups among the governing variables (MathTS `rationalNullspace`
90
+ * through {@link buckinghamPi}) and the base monomial: the unique monomial of
91
+ * the target over the first maximal dimensionally independent subset of the
92
+ * governing set, in declared order. @internal
93
+ */
94
+ export declare function piStructure(target: DimensionalVariableRef, governing: readonly DimensionalVariableRef[]): PiStructure;
95
+ /** The log-design of a set of rows: `[1, log π₁, …, log πₖ]` per usable row. @internal */
96
+ export interface LogDesign {
97
+ readonly rows: readonly (readonly number[])[];
98
+ /** Rows where every π-group is positive and finite. */
99
+ readonly used: number;
100
+ readonly skipped: number;
101
+ }
102
+ /** The log-design matrix over the rows where every π-group is positive and finite. @internal */
103
+ export declare function logDesign(groups: readonly PiGroup[], rows: readonly ObservationRow[]): LogDesign;
104
+ /**
105
+ * The rank of a log-design (MathTS `matrixRank`, whose tolerance is an absolute
106
+ * 1e-10, so the columns are scaled to order one first). 0 for no rows. @internal
107
+ */
108
+ export declare function logDesignRank(design: LogDesign): number;
109
+ /**
110
+ * Fit `log(y/base) = log C + Σ aₖ log πₖ` on the exploratory rows and
111
+ * rationalise the exponents (module docs). Not applicable when the governing
112
+ * set already fixes the target (the unique-monomial path searches that), when
113
+ * it leaves no π-group, or when the target is outside its span. Abstains, with
114
+ * the reason, without exploratory rows, below k + 2 usable rows, when a
115
+ * π-group does not vary, when the log-design is collinear, or when an exponent
116
+ * is not within 2σ of a fraction with denominator ≤ 6. @internal
117
+ */
118
+ export declare function powerLawDetermination(problem: SearchProblem): PowerLawDetermination;
119
+ /** One line for a run's wording: what the power-law fit found or why it abstained. @internal */
120
+ export declare function powerLawWording(pl: PowerLawDetermination): string | null;
121
+ //# sourceMappingURL=power-law.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"power-law.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/power-law.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,255 @@
1
+ /**
2
+ * Power-law discovery over the Buckingham π-groups (proposal 8 of
3
+ * docs/planning/2026-10-15-map-maker-discoverer-proposals.md).
4
+ *
5
+ * When the governing variables leave k ≥ 1 dimensionless groups, dimensional
6
+ * analysis fixes the target only as `base · F(π₁, …, πₖ)` for an unknown F.
7
+ * This module fits the one family a monomial search can state, F = C Π πₖ^{aₖ}:
8
+ * `log(y/base) = log C + Σ aₖ log πₖ` by MathTS `ols` on the exploratory rows,
9
+ * reads the coefficients and their standard errors back, and rationalises each
10
+ * aₖ that lies within 2·stderr of a fraction with denominator ≤ 6 (a bounded
11
+ * scan, not `Fraction.fromNumber`, whose continued fraction can exceed its
12
+ * cap). An exponent that is not such a fraction is a NEGATIVE RESULT stated in
13
+ * the abstention, not a candidate with a decimal exponent.
14
+ *
15
+ * The fit reads `problem.exploratory` only: the holdout rows are never seen
16
+ * here, exactly as `fit.ts` never fits them.
17
+ *
18
+ * @internal
19
+ */
20
+ import { matrixRank, ols } from '@danielsimonjr/mathts-functions';
21
+ import { buckinghamPi, dimensionallyDetermines } from '../../dimensional/buckingham.js';
22
+ /** The largest denominator the exponent scan admits. @internal */
23
+ export const MAX_EXPONENT_DENOMINATOR = 6;
24
+ /**
25
+ * Every distinct reduced fraction p/q with q ≤ `maxDen` within `tol` of `x`,
26
+ * in order of denominator (so 1/2 comes before 2/3). Empty when none is near;
27
+ * more than one when the tolerance is too wide to tell them apart. @internal
28
+ */
29
+ export function rationalCandidates(x, tol, maxDen = MAX_EXPONENT_DENOMINATOR) {
30
+ if (!Number.isFinite(x) || !(tol >= 0))
31
+ return [];
32
+ const out = [];
33
+ for (let d = 1; d <= maxDen; d++) {
34
+ const lo = Math.ceil((x - tol) * d);
35
+ const hi = Math.floor((x + tol) * d);
36
+ for (let n = lo; n <= hi; n++) {
37
+ const g = gcd(Math.abs(n), d);
38
+ const r = { numerator: n / g, denominator: d / g };
39
+ if (!out.some((o) => o.numerator === r.numerator && o.denominator === r.denominator))
40
+ out.push(r);
41
+ }
42
+ }
43
+ return out;
44
+ }
45
+ /**
46
+ * The one fraction p/q with q ≤ `maxDen` within `tol` of `x`, or null when
47
+ * there is none or more than one (an estimate whose interval holds two
48
+ * admissible fractions does not determine either). @internal
49
+ */
50
+ export function rationalizeExponent(x, tol, maxDen = MAX_EXPONENT_DENOMINATOR) {
51
+ const all = rationalCandidates(x, tol, maxDen);
52
+ return all.length === 1 ? all[0] : null;
53
+ }
54
+ function gcd(a, b) {
55
+ while (b !== 0)
56
+ [a, b] = [b, a % b];
57
+ return a === 0 ? 1 : a;
58
+ }
59
+ /**
60
+ * The π-groups among the governing variables (MathTS `rationalNullspace`
61
+ * through {@link buckinghamPi}) and the base monomial: the unique monomial of
62
+ * the target over the first maximal dimensionally independent subset of the
63
+ * governing set, in declared order. @internal
64
+ */
65
+ export function piStructure(target, governing) {
66
+ if (governing.length === 0)
67
+ return { groups: [], base: null };
68
+ const groups = buckinghamPi(governing).piGroups;
69
+ const independent = [];
70
+ for (const g of governing) {
71
+ if (buckinghamPi([...independent, g]).piGroupCount === 0)
72
+ independent.push(g);
73
+ }
74
+ const det = dimensionallyDetermines(target, independent);
75
+ const base = {};
76
+ if (det.determined && det.monomial) {
77
+ for (const g of governing)
78
+ base[g.name] = det.monomial[g.name] ?? 0;
79
+ return { groups, base };
80
+ }
81
+ return { groups, base: null };
82
+ }
83
+ /** `Π row[name]^exp` over the non-zero exponents; NaN when a name is missing. */
84
+ function monomialValue(exponents, row) {
85
+ let v = 1;
86
+ for (const [name, e] of Object.entries(exponents)) {
87
+ if (e === 0)
88
+ continue;
89
+ const x = row[name];
90
+ if (x === undefined)
91
+ return NaN;
92
+ v *= x ** e;
93
+ }
94
+ return v;
95
+ }
96
+ /** The log-design matrix over the rows where every π-group is positive and finite. @internal */
97
+ export function logDesign(groups, rows) {
98
+ const out = [];
99
+ let skipped = 0;
100
+ for (const row of rows) {
101
+ const pis = groups.map((g) => monomialValue(g.exponents, row));
102
+ if (!pis.every((p) => Number.isFinite(p) && p > 0)) {
103
+ skipped += 1;
104
+ continue;
105
+ }
106
+ out.push([1, ...pis.map((p) => Math.log(p))]);
107
+ }
108
+ return { rows: out, used: out.length, skipped };
109
+ }
110
+ /** Each column divided by its largest magnitude (a zero column stays zero): order one, as `ols` and `matrixRank` need. */
111
+ function scaleColumns(rows) {
112
+ const k = rows[0]?.length ?? 0;
113
+ const scales = Array.from({ length: k }, (_, j) => rows.reduce((m, r) => Math.max(m, Math.abs(r[j])), 0));
114
+ const scaled = rows.map((r) => r.map((v, j) => (scales[j] > 0 ? v / scales[j] : 0)));
115
+ return { scaled, scales };
116
+ }
117
+ /**
118
+ * The rank of a log-design (MathTS `matrixRank`, whose tolerance is an absolute
119
+ * 1e-10, so the columns are scaled to order one first). 0 for no rows. @internal
120
+ */
121
+ export function logDesignRank(design) {
122
+ if (design.rows.length === 0)
123
+ return 0;
124
+ const { scaled } = scaleColumns(design.rows);
125
+ const r = matrixRank(scaled);
126
+ if (typeof r !== 'number' || !Number.isInteger(r))
127
+ throw new TypeError('matrixRank did not return an integer');
128
+ return r;
129
+ }
130
+ /** A finite number read back from a MathTS result array, or null. */
131
+ function numberAt(arr, i) {
132
+ if (!Array.isArray(arr))
133
+ return null;
134
+ const v = arr[i];
135
+ return typeof v === 'number' && Number.isFinite(v) ? v : null;
136
+ }
137
+ /**
138
+ * Fit `log(y/base) = log C + Σ aₖ log πₖ` on the exploratory rows and
139
+ * rationalise the exponents (module docs). Not applicable when the governing
140
+ * set already fixes the target (the unique-monomial path searches that), when
141
+ * it leaves no π-group, or when the target is outside its span. Abstains, with
142
+ * the reason, without exploratory rows, below k + 2 usable rows, when a
143
+ * π-group does not vary, when the log-design is collinear, or when an exponent
144
+ * is not within 2σ of a fraction with denominator ≤ 6. @internal
145
+ */
146
+ export function powerLawDetermination(problem) {
147
+ const full = dimensionallyDetermines(problem.target, problem.governing);
148
+ if (full.determined) {
149
+ return { kind: 'not-applicable', reason: 'the governing set fixes the target up to a constant; the unique-monomial path searches it' };
150
+ }
151
+ const { groups, base } = piStructure(problem.target, problem.governing);
152
+ if (groups.length === 0) {
153
+ return { kind: 'not-applicable', reason: 'the governing set leaves no dimensionless group to raise to a power' };
154
+ }
155
+ if (base === null) {
156
+ return { kind: 'not-applicable', reason: "the target's dimension is not in the span of the governing variables" };
157
+ }
158
+ const rows = problem.exploratory?.rows ?? [];
159
+ if (rows.length === 0) {
160
+ return { kind: 'abstained', reason: 'no exploratory rows: the power-law fit needs data', nRows: 0, skippedRows: 0 };
161
+ }
162
+ const k = groups.length;
163
+ const X = [];
164
+ const ylog = [];
165
+ let skipped = 0;
166
+ for (const row of rows) {
167
+ const y = row[problem.target.name];
168
+ const b = monomialValue(base, row);
169
+ const pis = groups.map((g) => monomialValue(g.exponents, row));
170
+ if (!(y !== undefined && Number.isFinite(y) && y > 0 && Number.isFinite(b) && b > 0) || !pis.every((p) => Number.isFinite(p) && p > 0)) {
171
+ skipped += 1;
172
+ continue;
173
+ }
174
+ X.push(pis.map((p) => Math.log(p)));
175
+ ylog.push(Math.log(y / b));
176
+ }
177
+ const used = X.length;
178
+ const abstain = (reason) => ({ kind: 'abstained', reason, nRows: used, skippedRows: skipped });
179
+ if (used < k + 2) {
180
+ return abstain(`only ${used} usable row(s) (positive observation, base and π-groups) for ${k} exponent(s) and a prefactor; the fit needs at least ${k + 2}`);
181
+ }
182
+ // A π-group whose log spreads by no more than round-off (1e-12 of its magnitude, or absolute)
183
+ // does not vary: a/b with b = a is 1 up to an ulp, and that ulp is not an exponent's evidence.
184
+ for (let j = 0; j < k; j++) {
185
+ // Reductions, not spreads: a spread of a large row set overflows the call stack.
186
+ const lo = X.reduce((m, r) => Math.min(m, r[j]), Number.POSITIVE_INFINITY);
187
+ const hi = X.reduce((m, r) => Math.max(m, r[j]), Number.NEGATIVE_INFINITY);
188
+ if (hi - lo <= 1e-12 * Math.max(1, Math.abs(hi), Math.abs(lo))) {
189
+ return abstain(`π-group ${groups[j].formula} does not vary over the usable rows, so its exponent is not identifiable`);
190
+ }
191
+ }
192
+ // Columns scaled to order one. History: before @danielsimonjr/mathts-functions 0.68.4, `ols`
193
+ // tested singularity with an absolute 1e-15, so a column of log π of magnitude 1e-9 read as
194
+ // collinear unscaled. From 0.68.4 (installed) `ols` equilibrates the design itself, and an
195
+ // unscaled 1e-9 column fits without throwing. The scaling stays, because it also conditions
196
+ // `matrixRank` (logDesignRank, which scales the same way). Coefficients and errors are unscaled after.
197
+ const { scaled, scales } = scaleColumns(X);
198
+ let fit;
199
+ try {
200
+ fit = ols(scaled, ylog, { intercept: true });
201
+ }
202
+ catch (e) {
203
+ return abstain(`the log-design is collinear over the rows (${e.message}); the exponents are not identifiable`);
204
+ }
205
+ const logPrefactor = numberAt(fit.coefficients, 0);
206
+ const r2 = typeof fit.r2 === 'number' && Number.isFinite(fit.r2) ? fit.r2 : null;
207
+ if (logPrefactor === null || r2 === null)
208
+ return abstain('ols did not return a finite intercept and R²');
209
+ const exponents = [];
210
+ for (let j = 0; j < k; j++) {
211
+ const c = numberAt(fit.coefficients, j + 1);
212
+ const se = numberAt(fit.stderr, j + 1);
213
+ if (c === null || se === null)
214
+ return abstain(`ols did not return a finite coefficient and standard error for π-group ${groups[j].formula}`);
215
+ const estimate = c / scales[j];
216
+ const stderr = se / scales[j];
217
+ // Noise-free rows give stderr 0; a representation tolerance keeps 0.5000000000000001 at 1/2.
218
+ const tol = Math.max(2 * stderr, 1e-9 * Math.max(1, Math.abs(estimate)));
219
+ const near = rationalCandidates(estimate, tol);
220
+ const rational = near.length === 1 ? near[0] : null;
221
+ const group = groups[j];
222
+ exponents.push({ group: group.formula, exponents: group.exponents, estimate, stderr, interval: [estimate - 2 * stderr, estimate + 2 * stderr], rational });
223
+ const value = `${estimate.toPrecision(4)} ± ${stderr.toPrecision(2)}`;
224
+ if (near.length === 0) {
225
+ return abstain(`the exponent of ${group.formula} is ${value}, not within 2σ of a fraction with denominator ≤ ${MAX_EXPONENT_DENOMINATOR}`);
226
+ }
227
+ if (near.length > 1) {
228
+ const list = near.slice(0, 4).map((r) => (r.denominator === 1 ? `${r.numerator}` : `${r.numerator}/${r.denominator}`)).join(', ');
229
+ return abstain(`the exponent of ${group.formula} is ${value}: its 2σ interval holds ${near.length} fractions with denominator ≤ ${MAX_EXPONENT_DENOMINATOR} (${list}${near.length > 4 ? ', …' : ''}), so the rows do not determine it`);
230
+ }
231
+ }
232
+ const monomial = { ...base };
233
+ for (const e of exponents) {
234
+ const a = e.rational.numerator / e.rational.denominator;
235
+ for (const [name, p] of Object.entries(e.exponents))
236
+ monomial[name] = (monomial[name] ?? 0) + a * p;
237
+ }
238
+ return { kind: 'fit', base, exponents, logPrefactor, r2, nRows: used, skippedRows: skipped, monomial };
239
+ }
240
+ /** One line for a run's wording: what the power-law fit found or why it abstained. @internal */
241
+ export function powerLawWording(pl) {
242
+ if (pl.kind === 'not-applicable')
243
+ return null;
244
+ if (pl.kind === 'abstained')
245
+ return `no power law from the exploratory rows: ${pl.reason}`;
246
+ const terms = pl.exponents
247
+ .map((e) => {
248
+ const { numerator: p, denominator: q } = e.rational;
249
+ const frac = q === 1 ? `${p}` : `${p}/${q}`;
250
+ return `(${e.group})^(${frac}) [a = ${e.estimate.toPrecision(3)} ± ${e.stderr.toPrecision(2)}]`;
251
+ })
252
+ .join(' · ');
253
+ return `power law from the exploratory rows: base · ${terms}; R² = ${pl.r2.toPrecision(4)} on ${pl.nRows} row(s)${pl.skippedRows > 0 ? ` (${pl.skippedRows} skipped: non-positive)` : ''}; each exponent is the fraction with denominator ≤ ${MAX_EXPONENT_DENOMINATOR} within 2σ of the fit`;
254
+ }
255
+ //# sourceMappingURL=power-law.js.map