universal-physics-tensor 10.0.0 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (835) hide show
  1. package/README.md +39 -36
  2. package/bin/upt.mjs +13 -1
  3. package/data/applied-cases.json +1892 -0
  4. package/data/applied-cases.schema.json +194 -0
  5. package/data/atlas/atlas.json +25 -25
  6. package/data/atlas/atlas.jsonld +1 -1
  7. package/data/atlas/diffusion.json +6 -6
  8. package/data/atlas/oscillators.json +7 -7
  9. package/data/atlas/waves.json +14 -14
  10. package/data/atlas/witness-results.json +11 -11
  11. package/data/bridge-catalog.json +389 -230
  12. package/data/bridge-catalog.schema.json +45 -7
  13. package/data/units.json +6 -25
  14. package/dist/atlas/applicability.d.ts.map +1 -1
  15. package/dist/atlas/applicability.js +21 -15
  16. package/dist/atlas/applicability.js.map +1 -1
  17. package/dist/atlas/benchmark/hybrid-retrieval.d.ts +9 -1
  18. package/dist/atlas/benchmark/hybrid-retrieval.d.ts.map +1 -1
  19. package/dist/atlas/benchmark/hybrid-retrieval.js +15 -13
  20. package/dist/atlas/benchmark/hybrid-retrieval.js.map +1 -1
  21. package/dist/atlas/benchmark/loader.js +2 -2
  22. package/dist/atlas/benchmark/loader.js.map +1 -1
  23. package/dist/atlas/benchmark/stats.d.ts +2 -2
  24. package/dist/atlas/benchmark/stats.d.ts.map +1 -1
  25. package/dist/atlas/benchmark/stats.js +9 -15
  26. package/dist/atlas/benchmark/stats.js.map +1 -1
  27. package/dist/atlas/catalog-formal-ref.d.ts +26 -3
  28. package/dist/atlas/catalog-formal-ref.d.ts.map +1 -1
  29. package/dist/atlas/catalog-formal-ref.js +52 -5
  30. package/dist/atlas/catalog-formal-ref.js.map +1 -1
  31. package/dist/atlas/chain-pipeline.d.ts.map +1 -1
  32. package/dist/atlas/chain-pipeline.js +7 -8
  33. package/dist/atlas/chain-pipeline.js.map +1 -1
  34. package/dist/atlas/diffusion/bridges-closure.d.ts +0 -4
  35. package/dist/atlas/diffusion/bridges-closure.d.ts.map +1 -1
  36. package/dist/atlas/diffusion/bridges-closure.js +8 -12
  37. package/dist/atlas/diffusion/bridges-closure.js.map +1 -1
  38. package/dist/atlas/diffusion/bridges.d.ts.map +1 -1
  39. package/dist/atlas/diffusion/bridges.js +27 -39
  40. package/dist/atlas/diffusion/bridges.js.map +1 -1
  41. package/dist/atlas/diffusion/dimensions.d.ts +6 -14
  42. package/dist/atlas/diffusion/dimensions.d.ts.map +1 -1
  43. package/dist/atlas/diffusion/dimensions.js +8 -16
  44. package/dist/atlas/diffusion/dimensions.js.map +1 -1
  45. package/dist/atlas/diffusion/models.d.ts +3 -3
  46. package/dist/atlas/diffusion/models.d.ts.map +1 -1
  47. package/dist/atlas/diffusion/models.js +5 -10
  48. package/dist/atlas/diffusion/models.js.map +1 -1
  49. package/dist/atlas/diffusion/numerics.d.ts +16 -4
  50. package/dist/atlas/diffusion/numerics.d.ts.map +1 -1
  51. package/dist/atlas/diffusion/numerics.js +38 -24
  52. package/dist/atlas/diffusion/numerics.js.map +1 -1
  53. package/dist/atlas/link-prediction.d.ts +106 -3
  54. package/dist/atlas/link-prediction.d.ts.map +1 -1
  55. package/dist/atlas/link-prediction.js +212 -66
  56. package/dist/atlas/link-prediction.js.map +1 -1
  57. package/dist/atlas/oscillators/bridges-coarse.d.ts.map +1 -1
  58. package/dist/atlas/oscillators/bridges-coarse.js +7 -11
  59. package/dist/atlas/oscillators/bridges-coarse.js.map +1 -1
  60. package/dist/atlas/oscillators/bridges-exact.d.ts.map +1 -1
  61. package/dist/atlas/oscillators/bridges-exact.js +6 -7
  62. package/dist/atlas/oscillators/bridges-exact.js.map +1 -1
  63. package/dist/atlas/oscillators/bridges-limits.d.ts +3 -16
  64. package/dist/atlas/oscillators/bridges-limits.d.ts.map +1 -1
  65. package/dist/atlas/oscillators/bridges-limits.js +23 -34
  66. package/dist/atlas/oscillators/bridges-limits.js.map +1 -1
  67. package/dist/atlas/oscillators/dimensions.d.ts +9 -21
  68. package/dist/atlas/oscillators/dimensions.d.ts.map +1 -1
  69. package/dist/atlas/oscillators/dimensions.js +9 -21
  70. package/dist/atlas/oscillators/dimensions.js.map +1 -1
  71. package/dist/atlas/oscillators/limit-witnesses.d.ts +2 -2
  72. package/dist/atlas/oscillators/limit-witnesses.d.ts.map +1 -1
  73. package/dist/atlas/oscillators/limit-witnesses.js +17 -15
  74. package/dist/atlas/oscillators/limit-witnesses.js.map +1 -1
  75. package/dist/atlas/oscillators/models.d.ts.map +1 -1
  76. package/dist/atlas/oscillators/models.js +2 -6
  77. package/dist/atlas/oscillators/models.js.map +1 -1
  78. package/dist/atlas/oscillators/pendulum-motion.d.ts +29 -6
  79. package/dist/atlas/oscillators/pendulum-motion.d.ts.map +1 -1
  80. package/dist/atlas/oscillators/pendulum-motion.js +60 -40
  81. package/dist/atlas/oscillators/pendulum-motion.js.map +1 -1
  82. package/dist/atlas/oscillators/phase-translation.d.ts +0 -11
  83. package/dist/atlas/oscillators/phase-translation.d.ts.map +1 -1
  84. package/dist/atlas/oscillators/phase-translation.js +3 -4
  85. package/dist/atlas/oscillators/phase-translation.js.map +1 -1
  86. package/dist/atlas/oscillators/position-translation.d.ts +68 -7
  87. package/dist/atlas/oscillators/position-translation.d.ts.map +1 -1
  88. package/dist/atlas/oscillators/position-translation.js +123 -12
  89. package/dist/atlas/oscillators/position-translation.js.map +1 -1
  90. package/dist/atlas/oscillators/rejections.d.ts +0 -2
  91. package/dist/atlas/oscillators/rejections.d.ts.map +1 -1
  92. package/dist/atlas/oscillators/rejections.js +0 -7
  93. package/dist/atlas/oscillators/rejections.js.map +1 -1
  94. package/dist/atlas/physjs-entries.generated.d.ts +35 -25
  95. package/dist/atlas/physjs-entries.generated.d.ts.map +1 -1
  96. package/dist/atlas/physjs-entries.generated.js +37 -25
  97. package/dist/atlas/physjs-entries.generated.js.map +1 -1
  98. package/dist/atlas/physjs-ref.d.ts +34 -31
  99. package/dist/atlas/physjs-ref.d.ts.map +1 -1
  100. package/dist/atlas/physjs-ref.js +55 -53
  101. package/dist/atlas/physjs-ref.js.map +1 -1
  102. package/dist/atlas/physjs-reviewed.d.ts +1 -1
  103. package/dist/atlas/physjs-reviewed.js +15 -15
  104. package/dist/atlas/physjs-reviewed.js.map +1 -1
  105. package/dist/atlas/poster/statements.d.ts +0 -19
  106. package/dist/atlas/poster/statements.d.ts.map +1 -1
  107. package/dist/atlas/poster/statements.js +1 -1
  108. package/dist/atlas/poster/statements.js.map +1 -1
  109. package/dist/atlas/proof-target.d.ts +1 -1
  110. package/dist/atlas/proof-target.js +1 -1
  111. package/dist/atlas/proof-target.js.map +1 -1
  112. package/dist/atlas/regime.d.ts +1 -1
  113. package/dist/atlas/regime.d.ts.map +1 -1
  114. package/dist/atlas/regime.js +1 -1
  115. package/dist/atlas/regime.js.map +1 -1
  116. package/dist/atlas/text-overlap.d.ts +23 -0
  117. package/dist/atlas/text-overlap.d.ts.map +1 -0
  118. package/dist/atlas/text-overlap.js +41 -0
  119. package/dist/atlas/text-overlap.js.map +1 -0
  120. package/dist/atlas/waves/bridges-closure.d.ts.map +1 -1
  121. package/dist/atlas/waves/bridges-closure.js +2 -6
  122. package/dist/atlas/waves/bridges-closure.js.map +1 -1
  123. package/dist/atlas/waves/bridges.d.ts.map +1 -1
  124. package/dist/atlas/waves/bridges.js +32 -48
  125. package/dist/atlas/waves/bridges.js.map +1 -1
  126. package/dist/atlas/waves/models.d.ts +5 -6
  127. package/dist/atlas/waves/models.d.ts.map +1 -1
  128. package/dist/atlas/waves/models.js +7 -13
  129. package/dist/atlas/waves/models.js.map +1 -1
  130. package/dist/atlas/waves/numerics.d.ts.map +1 -1
  131. package/dist/atlas/waves/numerics.js +10 -3
  132. package/dist/atlas/waves/numerics.js.map +1 -1
  133. package/dist/atlas/witness-numeric.d.ts +30 -0
  134. package/dist/atlas/witness-numeric.d.ts.map +1 -1
  135. package/dist/atlas/witness-numeric.js +53 -0
  136. package/dist/atlas/witness-numeric.js.map +1 -1
  137. package/dist/atlas/witness-specs.d.ts.map +1 -1
  138. package/dist/atlas/witness-specs.js +19 -0
  139. package/dist/atlas/witness-specs.js.map +1 -1
  140. package/dist/atlas/witness-symbolic.d.ts +75 -3
  141. package/dist/atlas/witness-symbolic.d.ts.map +1 -1
  142. package/dist/atlas/witness-symbolic.js +116 -10
  143. package/dist/atlas/witness-symbolic.js.map +1 -1
  144. package/dist/bridges/catalog-load.d.ts.map +1 -1
  145. package/dist/bridges/catalog-load.js +13 -8
  146. package/dist/bridges/catalog-load.js.map +1 -1
  147. package/dist/bridges/catalog-types.d.ts +26 -2
  148. package/dist/bridges/catalog-types.d.ts.map +1 -1
  149. package/dist/bridges/catalog-types.js +11 -1
  150. package/dist/bridges/catalog-types.js.map +1 -1
  151. package/dist/bridges/evaluation-errors.d.ts +31 -1
  152. package/dist/bridges/evaluation-errors.d.ts.map +1 -1
  153. package/dist/bridges/evaluation-errors.js +20 -2
  154. package/dist/bridges/evaluation-errors.js.map +1 -1
  155. package/dist/bridges/evaluator-inputs.d.ts.map +1 -1
  156. package/dist/bridges/evaluator-inputs.js +7 -5
  157. package/dist/bridges/evaluator-inputs.js.map +1 -1
  158. package/dist/bridges/evaluators.d.ts.map +1 -1
  159. package/dist/bridges/evaluators.js +27 -12
  160. package/dist/bridges/evaluators.js.map +1 -1
  161. package/dist/bridges/expr-parse.d.ts +11 -0
  162. package/dist/bridges/expr-parse.d.ts.map +1 -1
  163. package/dist/bridges/expr-parse.js +14 -5
  164. package/dist/bridges/expr-parse.js.map +1 -1
  165. package/dist/bridges/holds.d.ts +35 -3
  166. package/dist/bridges/holds.d.ts.map +1 -1
  167. package/dist/bridges/holds.js +117 -23
  168. package/dist/bridges/holds.js.map +1 -1
  169. package/dist/bridges/notices.d.ts.map +1 -1
  170. package/dist/bridges/notices.js +5 -5
  171. package/dist/bridges/notices.js.map +1 -1
  172. package/dist/bridges/relation-eval.d.ts +4 -4
  173. package/dist/bridges/relation-eval.d.ts.map +1 -1
  174. package/dist/bridges/relation-eval.js +15 -16
  175. package/dist/bridges/relation-eval.js.map +1 -1
  176. package/dist/bridges/sensitivity.d.ts.map +1 -1
  177. package/dist/bridges/sensitivity.js +3 -3
  178. package/dist/bridges/sensitivity.js.map +1 -1
  179. package/dist/bridges/validity.d.ts +33 -0
  180. package/dist/bridges/validity.d.ts.map +1 -0
  181. package/dist/bridges/validity.js +67 -0
  182. package/dist/bridges/validity.js.map +1 -0
  183. package/dist/canonical/entries/atomic.js +1 -3
  184. package/dist/canonical/entries/atomic.js.map +1 -1
  185. package/dist/canonical/entries/condensed-matter.d.ts.map +1 -1
  186. package/dist/canonical/entries/condensed-matter.js +4 -5
  187. package/dist/canonical/entries/condensed-matter.js.map +1 -1
  188. package/dist/canonical/entries/dimensional-classics.d.ts.map +1 -1
  189. package/dist/canonical/entries/dimensional-classics.js +3 -4
  190. package/dist/canonical/entries/dimensional-classics.js.map +1 -1
  191. package/dist/canonical/entries/electromagnetism.d.ts.map +1 -1
  192. package/dist/canonical/entries/electromagnetism.js +4 -10
  193. package/dist/canonical/entries/electromagnetism.js.map +1 -1
  194. package/dist/canonical/entries/fluids-waves.d.ts.map +1 -1
  195. package/dist/canonical/entries/fluids-waves.js +3 -7
  196. package/dist/canonical/entries/fluids-waves.js.map +1 -1
  197. package/dist/canonical/entries/mechanics.d.ts.map +1 -1
  198. package/dist/canonical/entries/mechanics.js +4 -6
  199. package/dist/canonical/entries/mechanics.js.map +1 -1
  200. package/dist/canonical/entries/nonmonomial.d.ts.map +1 -1
  201. package/dist/canonical/entries/nonmonomial.js +9 -17
  202. package/dist/canonical/entries/nonmonomial.js.map +1 -1
  203. package/dist/canonical/entries/relativity.d.ts.map +1 -1
  204. package/dist/canonical/entries/relativity.js +6 -6
  205. package/dist/canonical/entries/relativity.js.map +1 -1
  206. package/dist/canonical/entries/thermo-nuclear-cosmo.d.ts.map +1 -1
  207. package/dist/canonical/entries/thermo-nuclear-cosmo.js +6 -10
  208. package/dist/canonical/entries/thermo-nuclear-cosmo.js.map +1 -1
  209. package/dist/canonical/fixed-points.d.ts +94 -0
  210. package/dist/canonical/fixed-points.d.ts.map +1 -0
  211. package/dist/canonical/fixed-points.js +81 -0
  212. package/dist/canonical/fixed-points.js.map +1 -0
  213. package/dist/canonical/linkage.d.ts.map +1 -1
  214. package/dist/canonical/linkage.js +25 -44
  215. package/dist/canonical/linkage.js.map +1 -1
  216. package/dist/canonical/normal-form.d.ts.map +1 -1
  217. package/dist/canonical/normal-form.js +5 -11
  218. package/dist/canonical/normal-form.js.map +1 -1
  219. package/dist/canonical/structural.d.ts +21 -21
  220. package/dist/canonical/structural.d.ts.map +1 -1
  221. package/dist/canonical/structural.js +40 -19
  222. package/dist/canonical/structural.js.map +1 -1
  223. package/dist/cases/catalog-checks.d.ts +10 -0
  224. package/dist/cases/catalog-checks.d.ts.map +1 -0
  225. package/dist/cases/catalog-checks.js +241 -0
  226. package/dist/cases/catalog-checks.js.map +1 -0
  227. package/dist/cases/catalog.d.ts +83 -0
  228. package/dist/cases/catalog.d.ts.map +1 -0
  229. package/dist/cases/catalog.js +118 -0
  230. package/dist/cases/catalog.js.map +1 -0
  231. package/dist/cases/engine.d.ts +13 -0
  232. package/dist/cases/engine.d.ts.map +1 -0
  233. package/dist/cases/engine.js +179 -0
  234. package/dist/cases/engine.js.map +1 -0
  235. package/dist/cases/index.d.ts.map +1 -1
  236. package/dist/cases/index.js +5 -7
  237. package/dist/cases/index.js.map +1 -1
  238. package/dist/cases/methods.d.ts +215 -0
  239. package/dist/cases/methods.d.ts.map +1 -0
  240. package/dist/cases/methods.js +743 -0
  241. package/dist/cases/methods.js.map +1 -0
  242. package/dist/cases/quadrature.d.ts +7 -9
  243. package/dist/cases/quadrature.d.ts.map +1 -1
  244. package/dist/cases/quadrature.js +28 -32
  245. package/dist/cases/quadrature.js.map +1 -1
  246. package/dist/cases/types.d.ts +12 -0
  247. package/dist/cases/types.d.ts.map +1 -1
  248. package/dist/cases/types.js.map +1 -1
  249. package/dist/cli/args.d.ts +25 -1
  250. package/dist/cli/args.d.ts.map +1 -1
  251. package/dist/cli/args.js +30 -8
  252. package/dist/cli/args.js.map +1 -1
  253. package/dist/cli/bindings.d.ts.map +1 -1
  254. package/dist/cli/bindings.js +5 -4
  255. package/dist/cli/bindings.js.map +1 -1
  256. package/dist/cli/command.d.ts +11 -1
  257. package/dist/cli/command.d.ts.map +1 -1
  258. package/dist/cli/command.js.map +1 -1
  259. package/dist/cli/commands/_atlas-map.d.ts +0 -9
  260. package/dist/cli/commands/_atlas-map.d.ts.map +1 -1
  261. package/dist/cli/commands/_atlas-map.js +8 -18
  262. package/dist/cli/commands/_atlas-map.js.map +1 -1
  263. package/dist/cli/commands/_atlas-route.d.ts.map +1 -1
  264. package/dist/cli/commands/_atlas-route.js +6 -2
  265. package/dist/cli/commands/_atlas-route.js.map +1 -1
  266. package/dist/cli/commands/_discovery-opts.d.ts +1 -0
  267. package/dist/cli/commands/_discovery-opts.d.ts.map +1 -1
  268. package/dist/cli/commands/_discovery-opts.js +9 -9
  269. package/dist/cli/commands/_discovery-opts.js.map +1 -1
  270. package/dist/cli/commands/atlas.d.ts.map +1 -1
  271. package/dist/cli/commands/atlas.js +8 -5
  272. package/dist/cli/commands/atlas.js.map +1 -1
  273. package/dist/cli/commands/audit.d.ts.map +1 -1
  274. package/dist/cli/commands/audit.js +8 -1
  275. package/dist/cli/commands/audit.js.map +1 -1
  276. package/dist/cli/commands/axes.d.ts.map +1 -1
  277. package/dist/cli/commands/axes.js +20 -1
  278. package/dist/cli/commands/axes.js.map +1 -1
  279. package/dist/cli/commands/confront.d.ts.map +1 -1
  280. package/dist/cli/commands/confront.js +8 -14
  281. package/dist/cli/commands/confront.js.map +1 -1
  282. package/dist/cli/commands/derive.d.ts.map +1 -1
  283. package/dist/cli/commands/derive.js +22 -22
  284. package/dist/cli/commands/derive.js.map +1 -1
  285. package/dist/cli/commands/discover.d.ts.map +1 -1
  286. package/dist/cli/commands/discover.js +122 -73
  287. package/dist/cli/commands/discover.js.map +1 -1
  288. package/dist/cli/commands/eval.d.ts.map +1 -1
  289. package/dist/cli/commands/eval.js +1 -0
  290. package/dist/cli/commands/eval.js.map +1 -1
  291. package/dist/cli/commands/evaluate.d.ts.map +1 -1
  292. package/dist/cli/commands/evaluate.js +67 -39
  293. package/dist/cli/commands/evaluate.js.map +1 -1
  294. package/dist/cli/commands/explain.d.ts.map +1 -1
  295. package/dist/cli/commands/explain.js +24 -3
  296. package/dist/cli/commands/explain.js.map +1 -1
  297. package/dist/cli/commands/ground.d.ts.map +1 -1
  298. package/dist/cli/commands/ground.js +7 -1
  299. package/dist/cli/commands/ground.js.map +1 -1
  300. package/dist/cli/commands/map.d.ts.map +1 -1
  301. package/dist/cli/commands/map.js +84 -11
  302. package/dist/cli/commands/map.js.map +1 -1
  303. package/dist/cli/commands/metric.d.ts.map +1 -1
  304. package/dist/cli/commands/metric.js +12 -9
  305. package/dist/cli/commands/metric.js.map +1 -1
  306. package/dist/cli/commands/path.d.ts +10 -0
  307. package/dist/cli/commands/path.d.ts.map +1 -1
  308. package/dist/cli/commands/path.js +25 -3
  309. package/dist/cli/commands/path.js.map +1 -1
  310. package/dist/cli/commands/probe.d.ts.map +1 -1
  311. package/dist/cli/commands/probe.js +59 -16
  312. package/dist/cli/commands/probe.js.map +1 -1
  313. package/dist/cli/commands/regime.d.ts.map +1 -1
  314. package/dist/cli/commands/regime.js +1 -0
  315. package/dist/cli/commands/regime.js.map +1 -1
  316. package/dist/cli/commands/retrieve.d.ts.map +1 -1
  317. package/dist/cli/commands/retrieve.js +1 -0
  318. package/dist/cli/commands/retrieve.js.map +1 -1
  319. package/dist/cli/commands/search.d.ts.map +1 -1
  320. package/dist/cli/commands/search.js +1 -0
  321. package/dist/cli/commands/search.js.map +1 -1
  322. package/dist/cli/commands/symbolic.d.ts.map +1 -1
  323. package/dist/cli/commands/symbolic.js +19 -28
  324. package/dist/cli/commands/symbolic.js.map +1 -1
  325. package/dist/cli/commands/testplan.d.ts.map +1 -1
  326. package/dist/cli/commands/testplan.js +4 -2
  327. package/dist/cli/commands/testplan.js.map +1 -1
  328. package/dist/cli/determination.d.ts +1 -0
  329. package/dist/cli/determination.d.ts.map +1 -1
  330. package/dist/cli/determination.js.map +1 -1
  331. package/dist/cli/expr-print.d.ts +0 -2
  332. package/dist/cli/expr-print.d.ts.map +1 -1
  333. package/dist/cli/expr-print.js +7 -31
  334. package/dist/cli/expr-print.js.map +1 -1
  335. package/dist/cli/flag-help.d.ts +1 -0
  336. package/dist/cli/flag-help.d.ts.map +1 -1
  337. package/dist/cli/flag-help.js +1 -0
  338. package/dist/cli/flag-help.js.map +1 -1
  339. package/dist/cli/graphs.d.ts +2 -0
  340. package/dist/cli/graphs.d.ts.map +1 -1
  341. package/dist/cli/graphs.js +1 -0
  342. package/dist/cli/graphs.js.map +1 -1
  343. package/dist/cli/main.d.ts +8 -0
  344. package/dist/cli/main.d.ts.map +1 -1
  345. package/dist/cli/main.js +19 -3
  346. package/dist/cli/main.js.map +1 -1
  347. package/dist/cli/numeric-flag.d.ts +12 -0
  348. package/dist/cli/numeric-flag.d.ts.map +1 -0
  349. package/dist/cli/numeric-flag.js +44 -0
  350. package/dist/cli/numeric-flag.js.map +1 -0
  351. package/dist/cli/output.d.ts +28 -0
  352. package/dist/cli/output.d.ts.map +1 -1
  353. package/dist/cli/output.js +23 -0
  354. package/dist/cli/output.js.map +1 -1
  355. package/dist/cli/record-reach.js +2 -2
  356. package/dist/cli/record-reach.js.map +1 -1
  357. package/dist/cli/record-tables.d.ts.map +1 -1
  358. package/dist/cli/record-tables.js +6 -5
  359. package/dist/cli/record-tables.js.map +1 -1
  360. package/dist/cli/record.d.ts +1 -5
  361. package/dist/cli/record.d.ts.map +1 -1
  362. package/dist/cli/record.js +9 -8
  363. package/dist/cli/record.js.map +1 -1
  364. package/dist/cli/search-index.d.ts.map +1 -1
  365. package/dist/cli/search-index.js +7 -6
  366. package/dist/cli/search-index.js.map +1 -1
  367. package/dist/cli/statuses.d.ts +0 -2
  368. package/dist/cli/statuses.d.ts.map +1 -1
  369. package/dist/cli/statuses.js +12 -9
  370. package/dist/cli/statuses.js.map +1 -1
  371. package/dist/cli/stored-results.d.ts +7 -0
  372. package/dist/cli/stored-results.d.ts.map +1 -0
  373. package/dist/cli/stored-results.js +23 -0
  374. package/dist/cli/stored-results.js.map +1 -0
  375. package/dist/cli/version.d.ts +1 -0
  376. package/dist/cli/version.d.ts.map +1 -1
  377. package/dist/cli/version.js +8 -5
  378. package/dist/cli/version.js.map +1 -1
  379. package/dist/cli-api.d.ts +36 -5
  380. package/dist/cli-api.d.ts.map +1 -1
  381. package/dist/cli-api.js +30 -4
  382. package/dist/cli-api.js.map +1 -1
  383. package/dist/composition/algebraic-equivalence.d.ts +43 -0
  384. package/dist/composition/algebraic-equivalence.d.ts.map +1 -0
  385. package/dist/composition/algebraic-equivalence.js +115 -0
  386. package/dist/composition/algebraic-equivalence.js.map +1 -0
  387. package/dist/composition/axes.d.ts +0 -6
  388. package/dist/composition/axes.d.ts.map +1 -1
  389. package/dist/composition/axes.js +6 -6
  390. package/dist/composition/axes.js.map +1 -1
  391. package/dist/composition/axis-audit.d.ts +47 -20
  392. package/dist/composition/axis-audit.d.ts.map +1 -1
  393. package/dist/composition/axis-audit.js +82 -9
  394. package/dist/composition/axis-audit.js.map +1 -1
  395. package/dist/composition/bridge-analysis.d.ts +17 -0
  396. package/dist/composition/bridge-analysis.d.ts.map +1 -1
  397. package/dist/composition/bridge-analysis.js +102 -55
  398. package/dist/composition/bridge-analysis.js.map +1 -1
  399. package/dist/composition/canonical-compare.d.ts +40 -0
  400. package/dist/composition/canonical-compare.d.ts.map +1 -1
  401. package/dist/composition/canonical-compare.js +122 -24
  402. package/dist/composition/canonical-compare.js.map +1 -1
  403. package/dist/composition/canonical-graph.d.ts +3 -3
  404. package/dist/composition/canonical-graph.d.ts.map +1 -1
  405. package/dist/composition/canonical-graph.js +11 -38
  406. package/dist/composition/canonical-graph.js.map +1 -1
  407. package/dist/composition/canonical-json.js +2 -2
  408. package/dist/composition/canonical-json.js.map +1 -1
  409. package/dist/composition/catalog-graph.d.ts.map +1 -1
  410. package/dist/composition/catalog-graph.js +2 -5
  411. package/dist/composition/catalog-graph.js.map +1 -1
  412. package/dist/composition/chain-candidate.d.ts +8 -0
  413. package/dist/composition/chain-candidate.d.ts.map +1 -1
  414. package/dist/composition/chain-candidate.js +9 -2
  415. package/dist/composition/chain-candidate.js.map +1 -1
  416. package/dist/composition/chain-match.d.ts +6 -3
  417. package/dist/composition/chain-match.d.ts.map +1 -1
  418. package/dist/composition/chain-match.js +4 -1
  419. package/dist/composition/chain-match.js.map +1 -1
  420. package/dist/composition/chain-result.d.ts.map +1 -1
  421. package/dist/composition/chain-result.js +2 -14
  422. package/dist/composition/chain-result.js.map +1 -1
  423. package/dist/composition/compose-symbolic.d.ts.map +1 -1
  424. package/dist/composition/compose-symbolic.js +3 -2
  425. package/dist/composition/compose-symbolic.js.map +1 -1
  426. package/dist/composition/compose.d.ts.map +1 -1
  427. package/dist/composition/compose.js +13 -5
  428. package/dist/composition/compose.js.map +1 -1
  429. package/dist/composition/composition-recovery.d.ts.map +1 -1
  430. package/dist/composition/composition-recovery.js +4 -7
  431. package/dist/composition/composition-recovery.js.map +1 -1
  432. package/dist/composition/consequence.d.ts +15 -5
  433. package/dist/composition/consequence.d.ts.map +1 -1
  434. package/dist/composition/consequence.js +6 -4
  435. package/dist/composition/consequence.js.map +1 -1
  436. package/dist/composition/discovery.d.ts +129 -9
  437. package/dist/composition/discovery.d.ts.map +1 -1
  438. package/dist/composition/discovery.js +171 -67
  439. package/dist/composition/discovery.js.map +1 -1
  440. package/dist/composition/edge.d.ts +21 -2
  441. package/dist/composition/edge.d.ts.map +1 -1
  442. package/dist/composition/edge.js +23 -1
  443. package/dist/composition/edge.js.map +1 -1
  444. package/dist/composition/enumerate.d.ts.map +1 -1
  445. package/dist/composition/enumerate.js +18 -3
  446. package/dist/composition/enumerate.js.map +1 -1
  447. package/dist/composition/evaluate-relation.d.ts +35 -11
  448. package/dist/composition/evaluate-relation.d.ts.map +1 -1
  449. package/dist/composition/evaluate-relation.js +60 -39
  450. package/dist/composition/evaluate-relation.js.map +1 -1
  451. package/dist/composition/explain.d.ts +3 -12
  452. package/dist/composition/explain.d.ts.map +1 -1
  453. package/dist/composition/explain.js +7 -20
  454. package/dist/composition/explain.js.map +1 -1
  455. package/dist/composition/expr-eval.d.ts +1 -1
  456. package/dist/composition/expr-eval.d.ts.map +1 -1
  457. package/dist/composition/expr-eval.js +6 -15
  458. package/dist/composition/expr-eval.js.map +1 -1
  459. package/dist/composition/expr-simplify.d.ts +26 -14
  460. package/dist/composition/expr-simplify.d.ts.map +1 -1
  461. package/dist/composition/expr-simplify.js +64 -72
  462. package/dist/composition/expr-simplify.js.map +1 -1
  463. package/dist/composition/formula-shape.d.ts +23 -4
  464. package/dist/composition/formula-shape.d.ts.map +1 -1
  465. package/dist/composition/formula-shape.js +57 -17
  466. package/dist/composition/formula-shape.js.map +1 -1
  467. package/dist/composition/graph-structure.d.ts +98 -0
  468. package/dist/composition/graph-structure.d.ts.map +1 -0
  469. package/dist/composition/graph-structure.js +167 -0
  470. package/dist/composition/graph-structure.js.map +1 -0
  471. package/dist/composition/graph-viz-svg.d.ts.map +1 -1
  472. package/dist/composition/graph-viz-svg.js +1 -1
  473. package/dist/composition/graph-viz-svg.js.map +1 -1
  474. package/dist/composition/graph-viz.d.ts.map +1 -1
  475. package/dist/composition/graph-viz.js +8 -37
  476. package/dist/composition/graph-viz.js.map +1 -1
  477. package/dist/composition/grounding.d.ts.map +1 -1
  478. package/dist/composition/grounding.js +19 -7
  479. package/dist/composition/grounding.js.map +1 -1
  480. package/dist/composition/identifiability.d.ts +91 -4
  481. package/dist/composition/identifiability.d.ts.map +1 -1
  482. package/dist/composition/identifiability.js +363 -6
  483. package/dist/composition/identifiability.js.map +1 -1
  484. package/dist/composition/index.d.ts +8 -4
  485. package/dist/composition/index.d.ts.map +1 -1
  486. package/dist/composition/index.js +3 -2
  487. package/dist/composition/index.js.map +1 -1
  488. package/dist/composition/mathts-quiet.d.ts +7 -8
  489. package/dist/composition/mathts-quiet.d.ts.map +1 -1
  490. package/dist/composition/mathts-quiet.js +7 -16
  491. package/dist/composition/mathts-quiet.js.map +1 -1
  492. package/dist/composition/mathts-scalar-symbols.d.ts.map +1 -1
  493. package/dist/composition/mathts-scalar-symbols.js +2 -1
  494. package/dist/composition/mathts-scalar-symbols.js.map +1 -1
  495. package/dist/composition/own-equation-magnitude.d.ts +95 -0
  496. package/dist/composition/own-equation-magnitude.d.ts.map +1 -0
  497. package/dist/composition/own-equation-magnitude.js +270 -0
  498. package/dist/composition/own-equation-magnitude.js.map +1 -0
  499. package/dist/composition/probe/backend-protocol.d.ts +3 -0
  500. package/dist/composition/probe/backend-protocol.d.ts.map +1 -1
  501. package/dist/composition/probe/backend-protocol.js.map +1 -1
  502. package/dist/composition/probe/candidate-store.d.ts +1 -0
  503. package/dist/composition/probe/candidate-store.d.ts.map +1 -1
  504. package/dist/composition/probe/candidate-store.js +1 -0
  505. package/dist/composition/probe/candidate-store.js.map +1 -1
  506. package/dist/composition/probe/corpus.d.ts +8 -4
  507. package/dist/composition/probe/corpus.d.ts.map +1 -1
  508. package/dist/composition/probe/corpus.js +23 -12
  509. package/dist/composition/probe/corpus.js.map +1 -1
  510. package/dist/composition/probe/dataset.d.ts +18 -0
  511. package/dist/composition/probe/dataset.d.ts.map +1 -1
  512. package/dist/composition/probe/dataset.js +95 -50
  513. package/dist/composition/probe/dataset.js.map +1 -1
  514. package/dist/composition/probe/experiment-design.d.ts +7 -1
  515. package/dist/composition/probe/experiment-design.d.ts.map +1 -1
  516. package/dist/composition/probe/experiment-design.js +44 -24
  517. package/dist/composition/probe/experiment-design.js.map +1 -1
  518. package/dist/composition/probe/falsify.d.ts +2 -0
  519. package/dist/composition/probe/falsify.d.ts.map +1 -1
  520. package/dist/composition/probe/falsify.js +2 -0
  521. package/dist/composition/probe/falsify.js.map +1 -1
  522. package/dist/composition/probe/fit.d.ts +7 -0
  523. package/dist/composition/probe/fit.d.ts.map +1 -1
  524. package/dist/composition/probe/fit.js +46 -22
  525. package/dist/composition/probe/fit.js.map +1 -1
  526. package/dist/composition/probe/frontier.d.ts.map +1 -1
  527. package/dist/composition/probe/frontier.js +33 -15
  528. package/dist/composition/probe/frontier.js.map +1 -1
  529. package/dist/composition/probe/generator.d.ts +30 -1
  530. package/dist/composition/probe/generator.d.ts.map +1 -1
  531. package/dist/composition/probe/generator.js +58 -36
  532. package/dist/composition/probe/generator.js.map +1 -1
  533. package/dist/composition/probe/index.d.ts +14 -0
  534. package/dist/composition/probe/index.d.ts.map +1 -1
  535. package/dist/composition/probe/index.js +6 -0
  536. package/dist/composition/probe/index.js.map +1 -1
  537. package/dist/composition/probe/limits.d.ts +25 -1
  538. package/dist/composition/probe/limits.d.ts.map +1 -1
  539. package/dist/composition/probe/limits.js +53 -11
  540. package/dist/composition/probe/limits.js.map +1 -1
  541. package/dist/composition/probe/pipeline.d.ts +5 -0
  542. package/dist/composition/probe/pipeline.d.ts.map +1 -1
  543. package/dist/composition/probe/pipeline.js +73 -24
  544. package/dist/composition/probe/pipeline.js.map +1 -1
  545. package/dist/composition/probe/power-law.d.ts +121 -0
  546. package/dist/composition/probe/power-law.d.ts.map +1 -0
  547. package/dist/composition/probe/power-law.js +251 -0
  548. package/dist/composition/probe/power-law.js.map +1 -0
  549. package/dist/composition/probe/problem.d.ts +8 -4
  550. package/dist/composition/probe/problem.d.ts.map +1 -1
  551. package/dist/composition/probe/problem.js +177 -49
  552. package/dist/composition/probe/problem.js.map +1 -1
  553. package/dist/composition/probe/report.js +1 -1
  554. package/dist/composition/probe/report.js.map +1 -1
  555. package/dist/composition/probe/residual.d.ts +7 -1
  556. package/dist/composition/probe/residual.d.ts.map +1 -1
  557. package/dist/composition/probe/residual.js +10 -7
  558. package/dist/composition/probe/residual.js.map +1 -1
  559. package/dist/composition/probe/run-manifest.d.ts +1 -0
  560. package/dist/composition/probe/run-manifest.d.ts.map +1 -1
  561. package/dist/composition/probe/run-manifest.js.map +1 -1
  562. package/dist/composition/probe/scalar-search.d.ts +50 -0
  563. package/dist/composition/probe/scalar-search.d.ts.map +1 -0
  564. package/dist/composition/probe/scalar-search.js +169 -0
  565. package/dist/composition/probe/scalar-search.js.map +1 -0
  566. package/dist/composition/probe/scoring.d.ts +1 -0
  567. package/dist/composition/probe/scoring.d.ts.map +1 -1
  568. package/dist/composition/probe/scoring.js.map +1 -1
  569. package/dist/composition/probe/structure.d.ts +82 -17
  570. package/dist/composition/probe/structure.d.ts.map +1 -1
  571. package/dist/composition/probe/structure.js +129 -55
  572. package/dist/composition/probe/structure.js.map +1 -1
  573. package/dist/composition/probe/study.d.ts +31 -9
  574. package/dist/composition/probe/study.d.ts.map +1 -1
  575. package/dist/composition/probe/study.js +235 -184
  576. package/dist/composition/probe/study.js.map +1 -1
  577. package/dist/composition/probe/t-tail.d.ts +16 -0
  578. package/dist/composition/probe/t-tail.d.ts.map +1 -0
  579. package/dist/composition/probe/t-tail.js +29 -0
  580. package/dist/composition/probe/t-tail.js.map +1 -0
  581. package/dist/composition/probe/types.d.ts +3 -0
  582. package/dist/composition/probe/types.d.ts.map +1 -1
  583. package/dist/composition/probe/types.js.map +1 -1
  584. package/dist/composition/proposed-bridges.d.ts +52 -12
  585. package/dist/composition/proposed-bridges.d.ts.map +1 -1
  586. package/dist/composition/proposed-bridges.js +107 -60
  587. package/dist/composition/proposed-bridges.js.map +1 -1
  588. package/dist/composition/quantity-clusters.d.ts +48 -0
  589. package/dist/composition/quantity-clusters.d.ts.map +1 -0
  590. package/dist/composition/quantity-clusters.js +98 -0
  591. package/dist/composition/quantity-clusters.js.map +1 -0
  592. package/dist/composition/rational-exponent.d.ts +40 -0
  593. package/dist/composition/rational-exponent.d.ts.map +1 -0
  594. package/dist/composition/rational-exponent.js +65 -0
  595. package/dist/composition/rational-exponent.js.map +1 -0
  596. package/dist/composition/representative-values.d.ts +22 -0
  597. package/dist/composition/representative-values.d.ts.map +1 -1
  598. package/dist/composition/representative-values.js +29 -0
  599. package/dist/composition/representative-values.js.map +1 -1
  600. package/dist/composition/retrodiction.d.ts +15 -0
  601. package/dist/composition/retrodiction.d.ts.map +1 -1
  602. package/dist/composition/retrodiction.js +12 -4
  603. package/dist/composition/retrodiction.js.map +1 -1
  604. package/dist/composition/user-equation.d.ts +1 -0
  605. package/dist/composition/user-equation.d.ts.map +1 -1
  606. package/dist/composition/user-equation.js +3 -2
  607. package/dist/composition/user-equation.js.map +1 -1
  608. package/dist/core/assignment.d.ts +19 -0
  609. package/dist/core/assignment.d.ts.map +1 -0
  610. package/dist/core/assignment.js +19 -0
  611. package/dist/core/assignment.js.map +1 -0
  612. package/dist/core/compare.d.ts +32 -0
  613. package/dist/core/compare.d.ts.map +1 -0
  614. package/dist/core/compare.js +46 -0
  615. package/dist/core/compare.js.map +1 -0
  616. package/dist/core/constants.d.ts +42 -41
  617. package/dist/core/constants.d.ts.map +1 -1
  618. package/dist/core/constants.js +71 -51
  619. package/dist/core/constants.js.map +1 -1
  620. package/dist/core/data-file.d.ts +7 -0
  621. package/dist/core/data-file.d.ts.map +1 -1
  622. package/dist/core/data-file.js +17 -0
  623. package/dist/core/data-file.js.map +1 -1
  624. package/dist/core/format.d.ts +36 -0
  625. package/dist/core/format.d.ts.map +1 -0
  626. package/dist/core/format.js +39 -0
  627. package/dist/core/format.js.map +1 -0
  628. package/dist/core/hash.d.ts +14 -0
  629. package/dist/core/hash.d.ts.map +1 -0
  630. package/dist/core/hash.js +17 -0
  631. package/dist/core/hash.js.map +1 -0
  632. package/dist/core/json-schema.d.ts +2 -0
  633. package/dist/core/json-schema.d.ts.map +1 -1
  634. package/dist/core/json-schema.js +14 -13
  635. package/dist/core/json-schema.js.map +1 -1
  636. package/dist/core/labeled-tensor.d.ts.map +1 -1
  637. package/dist/core/labeled-tensor.js +0 -8
  638. package/dist/core/labeled-tensor.js.map +1 -1
  639. package/dist/core/mathts-read.d.ts +25 -0
  640. package/dist/core/mathts-read.d.ts.map +1 -0
  641. package/dist/core/mathts-read.js +51 -0
  642. package/dist/core/mathts-read.js.map +1 -0
  643. package/dist/core/tensor.d.ts.map +1 -1
  644. package/dist/core/tensor.js +24 -0
  645. package/dist/core/tensor.js.map +1 -1
  646. package/dist/core/types.d.ts +5 -5
  647. package/dist/diff/bridge-ast-gradient.d.ts +27 -23
  648. package/dist/diff/bridge-ast-gradient.d.ts.map +1 -1
  649. package/dist/diff/bridge-ast-gradient.js +75 -173
  650. package/dist/diff/bridge-ast-gradient.js.map +1 -1
  651. package/dist/diff/bridge-gradient.d.ts +19 -6
  652. package/dist/diff/bridge-gradient.d.ts.map +1 -1
  653. package/dist/diff/bridge-gradient.js +19 -11
  654. package/dist/diff/bridge-gradient.js.map +1 -1
  655. package/dist/diff/bridge-specs.d.ts.map +1 -1
  656. package/dist/diff/bridge-specs.js +3 -0
  657. package/dist/diff/bridge-specs.js.map +1 -1
  658. package/dist/dimensional/algebra.d.ts +18 -0
  659. package/dist/dimensional/algebra.d.ts.map +1 -1
  660. package/dist/dimensional/algebra.js +41 -1
  661. package/dist/dimensional/algebra.js.map +1 -1
  662. package/dist/dimensional/ast-builders.d.ts +7 -0
  663. package/dist/dimensional/ast-builders.d.ts.map +1 -1
  664. package/dist/dimensional/ast-builders.js +11 -0
  665. package/dist/dimensional/ast-builders.js.map +1 -1
  666. package/dist/dimensional/ast-leaves.d.ts +81 -0
  667. package/dist/dimensional/ast-leaves.d.ts.map +1 -0
  668. package/dist/dimensional/ast-leaves.js +146 -0
  669. package/dist/dimensional/ast-leaves.js.map +1 -0
  670. package/dist/dimensional/ast-types.d.ts +15 -0
  671. package/dist/dimensional/ast-types.d.ts.map +1 -1
  672. package/dist/dimensional/ast-types.js.map +1 -1
  673. package/dist/dimensional/buckingham.d.ts.map +1 -1
  674. package/dist/dimensional/buckingham.js +15 -27
  675. package/dist/dimensional/buckingham.js.map +1 -1
  676. package/dist/dimensional/constant-rows.js +9 -9
  677. package/dist/dimensional/constant-rows.js.map +1 -1
  678. package/dist/dimensional/curvature-composite.d.ts +1 -1
  679. package/dist/dimensional/curvature-composite.js.map +1 -1
  680. package/dist/dimensional/dimension-inference.d.ts.map +1 -1
  681. package/dist/dimensional/dimension-inference.js +1 -2
  682. package/dist/dimensional/dimension-inference.js.map +1 -1
  683. package/dist/dimensional/errors.d.ts +1 -1
  684. package/dist/dimensional/errors.d.ts.map +1 -1
  685. package/dist/dimensional/errors.js +1 -15
  686. package/dist/dimensional/errors.js.map +1 -1
  687. package/dist/dimensional/exact-scale.d.ts +24 -11
  688. package/dist/dimensional/exact-scale.d.ts.map +1 -1
  689. package/dist/dimensional/exact-scale.js +122 -130
  690. package/dist/dimensional/exact-scale.js.map +1 -1
  691. package/dist/dimensional/gauge-field.d.ts.map +1 -1
  692. package/dist/dimensional/gauge-field.js +2 -2
  693. package/dist/dimensional/gauge-field.js.map +1 -1
  694. package/dist/dimensional/hyphen-names.d.ts +12 -2
  695. package/dist/dimensional/hyphen-names.d.ts.map +1 -1
  696. package/dist/dimensional/hyphen-names.js +44 -19
  697. package/dist/dimensional/hyphen-names.js.map +1 -1
  698. package/dist/dimensional/mathts-unit-delegation.d.ts +29 -0
  699. package/dist/dimensional/mathts-unit-delegation.d.ts.map +1 -0
  700. package/dist/dimensional/mathts-unit-delegation.js +187 -0
  701. package/dist/dimensional/mathts-unit-delegation.js.map +1 -0
  702. package/dist/dimensional/mathts-unit-wrapper.d.ts +33 -0
  703. package/dist/dimensional/mathts-unit-wrapper.d.ts.map +1 -0
  704. package/dist/dimensional/mathts-unit-wrapper.js +190 -0
  705. package/dist/dimensional/mathts-unit-wrapper.js.map +1 -0
  706. package/dist/dimensional/metric.d.ts.map +1 -1
  707. package/dist/dimensional/metric.js +0 -1
  708. package/dist/dimensional/metric.js.map +1 -1
  709. package/dist/dimensional/scalar-lowering.d.ts +21 -0
  710. package/dist/dimensional/scalar-lowering.d.ts.map +1 -0
  711. package/dist/dimensional/scalar-lowering.js +45 -0
  712. package/dist/dimensional/scalar-lowering.js.map +1 -0
  713. package/dist/dimensional/symbolic-constants.d.ts +9 -0
  714. package/dist/dimensional/symbolic-constants.d.ts.map +1 -1
  715. package/dist/dimensional/symbolic-constants.js +13 -1
  716. package/dist/dimensional/symbolic-constants.js.map +1 -1
  717. package/dist/dimensional/types.d.ts +36 -0
  718. package/dist/dimensional/types.d.ts.map +1 -1
  719. package/dist/dimensional/types.js +45 -7
  720. package/dist/dimensional/types.js.map +1 -1
  721. package/dist/dimensional/unit-data.d.ts +5 -1
  722. package/dist/dimensional/unit-data.d.ts.map +1 -1
  723. package/dist/dimensional/unit-data.js +30 -6
  724. package/dist/dimensional/unit-data.js.map +1 -1
  725. package/dist/dimensional/units.d.ts +2 -0
  726. package/dist/dimensional/units.d.ts.map +1 -1
  727. package/dist/dimensional/units.js +59 -3
  728. package/dist/dimensional/units.js.map +1 -1
  729. package/dist/dimensional/validator.d.ts +2 -0
  730. package/dist/dimensional/validator.d.ts.map +1 -1
  731. package/dist/dimensional/validator.js.map +1 -1
  732. package/dist/index.d.ts +9 -3
  733. package/dist/index.d.ts.map +1 -1
  734. package/dist/index.js +10 -4
  735. package/dist/index.js.map +1 -1
  736. package/dist/numerical/christoffel-flat.d.ts.map +1 -1
  737. package/dist/numerical/christoffel-flat.js +3 -2
  738. package/dist/numerical/christoffel-flat.js.map +1 -1
  739. package/dist/numerical/connection-lowering-helpers.d.ts +3 -1
  740. package/dist/numerical/connection-lowering-helpers.d.ts.map +1 -1
  741. package/dist/numerical/connection-lowering-helpers.js +11 -15
  742. package/dist/numerical/connection-lowering-helpers.js.map +1 -1
  743. package/dist/numerical/covariant-eikonal.d.ts.map +1 -1
  744. package/dist/numerical/covariant-eikonal.js +34 -11
  745. package/dist/numerical/covariant-eikonal.js.map +1 -1
  746. package/dist/numerical/curvature-lowering-helpers.js +3 -2
  747. package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
  748. package/dist/numerical/errors.d.ts.map +1 -1
  749. package/dist/numerical/errors.js +0 -3
  750. package/dist/numerical/errors.js.map +1 -1
  751. package/dist/numerical/finite-difference.d.ts +22 -0
  752. package/dist/numerical/finite-difference.d.ts.map +1 -0
  753. package/dist/numerical/finite-difference.js +27 -0
  754. package/dist/numerical/finite-difference.js.map +1 -0
  755. package/dist/numerical/geodesic-integrator.d.ts.map +1 -1
  756. package/dist/numerical/geodesic-integrator.js +22 -14
  757. package/dist/numerical/geodesic-integrator.js.map +1 -1
  758. package/dist/numerical/geometrized.d.ts.map +1 -1
  759. package/dist/numerical/geometrized.js +0 -1
  760. package/dist/numerical/geometrized.js.map +1 -1
  761. package/dist/numerical/mathts-engine.d.ts.map +1 -1
  762. package/dist/numerical/mathts-engine.js +10 -24
  763. package/dist/numerical/mathts-engine.js.map +1 -1
  764. package/dist/numerical/metric-inverse.d.ts.map +1 -1
  765. package/dist/numerical/metric-inverse.js +83 -46
  766. package/dist/numerical/metric-inverse.js.map +1 -1
  767. package/dist/numerical/null-ray-integrator.d.ts +2 -1
  768. package/dist/numerical/null-ray-integrator.d.ts.map +1 -1
  769. package/dist/numerical/null-ray-integrator.js +12 -12
  770. package/dist/numerical/null-ray-integrator.js.map +1 -1
  771. package/dist/numerical/painleve-gullstrand-metric.js +2 -2
  772. package/dist/numerical/painleve-gullstrand-metric.js.map +1 -1
  773. package/dist/numerical/pderiv.d.ts.map +1 -1
  774. package/dist/numerical/pderiv.js +2 -6
  775. package/dist/numerical/pderiv.js.map +1 -1
  776. package/dist/numerical/perihelion-finder.d.ts +0 -36
  777. package/dist/numerical/perihelion-finder.d.ts.map +1 -1
  778. package/dist/numerical/perihelion-finder.js +41 -87
  779. package/dist/numerical/perihelion-finder.js.map +1 -1
  780. package/dist/numerical/quadrature.d.ts.map +1 -1
  781. package/dist/numerical/quadrature.js +11 -13
  782. package/dist/numerical/quadrature.js.map +1 -1
  783. package/dist/numerical/rk4-trajectory.d.ts +10 -0
  784. package/dist/numerical/rk4-trajectory.d.ts.map +1 -0
  785. package/dist/numerical/rk4-trajectory.js +37 -0
  786. package/dist/numerical/rk4-trajectory.js.map +1 -0
  787. package/dist/numerical/schwarzschild.d.ts +14 -0
  788. package/dist/numerical/schwarzschild.d.ts.map +1 -0
  789. package/dist/numerical/schwarzschild.js +17 -0
  790. package/dist/numerical/schwarzschild.js.map +1 -0
  791. package/dist/numerical/spacetime-metrics.d.ts +12 -0
  792. package/dist/numerical/spacetime-metrics.d.ts.map +1 -1
  793. package/dist/numerical/spacetime-metrics.js +72 -56
  794. package/dist/numerical/spacetime-metrics.js.map +1 -1
  795. package/dist/numerical/statistics.d.ts +24 -0
  796. package/dist/numerical/statistics.d.ts.map +1 -0
  797. package/dist/numerical/statistics.js +52 -0
  798. package/dist/numerical/statistics.js.map +1 -0
  799. package/dist/numerical/strides.d.ts +3 -2
  800. package/dist/numerical/strides.d.ts.map +1 -1
  801. package/dist/numerical/strides.js +3 -10
  802. package/dist/numerical/strides.js.map +1 -1
  803. package/dist/numerical/tensor-engine.d.ts +21 -0
  804. package/dist/numerical/tensor-engine.d.ts.map +1 -1
  805. package/dist/numerical/tensor-engine.js +12 -0
  806. package/dist/numerical/tensor-engine.js.map +1 -1
  807. package/dist/relations/regime.d.ts +10 -0
  808. package/dist/relations/regime.d.ts.map +1 -1
  809. package/dist/relations/regime.js +18 -1
  810. package/dist/relations/regime.js.map +1 -1
  811. package/package.json +9 -12
  812. package/dist/cases/brownian-sphere.d.ts +0 -68
  813. package/dist/cases/brownian-sphere.d.ts.map +0 -1
  814. package/dist/cases/brownian-sphere.js +0 -354
  815. package/dist/cases/brownian-sphere.js.map +0 -1
  816. package/dist/cases/damped-resonator.d.ts +0 -23
  817. package/dist/cases/damped-resonator.d.ts.map +0 -1
  818. package/dist/cases/damped-resonator.js +0 -224
  819. package/dist/cases/damped-resonator.js.map +0 -1
  820. package/dist/cases/kepler-rv.d.ts +0 -13
  821. package/dist/cases/kepler-rv.d.ts.map +0 -1
  822. package/dist/cases/kepler-rv.js +0 -172
  823. package/dist/cases/kepler-rv.js.map +0 -1
  824. package/dist/cases/lumped-cooling.d.ts +0 -46
  825. package/dist/cases/lumped-cooling.d.ts.map +0 -1
  826. package/dist/cases/lumped-cooling.js +0 -261
  827. package/dist/cases/lumped-cooling.js.map +0 -1
  828. package/dist/cases/resistor-noise.d.ts +0 -14
  829. package/dist/cases/resistor-noise.d.ts.map +0 -1
  830. package/dist/cases/resistor-noise.js +0 -215
  831. package/dist/cases/resistor-noise.js.map +0 -1
  832. package/dist/cases/skin-depth.d.ts +0 -21
  833. package/dist/cases/skin-depth.d.ts.map +0 -1
  834. package/dist/cases/skin-depth.js +0 -174
  835. package/dist/cases/skin-depth.js.map +0 -1
@@ -1 +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 DiscoveryBackendDescriptor,\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 {\n generateNative,\n nativeDetermination,\n powerLawDetermination,\n powerLawWording,\n withinAstCaps,\n type RawCandidate,\n} 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';\nimport {\n SCALAR_SEARCH_ORIGIN,\n scalarSearchCandidates,\n UnsupportedScalarFunctionError,\n type ProbeScalarSearchOptions,\n} from './scalar-search.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\n/** The optional settings of one probe search: budget, run id, backend and corpus version. */\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 /** Opt-in MathTS scalar-search candidate source (plan task P5). Absent: the search does not run. */\n readonly scalarSearch?: ProbeScalarSearchOptions;\n readonly corpusVersion?: string;\n readonly now?: string;\n}\n\n/** The outcome of one probe search: its manifest, candidates, rankings and stop reason. */\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 * The manifest's backend list: the native enumerator, then each opted-in source.\n * `undefined` when no source is opted in, so a default run's manifest is unchanged.\n */\nfunction backendDescriptorsFor(opts: ProbeSearchOptions): readonly DiscoveryBackendDescriptor[] | undefined {\n if (!opts.backendArgv && !opts.scalarSearch) return undefined;\n const list: DiscoveryBackendDescriptor[] = [\n {\n protocolVersion: '0',\n backendId: 'native',\n backendVersion: SCHEMA_VERSION,\n capabilities: ['grammar-enumerator'],\n deterministic: 'yes',\n },\n ];\n if (opts.backendArgv) {\n list.push({\n protocolVersion: '0',\n backendId: opts.backendArgv.join(' '),\n backendVersion: 'external',\n capabilities: ['external-backend'],\n deterministic: 'unknown',\n });\n }\n if (opts.scalarSearch) {\n list.push({\n protocolVersion: '0',\n backendId: SCALAR_SEARCH_ORIGIN,\n backendVersion: 'mathts-functions',\n capabilities: ['scalar-search'],\n deterministic: 'seeded',\n });\n }\n return list;\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 if (opts.scalarSearch && !budgetStopReason(state)) {\n const remainingMs = Math.max(1, budget.maxWallClockMs - (performance.now() - state.startedAtMs));\n try {\n const found = await scalarSearchCandidates(problem, opts.scalarSearch, remainingMs);\n if (found.note !== undefined) wording.push(found.note);\n for (const raw of found.raws) {\n if (budgetStopReason(state)) break;\n if (!withinAstCaps(raw.expression, budget)) continue;\n state.candidates += 1;\n raws.push(raw);\n }\n } catch (err) {\n if (err instanceof UnsupportedScalarFunctionError) throw err;\n wording.push(`scalar search abstained: ${err instanceof Error ? err.message : String(err)}`);\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: backendDescriptorsFor(opts),\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 : raw.originNote === SCALAR_SEARCH_ORIGIN\n ? { kind: 'external-backend', backendId: SCALAR_SEARCH_ORIGIN, 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, at);\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,251 @@
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 { gcd, matrixRank, ols } from '@danielsimonjr/mathts-functions';
21
+ import { numberFrom } from '../../core/mathts-read.js';
22
+ import { buckinghamPi, dimensionallyDetermines } from '../../dimensional/buckingham.js';
23
+ /** The largest denominator the exponent scan admits. @internal */
24
+ export const MAX_EXPONENT_DENOMINATOR = 6;
25
+ /**
26
+ * Every distinct reduced fraction p/q with q ≤ `maxDen` within `tol` of `x`,
27
+ * in order of denominator (so 1/2 comes before 2/3). Empty when none is near;
28
+ * more than one when the tolerance is too wide to tell them apart. @internal
29
+ */
30
+ export function rationalCandidates(x, tol, maxDen = MAX_EXPONENT_DENOMINATOR) {
31
+ if (!Number.isFinite(x) || !(tol >= 0))
32
+ return [];
33
+ const out = [];
34
+ for (let d = 1; d <= maxDen; d++) {
35
+ const lo = Math.ceil((x - tol) * d);
36
+ const hi = Math.floor((x + tol) * d);
37
+ for (let n = lo; n <= hi; n++) {
38
+ const g = numberFrom('gcd', gcd(Math.abs(n), d));
39
+ const r = { numerator: n / g, denominator: d / g };
40
+ if (!out.some((o) => o.numerator === r.numerator && o.denominator === r.denominator))
41
+ out.push(r);
42
+ }
43
+ }
44
+ return out;
45
+ }
46
+ /**
47
+ * The one fraction p/q with q ≤ `maxDen` within `tol` of `x`, or null when
48
+ * there is none or more than one (an estimate whose interval holds two
49
+ * admissible fractions does not determine either). @internal
50
+ */
51
+ export function rationalizeExponent(x, tol, maxDen = MAX_EXPONENT_DENOMINATOR) {
52
+ const all = rationalCandidates(x, tol, maxDen);
53
+ return all.length === 1 ? all[0] : null;
54
+ }
55
+ /**
56
+ * The π-groups among the governing variables (MathTS `rationalNullspace`
57
+ * through {@link buckinghamPi}) and the base monomial: the unique monomial of
58
+ * the target over the first maximal dimensionally independent subset of the
59
+ * governing set, in declared order. @internal
60
+ */
61
+ export function piStructure(target, governing) {
62
+ if (governing.length === 0)
63
+ return { groups: [], base: null };
64
+ const groups = buckinghamPi(governing).piGroups;
65
+ const independent = [];
66
+ for (const g of governing) {
67
+ if (buckinghamPi([...independent, g]).piGroupCount === 0)
68
+ independent.push(g);
69
+ }
70
+ const det = dimensionallyDetermines(target, independent);
71
+ const base = {};
72
+ if (det.determined && det.monomial) {
73
+ for (const g of governing)
74
+ base[g.name] = det.monomial[g.name] ?? 0;
75
+ return { groups, base };
76
+ }
77
+ return { groups, base: null };
78
+ }
79
+ /** `Π row[name]^exp` over the non-zero exponents; NaN when a name is missing. */
80
+ function monomialValue(exponents, row) {
81
+ let v = 1;
82
+ for (const [name, e] of Object.entries(exponents)) {
83
+ if (e === 0)
84
+ continue;
85
+ const x = row[name];
86
+ if (x === undefined)
87
+ return NaN;
88
+ v *= x ** e;
89
+ }
90
+ return v;
91
+ }
92
+ /** The log-design matrix over the rows where every π-group is positive and finite. @internal */
93
+ export function logDesign(groups, rows) {
94
+ const out = [];
95
+ let skipped = 0;
96
+ for (const row of rows) {
97
+ const pis = groups.map((g) => monomialValue(g.exponents, row));
98
+ if (!pis.every((p) => Number.isFinite(p) && p > 0)) {
99
+ skipped += 1;
100
+ continue;
101
+ }
102
+ out.push([1, ...pis.map((p) => Math.log(p))]);
103
+ }
104
+ return { rows: out, used: out.length, skipped };
105
+ }
106
+ /** Each column divided by its largest magnitude (a zero column stays zero): order one, as `ols` and `matrixRank` need. */
107
+ function scaleColumns(rows) {
108
+ const k = rows[0]?.length ?? 0;
109
+ const scales = Array.from({ length: k }, (_, j) => rows.reduce((m, r) => Math.max(m, Math.abs(r[j])), 0));
110
+ const scaled = rows.map((r) => r.map((v, j) => (scales[j] > 0 ? v / scales[j] : 0)));
111
+ return { scaled, scales };
112
+ }
113
+ /**
114
+ * The rank of a log-design (MathTS `matrixRank`, whose tolerance is an absolute
115
+ * 1e-10, so the columns are scaled to order one first). 0 for no rows. @internal
116
+ */
117
+ export function logDesignRank(design) {
118
+ if (design.rows.length === 0)
119
+ return 0;
120
+ const { scaled } = scaleColumns(design.rows);
121
+ const r = matrixRank(scaled);
122
+ if (typeof r !== 'number' || !Number.isInteger(r))
123
+ throw new TypeError('matrixRank did not return an integer');
124
+ return r;
125
+ }
126
+ /** A finite number read back from a MathTS result array, or null. */
127
+ function numberAt(arr, i) {
128
+ if (!Array.isArray(arr))
129
+ return null;
130
+ const v = arr[i];
131
+ return typeof v === 'number' && Number.isFinite(v) ? v : null;
132
+ }
133
+ /**
134
+ * Fit `log(y/base) = log C + Σ aₖ log πₖ` on the exploratory rows and
135
+ * rationalise the exponents (module docs). Not applicable when the governing
136
+ * set already fixes the target (the unique-monomial path searches that), when
137
+ * it leaves no π-group, or when the target is outside its span. Abstains, with
138
+ * the reason, without exploratory rows, below k + 2 usable rows, when a
139
+ * π-group does not vary, when the log-design is collinear, or when an exponent
140
+ * is not within 2σ of a fraction with denominator ≤ 6. @internal
141
+ */
142
+ export function powerLawDetermination(problem) {
143
+ const full = dimensionallyDetermines(problem.target, problem.governing);
144
+ if (full.determined) {
145
+ return { kind: 'not-applicable', reason: 'the governing set fixes the target up to a constant; the unique-monomial path searches it' };
146
+ }
147
+ const { groups, base } = piStructure(problem.target, problem.governing);
148
+ if (groups.length === 0) {
149
+ return { kind: 'not-applicable', reason: 'the governing set leaves no dimensionless group to raise to a power' };
150
+ }
151
+ if (base === null) {
152
+ return { kind: 'not-applicable', reason: "the target's dimension is not in the span of the governing variables" };
153
+ }
154
+ const rows = problem.exploratory?.rows ?? [];
155
+ if (rows.length === 0) {
156
+ return { kind: 'abstained', reason: 'no exploratory rows: the power-law fit needs data', nRows: 0, skippedRows: 0 };
157
+ }
158
+ const k = groups.length;
159
+ const X = [];
160
+ const ylog = [];
161
+ let skipped = 0;
162
+ for (const row of rows) {
163
+ const y = row[problem.target.name];
164
+ const b = monomialValue(base, row);
165
+ const pis = groups.map((g) => monomialValue(g.exponents, row));
166
+ if (!(y !== undefined && Number.isFinite(y) && y > 0 && Number.isFinite(b) && b > 0) || !pis.every((p) => Number.isFinite(p) && p > 0)) {
167
+ skipped += 1;
168
+ continue;
169
+ }
170
+ X.push(pis.map((p) => Math.log(p)));
171
+ ylog.push(Math.log(y / b));
172
+ }
173
+ const used = X.length;
174
+ const abstain = (reason) => ({ kind: 'abstained', reason, nRows: used, skippedRows: skipped });
175
+ if (used < k + 2) {
176
+ 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}`);
177
+ }
178
+ // A π-group whose log spreads by no more than round-off (1e-12 of its magnitude, or absolute)
179
+ // does not vary: a/b with b = a is 1 up to an ulp, and that ulp is not an exponent's evidence.
180
+ for (let j = 0; j < k; j++) {
181
+ // Reductions, not spreads: a spread of a large row set overflows the call stack.
182
+ const lo = X.reduce((m, r) => Math.min(m, r[j]), Number.POSITIVE_INFINITY);
183
+ const hi = X.reduce((m, r) => Math.max(m, r[j]), Number.NEGATIVE_INFINITY);
184
+ if (hi - lo <= 1e-12 * Math.max(1, Math.abs(hi), Math.abs(lo))) {
185
+ return abstain(`π-group ${groups[j].formula} does not vary over the usable rows, so its exponent is not identifiable`);
186
+ }
187
+ }
188
+ // Columns scaled to order one. History: before @danielsimonjr/mathts-functions 0.68.4, `ols`
189
+ // tested singularity with an absolute 1e-15, so a column of log π of magnitude 1e-9 read as
190
+ // collinear unscaled. From 0.68.4 (installed) `ols` equilibrates the design itself, and an
191
+ // unscaled 1e-9 column fits without throwing. The scaling stays, because it also conditions
192
+ // `matrixRank` (logDesignRank, which scales the same way). Coefficients and errors are unscaled after.
193
+ const { scaled, scales } = scaleColumns(X);
194
+ let fit;
195
+ try {
196
+ fit = ols(scaled, ylog, { intercept: true });
197
+ }
198
+ catch (e) {
199
+ return abstain(`the log-design is collinear over the rows (${e.message}); the exponents are not identifiable`);
200
+ }
201
+ const logPrefactor = numberAt(fit.coefficients, 0);
202
+ const r2 = typeof fit.r2 === 'number' && Number.isFinite(fit.r2) ? fit.r2 : null;
203
+ if (logPrefactor === null || r2 === null)
204
+ return abstain('ols did not return a finite intercept and R²');
205
+ const exponents = [];
206
+ for (let j = 0; j < k; j++) {
207
+ const c = numberAt(fit.coefficients, j + 1);
208
+ const se = numberAt(fit.stderr, j + 1);
209
+ if (c === null || se === null)
210
+ return abstain(`ols did not return a finite coefficient and standard error for π-group ${groups[j].formula}`);
211
+ const estimate = c / scales[j];
212
+ const stderr = se / scales[j];
213
+ // Noise-free rows give stderr 0; a representation tolerance keeps 0.5000000000000001 at 1/2.
214
+ const tol = Math.max(2 * stderr, 1e-9 * Math.max(1, Math.abs(estimate)));
215
+ const near = rationalCandidates(estimate, tol);
216
+ const rational = near.length === 1 ? near[0] : null;
217
+ const group = groups[j];
218
+ exponents.push({ group: group.formula, exponents: group.exponents, estimate, stderr, interval: [estimate - 2 * stderr, estimate + 2 * stderr], rational });
219
+ const value = `${estimate.toPrecision(4)} ± ${stderr.toPrecision(2)}`;
220
+ if (near.length === 0) {
221
+ return abstain(`the exponent of ${group.formula} is ${value}, not within 2σ of a fraction with denominator ≤ ${MAX_EXPONENT_DENOMINATOR}`);
222
+ }
223
+ if (near.length > 1) {
224
+ const list = near.slice(0, 4).map((r) => (r.denominator === 1 ? `${r.numerator}` : `${r.numerator}/${r.denominator}`)).join(', ');
225
+ 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`);
226
+ }
227
+ }
228
+ const monomial = { ...base };
229
+ for (const e of exponents) {
230
+ const a = e.rational.numerator / e.rational.denominator;
231
+ for (const [name, p] of Object.entries(e.exponents))
232
+ monomial[name] = (monomial[name] ?? 0) + a * p;
233
+ }
234
+ return { kind: 'fit', base, exponents, logPrefactor, r2, nRows: used, skippedRows: skipped, monomial };
235
+ }
236
+ /** One line for a run's wording: what the power-law fit found or why it abstained. @internal */
237
+ export function powerLawWording(pl) {
238
+ if (pl.kind === 'not-applicable')
239
+ return null;
240
+ if (pl.kind === 'abstained')
241
+ return `no power law from the exploratory rows: ${pl.reason}`;
242
+ const terms = pl.exponents
243
+ .map((e) => {
244
+ const { numerator: p, denominator: q } = e.rational;
245
+ const frac = q === 1 ? `${p}` : `${p}/${q}`;
246
+ return `(${e.group})^(${frac}) [a = ${e.estimate.toPrecision(3)} ± ${e.stderr.toPrecision(2)}]`;
247
+ })
248
+ .join(' · ');
249
+ 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`;
250
+ }
251
+ //# sourceMappingURL=power-law.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"power-law.js","sourceRoot":"","sources":["../../../src/composition/probe/power-law.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Power-law discovery over the Buckingham π-groups (proposal 8 of\n * docs/planning/2026-10-15-map-maker-discoverer-proposals.md).\n *\n * When the governing variables leave k ≥ 1 dimensionless groups, dimensional\n * analysis fixes the target only as `base · F(π₁, …, πₖ)` for an unknown F.\n * This module fits the one family a monomial search can state, F = C Π πₖ^{aₖ}:\n * `log(y/base) = log C + Σ aₖ log πₖ` by MathTS `ols` on the exploratory rows,\n * reads the coefficients and their standard errors back, and rationalises each\n * aₖ that lies within 2·stderr of a fraction with denominator ≤ 6 (a bounded\n * scan, not `Fraction.fromNumber`, whose continued fraction can exceed its\n * cap). An exponent that is not such a fraction is a NEGATIVE RESULT stated in\n * the abstention, not a candidate with a decimal exponent.\n *\n * The fit reads `problem.exploratory` only: the holdout rows are never seen\n * here, exactly as `fit.ts` never fits them.\n *\n * @internal\n */\n\nimport { gcd, matrixRank, ols } from '@danielsimonjr/mathts-functions';\nimport { numberFrom } from '../../core/mathts-read.js';\nimport { buckinghamPi, dimensionallyDetermines, type PiGroup } from '../../dimensional/buckingham.js';\nimport type { DimensionalVariableRef, ObservationRow, SearchProblem } from './types.js';\n\n/** One fitted π-group exponent: the estimate, its standard error, the 2σ interval and the fraction chosen in it. @internal */\nexport interface PowerLawExponent {\n /** The π-group's display form, e.g. `a · b^-1`. */\n readonly group: string;\n /** The π-group's integer exponent per variable. */\n readonly exponents: Readonly<Record<string, number>>;\n readonly estimate: number;\n readonly stderr: number;\n /** estimate ± 2·stderr. */\n readonly interval: readonly [number, number];\n /** The fraction with the smallest denominator ≤ 6 inside the interval; null when there is none. */\n readonly rational: { readonly numerator: number; readonly denominator: number } | null;\n}\n\n/** A recovered rational power law: `monomial` is base + Σ (pₖ/qₖ)·πₖ per variable. @internal */\nexport interface PowerLawFit {\n readonly kind: 'fit';\n /** The base monomial of the target over a maximal dimensionally independent subset of the governing set. */\n readonly base: Readonly<Record<string, number>>;\n readonly exponents: readonly PowerLawExponent[];\n /** log C of the fit (the prefactor is refit on the linear scale by the pipeline, like any candidate's). */\n readonly logPrefactor: number;\n readonly r2: number;\n /** Rows the fit used: a positive finite observation, base and every π. */\n readonly nRows: number;\n readonly skippedRows: number;\n /** The combined exponent per governing variable, rational values as numbers. */\n readonly monomial: Readonly<Record<string, number>>;\n}\n\n/** The outcome of {@link powerLawDetermination}. @internal */\nexport type PowerLawDetermination =\n | PowerLawFit\n | { readonly kind: 'not-applicable'; readonly reason: string }\n | { readonly kind: 'abstained'; readonly reason: string; readonly nRows: number; readonly skippedRows: number };\n\n/** The largest denominator the exponent scan admits. @internal */\nexport const MAX_EXPONENT_DENOMINATOR = 6;\n\n/** A reduced fraction. @internal */\nexport interface Rational {\n readonly numerator: number;\n readonly denominator: number;\n}\n\n/**\n * Every distinct reduced fraction p/q with q ≤ `maxDen` within `tol` of `x`,\n * in order of denominator (so 1/2 comes before 2/3). Empty when none is near;\n * more than one when the tolerance is too wide to tell them apart. @internal\n */\nexport function rationalCandidates(x: number, tol: number, maxDen = MAX_EXPONENT_DENOMINATOR): Rational[] {\n if (!Number.isFinite(x) || !(tol >= 0)) return [];\n const out: Rational[] = [];\n for (let d = 1; d <= maxDen; d++) {\n const lo = Math.ceil((x - tol) * d);\n const hi = Math.floor((x + tol) * d);\n for (let n = lo; n <= hi; n++) {\n const g = numberFrom('gcd', gcd(Math.abs(n), d));\n const r = { numerator: n / g, denominator: d / g };\n if (!out.some((o) => o.numerator === r.numerator && o.denominator === r.denominator)) out.push(r);\n }\n }\n return out;\n}\n\n/**\n * The one fraction p/q with q ≤ `maxDen` within `tol` of `x`, or null when\n * there is none or more than one (an estimate whose interval holds two\n * admissible fractions does not determine either). @internal\n */\nexport function rationalizeExponent(x: number, tol: number, maxDen = MAX_EXPONENT_DENOMINATOR): Rational | null {\n const all = rationalCandidates(x, tol, maxDen);\n return all.length === 1 ? all[0]! : null;\n}\n\n/** The π-groups of the governing set and the target's base monomial over a maximal dimensionally independent subset. @internal */\nexport interface PiStructure {\n readonly groups: readonly PiGroup[];\n /** Null when the target's dimension is not in the span of the governing variables. */\n readonly base: Readonly<Record<string, number>> | null;\n}\n\n/**\n * The π-groups among the governing variables (MathTS `rationalNullspace`\n * through {@link buckinghamPi}) and the base monomial: the unique monomial of\n * the target over the first maximal dimensionally independent subset of the\n * governing set, in declared order. @internal\n */\nexport function piStructure(target: DimensionalVariableRef, governing: readonly DimensionalVariableRef[]): PiStructure {\n if (governing.length === 0) return { groups: [], base: null };\n const groups = buckinghamPi(governing).piGroups;\n const independent: DimensionalVariableRef[] = [];\n for (const g of governing) {\n if (buckinghamPi([...independent, g]).piGroupCount === 0) independent.push(g);\n }\n const det = dimensionallyDetermines(target, independent);\n const base: Record<string, number> = {};\n if (det.determined && det.monomial) {\n for (const g of governing) base[g.name] = det.monomial[g.name] ?? 0;\n return { groups, base };\n }\n return { groups, base: null };\n}\n\n/** `Π row[name]^exp` over the non-zero exponents; NaN when a name is missing. */\nfunction monomialValue(exponents: Readonly<Record<string, number>>, row: ObservationRow): number {\n let v = 1;\n for (const [name, e] of Object.entries(exponents)) {\n if (e === 0) continue;\n const x = row[name];\n if (x === undefined) return NaN;\n v *= x ** e;\n }\n return v;\n}\n\n/** The log-design of a set of rows: `[1, log π₁, …, log πₖ]` per usable row. @internal */\nexport interface LogDesign {\n readonly rows: readonly (readonly number[])[];\n /** Rows where every π-group is positive and finite. */\n readonly used: number;\n readonly skipped: number;\n}\n\n/** The log-design matrix over the rows where every π-group is positive and finite. @internal */\nexport function logDesign(groups: readonly PiGroup[], rows: readonly ObservationRow[]): LogDesign {\n const out: number[][] = [];\n let skipped = 0;\n for (const row of rows) {\n const pis = groups.map((g) => monomialValue(g.exponents, row));\n if (!pis.every((p) => Number.isFinite(p) && p > 0)) {\n skipped += 1;\n continue;\n }\n out.push([1, ...pis.map((p) => Math.log(p))]);\n }\n return { rows: out, used: out.length, skipped };\n}\n\n/** Each column divided by its largest magnitude (a zero column stays zero): order one, as `ols` and `matrixRank` need. */\nfunction scaleColumns(rows: readonly (readonly number[])[]): { scaled: number[][]; scales: number[] } {\n const k = rows[0]?.length ?? 0;\n const scales = Array.from({ length: k }, (_, j) => rows.reduce((m, r) => Math.max(m, Math.abs(r[j]!)), 0));\n const scaled = rows.map((r) => r.map((v, j) => (scales[j]! > 0 ? v / scales[j]! : 0)));\n return { scaled, scales };\n}\n\n/**\n * The rank of a log-design (MathTS `matrixRank`, whose tolerance is an absolute\n * 1e-10, so the columns are scaled to order one first). 0 for no rows. @internal\n */\nexport function logDesignRank(design: LogDesign): number {\n if (design.rows.length === 0) return 0;\n const { scaled } = scaleColumns(design.rows);\n const r: unknown = matrixRank(scaled);\n if (typeof r !== 'number' || !Number.isInteger(r)) throw new TypeError('matrixRank did not return an integer');\n return r;\n}\n\n/** A finite number read back from a MathTS result array, or null. */\nfunction numberAt(arr: unknown, i: number): number | null {\n if (!Array.isArray(arr)) return null;\n const v: unknown = arr[i];\n return typeof v === 'number' && Number.isFinite(v) ? v : null;\n}\n\n/**\n * Fit `log(y/base) = log C + Σ aₖ log πₖ` on the exploratory rows and\n * rationalise the exponents (module docs). Not applicable when the governing\n * set already fixes the target (the unique-monomial path searches that), when\n * it leaves no π-group, or when the target is outside its span. Abstains, with\n * the reason, without exploratory rows, below k + 2 usable rows, when a\n * π-group does not vary, when the log-design is collinear, or when an exponent\n * is not within 2σ of a fraction with denominator ≤ 6. @internal\n */\nexport function powerLawDetermination(problem: SearchProblem): PowerLawDetermination {\n const full = dimensionallyDetermines(problem.target, problem.governing);\n if (full.determined) {\n return { kind: 'not-applicable', reason: 'the governing set fixes the target up to a constant; the unique-monomial path searches it' };\n }\n const { groups, base } = piStructure(problem.target, problem.governing);\n if (groups.length === 0) {\n return { kind: 'not-applicable', reason: 'the governing set leaves no dimensionless group to raise to a power' };\n }\n if (base === null) {\n return { kind: 'not-applicable', reason: \"the target's dimension is not in the span of the governing variables\" };\n }\n const rows = problem.exploratory?.rows ?? [];\n if (rows.length === 0) {\n return { kind: 'abstained', reason: 'no exploratory rows: the power-law fit needs data', nRows: 0, skippedRows: 0 };\n }\n const k = groups.length;\n const X: number[][] = [];\n const ylog: number[] = [];\n let skipped = 0;\n for (const row of rows) {\n const y = row[problem.target.name];\n const b = monomialValue(base, row);\n const pis = groups.map((g) => monomialValue(g.exponents, row));\n if (!(y !== undefined && Number.isFinite(y) && y > 0 && Number.isFinite(b) && b > 0) || !pis.every((p) => Number.isFinite(p) && p > 0)) {\n skipped += 1;\n continue;\n }\n X.push(pis.map((p) => Math.log(p)));\n ylog.push(Math.log(y / b));\n }\n const used = X.length;\n const abstain = (reason: string): PowerLawDetermination => ({ kind: 'abstained', reason, nRows: used, skippedRows: skipped });\n if (used < k + 2) {\n 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}`);\n }\n // A π-group whose log spreads by no more than round-off (1e-12 of its magnitude, or absolute)\n // does not vary: a/b with b = a is 1 up to an ulp, and that ulp is not an exponent's evidence.\n for (let j = 0; j < k; j++) {\n // Reductions, not spreads: a spread of a large row set overflows the call stack.\n const lo = X.reduce((m, r) => Math.min(m, r[j]!), Number.POSITIVE_INFINITY);\n const hi = X.reduce((m, r) => Math.max(m, r[j]!), Number.NEGATIVE_INFINITY);\n if (hi - lo <= 1e-12 * Math.max(1, Math.abs(hi), Math.abs(lo))) {\n return abstain(`π-group ${groups[j]!.formula} does not vary over the usable rows, so its exponent is not identifiable`);\n }\n }\n // Columns scaled to order one. History: before @danielsimonjr/mathts-functions 0.68.4, `ols`\n // tested singularity with an absolute 1e-15, so a column of log π of magnitude 1e-9 read as\n // collinear unscaled. From 0.68.4 (installed) `ols` equilibrates the design itself, and an\n // unscaled 1e-9 column fits without throwing. The scaling stays, because it also conditions\n // `matrixRank` (logDesignRank, which scales the same way). Coefficients and errors are unscaled after.\n const { scaled, scales } = scaleColumns(X);\n let fit;\n try {\n fit = ols(scaled, ylog, { intercept: true });\n } catch (e) {\n return abstain(`the log-design is collinear over the rows (${(e as Error).message}); the exponents are not identifiable`);\n }\n const logPrefactor = numberAt(fit.coefficients, 0);\n const r2 = typeof fit.r2 === 'number' && Number.isFinite(fit.r2) ? fit.r2 : null;\n if (logPrefactor === null || r2 === null) return abstain('ols did not return a finite intercept and R²');\n const exponents: PowerLawExponent[] = [];\n for (let j = 0; j < k; j++) {\n const c = numberAt(fit.coefficients, j + 1);\n const se = numberAt(fit.stderr, j + 1);\n if (c === null || se === null) return abstain(`ols did not return a finite coefficient and standard error for π-group ${groups[j]!.formula}`);\n const estimate = c / scales[j]!;\n const stderr = se / scales[j]!;\n // Noise-free rows give stderr 0; a representation tolerance keeps 0.5000000000000001 at 1/2.\n const tol = Math.max(2 * stderr, 1e-9 * Math.max(1, Math.abs(estimate)));\n const near = rationalCandidates(estimate, tol);\n const rational = near.length === 1 ? near[0]! : null;\n const group = groups[j]!;\n exponents.push({ group: group.formula, exponents: group.exponents, estimate, stderr, interval: [estimate - 2 * stderr, estimate + 2 * stderr], rational });\n const value = `${estimate.toPrecision(4)} ± ${stderr.toPrecision(2)}`;\n if (near.length === 0) {\n return abstain(`the exponent of ${group.formula} is ${value}, not within 2σ of a fraction with denominator ≤ ${MAX_EXPONENT_DENOMINATOR}`);\n }\n if (near.length > 1) {\n const list = near.slice(0, 4).map((r) => (r.denominator === 1 ? `${r.numerator}` : `${r.numerator}/${r.denominator}`)).join(', ');\n return abstain(\n `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`,\n );\n }\n }\n const monomial: Record<string, number> = { ...base };\n for (const e of exponents) {\n const a = e.rational!.numerator / e.rational!.denominator;\n for (const [name, p] of Object.entries(e.exponents)) monomial[name] = (monomial[name] ?? 0) + a * p;\n }\n return { kind: 'fit', base, exponents, logPrefactor, r2, nRows: used, skippedRows: skipped, monomial };\n}\n\n/** One line for a run's wording: what the power-law fit found or why it abstained. @internal */\nexport function powerLawWording(pl: PowerLawDetermination): string | null {\n if (pl.kind === 'not-applicable') return null;\n if (pl.kind === 'abstained') return `no power law from the exploratory rows: ${pl.reason}`;\n const terms = pl.exponents\n .map((e) => {\n const { numerator: p, denominator: q } = e.rational!;\n const frac = q === 1 ? `${p}` : `${p}/${q}`;\n return `(${e.group})^(${frac}) [a = ${e.estimate.toPrecision(3)} ± ${e.stderr.toPrecision(2)}]`;\n })\n .join(' · ');\n 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`;\n}\n"]}