universal-physics-tensor 9.0.0 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1109) hide show
  1. package/README.md +21 -17
  2. package/bin/upt.mjs +13 -1
  3. package/data/atlas/atlas.json +79 -68
  4. package/data/atlas/atlas.jsonld +1 -1
  5. package/data/atlas/diffusion.json +24 -23
  6. package/data/atlas/oscillators.json +21 -16
  7. package/data/atlas/waves.json +36 -31
  8. package/data/atlas/witness-results.json +11 -11
  9. package/data/bridge-catalog.json +1192 -1636
  10. package/data/bridge-catalog.schema.json +390 -135
  11. package/data/quantities.json +53 -19
  12. package/data/schemas/atlas-record.v0.json +184 -46
  13. package/data/units.json +33 -4
  14. package/dist/atlas/applicability.d.ts.map +1 -1
  15. package/dist/atlas/applicability.js +35 -18
  16. package/dist/atlas/applicability.js.map +1 -1
  17. package/dist/atlas/association.js.map +1 -1
  18. package/dist/atlas/benchmark/backend-shapes.d.ts.map +1 -1
  19. package/dist/atlas/benchmark/backend-shapes.js +5 -1
  20. package/dist/atlas/benchmark/backend-shapes.js.map +1 -1
  21. package/dist/atlas/benchmark/baselines.d.ts.map +1 -1
  22. package/dist/atlas/benchmark/baselines.js +8 -0
  23. package/dist/atlas/benchmark/baselines.js.map +1 -1
  24. package/dist/atlas/benchmark/hybrid-retrieval.d.ts +12 -3
  25. package/dist/atlas/benchmark/hybrid-retrieval.d.ts.map +1 -1
  26. package/dist/atlas/benchmark/hybrid-retrieval.js +30 -21
  27. package/dist/atlas/benchmark/hybrid-retrieval.js.map +1 -1
  28. package/dist/atlas/benchmark/leakage.js.map +1 -1
  29. package/dist/atlas/benchmark/loader.js +2 -2
  30. package/dist/atlas/benchmark/loader.js.map +1 -1
  31. package/dist/atlas/benchmark/run-atlas.d.ts.map +1 -1
  32. package/dist/atlas/benchmark/run-atlas.js +14 -2
  33. package/dist/atlas/benchmark/run-atlas.js.map +1 -1
  34. package/dist/atlas/benchmark/stats.d.ts +3 -3
  35. package/dist/atlas/benchmark/stats.d.ts.map +1 -1
  36. package/dist/atlas/benchmark/stats.js +16 -8
  37. package/dist/atlas/benchmark/stats.js.map +1 -1
  38. package/dist/atlas/benchmark/study.js.map +1 -1
  39. package/dist/atlas/benchmark/types.js.map +1 -1
  40. package/dist/atlas/bridge-record.d.ts +4 -4
  41. package/dist/atlas/bridge-record.d.ts.map +1 -1
  42. package/dist/atlas/bridge-record.js +6 -6
  43. package/dist/atlas/bridge-record.js.map +1 -1
  44. package/dist/atlas/catalog-formal-ref.d.ts +26 -3
  45. package/dist/atlas/catalog-formal-ref.d.ts.map +1 -1
  46. package/dist/atlas/catalog-formal-ref.js +52 -5
  47. package/dist/atlas/catalog-formal-ref.js.map +1 -1
  48. package/dist/atlas/chain-pipeline.d.ts +0 -11
  49. package/dist/atlas/chain-pipeline.d.ts.map +1 -1
  50. package/dist/atlas/chain-pipeline.js +12 -24
  51. package/dist/atlas/chain-pipeline.js.map +1 -1
  52. package/dist/atlas/composition-table.js.map +1 -1
  53. package/dist/atlas/conventions.js.map +1 -1
  54. package/dist/atlas/coverage.d.ts +2 -2
  55. package/dist/atlas/coverage.js.map +1 -1
  56. package/dist/atlas/derivation.js.map +1 -1
  57. package/dist/atlas/derive-evidence.d.ts +6 -4
  58. package/dist/atlas/derive-evidence.d.ts.map +1 -1
  59. package/dist/atlas/derive-evidence.js +7 -2
  60. package/dist/atlas/derive-evidence.js.map +1 -1
  61. package/dist/atlas/diffusion/bridges-closure.d.ts +0 -4
  62. package/dist/atlas/diffusion/bridges-closure.d.ts.map +1 -1
  63. package/dist/atlas/diffusion/bridges-closure.js +8 -17
  64. package/dist/atlas/diffusion/bridges-closure.js.map +1 -1
  65. package/dist/atlas/diffusion/bridges.d.ts.map +1 -1
  66. package/dist/atlas/diffusion/bridges.js +27 -42
  67. package/dist/atlas/diffusion/bridges.js.map +1 -1
  68. package/dist/atlas/diffusion/dimensions.d.ts +6 -14
  69. package/dist/atlas/diffusion/dimensions.d.ts.map +1 -1
  70. package/dist/atlas/diffusion/dimensions.js +8 -16
  71. package/dist/atlas/diffusion/dimensions.js.map +1 -1
  72. package/dist/atlas/diffusion/index.d.ts +1 -1
  73. package/dist/atlas/diffusion/index.d.ts.map +1 -1
  74. package/dist/atlas/diffusion/index.js.map +1 -1
  75. package/dist/atlas/diffusion/models.d.ts +3 -3
  76. package/dist/atlas/diffusion/models.d.ts.map +1 -1
  77. package/dist/atlas/diffusion/models.js +5 -10
  78. package/dist/atlas/diffusion/models.js.map +1 -1
  79. package/dist/atlas/diffusion/numerics.d.ts +16 -4
  80. package/dist/atlas/diffusion/numerics.d.ts.map +1 -1
  81. package/dist/atlas/diffusion/numerics.js +38 -24
  82. package/dist/atlas/diffusion/numerics.js.map +1 -1
  83. package/dist/atlas/error-algebra.d.ts +6 -0
  84. package/dist/atlas/error-algebra.d.ts.map +1 -1
  85. package/dist/atlas/error-algebra.js +26 -0
  86. package/dist/atlas/error-algebra.js.map +1 -1
  87. package/dist/atlas/export.d.ts +18 -2
  88. package/dist/atlas/export.d.ts.map +1 -1
  89. package/dist/atlas/export.js +9 -3
  90. package/dist/atlas/export.js.map +1 -1
  91. package/dist/atlas/families.d.ts +19 -2
  92. package/dist/atlas/families.d.ts.map +1 -1
  93. package/dist/atlas/families.js +26 -3
  94. package/dist/atlas/families.js.map +1 -1
  95. package/dist/atlas/family.d.ts +27 -0
  96. package/dist/atlas/family.d.ts.map +1 -0
  97. package/dist/atlas/family.js +12 -0
  98. package/dist/atlas/family.js.map +1 -0
  99. package/dist/atlas/index.d.ts +3 -2
  100. package/dist/atlas/index.d.ts.map +1 -1
  101. package/dist/atlas/index.js +2 -1
  102. package/dist/atlas/index.js.map +1 -1
  103. package/dist/atlas/link-prediction.d.ts +107 -4
  104. package/dist/atlas/link-prediction.d.ts.map +1 -1
  105. package/dist/atlas/link-prediction.js +212 -66
  106. package/dist/atlas/link-prediction.js.map +1 -1
  107. package/dist/atlas/model.js.map +1 -1
  108. package/dist/atlas/oscillators/bridges-coarse.d.ts.map +1 -1
  109. package/dist/atlas/oscillators/bridges-coarse.js +7 -12
  110. package/dist/atlas/oscillators/bridges-coarse.js.map +1 -1
  111. package/dist/atlas/oscillators/bridges-exact.d.ts.map +1 -1
  112. package/dist/atlas/oscillators/bridges-exact.js +6 -10
  113. package/dist/atlas/oscillators/bridges-exact.js.map +1 -1
  114. package/dist/atlas/oscillators/bridges-limits.d.ts +3 -16
  115. package/dist/atlas/oscillators/bridges-limits.d.ts.map +1 -1
  116. package/dist/atlas/oscillators/bridges-limits.js +23 -36
  117. package/dist/atlas/oscillators/bridges-limits.js.map +1 -1
  118. package/dist/atlas/oscillators/dimensions.d.ts +9 -21
  119. package/dist/atlas/oscillators/dimensions.d.ts.map +1 -1
  120. package/dist/atlas/oscillators/dimensions.js +9 -21
  121. package/dist/atlas/oscillators/dimensions.js.map +1 -1
  122. package/dist/atlas/oscillators/index.d.ts +1 -16
  123. package/dist/atlas/oscillators/index.d.ts.map +1 -1
  124. package/dist/atlas/oscillators/index.js.map +1 -1
  125. package/dist/atlas/oscillators/limit-witnesses.d.ts +2 -2
  126. package/dist/atlas/oscillators/limit-witnesses.d.ts.map +1 -1
  127. package/dist/atlas/oscillators/limit-witnesses.js +17 -15
  128. package/dist/atlas/oscillators/limit-witnesses.js.map +1 -1
  129. package/dist/atlas/oscillators/models.d.ts.map +1 -1
  130. package/dist/atlas/oscillators/models.js +2 -6
  131. package/dist/atlas/oscillators/models.js.map +1 -1
  132. package/dist/atlas/oscillators/norm-transport-witness.js.map +1 -1
  133. package/dist/atlas/oscillators/norm-transport.js.map +1 -1
  134. package/dist/atlas/oscillators/norms.js.map +1 -1
  135. package/dist/atlas/oscillators/pendulum-motion.d.ts +29 -6
  136. package/dist/atlas/oscillators/pendulum-motion.d.ts.map +1 -1
  137. package/dist/atlas/oscillators/pendulum-motion.js +60 -40
  138. package/dist/atlas/oscillators/pendulum-motion.js.map +1 -1
  139. package/dist/atlas/oscillators/phase-carriage.js.map +1 -1
  140. package/dist/atlas/oscillators/phase-translation.d.ts +0 -11
  141. package/dist/atlas/oscillators/phase-translation.d.ts.map +1 -1
  142. package/dist/atlas/oscillators/phase-translation.js +3 -4
  143. package/dist/atlas/oscillators/phase-translation.js.map +1 -1
  144. package/dist/atlas/oscillators/position-translation.d.ts +68 -7
  145. package/dist/atlas/oscillators/position-translation.d.ts.map +1 -1
  146. package/dist/atlas/oscillators/position-translation.js +123 -12
  147. package/dist/atlas/oscillators/position-translation.js.map +1 -1
  148. package/dist/atlas/oscillators/rejections.d.ts +0 -2
  149. package/dist/atlas/oscillators/rejections.d.ts.map +1 -1
  150. package/dist/atlas/oscillators/rejections.js +0 -7
  151. package/dist/atlas/oscillators/rejections.js.map +1 -1
  152. package/dist/atlas/path-bound.js.map +1 -1
  153. package/dist/atlas/physjs-entries.generated.d.ts +25 -24
  154. package/dist/atlas/physjs-entries.generated.d.ts.map +1 -1
  155. package/dist/atlas/physjs-entries.generated.js +25 -24
  156. package/dist/atlas/physjs-entries.generated.js.map +1 -1
  157. package/dist/atlas/physjs-ref.d.ts +107 -70
  158. package/dist/atlas/physjs-ref.d.ts.map +1 -1
  159. package/dist/atlas/physjs-ref.js +184 -101
  160. package/dist/atlas/physjs-ref.js.map +1 -1
  161. package/dist/atlas/physjs-reviewed.d.ts +31 -0
  162. package/dist/atlas/physjs-reviewed.d.ts.map +1 -0
  163. package/dist/atlas/physjs-reviewed.js +194 -0
  164. package/dist/atlas/physjs-reviewed.js.map +1 -0
  165. package/dist/atlas/poster/associations.js.map +1 -1
  166. package/dist/atlas/poster/derivations.js.map +1 -1
  167. package/dist/atlas/poster/statements.d.ts +0 -19
  168. package/dist/atlas/poster/statements.d.ts.map +1 -1
  169. package/dist/atlas/poster/statements.js +1 -1
  170. package/dist/atlas/poster/statements.js.map +1 -1
  171. package/dist/atlas/proof-target.d.ts +1 -1
  172. package/dist/atlas/proof-target.js +1 -1
  173. package/dist/atlas/proof-target.js.map +1 -1
  174. package/dist/atlas/public.d.ts +2 -1
  175. package/dist/atlas/public.d.ts.map +1 -1
  176. package/dist/atlas/public.js +2 -1
  177. package/dist/atlas/public.js.map +1 -1
  178. package/dist/atlas/regime.d.ts +1 -1
  179. package/dist/atlas/regime.d.ts.map +1 -1
  180. package/dist/atlas/regime.js +1 -1
  181. package/dist/atlas/regime.js.map +1 -1
  182. package/dist/atlas/serialize.d.ts +18 -12
  183. package/dist/atlas/serialize.d.ts.map +1 -1
  184. package/dist/atlas/serialize.js +28 -18
  185. package/dist/atlas/serialize.js.map +1 -1
  186. package/dist/atlas/statement.js.map +1 -1
  187. package/dist/atlas/text-overlap.d.ts +23 -0
  188. package/dist/atlas/text-overlap.d.ts.map +1 -0
  189. package/dist/atlas/text-overlap.js +41 -0
  190. package/dist/atlas/text-overlap.js.map +1 -0
  191. package/dist/atlas/translation-registry.js.map +1 -1
  192. package/dist/atlas/translation.js.map +1 -1
  193. package/dist/atlas/types.d.ts +9 -2
  194. package/dist/atlas/types.d.ts.map +1 -1
  195. package/dist/atlas/types.js +1 -1
  196. package/dist/atlas/types.js.map +1 -1
  197. package/dist/atlas/waves/bridges-closure.d.ts.map +1 -1
  198. package/dist/atlas/waves/bridges-closure.js +2 -9
  199. package/dist/atlas/waves/bridges-closure.js.map +1 -1
  200. package/dist/atlas/waves/bridges.d.ts.map +1 -1
  201. package/dist/atlas/waves/bridges.js +32 -52
  202. package/dist/atlas/waves/bridges.js.map +1 -1
  203. package/dist/atlas/waves/index.d.ts +1 -1
  204. package/dist/atlas/waves/index.d.ts.map +1 -1
  205. package/dist/atlas/waves/index.js.map +1 -1
  206. package/dist/atlas/waves/models.d.ts +5 -6
  207. package/dist/atlas/waves/models.d.ts.map +1 -1
  208. package/dist/atlas/waves/models.js +7 -13
  209. package/dist/atlas/waves/models.js.map +1 -1
  210. package/dist/atlas/waves/numerics.d.ts.map +1 -1
  211. package/dist/atlas/waves/numerics.js +10 -3
  212. package/dist/atlas/waves/numerics.js.map +1 -1
  213. package/dist/atlas/witness-artifact.js.map +1 -1
  214. package/dist/atlas/witness-dominance.d.ts +4 -3
  215. package/dist/atlas/witness-dominance.d.ts.map +1 -1
  216. package/dist/atlas/witness-dominance.js +15 -5
  217. package/dist/atlas/witness-dominance.js.map +1 -1
  218. package/dist/atlas/witness-numeric.d.ts +38 -4
  219. package/dist/atlas/witness-numeric.d.ts.map +1 -1
  220. package/dist/atlas/witness-numeric.js +80 -2
  221. package/dist/atlas/witness-numeric.js.map +1 -1
  222. package/dist/atlas/witness-result.d.ts +7 -1
  223. package/dist/atlas/witness-result.d.ts.map +1 -1
  224. package/dist/atlas/witness-result.js.map +1 -1
  225. package/dist/atlas/witness-specs.d.ts.map +1 -1
  226. package/dist/atlas/witness-specs.js +19 -0
  227. package/dist/atlas/witness-specs.js.map +1 -1
  228. package/dist/atlas/witness-symbolic.d.ts +75 -3
  229. package/dist/atlas/witness-symbolic.d.ts.map +1 -1
  230. package/dist/atlas/witness-symbolic.js +116 -10
  231. package/dist/atlas/witness-symbolic.js.map +1 -1
  232. package/dist/atlas/witnesses/quantum-support.js.map +1 -1
  233. package/dist/bridges/caller-table.d.ts +1 -1
  234. package/dist/bridges/caller-table.d.ts.map +1 -1
  235. package/dist/bridges/caller-table.js.map +1 -1
  236. package/dist/bridges/carrier-sign.d.ts.map +1 -1
  237. package/dist/bridges/carrier-sign.js +8 -3
  238. package/dist/bridges/carrier-sign.js.map +1 -1
  239. package/dist/bridges/catalog-adapter.d.ts +12 -3
  240. package/dist/bridges/catalog-adapter.d.ts.map +1 -1
  241. package/dist/bridges/catalog-adapter.js +17 -9
  242. package/dist/bridges/catalog-adapter.js.map +1 -1
  243. package/dist/bridges/catalog-load.d.ts +12 -2
  244. package/dist/bridges/catalog-load.d.ts.map +1 -1
  245. package/dist/bridges/catalog-load.js +181 -13
  246. package/dist/bridges/catalog-load.js.map +1 -1
  247. package/dist/bridges/catalog-types.d.ts +74 -26
  248. package/dist/bridges/catalog-types.d.ts.map +1 -1
  249. package/dist/bridges/catalog-types.js +11 -1
  250. package/dist/bridges/catalog-types.js.map +1 -1
  251. package/dist/bridges/coefficient-statement.js +1 -5
  252. package/dist/bridges/coefficient-statement.js.map +1 -1
  253. package/dist/bridges/confrontation-coverage.js.map +1 -1
  254. package/dist/bridges/confrontations.d.ts +1 -1
  255. package/dist/bridges/confrontations.d.ts.map +1 -1
  256. package/dist/bridges/confrontations.js +1 -1
  257. package/dist/bridges/confrontations.js.map +1 -1
  258. package/dist/bridges/evaluation-errors.d.ts +46 -3
  259. package/dist/bridges/evaluation-errors.d.ts.map +1 -1
  260. package/dist/bridges/evaluation-errors.js +40 -4
  261. package/dist/bridges/evaluation-errors.js.map +1 -1
  262. package/dist/bridges/evaluator-inputs.d.ts.map +1 -1
  263. package/dist/bridges/evaluator-inputs.js +7 -5
  264. package/dist/bridges/evaluator-inputs.js.map +1 -1
  265. package/dist/bridges/evaluators.d.ts +17 -2
  266. package/dist/bridges/evaluators.d.ts.map +1 -1
  267. package/dist/bridges/evaluators.js +76 -28
  268. package/dist/bridges/evaluators.js.map +1 -1
  269. package/dist/bridges/expr-parse.d.ts +38 -4
  270. package/dist/bridges/expr-parse.d.ts.map +1 -1
  271. package/dist/bridges/expr-parse.js +101 -12
  272. package/dist/bridges/expr-parse.js.map +1 -1
  273. package/dist/bridges/holds.d.ts +40 -4
  274. package/dist/bridges/holds.d.ts.map +1 -1
  275. package/dist/bridges/holds.js +128 -19
  276. package/dist/bridges/holds.js.map +1 -1
  277. package/dist/bridges/index.d.ts +15 -14
  278. package/dist/bridges/index.d.ts.map +1 -1
  279. package/dist/bridges/index.js +14 -15
  280. package/dist/bridges/index.js.map +1 -1
  281. package/dist/bridges/input-contract.js.map +1 -1
  282. package/dist/bridges/membership.d.ts +5 -3
  283. package/dist/bridges/membership.d.ts.map +1 -1
  284. package/dist/bridges/membership.js +5 -6
  285. package/dist/bridges/membership.js.map +1 -1
  286. package/dist/bridges/notices.d.ts.map +1 -1
  287. package/dist/bridges/notices.js +5 -5
  288. package/dist/bridges/notices.js.map +1 -1
  289. package/dist/bridges/observations/types.js.map +1 -1
  290. package/dist/bridges/rejected.d.ts +11 -17
  291. package/dist/bridges/rejected.d.ts.map +1 -1
  292. package/dist/bridges/rejected.js +13 -68
  293. package/dist/bridges/rejected.js.map +1 -1
  294. package/dist/bridges/relation-eval.d.ts +6 -7
  295. package/dist/bridges/relation-eval.d.ts.map +1 -1
  296. package/dist/bridges/relation-eval.js +20 -50
  297. package/dist/bridges/relation-eval.js.map +1 -1
  298. package/dist/bridges/rhs-registry.js.map +1 -1
  299. package/dist/bridges/sensitivity.d.ts +11 -3
  300. package/dist/bridges/sensitivity.d.ts.map +1 -1
  301. package/dist/bridges/sensitivity.js +27 -13
  302. package/dist/bridges/sensitivity.js.map +1 -1
  303. package/dist/bridges/tensor-index.js.map +1 -1
  304. package/dist/bridges/types.d.ts +1 -7
  305. package/dist/bridges/types.d.ts.map +1 -1
  306. package/dist/bridges/types.js +1 -4
  307. package/dist/bridges/types.js.map +1 -1
  308. package/dist/bridges/validity.d.ts +33 -0
  309. package/dist/bridges/validity.d.ts.map +1 -0
  310. package/dist/bridges/validity.js +67 -0
  311. package/dist/bridges/validity.js.map +1 -0
  312. package/dist/canonical/canonical-equation.js.map +1 -1
  313. package/dist/canonical/dimensional-fields.js.map +1 -1
  314. package/dist/canonical/entries/_l1-build.js.map +1 -1
  315. package/dist/canonical/entries/atomic.js +1 -3
  316. package/dist/canonical/entries/atomic.js.map +1 -1
  317. package/dist/canonical/entries/condensed-matter.d.ts.map +1 -1
  318. package/dist/canonical/entries/condensed-matter.js +8 -9
  319. package/dist/canonical/entries/condensed-matter.js.map +1 -1
  320. package/dist/canonical/entries/dimensional-classics.d.ts.map +1 -1
  321. package/dist/canonical/entries/dimensional-classics.js +5 -6
  322. package/dist/canonical/entries/dimensional-classics.js.map +1 -1
  323. package/dist/canonical/entries/electromagnetism.d.ts.map +1 -1
  324. package/dist/canonical/entries/electromagnetism.js +6 -12
  325. package/dist/canonical/entries/electromagnetism.js.map +1 -1
  326. package/dist/canonical/entries/fluids-waves.d.ts.map +1 -1
  327. package/dist/canonical/entries/fluids-waves.js +3 -7
  328. package/dist/canonical/entries/fluids-waves.js.map +1 -1
  329. package/dist/canonical/entries/mechanics.d.ts.map +1 -1
  330. package/dist/canonical/entries/mechanics.js +4 -6
  331. package/dist/canonical/entries/mechanics.js.map +1 -1
  332. package/dist/canonical/entries/nonmonomial.d.ts.map +1 -1
  333. package/dist/canonical/entries/nonmonomial.js +38 -39
  334. package/dist/canonical/entries/nonmonomial.js.map +1 -1
  335. package/dist/canonical/entries/relativity.d.ts.map +1 -1
  336. package/dist/canonical/entries/relativity.js +6 -6
  337. package/dist/canonical/entries/relativity.js.map +1 -1
  338. package/dist/canonical/entries/statistical-mechanics.js +5 -5
  339. package/dist/canonical/entries/statistical-mechanics.js.map +1 -1
  340. package/dist/canonical/entries/thermo-nuclear-cosmo.d.ts.map +1 -1
  341. package/dist/canonical/entries/thermo-nuclear-cosmo.js +6 -10
  342. package/dist/canonical/entries/thermo-nuclear-cosmo.js.map +1 -1
  343. package/dist/canonical/fixed-points.d.ts +94 -0
  344. package/dist/canonical/fixed-points.d.ts.map +1 -0
  345. package/dist/canonical/fixed-points.js +81 -0
  346. package/dist/canonical/fixed-points.js.map +1 -0
  347. package/dist/canonical/linkage.d.ts +29 -4
  348. package/dist/canonical/linkage.d.ts.map +1 -1
  349. package/dist/canonical/linkage.js +47 -64
  350. package/dist/canonical/linkage.js.map +1 -1
  351. package/dist/canonical/normal-form.d.ts +0 -8
  352. package/dist/canonical/normal-form.d.ts.map +1 -1
  353. package/dist/canonical/normal-form.js +22 -23
  354. package/dist/canonical/normal-form.js.map +1 -1
  355. package/dist/canonical/registry.js.map +1 -1
  356. package/dist/canonical/residual.js.map +1 -1
  357. package/dist/canonical/seed-l-layer.d.ts +7 -1
  358. package/dist/canonical/seed-l-layer.d.ts.map +1 -1
  359. package/dist/canonical/seed-l-layer.js +7 -1
  360. package/dist/canonical/seed-l-layer.js.map +1 -1
  361. package/dist/canonical/structural.d.ts +42 -21
  362. package/dist/canonical/structural.d.ts.map +1 -1
  363. package/dist/canonical/structural.js +64 -23
  364. package/dist/canonical/structural.js.map +1 -1
  365. package/dist/cases/brownian-sphere.d.ts +3 -3
  366. package/dist/cases/brownian-sphere.d.ts.map +1 -1
  367. package/dist/cases/brownian-sphere.js +10 -9
  368. package/dist/cases/brownian-sphere.js.map +1 -1
  369. package/dist/cases/damped-resonator.d.ts.map +1 -1
  370. package/dist/cases/damped-resonator.js +8 -11
  371. package/dist/cases/damped-resonator.js.map +1 -1
  372. package/dist/cases/index.js.map +1 -1
  373. package/dist/cases/kepler-rv.d.ts +1 -1
  374. package/dist/cases/kepler-rv.d.ts.map +1 -1
  375. package/dist/cases/kepler-rv.js +3 -2
  376. package/dist/cases/kepler-rv.js.map +1 -1
  377. package/dist/cases/lumped-cooling.d.ts +8 -3
  378. package/dist/cases/lumped-cooling.d.ts.map +1 -1
  379. package/dist/cases/lumped-cooling.js +22 -24
  380. package/dist/cases/lumped-cooling.js.map +1 -1
  381. package/dist/cases/quadrature.d.ts +7 -9
  382. package/dist/cases/quadrature.d.ts.map +1 -1
  383. package/dist/cases/quadrature.js +28 -32
  384. package/dist/cases/quadrature.js.map +1 -1
  385. package/dist/cases/resistor-noise.js +7 -7
  386. package/dist/cases/resistor-noise.js.map +1 -1
  387. package/dist/cases/skin-depth.d.ts +0 -4
  388. package/dist/cases/skin-depth.d.ts.map +1 -1
  389. package/dist/cases/skin-depth.js +3 -7
  390. package/dist/cases/skin-depth.js.map +1 -1
  391. package/dist/cases/types.js.map +1 -1
  392. package/dist/cli/args.d.ts +30 -3
  393. package/dist/cli/args.d.ts.map +1 -1
  394. package/dist/cli/args.js +47 -9
  395. package/dist/cli/args.js.map +1 -1
  396. package/dist/cli/bindings.d.ts +13 -0
  397. package/dist/cli/bindings.d.ts.map +1 -0
  398. package/dist/cli/bindings.js +33 -0
  399. package/dist/cli/bindings.js.map +1 -0
  400. package/dist/cli/closed-form-range.js.map +1 -1
  401. package/dist/cli/command.d.ts +8 -1
  402. package/dist/cli/command.d.ts.map +1 -1
  403. package/dist/cli/command.js.map +1 -1
  404. package/dist/cli/commands/_atlas-map.d.ts +2 -11
  405. package/dist/cli/commands/_atlas-map.d.ts.map +1 -1
  406. package/dist/cli/commands/_atlas-map.js +50 -35
  407. package/dist/cli/commands/_atlas-map.js.map +1 -1
  408. package/dist/cli/commands/_atlas-route.d.ts.map +1 -1
  409. package/dist/cli/commands/_atlas-route.js +6 -2
  410. package/dist/cli/commands/_atlas-route.js.map +1 -1
  411. package/dist/cli/commands/_discovery-opts.d.ts.map +1 -1
  412. package/dist/cli/commands/_discovery-opts.js +48 -14
  413. package/dist/cli/commands/_discovery-opts.js.map +1 -1
  414. package/dist/cli/commands/atlas.d.ts.map +1 -1
  415. package/dist/cli/commands/atlas.js +9 -8
  416. package/dist/cli/commands/atlas.js.map +1 -1
  417. package/dist/cli/commands/audit.d.ts.map +1 -1
  418. package/dist/cli/commands/audit.js +20 -20
  419. package/dist/cli/commands/audit.js.map +1 -1
  420. package/dist/cli/commands/axes.d.ts.map +1 -1
  421. package/dist/cli/commands/axes.js +20 -1
  422. package/dist/cli/commands/axes.js.map +1 -1
  423. package/dist/cli/commands/candidates.d.ts.map +1 -1
  424. package/dist/cli/commands/candidates.js +16 -8
  425. package/dist/cli/commands/candidates.js.map +1 -1
  426. package/dist/cli/commands/canonical.js.map +1 -1
  427. package/dist/cli/commands/chain.js +1 -1
  428. package/dist/cli/commands/chain.js.map +1 -1
  429. package/dist/cli/commands/confront.d.ts.map +1 -1
  430. package/dist/cli/commands/confront.js +22 -20
  431. package/dist/cli/commands/confront.js.map +1 -1
  432. package/dist/cli/commands/connectors.js.map +1 -1
  433. package/dist/cli/commands/coverage.js.map +1 -1
  434. package/dist/cli/commands/derive.d.ts.map +1 -1
  435. package/dist/cli/commands/derive.js +60 -35
  436. package/dist/cli/commands/derive.js.map +1 -1
  437. package/dist/cli/commands/discover.d.ts.map +1 -1
  438. package/dist/cli/commands/discover.js +20 -10
  439. package/dist/cli/commands/discover.js.map +1 -1
  440. package/dist/cli/commands/eval.d.ts.map +1 -1
  441. package/dist/cli/commands/eval.js +14 -10
  442. package/dist/cli/commands/eval.js.map +1 -1
  443. package/dist/cli/commands/evaluate.d.ts.map +1 -1
  444. package/dist/cli/commands/evaluate.js +108 -58
  445. package/dist/cli/commands/evaluate.js.map +1 -1
  446. package/dist/cli/commands/explain.d.ts.map +1 -1
  447. package/dist/cli/commands/explain.js +16 -8
  448. package/dist/cli/commands/explain.js.map +1 -1
  449. package/dist/cli/commands/frontier.js.map +1 -1
  450. package/dist/cli/commands/ground.d.ts.map +1 -1
  451. package/dist/cli/commands/ground.js +41 -10
  452. package/dist/cli/commands/ground.js.map +1 -1
  453. package/dist/cli/commands/index.js.map +1 -1
  454. package/dist/cli/commands/map.d.ts.map +1 -1
  455. package/dist/cli/commands/map.js +155 -92
  456. package/dist/cli/commands/map.js.map +1 -1
  457. package/dist/cli/commands/metric.d.ts.map +1 -1
  458. package/dist/cli/commands/metric.js +58 -20
  459. package/dist/cli/commands/metric.js.map +1 -1
  460. package/dist/cli/commands/path.d.ts +10 -0
  461. package/dist/cli/commands/path.d.ts.map +1 -1
  462. package/dist/cli/commands/path.js +29 -7
  463. package/dist/cli/commands/path.js.map +1 -1
  464. package/dist/cli/commands/predict.js.map +1 -1
  465. package/dist/cli/commands/priority.js.map +1 -1
  466. package/dist/cli/commands/probe.d.ts.map +1 -1
  467. package/dist/cli/commands/probe.js +105 -38
  468. package/dist/cli/commands/probe.js.map +1 -1
  469. package/dist/cli/commands/recover.js +1 -1
  470. package/dist/cli/commands/recover.js.map +1 -1
  471. package/dist/cli/commands/regime.d.ts +5 -4
  472. package/dist/cli/commands/regime.d.ts.map +1 -1
  473. package/dist/cli/commands/regime.js +25 -26
  474. package/dist/cli/commands/regime.js.map +1 -1
  475. package/dist/cli/commands/retrieve.d.ts.map +1 -1
  476. package/dist/cli/commands/retrieve.js +23 -14
  477. package/dist/cli/commands/retrieve.js.map +1 -1
  478. package/dist/cli/commands/search.d.ts.map +1 -1
  479. package/dist/cli/commands/search.js +9 -4
  480. package/dist/cli/commands/search.js.map +1 -1
  481. package/dist/cli/commands/symbolic.js +31 -36
  482. package/dist/cli/commands/symbolic.js.map +1 -1
  483. package/dist/cli/commands/testplan.d.ts.map +1 -1
  484. package/dist/cli/commands/testplan.js +5 -3
  485. package/dist/cli/commands/testplan.js.map +1 -1
  486. package/dist/cli/conventions.js.map +1 -1
  487. package/dist/cli/determination.js.map +1 -1
  488. package/dist/cli/errors.js.map +1 -1
  489. package/dist/cli/euler-guard.js.map +1 -1
  490. package/dist/cli/eval-numbers.js.map +1 -1
  491. package/dist/cli/expr-print.d.ts +28 -3
  492. package/dist/cli/expr-print.d.ts.map +1 -1
  493. package/dist/cli/expr-print.js +42 -22
  494. package/dist/cli/expr-print.js.map +1 -1
  495. package/dist/cli/flag-help.js.map +1 -1
  496. package/dist/cli/graphs.js.map +1 -1
  497. package/dist/cli/library-defaults.d.ts +19 -0
  498. package/dist/cli/library-defaults.d.ts.map +1 -0
  499. package/dist/cli/library-defaults.js +22 -0
  500. package/dist/cli/library-defaults.js.map +1 -0
  501. package/dist/cli/main.d.ts +7 -0
  502. package/dist/cli/main.d.ts.map +1 -1
  503. package/dist/cli/main.js +25 -6
  504. package/dist/cli/main.js.map +1 -1
  505. package/dist/cli/map-evidence.js.map +1 -1
  506. package/dist/cli/numeric-flag.d.ts +12 -0
  507. package/dist/cli/numeric-flag.d.ts.map +1 -0
  508. package/dist/cli/numeric-flag.js +44 -0
  509. package/dist/cli/numeric-flag.js.map +1 -0
  510. package/dist/cli/output.d.ts +23 -6
  511. package/dist/cli/output.d.ts.map +1 -1
  512. package/dist/cli/output.js +15 -0
  513. package/dist/cli/output.js.map +1 -1
  514. package/dist/cli/published-url.js.map +1 -1
  515. package/dist/cli/record-reach.d.ts +6 -0
  516. package/dist/cli/record-reach.d.ts.map +1 -1
  517. package/dist/cli/record-reach.js +17 -11
  518. package/dist/cli/record-reach.js.map +1 -1
  519. package/dist/cli/record-tables.d.ts.map +1 -1
  520. package/dist/cli/record-tables.js +7 -6
  521. package/dist/cli/record-tables.js.map +1 -1
  522. package/dist/cli/record.d.ts +1 -5
  523. package/dist/cli/record.d.ts.map +1 -1
  524. package/dist/cli/record.js +40 -20
  525. package/dist/cli/record.js.map +1 -1
  526. package/dist/cli/search-index.d.ts +5 -0
  527. package/dist/cli/search-index.d.ts.map +1 -1
  528. package/dist/cli/search-index.js +19 -7
  529. package/dist/cli/search-index.js.map +1 -1
  530. package/dist/cli/statuses.d.ts +0 -2
  531. package/dist/cli/statuses.d.ts.map +1 -1
  532. package/dist/cli/statuses.js +0 -7
  533. package/dist/cli/statuses.js.map +1 -1
  534. package/dist/cli/stored-results.d.ts +7 -0
  535. package/dist/cli/stored-results.d.ts.map +1 -0
  536. package/dist/cli/stored-results.js +23 -0
  537. package/dist/cli/stored-results.js.map +1 -0
  538. package/dist/cli/top-level-help.js.map +1 -1
  539. package/dist/cli/version.d.ts.map +1 -1
  540. package/dist/cli/version.js +7 -5
  541. package/dist/cli/version.js.map +1 -1
  542. package/dist/cli-api.d.ts +49 -14
  543. package/dist/cli-api.d.ts.map +1 -1
  544. package/dist/cli-api.js +42 -17
  545. package/dist/cli-api.js.map +1 -1
  546. package/dist/composition/adjudication.js.map +1 -1
  547. package/dist/composition/algebraic-equivalence.d.ts +43 -0
  548. package/dist/composition/algebraic-equivalence.d.ts.map +1 -0
  549. package/dist/composition/algebraic-equivalence.js +115 -0
  550. package/dist/composition/algebraic-equivalence.js.map +1 -0
  551. package/dist/composition/aliases.js.map +1 -1
  552. package/dist/composition/audit-coverage.d.ts +2 -0
  553. package/dist/composition/audit-coverage.d.ts.map +1 -1
  554. package/dist/composition/audit-coverage.js.map +1 -1
  555. package/dist/composition/axes.d.ts +6 -0
  556. package/dist/composition/axes.d.ts.map +1 -1
  557. package/dist/composition/axes.js +18 -6
  558. package/dist/composition/axes.js.map +1 -1
  559. package/dist/composition/axis-audit.d.ts +47 -20
  560. package/dist/composition/axis-audit.d.ts.map +1 -1
  561. package/dist/composition/axis-audit.js +82 -9
  562. package/dist/composition/axis-audit.js.map +1 -1
  563. package/dist/composition/bridge-analysis.d.ts +14 -15
  564. package/dist/composition/bridge-analysis.d.ts.map +1 -1
  565. package/dist/composition/bridge-analysis.js +148 -91
  566. package/dist/composition/bridge-analysis.js.map +1 -1
  567. package/dist/composition/bridge-prediction.d.ts +5 -1
  568. package/dist/composition/bridge-prediction.d.ts.map +1 -1
  569. package/dist/composition/bridge-prediction.js +12 -16
  570. package/dist/composition/bridge-prediction.js.map +1 -1
  571. package/dist/composition/buckingham-filter.js.map +1 -1
  572. package/dist/composition/canonical-compare.d.ts +40 -0
  573. package/dist/composition/canonical-compare.d.ts.map +1 -1
  574. package/dist/composition/canonical-compare.js +134 -26
  575. package/dist/composition/canonical-compare.js.map +1 -1
  576. package/dist/composition/canonical-graph.d.ts +9 -10
  577. package/dist/composition/canonical-graph.d.ts.map +1 -1
  578. package/dist/composition/canonical-graph.js +33 -102
  579. package/dist/composition/canonical-graph.js.map +1 -1
  580. package/dist/composition/canonical-json.js +2 -2
  581. package/dist/composition/canonical-json.js.map +1 -1
  582. package/dist/composition/canonical-prefactors.js.map +1 -1
  583. package/dist/composition/catalog-graph.d.ts.map +1 -1
  584. package/dist/composition/catalog-graph.js +8 -25
  585. package/dist/composition/catalog-graph.js.map +1 -1
  586. package/dist/composition/chain-candidate.d.ts +10 -0
  587. package/dist/composition/chain-candidate.d.ts.map +1 -1
  588. package/dist/composition/chain-candidate.js +11 -2
  589. package/dist/composition/chain-candidate.js.map +1 -1
  590. package/dist/composition/chain-match.d.ts +6 -3
  591. package/dist/composition/chain-match.d.ts.map +1 -1
  592. package/dist/composition/chain-match.js +4 -1
  593. package/dist/composition/chain-match.js.map +1 -1
  594. package/dist/composition/chain-regime.js.map +1 -1
  595. package/dist/composition/chain-result.d.ts.map +1 -1
  596. package/dist/composition/chain-result.js +2 -14
  597. package/dist/composition/chain-result.js.map +1 -1
  598. package/dist/composition/compose-surface.js.map +1 -1
  599. package/dist/composition/compose-symbolic.d.ts.map +1 -1
  600. package/dist/composition/compose-symbolic.js +3 -2
  601. package/dist/composition/compose-symbolic.js.map +1 -1
  602. package/dist/composition/compose.d.ts.map +1 -1
  603. package/dist/composition/compose.js +166 -41
  604. package/dist/composition/compose.js.map +1 -1
  605. package/dist/composition/composition-recovery.d.ts.map +1 -1
  606. package/dist/composition/composition-recovery.js +4 -7
  607. package/dist/composition/composition-recovery.js.map +1 -1
  608. package/dist/composition/consequence.d.ts.map +1 -1
  609. package/dist/composition/consequence.js +15 -6
  610. package/dist/composition/consequence.js.map +1 -1
  611. package/dist/composition/consistency.js.map +1 -1
  612. package/dist/composition/descriptor.d.ts +1 -1
  613. package/dist/composition/descriptor.d.ts.map +1 -1
  614. package/dist/composition/descriptor.js.map +1 -1
  615. package/dist/composition/dimension-adjacency.js.map +1 -1
  616. package/dist/composition/discovery.d.ts +77 -11
  617. package/dist/composition/discovery.d.ts.map +1 -1
  618. package/dist/composition/discovery.js +194 -80
  619. package/dist/composition/discovery.js.map +1 -1
  620. package/dist/composition/edge.d.ts +40 -10
  621. package/dist/composition/edge.d.ts.map +1 -1
  622. package/dist/composition/edge.js +47 -12
  623. package/dist/composition/edge.js.map +1 -1
  624. package/dist/composition/enumerate.d.ts +2 -2
  625. package/dist/composition/enumerate.d.ts.map +1 -1
  626. package/dist/composition/enumerate.js +18 -3
  627. package/dist/composition/enumerate.js.map +1 -1
  628. package/dist/composition/evaluate-relation.d.ts +35 -11
  629. package/dist/composition/evaluate-relation.d.ts.map +1 -1
  630. package/dist/composition/evaluate-relation.js +60 -39
  631. package/dist/composition/evaluate-relation.js.map +1 -1
  632. package/dist/composition/explain.d.ts +5 -9
  633. package/dist/composition/explain.d.ts.map +1 -1
  634. package/dist/composition/explain.js +38 -18
  635. package/dist/composition/explain.js.map +1 -1
  636. package/dist/composition/expr-eval.d.ts.map +1 -1
  637. package/dist/composition/expr-eval.js +2 -11
  638. package/dist/composition/expr-eval.js.map +1 -1
  639. package/dist/composition/expr-simplify.d.ts +16 -0
  640. package/dist/composition/expr-simplify.d.ts.map +1 -1
  641. package/dist/composition/expr-simplify.js +24 -59
  642. package/dist/composition/expr-simplify.js.map +1 -1
  643. package/dist/composition/expr-subst.js.map +1 -1
  644. package/dist/composition/formula-shape.d.ts +28 -0
  645. package/dist/composition/formula-shape.d.ts.map +1 -1
  646. package/dist/composition/formula-shape.js +96 -2
  647. package/dist/composition/formula-shape.js.map +1 -1
  648. package/dist/composition/frontier-account.d.ts +3 -2
  649. package/dist/composition/frontier-account.d.ts.map +1 -1
  650. package/dist/composition/frontier-account.js +7 -3
  651. package/dist/composition/frontier-account.js.map +1 -1
  652. package/dist/composition/graph-structure.d.ts +98 -0
  653. package/dist/composition/graph-structure.d.ts.map +1 -0
  654. package/dist/composition/graph-structure.js +167 -0
  655. package/dist/composition/graph-structure.js.map +1 -0
  656. package/dist/composition/graph-viz-svg.d.ts.map +1 -1
  657. package/dist/composition/graph-viz-svg.js +1 -1
  658. package/dist/composition/graph-viz-svg.js.map +1 -1
  659. package/dist/composition/graph-viz.d.ts.map +1 -1
  660. package/dist/composition/graph-viz.js +8 -37
  661. package/dist/composition/graph-viz.js.map +1 -1
  662. package/dist/composition/grounding.js.map +1 -1
  663. package/dist/composition/identifiability.d.ts +91 -4
  664. package/dist/composition/identifiability.d.ts.map +1 -1
  665. package/dist/composition/identifiability.js +363 -6
  666. package/dist/composition/identifiability.js.map +1 -1
  667. package/dist/composition/index.d.ts +14 -8
  668. package/dist/composition/index.d.ts.map +1 -1
  669. package/dist/composition/index.js +7 -5
  670. package/dist/composition/index.js.map +1 -1
  671. package/dist/composition/mathts-quiet.d.ts +29 -0
  672. package/dist/composition/mathts-quiet.d.ts.map +1 -0
  673. package/dist/composition/mathts-quiet.js +57 -0
  674. package/dist/composition/mathts-quiet.js.map +1 -0
  675. package/dist/composition/mathts-scalar-symbols.d.ts.map +1 -1
  676. package/dist/composition/mathts-scalar-symbols.js +20 -35
  677. package/dist/composition/mathts-scalar-symbols.js.map +1 -1
  678. package/dist/composition/not-composable-seeds.d.ts +3 -1
  679. package/dist/composition/not-composable-seeds.d.ts.map +1 -1
  680. package/dist/composition/not-composable-seeds.js +2 -0
  681. package/dist/composition/not-composable-seeds.js.map +1 -1
  682. package/dist/composition/probe/backend-protocol.js.map +1 -1
  683. package/dist/composition/probe/candidate-store.js.map +1 -1
  684. package/dist/composition/probe/corpus.d.ts +4 -2
  685. package/dist/composition/probe/corpus.d.ts.map +1 -1
  686. package/dist/composition/probe/corpus.js +20 -9
  687. package/dist/composition/probe/corpus.js.map +1 -1
  688. package/dist/composition/probe/dataset.d.ts +17 -0
  689. package/dist/composition/probe/dataset.d.ts.map +1 -1
  690. package/dist/composition/probe/dataset.js +95 -50
  691. package/dist/composition/probe/dataset.js.map +1 -1
  692. package/dist/composition/probe/experiment-design.d.ts +5 -1
  693. package/dist/composition/probe/experiment-design.d.ts.map +1 -1
  694. package/dist/composition/probe/experiment-design.js +44 -24
  695. package/dist/composition/probe/experiment-design.js.map +1 -1
  696. package/dist/composition/probe/expression-gaps.js.map +1 -1
  697. package/dist/composition/probe/falsify.d.ts +14 -3
  698. package/dist/composition/probe/falsify.d.ts.map +1 -1
  699. package/dist/composition/probe/falsify.js +16 -27
  700. package/dist/composition/probe/falsify.js.map +1 -1
  701. package/dist/composition/probe/fingerprint.js.map +1 -1
  702. package/dist/composition/probe/fit.d.ts +7 -1
  703. package/dist/composition/probe/fit.d.ts.map +1 -1
  704. package/dist/composition/probe/fit.js +48 -23
  705. package/dist/composition/probe/fit.js.map +1 -1
  706. package/dist/composition/probe/frontier.d.ts.map +1 -1
  707. package/dist/composition/probe/frontier.js +33 -15
  708. package/dist/composition/probe/frontier.js.map +1 -1
  709. package/dist/composition/probe/generator.d.ts +27 -1
  710. package/dist/composition/probe/generator.d.ts.map +1 -1
  711. package/dist/composition/probe/generator.js +53 -30
  712. package/dist/composition/probe/generator.js.map +1 -1
  713. package/dist/composition/probe/index.d.ts +18 -2
  714. package/dist/composition/probe/index.d.ts.map +1 -1
  715. package/dist/composition/probe/index.js +10 -2
  716. package/dist/composition/probe/index.js.map +1 -1
  717. package/dist/composition/probe/limits.d.ts +24 -1
  718. package/dist/composition/probe/limits.d.ts.map +1 -1
  719. package/dist/composition/probe/limits.js +53 -11
  720. package/dist/composition/probe/limits.js.map +1 -1
  721. package/dist/composition/probe/metadata.js.map +1 -1
  722. package/dist/composition/probe/pipeline.d.ts +5 -0
  723. package/dist/composition/probe/pipeline.d.ts.map +1 -1
  724. package/dist/composition/probe/pipeline.js +22 -9
  725. package/dist/composition/probe/pipeline.js.map +1 -1
  726. package/dist/composition/probe/power-law.d.ts +121 -0
  727. package/dist/composition/probe/power-law.d.ts.map +1 -0
  728. package/dist/composition/probe/power-law.js +255 -0
  729. package/dist/composition/probe/power-law.js.map +1 -0
  730. package/dist/composition/probe/problem.d.ts +12 -1
  731. package/dist/composition/probe/problem.d.ts.map +1 -1
  732. package/dist/composition/probe/problem.js +242 -48
  733. package/dist/composition/probe/problem.js.map +1 -1
  734. package/dist/composition/probe/report.js +1 -1
  735. package/dist/composition/probe/report.js.map +1 -1
  736. package/dist/composition/probe/residual.d.ts +6 -1
  737. package/dist/composition/probe/residual.d.ts.map +1 -1
  738. package/dist/composition/probe/residual.js +9 -7
  739. package/dist/composition/probe/residual.js.map +1 -1
  740. package/dist/composition/probe/run-manifest.js +2 -2
  741. package/dist/composition/probe/run-manifest.js.map +1 -1
  742. package/dist/composition/probe/scoring.d.ts +2 -1
  743. package/dist/composition/probe/scoring.d.ts.map +1 -1
  744. package/dist/composition/probe/scoring.js +21 -7
  745. package/dist/composition/probe/scoring.js.map +1 -1
  746. package/dist/composition/probe/search-budget.js.map +1 -1
  747. package/dist/composition/probe/serialize.js.map +1 -1
  748. package/dist/composition/probe/structure.d.ts +82 -17
  749. package/dist/composition/probe/structure.d.ts.map +1 -1
  750. package/dist/composition/probe/structure.js +129 -55
  751. package/dist/composition/probe/structure.js.map +1 -1
  752. package/dist/composition/probe/study.d.ts +35 -12
  753. package/dist/composition/probe/study.d.ts.map +1 -1
  754. package/dist/composition/probe/study.js +241 -184
  755. package/dist/composition/probe/study.js.map +1 -1
  756. package/dist/composition/probe/t-tail.d.ts +17 -0
  757. package/dist/composition/probe/t-tail.d.ts.map +1 -0
  758. package/dist/composition/probe/t-tail.js +32 -0
  759. package/dist/composition/probe/t-tail.js.map +1 -0
  760. package/dist/composition/probe/types.d.ts +6 -1
  761. package/dist/composition/probe/types.d.ts.map +1 -1
  762. package/dist/composition/probe/types.js +2 -0
  763. package/dist/composition/probe/types.js.map +1 -1
  764. package/dist/composition/proposed-bridges.d.ts +51 -13
  765. package/dist/composition/proposed-bridges.d.ts.map +1 -1
  766. package/dist/composition/proposed-bridges.js +110 -58
  767. package/dist/composition/proposed-bridges.js.map +1 -1
  768. package/dist/composition/quantities.d.ts +0 -4
  769. package/dist/composition/quantities.d.ts.map +1 -1
  770. package/dist/composition/quantities.js +5 -5
  771. package/dist/composition/quantities.js.map +1 -1
  772. package/dist/composition/quantity-clusters.d.ts +48 -0
  773. package/dist/composition/quantity-clusters.d.ts.map +1 -0
  774. package/dist/composition/quantity-clusters.js +98 -0
  775. package/dist/composition/quantity-clusters.js.map +1 -0
  776. package/dist/composition/quantity.d.ts +18 -2
  777. package/dist/composition/quantity.d.ts.map +1 -1
  778. package/dist/composition/quantity.js +35 -6
  779. package/dist/composition/quantity.js.map +1 -1
  780. package/dist/composition/rational-exponent.d.ts +40 -0
  781. package/dist/composition/rational-exponent.d.ts.map +1 -0
  782. package/dist/composition/rational-exponent.js +65 -0
  783. package/dist/composition/rational-exponent.js.map +1 -0
  784. package/dist/composition/representative-values.d.ts +22 -0
  785. package/dist/composition/representative-values.d.ts.map +1 -1
  786. package/dist/composition/representative-values.js +23 -0
  787. package/dist/composition/representative-values.js.map +1 -1
  788. package/dist/composition/retrodiction.d.ts +16 -6
  789. package/dist/composition/retrodiction.d.ts.map +1 -1
  790. package/dist/composition/retrodiction.js +36 -10
  791. package/dist/composition/retrodiction.js.map +1 -1
  792. package/dist/composition/uncertainty.js.map +1 -1
  793. package/dist/composition/user-equation.d.ts.map +1 -1
  794. package/dist/composition/user-equation.js +2 -2
  795. package/dist/composition/user-equation.js.map +1 -1
  796. package/dist/core/assignment.d.ts +19 -0
  797. package/dist/core/assignment.d.ts.map +1 -0
  798. package/dist/core/assignment.js +19 -0
  799. package/dist/core/assignment.js.map +1 -0
  800. package/dist/core/axes-registry.d.ts +8 -5
  801. package/dist/core/axes-registry.d.ts.map +1 -1
  802. package/dist/core/axes-registry.js.map +1 -1
  803. package/dist/core/cell.js.map +1 -1
  804. package/dist/core/compare.d.ts +32 -0
  805. package/dist/core/compare.d.ts.map +1 -0
  806. package/dist/core/compare.js +46 -0
  807. package/dist/core/compare.js.map +1 -0
  808. package/dist/core/constants.d.ts +35 -35
  809. package/dist/core/constants.d.ts.map +1 -1
  810. package/dist/core/constants.js +52 -37
  811. package/dist/core/constants.js.map +1 -1
  812. package/dist/core/data-file.d.ts +7 -0
  813. package/dist/core/data-file.d.ts.map +1 -1
  814. package/dist/core/data-file.js +17 -0
  815. package/dist/core/data-file.js.map +1 -1
  816. package/dist/core/flux-rules.js +1 -1
  817. package/dist/core/flux-rules.js.map +1 -1
  818. package/dist/core/format.d.ts +36 -0
  819. package/dist/core/format.d.ts.map +1 -0
  820. package/dist/core/format.js +39 -0
  821. package/dist/core/format.js.map +1 -0
  822. package/dist/core/hash.d.ts +14 -0
  823. package/dist/core/hash.d.ts.map +1 -0
  824. package/dist/core/hash.js +17 -0
  825. package/dist/core/hash.js.map +1 -0
  826. package/dist/core/json-schema.d.ts +3 -1
  827. package/dist/core/json-schema.d.ts.map +1 -1
  828. package/dist/core/json-schema.js +41 -16
  829. package/dist/core/json-schema.js.map +1 -1
  830. package/dist/core/labeled-tensor.d.ts +6 -1
  831. package/dist/core/labeled-tensor.d.ts.map +1 -1
  832. package/dist/core/labeled-tensor.js +18 -16
  833. package/dist/core/labeled-tensor.js.map +1 -1
  834. package/dist/core/mathts-read.d.ts +25 -0
  835. package/dist/core/mathts-read.d.ts.map +1 -0
  836. package/dist/core/mathts-read.js +51 -0
  837. package/dist/core/mathts-read.js.map +1 -0
  838. package/dist/core/regime-registry.d.ts +6 -2
  839. package/dist/core/regime-registry.d.ts.map +1 -1
  840. package/dist/core/regime-registry.js.map +1 -1
  841. package/dist/core/regime-rule-install.js.map +1 -1
  842. package/dist/core/regimes-builtins.js.map +1 -1
  843. package/dist/core/tensor.d.ts +7 -4
  844. package/dist/core/tensor.d.ts.map +1 -1
  845. package/dist/core/tensor.js +64 -8
  846. package/dist/core/tensor.js.map +1 -1
  847. package/dist/core/types.d.ts +5 -5
  848. package/dist/core/types.js.map +1 -1
  849. package/dist/core/universal-index.js.map +1 -1
  850. package/dist/diff/bridge-ast-gradient.d.ts +4 -5
  851. package/dist/diff/bridge-ast-gradient.d.ts.map +1 -1
  852. package/dist/diff/bridge-ast-gradient.js +10 -6
  853. package/dist/diff/bridge-ast-gradient.js.map +1 -1
  854. package/dist/diff/bridge-gradient.d.ts +43 -86
  855. package/dist/diff/bridge-gradient.d.ts.map +1 -1
  856. package/dist/diff/bridge-gradient.js +40 -109
  857. package/dist/diff/bridge-gradient.js.map +1 -1
  858. package/dist/diff/bridge-specs.d.ts +16 -5
  859. package/dist/diff/bridge-specs.d.ts.map +1 -1
  860. package/dist/diff/bridge-specs.js +19 -4
  861. package/dist/diff/bridge-specs.js.map +1 -1
  862. package/dist/dimensional/algebra.d.ts +18 -0
  863. package/dist/dimensional/algebra.d.ts.map +1 -1
  864. package/dist/dimensional/algebra.js +41 -1
  865. package/dist/dimensional/algebra.js.map +1 -1
  866. package/dist/dimensional/ast-builders.d.ts +12 -4
  867. package/dist/dimensional/ast-builders.d.ts.map +1 -1
  868. package/dist/dimensional/ast-builders.js +17 -5
  869. package/dist/dimensional/ast-builders.js.map +1 -1
  870. package/dist/dimensional/ast-leaves.d.ts +81 -0
  871. package/dist/dimensional/ast-leaves.d.ts.map +1 -0
  872. package/dist/dimensional/ast-leaves.js +146 -0
  873. package/dist/dimensional/ast-leaves.js.map +1 -0
  874. package/dist/dimensional/ast-types.js.map +1 -1
  875. package/dist/dimensional/bridge-check.js.map +1 -1
  876. package/dist/dimensional/buckingham.d.ts.map +1 -1
  877. package/dist/dimensional/buckingham.js +15 -27
  878. package/dist/dimensional/buckingham.js.map +1 -1
  879. package/dist/dimensional/connection-validators.d.ts +2 -1
  880. package/dist/dimensional/connection-validators.d.ts.map +1 -1
  881. package/dist/dimensional/connection-validators.js.map +1 -1
  882. package/dist/dimensional/connection.js.map +1 -1
  883. package/dist/dimensional/constant-rows.d.ts.map +1 -1
  884. package/dist/dimensional/constant-rows.js +17 -13
  885. package/dist/dimensional/constant-rows.js.map +1 -1
  886. package/dist/dimensional/constants.d.ts +5 -6
  887. package/dist/dimensional/constants.d.ts.map +1 -1
  888. package/dist/dimensional/constants.js +5 -6
  889. package/dist/dimensional/constants.js.map +1 -1
  890. package/dist/dimensional/curvature-composite.js.map +1 -1
  891. package/dist/dimensional/curvature-invariants.js.map +1 -1
  892. package/dist/dimensional/curvature.js.map +1 -1
  893. package/dist/dimensional/dimension-inference.d.ts.map +1 -1
  894. package/dist/dimensional/dimension-inference.js +1 -2
  895. package/dist/dimensional/dimension-inference.js.map +1 -1
  896. package/dist/dimensional/dimension-spec.d.ts +13 -7
  897. package/dist/dimensional/dimension-spec.d.ts.map +1 -1
  898. package/dist/dimensional/dimension-spec.js +49 -23
  899. package/dist/dimensional/dimension-spec.js.map +1 -1
  900. package/dist/dimensional/einstein-equation.js.map +1 -1
  901. package/dist/dimensional/errors.d.ts +4 -2
  902. package/dist/dimensional/errors.d.ts.map +1 -1
  903. package/dist/dimensional/errors.js +3 -17
  904. package/dist/dimensional/errors.js.map +1 -1
  905. package/dist/dimensional/exact-scale.d.ts +0 -17
  906. package/dist/dimensional/exact-scale.d.ts.map +1 -1
  907. package/dist/dimensional/exact-scale.js +8 -8
  908. package/dist/dimensional/exact-scale.js.map +1 -1
  909. package/dist/dimensional/field-equation-helpers.js.map +1 -1
  910. package/dist/dimensional/formula-names.js.map +1 -1
  911. package/dist/dimensional/fresh-label.js.map +1 -1
  912. package/dist/dimensional/friedmann-equation.d.ts +3 -3
  913. package/dist/dimensional/friedmann-equation.js +3 -3
  914. package/dist/dimensional/friedmann-equation.js.map +1 -1
  915. package/dist/dimensional/gauge-field.d.ts +2 -3
  916. package/dist/dimensional/gauge-field.d.ts.map +1 -1
  917. package/dist/dimensional/gauge-field.js +2 -3
  918. package/dist/dimensional/gauge-field.js.map +1 -1
  919. package/dist/dimensional/hyphen-names.d.ts +12 -2
  920. package/dist/dimensional/hyphen-names.d.ts.map +1 -1
  921. package/dist/dimensional/hyphen-names.js +45 -12
  922. package/dist/dimensional/hyphen-names.js.map +1 -1
  923. package/dist/dimensional/killing-validators.js.map +1 -1
  924. package/dist/dimensional/klein-gordon-equation.js.map +1 -1
  925. package/dist/dimensional/metric-validators.d.ts +2 -1
  926. package/dist/dimensional/metric-validators.d.ts.map +1 -1
  927. package/dist/dimensional/metric-validators.js.map +1 -1
  928. package/dist/dimensional/metric.d.ts.map +1 -1
  929. package/dist/dimensional/metric.js +0 -1
  930. package/dist/dimensional/metric.js.map +1 -1
  931. package/dist/dimensional/natural-units.js.map +1 -1
  932. package/dist/dimensional/quantity-registry.d.ts +13 -0
  933. package/dist/dimensional/quantity-registry.d.ts.map +1 -1
  934. package/dist/dimensional/quantity-registry.js +14 -6
  935. package/dist/dimensional/quantity-registry.js.map +1 -1
  936. package/dist/dimensional/rg-flow.js.map +1 -1
  937. package/dist/dimensional/stress-energy-validators.js.map +1 -1
  938. package/dist/dimensional/symbolic-constants.d.ts +9 -0
  939. package/dist/dimensional/symbolic-constants.d.ts.map +1 -1
  940. package/dist/dimensional/symbolic-constants.js +20 -3
  941. package/dist/dimensional/symbolic-constants.js.map +1 -1
  942. package/dist/dimensional/tensor-trace.js.map +1 -1
  943. package/dist/dimensional/tensor.js.map +1 -1
  944. package/dist/dimensional/types.d.ts +36 -0
  945. package/dist/dimensional/types.d.ts.map +1 -1
  946. package/dist/dimensional/types.js +45 -7
  947. package/dist/dimensional/types.js.map +1 -1
  948. package/dist/dimensional/unit-convention.d.ts +0 -2
  949. package/dist/dimensional/unit-convention.d.ts.map +1 -1
  950. package/dist/dimensional/unit-convention.js +2 -2
  951. package/dist/dimensional/unit-convention.js.map +1 -1
  952. package/dist/dimensional/unit-data.d.ts.map +1 -1
  953. package/dist/dimensional/unit-data.js +11 -7
  954. package/dist/dimensional/unit-data.js.map +1 -1
  955. package/dist/dimensional/units.d.ts.map +1 -1
  956. package/dist/dimensional/units.js +38 -20
  957. package/dist/dimensional/units.js.map +1 -1
  958. package/dist/dimensional/validator-registry.js.map +1 -1
  959. package/dist/dimensional/validator.d.ts +0 -16
  960. package/dist/dimensional/validator.d.ts.map +1 -1
  961. package/dist/dimensional/validator.js +65 -29
  962. package/dist/dimensional/validator.js.map +1 -1
  963. package/dist/dimensional/weyl-validators.js.map +1 -1
  964. package/dist/index.d.ts +59 -8
  965. package/dist/index.d.ts.map +1 -1
  966. package/dist/index.js +22 -24
  967. package/dist/index.js.map +1 -1
  968. package/dist/numerical/bianchi-residual.js.map +1 -1
  969. package/dist/numerical/binding-value.d.ts +11 -6
  970. package/dist/numerical/binding-value.d.ts.map +1 -1
  971. package/dist/numerical/binding-value.js +126 -122
  972. package/dist/numerical/binding-value.js.map +1 -1
  973. package/dist/numerical/christoffel-flat.d.ts.map +1 -1
  974. package/dist/numerical/christoffel-flat.js +3 -2
  975. package/dist/numerical/christoffel-flat.js.map +1 -1
  976. package/dist/numerical/connection-lowering-helpers.js.map +1 -1
  977. package/dist/numerical/covariant-eikonal.d.ts.map +1 -1
  978. package/dist/numerical/covariant-eikonal.js +36 -13
  979. package/dist/numerical/covariant-eikonal.js.map +1 -1
  980. package/dist/numerical/curvature-lowering-helpers.d.ts +20 -0
  981. package/dist/numerical/curvature-lowering-helpers.d.ts.map +1 -1
  982. package/dist/numerical/curvature-lowering-helpers.js +9 -5
  983. package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
  984. package/dist/numerical/derivative-lowering.js.map +1 -1
  985. package/dist/numerical/einstein-equation.js.map +1 -1
  986. package/dist/numerical/engine-registry.js.map +1 -1
  987. package/dist/numerical/errors.d.ts +7 -3
  988. package/dist/numerical/errors.d.ts.map +1 -1
  989. package/dist/numerical/errors.js +5 -8
  990. package/dist/numerical/errors.js.map +1 -1
  991. package/dist/numerical/evaluator-uncertainty.d.ts.map +1 -1
  992. package/dist/numerical/evaluator-uncertainty.js +19 -2
  993. package/dist/numerical/evaluator-uncertainty.js.map +1 -1
  994. package/dist/numerical/finite-difference.d.ts +22 -0
  995. package/dist/numerical/finite-difference.d.ts.map +1 -0
  996. package/dist/numerical/finite-difference.js +27 -0
  997. package/dist/numerical/finite-difference.js.map +1 -0
  998. package/dist/numerical/formula-contract.d.ts +63 -7
  999. package/dist/numerical/formula-contract.d.ts.map +1 -1
  1000. package/dist/numerical/formula-contract.js +61 -42
  1001. package/dist/numerical/formula-contract.js.map +1 -1
  1002. package/dist/numerical/formula-dimension.d.ts +8 -7
  1003. package/dist/numerical/formula-dimension.d.ts.map +1 -1
  1004. package/dist/numerical/formula-dimension.js +58 -36
  1005. package/dist/numerical/formula-dimension.js.map +1 -1
  1006. package/dist/numerical/formula-mathts.d.ts.map +1 -1
  1007. package/dist/numerical/formula-mathts.js +5 -2
  1008. package/dist/numerical/formula-mathts.js.map +1 -1
  1009. package/dist/numerical/formula-registry.d.ts +13 -3
  1010. package/dist/numerical/formula-registry.d.ts.map +1 -1
  1011. package/dist/numerical/formula-registry.js +7 -2
  1012. package/dist/numerical/formula-registry.js.map +1 -1
  1013. package/dist/numerical/geodesic-integrator.d.ts.map +1 -1
  1014. package/dist/numerical/geodesic-integrator.js +22 -14
  1015. package/dist/numerical/geodesic-integrator.js.map +1 -1
  1016. package/dist/numerical/geometrized.d.ts.map +1 -1
  1017. package/dist/numerical/geometrized.js +0 -1
  1018. package/dist/numerical/geometrized.js.map +1 -1
  1019. package/dist/numerical/gl4-integrator.d.ts +28 -27
  1020. package/dist/numerical/gl4-integrator.d.ts.map +1 -1
  1021. package/dist/numerical/gl4-integrator.js +41 -42
  1022. package/dist/numerical/gl4-integrator.js.map +1 -1
  1023. package/dist/numerical/grid-field.js.map +1 -1
  1024. package/dist/numerical/index.js.map +1 -1
  1025. package/dist/numerical/input-validation.d.ts +3 -6
  1026. package/dist/numerical/input-validation.d.ts.map +1 -1
  1027. package/dist/numerical/input-validation.js +4 -8
  1028. package/dist/numerical/input-validation.js.map +1 -1
  1029. package/dist/numerical/killing.d.ts +8 -5
  1030. package/dist/numerical/killing.d.ts.map +1 -1
  1031. package/dist/numerical/killing.js.map +1 -1
  1032. package/dist/numerical/klein-gordon.js.map +1 -1
  1033. package/dist/numerical/kretschmann.js.map +1 -1
  1034. package/dist/numerical/lowering-utils.js.map +1 -1
  1035. package/dist/numerical/lowering.d.ts.map +1 -1
  1036. package/dist/numerical/lowering.js +7 -17
  1037. package/dist/numerical/lowering.js.map +1 -1
  1038. package/dist/numerical/mathts-engine.d.ts.map +1 -1
  1039. package/dist/numerical/mathts-engine.js +16 -25
  1040. package/dist/numerical/mathts-engine.js.map +1 -1
  1041. package/dist/numerical/metric-inverse.d.ts.map +1 -1
  1042. package/dist/numerical/metric-inverse.js +83 -46
  1043. package/dist/numerical/metric-inverse.js.map +1 -1
  1044. package/dist/numerical/null-ic.js.map +1 -1
  1045. package/dist/numerical/null-ray-integrator.d.ts +2 -1
  1046. package/dist/numerical/null-ray-integrator.d.ts.map +1 -1
  1047. package/dist/numerical/null-ray-integrator.js +12 -12
  1048. package/dist/numerical/null-ray-integrator.js.map +1 -1
  1049. package/dist/numerical/painleve-gullstrand-metric.js +2 -2
  1050. package/dist/numerical/painleve-gullstrand-metric.js.map +1 -1
  1051. package/dist/numerical/pderiv.d.ts.map +1 -1
  1052. package/dist/numerical/pderiv.js +9 -2
  1053. package/dist/numerical/pderiv.js.map +1 -1
  1054. package/dist/numerical/perihelion-finder.d.ts +0 -36
  1055. package/dist/numerical/perihelion-finder.d.ts.map +1 -1
  1056. package/dist/numerical/perihelion-finder.js +41 -87
  1057. package/dist/numerical/perihelion-finder.js.map +1 -1
  1058. package/dist/numerical/quadrature.d.ts +5 -2
  1059. package/dist/numerical/quadrature.d.ts.map +1 -1
  1060. package/dist/numerical/quadrature.js +19 -4
  1061. package/dist/numerical/quadrature.js.map +1 -1
  1062. package/dist/numerical/rk4-trajectory.d.ts +10 -0
  1063. package/dist/numerical/rk4-trajectory.d.ts.map +1 -0
  1064. package/dist/numerical/rk4-trajectory.js +37 -0
  1065. package/dist/numerical/rk4-trajectory.js.map +1 -0
  1066. package/dist/numerical/schwarzschild.d.ts +14 -0
  1067. package/dist/numerical/schwarzschild.d.ts.map +1 -0
  1068. package/dist/numerical/schwarzschild.js +17 -0
  1069. package/dist/numerical/schwarzschild.js.map +1 -0
  1070. package/dist/numerical/spacetime-metrics.d.ts +25 -19
  1071. package/dist/numerical/spacetime-metrics.d.ts.map +1 -1
  1072. package/dist/numerical/spacetime-metrics.js +180 -286
  1073. package/dist/numerical/spacetime-metrics.js.map +1 -1
  1074. package/dist/numerical/statistics.d.ts +24 -0
  1075. package/dist/numerical/statistics.d.ts.map +1 -0
  1076. package/dist/numerical/statistics.js +52 -0
  1077. package/dist/numerical/statistics.js.map +1 -0
  1078. package/dist/numerical/strides.js.map +1 -1
  1079. package/dist/numerical/tensor-engine.d.ts +30 -5
  1080. package/dist/numerical/tensor-engine.d.ts.map +1 -1
  1081. package/dist/numerical/tensor-engine.js +12 -0
  1082. package/dist/numerical/tensor-engine.js.map +1 -1
  1083. package/dist/numerical/types.js.map +1 -1
  1084. package/dist/numerical/weyl-lowering.js.map +1 -1
  1085. package/dist/relations/category.js.map +1 -1
  1086. package/dist/relations/composition-table.d.ts +4 -4
  1087. package/dist/relations/composition-table.js +4 -4
  1088. package/dist/relations/composition-table.js.map +1 -1
  1089. package/dist/relations/conventions.js.map +1 -1
  1090. package/dist/relations/domain-regimes.js.map +1 -1
  1091. package/dist/relations/regime-registration.js.map +1 -1
  1092. package/dist/relations/regime-vocabularies.js.map +1 -1
  1093. package/dist/relations/regime.d.ts +28 -8
  1094. package/dist/relations/regime.d.ts.map +1 -1
  1095. package/dist/relations/regime.js +44 -15
  1096. package/dist/relations/regime.js.map +1 -1
  1097. package/dist/relations/types.d.ts +18 -5
  1098. package/dist/relations/types.d.ts.map +1 -1
  1099. package/dist/relations/types.js +5 -3
  1100. package/dist/relations/types.js.map +1 -1
  1101. package/package.json +16 -20
  1102. package/dist/bridges/registry.d.ts +0 -60
  1103. package/dist/bridges/registry.d.ts.map +0 -1
  1104. package/dist/bridges/registry.js +0 -87
  1105. package/dist/bridges/registry.js.map +0 -1
  1106. package/dist/cli/poster-source.d.ts +0 -154
  1107. package/dist/cli/poster-source.d.ts.map +0 -1
  1108. package/dist/cli/poster-source.js +0 -184
  1109. package/dist/cli/poster-source.js.map +0 -1
@@ -26,6 +26,11 @@
26
26
  *
27
27
  * @internal
28
28
  */
29
+ import { pairwiseDot, pairwiseSum } from '@danielsimonjr/mathts-core';
30
+ import { betainc, gammainc, gammaincp, inv, propagateUncertainty } from '@danielsimonjr/mathts-functions';
31
+ import { numberFrom } from '../../core/mathts-read.js';
32
+ import { readJsonFile } from '../../core/data-file.js';
33
+ import { isPlainObject } from '../../core/json-schema.js';
29
34
  import { readFileSync } from 'node:fs';
30
35
  import { DIMENSIONLESS } from '../../dimensional/types.js';
31
36
  import { equals, format } from '../../dimensional/algebra.js';
@@ -47,7 +52,8 @@ export class StudyRefusal extends Error {
47
52
  this.name = 'StudyRefusal';
48
53
  }
49
54
  }
50
- const DEFAULT_ALPHA = 0.001;
55
+ /** The χ² test level a study file states none of. @internal */
56
+ export const DEFAULT_ALPHA = 0.001;
51
57
  const TOP_KEYS = new Set([
52
58
  'description', 'gap', 'provenance', 'target', 'governing', 'observations', 'baselines', 'criterion', 'design',
53
59
  'correction',
@@ -55,18 +61,16 @@ const TOP_KEYS = new Set([
55
61
  const ROW_KEYS = new Set(['id', 'role', 'source', 'values', 'observed', 'sigma', 'inputSigma', 'note']);
56
62
  /** The keys a separate replication file may carry; the rest belong in the study file. */
57
63
  const REPLICATION_KEYS = new Set(['description', 'provenance', 'target', 'governing', 'observations']);
58
- const MAX_CORRECTION_TERMS = 6;
64
+ /** How many powers a study file's correction may list in all. @internal */
65
+ export const MAX_CORRECTION_TERMS = 6;
59
66
  function refuse(where, why) {
60
67
  throw new StudyRefusal(`study refused (${where}): ${why}`);
61
68
  }
62
- function isObject(v) {
63
- return !!v && typeof v === 'object' && !Array.isArray(v);
64
- }
65
69
  function nonEmptyString(v) {
66
70
  return typeof v === 'string' && v.trim().length > 0;
67
71
  }
68
72
  function quantity(raw, where) {
69
- if (!isObject(raw) || !nonEmptyString(raw.name) || typeof raw.unit !== 'string') {
73
+ if (!isPlainObject(raw) || !nonEmptyString(raw.name) || typeof raw.unit !== 'string') {
70
74
  refuse(where, 'needs {"name", "unit"} ("unit": "" for a dimensionless quantity)');
71
75
  }
72
76
  let parsed;
@@ -109,11 +113,11 @@ function governingQuantity(raw, where) {
109
113
  return sigma === undefined ? q : { ...q, sigma: positiveSigma(sigma, q, `${where}.sigma`) };
110
114
  }
111
115
  function parseFamily(raw, governing, where) {
112
- if (!isObject(raw) || !nonEmptyString(raw.input) || !Array.isArray(raw.powers)) {
116
+ if (!isPlainObject(raw) || !nonEmptyString(raw.input) || !Array.isArray(raw.powers)) {
113
117
  refuse(where, 'needs {"input": <dimensionless governing input>, "powers": [p, ...]}');
114
118
  }
115
119
  for (const k of Object.keys(raw)) {
116
- if (k !== 'input' && k !== 'powers')
120
+ if (k !== 'input' && k !== 'powers' && k !== 'reference')
117
121
  refuse(where, `undeclared key '${k}'`);
118
122
  }
119
123
  const q = governing.find((g) => g.name === raw.input);
@@ -131,7 +135,19 @@ function parseFamily(raw, governing, where) {
131
135
  }
132
136
  if (new Set(powers).size !== powers.length)
133
137
  refuse(`${where}.powers`, 'must be distinct');
134
- return { input: q.name, powers };
138
+ if (raw.reference === undefined)
139
+ return { input: q.name, powers };
140
+ if (!isPlainObject(raw.reference))
141
+ refuse(`${where}.reference`, 'must be {"<power>": number}, keyed by a declared power');
142
+ const reference = {};
143
+ for (const [k, v] of Object.entries(raw.reference)) {
144
+ if (!powers.some((p) => String(p) === k))
145
+ refuse(`${where}.reference`, `'${k}' is not a declared power of this family`);
146
+ if (typeof v !== 'number' || !Number.isFinite(v))
147
+ refuse(`${where}.reference`, `'${k}' must be a finite number`);
148
+ reference[k] = v;
149
+ }
150
+ return { input: q.name, powers, reference };
135
151
  }
136
152
  /** One family `{input, powers}`, or a list of them, each in a different dimensionless input. */
137
153
  function parseCorrection(raw, governing) {
@@ -157,7 +173,7 @@ function parseCorrection(raw, governing) {
157
173
  /** Provenance text compared without case, spacing or punctuation: "Lab A" and "lab-a" are one source. */
158
174
  const provenanceKey = (s) => s.toLowerCase().replace(/[^\p{L}\p{N}]+/gu, ' ').trim();
159
175
  function parseProvenance(raw) {
160
- if (!isObject(raw))
176
+ if (!isPlainObject(raw))
161
177
  refuse('provenance', 'is required: {"synthetic": true|false, "source": "..."}');
162
178
  if (typeof raw.synthetic !== 'boolean') {
163
179
  refuse('provenance.synthetic', 'must be declared true or false; it is never inferred');
@@ -180,7 +196,7 @@ function parseBaselines(raw, target, governing) {
180
196
  const checker = builtinFormulaDimensionChecker();
181
197
  return raw.map((b, i) => {
182
198
  const where = `baselines[${i}]`;
183
- if (!isObject(b) || !nonEmptyString(b.name) || !nonEmptyString(b.formula)) {
199
+ if (!isPlainObject(b) || !nonEmptyString(b.name) || !nonEmptyString(b.formula)) {
184
200
  refuse(where, 'needs {"name", "formula"}');
185
201
  }
186
202
  let vars;
@@ -208,7 +224,7 @@ function parseBaselines(raw, target, governing) {
208
224
  function parseDesign(raw, governing) {
209
225
  if (raw === undefined)
210
226
  return undefined;
211
- if (!isObject(raw) || !isObject(raw.variables))
227
+ if (!isPlainObject(raw) || !isPlainObject(raw.variables))
212
228
  refuse('design', 'needs {"variables": {name: {"min", "max"}}}');
213
229
  const byName = new Map(governing.map((g) => [g.name, g]));
214
230
  const out = {};
@@ -217,7 +233,7 @@ function parseDesign(raw, governing) {
217
233
  const where = `design.variables.${name}`;
218
234
  if (!q)
219
235
  refuse(where, 'is not a declared governing input');
220
- if (!isObject(spec))
236
+ if (!isPlainObject(spec))
221
237
  refuse(where, 'needs {"min", "max"}');
222
238
  const min = toSi(spec.min, q, `${where}.min`, 'absolute');
223
239
  const max = toSi(spec.max, q, `${where}.max`, 'absolute');
@@ -235,9 +251,9 @@ function parseObservations(raw, provenance, target, governing, defaultSigma) {
235
251
  refuse('observations', 'must be a non-empty array');
236
252
  const ids = new Set();
237
253
  const rows = raw.map((row, i) => {
238
- const id = isObject(row) && nonEmptyString(row.id) ? row.id : `row-${i + 1}`;
254
+ const id = isPlainObject(row) && nonEmptyString(row.id) ? row.id : `row-${i + 1}`;
239
255
  const where = `observation ${id}`;
240
- if (!isObject(row))
256
+ if (!isPlainObject(row))
241
257
  refuse(where, 'is not an object');
242
258
  for (const k of Object.keys(row)) {
243
259
  if (!ROW_KEYS.has(k))
@@ -249,7 +265,7 @@ function parseObservations(raw, provenance, target, governing, defaultSigma) {
249
265
  if (row.role !== 'exploratory' && row.role !== 'holdout' && row.role !== 'replication') {
250
266
  refuse(where, `role must be exploratory, holdout or replication (got '${String(row.role)}')`);
251
267
  }
252
- if (!isObject(row.values))
268
+ if (!isPlainObject(row.values))
253
269
  refuse(where, 'needs "values": {input: value}');
254
270
  for (const k of Object.keys(row.values)) {
255
271
  if (!governing.some((g) => g.name === k))
@@ -269,7 +285,7 @@ function parseObservations(raw, provenance, target, governing, defaultSigma) {
269
285
  refuse(where, 'has no uncertainty: give "sigma" on the row or on the target');
270
286
  }
271
287
  const sigma = positiveSigma(sigmaRaw, target, `${where} sigma`);
272
- if (row.inputSigma !== undefined && !isObject(row.inputSigma))
288
+ if (row.inputSigma !== undefined && !isPlainObject(row.inputSigma))
273
289
  refuse(where, '"inputSigma" must be {input: σ}');
274
290
  const rowInputSigma = (row.inputSigma ?? {});
275
291
  for (const k of Object.keys(rowInputSigma)) {
@@ -327,7 +343,7 @@ function guardLeakage(rows) {
327
343
  }
328
344
  /** Parse and validate a study file. Throws {@link StudyRefusal}. @internal */
329
345
  export function parseStudy(raw, source = 'inline') {
330
- if (!isObject(raw))
346
+ if (!isPlainObject(raw))
331
347
  refuse(source, 'is not a JSON object');
332
348
  for (const k of Object.keys(raw)) {
333
349
  if (!TOP_KEYS.has(k))
@@ -342,7 +358,7 @@ export function parseStudy(raw, source = 'inline') {
342
358
  const names = [target.name, ...governing.map((g) => g.name)];
343
359
  if (new Set(names).size !== names.length)
344
360
  refuse('governing', 'names must be distinct from each other and from the target');
345
- const gapRaw = isObject(raw.gap) ? raw.gap : {};
361
+ const gapRaw = isPlainObject(raw.gap) ? raw.gap : {};
346
362
  const gap = {
347
363
  id: nonEmptyString(gapRaw.id) ? gapRaw.id : 'fg-study',
348
364
  kind: nonEmptyString(gapRaw.kind) ? gapRaw.kind : 'unexplained-observation',
@@ -352,7 +368,7 @@ export function parseStudy(raw, source = 'inline') {
352
368
  refuse('gap.kind', `unknown gap kind '${gap.kind}'`);
353
369
  let alpha = DEFAULT_ALPHA;
354
370
  if (raw.criterion !== undefined) {
355
- if (!isObject(raw.criterion) || typeof raw.criterion.alpha !== 'number') {
371
+ if (!isPlainObject(raw.criterion) || typeof raw.criterion.alpha !== 'number') {
356
372
  refuse('criterion', 'needs {"alpha": number}');
357
373
  }
358
374
  alpha = raw.criterion.alpha;
@@ -379,18 +395,12 @@ export function parseStudy(raw, source = 'inline') {
379
395
  }
380
396
  /** Load a study JSON file. @internal */
381
397
  export function loadStudyFromJson(path) {
382
- return parseStudy(JSON.parse(readFileSync(path, 'utf8')), path);
398
+ return parseStudy(readJsonFile(path), path);
383
399
  }
384
400
  function readStudyRaw(path) {
385
- const text = readFileSync(path, 'utf8');
386
401
  if (/\.csv$/i.test(path))
387
- return studyCsvToRaw(text, path);
388
- try {
389
- return JSON.parse(text);
390
- }
391
- catch (e) {
392
- throw e instanceof SyntaxError ? new SyntaxError(`${path}: ${e.message}`) : e;
393
- }
402
+ return studyCsvToRaw(readFileSync(path, 'utf8'), path);
403
+ return readJsonFile(path);
394
404
  }
395
405
  /**
396
406
  * Load a study file (`.csv`, else JSON) and, optionally, a separate
@@ -412,7 +422,7 @@ const sameDim = (a, b) => a.name === b.name && equals(a.dim, b.dim);
412
422
  * @internal
413
423
  */
414
424
  export function attachReplication(study, raw, source) {
415
- if (!isObject(raw))
425
+ if (!isPlainObject(raw))
416
426
  refuse(source, 'is not a JSON object');
417
427
  for (const k of Object.keys(raw)) {
418
428
  if (!REPLICATION_KEYS.has(k)) {
@@ -469,23 +479,31 @@ function closeness(chi2, dof, alpha) {
469
479
  const pLower = chiSquareCdf(chi2, dof);
470
480
  return { chi2, dof, pLower, flagged: pLower < alpha / 2 };
471
481
  }
472
- /** Weighted straight line y = a + b·x with the effective variance σ_y² + b²σ_x², iterated from b = 1. */
482
+ /**
483
+ * Weighted straight line y = a + b·x with the effective variance σ_y² + b²σ_x², iterated from b = 1.
484
+ * The weighted sums are core `pairwiseDot` and `pairwiseSum` (the stable sums), not a `reduce`.
485
+ */
473
486
  function affineFit(pts) {
474
487
  let b = 1;
475
488
  let a = 0;
489
+ const xs = pts.map((p) => p.x);
490
+ const ys = pts.map((p) => p.y);
491
+ const variance = (slope) => pts.map((p) => p.sy ** 2 + slope * slope * p.sx ** 2);
476
492
  for (let it = 0; it < 6; it++) {
477
- const w = pts.map((p) => 1 / (p.sy ** 2 + b * b * p.sx ** 2));
478
- const W = w.reduce((s, v) => s + v, 0);
479
- const xm = pts.reduce((s, p, i) => s + w[i] * p.x, 0) / W;
480
- const ym = pts.reduce((s, p, i) => s + w[i] * p.y, 0) / W;
481
- const sxx = pts.reduce((s, p, i) => s + w[i] * (p.x - xm) ** 2, 0);
482
- const sxy = pts.reduce((s, p, i) => s + w[i] * (p.x - xm) * (p.y - ym), 0);
493
+ const w = variance(b).map((v) => 1 / v);
494
+ const W = pairwiseSum(w);
495
+ const xm = pairwiseDot(w, xs) / W;
496
+ const ym = pairwiseDot(w, ys) / W;
497
+ const dx = xs.map((x) => x - xm);
498
+ const sxx = pairwiseDot(w, dx.map((d) => d * d));
499
+ const sxy = pairwiseDot(w, dx.map((d, i) => d * (ys[i] - ym)));
483
500
  if (!(sxx > 0) || !Number.isFinite(sxy))
484
501
  return null;
485
502
  b = sxy / sxx;
486
503
  a = ym - b * xm;
487
504
  }
488
- const chi2 = pts.reduce((s, p) => s + (p.y - a - b * p.x) ** 2 / (p.sy ** 2 + b * b * p.sx ** 2), 0);
505
+ const v = variance(b);
506
+ const chi2 = pairwiseSum(pts.map((p, i) => (p.y - a - b * p.x) ** 2 / v[i]));
489
507
  return Number.isFinite(chi2) ? { a, b, chi2 } : null;
490
508
  }
491
509
  /**
@@ -594,7 +612,7 @@ function setPath(obj, path, value, where) {
594
612
  for (const k of path.slice(0, -1)) {
595
613
  if (at[k] === undefined)
596
614
  at[k] = {};
597
- if (!isObject(at[k]))
615
+ if (!isPlainObject(at[k]))
598
616
  refuse(where, `'${k}' is already set to a value`);
599
617
  at = at[k];
600
618
  }
@@ -630,7 +648,9 @@ export function studyCsvToRaw(text, source = 'inline.csv') {
630
648
  const m = /^\s*#\s*([A-Za-z_][\w.()-]*)\s*:\s?(.*)$/.exec(l);
631
649
  if (!m)
632
650
  refuse(where, "a declaration is '# key: value'");
633
- const [, key, valueText] = m;
651
+ // Both groups are unconditional in the pattern, so a match carries them.
652
+ const key = m[1];
653
+ const valueText = m[2];
634
654
  const value = declValue(valueText.trim());
635
655
  const path = key.split('.');
636
656
  if (key === 'target') {
@@ -700,13 +720,13 @@ export function studyCsvToRaw(text, source = 'inline.csv') {
700
720
  if (!governing.some((g) => g.name === k))
701
721
  refuse(`${source} governing.${k}.sigma`, `'${k}' is not a governing input column`);
702
722
  }
703
- if (isObject(raw.target)) {
723
+ if (isPlainObject(raw.target)) {
704
724
  for (const k of Object.keys(raw.target)) {
705
725
  if (k !== 'sigma')
706
726
  refuse(`${source} target.${k}`, "the target's name and unit come from its column; only 'target.sigma' is declared");
707
727
  }
708
728
  }
709
- raw.target = { name: targetCol.name, unit: targetCol.unit, ...(isObject(raw.target) ? raw.target : {}) };
729
+ raw.target = { name: targetCol.name, unit: targetCol.unit, ...(isPlainObject(raw.target) ? raw.target : {}) };
710
730
  raw.governing = governing.map((g) => ({
711
731
  name: g.name,
712
732
  unit: g.unit,
@@ -742,64 +762,23 @@ export function studyCsvToRaw(text, source = 'inline.csv') {
742
762
  });
743
763
  return raw;
744
764
  }
745
- // --- χ² survival function -------------------------------------------------
746
- const LANCZOS = [
747
- 0.99999999999980993, 676.5203681218851, -1259.1392167224028, 771.32342877765313, -176.61502916214059,
748
- 12.507343278686905, -0.13857109526572012, 9.9843695780195716e-6, 1.5056327351493116e-7,
749
- ];
750
- function lnGamma(z) {
751
- if (z < 0.5)
752
- return Math.log(Math.PI / Math.sin(Math.PI * z)) - lnGamma(1 - z);
753
- const zz = z - 1;
754
- let x = LANCZOS[0];
755
- for (let i = 1; i < LANCZOS.length; i++)
756
- x += LANCZOS[i] / (zz + i);
757
- const t = zz + 7.5;
758
- return 0.5 * Math.log(2 * Math.PI) + (zz + 0.5) * Math.log(t) - t + Math.log(x);
759
- }
760
- /** The series for the regularized lower incomplete gamma P(a, x); converges fast for x < a + 1. */
761
- function gammaSeries(a, x) {
762
- const front = Math.exp(-x + a * Math.log(x) - lnGamma(a));
763
- let ap = a;
764
- let del = 1 / a;
765
- let sum = del;
766
- for (let n = 0; n < 1000; n++) {
767
- ap += 1;
768
- del *= x / ap;
769
- sum += del;
770
- if (Math.abs(del) < Math.abs(sum) * 1e-16)
771
- break;
772
- }
773
- return sum * front;
765
+ // --- χ² and F survival functions ------------------------------------------
766
+ //
767
+ // MathTS carries the regularized lower incomplete gamma `gammainc` (the
768
+ // series for x < a + 1, else 1 − Q by continued fraction), the upper one
769
+ // `gammaincp` (from `@danielsimonjr/mathts-functions` 0.68.3 the modified
770
+ // Lentz continued fraction for x ≥ a + 1, computed directly; before that it
771
+ // was `1 − gammainc`, which rounded a far upper tail to 0, and the χ² p-value
772
+ // of a bad fit IS that tail) and the regularized incomplete beta `betainc`.
773
+ /** Regularized lower incomplete gamma P(a, x), MathTS `gammainc`. */
774
+ function gammaP(a, x) {
775
+ return numberFrom('gammainc', gammainc(a, x));
774
776
  }
775
- /** Regularized upper incomplete gamma Q(a, x). */
777
+ /** Regularized upper incomplete gamma Q(a, x), MathTS `gammaincp` (direct in the upper tail). */
776
778
  function gammaQ(a, x) {
777
779
  if (x <= 0)
778
780
  return 1;
779
- if (x < a + 1)
780
- return Math.max(0, 1 - gammaSeries(a, x));
781
- const front = Math.exp(-x + a * Math.log(x) - lnGamma(a));
782
- const tiny = 1e-300;
783
- let b = x + 1 - a;
784
- let c = 1 / tiny;
785
- let d = 1 / b;
786
- let h = d;
787
- for (let i = 1; i < 1000; i++) {
788
- const an = -i * (i - a);
789
- b += 2;
790
- d = an * d + b;
791
- if (Math.abs(d) < tiny)
792
- d = tiny;
793
- c = b + an / c;
794
- if (Math.abs(c) < tiny)
795
- c = tiny;
796
- d = 1 / d;
797
- const del = d * c;
798
- h *= del;
799
- if (Math.abs(del - 1) < 1e-16)
800
- break;
801
- }
802
- return front * h;
781
+ return numberFrom('gammaincp', gammaincp(a, x));
803
782
  }
804
783
  /** P(χ²_ν ≥ chi2): the probability of a χ² at least this large if the model and σ are right. @internal */
805
784
  export function chiSquareSurvival(chi2, dof) {
@@ -810,8 +789,8 @@ export function chiSquareSurvival(chi2, dof) {
810
789
  return gammaQ(dof / 2, chi2 / 2);
811
790
  }
812
791
  /**
813
- * P(χ²_ν ≤ chi2), computed directly in the lower tail, where 1 − Q would
814
- * round a small probability away. @internal
792
+ * P(χ²_ν ≤ chi2), computed directly in the lower tail (MathTS `gammainc` is
793
+ * the series there), where 1 − Q would round a small probability away. @internal
815
794
  */
816
795
  export function chiSquareCdf(chi2, dof) {
817
796
  if (!(dof > 0))
@@ -820,51 +799,15 @@ export function chiSquareCdf(chi2, dof) {
820
799
  return 0;
821
800
  const a = dof / 2;
822
801
  const x = chi2 / 2;
823
- return x < a + 1 ? Math.min(1, gammaSeries(a, x)) : 1 - gammaQ(a, x);
824
- }
825
- /** Continued fraction for the incomplete beta function (modified Lentz). */
826
- function betaCf(a, b, x) {
827
- const tiny = 1e-300;
828
- let c = 1;
829
- let d = 1 - ((a + b) * x) / (a + 1);
830
- if (Math.abs(d) < tiny)
831
- d = tiny;
832
- d = 1 / d;
833
- let h = d;
834
- for (let m = 1; m < 1000; m++) {
835
- const m2 = 2 * m;
836
- let aa = (m * (b - m) * x) / ((a + m2 - 1) * (a + m2));
837
- d = 1 + aa * d;
838
- if (Math.abs(d) < tiny)
839
- d = tiny;
840
- c = 1 + aa / c;
841
- if (Math.abs(c) < tiny)
842
- c = tiny;
843
- d = 1 / d;
844
- h *= d * c;
845
- aa = (-(a + m) * (a + b + m) * x) / ((a + m2) * (a + m2 + 1));
846
- d = 1 + aa * d;
847
- if (Math.abs(d) < tiny)
848
- d = tiny;
849
- c = 1 + aa / c;
850
- if (Math.abs(c) < tiny)
851
- c = tiny;
852
- d = 1 / d;
853
- const del = d * c;
854
- h *= del;
855
- if (Math.abs(del - 1) < 1e-16)
856
- break;
857
- }
858
- return h;
802
+ return x < a + 1 ? Math.min(1, gammaP(a, x)) : 1 - gammaQ(a, x);
859
803
  }
860
- /** Regularized incomplete beta I_x(a, b). */
804
+ /** Regularized incomplete beta I_x(a, b), MathTS `betainc`. */
861
805
  function betaI(a, b, x) {
862
806
  if (x <= 0)
863
807
  return 0;
864
808
  if (x >= 1)
865
809
  return 1;
866
- const front = Math.exp(lnGamma(a + b) - lnGamma(a) - lnGamma(b) + a * Math.log(x) + b * Math.log(1 - x));
867
- return x < (a + 1) / (a + b + 2) ? (front * betaCf(a, b, x)) / a : 1 - (front * betaCf(b, a, 1 - x)) / b;
810
+ return numberFrom('betainc', betainc(a, b, x));
868
811
  }
869
812
  /** P(F_{d1,d2} ≥ f): the probability of an F ratio at least this large if the extra terms explain nothing. @internal */
870
813
  export function fSurvival(f, d1, d2) {
@@ -878,22 +821,58 @@ export function fSurvival(f, d1, d2) {
878
821
  }
879
822
  /**
880
823
  * The effective σ of one row under a model f: σ_eff² = σ_y² + Σ_i (∂f/∂x_i · σ_xi)²
881
- * over the inputs with a σ, each derivative by a central difference at the
882
- * recorded inputs. First order in σ_x: exact for f linear in x_i.
824
+ * over the inputs with a σ, the GUM first-order propagation of MathTS
825
+ * `propagateUncertainty` (the one uncertainty path of the library, as in
826
+ * `composition/uncertainty.ts`), each partial a central difference with the
827
+ * relative step 1e-6·|x_i| at the recorded inputs. An input that is exactly
828
+ * zero has no relative step, so it is passed to MathTS shifted by
829
+ * c = 1e3·σ_xi and read back as z − c inside the model: the derivative is
830
+ * unchanged and the step is 1e-6·c = 1e-3·σ_xi, the floor the hand-coded
831
+ * difference used before. First order in σ_x: exact for f linear in x_i.
883
832
  *
884
833
  * @internal
885
834
  */
886
835
  export function effectiveSigma(r, predict) {
887
- let v = r.sigma * r.sigma;
888
- for (const [name, sx] of Object.entries(r.inputSigma)) {
889
- const x = r.inputs[name];
890
- const h = Math.max(Math.abs(x) * 1e-6, sx * 1e-3);
891
- const d = (predict({ ...r.inputs, [name]: x + h }) - predict({ ...r.inputs, [name]: x - h })) / (2 * h);
892
- if (!Number.isFinite(d))
893
- throw new RangeError(`the model's slope in ${name} is not finite on row ${r.id}`);
894
- v += (d * sx) ** 2;
895
- }
896
- return Math.sqrt(v);
836
+ const names = Object.keys(r.inputSigma);
837
+ if (names.length === 0)
838
+ return r.sigma;
839
+ const values = {};
840
+ const shift = {};
841
+ for (const name of names) {
842
+ const x = r.inputs[name] ?? NaN;
843
+ shift[name] = x === 0 ? 1e3 * r.inputSigma[name] : 0;
844
+ values[name] = x + shift[name];
845
+ }
846
+ const unshifted = (v) => {
847
+ const inputs = { ...r.inputs };
848
+ for (const name of names)
849
+ inputs[name] = v[name] - shift[name];
850
+ return inputs;
851
+ };
852
+ const notFinite = (name) => new RangeError(`the model's slope in ${name} is not finite on row ${r.id}`);
853
+ // MathTS varies one input at a time; the input being varied when the model is not finite is
854
+ // the one to name, read from the stencil point itself rather than from MathTS's message.
855
+ let culprit = null;
856
+ const model = (v) => {
857
+ const y = predict(unshifted(v));
858
+ if (!Number.isFinite(y) && culprit === null)
859
+ culprit = names.find((name) => v[name] !== values[name]) ?? names[0];
860
+ return y;
861
+ };
862
+ let u;
863
+ try {
864
+ u = propagateUncertainty(model, values, r.inputSigma, { relativeStep: 1e-6 });
865
+ }
866
+ catch (e) {
867
+ if (culprit !== null)
868
+ throw notFinite(culprit);
869
+ throw e;
870
+ }
871
+ for (const name of names) {
872
+ if (!Number.isFinite(u.partials[name]))
873
+ throw notFinite(name);
874
+ }
875
+ return Math.hypot(r.sigma, u.sigma);
897
876
  }
898
877
  const hasInputSigma = (rows) => rows.some((r) => Object.keys(r.inputSigma).length > 0);
899
878
  function testRows(rows, predict, fitted, alpha) {
@@ -915,7 +894,42 @@ function testRows(rows, predict, fitted, alpha) {
915
894
  return { n: rows.length, chi2, dof, p, maxAbsZ, worstRow, pass: p === null ? null : p >= alpha };
916
895
  }
917
896
  const combine = (basis, coef) => (x) => basis.reduce((s, b, j) => s + coef[j] * b(x), 0);
918
- /** Solve the weighted normal equations for y ≈ Σ a_j·φ_j; null when they are singular. */
897
+ /**
898
+ * The inverse of the equilibrated normal matrix B (k×k, unit diagonal), MathTS `inv`,
899
+ * unscaled back to the covariance of the coefficients: Σ = S⁻¹ B⁻¹ S⁻¹. Null when
900
+ * MathTS refuses the inverse or returns something other than a k×k number matrix.
901
+ */
902
+ function covarianceOf(B, s) {
903
+ let raw;
904
+ try {
905
+ raw = inv(B.map((row) => [...row]));
906
+ }
907
+ catch {
908
+ return null;
909
+ }
910
+ const k = s.length;
911
+ if (!Array.isArray(raw) || raw.length !== k)
912
+ return null;
913
+ const out = [];
914
+ for (let a = 0; a < k; a++) {
915
+ const row = raw[a];
916
+ if (!Array.isArray(row) || row.length !== k)
917
+ return null;
918
+ const unscaled = [];
919
+ for (let b = 0; b < k; b++) {
920
+ const v = row[b];
921
+ if (typeof v !== 'number' || !Number.isFinite(v))
922
+ return null;
923
+ unscaled.push(v / (s[a] * s[b]));
924
+ }
925
+ out.push(unscaled);
926
+ }
927
+ return out;
928
+ }
929
+ /**
930
+ * Solve the weighted normal equations for y ≈ Σ a_j·φ_j; null when they are singular.
931
+ * The covariance of the solution is the inverse of the same (equilibrated) matrix.
932
+ */
919
933
  function solveWeighted(phi, y, sigma) {
920
934
  const k = phi[0]?.length ?? 0;
921
935
  const A = Array.from({ length: k }, () => new Array(k + 1).fill(0));
@@ -927,8 +941,10 @@ function solveWeighted(phi, y, sigma) {
927
941
  A[a][k] += w * f[a] * y[i];
928
942
  }
929
943
  });
930
- if (k === 1)
931
- return A[0][0] > 0 ? [A[0][1] / A[0][0]] : null;
944
+ if (k === 1) {
945
+ const a00 = A[0][0];
946
+ return a00 > 0 ? { coef: [A[0][1] / a00], covariance: [[1 / a00]] } : null;
947
+ }
932
948
  // Equilibrate so the pivot test is scale-free, then eliminate with partial pivoting.
933
949
  const s = A.map((row, a) => Math.sqrt(row[a]));
934
950
  if (!s.every((v) => v > 0))
@@ -938,6 +954,7 @@ function solveWeighted(phi, y, sigma) {
938
954
  A[a][b] /= s[a] * s[b];
939
955
  A[a][k] /= s[a];
940
956
  }
957
+ const covariance = covarianceOf(A.map((row) => row.slice(0, k)), s);
941
958
  for (let c = 0; c < k; c++) {
942
959
  let p = c;
943
960
  for (let r = c + 1; r < k; r++)
@@ -954,13 +971,14 @@ function solveWeighted(phi, y, sigma) {
954
971
  A[r][q] -= m * A[c][q];
955
972
  }
956
973
  }
957
- return A.map((row, a) => row[k] / row[a] / s[a]);
974
+ return { coef: A.map((row, a) => row[k] / row[a] / s[a]), covariance };
958
975
  }
959
976
  const EV_ROUNDS = 50;
960
977
  /**
961
978
  * Weighted least squares y ≈ Σ a_j·φ_j(x), from the exploratory rows only.
962
979
  * With input σ the weights are 1/σ_eff² of the current fit, iterated to a
963
- * fixed point (the effective-variance method).
980
+ * fixed point (the effective-variance method); the covariance is that of the
981
+ * last solve, with the fixed-point weights.
964
982
  */
965
983
  function fitLinear(rows, basis) {
966
984
  const phi = rows.map((r) => basis.map((b) => {
@@ -970,20 +988,21 @@ function fitLinear(rows, basis) {
970
988
  return f;
971
989
  }));
972
990
  const y = rows.map((r) => r.observed);
973
- let coef = solveWeighted(phi, y, rows.map((r) => r.sigma));
991
+ let sol = solveWeighted(phi, y, rows.map((r) => r.sigma));
974
992
  if (!hasInputSigma(rows))
975
- return coef;
976
- for (let round = 0; coef !== null && round < EV_ROUNDS; round++) {
993
+ return sol;
994
+ for (let round = 0; sol !== null && round < EV_ROUNDS; round++) {
995
+ const coef = sol.coef;
977
996
  const predict = combine(basis, coef);
978
997
  const next = solveWeighted(phi, y, rows.map((r) => effectiveSigma(r, predict)));
979
998
  if (next === null)
980
999
  return null;
981
- const settled = next.every((a, j) => Math.abs(a - coef[j]) <= 1e-13 * Math.max(Math.abs(a), 1e-300));
982
- coef = next;
1000
+ const settled = next.coef.every((a, j) => Math.abs(a - coef[j]) <= 1e-13 * Math.max(Math.abs(a), 1e-300));
1001
+ sol = next;
983
1002
  if (settled)
984
1003
  break;
985
1004
  }
986
- return coef;
1005
+ return sol;
987
1006
  }
988
1007
  function split(study) {
989
1008
  return {
@@ -1000,19 +1019,22 @@ function scoreModel(spec, sets, alpha, withheld) {
1000
1019
  const { id, kind, label } = spec;
1001
1020
  const k = spec.fit ? spec.basis.length : 0;
1002
1021
  const failed = (error) => ({
1003
- test: { id, kind, label, fittedParameters: k, prefactor: null, exploratory: null, holdout: null, replication: null, error },
1022
+ test: { id, kind, label, fittedParameters: k, prefactor: null, prefactorStderr: null, exploratory: null, holdout: null, replication: null, error },
1004
1023
  predict: null,
1005
1024
  coef: null,
1025
+ covariance: null,
1006
1026
  });
1007
1027
  try {
1008
- const coef = spec.fit ? fitLinear(sets.exploratory, spec.basis) : [1];
1009
- if (coef === null) {
1028
+ const sol = spec.fit ? fitLinear(sets.exploratory, spec.basis) : { coef: [1], covariance: null };
1029
+ if (sol === null) {
1010
1030
  return failed(k === 1
1011
1031
  ? 'model is zero on every exploratory row; no scale can be fit'
1012
1032
  : 'the model\'s terms are degenerate on the exploratory rows; they cannot be fit');
1013
1033
  }
1034
+ const { coef, covariance } = sol;
1014
1035
  const predict = combine(spec.basis, coef);
1015
1036
  const on = (rows) => (withheld && rows.length > 0 ? testRows(rows, predict, 0, alpha) : null);
1037
+ const v00 = covariance?.[0]?.[0];
1016
1038
  return {
1017
1039
  test: {
1018
1040
  id,
@@ -1020,12 +1042,14 @@ function scoreModel(spec, sets, alpha, withheld) {
1020
1042
  label,
1021
1043
  fittedParameters: k,
1022
1044
  prefactor: coef[0],
1045
+ prefactorStderr: v00 !== undefined && v00 >= 0 ? Math.sqrt(v00) : null,
1023
1046
  exploratory: sets.exploratory.length > 0 ? testRows(sets.exploratory, predict, k, alpha) : null,
1024
1047
  holdout: on(sets.holdout),
1025
1048
  replication: on(sets.replication),
1026
1049
  },
1027
1050
  predict,
1028
1051
  coef,
1052
+ covariance,
1029
1053
  };
1030
1054
  }
1031
1055
  catch (e) {
@@ -1048,8 +1072,8 @@ function correctionBasis(shape, terms) {
1048
1072
  function admitCorrection(shape, families, rows, alpha) {
1049
1073
  const chi2With = (terms) => {
1050
1074
  const basis = correctionBasis(shape, terms);
1051
- const coef = fitLinear(rows, basis);
1052
- return coef === null ? null : testRows(rows, combine(basis, coef), terms.length + 1, alpha).chi2;
1075
+ const sol = fitLinear(rows, basis);
1076
+ return sol === null ? null : testRows(rows, combine(basis, sol.coef), terms.length + 1, alpha).chi2;
1053
1077
  };
1054
1078
  const steps = [];
1055
1079
  const admitted = [];
@@ -1058,23 +1082,25 @@ function admitCorrection(shape, families, rows, alpha) {
1058
1082
  for (const power of family.powers) {
1059
1083
  if (prev === null)
1060
1084
  break families;
1061
- const term = { input: family.input, power };
1085
+ const reference = family.reference?.[String(power)];
1086
+ const term = { input: family.input, power, ...(reference !== undefined ? { reference } : {}) };
1062
1087
  const trial = [...admitted, term];
1063
1088
  const dof = rows.length - (trial.length + 1);
1064
1089
  if (dof < 1) {
1065
- steps.push({ ...term, F: null, dof, p: null, admitted: false, reason: 'ν < 1: too few exploratory rows to test another term' });
1090
+ steps.push({ input: term.input, power: term.power, F: null, dof, p: null, admitted: false, reason: 'ν < 1: too few exploratory rows to test another term' });
1066
1091
  break families;
1067
1092
  }
1068
1093
  const cur = chi2With(trial);
1069
1094
  if (cur === null) {
1070
- steps.push({ ...term, F: null, dof, p: null, admitted: false, reason: 'degenerate with the terms before it on the exploratory rows' });
1095
+ steps.push({ input: term.input, power: term.power, F: null, dof, p: null, admitted: false, reason: 'degenerate with the terms before it on the exploratory rows' });
1071
1096
  break;
1072
1097
  }
1073
1098
  const F = cur > 0 ? Math.max(0, prev - cur) / (cur / dof) : Infinity;
1074
1099
  const p = fSurvival(F, 1, dof);
1075
1100
  const ok = p < alpha;
1076
1101
  steps.push({
1077
- ...term,
1102
+ input: term.input,
1103
+ power: term.power,
1078
1104
  F,
1079
1105
  dof,
1080
1106
  p,
@@ -1090,7 +1116,7 @@ function admitCorrection(shape, families, rows, alpha) {
1090
1116
  return { terms: admitted, steps };
1091
1117
  }
1092
1118
  /** Infix rendering of a scalar ExprNode for reports. */
1093
- export function exprToInfix(e) {
1119
+ function exprToInfix(e) {
1094
1120
  if (e.kind === 'symbol')
1095
1121
  return e.name;
1096
1122
  if (e.kind === 'op') {
@@ -1125,9 +1151,10 @@ function credibility(t, nullTest, alpha) {
1125
1151
  function designAgainst(study, sets, candidate, baselines) {
1126
1152
  if (!candidate.predict)
1127
1153
  return { abstained: true, reason: 'no credible candidate to discriminate' };
1128
- const live = baselines
1129
- .filter((b) => b.predict && b.test.exploratory?.pass === true)
1130
- .sort((a, b) => (b.test.exploratory.p ?? 0) - (a.test.exploratory.p ?? 0));
1154
+ const predict = candidate.predict;
1155
+ // A live competitor has a predictor and passed on the exploratory rows; the guard types both.
1156
+ const isLive = (b) => b.predict !== null && b.test.exploratory?.pass === true;
1157
+ const live = baselines.filter(isLive).sort((a, b) => (b.test.exploratory.p ?? 0) - (a.test.exploratory.p ?? 0));
1131
1158
  const best = live[0];
1132
1159
  if (!best) {
1133
1160
  return {
@@ -1156,7 +1183,7 @@ function designAgainst(study, sets, candidate, baselines) {
1156
1183
  study.governing.forEach((g, i) => (point[g.name] = grids[i][idx[i]]));
1157
1184
  let disc;
1158
1185
  try {
1159
- disc = Math.abs(candidate.predict(point) - best.predict(point)) / sigma;
1186
+ disc = Math.abs(predict(point) - best.predict(point)) / sigma;
1160
1187
  }
1161
1188
  catch {
1162
1189
  return;
@@ -1176,7 +1203,8 @@ function designAgainst(study, sets, candidate, baselines) {
1176
1203
  if (bestPoint === null)
1177
1204
  return { abstained: true, reason: 'neither model is finite anywhere in the design bounds' };
1178
1205
  const chosen = bestPoint;
1179
- const maxEx = Math.max(...sets.exploratory.map((r) => Math.abs(candidate.predict(r.inputs) - best.predict(r.inputs)) / r.sigma));
1206
+ // A reduce, not a spread: a spread of a large row set overflows the call stack.
1207
+ const maxEx = sets.exploratory.reduce((m, r) => Math.max(m, Math.abs(predict(r.inputs) - best.predict(r.inputs)) / r.sigma), 0);
1180
1208
  return {
1181
1209
  abstained: false,
1182
1210
  against: best.test.label,
@@ -1250,17 +1278,39 @@ export async function runProbeStudy(study, opts = {}) {
1250
1278
  },
1251
1279
  ];
1252
1280
  });
1253
- const correctionOf = (s, coef) => 'correction' in s && s.correction && coef
1254
- ? {
1281
+ const correctionOf = (s, coef, covariance) => {
1282
+ if (!('correction' in s) || !s.correction || !coef)
1283
+ return {};
1284
+ const a0 = coef[0];
1285
+ return {
1255
1286
  correction: {
1256
1287
  base: s.correction.base,
1257
- terms: s.correction.terms.map((t, j) => ({ input: t.input, power: t.power, coefficient: coef[j + 1] / coef[0] })),
1288
+ terms: s.correction.terms.map((t, j) => {
1289
+ const a = coef[j + 1];
1290
+ const coefficient = a / a0;
1291
+ // Delta method on c = a/a₀: Var(c) = Var(a)/a₀² + a²Var(a₀)/a₀⁴ − 2a·Cov(a, a₀)/a₀³.
1292
+ const cov = covariance;
1293
+ const variance = cov
1294
+ ? cov[j + 1][j + 1] / a0 ** 2 + (a * a * cov[0][0]) / a0 ** 4 - (2 * a * cov[j + 1][0]) / a0 ** 3
1295
+ : null;
1296
+ const stderr = variance !== null && Number.isFinite(variance) ? Math.sqrt(Math.max(0, variance)) : null;
1297
+ const reference = t.reference;
1298
+ const z = reference !== undefined && stderr !== null && stderr > 0 ? (coefficient - reference) / stderr : undefined;
1299
+ return {
1300
+ input: t.input,
1301
+ power: t.power,
1302
+ coefficient,
1303
+ stderr,
1304
+ ...(reference !== undefined ? { reference } : {}),
1305
+ ...(z !== undefined ? { z } : {}),
1306
+ };
1307
+ }),
1258
1308
  },
1259
- }
1260
- : {};
1309
+ };
1310
+ };
1261
1311
  const scored = specs.map((s) => {
1262
1312
  const m = scoreModel(s.spec, sets, alpha, false);
1263
- return { model: m, spec: s.spec, complexity: s.complexity, extra: correctionOf(s, m.coef), ...credibility(m.test, nullModel, alpha) };
1313
+ return { model: m, spec: s.spec, complexity: s.complexity, extra: correctionOf(s, m.coef, m.covariance), ...credibility(m.test, nullModel, alpha) };
1264
1314
  });
1265
1315
  const credibleOnes = scored
1266
1316
  .filter((s) => s.credible)
@@ -1460,11 +1510,18 @@ export function formatProbeStudy(r) {
1460
1510
  }
1461
1511
  L.push(` null model (constant ${r.target.name}) — ${setLine('exploratory', r.nullModel.exploratory)}`);
1462
1512
  L.push('');
1513
+ const pm = (stderr) => (stderr === null ? '' : ` ± ${stderr.toPrecision(2)}`);
1463
1514
  for (const c of r.candidates) {
1464
- const pre = c.prefactor === null ? '' : `, ĉ = ${c.prefactor.toPrecision(5)} (SI)`;
1515
+ const pre = c.prefactor === null ? '' : `, ĉ = ${c.prefactor.toPrecision(5)}${pm(c.prefactorStderr)} (SI)`;
1465
1516
  L.push(` candidate ${c.id}: ${c.label}${pre}`);
1466
1517
  if (c.correction) {
1467
- L.push(` ${c.correction.terms.map((t, j) => `c${sub(j + 1)} = ${t.coefficient.toPrecision(4)}`).join(', ')} (fit on exploratory rows)`);
1518
+ const term = (t, j) => {
1519
+ const against = t.z !== undefined && t.reference !== undefined
1520
+ ? ` (z = ${t.z >= 0 ? '+' : ''}${t.z.toFixed(1)} against the declared ${Number(t.reference.toPrecision(4))})`
1521
+ : '';
1522
+ return `c${sub(j + 1)} = ${t.coefficient.toPrecision(4)}${pm(t.stderr)}${against}`;
1523
+ };
1524
+ L.push(` ${c.correction.terms.map(term).join(', ')} (fit on exploratory rows)`);
1468
1525
  }
1469
1526
  L.push(` ${setLine('exploratory', c.exploratory)}`);
1470
1527
  L.push(` ${c.credible ? 'credible' : 'not credible'}: ${c.credibility}`);
@@ -1479,7 +1536,7 @@ export function formatProbeStudy(r) {
1479
1536
  L.push('');
1480
1537
  L.push(' baselines (declared by the file; same rows, same criterion):');
1481
1538
  for (const b of r.baselines) {
1482
- const how = b.fittedParameters === 0 ? 'fixed, no fitted parameter' : `prefactor fit on exploratory rows = ${b.prefactor?.toPrecision(5)}`;
1539
+ const how = b.fittedParameters === 0 ? 'fixed, no fitted parameter' : `prefactor fit on exploratory rows = ${b.prefactor?.toPrecision(5)}${pm(b.prefactorStderr)}`;
1483
1540
  L.push(` ${b.label} [${how}]`);
1484
1541
  if (b.error) {
1485
1542
  L.push(` not evaluable: ${b.error}`);