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
@@ -3,6 +3,8 @@
3
3
  *
4
4
  * @module composition/probe/fit
5
5
  */
6
+ import { norm2, pairwiseDot } from '@danielsimonjr/mathts-core';
7
+ import { ols } from '@danielsimonjr/mathts-functions';
6
8
  import { evalExpr } from '../expr-eval.js';
7
9
  import { DEFAULT_HOLDOUT_TOL } from './types.js';
8
10
  import { scalarDiscrepancy } from './residual.js';
@@ -22,6 +24,35 @@ function observed(rows) {
22
24
  return y;
23
25
  });
24
26
  }
27
+ /** Root-mean-square additive discrepancy: core `norm2` of the residuals (the scaled, overflow-safe 2-norm) over √n. */
28
+ function rmse(observedValues, predicted) {
29
+ const residuals = observedValues.map((obs, i) => scalarDiscrepancy(obs, predicted[i], 'additive'));
30
+ return norm2(residuals) / Math.sqrt(residuals.length);
31
+ }
32
+ /**
33
+ * The standard error of the least-squares prefactor: MathTS `ols` on the single
34
+ * column f with no intercept, the column scaled to order one first because
35
+ * `ols` tests singularity with an absolute 1e-15 (a column of 1e-9 is refused
36
+ * unscaled), then unscaled. The estimator is the one `pairwiseDot` ratio above
37
+ * gives, so the coefficient itself is not read back from here. Null below two
38
+ * finite rows (no residual degree of freedom) or when f is zero everywhere.
39
+ */
40
+ function prefactorStderr(fs, ys) {
41
+ if (fs.length < 2)
42
+ return null;
43
+ const scale = fs.reduce((m, v) => Math.max(m, Math.abs(v)), 0);
44
+ if (!(scale > 0))
45
+ return null;
46
+ let fit;
47
+ try {
48
+ fit = ols(fs.map((v) => [v / scale]), [...ys], { intercept: false });
49
+ }
50
+ catch {
51
+ return null;
52
+ }
53
+ const se = fit.stderr[0];
54
+ return typeof se === 'number' && Number.isFinite(se) ? se / scale : null;
55
+ }
25
56
  function predictorKey(row, observable) {
26
57
  const predictors = {};
27
58
  for (const [key, value] of Object.entries(row)) {
@@ -53,25 +84,20 @@ export function fitPrefactor(expr, exploratory, holdout, holdoutTol = DEFAULT_HO
53
84
  }
54
85
  const y = observed(exploratory);
55
86
  const f = predictions(expr, exploratory, 1);
56
- let num = 0;
57
- let den = 0;
58
- for (let i = 0; i < y.length; i++) {
59
- if (!Number.isFinite(f[i]))
60
- continue;
61
- num += f[i] * y[i];
62
- den += f[i] * f[i];
63
- }
64
- const prefactor = den > 0 ? num / den : 1;
87
+ // The least-squares prefactor over the rows where the form is finite: c = f·y / f·f
88
+ // (core `pairwiseDot`, a pairwise sum).
89
+ const finite = f.map((v, i) => [v, y[i]]).filter(([v]) => Number.isFinite(v));
90
+ const fs = finite.map(([v]) => v);
91
+ const ys = finite.map(([, obs]) => obs);
92
+ const den = pairwiseDot(fs, fs);
93
+ const prefactor = den > 0 ? pairwiseDot(fs, ys) / den : 1;
94
+ const stderr = den > 0 ? prefactorStderr(fs, ys) : null;
65
95
  const pred = predictions(expr, exploratory, prefactor);
66
- let acc = 0;
67
- for (let i = 0; i < y.length; i++) {
68
- const r = scalarDiscrepancy(y[i], pred[i], 'additive');
69
- acc += r * r;
70
- }
71
- const exploratoryRmse = Math.sqrt(acc / y.length);
96
+ const exploratoryRmse = rmse(y, pred);
72
97
  if (!holdout || holdout.rows.length === 0) {
73
98
  return {
74
99
  prefactor,
100
+ prefactorStderr: stderr,
75
101
  exploratoryRmse,
76
102
  nExploratory: y.length,
77
103
  holdoutRmse: null,
@@ -81,16 +107,14 @@ export function fitPrefactor(expr, exploratory, holdout, holdoutTol = DEFAULT_HO
81
107
  }
82
108
  const yh = observed(holdout);
83
109
  const ph = predictions(expr, holdout, prefactor);
84
- let hacc = 0;
85
- for (let i = 0; i < yh.length; i++) {
86
- const r = scalarDiscrepancy(yh[i], ph[i], 'additive');
87
- hacc += r * r;
88
- }
89
- const holdoutRmse = Math.sqrt(hacc / yh.length);
90
- const scale = Math.max(...yh.map(Math.abs), ...ph.map(Math.abs), 1e-12);
110
+ const holdoutRmse = rmse(yh, ph);
111
+ // A reduce, not `Math.max(...rows)`: a spread of a large holdout overflows the call stack.
112
+ const maxAbs = (m, v) => (Number.isFinite(v) ? Math.max(m, Math.abs(v)) : m);
113
+ const scale = ph.reduce(maxAbs, yh.reduce(maxAbs, 1e-12));
91
114
  const holdoutSupported = holdoutRmse <= holdoutTol * scale;
92
115
  return {
93
116
  prefactor,
117
+ prefactorStderr: stderr,
94
118
  exploratoryRmse,
95
119
  nExploratory: y.length,
96
120
  holdoutRmse,
@@ -1 +1 @@
1
- {"version":3,"file":"fit.js","sourceRoot":"","sources":["../../../src/composition/probe/fit.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Prefactor fit + holdout evaluation. Generation never sees holdout rows.\n *\n * @module composition/probe/fit\n */\n\nimport type { ExprNode } from '../../dimensional/ast-types.js';\nimport { evalExpr } from '../expr-eval.js';\nimport { DEFAULT_HOLDOUT_TOL, type ProbeDataset } from './types.js';\nimport { scalarDiscrepancy } from './residual.js';\nimport { canonicalJson } from './serialize.js';\n\nexport interface FitResult {\n readonly prefactor: number;\n readonly exploratoryRmse: number;\n readonly nExploratory: number;\n readonly holdoutRmse: number | null;\n readonly nHoldout: number;\n readonly holdoutSupported: boolean;\n}\n\nfunction predictions(expr: ExprNode, rows: ProbeDataset, prefactor: number): number[] {\n return rows.rows.map((row) => {\n const y = evalExpr(expr, row);\n return prefactor * y;\n });\n}\n\nfunction observed(rows: ProbeDataset): number[] {\n return rows.rows.map((row) => {\n const y = row[rows.observable];\n if (!Number.isFinite(y)) {\n throw new RangeError(`fit: row missing finite observable '${rows.observable}'`);\n }\n return y;\n });\n}\n\nfunction predictorKey(row: Readonly<Record<string, number>>, observable: string): string {\n const predictors: Record<string, number> = {};\n for (const [key, value] of Object.entries(row)) {\n if (key !== observable) predictors[key] = value;\n }\n return canonicalJson(predictors);\n}\n\n/**\n * Least-squares prefactor c in y ≈ c · f(x) on exploratory data, then score\n * locked holdout. Holdout must not have been in the generation context.\n *\n * @internal\n */\nexport function fitPrefactor(\n expr: ExprNode,\n exploratory: ProbeDataset,\n holdout: ProbeDataset | undefined,\n holdoutTol = DEFAULT_HOLDOUT_TOL,\n): FitResult {\n if (exploratory.role !== 'exploratory-fit') {\n throw new RangeError(`fit: exploratory role must be exploratory-fit (got '${exploratory.role}')`);\n }\n if (holdout) {\n if (holdout.role !== 'validation-holdout' && holdout.role !== 'external-replication') {\n throw new RangeError(`fit: holdout role must be validation-holdout or external-replication`);\n }\n const holdKeys = new Set(holdout.rows.map((r) => predictorKey(r, holdout.observable)));\n for (const row of exploratory.rows) {\n if (holdKeys.has(predictorKey(row, exploratory.observable))) {\n throw new RangeError('fit: holdout row leaked into exploratory set');\n }\n }\n }\n const y = observed(exploratory);\n const f = predictions(expr, exploratory, 1);\n let num = 0;\n let den = 0;\n for (let i = 0; i < y.length; i++) {\n if (!Number.isFinite(f[i])) continue;\n num += f[i] * y[i];\n den += f[i] * f[i];\n }\n const prefactor = den > 0 ? num / den : 1;\n const pred = predictions(expr, exploratory, prefactor);\n let acc = 0;\n for (let i = 0; i < y.length; i++) {\n const r = scalarDiscrepancy(y[i], pred[i], 'additive');\n acc += r * r;\n }\n const exploratoryRmse = Math.sqrt(acc / y.length);\n\n if (!holdout || holdout.rows.length === 0) {\n return {\n prefactor,\n exploratoryRmse,\n nExploratory: y.length,\n holdoutRmse: null,\n nHoldout: 0,\n holdoutSupported: false,\n };\n }\n const yh = observed(holdout);\n const ph = predictions(expr, holdout, prefactor);\n let hacc = 0;\n for (let i = 0; i < yh.length; i++) {\n const r = scalarDiscrepancy(yh[i], ph[i], 'additive');\n hacc += r * r;\n }\n const holdoutRmse = Math.sqrt(hacc / yh.length);\n const scale =\n Math.max(...yh.map(Math.abs), ...ph.map(Math.abs), 1e-12);\n const holdoutSupported = holdoutRmse <= holdoutTol * scale;\n return {\n prefactor,\n exploratoryRmse,\n nExploratory: y.length,\n holdoutRmse,\n nHoldout: yh.length,\n holdoutSupported,\n };\n}\n"]}
1
+ {"version":3,"file":"fit.js","sourceRoot":"","sources":["../../../src/composition/probe/fit.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Prefactor fit + holdout evaluation. Generation never sees holdout rows.\n *\n * @module composition/probe/fit\n */\n\nimport { norm2, pairwiseDot } from '@danielsimonjr/mathts-core';\nimport { ols } from '@danielsimonjr/mathts-functions';\nimport type { ExprNode } from '../../dimensional/ast-types.js';\nimport { evalExpr } from '../expr-eval.js';\nimport { DEFAULT_HOLDOUT_TOL, type ProbeDataset } from './types.js';\nimport { scalarDiscrepancy } from './residual.js';\nimport { canonicalJson } from './serialize.js';\n\n/** The prefactor fit of one candidate, with its exploratory and holdout errors. */\nexport interface FitResult {\n readonly prefactor: number;\n /**\n * Standard error of the prefactor from the residual scatter of the exploratory rows\n * (MathTS `ols`, one column, no intercept); null below two finite rows or when the\n * form is zero on every row.\n */\n readonly prefactorStderr: number | null;\n readonly exploratoryRmse: number;\n readonly nExploratory: number;\n readonly holdoutRmse: number | null;\n readonly nHoldout: number;\n readonly holdoutSupported: boolean;\n}\n\nfunction predictions(expr: ExprNode, rows: ProbeDataset, prefactor: number): number[] {\n return rows.rows.map((row) => {\n const y = evalExpr(expr, row);\n return prefactor * y;\n });\n}\n\nfunction observed(rows: ProbeDataset): number[] {\n return rows.rows.map((row) => {\n const y = row[rows.observable];\n if (!Number.isFinite(y)) {\n throw new RangeError(`fit: row missing finite observable '${rows.observable}'`);\n }\n return y;\n });\n}\n\n/** Root-mean-square additive discrepancy: core `norm2` of the residuals (the scaled, overflow-safe 2-norm) over √n. */\nfunction rmse(observedValues: readonly number[], predicted: readonly number[]): number {\n const residuals = observedValues.map((obs, i) => scalarDiscrepancy(obs, predicted[i]!, 'additive'));\n return norm2(residuals) / Math.sqrt(residuals.length);\n}\n\n/**\n * The standard error of the least-squares prefactor: MathTS `ols` on the single\n * column f with no intercept, the column scaled to order one first because\n * `ols` tests singularity with an absolute 1e-15 (a column of 1e-9 is refused\n * unscaled), then unscaled. The estimator is the one `pairwiseDot` ratio above\n * gives, so the coefficient itself is not read back from here. Null below two\n * finite rows (no residual degree of freedom) or when f is zero everywhere.\n */\nfunction prefactorStderr(fs: readonly number[], ys: readonly number[]): number | null {\n if (fs.length < 2) return null;\n const scale = fs.reduce((m, v) => Math.max(m, Math.abs(v)), 0);\n if (!(scale > 0)) return null;\n let fit;\n try {\n fit = ols(fs.map((v) => [v / scale]), [...ys], { intercept: false });\n } catch {\n return null;\n }\n const se: unknown = fit.stderr[0];\n return typeof se === 'number' && Number.isFinite(se) ? se / scale : null;\n}\n\nfunction predictorKey(row: Readonly<Record<string, number>>, observable: string): string {\n const predictors: Record<string, number> = {};\n for (const [key, value] of Object.entries(row)) {\n if (key !== observable) predictors[key] = value;\n }\n return canonicalJson(predictors);\n}\n\n/**\n * Least-squares prefactor c in y ≈ c · f(x) on exploratory data, then score\n * locked holdout. Holdout must not have been in the generation context.\n *\n * @internal\n */\nexport function fitPrefactor(\n expr: ExprNode,\n exploratory: ProbeDataset,\n holdout: ProbeDataset | undefined,\n holdoutTol = DEFAULT_HOLDOUT_TOL,\n): FitResult {\n if (exploratory.role !== 'exploratory-fit') {\n throw new RangeError(`fit: exploratory role must be exploratory-fit (got '${exploratory.role}')`);\n }\n if (holdout) {\n if (holdout.role !== 'validation-holdout' && holdout.role !== 'external-replication') {\n throw new RangeError(`fit: holdout role must be validation-holdout or external-replication`);\n }\n const holdKeys = new Set(holdout.rows.map((r) => predictorKey(r, holdout.observable)));\n for (const row of exploratory.rows) {\n if (holdKeys.has(predictorKey(row, exploratory.observable))) {\n throw new RangeError('fit: holdout row leaked into exploratory set');\n }\n }\n }\n const y = observed(exploratory);\n const f = predictions(expr, exploratory, 1);\n // The least-squares prefactor over the rows where the form is finite: c = f·y / f·f\n // (core `pairwiseDot`, a pairwise sum).\n const finite = f.map((v, i) => [v, y[i]!] as const).filter(([v]) => Number.isFinite(v));\n const fs = finite.map(([v]) => v);\n const ys = finite.map(([, obs]) => obs);\n const den = pairwiseDot(fs, fs);\n const prefactor = den > 0 ? pairwiseDot(fs, ys) / den : 1;\n const stderr = den > 0 ? prefactorStderr(fs, ys) : null;\n const pred = predictions(expr, exploratory, prefactor);\n const exploratoryRmse = rmse(y, pred);\n\n if (!holdout || holdout.rows.length === 0) {\n return {\n prefactor,\n prefactorStderr: stderr,\n exploratoryRmse,\n nExploratory: y.length,\n holdoutRmse: null,\n nHoldout: 0,\n holdoutSupported: false,\n };\n }\n const yh = observed(holdout);\n const ph = predictions(expr, holdout, prefactor);\n const holdoutRmse = rmse(yh, ph);\n // A reduce, not `Math.max(...rows)`: a spread of a large holdout overflows the call stack.\n const maxAbs = (m: number, v: number) => (Number.isFinite(v) ? Math.max(m, Math.abs(v)) : m);\n const scale = ph.reduce(maxAbs, yh.reduce(maxAbs, 1e-12));\n const holdoutSupported = holdoutRmse <= holdoutTol * scale;\n return {\n prefactor,\n prefactorStderr: stderr,\n exploratoryRmse,\n nExploratory: y.length,\n holdoutRmse,\n nHoldout: yh.length,\n holdoutSupported,\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"frontier.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/frontier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAsB3E;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,WAAW,EAAE,CAmChF;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,WAAW,EAAE,CA2B7E;AAED,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,WAAW,EAAE,CAwB1E;AAMD,kEAAkE;AAClE,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,WAAW,EAAE,CAExE;AAED,6CAA6C;AAC7C,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,EAAE,EAAE,MAAM,GACT,WAAW,GAAG,SAAS,CAEzB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,EAC/B,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,EACrC,WAAW,CAAC,EAAE,YAAY,EAC1B,OAAO,CAAC,EAAE,YAAY,GACrB,aAAa,CA0Cf"}
1
+ {"version":3,"file":"frontier.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/frontier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAuB3E;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,WAAW,EAAE,CAmChF;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,WAAW,EAAE,CA2B7E;AAED,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,WAAW,EAAE,CAwB1E;AAMD,kEAAkE;AAClE,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,WAAW,EAAE,CAExE;AAED,6CAA6C;AAC7C,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,EAAE,EAAE,MAAM,GACT,WAAW,GAAG,SAAS,CAEzB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,EAC/B,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,EACrC,WAAW,CAAC,EAAE,YAAY,EAC1B,OAAO,CAAC,EAAE,YAAY,GACrB,aAAa,CA8Df"}
@@ -7,6 +7,7 @@ import { proposeLinkCandidates, proposeOrphanConnectors } from '../bridge-analys
7
7
  import { predictMissingBridges } from '../bridge-prediction.js';
8
8
  import { QUANTITY_IDENTIFICATIONS } from '../compose.js';
9
9
  import { candidateId, candidateIdIfSlug } from '../adjudication.js';
10
+ import { logDesign, logDesignRank, piStructure } from './power-law.js';
10
11
  const ALIAS_PAIRS = new Set(QUANTITY_IDENTIFICATIONS.map((id) => candidateId(id.from, id.to)));
11
12
  /**
12
13
  * Stable pair token. Slug pairs keep the ledger id. Other symbols are
@@ -143,32 +144,49 @@ export function problemFromResidualGap(gap, target, governing, exploratory, hold
143
144
  if (gap.kind === 'relation-link' || gap.kind === 'regime-transition') {
144
145
  throw new RangeError(`problemFromResidualGap: ${gap.kind} is not a Product B search target; use upt discover`);
145
146
  }
147
+ // Identifiability is the rank of the log-design [1, log π₁, …, log πₖ] over the exploratory
148
+ // rows (MathTS `matrixRank`), against the k + 1 parameters of a rational power law: a
149
+ // prefactor and one exponent per π-group of the governing set. The row count is kept under
150
+ // its own name; it is not a count of independent observations (six rows with c/d = (a/b)²
151
+ // on every one of them carry two).
146
152
  const nObs = exploratory?.rows.length ?? 0;
147
- const nPar = 1;
148
- const identifiable = nObs >= nPar && nObs > 0;
153
+ const { groups } = piStructure(target, governing);
154
+ const k = groups.length;
155
+ const nPar = 1 + k;
156
+ const design = nObs > 0 ? logDesign(groups, exploratory.rows) : { rows: [], used: 0, skipped: 0 };
157
+ const rank = logDesignRank(design);
158
+ const status = nObs === 0 ? 'unknown' : rank >= nPar ? 'identifiable' : 'partially-identifiable';
159
+ const parameters = k === 0 ? 'a prefactor' : `a prefactor and ${k} exponent(s)`;
160
+ const reasons = status === 'unknown'
161
+ ? ['no observations: identifiability not assessed']
162
+ : status === 'identifiable'
163
+ ? [`rank ${rank} of the log-design over ${design.used} usable row(s) of ${nObs}: ${parameters} identifiable`]
164
+ : [
165
+ `rank ${rank} of the log-design over ${design.used} usable row(s) of ${nObs} (${design.skipped} with a non-positive π-group), ` +
166
+ `against ${nPar} parameters (${parameters}): the exponents are not all identifiable; the monomial prefactor is fit on the linear scale`,
167
+ ];
149
168
  const enriched = {
150
169
  ...gap,
151
170
  identifiability: {
152
171
  kind: 'parametric',
153
172
  parametric: {
154
- status: identifiable ? 'identifiable' : nObs === 0 ? 'unknown' : 'non-identifiable',
155
- rank: identifiable ? nPar : 0,
173
+ status,
174
+ rank,
156
175
  nParameters: nPar,
157
- nIndependentObservations: nObs,
158
- reasons: identifiable
159
- ? [`${nObs} observations vs ${nPar} free prefactor`]
160
- : ['insufficient observations for a unique prefactor'],
176
+ nIndependentObservations: rank,
177
+ nObservations: nObs,
178
+ reasons,
161
179
  },
162
180
  },
163
181
  searchability: {
164
- searchable: identifiable || nObs === 0,
165
- reasons: identifiable
166
- ? ['parametric rank sufficient for a monomial prefactor']
167
- : nObs === 0
168
- ? ['no data — structural generation only; status will be insufficient-evidence']
169
- : ['non-identifiable — do not search'],
182
+ searchable: true,
183
+ reasons: status === 'unknown'
184
+ ? ['no data — structural generation only; status will be insufficient-evidence']
185
+ : status === 'identifiable'
186
+ ? ['parametric rank sufficient for a monomial prefactor and the π-group exponents']
187
+ : ['the monomial prefactor is identifiable; the power-law fit abstains by itself on a rank-deficient design'],
170
188
  },
171
- status: identifiable || nObs === 0 ? 'searchable' : 'underdetermined',
189
+ status: 'searchable',
172
190
  };
173
191
  return {
174
192
  gap: enriched,
@@ -1 +1 @@
1
- {"version":3,"file":"frontier.js","sourceRoot":"","sources":["../../../src/composition/probe/frontier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAIpE,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB,wBAAwB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAClE,CAAC;AAEF;;;;GAIG;AACH,SAAS,YAAY,CAAC,CAAS,EAAE,CAAS;IACxC,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,OAAO,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,SAAS,CAAC,CAAS,EAAE,CAAS;IACrC,OAAO,WAAW,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACzC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAA4B;IAC/D,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,IAAI,KAAK,SAAS,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC1D,GAAG,CAAC,IAAI,CAAC;YACP,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,EAAE,eAAe;YACrB,YAAY,EAAE;gBACZ,EAAE,IAAI,EAAE,yBAAyB,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;gBAC5C,EAAE,IAAI,EAAE,yBAAyB,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;aAC7C;YACD,YAAY,EAAE,EAAE;YAChB,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,EAAE;YACf,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC;YAC7B,QAAQ,EAAE;gBACR,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE;gBACzC,SAAS,EAAE,CAAC,gBAAgB,CAAC;aAC9B;YACD,eAAe,EAAE;gBACf,IAAI,EAAE,kBAAkB;gBACxB,UAAU,EAAE;oBACV,MAAM,EAAE,SAAS;oBACjB,OAAO,EAAE,CAAC,sDAAsD,CAAC;iBAClE;aACF;YACD,aAAa,EAAE;gBACb,UAAU,EAAE,KAAK;gBACjB,OAAO,EAAE,CAAC,mEAAmE,CAAC;aAC/E;YACD,MAAM,EAAE,YAAY;SACrB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,iBAAiB,CAAC,KAA4B;IAC5D,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnC,EAAE,EAAE,WAAW,YAAY,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE;QAC/D,IAAI,EAAE,eAAwB;QAC9B,YAAY,EAAE;YACZ,EAAE,IAAI,EAAE,yBAAkC,EAAE,EAAE,EAAE,CAAC,CAAC,cAAc,EAAE;YAClE,EAAE,IAAI,EAAE,yBAAkC,EAAE,EAAE,EAAE,CAAC,CAAC,YAAY,EAAE;SACjE;QACD,YAAY,EAAE,EAAE;QAChB,OAAO,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC;QACnC,WAAW,EAAE,EAAE;QACf,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC;QAC7B,QAAQ,EAAE;YACR,OAAO,EAAE,UAAU,CAAC,CAAC,UAAU,eAAe,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,YAAY,EAAE;YAClF,SAAS,EAAE,CAAC,gBAAgB,CAAC;SAC9B;QACD,eAAe,EAAE;YACf,IAAI,EAAE,kBAA2B;YACjC,UAAU,EAAE,EAAE,MAAM,EAAE,SAAkB,EAAE,OAAO,EAAE,CAAC,qBAAqB,CAAC,EAAE;SAC7E;QACD,aAAa,EAAE;YACb,UAAU,EAAE,KAAK;YACjB,OAAO,EAAE,CAAC,0CAA0C,CAAC;SACtD;QACD,MAAM,EAAE,YAAqB;KAC9B,CAAC,CAAC,CAAC;AACN,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,cAAc,CAAC,KAA4B;IACzD,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACvC,EAAE,EAAE,aAAa,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE;QAClE,IAAI,EAAE,mBAA4B;QAClC,YAAY,EAAE,EAAE;QAChB,YAAY,EAAE,EAAE;QAChB,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC;QAC/B,WAAW,EAAE,EAAE;QACf,WAAW,EAAE,CAAC,mBAAmB,CAAC,CAAC,eAAe,EAAE,CAAC;QACrD,QAAQ,EAAE;YACR,OAAO,EAAE,qBAAqB,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YAC/E,SAAS,EAAE,CAAC,aAAa,CAAC;SAC3B;QACD,eAAe,EAAE;YACf,IAAI,EAAE,kBAA2B;YACjC,UAAU,EAAE,EAAE,MAAM,EAAE,SAAkB,EAAE,OAAO,EAAE,CAAC,iCAAiC,CAAC,EAAE;SACzF;QACD,aAAa,EAAE;YACb,UAAU,EAAE,KAAK;YACjB,OAAO,EAAE,CAAC,uEAAuE,CAAC;SACnF;QACD,MAAM,EAAE,YAAqB;KAC9B,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS;IACzB,OAAO,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,YAAY,CAAC,KAA4B;IACvD,OAAO,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AACjG,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,eAAe,CAC7B,KAA4B,EAC5B,EAAU;IAEV,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CACpC,GAAgB,EAChB,MAA+B,EAC/B,SAAqC,EACrC,WAA0B,EAC1B,OAAsB;IAEtB,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe,IAAI,GAAG,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QACrE,MAAM,IAAI,UAAU,CAClB,2BAA2B,GAAG,CAAC,IAAI,qDAAqD,CACzF,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,WAAW,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,CAAC,CAAC;IACf,MAAM,YAAY,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAgB;QAC5B,GAAG,GAAG;QACN,eAAe,EAAE;YACf,IAAI,EAAE,YAAY;YAClB,UAAU,EAAE;gBACV,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB;gBACnF,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC7B,WAAW,EAAE,IAAI;gBACjB,wBAAwB,EAAE,IAAI;gBAC9B,OAAO,EAAE,YAAY;oBACnB,CAAC,CAAC,CAAC,GAAG,IAAI,oBAAoB,IAAI,iBAAiB,CAAC;oBACpD,CAAC,CAAC,CAAC,kDAAkD,CAAC;aACzD;SACF;QACD,aAAa,EAAE;YACb,UAAU,EAAE,YAAY,IAAI,IAAI,KAAK,CAAC;YACtC,OAAO,EAAE,YAAY;gBACnB,CAAC,CAAC,CAAC,qDAAqD,CAAC;gBACzD,CAAC,CAAC,IAAI,KAAK,CAAC;oBACV,CAAC,CAAC,CAAC,4EAA4E,CAAC;oBAChF,CAAC,CAAC,CAAC,kCAAkC,CAAC;SAC3C;QACD,MAAM,EAAE,YAAY,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,iBAAiB;KACtE,CAAC;IACF,OAAO;QACL,GAAG,EAAE,QAAQ;QACb,MAAM;QACN,SAAS;QACT,WAAW;QACX,OAAO;QACP,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,WAAW,EAAE,GAAG,CAAC,WAAW;KAC7B,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Frontier scanners — wrap Product A surfaces; residual gaps are Product B.\n *\n * @module composition/probe/frontier\n */\n\nimport { proposeLinkCandidates, proposeOrphanConnectors } from '../bridge-analysis.js';\nimport { predictMissingBridges } from '../bridge-prediction.js';\nimport { QUANTITY_IDENTIFICATIONS } from '../compose.js';\nimport { candidateId, candidateIdIfSlug } from '../adjudication.js';\nimport type { BridgeEdge } from '../edge.js';\nimport type { FrontierGap, ProbeDataset, SearchProblem } from './types.js';\n\nconst ALIAS_PAIRS = new Set(\n QUANTITY_IDENTIFICATIONS.map((id) => candidateId(id.from, id.to)),\n);\n\n/**\n * Stable pair token. Slug pairs keep the ledger id. Other symbols are\n * length-prefixed under `raw:` so a `~` inside a name cannot alias two\n * pairs, and the token cannot collide with a kebab `candidateId`.\n */\nfunction gapPairToken(a: string, b: string): string {\n const slug = candidateIdIfSlug(a, b);\n if (slug !== undefined) return slug;\n const [x, y] = a <= b ? [a, b] : [b, a];\n return `raw:${x.length}:${x}~${y.length}:${y}`;\n}\n\nfunction linkGapId(a: string, b: string): string {\n return `fg-link-${gapPairToken(a, b)}`;\n}\n\n/**\n * Project Product A link candidates to `relation-link` gaps.\n * Registered quantity identifications are not gaps.\n *\n * @internal\n */\nexport function wrapRelationLinkGaps(edges: readonly BridgeEdge[]): FrontierGap[] {\n const out: FrontierGap[] = [];\n for (const c of proposeLinkCandidates(edges)) {\n const slug = candidateIdIfSlug(c.a, c.b);\n if (slug !== undefined && ALIAS_PAIRS.has(slug)) continue;\n out.push({\n id: linkGapId(c.a, c.b),\n kind: 'relation-link',\n participants: [\n { kind: 'quantity-identification', id: c.a },\n { kind: 'quantity-identification', id: c.b },\n ],\n observations: [],\n regimes: [],\n assumptions: [],\n constraints: [`dim:${c.dim}`],\n evidence: {\n summary: `${c.a} ≟ ${c.b} share ${c.dim}`,\n sourceIds: ['upt candidates'],\n },\n identifiability: {\n kind: 'graph-structural',\n parametric: {\n status: 'unknown',\n reasons: ['identification gaps are Product A — use upt discover'],\n },\n },\n searchability: {\n searchable: false,\n reasons: ['relation-link gaps are reviewed by upt discover, not probe search'],\n },\n status: 'identified',\n });\n }\n return out.sort((x, y) => x.id.localeCompare(y.id));\n}\n\n/** Isolated-bridge connectors as relation-link gaps. @internal */\nexport function wrapConnectorGaps(edges: readonly BridgeEdge[]): FrontierGap[] {\n const report = proposeOrphanConnectors(edges);\n return report.connectors.map((c) => ({\n id: `fg-conn-${gapPairToken(c.orphanQuantity, c.coreQuantity)}`,\n kind: 'relation-link' as const,\n participants: [\n { kind: 'quantity-identification' as const, id: c.orphanQuantity },\n { kind: 'quantity-identification' as const, id: c.coreQuantity },\n ],\n observations: [],\n regimes: [c.orphanEdge, c.coreEdge],\n assumptions: [],\n constraints: [`dim:${c.dim}`],\n evidence: {\n summary: `orphan ${c.orphanEdge} ≟ core via ${c.orphanQuantity}~${c.coreQuantity}`,\n sourceIds: ['upt connectors'],\n },\n identifiability: {\n kind: 'graph-structural' as const,\n parametric: { status: 'unknown' as const, reasons: ['Product A connector'] },\n },\n searchability: {\n searchable: false,\n reasons: ['connectors are Product A review surfaces'],\n },\n status: 'identified' as const,\n }));\n}\n\n/** Empty (scale×force) cells as regime-transition gaps. @internal */\nexport function wrapRegimeGaps(edges: readonly BridgeEdge[]): FrontierGap[] {\n const report = predictMissingBridges(edges);\n return report.predictions.map((p, i) => ({\n id: `fg-regime-${i}-${hashSlug(p.regimeA)}-${hashSlug(p.regimeB)}`,\n kind: 'regime-transition' as const,\n participants: [],\n observations: [],\n regimes: [p.regimeA, p.regimeB],\n assumptions: [],\n constraints: [`sharedNeighbors:${p.sharedNeighbors}`],\n evidence: {\n summary: `empty regime pair ${p.regimeA} ↔ ${p.regimeB} via ${p.via.join(',')}`,\n sourceIds: ['upt predict'],\n },\n identifiability: {\n kind: 'graph-structural' as const,\n parametric: { status: 'unknown' as const, reasons: ['structural triadic closure only'] },\n },\n searchability: {\n searchable: false,\n reasons: ['regime predictions are structural hypotheses, not expression searches'],\n },\n status: 'identified' as const,\n }));\n}\n\nfunction hashSlug(s: string): string {\n return s.replace(/[^a-z0-9]+/gi, '-').replace(/^-|-$/g, '').slice(0, 40);\n}\n\n/** Combined read-only frontier (Product A wrappers). @internal */\nexport function scanFrontier(edges: readonly BridgeEdge[]): FrontierGap[] {\n return [...wrapRelationLinkGaps(edges), ...wrapConnectorGaps(edges), ...wrapRegimeGaps(edges)];\n}\n\n/** Look up a wrapped gap by id. @internal */\nexport function findFrontierGap(\n edges: readonly BridgeEdge[],\n id: string,\n): FrontierGap | undefined {\n return scanFrontier(edges).find((g) => g.id === id);\n}\n\n/**\n * Build a Product B search problem for an unexplained-observation /\n * prediction-residual gap. Relation-link and regime-transition gaps are\n * refused; the error names `upt discover`.\n *\n * @internal\n */\nexport function problemFromResidualGap(\n gap: FrontierGap,\n target: SearchProblem['target'],\n governing: SearchProblem['governing'],\n exploratory?: ProbeDataset,\n holdout?: ProbeDataset,\n): SearchProblem {\n if (gap.kind === 'relation-link' || gap.kind === 'regime-transition') {\n throw new RangeError(\n `problemFromResidualGap: ${gap.kind} is not a Product B search target; use upt discover`,\n );\n }\n const nObs = exploratory?.rows.length ?? 0;\n const nPar = 1;\n const identifiable = nObs >= nPar && nObs > 0;\n const enriched: FrontierGap = {\n ...gap,\n identifiability: {\n kind: 'parametric',\n parametric: {\n status: identifiable ? 'identifiable' : nObs === 0 ? 'unknown' : 'non-identifiable',\n rank: identifiable ? nPar : 0,\n nParameters: nPar,\n nIndependentObservations: nObs,\n reasons: identifiable\n ? [`${nObs} observations vs ${nPar} free prefactor`]\n : ['insufficient observations for a unique prefactor'],\n },\n },\n searchability: {\n searchable: identifiable || nObs === 0,\n reasons: identifiable\n ? ['parametric rank sufficient for a monomial prefactor']\n : nObs === 0\n ? ['no data — structural generation only; status will be insufficient-evidence']\n : ['non-identifiable — do not search'],\n },\n status: identifiable || nObs === 0 ? 'searchable' : 'underdetermined',\n };\n return {\n gap: enriched,\n target,\n governing,\n exploratory,\n holdout,\n discrepancy: gap.discrepancy,\n assumptions: gap.assumptions,\n };\n}\n"]}
1
+ {"version":3,"file":"frontier.js","sourceRoot":"","sources":["../../../src/composition/probe/frontier.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Frontier scanners — wrap Product A surfaces; residual gaps are Product B.\n *\n * @module composition/probe/frontier\n */\n\nimport { proposeLinkCandidates, proposeOrphanConnectors } from '../bridge-analysis.js';\nimport { predictMissingBridges } from '../bridge-prediction.js';\nimport { QUANTITY_IDENTIFICATIONS } from '../compose.js';\nimport { candidateId, candidateIdIfSlug } from '../adjudication.js';\nimport type { BridgeEdge } from '../edge.js';\nimport type { FrontierGap, ProbeDataset, SearchProblem } from './types.js';\nimport { logDesign, logDesignRank, piStructure } from './power-law.js';\n\nconst ALIAS_PAIRS = new Set(\n QUANTITY_IDENTIFICATIONS.map((id) => candidateId(id.from, id.to)),\n);\n\n/**\n * Stable pair token. Slug pairs keep the ledger id. Other symbols are\n * length-prefixed under `raw:` so a `~` inside a name cannot alias two\n * pairs, and the token cannot collide with a kebab `candidateId`.\n */\nfunction gapPairToken(a: string, b: string): string {\n const slug = candidateIdIfSlug(a, b);\n if (slug !== undefined) return slug;\n const [x, y] = a <= b ? [a, b] : [b, a];\n return `raw:${x.length}:${x}~${y.length}:${y}`;\n}\n\nfunction linkGapId(a: string, b: string): string {\n return `fg-link-${gapPairToken(a, b)}`;\n}\n\n/**\n * Project Product A link candidates to `relation-link` gaps.\n * Registered quantity identifications are not gaps.\n *\n * @internal\n */\nexport function wrapRelationLinkGaps(edges: readonly BridgeEdge[]): FrontierGap[] {\n const out: FrontierGap[] = [];\n for (const c of proposeLinkCandidates(edges)) {\n const slug = candidateIdIfSlug(c.a, c.b);\n if (slug !== undefined && ALIAS_PAIRS.has(slug)) continue;\n out.push({\n id: linkGapId(c.a, c.b),\n kind: 'relation-link',\n participants: [\n { kind: 'quantity-identification', id: c.a },\n { kind: 'quantity-identification', id: c.b },\n ],\n observations: [],\n regimes: [],\n assumptions: [],\n constraints: [`dim:${c.dim}`],\n evidence: {\n summary: `${c.a} ≟ ${c.b} share ${c.dim}`,\n sourceIds: ['upt candidates'],\n },\n identifiability: {\n kind: 'graph-structural',\n parametric: {\n status: 'unknown',\n reasons: ['identification gaps are Product A — use upt discover'],\n },\n },\n searchability: {\n searchable: false,\n reasons: ['relation-link gaps are reviewed by upt discover, not probe search'],\n },\n status: 'identified',\n });\n }\n return out.sort((x, y) => x.id.localeCompare(y.id));\n}\n\n/** Isolated-bridge connectors as relation-link gaps. @internal */\nexport function wrapConnectorGaps(edges: readonly BridgeEdge[]): FrontierGap[] {\n const report = proposeOrphanConnectors(edges);\n return report.connectors.map((c) => ({\n id: `fg-conn-${gapPairToken(c.orphanQuantity, c.coreQuantity)}`,\n kind: 'relation-link' as const,\n participants: [\n { kind: 'quantity-identification' as const, id: c.orphanQuantity },\n { kind: 'quantity-identification' as const, id: c.coreQuantity },\n ],\n observations: [],\n regimes: [c.orphanEdge, c.coreEdge],\n assumptions: [],\n constraints: [`dim:${c.dim}`],\n evidence: {\n summary: `orphan ${c.orphanEdge} ≟ core via ${c.orphanQuantity}~${c.coreQuantity}`,\n sourceIds: ['upt connectors'],\n },\n identifiability: {\n kind: 'graph-structural' as const,\n parametric: { status: 'unknown' as const, reasons: ['Product A connector'] },\n },\n searchability: {\n searchable: false,\n reasons: ['connectors are Product A review surfaces'],\n },\n status: 'identified' as const,\n }));\n}\n\n/** Empty (scale×force) cells as regime-transition gaps. @internal */\nexport function wrapRegimeGaps(edges: readonly BridgeEdge[]): FrontierGap[] {\n const report = predictMissingBridges(edges);\n return report.predictions.map((p, i) => ({\n id: `fg-regime-${i}-${hashSlug(p.regimeA)}-${hashSlug(p.regimeB)}`,\n kind: 'regime-transition' as const,\n participants: [],\n observations: [],\n regimes: [p.regimeA, p.regimeB],\n assumptions: [],\n constraints: [`sharedNeighbors:${p.sharedNeighbors}`],\n evidence: {\n summary: `empty regime pair ${p.regimeA} ↔ ${p.regimeB} via ${p.via.join(',')}`,\n sourceIds: ['upt predict'],\n },\n identifiability: {\n kind: 'graph-structural' as const,\n parametric: { status: 'unknown' as const, reasons: ['structural triadic closure only'] },\n },\n searchability: {\n searchable: false,\n reasons: ['regime predictions are structural hypotheses, not expression searches'],\n },\n status: 'identified' as const,\n }));\n}\n\nfunction hashSlug(s: string): string {\n return s.replace(/[^a-z0-9]+/gi, '-').replace(/^-|-$/g, '').slice(0, 40);\n}\n\n/** Combined read-only frontier (Product A wrappers). @internal */\nexport function scanFrontier(edges: readonly BridgeEdge[]): FrontierGap[] {\n return [...wrapRelationLinkGaps(edges), ...wrapConnectorGaps(edges), ...wrapRegimeGaps(edges)];\n}\n\n/** Look up a wrapped gap by id. @internal */\nexport function findFrontierGap(\n edges: readonly BridgeEdge[],\n id: string,\n): FrontierGap | undefined {\n return scanFrontier(edges).find((g) => g.id === id);\n}\n\n/**\n * Build a Product B search problem for an unexplained-observation /\n * prediction-residual gap. Relation-link and regime-transition gaps are\n * refused; the error names `upt discover`.\n *\n * @internal\n */\nexport function problemFromResidualGap(\n gap: FrontierGap,\n target: SearchProblem['target'],\n governing: SearchProblem['governing'],\n exploratory?: ProbeDataset,\n holdout?: ProbeDataset,\n): SearchProblem {\n if (gap.kind === 'relation-link' || gap.kind === 'regime-transition') {\n throw new RangeError(\n `problemFromResidualGap: ${gap.kind} is not a Product B search target; use upt discover`,\n );\n }\n // Identifiability is the rank of the log-design [1, log π₁, …, log πₖ] over the exploratory\n // rows (MathTS `matrixRank`), against the k + 1 parameters of a rational power law: a\n // prefactor and one exponent per π-group of the governing set. The row count is kept under\n // its own name; it is not a count of independent observations (six rows with c/d = (a/b)²\n // on every one of them carry two).\n const nObs = exploratory?.rows.length ?? 0;\n const { groups } = piStructure(target, governing);\n const k = groups.length;\n const nPar = 1 + k;\n const design = nObs > 0 ? logDesign(groups, exploratory!.rows) : { rows: [], used: 0, skipped: 0 };\n const rank = logDesignRank(design);\n const status: NonNullable<FrontierGap['identifiability']['parametric']>['status'] =\n nObs === 0 ? 'unknown' : rank >= nPar ? 'identifiable' : 'partially-identifiable';\n const parameters = k === 0 ? 'a prefactor' : `a prefactor and ${k} exponent(s)`;\n const reasons =\n status === 'unknown'\n ? ['no observations: identifiability not assessed']\n : status === 'identifiable'\n ? [`rank ${rank} of the log-design over ${design.used} usable row(s) of ${nObs}: ${parameters} identifiable`]\n : [\n `rank ${rank} of the log-design over ${design.used} usable row(s) of ${nObs} (${design.skipped} with a non-positive π-group), ` +\n `against ${nPar} parameters (${parameters}): the exponents are not all identifiable; the monomial prefactor is fit on the linear scale`,\n ];\n const enriched: FrontierGap = {\n ...gap,\n identifiability: {\n kind: 'parametric',\n parametric: {\n status,\n rank,\n nParameters: nPar,\n nIndependentObservations: rank,\n nObservations: nObs,\n reasons,\n },\n },\n searchability: {\n searchable: true,\n reasons:\n status === 'unknown'\n ? ['no data — structural generation only; status will be insufficient-evidence']\n : status === 'identifiable'\n ? ['parametric rank sufficient for a monomial prefactor and the π-group exponents']\n : ['the monomial prefactor is identifiable; the power-law fit abstains by itself on a rank-deficient design'],\n },\n status: 'searchable',\n };\n return {\n gap: enriched,\n target,\n governing,\n exploratory,\n holdout,\n discrepancy: gap.discrepancy,\n assumptions: gap.assumptions,\n };\n}\n"]}
@@ -8,17 +8,44 @@ import type { ExprNode } from '../../dimensional/ast-types.js';
8
8
  import { type DimensionalDeterminationResult } from '../../dimensional/buckingham.js';
9
9
  import type { DimensionalVariableRef, SearchBudget, SearchProblem } from './types.js';
10
10
  import { type BudgetState } from './search-budget.js';
11
+ import { type PowerLawFit } from './power-law.js';
12
+ /** The power-law fit over the π-groups, re-exported beside the generator that emits it. */
13
+ export { powerLawDetermination, powerLawWording, rationalizeExponent } from './power-law.js';
14
+ /** The power-law fit's result types: the determination, one fitted exponent, and a recovered fit. */
15
+ export type { PowerLawDetermination, PowerLawExponent, PowerLawFit } from './power-law.js';
16
+ /** A candidate that a generator emits, before scoring and falsification. */
11
17
  export interface RawCandidate {
12
18
  readonly expression: ExprNode;
13
19
  readonly monomial: Readonly<Record<string, number>> | null;
14
20
  readonly originNote: string;
21
+ /** Set on a candidate the power-law fit produced: its exponents, their errors and R². */
22
+ readonly powerLaw?: PowerLawFit;
15
23
  }
16
- /** Build `Π governing^exp` as an `ExprNode`. @internal */
24
+ /**
25
+ * Build `Π governing^exp` as an `ExprNode`: ONE product, negative exponents kept, names in
26
+ * code-unit order (`sort()`).
27
+ *
28
+ * This is not merged with `fromMonomial` (composition/proposed-bridges.ts), which writes a
29
+ * numerator over a denominator with positive exponents and orders names by `localeCompare`.
30
+ * The two trees differ for the same monomial (`Z·a^-0.5` against `Z/a^0.5`, and `Z` before `a`
31
+ * here, after it there), and both are printed (`upt probe` candidates, `upt discover --derive`
32
+ * proposals) and hashed, so one builder would move printed text. They share `symbolPower`, the
33
+ * one factor that is the same in both (tests/composition/monomial-builders.test.ts).
34
+ *
35
+ * @internal
36
+ */
17
37
  export declare function monomialToExpr(monomial: Readonly<Record<string, number>>, vars: readonly DimensionalVariableRef[]): ExprNode;
18
38
  /**
19
39
  * Yield dimensionally valid monomials for `problem`, honouring the budget.
20
40
  * Invalid typed constructions are skipped (never evaluated).
21
41
  *
42
+ * Two paths. The unique monomial of {@link nativeDetermination}, when there
43
+ * is one. Then, when the governing set leaves π-groups (the full determination
44
+ * is not unique) and the problem has exploratory rows, the rational power law
45
+ * over those groups that {@link powerLawDetermination} fits on THOSE ROWS
46
+ * ONLY; the holdout rows are never read here. A fit whose exponents all
47
+ * rationalise to 0 is the base monomial again and is kept once.
48
+ *
22
49
  * @internal
23
50
  */
24
51
  export declare function generateNative(problem: SearchProblem, state: BudgetState): Iterable<RawCandidate>;
@@ -35,6 +62,8 @@ export declare function nativeDetermination(problem: SearchProblem): {
35
62
  det: DimensionalDeterminationResult;
36
63
  unsearched: string[];
37
64
  };
65
+ /** Whether a candidate is within the budget's AST depth and operator caps. @internal */
66
+ export declare function withinAstCaps(node: ExprNode, budget: SearchBudget): boolean;
38
67
  /** Expose budget type for callers. @internal */
39
68
  export type { SearchBudget };
40
69
  //# sourceMappingURL=generator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/generator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAG/D,OAAO,EAA2B,KAAK,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AAE/G,OAAO,KAAK,EAAE,sBAAsB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAExE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC;IAC3D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,0DAA0D;AAC1D,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC1C,IAAI,EAAE,SAAS,sBAAsB,EAAE,GACtC,QAAQ,CAqBV;AAQD;;;;;GAKG;AACH,wBAAiB,cAAc,CAC7B,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,WAAW,GACjB,QAAQ,CAAC,YAAY,CAAC,CA4BxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG;IAC3D,GAAG,EAAE,8BAA8B,CAAC;IACpC,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAaA;AAyCD,gDAAgD;AAChD,YAAY,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/generator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAG/D,OAAO,EAA2B,KAAK,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AAG/G,OAAO,KAAK,EAAE,sBAAsB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAyB,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEzE,2FAA2F;AAC3F,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC7F,qGAAqG;AACrG,YAAY,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE3F,4EAA4E;AAC5E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC;IAC3D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,yFAAyF;IACzF,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC;CACjC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC1C,IAAI,EAAE,SAAS,sBAAsB,EAAE,GACtC,QAAQ,CAaV;AAgCD;;;;;;;;;;;;GAYG;AACH,wBAAiB,cAAc,CAC7B,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,WAAW,GACjB,QAAQ,CAAC,YAAY,CAAC,CAmBxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG;IAC3D,GAAG,EAAE,8BAA8B,CAAC;IACpC,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAYA;AAaD,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAE3E;AA8BD,gDAAgD;AAChD,YAAY,EAAE,YAAY,EAAE,CAAC"}
@@ -5,11 +5,27 @@
5
5
  * @module composition/probe/generator
6
6
  */
7
7
  import { DIMENSIONLESS } from '../../dimensional/types.js';
8
- import { sym } from '../../dimensional/ast-builders.js';
8
+ import { sym, symbolPower } from '../../dimensional/ast-builders.js';
9
9
  import { dimensionallyDetermines } from '../../dimensional/buckingham.js';
10
10
  import { validate } from '../../dimensional/validator.js';
11
+ import { isDimensionless } from '../../dimensional/algebra.js';
11
12
  import { canEmitCandidate } from './search-budget.js';
12
- /** Build `Π governing^exp` as an `ExprNode`. @internal */
13
+ import { powerLawDetermination } from './power-law.js';
14
+ /** The power-law fit over the π-groups, re-exported beside the generator that emits it. */
15
+ export { powerLawDetermination, powerLawWording, rationalizeExponent } from './power-law.js';
16
+ /**
17
+ * Build `Π governing^exp` as an `ExprNode`: ONE product, negative exponents kept, names in
18
+ * code-unit order (`sort()`).
19
+ *
20
+ * This is not merged with `fromMonomial` (composition/proposed-bridges.ts), which writes a
21
+ * numerator over a denominator with positive exponents and orders names by `localeCompare`.
22
+ * The two trees differ for the same monomial (`Z·a^-0.5` against `Z/a^0.5`, and `Z` before `a`
23
+ * here, after it there), and both are printed (`upt probe` candidates, `upt discover --derive`
24
+ * proposals) and hashed, so one builder would move printed text. They share `symbolPower`, the
25
+ * one factor that is the same in both (tests/composition/monomial-builders.test.ts).
26
+ *
27
+ * @internal
28
+ */
13
29
  export function monomialToExpr(monomial, vars) {
14
30
  const byName = new Map(vars.map((v) => [v.name, v.dim]));
15
31
  const factors = [];
@@ -20,16 +36,7 @@ export function monomialToExpr(monomial, vars) {
20
36
  const dim = byName.get(name);
21
37
  if (!dim)
22
38
  throw new RangeError(`monomialToExpr: unknown variable '${name}'`);
23
- const base = sym(name, dim);
24
- if (exp === 1)
25
- factors.push(base);
26
- else {
27
- factors.push({
28
- kind: 'op',
29
- op: '^',
30
- args: [base, sym(String(exp), DIMENSIONLESS)],
31
- });
32
- }
39
+ factors.push(symbolPower(sym(name, dim), exp));
33
40
  }
34
41
  if (factors.length === 0)
35
42
  return sym('1', DIMENSIONLESS);
@@ -43,39 +50,51 @@ function* extraPrefactors(base) {
43
50
  yield { kind: 'op', op: '*', args: [sym('2pi', DIMENSIONLESS), base] };
44
51
  }
45
52
  /**
46
- * Yield dimensionally valid monomials for `problem`, honouring the budget.
47
- * Invalid typed constructions are skipped (never evaluated).
48
- *
49
- * @internal
53
+ * Yield `expr` and its registered prefactor variants that validate and fit the budget's
54
+ * depth and operator caps; `seen` keeps one copy of each construction across the paths.
50
55
  */
51
- export function* generateNative(problem, state) {
52
- const { det } = nativeDetermination(problem);
53
- if (!det.determined || !det.monomial)
54
- return;
55
- const expr = monomialToExpr(det.monomial, [problem.target, ...problem.governing]);
56
- const seen = new Set();
56
+ function* emitWithPrefactors(expr, monomial, originNote, powerLaw, state, seen) {
57
57
  for (const candidate of extraPrefactors(expr)) {
58
58
  if (!canEmitCandidate(state))
59
59
  return;
60
60
  if (validate(candidate).ok !== true)
61
61
  continue;
62
- // Depth / operator caps
63
- const depth = astDepth(candidate);
64
- const ops = opCount(candidate);
65
- if (depth > state.budget.maxAstDepth)
66
- continue;
67
- if (ops > state.budget.maxOperators)
62
+ if (!withinAstCaps(candidate, state.budget))
68
63
  continue;
69
64
  const key = JSON.stringify(candidate);
70
65
  if (seen.has(key))
71
66
  continue;
72
67
  seen.add(key);
73
68
  state.candidates += 1;
74
- yield {
75
- expression: candidate,
76
- monomial: det.monomial,
77
- originNote: det.reason,
78
- };
69
+ yield { expression: candidate, monomial, originNote, ...(powerLaw ? { powerLaw } : {}) };
70
+ }
71
+ }
72
+ /**
73
+ * Yield dimensionally valid monomials for `problem`, honouring the budget.
74
+ * Invalid typed constructions are skipped (never evaluated).
75
+ *
76
+ * Two paths. The unique monomial of {@link nativeDetermination}, when there
77
+ * is one. Then, when the governing set leaves π-groups (the full determination
78
+ * is not unique) and the problem has exploratory rows, the rational power law
79
+ * over those groups that {@link powerLawDetermination} fits on THOSE ROWS
80
+ * ONLY; the holdout rows are never read here. A fit whose exponents all
81
+ * rationalise to 0 is the base monomial again and is kept once.
82
+ *
83
+ * @internal
84
+ */
85
+ export function* generateNative(problem, state) {
86
+ const vars = [problem.target, ...problem.governing];
87
+ const seen = new Set();
88
+ const { det } = nativeDetermination(problem);
89
+ if (det.determined && det.monomial) {
90
+ yield* emitWithPrefactors(monomialToExpr(det.monomial, vars), det.monomial, det.reason, undefined, state, seen);
91
+ }
92
+ if ((problem.exploratory?.rows.length ?? 0) > 0) {
93
+ const pl = powerLawDetermination(problem);
94
+ if (pl.kind === 'fit') {
95
+ const note = `power-law: ${pl.exponents.map((e) => `${e.group}^(${e.rational.numerator}/${e.rational.denominator})`).join(' · ')}`;
96
+ yield* emitWithPrefactors(monomialToExpr(pl.monomial, vars), pl.monomial, note, pl, state, seen);
97
+ }
79
98
  }
80
99
  if (problem.baseline && problem.discrepancy) {
81
100
  yield* generateCorrections(problem, state, seen);
@@ -94,11 +113,10 @@ export function nativeDetermination(problem) {
94
113
  const det = dimensionallyDetermines(problem.target, problem.governing);
95
114
  if (det.determined)
96
115
  return { det, unsearched: [] };
97
- const isDimensionless = (g) => Object.values(g.dim).every((e) => e === 0);
98
- const dimless = problem.governing.filter(isDimensionless);
116
+ const dimless = problem.governing.filter((g) => isDimensionless(g.dim));
99
117
  if (dimless.length === 0)
100
118
  return { det, unsearched: [] };
101
- const reduced = dimensionallyDetermines(problem.target, problem.governing.filter((g) => !isDimensionless(g)));
119
+ const reduced = dimensionallyDetermines(problem.target, problem.governing.filter((g) => !isDimensionless(g.dim)));
102
120
  return reduced.determined
103
121
  ? { det: reduced, unsearched: dimless.map((g) => g.name) }
104
122
  : { det, unsearched: [] };
@@ -115,6 +133,10 @@ function opCount(node) {
115
133
  return 1 + node.args.reduce((n, a) => n + opCount(a), 0);
116
134
  return 0;
117
135
  }
136
+ /** Whether a candidate is within the budget's AST depth and operator caps. @internal */
137
+ export function withinAstCaps(node, budget) {
138
+ return astDepth(node) <= budget.maxAstDepth && opCount(node) <= budget.maxOperators;
139
+ }
118
140
  /**
119
141
  * Additive / relative corrections: search a monomial of the same dimension
120
142
  * as the observable to add to (or scale) the baseline.
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../src/composition/probe/generator.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Native bounded grammar enumerator — dimensional monomials via Buckingham-π.\n * Deterministic visit order; seed-independent.\n *\n * @module composition/probe/generator\n */\n\nimport type { ExprNode } from '../../dimensional/ast-types.js';\nimport { DIMENSIONLESS } from '../../dimensional/types.js';\nimport { sym } from '../../dimensional/ast-builders.js';\nimport { dimensionallyDetermines, type DimensionalDeterminationResult } from '../../dimensional/buckingham.js';\nimport { validate } from '../../dimensional/validator.js';\nimport type { DimensionalVariableRef, SearchBudget, SearchProblem } from './types.js';\nimport { canEmitCandidate, type BudgetState } from './search-budget.js';\n\nexport interface RawCandidate {\n readonly expression: ExprNode;\n readonly monomial: Readonly<Record<string, number>> | null;\n readonly originNote: string;\n}\n\n/** Build `Π governing^exp` as an `ExprNode`. @internal */\nexport function monomialToExpr(\n monomial: Readonly<Record<string, number>>,\n vars: readonly DimensionalVariableRef[],\n): ExprNode {\n const byName = new Map(vars.map((v) => [v.name, v.dim]));\n const factors: ExprNode[] = [];\n for (const name of Object.keys(monomial).sort()) {\n const exp = monomial[name];\n if (exp === 0) continue;\n const dim = byName.get(name);\n if (!dim) throw new RangeError(`monomialToExpr: unknown variable '${name}'`);\n const base = sym(name, dim);\n if (exp === 1) factors.push(base);\n else {\n factors.push({\n kind: 'op',\n op: '^',\n args: [base, sym(String(exp), DIMENSIONLESS)],\n });\n }\n }\n if (factors.length === 0) return sym('1', DIMENSIONLESS);\n if (factors.length === 1) return factors[0];\n return { kind: 'op', op: '*', args: factors };\n}\n\nfunction* extraPrefactors(base: ExprNode): Iterable<ExprNode> {\n yield base;\n // Registered `2pi` leaf (same normalForm as `base` — dimensionless constant).\n yield { kind: 'op', op: '*', args: [sym('2pi', DIMENSIONLESS), base] };\n}\n\n/**\n * Yield dimensionally valid monomials for `problem`, honouring the budget.\n * Invalid typed constructions are skipped (never evaluated).\n *\n * @internal\n */\nexport function* generateNative(\n problem: SearchProblem,\n state: BudgetState,\n): Iterable<RawCandidate> {\n const { det } = nativeDetermination(problem);\n if (!det.determined || !det.monomial) return;\n\n const expr = monomialToExpr(det.monomial, [problem.target, ...problem.governing]);\n const seen = new Set<string>();\n for (const candidate of extraPrefactors(expr)) {\n if (!canEmitCandidate(state)) return;\n if (validate(candidate).ok !== true) continue;\n // Depth / operator caps\n const depth = astDepth(candidate);\n const ops = opCount(candidate);\n if (depth > state.budget.maxAstDepth) continue;\n if (ops > state.budget.maxOperators) continue;\n const key = JSON.stringify(candidate);\n if (seen.has(key)) continue;\n seen.add(key);\n state.candidates += 1;\n yield {\n expression: candidate,\n monomial: det.monomial,\n originNote: det.reason,\n };\n }\n\n if (problem.baseline && problem.discrepancy) {\n yield* generateCorrections(problem, state, seen);\n }\n}\n\n/**\n * The monomial the native enumerator searches, and the dimensionless inputs it\n * leaves out (persona finding C2). A dimensionless input makes the monomial\n * non-unique, since any f(θ0) can multiply it, and the enumerator used to\n * produce nothing. When the monomial over ALL inputs is not unique, it is taken\n * from the DIMENSIONED inputs; `unsearched` names the dimensionless ones whose\n * function is not searched.\n * @internal\n */\nexport function nativeDetermination(problem: SearchProblem): {\n det: DimensionalDeterminationResult;\n unsearched: string[];\n} {\n const det = dimensionallyDetermines(problem.target, problem.governing);\n if (det.determined) return { det, unsearched: [] };\n const isDimensionless = (g: DimensionalVariableRef) => Object.values(g.dim).every((e) => e === 0);\n const dimless = problem.governing.filter(isDimensionless);\n if (dimless.length === 0) return { det, unsearched: [] };\n const reduced = dimensionallyDetermines(\n problem.target,\n problem.governing.filter((g) => !isDimensionless(g)),\n );\n return reduced.determined\n ? { det: reduced, unsearched: dimless.map((g) => g.name) }\n : { det, unsearched: [] };\n}\n\nfunction astDepth(node: ExprNode): number {\n if (node.kind === 'op') return 1 + Math.max(0, ...node.args.map(astDepth));\n if (node.kind === 'transcendental' || node.kind === 'abs') return 1 + astDepth(node.arg);\n return 1;\n}\n\nfunction opCount(node: ExprNode): number {\n if (node.kind === 'op') return 1 + node.args.reduce((n, a) => n + opCount(a), 0);\n return 0;\n}\n\n/**\n * Additive / relative corrections: search a monomial of the same dimension\n * as the observable to add to (or scale) the baseline.\n */\nfunction* generateCorrections(\n problem: SearchProblem,\n state: BudgetState,\n seen: Set<string>,\n): Iterable<RawCandidate> {\n const kind = problem.discrepancy!.kind;\n if (kind !== 'additive' && kind !== 'relative' && kind !== 'standardized') return;\n const { det } = nativeDetermination(problem);\n if (!det.determined || !det.monomial) return;\n if (!canEmitCandidate(state)) return;\n const corr = monomialToExpr(det.monomial, [problem.target, ...problem.governing]);\n const baseline = problem.baseline!;\n const combined: ExprNode =\n kind === 'additive'\n ? { kind: 'op', op: '+', args: [baseline, corr] }\n : { kind: 'op', op: '*', args: [baseline, { kind: 'op', op: '+', args: [sym('1', DIMENSIONLESS), corr] }] };\n if (validate(combined).ok !== true) return;\n const key = JSON.stringify(combined);\n if (seen.has(key)) return;\n seen.add(key);\n state.candidates += 1;\n yield { expression: combined, monomial: det.monomial, originNote: `correction:${kind}` };\n}\n\n/** Expose budget type for callers. @internal */\nexport type { SearchBudget };\n"]}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../src/composition/probe/generator.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Native bounded grammar enumerator — dimensional monomials via Buckingham-π.\n * Deterministic visit order; seed-independent.\n *\n * @module composition/probe/generator\n */\n\nimport type { ExprNode } from '../../dimensional/ast-types.js';\nimport { DIMENSIONLESS } from '../../dimensional/types.js';\nimport { sym, symbolPower } from '../../dimensional/ast-builders.js';\nimport { dimensionallyDetermines, type DimensionalDeterminationResult } from '../../dimensional/buckingham.js';\nimport { validate } from '../../dimensional/validator.js';\nimport { isDimensionless } from '../../dimensional/algebra.js';\nimport type { DimensionalVariableRef, SearchBudget, SearchProblem } from './types.js';\nimport { canEmitCandidate, type BudgetState } from './search-budget.js';\nimport { powerLawDetermination, type PowerLawFit } from './power-law.js';\n\n/** The power-law fit over the π-groups, re-exported beside the generator that emits it. */\nexport { powerLawDetermination, powerLawWording, rationalizeExponent } from './power-law.js';\n/** The power-law fit's result types: the determination, one fitted exponent, and a recovered fit. */\nexport type { PowerLawDetermination, PowerLawExponent, PowerLawFit } from './power-law.js';\n\n/** A candidate that a generator emits, before scoring and falsification. */\nexport interface RawCandidate {\n readonly expression: ExprNode;\n readonly monomial: Readonly<Record<string, number>> | null;\n readonly originNote: string;\n /** Set on a candidate the power-law fit produced: its exponents, their errors and R². */\n readonly powerLaw?: PowerLawFit;\n}\n\n/**\n * Build `Π governing^exp` as an `ExprNode`: ONE product, negative exponents kept, names in\n * code-unit order (`sort()`).\n *\n * This is not merged with `fromMonomial` (composition/proposed-bridges.ts), which writes a\n * numerator over a denominator with positive exponents and orders names by `localeCompare`.\n * The two trees differ for the same monomial (`Z·a^-0.5` against `Z/a^0.5`, and `Z` before `a`\n * here, after it there), and both are printed (`upt probe` candidates, `upt discover --derive`\n * proposals) and hashed, so one builder would move printed text. They share `symbolPower`, the\n * one factor that is the same in both (tests/composition/monomial-builders.test.ts).\n *\n * @internal\n */\nexport function monomialToExpr(\n monomial: Readonly<Record<string, number>>,\n vars: readonly DimensionalVariableRef[],\n): ExprNode {\n const byName = new Map(vars.map((v) => [v.name, v.dim]));\n const factors: ExprNode[] = [];\n for (const name of Object.keys(monomial).sort()) {\n const exp = monomial[name];\n if (exp === 0) continue;\n const dim = byName.get(name);\n if (!dim) throw new RangeError(`monomialToExpr: unknown variable '${name}'`);\n factors.push(symbolPower(sym(name, dim), exp));\n }\n if (factors.length === 0) return sym('1', DIMENSIONLESS);\n if (factors.length === 1) return factors[0];\n return { kind: 'op', op: '*', args: factors };\n}\n\nfunction* extraPrefactors(base: ExprNode): Iterable<ExprNode> {\n yield base;\n // Registered `2pi` leaf (same normalForm as `base` — dimensionless constant).\n yield { kind: 'op', op: '*', args: [sym('2pi', DIMENSIONLESS), base] };\n}\n\n/**\n * Yield `expr` and its registered prefactor variants that validate and fit the budget's\n * depth and operator caps; `seen` keeps one copy of each construction across the paths.\n */\nfunction* emitWithPrefactors(\n expr: ExprNode,\n monomial: Readonly<Record<string, number>>,\n originNote: string,\n powerLaw: PowerLawFit | undefined,\n state: BudgetState,\n seen: Set<string>,\n): Iterable<RawCandidate> {\n for (const candidate of extraPrefactors(expr)) {\n if (!canEmitCandidate(state)) return;\n if (validate(candidate).ok !== true) continue;\n if (!withinAstCaps(candidate, state.budget)) continue;\n const key = JSON.stringify(candidate);\n if (seen.has(key)) continue;\n seen.add(key);\n state.candidates += 1;\n yield { expression: candidate, monomial, originNote, ...(powerLaw ? { powerLaw } : {}) };\n }\n}\n\n/**\n * Yield dimensionally valid monomials for `problem`, honouring the budget.\n * Invalid typed constructions are skipped (never evaluated).\n *\n * Two paths. The unique monomial of {@link nativeDetermination}, when there\n * is one. Then, when the governing set leaves π-groups (the full determination\n * is not unique) and the problem has exploratory rows, the rational power law\n * over those groups that {@link powerLawDetermination} fits on THOSE ROWS\n * ONLY; the holdout rows are never read here. A fit whose exponents all\n * rationalise to 0 is the base monomial again and is kept once.\n *\n * @internal\n */\nexport function* generateNative(\n problem: SearchProblem,\n state: BudgetState,\n): Iterable<RawCandidate> {\n const vars = [problem.target, ...problem.governing];\n const seen = new Set<string>();\n const { det } = nativeDetermination(problem);\n if (det.determined && det.monomial) {\n yield* emitWithPrefactors(monomialToExpr(det.monomial, vars), det.monomial, det.reason, undefined, state, seen);\n }\n\n if ((problem.exploratory?.rows.length ?? 0) > 0) {\n const pl = powerLawDetermination(problem);\n if (pl.kind === 'fit') {\n const note = `power-law: ${pl.exponents.map((e) => `${e.group}^(${e.rational!.numerator}/${e.rational!.denominator})`).join(' · ')}`;\n yield* emitWithPrefactors(monomialToExpr(pl.monomial, vars), pl.monomial, note, pl, state, seen);\n }\n }\n\n if (problem.baseline && problem.discrepancy) {\n yield* generateCorrections(problem, state, seen);\n }\n}\n\n/**\n * The monomial the native enumerator searches, and the dimensionless inputs it\n * leaves out (persona finding C2). A dimensionless input makes the monomial\n * non-unique, since any f(θ0) can multiply it, and the enumerator used to\n * produce nothing. When the monomial over ALL inputs is not unique, it is taken\n * from the DIMENSIONED inputs; `unsearched` names the dimensionless ones whose\n * function is not searched.\n * @internal\n */\nexport function nativeDetermination(problem: SearchProblem): {\n det: DimensionalDeterminationResult;\n unsearched: string[];\n} {\n const det = dimensionallyDetermines(problem.target, problem.governing);\n if (det.determined) return { det, unsearched: [] };\n const dimless = problem.governing.filter((g) => isDimensionless(g.dim));\n if (dimless.length === 0) return { det, unsearched: [] };\n const reduced = dimensionallyDetermines(\n problem.target,\n problem.governing.filter((g) => !isDimensionless(g.dim)),\n );\n return reduced.determined\n ? { det: reduced, unsearched: dimless.map((g) => g.name) }\n : { det, unsearched: [] };\n}\n\nfunction astDepth(node: ExprNode): number {\n if (node.kind === 'op') return 1 + Math.max(0, ...node.args.map(astDepth));\n if (node.kind === 'transcendental' || node.kind === 'abs') return 1 + astDepth(node.arg);\n return 1;\n}\n\nfunction opCount(node: ExprNode): number {\n if (node.kind === 'op') return 1 + node.args.reduce((n, a) => n + opCount(a), 0);\n return 0;\n}\n\n/** Whether a candidate is within the budget's AST depth and operator caps. @internal */\nexport function withinAstCaps(node: ExprNode, budget: SearchBudget): boolean {\n return astDepth(node) <= budget.maxAstDepth && opCount(node) <= budget.maxOperators;\n}\n\n/**\n * Additive / relative corrections: search a monomial of the same dimension\n * as the observable to add to (or scale) the baseline.\n */\nfunction* generateCorrections(\n problem: SearchProblem,\n state: BudgetState,\n seen: Set<string>,\n): Iterable<RawCandidate> {\n const kind = problem.discrepancy!.kind;\n if (kind !== 'additive' && kind !== 'relative' && kind !== 'standardized') return;\n const { det } = nativeDetermination(problem);\n if (!det.determined || !det.monomial) return;\n if (!canEmitCandidate(state)) return;\n const corr = monomialToExpr(det.monomial, [problem.target, ...problem.governing]);\n const baseline = problem.baseline!;\n const combined: ExprNode =\n kind === 'additive'\n ? { kind: 'op', op: '+', args: [baseline, corr] }\n : { kind: 'op', op: '*', args: [baseline, { kind: 'op', op: '+', args: [sym('1', DIMENSIONLESS), corr] }] };\n if (validate(combined).ok !== true) return;\n const key = JSON.stringify(combined);\n if (seen.has(key)) return;\n seen.add(key);\n state.candidates += 1;\n yield { expression: combined, monomial: det.monomial, originNote: `correction:${kind}` };\n}\n\n/** Expose budget type for callers. @internal */\nexport type { SearchBudget };\n"]}
@@ -21,6 +21,10 @@ export { openManifest, closeManifest } from './run-manifest.js';
21
21
  export { canTransition, applyStatus, statusRank, ProbeCandidateStore } from './candidate-store.js';
22
22
  export { monomialToExpr, generateNative } from './generator.js';
23
23
  export type { RawCandidate } from './generator.js';
24
+ /** The rational power law over the π-groups, and the log-design rank the frontier reads. */
25
+ export { powerLawDetermination, powerLawWording, rationalizeExponent, piStructure, logDesign, logDesignRank } from './power-law.js';
26
+ /** The power-law types: the determination, one fitted exponent, a recovered fit, the π-structure and the log-design. */
27
+ export type { PowerLawDetermination, PowerLawExponent, PowerLawFit, PiStructure, LogDesign } from './power-law.js';
24
28
  export { wrapRelationLinkGaps, wrapConnectorGaps, wrapRegimeGaps, scanFrontier, findFrontierGap, problemFromResidualGap, } from './frontier.js';
25
29
  export { expressionSearchGaps, scanWithExpressionGaps } from './expression-gaps.js';
26
30
  export { fitPrefactor } from './fit.js';
@@ -31,14 +35,22 @@ export { compareToCorpus, corpusRelativeWording } from './corpus.js';
31
35
  export type { CorpusMatch, CorpusComparisonResult } from './corpus.js';
32
36
  export { checkDeclaredLimit, checkDeclaredLimits } from './limits.js';
33
37
  export type { LimitCheckResult } from './limits.js';
38
+ /** What a declared-limit check found: held, failed, or undecided on too few evaluable rows. */
39
+ export type { LimitOutcome } from './limits.js';
34
40
  export { runFalsification, DEFAULT_BATTERIES } from './falsify.js';
35
41
  export type { FalsifyInput, FalsifyResult } from './falsify.js';
36
42
  export { datasetFromRows, asDatasetSafe, loadDatasetFromJson, loadSplitDatasetsFromJson, loadDatasetFromCsv, loadSplitCsv, } from './dataset.js';
43
+ /** The strict cell reader (a finite number or a decimal string, never a coercion) and the error a dataset raises by row and column. */
44
+ export { readDatasetNumber, DatasetError } from './dataset.js';
37
45
  export type { SplitFileDatasets } from './dataset.js';
38
46
  export { suggestDiscriminatingPoint, parseDesignBounds } from './experiment-design.js';
39
47
  export type { DesignBounds, DesignSuggestion } from './experiment-design.js';
40
48
  export { detectMeanChangepoint, estimateScaleExponent, probeConservation, } from './structure.js';
41
49
  export type { ChangepointInput, ChangepointResult, ScaleSymmetryInput } from './structure.js';
50
+ /** The scale-exponent result (slope, standard error, direct p) and the conservation verdict (slope against k·stdErr). */
51
+ export type { ScaleExponentResult, ConservationResult } from './structure.js';
52
+ /** The direct two-sided Student t tail the probes consume instead of MathTS's `2·(1 − CDF)`. */
53
+ export { studentTwoSidedP } from './t-tail.js';
42
54
  export { runBackendWorker } from './backend-protocol.js';
43
55
  export type { BackendRequest, BackendCandidate, BackendResponse } from './backend-protocol.js';
44
56
  export { setRelationMetadata, getRelationMetadata, listRelationMetadata, clearRelationMetadata, } from './metadata.js';
@@ -51,4 +63,6 @@ export type { ProbeSearchOptions, ProbeSearchResult } from './pipeline.js';
51
63
  export { formatProbeReport, formatFrontierScan, formatFrontierGap } from './report.js';
52
64
  export { parseStudy, loadStudyFromJson, loadStudyFile, attachReplication, studyCsvToRaw, runProbeStudy, formatProbeStudy, chiSquareSurvival, fSurvival, effectiveSigma, StudyRefusal, } from './study.js';
53
65
  export type { ProbeStudy, ProbeStudyOptions, ProbeStudyResult, StudyVerdict, ReplicationOutcome, StudyRole, StudyProvenance, StudyObservation, StudyBaseline, SetTest, ModelTest, CandidateTest, StudyDesignSuggestion, StudyCorrection, StudyCorrectionReport, CorrectionStep, } from './study.js';
66
+ /** One fitted correction coefficient with its standard error and, when declared, the reference it is compared with. */
67
+ export type { CorrectionCoefficient } from './study.js';
54
68
  //# sourceMappingURL=index.d.ts.map