universal-physics-tensor 10.0.0 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (835) hide show
  1. package/README.md +39 -36
  2. package/bin/upt.mjs +13 -1
  3. package/data/applied-cases.json +1892 -0
  4. package/data/applied-cases.schema.json +194 -0
  5. package/data/atlas/atlas.json +25 -25
  6. package/data/atlas/atlas.jsonld +1 -1
  7. package/data/atlas/diffusion.json +6 -6
  8. package/data/atlas/oscillators.json +7 -7
  9. package/data/atlas/waves.json +14 -14
  10. package/data/atlas/witness-results.json +11 -11
  11. package/data/bridge-catalog.json +389 -230
  12. package/data/bridge-catalog.schema.json +45 -7
  13. package/data/units.json +6 -25
  14. package/dist/atlas/applicability.d.ts.map +1 -1
  15. package/dist/atlas/applicability.js +21 -15
  16. package/dist/atlas/applicability.js.map +1 -1
  17. package/dist/atlas/benchmark/hybrid-retrieval.d.ts +9 -1
  18. package/dist/atlas/benchmark/hybrid-retrieval.d.ts.map +1 -1
  19. package/dist/atlas/benchmark/hybrid-retrieval.js +15 -13
  20. package/dist/atlas/benchmark/hybrid-retrieval.js.map +1 -1
  21. package/dist/atlas/benchmark/loader.js +2 -2
  22. package/dist/atlas/benchmark/loader.js.map +1 -1
  23. package/dist/atlas/benchmark/stats.d.ts +2 -2
  24. package/dist/atlas/benchmark/stats.d.ts.map +1 -1
  25. package/dist/atlas/benchmark/stats.js +9 -15
  26. package/dist/atlas/benchmark/stats.js.map +1 -1
  27. package/dist/atlas/catalog-formal-ref.d.ts +26 -3
  28. package/dist/atlas/catalog-formal-ref.d.ts.map +1 -1
  29. package/dist/atlas/catalog-formal-ref.js +52 -5
  30. package/dist/atlas/catalog-formal-ref.js.map +1 -1
  31. package/dist/atlas/chain-pipeline.d.ts.map +1 -1
  32. package/dist/atlas/chain-pipeline.js +7 -8
  33. package/dist/atlas/chain-pipeline.js.map +1 -1
  34. package/dist/atlas/diffusion/bridges-closure.d.ts +0 -4
  35. package/dist/atlas/diffusion/bridges-closure.d.ts.map +1 -1
  36. package/dist/atlas/diffusion/bridges-closure.js +8 -12
  37. package/dist/atlas/diffusion/bridges-closure.js.map +1 -1
  38. package/dist/atlas/diffusion/bridges.d.ts.map +1 -1
  39. package/dist/atlas/diffusion/bridges.js +27 -39
  40. package/dist/atlas/diffusion/bridges.js.map +1 -1
  41. package/dist/atlas/diffusion/dimensions.d.ts +6 -14
  42. package/dist/atlas/diffusion/dimensions.d.ts.map +1 -1
  43. package/dist/atlas/diffusion/dimensions.js +8 -16
  44. package/dist/atlas/diffusion/dimensions.js.map +1 -1
  45. package/dist/atlas/diffusion/models.d.ts +3 -3
  46. package/dist/atlas/diffusion/models.d.ts.map +1 -1
  47. package/dist/atlas/diffusion/models.js +5 -10
  48. package/dist/atlas/diffusion/models.js.map +1 -1
  49. package/dist/atlas/diffusion/numerics.d.ts +16 -4
  50. package/dist/atlas/diffusion/numerics.d.ts.map +1 -1
  51. package/dist/atlas/diffusion/numerics.js +38 -24
  52. package/dist/atlas/diffusion/numerics.js.map +1 -1
  53. package/dist/atlas/link-prediction.d.ts +106 -3
  54. package/dist/atlas/link-prediction.d.ts.map +1 -1
  55. package/dist/atlas/link-prediction.js +212 -66
  56. package/dist/atlas/link-prediction.js.map +1 -1
  57. package/dist/atlas/oscillators/bridges-coarse.d.ts.map +1 -1
  58. package/dist/atlas/oscillators/bridges-coarse.js +7 -11
  59. package/dist/atlas/oscillators/bridges-coarse.js.map +1 -1
  60. package/dist/atlas/oscillators/bridges-exact.d.ts.map +1 -1
  61. package/dist/atlas/oscillators/bridges-exact.js +6 -7
  62. package/dist/atlas/oscillators/bridges-exact.js.map +1 -1
  63. package/dist/atlas/oscillators/bridges-limits.d.ts +3 -16
  64. package/dist/atlas/oscillators/bridges-limits.d.ts.map +1 -1
  65. package/dist/atlas/oscillators/bridges-limits.js +23 -34
  66. package/dist/atlas/oscillators/bridges-limits.js.map +1 -1
  67. package/dist/atlas/oscillators/dimensions.d.ts +9 -21
  68. package/dist/atlas/oscillators/dimensions.d.ts.map +1 -1
  69. package/dist/atlas/oscillators/dimensions.js +9 -21
  70. package/dist/atlas/oscillators/dimensions.js.map +1 -1
  71. package/dist/atlas/oscillators/limit-witnesses.d.ts +2 -2
  72. package/dist/atlas/oscillators/limit-witnesses.d.ts.map +1 -1
  73. package/dist/atlas/oscillators/limit-witnesses.js +17 -15
  74. package/dist/atlas/oscillators/limit-witnesses.js.map +1 -1
  75. package/dist/atlas/oscillators/models.d.ts.map +1 -1
  76. package/dist/atlas/oscillators/models.js +2 -6
  77. package/dist/atlas/oscillators/models.js.map +1 -1
  78. package/dist/atlas/oscillators/pendulum-motion.d.ts +29 -6
  79. package/dist/atlas/oscillators/pendulum-motion.d.ts.map +1 -1
  80. package/dist/atlas/oscillators/pendulum-motion.js +60 -40
  81. package/dist/atlas/oscillators/pendulum-motion.js.map +1 -1
  82. package/dist/atlas/oscillators/phase-translation.d.ts +0 -11
  83. package/dist/atlas/oscillators/phase-translation.d.ts.map +1 -1
  84. package/dist/atlas/oscillators/phase-translation.js +3 -4
  85. package/dist/atlas/oscillators/phase-translation.js.map +1 -1
  86. package/dist/atlas/oscillators/position-translation.d.ts +68 -7
  87. package/dist/atlas/oscillators/position-translation.d.ts.map +1 -1
  88. package/dist/atlas/oscillators/position-translation.js +123 -12
  89. package/dist/atlas/oscillators/position-translation.js.map +1 -1
  90. package/dist/atlas/oscillators/rejections.d.ts +0 -2
  91. package/dist/atlas/oscillators/rejections.d.ts.map +1 -1
  92. package/dist/atlas/oscillators/rejections.js +0 -7
  93. package/dist/atlas/oscillators/rejections.js.map +1 -1
  94. package/dist/atlas/physjs-entries.generated.d.ts +35 -25
  95. package/dist/atlas/physjs-entries.generated.d.ts.map +1 -1
  96. package/dist/atlas/physjs-entries.generated.js +37 -25
  97. package/dist/atlas/physjs-entries.generated.js.map +1 -1
  98. package/dist/atlas/physjs-ref.d.ts +34 -31
  99. package/dist/atlas/physjs-ref.d.ts.map +1 -1
  100. package/dist/atlas/physjs-ref.js +55 -53
  101. package/dist/atlas/physjs-ref.js.map +1 -1
  102. package/dist/atlas/physjs-reviewed.d.ts +1 -1
  103. package/dist/atlas/physjs-reviewed.js +15 -15
  104. package/dist/atlas/physjs-reviewed.js.map +1 -1
  105. package/dist/atlas/poster/statements.d.ts +0 -19
  106. package/dist/atlas/poster/statements.d.ts.map +1 -1
  107. package/dist/atlas/poster/statements.js +1 -1
  108. package/dist/atlas/poster/statements.js.map +1 -1
  109. package/dist/atlas/proof-target.d.ts +1 -1
  110. package/dist/atlas/proof-target.js +1 -1
  111. package/dist/atlas/proof-target.js.map +1 -1
  112. package/dist/atlas/regime.d.ts +1 -1
  113. package/dist/atlas/regime.d.ts.map +1 -1
  114. package/dist/atlas/regime.js +1 -1
  115. package/dist/atlas/regime.js.map +1 -1
  116. package/dist/atlas/text-overlap.d.ts +23 -0
  117. package/dist/atlas/text-overlap.d.ts.map +1 -0
  118. package/dist/atlas/text-overlap.js +41 -0
  119. package/dist/atlas/text-overlap.js.map +1 -0
  120. package/dist/atlas/waves/bridges-closure.d.ts.map +1 -1
  121. package/dist/atlas/waves/bridges-closure.js +2 -6
  122. package/dist/atlas/waves/bridges-closure.js.map +1 -1
  123. package/dist/atlas/waves/bridges.d.ts.map +1 -1
  124. package/dist/atlas/waves/bridges.js +32 -48
  125. package/dist/atlas/waves/bridges.js.map +1 -1
  126. package/dist/atlas/waves/models.d.ts +5 -6
  127. package/dist/atlas/waves/models.d.ts.map +1 -1
  128. package/dist/atlas/waves/models.js +7 -13
  129. package/dist/atlas/waves/models.js.map +1 -1
  130. package/dist/atlas/waves/numerics.d.ts.map +1 -1
  131. package/dist/atlas/waves/numerics.js +10 -3
  132. package/dist/atlas/waves/numerics.js.map +1 -1
  133. package/dist/atlas/witness-numeric.d.ts +30 -0
  134. package/dist/atlas/witness-numeric.d.ts.map +1 -1
  135. package/dist/atlas/witness-numeric.js +53 -0
  136. package/dist/atlas/witness-numeric.js.map +1 -1
  137. package/dist/atlas/witness-specs.d.ts.map +1 -1
  138. package/dist/atlas/witness-specs.js +19 -0
  139. package/dist/atlas/witness-specs.js.map +1 -1
  140. package/dist/atlas/witness-symbolic.d.ts +75 -3
  141. package/dist/atlas/witness-symbolic.d.ts.map +1 -1
  142. package/dist/atlas/witness-symbolic.js +116 -10
  143. package/dist/atlas/witness-symbolic.js.map +1 -1
  144. package/dist/bridges/catalog-load.d.ts.map +1 -1
  145. package/dist/bridges/catalog-load.js +13 -8
  146. package/dist/bridges/catalog-load.js.map +1 -1
  147. package/dist/bridges/catalog-types.d.ts +26 -2
  148. package/dist/bridges/catalog-types.d.ts.map +1 -1
  149. package/dist/bridges/catalog-types.js +11 -1
  150. package/dist/bridges/catalog-types.js.map +1 -1
  151. package/dist/bridges/evaluation-errors.d.ts +31 -1
  152. package/dist/bridges/evaluation-errors.d.ts.map +1 -1
  153. package/dist/bridges/evaluation-errors.js +20 -2
  154. package/dist/bridges/evaluation-errors.js.map +1 -1
  155. package/dist/bridges/evaluator-inputs.d.ts.map +1 -1
  156. package/dist/bridges/evaluator-inputs.js +7 -5
  157. package/dist/bridges/evaluator-inputs.js.map +1 -1
  158. package/dist/bridges/evaluators.d.ts.map +1 -1
  159. package/dist/bridges/evaluators.js +27 -12
  160. package/dist/bridges/evaluators.js.map +1 -1
  161. package/dist/bridges/expr-parse.d.ts +11 -0
  162. package/dist/bridges/expr-parse.d.ts.map +1 -1
  163. package/dist/bridges/expr-parse.js +14 -5
  164. package/dist/bridges/expr-parse.js.map +1 -1
  165. package/dist/bridges/holds.d.ts +35 -3
  166. package/dist/bridges/holds.d.ts.map +1 -1
  167. package/dist/bridges/holds.js +117 -23
  168. package/dist/bridges/holds.js.map +1 -1
  169. package/dist/bridges/notices.d.ts.map +1 -1
  170. package/dist/bridges/notices.js +5 -5
  171. package/dist/bridges/notices.js.map +1 -1
  172. package/dist/bridges/relation-eval.d.ts +4 -4
  173. package/dist/bridges/relation-eval.d.ts.map +1 -1
  174. package/dist/bridges/relation-eval.js +15 -16
  175. package/dist/bridges/relation-eval.js.map +1 -1
  176. package/dist/bridges/sensitivity.d.ts.map +1 -1
  177. package/dist/bridges/sensitivity.js +3 -3
  178. package/dist/bridges/sensitivity.js.map +1 -1
  179. package/dist/bridges/validity.d.ts +33 -0
  180. package/dist/bridges/validity.d.ts.map +1 -0
  181. package/dist/bridges/validity.js +67 -0
  182. package/dist/bridges/validity.js.map +1 -0
  183. package/dist/canonical/entries/atomic.js +1 -3
  184. package/dist/canonical/entries/atomic.js.map +1 -1
  185. package/dist/canonical/entries/condensed-matter.d.ts.map +1 -1
  186. package/dist/canonical/entries/condensed-matter.js +4 -5
  187. package/dist/canonical/entries/condensed-matter.js.map +1 -1
  188. package/dist/canonical/entries/dimensional-classics.d.ts.map +1 -1
  189. package/dist/canonical/entries/dimensional-classics.js +3 -4
  190. package/dist/canonical/entries/dimensional-classics.js.map +1 -1
  191. package/dist/canonical/entries/electromagnetism.d.ts.map +1 -1
  192. package/dist/canonical/entries/electromagnetism.js +4 -10
  193. package/dist/canonical/entries/electromagnetism.js.map +1 -1
  194. package/dist/canonical/entries/fluids-waves.d.ts.map +1 -1
  195. package/dist/canonical/entries/fluids-waves.js +3 -7
  196. package/dist/canonical/entries/fluids-waves.js.map +1 -1
  197. package/dist/canonical/entries/mechanics.d.ts.map +1 -1
  198. package/dist/canonical/entries/mechanics.js +4 -6
  199. package/dist/canonical/entries/mechanics.js.map +1 -1
  200. package/dist/canonical/entries/nonmonomial.d.ts.map +1 -1
  201. package/dist/canonical/entries/nonmonomial.js +9 -17
  202. package/dist/canonical/entries/nonmonomial.js.map +1 -1
  203. package/dist/canonical/entries/relativity.d.ts.map +1 -1
  204. package/dist/canonical/entries/relativity.js +6 -6
  205. package/dist/canonical/entries/relativity.js.map +1 -1
  206. package/dist/canonical/entries/thermo-nuclear-cosmo.d.ts.map +1 -1
  207. package/dist/canonical/entries/thermo-nuclear-cosmo.js +6 -10
  208. package/dist/canonical/entries/thermo-nuclear-cosmo.js.map +1 -1
  209. package/dist/canonical/fixed-points.d.ts +94 -0
  210. package/dist/canonical/fixed-points.d.ts.map +1 -0
  211. package/dist/canonical/fixed-points.js +81 -0
  212. package/dist/canonical/fixed-points.js.map +1 -0
  213. package/dist/canonical/linkage.d.ts.map +1 -1
  214. package/dist/canonical/linkage.js +25 -44
  215. package/dist/canonical/linkage.js.map +1 -1
  216. package/dist/canonical/normal-form.d.ts.map +1 -1
  217. package/dist/canonical/normal-form.js +5 -11
  218. package/dist/canonical/normal-form.js.map +1 -1
  219. package/dist/canonical/structural.d.ts +21 -21
  220. package/dist/canonical/structural.d.ts.map +1 -1
  221. package/dist/canonical/structural.js +40 -19
  222. package/dist/canonical/structural.js.map +1 -1
  223. package/dist/cases/catalog-checks.d.ts +10 -0
  224. package/dist/cases/catalog-checks.d.ts.map +1 -0
  225. package/dist/cases/catalog-checks.js +241 -0
  226. package/dist/cases/catalog-checks.js.map +1 -0
  227. package/dist/cases/catalog.d.ts +83 -0
  228. package/dist/cases/catalog.d.ts.map +1 -0
  229. package/dist/cases/catalog.js +118 -0
  230. package/dist/cases/catalog.js.map +1 -0
  231. package/dist/cases/engine.d.ts +13 -0
  232. package/dist/cases/engine.d.ts.map +1 -0
  233. package/dist/cases/engine.js +179 -0
  234. package/dist/cases/engine.js.map +1 -0
  235. package/dist/cases/index.d.ts.map +1 -1
  236. package/dist/cases/index.js +5 -7
  237. package/dist/cases/index.js.map +1 -1
  238. package/dist/cases/methods.d.ts +215 -0
  239. package/dist/cases/methods.d.ts.map +1 -0
  240. package/dist/cases/methods.js +743 -0
  241. package/dist/cases/methods.js.map +1 -0
  242. package/dist/cases/quadrature.d.ts +7 -9
  243. package/dist/cases/quadrature.d.ts.map +1 -1
  244. package/dist/cases/quadrature.js +28 -32
  245. package/dist/cases/quadrature.js.map +1 -1
  246. package/dist/cases/types.d.ts +12 -0
  247. package/dist/cases/types.d.ts.map +1 -1
  248. package/dist/cases/types.js.map +1 -1
  249. package/dist/cli/args.d.ts +25 -1
  250. package/dist/cli/args.d.ts.map +1 -1
  251. package/dist/cli/args.js +30 -8
  252. package/dist/cli/args.js.map +1 -1
  253. package/dist/cli/bindings.d.ts.map +1 -1
  254. package/dist/cli/bindings.js +5 -4
  255. package/dist/cli/bindings.js.map +1 -1
  256. package/dist/cli/command.d.ts +11 -1
  257. package/dist/cli/command.d.ts.map +1 -1
  258. package/dist/cli/command.js.map +1 -1
  259. package/dist/cli/commands/_atlas-map.d.ts +0 -9
  260. package/dist/cli/commands/_atlas-map.d.ts.map +1 -1
  261. package/dist/cli/commands/_atlas-map.js +8 -18
  262. package/dist/cli/commands/_atlas-map.js.map +1 -1
  263. package/dist/cli/commands/_atlas-route.d.ts.map +1 -1
  264. package/dist/cli/commands/_atlas-route.js +6 -2
  265. package/dist/cli/commands/_atlas-route.js.map +1 -1
  266. package/dist/cli/commands/_discovery-opts.d.ts +1 -0
  267. package/dist/cli/commands/_discovery-opts.d.ts.map +1 -1
  268. package/dist/cli/commands/_discovery-opts.js +9 -9
  269. package/dist/cli/commands/_discovery-opts.js.map +1 -1
  270. package/dist/cli/commands/atlas.d.ts.map +1 -1
  271. package/dist/cli/commands/atlas.js +8 -5
  272. package/dist/cli/commands/atlas.js.map +1 -1
  273. package/dist/cli/commands/audit.d.ts.map +1 -1
  274. package/dist/cli/commands/audit.js +8 -1
  275. package/dist/cli/commands/audit.js.map +1 -1
  276. package/dist/cli/commands/axes.d.ts.map +1 -1
  277. package/dist/cli/commands/axes.js +20 -1
  278. package/dist/cli/commands/axes.js.map +1 -1
  279. package/dist/cli/commands/confront.d.ts.map +1 -1
  280. package/dist/cli/commands/confront.js +8 -14
  281. package/dist/cli/commands/confront.js.map +1 -1
  282. package/dist/cli/commands/derive.d.ts.map +1 -1
  283. package/dist/cli/commands/derive.js +22 -22
  284. package/dist/cli/commands/derive.js.map +1 -1
  285. package/dist/cli/commands/discover.d.ts.map +1 -1
  286. package/dist/cli/commands/discover.js +122 -73
  287. package/dist/cli/commands/discover.js.map +1 -1
  288. package/dist/cli/commands/eval.d.ts.map +1 -1
  289. package/dist/cli/commands/eval.js +1 -0
  290. package/dist/cli/commands/eval.js.map +1 -1
  291. package/dist/cli/commands/evaluate.d.ts.map +1 -1
  292. package/dist/cli/commands/evaluate.js +67 -39
  293. package/dist/cli/commands/evaluate.js.map +1 -1
  294. package/dist/cli/commands/explain.d.ts.map +1 -1
  295. package/dist/cli/commands/explain.js +24 -3
  296. package/dist/cli/commands/explain.js.map +1 -1
  297. package/dist/cli/commands/ground.d.ts.map +1 -1
  298. package/dist/cli/commands/ground.js +7 -1
  299. package/dist/cli/commands/ground.js.map +1 -1
  300. package/dist/cli/commands/map.d.ts.map +1 -1
  301. package/dist/cli/commands/map.js +84 -11
  302. package/dist/cli/commands/map.js.map +1 -1
  303. package/dist/cli/commands/metric.d.ts.map +1 -1
  304. package/dist/cli/commands/metric.js +12 -9
  305. package/dist/cli/commands/metric.js.map +1 -1
  306. package/dist/cli/commands/path.d.ts +10 -0
  307. package/dist/cli/commands/path.d.ts.map +1 -1
  308. package/dist/cli/commands/path.js +25 -3
  309. package/dist/cli/commands/path.js.map +1 -1
  310. package/dist/cli/commands/probe.d.ts.map +1 -1
  311. package/dist/cli/commands/probe.js +59 -16
  312. package/dist/cli/commands/probe.js.map +1 -1
  313. package/dist/cli/commands/regime.d.ts.map +1 -1
  314. package/dist/cli/commands/regime.js +1 -0
  315. package/dist/cli/commands/regime.js.map +1 -1
  316. package/dist/cli/commands/retrieve.d.ts.map +1 -1
  317. package/dist/cli/commands/retrieve.js +1 -0
  318. package/dist/cli/commands/retrieve.js.map +1 -1
  319. package/dist/cli/commands/search.d.ts.map +1 -1
  320. package/dist/cli/commands/search.js +1 -0
  321. package/dist/cli/commands/search.js.map +1 -1
  322. package/dist/cli/commands/symbolic.d.ts.map +1 -1
  323. package/dist/cli/commands/symbolic.js +19 -28
  324. package/dist/cli/commands/symbolic.js.map +1 -1
  325. package/dist/cli/commands/testplan.d.ts.map +1 -1
  326. package/dist/cli/commands/testplan.js +4 -2
  327. package/dist/cli/commands/testplan.js.map +1 -1
  328. package/dist/cli/determination.d.ts +1 -0
  329. package/dist/cli/determination.d.ts.map +1 -1
  330. package/dist/cli/determination.js.map +1 -1
  331. package/dist/cli/expr-print.d.ts +0 -2
  332. package/dist/cli/expr-print.d.ts.map +1 -1
  333. package/dist/cli/expr-print.js +7 -31
  334. package/dist/cli/expr-print.js.map +1 -1
  335. package/dist/cli/flag-help.d.ts +1 -0
  336. package/dist/cli/flag-help.d.ts.map +1 -1
  337. package/dist/cli/flag-help.js +1 -0
  338. package/dist/cli/flag-help.js.map +1 -1
  339. package/dist/cli/graphs.d.ts +2 -0
  340. package/dist/cli/graphs.d.ts.map +1 -1
  341. package/dist/cli/graphs.js +1 -0
  342. package/dist/cli/graphs.js.map +1 -1
  343. package/dist/cli/main.d.ts +8 -0
  344. package/dist/cli/main.d.ts.map +1 -1
  345. package/dist/cli/main.js +19 -3
  346. package/dist/cli/main.js.map +1 -1
  347. package/dist/cli/numeric-flag.d.ts +12 -0
  348. package/dist/cli/numeric-flag.d.ts.map +1 -0
  349. package/dist/cli/numeric-flag.js +44 -0
  350. package/dist/cli/numeric-flag.js.map +1 -0
  351. package/dist/cli/output.d.ts +28 -0
  352. package/dist/cli/output.d.ts.map +1 -1
  353. package/dist/cli/output.js +23 -0
  354. package/dist/cli/output.js.map +1 -1
  355. package/dist/cli/record-reach.js +2 -2
  356. package/dist/cli/record-reach.js.map +1 -1
  357. package/dist/cli/record-tables.d.ts.map +1 -1
  358. package/dist/cli/record-tables.js +6 -5
  359. package/dist/cli/record-tables.js.map +1 -1
  360. package/dist/cli/record.d.ts +1 -5
  361. package/dist/cli/record.d.ts.map +1 -1
  362. package/dist/cli/record.js +9 -8
  363. package/dist/cli/record.js.map +1 -1
  364. package/dist/cli/search-index.d.ts.map +1 -1
  365. package/dist/cli/search-index.js +7 -6
  366. package/dist/cli/search-index.js.map +1 -1
  367. package/dist/cli/statuses.d.ts +0 -2
  368. package/dist/cli/statuses.d.ts.map +1 -1
  369. package/dist/cli/statuses.js +12 -9
  370. package/dist/cli/statuses.js.map +1 -1
  371. package/dist/cli/stored-results.d.ts +7 -0
  372. package/dist/cli/stored-results.d.ts.map +1 -0
  373. package/dist/cli/stored-results.js +23 -0
  374. package/dist/cli/stored-results.js.map +1 -0
  375. package/dist/cli/version.d.ts +1 -0
  376. package/dist/cli/version.d.ts.map +1 -1
  377. package/dist/cli/version.js +8 -5
  378. package/dist/cli/version.js.map +1 -1
  379. package/dist/cli-api.d.ts +36 -5
  380. package/dist/cli-api.d.ts.map +1 -1
  381. package/dist/cli-api.js +30 -4
  382. package/dist/cli-api.js.map +1 -1
  383. package/dist/composition/algebraic-equivalence.d.ts +43 -0
  384. package/dist/composition/algebraic-equivalence.d.ts.map +1 -0
  385. package/dist/composition/algebraic-equivalence.js +115 -0
  386. package/dist/composition/algebraic-equivalence.js.map +1 -0
  387. package/dist/composition/axes.d.ts +0 -6
  388. package/dist/composition/axes.d.ts.map +1 -1
  389. package/dist/composition/axes.js +6 -6
  390. package/dist/composition/axes.js.map +1 -1
  391. package/dist/composition/axis-audit.d.ts +47 -20
  392. package/dist/composition/axis-audit.d.ts.map +1 -1
  393. package/dist/composition/axis-audit.js +82 -9
  394. package/dist/composition/axis-audit.js.map +1 -1
  395. package/dist/composition/bridge-analysis.d.ts +17 -0
  396. package/dist/composition/bridge-analysis.d.ts.map +1 -1
  397. package/dist/composition/bridge-analysis.js +102 -55
  398. package/dist/composition/bridge-analysis.js.map +1 -1
  399. package/dist/composition/canonical-compare.d.ts +40 -0
  400. package/dist/composition/canonical-compare.d.ts.map +1 -1
  401. package/dist/composition/canonical-compare.js +122 -24
  402. package/dist/composition/canonical-compare.js.map +1 -1
  403. package/dist/composition/canonical-graph.d.ts +3 -3
  404. package/dist/composition/canonical-graph.d.ts.map +1 -1
  405. package/dist/composition/canonical-graph.js +11 -38
  406. package/dist/composition/canonical-graph.js.map +1 -1
  407. package/dist/composition/canonical-json.js +2 -2
  408. package/dist/composition/canonical-json.js.map +1 -1
  409. package/dist/composition/catalog-graph.d.ts.map +1 -1
  410. package/dist/composition/catalog-graph.js +2 -5
  411. package/dist/composition/catalog-graph.js.map +1 -1
  412. package/dist/composition/chain-candidate.d.ts +8 -0
  413. package/dist/composition/chain-candidate.d.ts.map +1 -1
  414. package/dist/composition/chain-candidate.js +9 -2
  415. package/dist/composition/chain-candidate.js.map +1 -1
  416. package/dist/composition/chain-match.d.ts +6 -3
  417. package/dist/composition/chain-match.d.ts.map +1 -1
  418. package/dist/composition/chain-match.js +4 -1
  419. package/dist/composition/chain-match.js.map +1 -1
  420. package/dist/composition/chain-result.d.ts.map +1 -1
  421. package/dist/composition/chain-result.js +2 -14
  422. package/dist/composition/chain-result.js.map +1 -1
  423. package/dist/composition/compose-symbolic.d.ts.map +1 -1
  424. package/dist/composition/compose-symbolic.js +3 -2
  425. package/dist/composition/compose-symbolic.js.map +1 -1
  426. package/dist/composition/compose.d.ts.map +1 -1
  427. package/dist/composition/compose.js +13 -5
  428. package/dist/composition/compose.js.map +1 -1
  429. package/dist/composition/composition-recovery.d.ts.map +1 -1
  430. package/dist/composition/composition-recovery.js +4 -7
  431. package/dist/composition/composition-recovery.js.map +1 -1
  432. package/dist/composition/consequence.d.ts +15 -5
  433. package/dist/composition/consequence.d.ts.map +1 -1
  434. package/dist/composition/consequence.js +6 -4
  435. package/dist/composition/consequence.js.map +1 -1
  436. package/dist/composition/discovery.d.ts +129 -9
  437. package/dist/composition/discovery.d.ts.map +1 -1
  438. package/dist/composition/discovery.js +171 -67
  439. package/dist/composition/discovery.js.map +1 -1
  440. package/dist/composition/edge.d.ts +21 -2
  441. package/dist/composition/edge.d.ts.map +1 -1
  442. package/dist/composition/edge.js +23 -1
  443. package/dist/composition/edge.js.map +1 -1
  444. package/dist/composition/enumerate.d.ts.map +1 -1
  445. package/dist/composition/enumerate.js +18 -3
  446. package/dist/composition/enumerate.js.map +1 -1
  447. package/dist/composition/evaluate-relation.d.ts +35 -11
  448. package/dist/composition/evaluate-relation.d.ts.map +1 -1
  449. package/dist/composition/evaluate-relation.js +60 -39
  450. package/dist/composition/evaluate-relation.js.map +1 -1
  451. package/dist/composition/explain.d.ts +3 -12
  452. package/dist/composition/explain.d.ts.map +1 -1
  453. package/dist/composition/explain.js +7 -20
  454. package/dist/composition/explain.js.map +1 -1
  455. package/dist/composition/expr-eval.d.ts +1 -1
  456. package/dist/composition/expr-eval.d.ts.map +1 -1
  457. package/dist/composition/expr-eval.js +6 -15
  458. package/dist/composition/expr-eval.js.map +1 -1
  459. package/dist/composition/expr-simplify.d.ts +26 -14
  460. package/dist/composition/expr-simplify.d.ts.map +1 -1
  461. package/dist/composition/expr-simplify.js +64 -72
  462. package/dist/composition/expr-simplify.js.map +1 -1
  463. package/dist/composition/formula-shape.d.ts +23 -4
  464. package/dist/composition/formula-shape.d.ts.map +1 -1
  465. package/dist/composition/formula-shape.js +57 -17
  466. package/dist/composition/formula-shape.js.map +1 -1
  467. package/dist/composition/graph-structure.d.ts +98 -0
  468. package/dist/composition/graph-structure.d.ts.map +1 -0
  469. package/dist/composition/graph-structure.js +167 -0
  470. package/dist/composition/graph-structure.js.map +1 -0
  471. package/dist/composition/graph-viz-svg.d.ts.map +1 -1
  472. package/dist/composition/graph-viz-svg.js +1 -1
  473. package/dist/composition/graph-viz-svg.js.map +1 -1
  474. package/dist/composition/graph-viz.d.ts.map +1 -1
  475. package/dist/composition/graph-viz.js +8 -37
  476. package/dist/composition/graph-viz.js.map +1 -1
  477. package/dist/composition/grounding.d.ts.map +1 -1
  478. package/dist/composition/grounding.js +19 -7
  479. package/dist/composition/grounding.js.map +1 -1
  480. package/dist/composition/identifiability.d.ts +91 -4
  481. package/dist/composition/identifiability.d.ts.map +1 -1
  482. package/dist/composition/identifiability.js +363 -6
  483. package/dist/composition/identifiability.js.map +1 -1
  484. package/dist/composition/index.d.ts +8 -4
  485. package/dist/composition/index.d.ts.map +1 -1
  486. package/dist/composition/index.js +3 -2
  487. package/dist/composition/index.js.map +1 -1
  488. package/dist/composition/mathts-quiet.d.ts +7 -8
  489. package/dist/composition/mathts-quiet.d.ts.map +1 -1
  490. package/dist/composition/mathts-quiet.js +7 -16
  491. package/dist/composition/mathts-quiet.js.map +1 -1
  492. package/dist/composition/mathts-scalar-symbols.d.ts.map +1 -1
  493. package/dist/composition/mathts-scalar-symbols.js +2 -1
  494. package/dist/composition/mathts-scalar-symbols.js.map +1 -1
  495. package/dist/composition/own-equation-magnitude.d.ts +95 -0
  496. package/dist/composition/own-equation-magnitude.d.ts.map +1 -0
  497. package/dist/composition/own-equation-magnitude.js +270 -0
  498. package/dist/composition/own-equation-magnitude.js.map +1 -0
  499. package/dist/composition/probe/backend-protocol.d.ts +3 -0
  500. package/dist/composition/probe/backend-protocol.d.ts.map +1 -1
  501. package/dist/composition/probe/backend-protocol.js.map +1 -1
  502. package/dist/composition/probe/candidate-store.d.ts +1 -0
  503. package/dist/composition/probe/candidate-store.d.ts.map +1 -1
  504. package/dist/composition/probe/candidate-store.js +1 -0
  505. package/dist/composition/probe/candidate-store.js.map +1 -1
  506. package/dist/composition/probe/corpus.d.ts +8 -4
  507. package/dist/composition/probe/corpus.d.ts.map +1 -1
  508. package/dist/composition/probe/corpus.js +23 -12
  509. package/dist/composition/probe/corpus.js.map +1 -1
  510. package/dist/composition/probe/dataset.d.ts +18 -0
  511. package/dist/composition/probe/dataset.d.ts.map +1 -1
  512. package/dist/composition/probe/dataset.js +95 -50
  513. package/dist/composition/probe/dataset.js.map +1 -1
  514. package/dist/composition/probe/experiment-design.d.ts +7 -1
  515. package/dist/composition/probe/experiment-design.d.ts.map +1 -1
  516. package/dist/composition/probe/experiment-design.js +44 -24
  517. package/dist/composition/probe/experiment-design.js.map +1 -1
  518. package/dist/composition/probe/falsify.d.ts +2 -0
  519. package/dist/composition/probe/falsify.d.ts.map +1 -1
  520. package/dist/composition/probe/falsify.js +2 -0
  521. package/dist/composition/probe/falsify.js.map +1 -1
  522. package/dist/composition/probe/fit.d.ts +7 -0
  523. package/dist/composition/probe/fit.d.ts.map +1 -1
  524. package/dist/composition/probe/fit.js +46 -22
  525. package/dist/composition/probe/fit.js.map +1 -1
  526. package/dist/composition/probe/frontier.d.ts.map +1 -1
  527. package/dist/composition/probe/frontier.js +33 -15
  528. package/dist/composition/probe/frontier.js.map +1 -1
  529. package/dist/composition/probe/generator.d.ts +30 -1
  530. package/dist/composition/probe/generator.d.ts.map +1 -1
  531. package/dist/composition/probe/generator.js +58 -36
  532. package/dist/composition/probe/generator.js.map +1 -1
  533. package/dist/composition/probe/index.d.ts +14 -0
  534. package/dist/composition/probe/index.d.ts.map +1 -1
  535. package/dist/composition/probe/index.js +6 -0
  536. package/dist/composition/probe/index.js.map +1 -1
  537. package/dist/composition/probe/limits.d.ts +25 -1
  538. package/dist/composition/probe/limits.d.ts.map +1 -1
  539. package/dist/composition/probe/limits.js +53 -11
  540. package/dist/composition/probe/limits.js.map +1 -1
  541. package/dist/composition/probe/pipeline.d.ts +5 -0
  542. package/dist/composition/probe/pipeline.d.ts.map +1 -1
  543. package/dist/composition/probe/pipeline.js +73 -24
  544. package/dist/composition/probe/pipeline.js.map +1 -1
  545. package/dist/composition/probe/power-law.d.ts +121 -0
  546. package/dist/composition/probe/power-law.d.ts.map +1 -0
  547. package/dist/composition/probe/power-law.js +251 -0
  548. package/dist/composition/probe/power-law.js.map +1 -0
  549. package/dist/composition/probe/problem.d.ts +8 -4
  550. package/dist/composition/probe/problem.d.ts.map +1 -1
  551. package/dist/composition/probe/problem.js +177 -49
  552. package/dist/composition/probe/problem.js.map +1 -1
  553. package/dist/composition/probe/report.js +1 -1
  554. package/dist/composition/probe/report.js.map +1 -1
  555. package/dist/composition/probe/residual.d.ts +7 -1
  556. package/dist/composition/probe/residual.d.ts.map +1 -1
  557. package/dist/composition/probe/residual.js +10 -7
  558. package/dist/composition/probe/residual.js.map +1 -1
  559. package/dist/composition/probe/run-manifest.d.ts +1 -0
  560. package/dist/composition/probe/run-manifest.d.ts.map +1 -1
  561. package/dist/composition/probe/run-manifest.js.map +1 -1
  562. package/dist/composition/probe/scalar-search.d.ts +50 -0
  563. package/dist/composition/probe/scalar-search.d.ts.map +1 -0
  564. package/dist/composition/probe/scalar-search.js +169 -0
  565. package/dist/composition/probe/scalar-search.js.map +1 -0
  566. package/dist/composition/probe/scoring.d.ts +1 -0
  567. package/dist/composition/probe/scoring.d.ts.map +1 -1
  568. package/dist/composition/probe/scoring.js.map +1 -1
  569. package/dist/composition/probe/structure.d.ts +82 -17
  570. package/dist/composition/probe/structure.d.ts.map +1 -1
  571. package/dist/composition/probe/structure.js +129 -55
  572. package/dist/composition/probe/structure.js.map +1 -1
  573. package/dist/composition/probe/study.d.ts +31 -9
  574. package/dist/composition/probe/study.d.ts.map +1 -1
  575. package/dist/composition/probe/study.js +235 -184
  576. package/dist/composition/probe/study.js.map +1 -1
  577. package/dist/composition/probe/t-tail.d.ts +16 -0
  578. package/dist/composition/probe/t-tail.d.ts.map +1 -0
  579. package/dist/composition/probe/t-tail.js +29 -0
  580. package/dist/composition/probe/t-tail.js.map +1 -0
  581. package/dist/composition/probe/types.d.ts +3 -0
  582. package/dist/composition/probe/types.d.ts.map +1 -1
  583. package/dist/composition/probe/types.js.map +1 -1
  584. package/dist/composition/proposed-bridges.d.ts +52 -12
  585. package/dist/composition/proposed-bridges.d.ts.map +1 -1
  586. package/dist/composition/proposed-bridges.js +107 -60
  587. package/dist/composition/proposed-bridges.js.map +1 -1
  588. package/dist/composition/quantity-clusters.d.ts +48 -0
  589. package/dist/composition/quantity-clusters.d.ts.map +1 -0
  590. package/dist/composition/quantity-clusters.js +98 -0
  591. package/dist/composition/quantity-clusters.js.map +1 -0
  592. package/dist/composition/rational-exponent.d.ts +40 -0
  593. package/dist/composition/rational-exponent.d.ts.map +1 -0
  594. package/dist/composition/rational-exponent.js +65 -0
  595. package/dist/composition/rational-exponent.js.map +1 -0
  596. package/dist/composition/representative-values.d.ts +22 -0
  597. package/dist/composition/representative-values.d.ts.map +1 -1
  598. package/dist/composition/representative-values.js +29 -0
  599. package/dist/composition/representative-values.js.map +1 -1
  600. package/dist/composition/retrodiction.d.ts +15 -0
  601. package/dist/composition/retrodiction.d.ts.map +1 -1
  602. package/dist/composition/retrodiction.js +12 -4
  603. package/dist/composition/retrodiction.js.map +1 -1
  604. package/dist/composition/user-equation.d.ts +1 -0
  605. package/dist/composition/user-equation.d.ts.map +1 -1
  606. package/dist/composition/user-equation.js +3 -2
  607. package/dist/composition/user-equation.js.map +1 -1
  608. package/dist/core/assignment.d.ts +19 -0
  609. package/dist/core/assignment.d.ts.map +1 -0
  610. package/dist/core/assignment.js +19 -0
  611. package/dist/core/assignment.js.map +1 -0
  612. package/dist/core/compare.d.ts +32 -0
  613. package/dist/core/compare.d.ts.map +1 -0
  614. package/dist/core/compare.js +46 -0
  615. package/dist/core/compare.js.map +1 -0
  616. package/dist/core/constants.d.ts +42 -41
  617. package/dist/core/constants.d.ts.map +1 -1
  618. package/dist/core/constants.js +71 -51
  619. package/dist/core/constants.js.map +1 -1
  620. package/dist/core/data-file.d.ts +7 -0
  621. package/dist/core/data-file.d.ts.map +1 -1
  622. package/dist/core/data-file.js +17 -0
  623. package/dist/core/data-file.js.map +1 -1
  624. package/dist/core/format.d.ts +36 -0
  625. package/dist/core/format.d.ts.map +1 -0
  626. package/dist/core/format.js +39 -0
  627. package/dist/core/format.js.map +1 -0
  628. package/dist/core/hash.d.ts +14 -0
  629. package/dist/core/hash.d.ts.map +1 -0
  630. package/dist/core/hash.js +17 -0
  631. package/dist/core/hash.js.map +1 -0
  632. package/dist/core/json-schema.d.ts +2 -0
  633. package/dist/core/json-schema.d.ts.map +1 -1
  634. package/dist/core/json-schema.js +14 -13
  635. package/dist/core/json-schema.js.map +1 -1
  636. package/dist/core/labeled-tensor.d.ts.map +1 -1
  637. package/dist/core/labeled-tensor.js +0 -8
  638. package/dist/core/labeled-tensor.js.map +1 -1
  639. package/dist/core/mathts-read.d.ts +25 -0
  640. package/dist/core/mathts-read.d.ts.map +1 -0
  641. package/dist/core/mathts-read.js +51 -0
  642. package/dist/core/mathts-read.js.map +1 -0
  643. package/dist/core/tensor.d.ts.map +1 -1
  644. package/dist/core/tensor.js +24 -0
  645. package/dist/core/tensor.js.map +1 -1
  646. package/dist/core/types.d.ts +5 -5
  647. package/dist/diff/bridge-ast-gradient.d.ts +27 -23
  648. package/dist/diff/bridge-ast-gradient.d.ts.map +1 -1
  649. package/dist/diff/bridge-ast-gradient.js +75 -173
  650. package/dist/diff/bridge-ast-gradient.js.map +1 -1
  651. package/dist/diff/bridge-gradient.d.ts +19 -6
  652. package/dist/diff/bridge-gradient.d.ts.map +1 -1
  653. package/dist/diff/bridge-gradient.js +19 -11
  654. package/dist/diff/bridge-gradient.js.map +1 -1
  655. package/dist/diff/bridge-specs.d.ts.map +1 -1
  656. package/dist/diff/bridge-specs.js +3 -0
  657. package/dist/diff/bridge-specs.js.map +1 -1
  658. package/dist/dimensional/algebra.d.ts +18 -0
  659. package/dist/dimensional/algebra.d.ts.map +1 -1
  660. package/dist/dimensional/algebra.js +41 -1
  661. package/dist/dimensional/algebra.js.map +1 -1
  662. package/dist/dimensional/ast-builders.d.ts +7 -0
  663. package/dist/dimensional/ast-builders.d.ts.map +1 -1
  664. package/dist/dimensional/ast-builders.js +11 -0
  665. package/dist/dimensional/ast-builders.js.map +1 -1
  666. package/dist/dimensional/ast-leaves.d.ts +81 -0
  667. package/dist/dimensional/ast-leaves.d.ts.map +1 -0
  668. package/dist/dimensional/ast-leaves.js +146 -0
  669. package/dist/dimensional/ast-leaves.js.map +1 -0
  670. package/dist/dimensional/ast-types.d.ts +15 -0
  671. package/dist/dimensional/ast-types.d.ts.map +1 -1
  672. package/dist/dimensional/ast-types.js.map +1 -1
  673. package/dist/dimensional/buckingham.d.ts.map +1 -1
  674. package/dist/dimensional/buckingham.js +15 -27
  675. package/dist/dimensional/buckingham.js.map +1 -1
  676. package/dist/dimensional/constant-rows.js +9 -9
  677. package/dist/dimensional/constant-rows.js.map +1 -1
  678. package/dist/dimensional/curvature-composite.d.ts +1 -1
  679. package/dist/dimensional/curvature-composite.js.map +1 -1
  680. package/dist/dimensional/dimension-inference.d.ts.map +1 -1
  681. package/dist/dimensional/dimension-inference.js +1 -2
  682. package/dist/dimensional/dimension-inference.js.map +1 -1
  683. package/dist/dimensional/errors.d.ts +1 -1
  684. package/dist/dimensional/errors.d.ts.map +1 -1
  685. package/dist/dimensional/errors.js +1 -15
  686. package/dist/dimensional/errors.js.map +1 -1
  687. package/dist/dimensional/exact-scale.d.ts +24 -11
  688. package/dist/dimensional/exact-scale.d.ts.map +1 -1
  689. package/dist/dimensional/exact-scale.js +122 -130
  690. package/dist/dimensional/exact-scale.js.map +1 -1
  691. package/dist/dimensional/gauge-field.d.ts.map +1 -1
  692. package/dist/dimensional/gauge-field.js +2 -2
  693. package/dist/dimensional/gauge-field.js.map +1 -1
  694. package/dist/dimensional/hyphen-names.d.ts +12 -2
  695. package/dist/dimensional/hyphen-names.d.ts.map +1 -1
  696. package/dist/dimensional/hyphen-names.js +44 -19
  697. package/dist/dimensional/hyphen-names.js.map +1 -1
  698. package/dist/dimensional/mathts-unit-delegation.d.ts +29 -0
  699. package/dist/dimensional/mathts-unit-delegation.d.ts.map +1 -0
  700. package/dist/dimensional/mathts-unit-delegation.js +187 -0
  701. package/dist/dimensional/mathts-unit-delegation.js.map +1 -0
  702. package/dist/dimensional/mathts-unit-wrapper.d.ts +33 -0
  703. package/dist/dimensional/mathts-unit-wrapper.d.ts.map +1 -0
  704. package/dist/dimensional/mathts-unit-wrapper.js +190 -0
  705. package/dist/dimensional/mathts-unit-wrapper.js.map +1 -0
  706. package/dist/dimensional/metric.d.ts.map +1 -1
  707. package/dist/dimensional/metric.js +0 -1
  708. package/dist/dimensional/metric.js.map +1 -1
  709. package/dist/dimensional/scalar-lowering.d.ts +21 -0
  710. package/dist/dimensional/scalar-lowering.d.ts.map +1 -0
  711. package/dist/dimensional/scalar-lowering.js +45 -0
  712. package/dist/dimensional/scalar-lowering.js.map +1 -0
  713. package/dist/dimensional/symbolic-constants.d.ts +9 -0
  714. package/dist/dimensional/symbolic-constants.d.ts.map +1 -1
  715. package/dist/dimensional/symbolic-constants.js +13 -1
  716. package/dist/dimensional/symbolic-constants.js.map +1 -1
  717. package/dist/dimensional/types.d.ts +36 -0
  718. package/dist/dimensional/types.d.ts.map +1 -1
  719. package/dist/dimensional/types.js +45 -7
  720. package/dist/dimensional/types.js.map +1 -1
  721. package/dist/dimensional/unit-data.d.ts +5 -1
  722. package/dist/dimensional/unit-data.d.ts.map +1 -1
  723. package/dist/dimensional/unit-data.js +30 -6
  724. package/dist/dimensional/unit-data.js.map +1 -1
  725. package/dist/dimensional/units.d.ts +2 -0
  726. package/dist/dimensional/units.d.ts.map +1 -1
  727. package/dist/dimensional/units.js +59 -3
  728. package/dist/dimensional/units.js.map +1 -1
  729. package/dist/dimensional/validator.d.ts +2 -0
  730. package/dist/dimensional/validator.d.ts.map +1 -1
  731. package/dist/dimensional/validator.js.map +1 -1
  732. package/dist/index.d.ts +9 -3
  733. package/dist/index.d.ts.map +1 -1
  734. package/dist/index.js +10 -4
  735. package/dist/index.js.map +1 -1
  736. package/dist/numerical/christoffel-flat.d.ts.map +1 -1
  737. package/dist/numerical/christoffel-flat.js +3 -2
  738. package/dist/numerical/christoffel-flat.js.map +1 -1
  739. package/dist/numerical/connection-lowering-helpers.d.ts +3 -1
  740. package/dist/numerical/connection-lowering-helpers.d.ts.map +1 -1
  741. package/dist/numerical/connection-lowering-helpers.js +11 -15
  742. package/dist/numerical/connection-lowering-helpers.js.map +1 -1
  743. package/dist/numerical/covariant-eikonal.d.ts.map +1 -1
  744. package/dist/numerical/covariant-eikonal.js +34 -11
  745. package/dist/numerical/covariant-eikonal.js.map +1 -1
  746. package/dist/numerical/curvature-lowering-helpers.js +3 -2
  747. package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
  748. package/dist/numerical/errors.d.ts.map +1 -1
  749. package/dist/numerical/errors.js +0 -3
  750. package/dist/numerical/errors.js.map +1 -1
  751. package/dist/numerical/finite-difference.d.ts +22 -0
  752. package/dist/numerical/finite-difference.d.ts.map +1 -0
  753. package/dist/numerical/finite-difference.js +27 -0
  754. package/dist/numerical/finite-difference.js.map +1 -0
  755. package/dist/numerical/geodesic-integrator.d.ts.map +1 -1
  756. package/dist/numerical/geodesic-integrator.js +22 -14
  757. package/dist/numerical/geodesic-integrator.js.map +1 -1
  758. package/dist/numerical/geometrized.d.ts.map +1 -1
  759. package/dist/numerical/geometrized.js +0 -1
  760. package/dist/numerical/geometrized.js.map +1 -1
  761. package/dist/numerical/mathts-engine.d.ts.map +1 -1
  762. package/dist/numerical/mathts-engine.js +10 -24
  763. package/dist/numerical/mathts-engine.js.map +1 -1
  764. package/dist/numerical/metric-inverse.d.ts.map +1 -1
  765. package/dist/numerical/metric-inverse.js +83 -46
  766. package/dist/numerical/metric-inverse.js.map +1 -1
  767. package/dist/numerical/null-ray-integrator.d.ts +2 -1
  768. package/dist/numerical/null-ray-integrator.d.ts.map +1 -1
  769. package/dist/numerical/null-ray-integrator.js +12 -12
  770. package/dist/numerical/null-ray-integrator.js.map +1 -1
  771. package/dist/numerical/painleve-gullstrand-metric.js +2 -2
  772. package/dist/numerical/painleve-gullstrand-metric.js.map +1 -1
  773. package/dist/numerical/pderiv.d.ts.map +1 -1
  774. package/dist/numerical/pderiv.js +2 -6
  775. package/dist/numerical/pderiv.js.map +1 -1
  776. package/dist/numerical/perihelion-finder.d.ts +0 -36
  777. package/dist/numerical/perihelion-finder.d.ts.map +1 -1
  778. package/dist/numerical/perihelion-finder.js +41 -87
  779. package/dist/numerical/perihelion-finder.js.map +1 -1
  780. package/dist/numerical/quadrature.d.ts.map +1 -1
  781. package/dist/numerical/quadrature.js +11 -13
  782. package/dist/numerical/quadrature.js.map +1 -1
  783. package/dist/numerical/rk4-trajectory.d.ts +10 -0
  784. package/dist/numerical/rk4-trajectory.d.ts.map +1 -0
  785. package/dist/numerical/rk4-trajectory.js +37 -0
  786. package/dist/numerical/rk4-trajectory.js.map +1 -0
  787. package/dist/numerical/schwarzschild.d.ts +14 -0
  788. package/dist/numerical/schwarzschild.d.ts.map +1 -0
  789. package/dist/numerical/schwarzschild.js +17 -0
  790. package/dist/numerical/schwarzschild.js.map +1 -0
  791. package/dist/numerical/spacetime-metrics.d.ts +12 -0
  792. package/dist/numerical/spacetime-metrics.d.ts.map +1 -1
  793. package/dist/numerical/spacetime-metrics.js +72 -56
  794. package/dist/numerical/spacetime-metrics.js.map +1 -1
  795. package/dist/numerical/statistics.d.ts +24 -0
  796. package/dist/numerical/statistics.d.ts.map +1 -0
  797. package/dist/numerical/statistics.js +52 -0
  798. package/dist/numerical/statistics.js.map +1 -0
  799. package/dist/numerical/strides.d.ts +3 -2
  800. package/dist/numerical/strides.d.ts.map +1 -1
  801. package/dist/numerical/strides.js +3 -10
  802. package/dist/numerical/strides.js.map +1 -1
  803. package/dist/numerical/tensor-engine.d.ts +21 -0
  804. package/dist/numerical/tensor-engine.d.ts.map +1 -1
  805. package/dist/numerical/tensor-engine.js +12 -0
  806. package/dist/numerical/tensor-engine.js.map +1 -1
  807. package/dist/relations/regime.d.ts +10 -0
  808. package/dist/relations/regime.d.ts.map +1 -1
  809. package/dist/relations/regime.js +18 -1
  810. package/dist/relations/regime.js.map +1 -1
  811. package/package.json +9 -12
  812. package/dist/cases/brownian-sphere.d.ts +0 -68
  813. package/dist/cases/brownian-sphere.d.ts.map +0 -1
  814. package/dist/cases/brownian-sphere.js +0 -354
  815. package/dist/cases/brownian-sphere.js.map +0 -1
  816. package/dist/cases/damped-resonator.d.ts +0 -23
  817. package/dist/cases/damped-resonator.d.ts.map +0 -1
  818. package/dist/cases/damped-resonator.js +0 -224
  819. package/dist/cases/damped-resonator.js.map +0 -1
  820. package/dist/cases/kepler-rv.d.ts +0 -13
  821. package/dist/cases/kepler-rv.d.ts.map +0 -1
  822. package/dist/cases/kepler-rv.js +0 -172
  823. package/dist/cases/kepler-rv.js.map +0 -1
  824. package/dist/cases/lumped-cooling.d.ts +0 -46
  825. package/dist/cases/lumped-cooling.d.ts.map +0 -1
  826. package/dist/cases/lumped-cooling.js +0 -261
  827. package/dist/cases/lumped-cooling.js.map +0 -1
  828. package/dist/cases/resistor-noise.d.ts +0 -14
  829. package/dist/cases/resistor-noise.d.ts.map +0 -1
  830. package/dist/cases/resistor-noise.js +0 -215
  831. package/dist/cases/resistor-noise.js.map +0 -1
  832. package/dist/cases/skin-depth.d.ts +0 -21
  833. package/dist/cases/skin-depth.d.ts.map +0 -1
  834. package/dist/cases/skin-depth.js +0 -174
  835. package/dist/cases/skin-depth.js.map +0 -1
@@ -23,6 +23,27 @@ export { EngineCapabilityError } from './errors.js';
23
23
  export interface EngineTensor {
24
24
  readonly shape: ReadonlyArray<number>;
25
25
  }
26
+ /**
27
+ * An `EngineTensor` that `@danielsimonjr/mathts-autograd` has wrapped for
28
+ * tracing: a `DualTensor` (forward mode, carries `tangent`) or a
29
+ * `TapedTensor` (reverse mode, carries `tape`). Both implement the traced
30
+ * arithmetic over another wrapped tensor, which is what the engine dispatches
31
+ * to inside an AD call. The autograd package is loaded at that call, so its
32
+ * classes are not named here; this is the shape the package keeps.
33
+ * @internal
34
+ */
35
+ export interface TracedEngineTensor extends EngineTensor {
36
+ readonly tangent?: unknown;
37
+ readonly tape?: unknown;
38
+ add(other: EngineTensor): EngineTensor;
39
+ sub(other: EngineTensor): EngineTensor;
40
+ mul(other: EngineTensor): EngineTensor;
41
+ scale(k: number): EngineTensor;
42
+ }
43
+ /** The AD mode a wrapped tensor carries: `forward` (a `tangent`), `reverse` (a `tape`), or null for a plain tensor. @internal */
44
+ export declare function tracedMode(t: EngineTensor): 'forward' | 'reverse' | null;
45
+ /** Whether `t` is an autograd-wrapped tensor (it carries a `tangent` or a `tape`). @internal */
46
+ export declare function isTracedTensor(t: EngineTensor): t is TracedEngineTensor;
26
47
  /** One contracted index: the two (operand, axis) coordinates that the
27
48
  * Einstein summation pairs and sums over. Named by the public
28
49
  * {@link EinsumSpec}, so it is public too.
@@ -1 +1 @@
1
- {"version":3,"file":"tensor-engine.d.ts","sourceRoot":"","sources":["../../src/numerical/tensor-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tensor-engine.d.ts","sourceRoot":"","sources":["../../src/numerical/tensor-engine.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,18 @@
15
15
  * @public
16
16
  */
17
17
  export { EngineCapabilityError } from './errors.js';
18
+ /** The AD mode a wrapped tensor carries: `forward` (a `tangent`), `reverse` (a `tape`), or null for a plain tensor. @internal */
19
+ export function tracedMode(t) {
20
+ if ('tangent' in t)
21
+ return 'forward';
22
+ if ('tape' in t)
23
+ return 'reverse';
24
+ return null;
25
+ }
26
+ /** Whether `t` is an autograd-wrapped tensor (it carries a `tangent` or a `tape`). @internal */
27
+ export function isTracedTensor(t) {
28
+ return tracedMode(t) !== null;
29
+ }
18
30
  /**
19
31
  * Returns `true` iff the engine implements both `forwardGrad` and `reverseGrad`.
20
32
  * Use this before invoking AD methods so callers get a clear capability signal
@@ -1 +1 @@
1
- {"version":3,"file":"tensor-engine.js","sourceRoot":"","sources":["../../src/numerical/tensor-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH;;;;GAIG;AACH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AA0GpD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,OAAO,OAAO,MAAM,CAAC,WAAW,KAAK,UAAU;WACxC,OAAO,MAAM,CAAC,WAAW,KAAK,UAAU,CAAC;AAClD,CAAC;AAED;;;;gBAIgB;AAChB,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAG,CAA+C,CAAC;IAC1D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3E,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QACtD,MAAM,IAAI,GAAI,CAAwB,CAAC,IAAI,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC5D,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC9D,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;QACjF,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QACtD,MAAM,EAAE,GAAG,CAA0C,CAAC;QACtD,IAAI,OAAO,EAAE,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;IAClF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["/**\n * The TensorEngine contract. `MathTSEngine` implements it. See docs/planning/\n * v0.3.5-Design.md §3, §5.\n *\n * `EngineTensor` is an opaque handle; consumers operate on it only through\n * a TensorEngine. The lowering pass (lowering.ts) builds an `EinsumSpec`\n * from `computeContraction()`'s `contractionPairs` and hands it to\n * `engine.einsum()`.\n *\n * @module numerical/tensor-engine\n */\n\nimport type { NestedArray } from './types.js';\n/**\n * Thrown when an engine does not implement a requested capability.\n *\n * @public\n */\nexport { EngineCapabilityError } from './errors.js';\n\n/** Opaque rank-N tensor handle. Each engine backs it with its own storage\n * (Float64Array, a MathTS Tensor, a future WASM offset); consumers see\n * only the shape.\n * @public */\nexport interface EngineTensor {\n readonly shape: ReadonlyArray<number>;\n}\n\n/** One contracted index: the two (operand, axis) coordinates that the\n * Einstein summation pairs and sums over. Named by the public\n * {@link EinsumSpec}, so it is public too.\n * @public */\nexport interface EinsumContraction {\n readonly pair: readonly [readonly [number, number], readonly [number, number]];\n}\n\n/** One surviving (free) index in the einsum output, in output-axis order:\n * the operand and the axis of that operand it comes from. Exported because\n * the public {@link EinsumSpec} names it (the surface is closed under type\n * references).\n * @public */\nexport interface EinsumFreeAxis {\n readonly operand: number;\n readonly axis: number;\n}\n\n/** The engine-agnostic einsum plan produced by lowering.ts.\n * @public */\nexport interface EinsumSpec {\n readonly contractions: ReadonlyArray<EinsumContraction>;\n readonly free: ReadonlyArray<EinsumFreeAxis>;\n}\n\n/**\n * Result of a forward-mode automatic differentiation pass.\n * `value` is f(x); `jacobian` is the Jacobian of f at x (Jvp with tangent 1).\n * @public\n */\nexport interface ForwardGradResult {\n readonly value: EngineTensor;\n readonly jacobian: EngineTensor;\n}\n\n/**\n * Result of a reverse-mode automatic differentiation pass.\n * `value` is f(x); `gradient` is ∂L/∂x for cotangent dL/df (ones-like by default).\n * @public\n */\nexport interface ReverseGradResult {\n readonly value: EngineTensor;\n readonly gradient: EngineTensor;\n}\n\n/** The compute contract. MathTSEngine implements it.\n * @public */\nexport interface TensorEngine {\n readonly name: string;\n\n fromNested(data: NestedArray, shape: ReadonlyArray<number>): EngineTensor;\n toNested(t: EngineTensor): NestedArray;\n\n einsum(spec: EinsumSpec, ...operands: EngineTensor[]): EngineTensor;\n matMul(a: EngineTensor, b: EngineTensor): EngineTensor;\n transpose(t: EngineTensor, perm?: ReadonlyArray<number>): EngineTensor;\n reshape(t: EngineTensor, shape: ReadonlyArray<number>): EngineTensor;\n\n add(a: EngineTensor, b: EngineTensor): EngineTensor;\n sub(a: EngineTensor, b: EngineTensor): EngineTensor;\n mul(a: EngineTensor, b: EngineTensor): EngineTensor;\n scale(t: EngineTensor, k: number): EngineTensor;\n\n identity(n: number): EngineTensor;\n normInf(t: EngineTensor): number;\n\n /** Optional — no-op for pure-JS engines; a future native engine implements\n * real disposal. evaluateNumerical() never relies on it. */\n dispose?(t: EngineTensor): void;\n\n /**\n * Forward-mode AD (Jacobian-vector product). Always Promise-returning for\n * uniform consumer semantics (S6 reconciliation fix — no T | Promise<T> union).\n * Engines without AD support omit this method; call `hasAutogradSupport(engine)`\n * before invoking.\n * @public\n */\n forwardGrad?(\n fn: (x: EngineTensor) => EngineTensor,\n x: EngineTensor,\n ): Promise<ForwardGradResult>;\n\n /**\n * Reverse-mode AD (vector-Jacobian product). `cotangent` defaults to\n * ones-like(value) when omitted. Always Promise-returning (S6).\n * Engines without AD support omit this method; call `hasAutogradSupport(engine)`\n * before invoking.\n * @public\n */\n reverseGrad?(\n fn: (x: EngineTensor) => EngineTensor,\n x: EngineTensor,\n cotangent?: EngineTensor,\n ): Promise<ReverseGradResult>;\n}\n\n/**\n * Returns `true` iff the engine implements both `forwardGrad` and `reverseGrad`.\n * Use this before invoking AD methods so callers get a clear capability signal\n * rather than a runtime TypeError.\n *\n * @example\n * ```typescript\n * if (!hasAutogradSupport(engine)) {\n * throw new EngineCapabilityError(engine.name, 'forwardGrad');\n * }\n * const { value, jacobian } = await engine.forwardGrad!(fn, x);\n * ```\n * @public\n */\nexport function hasAutogradSupport(engine: TensorEngine): boolean {\n return typeof engine.forwardGrad === 'function'\n && typeof engine.reverseGrad === 'function';\n}\n\n/** Runtime guard for EinsumSpec — validates structure before passing to\n * engine.einsum(). Not called internally by the lowering pass (which builds\n * specs via buildEinsumSpec and trusts the upstream AST validation). Available\n * for consumers who construct EinsumSpec objects directly.\n * @internal */\nexport function isEinsumSpec(x: unknown): x is EinsumSpec {\n if (typeof x !== 'object' || x === null) return false;\n const s = x as { contractions?: unknown; free?: unknown };\n if (!Array.isArray(s.contractions) || !Array.isArray(s.free)) return false;\n for (const c of s.contractions) {\n if (typeof c !== 'object' || c === null) return false;\n const pair = (c as { pair?: unknown }).pair;\n if (!Array.isArray(pair) || pair.length !== 2) return false;\n for (const coord of pair) {\n if (!Array.isArray(coord) || coord.length !== 2) return false;\n if (typeof coord[0] !== 'number' || typeof coord[1] !== 'number') return false;\n }\n }\n for (const f of s.free) {\n if (typeof f !== 'object' || f === null) return false;\n const fa = f as { operand?: unknown; axis?: unknown };\n if (typeof fa.operand !== 'number' || typeof fa.axis !== 'number') return false;\n }\n return true;\n}\n"]}
1
+ {"version":3,"file":"tensor-engine.js","sourceRoot":"","sources":["../../src/numerical/tensor-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH;;;;GAIG;AACH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AA4BpD,iIAAiI;AACjI,MAAM,UAAU,UAAU,CAAC,CAAe;IACxC,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACrC,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAClC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,cAAc,CAAC,CAAe;IAC5C,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AAChC,CAAC;AAkGD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,OAAO,OAAO,MAAM,CAAC,WAAW,KAAK,UAAU;WACxC,OAAO,MAAM,CAAC,WAAW,KAAK,UAAU,CAAC;AAClD,CAAC;AAED;;;;gBAIgB;AAChB,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAG,CAA+C,CAAC;IAC1D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3E,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QACtD,MAAM,IAAI,GAAI,CAAwB,CAAC,IAAI,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC5D,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC9D,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;QACjF,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QACtD,MAAM,EAAE,GAAG,CAA0C,CAAC;QACtD,IAAI,OAAO,EAAE,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;IAClF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["/**\n * The TensorEngine contract. `MathTSEngine` implements it. See docs/planning/\n * v0.3.5-Design.md §3, §5.\n *\n * `EngineTensor` is an opaque handle; consumers operate on it only through\n * a TensorEngine. The lowering pass (lowering.ts) builds an `EinsumSpec`\n * from `computeContraction()`'s `contractionPairs` and hands it to\n * `engine.einsum()`.\n *\n * @module numerical/tensor-engine\n */\n\nimport type { NestedArray } from './types.js';\n/**\n * Thrown when an engine does not implement a requested capability.\n *\n * @public\n */\nexport { EngineCapabilityError } from './errors.js';\n\n/** Opaque rank-N tensor handle. Each engine backs it with its own storage\n * (Float64Array, a MathTS Tensor, a future WASM offset); consumers see\n * only the shape.\n * @public */\nexport interface EngineTensor {\n readonly shape: ReadonlyArray<number>;\n}\n\n/**\n * An `EngineTensor` that `@danielsimonjr/mathts-autograd` has wrapped for\n * tracing: a `DualTensor` (forward mode, carries `tangent`) or a\n * `TapedTensor` (reverse mode, carries `tape`). Both implement the traced\n * arithmetic over another wrapped tensor, which is what the engine dispatches\n * to inside an AD call. The autograd package is loaded at that call, so its\n * classes are not named here; this is the shape the package keeps.\n * @internal\n */\nexport interface TracedEngineTensor extends EngineTensor {\n readonly tangent?: unknown;\n readonly tape?: unknown;\n add(other: EngineTensor): EngineTensor;\n sub(other: EngineTensor): EngineTensor;\n mul(other: EngineTensor): EngineTensor;\n scale(k: number): EngineTensor;\n}\n\n/** The AD mode a wrapped tensor carries: `forward` (a `tangent`), `reverse` (a `tape`), or null for a plain tensor. @internal */\nexport function tracedMode(t: EngineTensor): 'forward' | 'reverse' | null {\n if ('tangent' in t) return 'forward';\n if ('tape' in t) return 'reverse';\n return null;\n}\n\n/** Whether `t` is an autograd-wrapped tensor (it carries a `tangent` or a `tape`). @internal */\nexport function isTracedTensor(t: EngineTensor): t is TracedEngineTensor {\n return tracedMode(t) !== null;\n}\n\n/** One contracted index: the two (operand, axis) coordinates that the\n * Einstein summation pairs and sums over. Named by the public\n * {@link EinsumSpec}, so it is public too.\n * @public */\nexport interface EinsumContraction {\n readonly pair: readonly [readonly [number, number], readonly [number, number]];\n}\n\n/** One surviving (free) index in the einsum output, in output-axis order:\n * the operand and the axis of that operand it comes from. Exported because\n * the public {@link EinsumSpec} names it (the surface is closed under type\n * references).\n * @public */\nexport interface EinsumFreeAxis {\n readonly operand: number;\n readonly axis: number;\n}\n\n/** The engine-agnostic einsum plan produced by lowering.ts.\n * @public */\nexport interface EinsumSpec {\n readonly contractions: ReadonlyArray<EinsumContraction>;\n readonly free: ReadonlyArray<EinsumFreeAxis>;\n}\n\n/**\n * Result of a forward-mode automatic differentiation pass.\n * `value` is f(x); `jacobian` is the Jacobian of f at x (Jvp with tangent 1).\n * @public\n */\nexport interface ForwardGradResult {\n readonly value: EngineTensor;\n readonly jacobian: EngineTensor;\n}\n\n/**\n * Result of a reverse-mode automatic differentiation pass.\n * `value` is f(x); `gradient` is ∂L/∂x for cotangent dL/df (ones-like by default).\n * @public\n */\nexport interface ReverseGradResult {\n readonly value: EngineTensor;\n readonly gradient: EngineTensor;\n}\n\n/** The compute contract. MathTSEngine implements it.\n * @public */\nexport interface TensorEngine {\n readonly name: string;\n\n fromNested(data: NestedArray, shape: ReadonlyArray<number>): EngineTensor;\n toNested(t: EngineTensor): NestedArray;\n\n einsum(spec: EinsumSpec, ...operands: EngineTensor[]): EngineTensor;\n matMul(a: EngineTensor, b: EngineTensor): EngineTensor;\n transpose(t: EngineTensor, perm?: ReadonlyArray<number>): EngineTensor;\n reshape(t: EngineTensor, shape: ReadonlyArray<number>): EngineTensor;\n\n add(a: EngineTensor, b: EngineTensor): EngineTensor;\n sub(a: EngineTensor, b: EngineTensor): EngineTensor;\n mul(a: EngineTensor, b: EngineTensor): EngineTensor;\n scale(t: EngineTensor, k: number): EngineTensor;\n\n identity(n: number): EngineTensor;\n normInf(t: EngineTensor): number;\n\n /** Optional — no-op for pure-JS engines; a future native engine implements\n * real disposal. evaluateNumerical() never relies on it. */\n dispose?(t: EngineTensor): void;\n\n /**\n * Forward-mode AD (Jacobian-vector product). Always Promise-returning for\n * uniform consumer semantics (S6 reconciliation fix — no T | Promise<T> union).\n * Engines without AD support omit this method; call `hasAutogradSupport(engine)`\n * before invoking.\n * @public\n */\n forwardGrad?(\n fn: (x: EngineTensor) => EngineTensor,\n x: EngineTensor,\n ): Promise<ForwardGradResult>;\n\n /**\n * Reverse-mode AD (vector-Jacobian product). `cotangent` defaults to\n * ones-like(value) when omitted. Always Promise-returning (S6).\n * Engines without AD support omit this method; call `hasAutogradSupport(engine)`\n * before invoking.\n * @public\n */\n reverseGrad?(\n fn: (x: EngineTensor) => EngineTensor,\n x: EngineTensor,\n cotangent?: EngineTensor,\n ): Promise<ReverseGradResult>;\n}\n\n/**\n * Returns `true` iff the engine implements both `forwardGrad` and `reverseGrad`.\n * Use this before invoking AD methods so callers get a clear capability signal\n * rather than a runtime TypeError.\n *\n * @example\n * ```typescript\n * if (!hasAutogradSupport(engine)) {\n * throw new EngineCapabilityError(engine.name, 'forwardGrad');\n * }\n * const { value, jacobian } = await engine.forwardGrad!(fn, x);\n * ```\n * @public\n */\nexport function hasAutogradSupport(engine: TensorEngine): boolean {\n return typeof engine.forwardGrad === 'function'\n && typeof engine.reverseGrad === 'function';\n}\n\n/** Runtime guard for EinsumSpec — validates structure before passing to\n * engine.einsum(). Not called internally by the lowering pass (which builds\n * specs via buildEinsumSpec and trusts the upstream AST validation). Available\n * for consumers who construct EinsumSpec objects directly.\n * @internal */\nexport function isEinsumSpec(x: unknown): x is EinsumSpec {\n if (typeof x !== 'object' || x === null) return false;\n const s = x as { contractions?: unknown; free?: unknown };\n if (!Array.isArray(s.contractions) || !Array.isArray(s.free)) return false;\n for (const c of s.contractions) {\n if (typeof c !== 'object' || c === null) return false;\n const pair = (c as { pair?: unknown }).pair;\n if (!Array.isArray(pair) || pair.length !== 2) return false;\n for (const coord of pair) {\n if (!Array.isArray(coord) || coord.length !== 2) return false;\n if (typeof coord[0] !== 'number' || typeof coord[1] !== 'number') return false;\n }\n }\n for (const f of s.free) {\n if (typeof f !== 'object' || f === null) return false;\n const fa = f as { operand?: unknown; axis?: unknown };\n if (typeof fa.operand !== 'number' || typeof fa.axis !== 'number') return false;\n }\n return true;\n}\n"]}
@@ -166,4 +166,14 @@ export interface RegimeBearing {
166
166
  * @internal
167
167
  */
168
168
  export declare function uncoveredRegions(family: string, models: readonly RegimeBearing[], samples: Readonly<Record<string, readonly number[]>>): readonly RegionSample[];
169
+ /**
170
+ * Build a regime from its family, its dimensioned parameters, its dimensionless
171
+ * inputs and its inequalities: the one owner of the literal
172
+ * `{ family, inequalities, groupDefinitions: deriveRegimeGroups(…) }` every
173
+ * atlas model and bridge used to spell out. The groups are derived here, so an
174
+ * inequality names a `PiGroup.formula` of the same dimension matrix.
175
+ *
176
+ * @internal
177
+ */
178
+ export declare function makeRegime(family: string, parameters: readonly DimensionalVariable[], dimensionlessInputs: readonly string[], inequalities: readonly RegimeInequality[]): Regime;
169
179
  //# sourceMappingURL=regime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"regime.d.ts","sourceRoot":"","sources":["../../src/relations/regime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAEjF,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE3D;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,SAAS,mBAAmB,EAAE,EAC1C,mBAAmB,EAAE,SAAS,MAAM,EAAE,GACrC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBzB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC/C,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAChD;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAeD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAC5C,WAAW,CAeb;AAID;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAsB7D;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,SAAS;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,EAAE,CAqB7E;AA8FD,4DAA4D;AAC5D,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE9D;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,aAAa,CAWjE;AAED,qFAAqF;AACrF,MAAM,WAAW,YAAY;IAC3B,kEAAkE;IAClE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAClD;AAED,sFAAsF;AACtF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,GACnD,SAAS,YAAY,EAAE,CAgBzB"}
1
+ {"version":3,"file":"regime.d.ts","sourceRoot":"","sources":["../../src/relations/regime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAEjF,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE3D;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,SAAS,mBAAmB,EAAE,EAC1C,mBAAmB,EAAE,SAAS,MAAM,EAAE,GACrC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBzB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC/C,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAChD;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAeD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAC5C,WAAW,CAeb;AAID;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAsB7D;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,SAAS;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,EAAE,CAqB7E;AA8FD,4DAA4D;AAC5D,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE9D;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,aAAa,CAWjE;AAED,qFAAqF;AACrF,MAAM,WAAW,YAAY;IAC3B,kEAAkE;IAClE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAClD;AAED,sFAAsF;AACtF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,GACnD,SAAS,YAAY,EAAE,CAgBzB;AAiBD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,SAAS,mBAAmB,EAAE,EAC1C,mBAAmB,EAAE,SAAS,MAAM,EAAE,EACtC,YAAY,EAAE,SAAS,gBAAgB,EAAE,GACxC,MAAM,CAMR"}
@@ -12,6 +12,7 @@
12
12
  *
13
13
  * @module relations/regime
14
14
  */
15
+ import { compareCodepoint } from '../core/compare.js';
15
16
  import { buckinghamPi } from '../dimensional/buckingham.js';
16
17
  import { DIMENSIONLESS } from '../dimensional/types.js';
17
18
  /**
@@ -160,7 +161,7 @@ export function collidingRegimeGroups(regimes) {
160
161
  function exponentSignature(group) {
161
162
  return Object.entries(group.exponents)
162
163
  .filter(([, exp]) => exp !== 0)
163
- .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
164
+ .sort(([a], [b]) => compareCodepoint(a, b))
164
165
  .map(([name, exp]) => `${name}:${exp}`)
165
166
  .join(',');
166
167
  }
@@ -313,4 +314,20 @@ function gridPoints(samples) {
313
314
  }
314
315
  return points;
315
316
  }
317
+ /**
318
+ * Build a regime from its family, its dimensioned parameters, its dimensionless
319
+ * inputs and its inequalities: the one owner of the literal
320
+ * `{ family, inequalities, groupDefinitions: deriveRegimeGroups(…) }` every
321
+ * atlas model and bridge used to spell out. The groups are derived here, so an
322
+ * inequality names a `PiGroup.formula` of the same dimension matrix.
323
+ *
324
+ * @internal
325
+ */
326
+ export function makeRegime(family, parameters, dimensionlessInputs, inequalities) {
327
+ return {
328
+ family,
329
+ inequalities,
330
+ groupDefinitions: deriveRegimeGroups(family, parameters, dimensionlessInputs),
331
+ };
332
+ }
316
333
  //# sourceMappingURL=regime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"regime.js","sourceRoot":"","sources":["../../src/relations/regime.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Regime derivation — π-groups as the coordinates a regime is written in.\n *\n * Dimensionless inputs are passed INTO `buckinghamPi` as zero-dimension\n * variables and come back as their own trivial groups, keyed by their own\n * names in `PiGroup.formula`. Nothing is synthesized here. (Measured in\n * design note §10 Q1 by executing `buckinghamPi`; the implementation plan's\n * \"plus one trivial group per dimensionless input\" would double-add.)\n *\n * `admitApproximation` stays in `src/atlas/regime.ts`: it is generic over\n * `AtlasBridge`, and moving it would drag that record into this vocabulary.\n *\n * @module relations/regime\n */\n\nimport { buckinghamPi } from '../dimensional/buckingham.js';\nimport type { DimensionalVariable, PiGroup } from '../dimensional/buckingham.js';\nimport { DIMENSIONLESS } from '../dimensional/types.js';\nimport type { Regime, RegimeInequality } from './types.js';\n\n/**\n * Derive the regime coordinates of a family, keyed by `PiGroup.formula`.\n *\n * A dimensionally-independent set has no groups and yields an empty record.\n *\n * @internal\n */\nexport function deriveRegimeGroups(\n family: string,\n parameters: readonly DimensionalVariable[],\n dimensionlessInputs: readonly string[],\n): Record<string, PiGroup> {\n const variables: DimensionalVariable[] = [\n ...parameters,\n ...dimensionlessInputs.map((name) => ({ name, dim: DIMENSIONLESS })),\n ];\n if (variables.length === 0) {\n throw new Error(`deriveRegimeGroups(${family}) requires at least one variable`);\n }\n // buckinghamPi rejects duplicate names itself; the message is clearer here.\n const names = variables.map((v) => v.name);\n if (new Set(names).size !== names.length) {\n throw new Error(\n `deriveRegimeGroups(${family}) requires unique names across parameters and ` +\n `dimensionless inputs; got [${names.join(', ')}]`,\n );\n }\n const groups: Record<string, PiGroup> = {};\n for (const group of buckinghamPi(variables).piGroups) groups[group.formula] = group;\n return groups;\n}\n\n/**\n * Result of {@link regimeHolds} — TRI-STATE, not a boolean.\n *\n * Design note §1, Adam A2 RED #2. The first draft of this rule returned a\n * boolean and folded \"could not check\" into one of the two answers. Both\n * foldings are wrong in a way that is invisible at the call site:\n *\n * - Folding absence into `true` is a SILENT PASS. A caller who supplies\n * `{ Ma: 0.1 }` and never computes `Re` gets a confident \"the regime\n * holds\" while `Re = 50` grossly violates it. The omission of the very\n * data that would reveal the violation is what produces the pass.\n * - Folding absence into `false` reports a VIOLATION that was never\n * observed, which is a different false claim and destroys the caller's\n * ability to tell \"I measured this and it failed\" from \"I never measured\n * this\". Only the first licenses saying the regime is violated.\n *\n * So `ok` carries three answers and the two failure sets are kept apart.\n *\n * @public\n */\nexport interface RegimeCheck {\n /**\n * `true` — every inequality was CHECKED and satisfied.\n * `false` — at least one was checked and VIOLATED.\n * `'unknown'` — nothing was violated, but at least one could NOT be checked.\n *\n * `'unknown'` is a failure to confirm validity, NEVER validity. A caller\n * asking \"may I use this model here?\" must test `=== true`; `!== false` is\n * the silent pass this type exists to prevent.\n */\n readonly ok: boolean | 'unknown';\n /** CHECKED and violated — carried whole so the caller can name them. */\n readonly violated: readonly RegimeInequality[];\n /** NOT checked: the π-group value was absent or non-finite. */\n readonly unchecked: readonly RegimeInequality[];\n /**\n * How many inequalities a finite value reached. `ok: true` with\n * `checked: 0` is a VACUOUS pass: the regime states no inequality (the\n * plasma, piezoelectricity and Tolman registrations), so nothing was\n * checked and nothing held. That is a different fact from a pass over a\n * non-empty list, and a coverage count must not add it (AGENTS law 4).\n */\n readonly checked: number;\n}\n\nfunction satisfies(value: number, ineq: RegimeInequality): boolean {\n switch (ineq.op) {\n case '<':\n return value < ineq.bound;\n case '<=':\n return value <= ineq.bound;\n case '>':\n return value > ineq.bound;\n case '>=':\n return value >= ineq.bound;\n }\n}\n\n/**\n * Check a regime against measured group values.\n *\n * A group with no supplied value, or a non-finite one, is UNCHECKED — not\n * violated and not satisfied. See {@link RegimeCheck} for why the distinction\n * is load-bearing. A regime with no inequalities returns `true` with\n * `checked: 0`: there was nothing to check and nothing went unchecked, so the\n * claim \"every inequality was checked and satisfied\" is vacuously true rather\n * than unknown, and `checked` says that nothing was checked. A caller that\n * counts coverage reads `checked`, never `ok` alone.\n *\n * A violation outranks an absence: once one inequality is CHECKED and fails,\n * the regime does not hold, whatever the unmeasured coordinates would say.\n *\n * @public\n */\nexport function regimeHolds(\n regime: Regime,\n groupValues: Readonly<Record<string, number>>,\n): RegimeCheck {\n const violated: RegimeInequality[] = [];\n const unchecked: RegimeInequality[] = [];\n let checked = 0;\n for (const ineq of regime.inequalities) {\n const value = groupValues[ineq.group];\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n unchecked.push(ineq);\n continue;\n }\n checked += 1;\n if (!satisfies(value, ineq)) violated.push(ineq);\n }\n const ok = violated.length > 0 ? false : unchecked.length > 0 ? 'unknown' : true;\n return { ok, violated, unchecked, checked };\n}\n\n// ── Sprint 2: regime algebra and admission ──────────────────────────────────\n\n/**\n * Merge two regimes into the regime that holds where BOTH hold.\n *\n * The conjunction is the whole operation: an inequality from either side is an\n * inequality of the intersection, so the list is concatenated rather than\n * reduced. No attempt is made to simplify `x < 1` and `x < 2` into one\n * inequality — the redundant one is still true, and a simplifier that dropped\n * the wrong one would be a silent change of claim.\n *\n * `groupDefinitions` are merged and CHECKED, not overwritten. Two regimes that\n * key the same `PiGroup.formula` to different exponent vectors are not\n * traceable to one dimension matrix, and quietly keeping one would hand the\n * caller a regime whose group definitions no longer describe its inequalities.\n *\n * @throws Error if the families differ, or if a shared group name carries\n * conflicting definitions.\n * @internal\n */\nexport function intersectRegimes(a: Regime, b: Regime): Regime {\n if (a.family !== b.family) {\n throw new Error(\n `intersectRegimes: families differ ('${a.family}' vs '${b.family}'); ` +\n 'a regime is stated in the groups of its own family',\n );\n }\n const groupDefinitions: Record<string, PiGroup> = { ...a.groupDefinitions };\n for (const [name, group] of Object.entries(b.groupDefinitions)) {\n const existing = groupDefinitions[name];\n if (existing !== undefined && !samePiGroup(existing, group)) {\n throw new Error(\n `intersectRegimes: group '${name}' is defined differently in the two regimes`,\n );\n }\n groupDefinitions[name] = group;\n }\n return {\n family: a.family,\n inequalities: [...a.inequalities, ...b.inequalities],\n groupDefinitions,\n };\n}\n\n/**\n * Group names whose π-groups differ across `regimes`. The path command leaves\n * those names unchecked on every step that defines them. It does not call\n * {@link intersectRegimes}: that function still throws when the families differ.\n *\n * The same key with the same exponent vector is not a collision. A zero\n * exponent is ignored, matching `--at` derivation.\n *\n * @internal\n */\nexport function collidingRegimeGroups(\n regimes: readonly Regime[],\n): readonly { readonly group: string; readonly families: readonly string[] }[] {\n const seen = new Map<string, { sig: string; families: string[] }>();\n const collisions = new Map<string, string[]>();\n for (const regime of regimes) {\n for (const [name, group] of Object.entries(regime.groupDefinitions)) {\n const sig = exponentSignature(group);\n const prev = seen.get(name);\n if (prev === undefined) {\n seen.set(name, { sig, families: [regime.family] });\n continue;\n }\n if (prev.sig === sig) {\n if (!prev.families.includes(regime.family)) prev.families.push(regime.family);\n continue;\n }\n const families = collisions.get(name) ?? [...prev.families];\n if (!families.includes(regime.family)) families.push(regime.family);\n collisions.set(name, families);\n }\n }\n return [...collisions.entries()].map(([group, families]) => ({ group, families }));\n}\n\nfunction exponentSignature(group: PiGroup): string {\n return Object.entries(group.exponents)\n .filter(([, exp]) => exp !== 0)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([name, exp]) => `${name}:${exp}`)\n .join(',');\n}\n\nfunction samePiGroup(x: PiGroup, y: PiGroup): boolean {\n const names = new Set([...Object.keys(x.exponents), ...Object.keys(y.exponents)]);\n for (const name of names) {\n if ((x.exponents[name] ?? 0) !== (y.exponents[name] ?? 0)) return false;\n }\n return true;\n}\n\n/** A closed-or-open interval on one π-group. Unbounded ends are ±Infinity. */\ninterface GroupInterval {\n lo: number;\n loOpen: boolean;\n hi: number;\n hiOpen: boolean;\n}\n\nfunction fullInterval(): GroupInterval {\n return { lo: -Infinity, loOpen: true, hi: Infinity, hiOpen: true };\n}\n\n/** Narrow `iv` in place by one inequality. */\nfunction narrow(iv: GroupInterval, ineq: RegimeInequality): void {\n switch (ineq.op) {\n case '<':\n case '<=': {\n const open = ineq.op === '<';\n if (ineq.bound < iv.hi || (ineq.bound === iv.hi && open)) {\n iv.hi = ineq.bound;\n iv.hiOpen = open;\n }\n return;\n }\n case '>':\n case '>=': {\n const open = ineq.op === '>';\n if (ineq.bound > iv.lo || (ineq.bound === iv.lo && open)) {\n iv.lo = ineq.bound;\n iv.loOpen = open;\n }\n return;\n }\n }\n}\n\n/** The per-group intervals the inequalities of a regime carve out. */\nfunction intervalsOf(regime: Regime): Map<string, GroupInterval> {\n const out = new Map<string, GroupInterval>();\n for (const ineq of regime.inequalities) {\n let iv = out.get(ineq.group);\n if (iv === undefined) {\n iv = fullInterval();\n out.set(ineq.group, iv);\n }\n narrow(iv, ineq);\n }\n return out;\n}\n\nfunction isEmpty(iv: GroupInterval): boolean {\n if (iv.lo > iv.hi) return true;\n return iv.lo === iv.hi && (iv.loOpen || iv.hiOpen);\n}\n\nfunction intersectIntervals(x: GroupInterval, y: GroupInterval): GroupInterval {\n const lo = Math.max(x.lo, y.lo);\n const hi = Math.min(x.hi, y.hi);\n return {\n lo,\n loOpen: (x.lo === lo && x.loOpen) || (y.lo === lo && y.loOpen),\n hi,\n hiOpen: (x.hi === hi && x.hiOpen) || (y.hi === hi && y.hiOpen),\n };\n}\n\n/** Is every point of `inner` a point of `outer`? */\nfunction contains(outer: GroupInterval, inner: GroupInterval): boolean {\n if (isEmpty(inner)) return true;\n const loOk =\n outer.lo < inner.lo || (outer.lo === inner.lo && (!outer.loOpen || inner.loOpen));\n const hiOk =\n outer.hi > inner.hi || (outer.hi === inner.hi && (!outer.hiOpen || inner.hiOpen));\n return loOk && hiOk;\n}\n\n/** How two regimes sit relative to each other. @internal */\nexport type RegimeOverlap = 'disjoint' | 'overlap' | 'nested';\n\n/**\n * Classify two regimes on the group names they SHARE.\n *\n * Shared names only, and that restriction is the whole subtlety. A group one\n * regime constrains and the other says nothing about cannot separate them:\n * silence is not a constraint, so treating the unconstrained side as empty\n * would report `'disjoint'` for two regimes that genuinely overlap. The answer\n * is therefore about the shared coordinates, and says nothing about the\n * private ones.\n *\n * - `'disjoint'` — some shared group has intervals that cannot both hold.\n * - `'nested'` — the shared box of one regime contains the other (equal boxes,\n * and the no-shared-group case, are nested: each contains the other).\n * - `'overlap'` — they meet, and neither contains the other.\n *\n * @internal\n */\nexport function regimeOverlap(a: Regime, b: Regime): RegimeOverlap {\n const ia = intervalsOf(a);\n const ib = intervalsOf(b);\n const shared = [...ia.keys()].filter((name) => ib.has(name));\n\n for (const name of shared) {\n if (isEmpty(intersectIntervals(ia.get(name)!, ib.get(name)!))) return 'disjoint';\n }\n const aInB = shared.every((name) => contains(ib.get(name)!, ia.get(name)!));\n const bInA = shared.every((name) => contains(ia.get(name)!, ib.get(name)!));\n return aInB || bInA ? 'nested' : 'overlap';\n}\n\n/** One grid cell of a sampled group box, and the regimes that cover it. @internal */\nexport interface RegionSample {\n /** The π-group value at this cell, keyed by `PiGroup.formula`. */\n readonly point: Readonly<Record<string, number>>;\n}\n\n/** A record carrying a regime — `AtlasModel` and `AtlasBridge` both fit. @internal */\nexport interface RegimeBearing {\n readonly id: string;\n readonly regime: Regime;\n}\n\n/**\n * Grid-sample a group box and list the cells no regime covers.\n *\n * `samples` IS the box: one explicit axis of values per π-group name. The box\n * is not derived from the bounds the regimes themselves carry, and that is\n * deliberate — a synthesized box would report coverage against an extent this\n * library invented, so \"uncovered\" would measure the guess rather than the\n * atlas. The caller states where it wants to know about.\n *\n * COVERED means some regime returned `true` with at least one inequality\n * checked. An `'unknown'` is NOT coverage, by the same rule that makes\n * {@link regimeHolds} tri-state: a regime whose groups the sample axes never\n * mention has not been shown to apply anywhere. Neither is a vacuous pass: a\n * regime that states no inequality has checked nothing at the point.\n *\n * Records of another family are skipped, so a mixed list is safe to pass.\n *\n * @internal\n */\nexport function uncoveredRegions(\n family: string,\n models: readonly RegimeBearing[],\n samples: Readonly<Record<string, readonly number[]>>,\n): readonly RegionSample[] {\n const inFamily = models.filter((m) => m.regime.family === family);\n const uncovered: RegionSample[] = [];\n for (const point of gridPoints(samples)) {\n // `checked > 0`: a regime with no inequality passes vacuously and has shown\n // nothing about this point, so it covers nothing (the rule in `regimeHolds`'s\n // doc comment: coverage reads `checked`, never `ok` alone).\n const covered = inFamily.some((m) => {\n const check = regimeHolds(m.regime, point);\n return check.ok === true && check.checked > 0;\n });\n // An uncovered cell is covered by nothing, by definition; the sample\n // carries the point and no list that could only ever be empty.\n if (!covered) uncovered.push({ point });\n }\n return uncovered;\n}\n\n/** Cartesian product of the named axes. An axis with no values yields nothing. */\nfunction gridPoints(\n samples: Readonly<Record<string, readonly number[]>>,\n): readonly Record<string, number>[] {\n let points: Record<string, number>[] = [{}];\n for (const [group, axis] of Object.entries(samples)) {\n const next: Record<string, number>[] = [];\n for (const base of points) {\n for (const value of axis) next.push({ ...base, [group]: value });\n }\n points = next;\n }\n return points;\n}\n"]}
1
+ {"version":3,"file":"regime.js","sourceRoot":"","sources":["../../src/relations/regime.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Regime derivation — π-groups as the coordinates a regime is written in.\n *\n * Dimensionless inputs are passed INTO `buckinghamPi` as zero-dimension\n * variables and come back as their own trivial groups, keyed by their own\n * names in `PiGroup.formula`. Nothing is synthesized here. (Measured in\n * design note §10 Q1 by executing `buckinghamPi`; the implementation plan's\n * \"plus one trivial group per dimensionless input\" would double-add.)\n *\n * `admitApproximation` stays in `src/atlas/regime.ts`: it is generic over\n * `AtlasBridge`, and moving it would drag that record into this vocabulary.\n *\n * @module relations/regime\n */\n\nimport { compareCodepoint } from '../core/compare.js';\nimport { buckinghamPi } from '../dimensional/buckingham.js';\nimport type { DimensionalVariable, PiGroup } from '../dimensional/buckingham.js';\nimport { DIMENSIONLESS } from '../dimensional/types.js';\nimport type { Regime, RegimeInequality } from './types.js';\n\n/**\n * Derive the regime coordinates of a family, keyed by `PiGroup.formula`.\n *\n * A dimensionally-independent set has no groups and yields an empty record.\n *\n * @internal\n */\nexport function deriveRegimeGroups(\n family: string,\n parameters: readonly DimensionalVariable[],\n dimensionlessInputs: readonly string[],\n): Record<string, PiGroup> {\n const variables: DimensionalVariable[] = [\n ...parameters,\n ...dimensionlessInputs.map((name) => ({ name, dim: DIMENSIONLESS })),\n ];\n if (variables.length === 0) {\n throw new Error(`deriveRegimeGroups(${family}) requires at least one variable`);\n }\n // buckinghamPi rejects duplicate names itself; the message is clearer here.\n const names = variables.map((v) => v.name);\n if (new Set(names).size !== names.length) {\n throw new Error(\n `deriveRegimeGroups(${family}) requires unique names across parameters and ` +\n `dimensionless inputs; got [${names.join(', ')}]`,\n );\n }\n const groups: Record<string, PiGroup> = {};\n for (const group of buckinghamPi(variables).piGroups) groups[group.formula] = group;\n return groups;\n}\n\n/**\n * Result of {@link regimeHolds} — TRI-STATE, not a boolean.\n *\n * Design note §1, Adam A2 RED #2. The first draft of this rule returned a\n * boolean and folded \"could not check\" into one of the two answers. Both\n * foldings are wrong in a way that is invisible at the call site:\n *\n * - Folding absence into `true` is a SILENT PASS. A caller who supplies\n * `{ Ma: 0.1 }` and never computes `Re` gets a confident \"the regime\n * holds\" while `Re = 50` grossly violates it. The omission of the very\n * data that would reveal the violation is what produces the pass.\n * - Folding absence into `false` reports a VIOLATION that was never\n * observed, which is a different false claim and destroys the caller's\n * ability to tell \"I measured this and it failed\" from \"I never measured\n * this\". Only the first licenses saying the regime is violated.\n *\n * So `ok` carries three answers and the two failure sets are kept apart.\n *\n * @public\n */\nexport interface RegimeCheck {\n /**\n * `true` — every inequality was CHECKED and satisfied.\n * `false` — at least one was checked and VIOLATED.\n * `'unknown'` — nothing was violated, but at least one could NOT be checked.\n *\n * `'unknown'` is a failure to confirm validity, NEVER validity. A caller\n * asking \"may I use this model here?\" must test `=== true`; `!== false` is\n * the silent pass this type exists to prevent.\n */\n readonly ok: boolean | 'unknown';\n /** CHECKED and violated — carried whole so the caller can name them. */\n readonly violated: readonly RegimeInequality[];\n /** NOT checked: the π-group value was absent or non-finite. */\n readonly unchecked: readonly RegimeInequality[];\n /**\n * How many inequalities a finite value reached. `ok: true` with\n * `checked: 0` is a VACUOUS pass: the regime states no inequality (the\n * plasma, piezoelectricity and Tolman registrations), so nothing was\n * checked and nothing held. That is a different fact from a pass over a\n * non-empty list, and a coverage count must not add it (AGENTS law 4).\n */\n readonly checked: number;\n}\n\nfunction satisfies(value: number, ineq: RegimeInequality): boolean {\n switch (ineq.op) {\n case '<':\n return value < ineq.bound;\n case '<=':\n return value <= ineq.bound;\n case '>':\n return value > ineq.bound;\n case '>=':\n return value >= ineq.bound;\n }\n}\n\n/**\n * Check a regime against measured group values.\n *\n * A group with no supplied value, or a non-finite one, is UNCHECKED — not\n * violated and not satisfied. See {@link RegimeCheck} for why the distinction\n * is load-bearing. A regime with no inequalities returns `true` with\n * `checked: 0`: there was nothing to check and nothing went unchecked, so the\n * claim \"every inequality was checked and satisfied\" is vacuously true rather\n * than unknown, and `checked` says that nothing was checked. A caller that\n * counts coverage reads `checked`, never `ok` alone.\n *\n * A violation outranks an absence: once one inequality is CHECKED and fails,\n * the regime does not hold, whatever the unmeasured coordinates would say.\n *\n * @public\n */\nexport function regimeHolds(\n regime: Regime,\n groupValues: Readonly<Record<string, number>>,\n): RegimeCheck {\n const violated: RegimeInequality[] = [];\n const unchecked: RegimeInequality[] = [];\n let checked = 0;\n for (const ineq of regime.inequalities) {\n const value = groupValues[ineq.group];\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n unchecked.push(ineq);\n continue;\n }\n checked += 1;\n if (!satisfies(value, ineq)) violated.push(ineq);\n }\n const ok = violated.length > 0 ? false : unchecked.length > 0 ? 'unknown' : true;\n return { ok, violated, unchecked, checked };\n}\n\n// ── Sprint 2: regime algebra and admission ──────────────────────────────────\n\n/**\n * Merge two regimes into the regime that holds where BOTH hold.\n *\n * The conjunction is the whole operation: an inequality from either side is an\n * inequality of the intersection, so the list is concatenated rather than\n * reduced. No attempt is made to simplify `x < 1` and `x < 2` into one\n * inequality — the redundant one is still true, and a simplifier that dropped\n * the wrong one would be a silent change of claim.\n *\n * `groupDefinitions` are merged and CHECKED, not overwritten. Two regimes that\n * key the same `PiGroup.formula` to different exponent vectors are not\n * traceable to one dimension matrix, and quietly keeping one would hand the\n * caller a regime whose group definitions no longer describe its inequalities.\n *\n * @throws Error if the families differ, or if a shared group name carries\n * conflicting definitions.\n * @internal\n */\nexport function intersectRegimes(a: Regime, b: Regime): Regime {\n if (a.family !== b.family) {\n throw new Error(\n `intersectRegimes: families differ ('${a.family}' vs '${b.family}'); ` +\n 'a regime is stated in the groups of its own family',\n );\n }\n const groupDefinitions: Record<string, PiGroup> = { ...a.groupDefinitions };\n for (const [name, group] of Object.entries(b.groupDefinitions)) {\n const existing = groupDefinitions[name];\n if (existing !== undefined && !samePiGroup(existing, group)) {\n throw new Error(\n `intersectRegimes: group '${name}' is defined differently in the two regimes`,\n );\n }\n groupDefinitions[name] = group;\n }\n return {\n family: a.family,\n inequalities: [...a.inequalities, ...b.inequalities],\n groupDefinitions,\n };\n}\n\n/**\n * Group names whose π-groups differ across `regimes`. The path command leaves\n * those names unchecked on every step that defines them. It does not call\n * {@link intersectRegimes}: that function still throws when the families differ.\n *\n * The same key with the same exponent vector is not a collision. A zero\n * exponent is ignored, matching `--at` derivation.\n *\n * @internal\n */\nexport function collidingRegimeGroups(\n regimes: readonly Regime[],\n): readonly { readonly group: string; readonly families: readonly string[] }[] {\n const seen = new Map<string, { sig: string; families: string[] }>();\n const collisions = new Map<string, string[]>();\n for (const regime of regimes) {\n for (const [name, group] of Object.entries(regime.groupDefinitions)) {\n const sig = exponentSignature(group);\n const prev = seen.get(name);\n if (prev === undefined) {\n seen.set(name, { sig, families: [regime.family] });\n continue;\n }\n if (prev.sig === sig) {\n if (!prev.families.includes(regime.family)) prev.families.push(regime.family);\n continue;\n }\n const families = collisions.get(name) ?? [...prev.families];\n if (!families.includes(regime.family)) families.push(regime.family);\n collisions.set(name, families);\n }\n }\n return [...collisions.entries()].map(([group, families]) => ({ group, families }));\n}\n\nfunction exponentSignature(group: PiGroup): string {\n return Object.entries(group.exponents)\n .filter(([, exp]) => exp !== 0)\n .sort(([a], [b]) => compareCodepoint(a, b))\n .map(([name, exp]) => `${name}:${exp}`)\n .join(',');\n}\n\nfunction samePiGroup(x: PiGroup, y: PiGroup): boolean {\n const names = new Set([...Object.keys(x.exponents), ...Object.keys(y.exponents)]);\n for (const name of names) {\n if ((x.exponents[name] ?? 0) !== (y.exponents[name] ?? 0)) return false;\n }\n return true;\n}\n\n/** A closed-or-open interval on one π-group. Unbounded ends are ±Infinity. */\ninterface GroupInterval {\n lo: number;\n loOpen: boolean;\n hi: number;\n hiOpen: boolean;\n}\n\nfunction fullInterval(): GroupInterval {\n return { lo: -Infinity, loOpen: true, hi: Infinity, hiOpen: true };\n}\n\n/** Narrow `iv` in place by one inequality. */\nfunction narrow(iv: GroupInterval, ineq: RegimeInequality): void {\n switch (ineq.op) {\n case '<':\n case '<=': {\n const open = ineq.op === '<';\n if (ineq.bound < iv.hi || (ineq.bound === iv.hi && open)) {\n iv.hi = ineq.bound;\n iv.hiOpen = open;\n }\n return;\n }\n case '>':\n case '>=': {\n const open = ineq.op === '>';\n if (ineq.bound > iv.lo || (ineq.bound === iv.lo && open)) {\n iv.lo = ineq.bound;\n iv.loOpen = open;\n }\n return;\n }\n }\n}\n\n/** The per-group intervals the inequalities of a regime carve out. */\nfunction intervalsOf(regime: Regime): Map<string, GroupInterval> {\n const out = new Map<string, GroupInterval>();\n for (const ineq of regime.inequalities) {\n let iv = out.get(ineq.group);\n if (iv === undefined) {\n iv = fullInterval();\n out.set(ineq.group, iv);\n }\n narrow(iv, ineq);\n }\n return out;\n}\n\nfunction isEmpty(iv: GroupInterval): boolean {\n if (iv.lo > iv.hi) return true;\n return iv.lo === iv.hi && (iv.loOpen || iv.hiOpen);\n}\n\nfunction intersectIntervals(x: GroupInterval, y: GroupInterval): GroupInterval {\n const lo = Math.max(x.lo, y.lo);\n const hi = Math.min(x.hi, y.hi);\n return {\n lo,\n loOpen: (x.lo === lo && x.loOpen) || (y.lo === lo && y.loOpen),\n hi,\n hiOpen: (x.hi === hi && x.hiOpen) || (y.hi === hi && y.hiOpen),\n };\n}\n\n/** Is every point of `inner` a point of `outer`? */\nfunction contains(outer: GroupInterval, inner: GroupInterval): boolean {\n if (isEmpty(inner)) return true;\n const loOk =\n outer.lo < inner.lo || (outer.lo === inner.lo && (!outer.loOpen || inner.loOpen));\n const hiOk =\n outer.hi > inner.hi || (outer.hi === inner.hi && (!outer.hiOpen || inner.hiOpen));\n return loOk && hiOk;\n}\n\n/** How two regimes sit relative to each other. @internal */\nexport type RegimeOverlap = 'disjoint' | 'overlap' | 'nested';\n\n/**\n * Classify two regimes on the group names they SHARE.\n *\n * Shared names only, and that restriction is the whole subtlety. A group one\n * regime constrains and the other says nothing about cannot separate them:\n * silence is not a constraint, so treating the unconstrained side as empty\n * would report `'disjoint'` for two regimes that genuinely overlap. The answer\n * is therefore about the shared coordinates, and says nothing about the\n * private ones.\n *\n * - `'disjoint'` — some shared group has intervals that cannot both hold.\n * - `'nested'` — the shared box of one regime contains the other (equal boxes,\n * and the no-shared-group case, are nested: each contains the other).\n * - `'overlap'` — they meet, and neither contains the other.\n *\n * @internal\n */\nexport function regimeOverlap(a: Regime, b: Regime): RegimeOverlap {\n const ia = intervalsOf(a);\n const ib = intervalsOf(b);\n const shared = [...ia.keys()].filter((name) => ib.has(name));\n\n for (const name of shared) {\n if (isEmpty(intersectIntervals(ia.get(name)!, ib.get(name)!))) return 'disjoint';\n }\n const aInB = shared.every((name) => contains(ib.get(name)!, ia.get(name)!));\n const bInA = shared.every((name) => contains(ia.get(name)!, ib.get(name)!));\n return aInB || bInA ? 'nested' : 'overlap';\n}\n\n/** One grid cell of a sampled group box, and the regimes that cover it. @internal */\nexport interface RegionSample {\n /** The π-group value at this cell, keyed by `PiGroup.formula`. */\n readonly point: Readonly<Record<string, number>>;\n}\n\n/** A record carrying a regime — `AtlasModel` and `AtlasBridge` both fit. @internal */\nexport interface RegimeBearing {\n readonly id: string;\n readonly regime: Regime;\n}\n\n/**\n * Grid-sample a group box and list the cells no regime covers.\n *\n * `samples` IS the box: one explicit axis of values per π-group name. The box\n * is not derived from the bounds the regimes themselves carry, and that is\n * deliberate — a synthesized box would report coverage against an extent this\n * library invented, so \"uncovered\" would measure the guess rather than the\n * atlas. The caller states where it wants to know about.\n *\n * COVERED means some regime returned `true` with at least one inequality\n * checked. An `'unknown'` is NOT coverage, by the same rule that makes\n * {@link regimeHolds} tri-state: a regime whose groups the sample axes never\n * mention has not been shown to apply anywhere. Neither is a vacuous pass: a\n * regime that states no inequality has checked nothing at the point.\n *\n * Records of another family are skipped, so a mixed list is safe to pass.\n *\n * @internal\n */\nexport function uncoveredRegions(\n family: string,\n models: readonly RegimeBearing[],\n samples: Readonly<Record<string, readonly number[]>>,\n): readonly RegionSample[] {\n const inFamily = models.filter((m) => m.regime.family === family);\n const uncovered: RegionSample[] = [];\n for (const point of gridPoints(samples)) {\n // `checked > 0`: a regime with no inequality passes vacuously and has shown\n // nothing about this point, so it covers nothing (the rule in `regimeHolds`'s\n // doc comment: coverage reads `checked`, never `ok` alone).\n const covered = inFamily.some((m) => {\n const check = regimeHolds(m.regime, point);\n return check.ok === true && check.checked > 0;\n });\n // An uncovered cell is covered by nothing, by definition; the sample\n // carries the point and no list that could only ever be empty.\n if (!covered) uncovered.push({ point });\n }\n return uncovered;\n}\n\n/** Cartesian product of the named axes. An axis with no values yields nothing. */\nfunction gridPoints(\n samples: Readonly<Record<string, readonly number[]>>,\n): readonly Record<string, number>[] {\n let points: Record<string, number>[] = [{}];\n for (const [group, axis] of Object.entries(samples)) {\n const next: Record<string, number>[] = [];\n for (const base of points) {\n for (const value of axis) next.push({ ...base, [group]: value });\n }\n points = next;\n }\n return points;\n}\n\n/**\n * Build a regime from its family, its dimensioned parameters, its dimensionless\n * inputs and its inequalities: the one owner of the literal\n * `{ family, inequalities, groupDefinitions: deriveRegimeGroups(…) }` every\n * atlas model and bridge used to spell out. The groups are derived here, so an\n * inequality names a `PiGroup.formula` of the same dimension matrix.\n *\n * @internal\n */\nexport function makeRegime(\n family: string,\n parameters: readonly DimensionalVariable[],\n dimensionlessInputs: readonly string[],\n inequalities: readonly RegimeInequality[],\n): Regime {\n return {\n family,\n inequalities,\n groupDefinitions: deriveRegimeGroups(family, parameters, dimensionlessInputs),\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "universal-physics-tensor",
3
- "version": "10.0.0",
3
+ "version": "12.0.0",
4
4
  "description": "Computational framework for exploring unified physics through tensor formalism",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -98,26 +98,23 @@
98
98
  },
99
99
  "homepage": "https://github.com/danielsimonjr/Universal-Physics-Tensor#readme",
100
100
  "dependencies": {
101
- "@danielsimonjr/mathts-autograd": "^0.3.16",
102
- "@danielsimonjr/mathts-core": "^0.16.0",
103
- "@danielsimonjr/mathts-expression": "^0.10.0",
104
- "@danielsimonjr/mathts-functions": "^0.68.0",
105
- "@danielsimonjr/mathts-matrix": "^0.7.6",
106
- "@danielsimonjr/mathts-parallel": "^0.6.8",
107
- "@danielsimonjr/mathts-tensor": "^0.2.22",
108
- "@danielsimonjr/mathts-wasm": "^0.3.0",
109
- "@danielsimonjr/mathts-workerpool": "^0.2.6"
101
+ "@danielsimonjr/mathts-autograd": "^0.4.1",
102
+ "@danielsimonjr/mathts-core": "^0.22.0",
103
+ "@danielsimonjr/mathts-expression": "^0.12.2",
104
+ "@danielsimonjr/mathts-functions": "^0.73.0",
105
+ "@danielsimonjr/mathts-matrix": "^0.9.1",
106
+ "@danielsimonjr/mathts-tensor": "^0.3.1"
110
107
  },
111
108
  "devDependencies": {
112
109
  "@types/node": "^22.0.0",
113
- "@vitest/coverage-v8": "^4.1.7",
110
+ "@vitest/coverage-v8": "^4.1.12",
114
111
  "@viz-js/viz": "^3.28.0",
115
112
  "fast-check": "^4.8.0",
116
113
  "js-yaml": "^5.0.0",
117
114
  "tree-sitter": "0.22.4",
118
115
  "tree-sitter-typescript": "0.23.2",
119
116
  "typescript": "^7.0.2",
120
- "vitest": "^4.1.7"
117
+ "vitest": "^4.1.12"
121
118
  },
122
119
  "peerDependencies": {
123
120
  "@viz-js/viz": "^3.28.0"
@@ -1,68 +0,0 @@
1
- import { type AppliedCase } from './types.js';
2
- /** Standard gravity (CGPM 1901), for the sedimentation speed. @internal */
3
- export declare const G_STANDARD = 9.80665;
4
- /** The thresholds `ab-stokes-einstein` states: Re ≤ 0.1 and τ_p/t ≤ 0.01. @internal */
5
- export declare const MAX_RE = 0.1;
6
- export declare const MAX_TAU_P_RATIO = 0.01;
7
- /** Ceiling on the memory term's own share of the MSD, |MSD_H/MSD_OU − 1|. @internal */
8
- export declare const MAX_MEMORY_CORRECTION = 0.01;
9
- /** (v_s t)²/(2Dt) ceiling along gravity when the vertical axis is tracked. @internal */
10
- export declare const MAX_DRIFT_RATIO = 0.01;
11
- /** Ceiling on |MSD/MSD_wall − 1|: the wall's correction to the tracked MSD is negligible. @internal */
12
- export declare const MAX_WALL_CORRECTION = 0.01;
13
- /** Ceiling on the last retained Faxén term (a/h)⁵/16 over the series' value. @internal */
14
- export declare const MAX_FAXEN_LAST_TERM = 0.01;
15
- /** Ceiling on √(2 D_⊥ t)/(h − a): the height, and so D_∥ and D_⊥, barely change over t. @internal */
16
- export declare const MAX_WALL_EXCURSION = 0.1;
17
- /** t − τ(1 − e^{−t/τ}) in units of τ, i.e. x − (1 − e^{−x}), without its cancellation at small x. @internal */
18
- export declare function ballisticDeficit(x: number): number;
19
- /**
20
- * MSD/(2Dt) per axis for a sphere with fluid inertia: added mass and the Basset
21
- * memory force, in an unbounded incompressible fluid, velocities in equilibrium.
22
- *
23
- * The velocity autocorrelation has the Laplace transform
24
- * Ĉ(s) = k_BT/(M s + γ(1 + √(s τ_f))), M = m + m_f/2, from the frequency-dependent
25
- * Stokes drag γ(1 + √(sτ_f)) + s m_f/2 (Stokes 1851; the Basset 1888 term is its
26
- * √s part; Hinch 1975, J. Fluid Mech. 72, 499; Clercx & Schram 1992, Phys. Rev.
27
- * A 46, 1942). Its poles in √s both have negative real part, so Ĉ has none on the
28
- * principal sheet and C(t) is the branch-cut integral
29
- * C(t) = (k_BT/πγ) ∫₀^∞ e^{−ut} √(τ_f u)/((1 − τ_p u)² + τ_f u) du, τ_p = M/γ.
30
- * Then ⟨Δx²⟩ = 2∫₀ᵗ (t − s) C(s) ds, and with v = ut,
31
- * MSD/(2Dt) = (1/π) ∫₀^∞ √(βv) (v − 1 + e^{−v}) / (v² ((1 − αv)² + βv)) dv, α = τ_p/t, β = τ_f/t,
32
- * integrated here over ln v by adaptive Simpson, split at v = 1, 1/β and around
33
- * the near-resonance at v = 1/α (width √(β/α) in ln v; β/α ≤ 9 for any densities).
34
- *
35
- * Limits: → 1 − 2√(τ_f/(πt)) + (τ_f − τ_p)/t for t ≫ τ_p, τ_f (expanding Ĉ in √s),
36
- * whose second derivative is the VACF tail k_BT/(12 ρ_f (πνt)^{3/2}); → t/(2τ_p)
37
- * for t ≪ τ_p, i.e. ⟨Δx²⟩ → (k_BT/M) t². Requires β > 0: without memory the
38
- * poles reach the principal sheet and this integral no longer holds them.
39
- * @internal
40
- */
41
- export declare function hydrodynamicMsdRatio(alpha: number, beta: number): number;
42
- /**
43
- * D_∥/D₀ for a sphere translating parallel to a plane wall, centre at h:
44
- * 1 − (9/16)ξ + (1/8)ξ³ − (45/256)ξ⁴ − (1/16)ξ⁵, ξ = a/h (Faxén 1923, method of
45
- * reflections, as quoted in Happel & Brenner 1965, Low Reynolds Number
46
- * Hydrodynamics, ch. 7). A series in a/h, truncated:
47
- * its error is not bounded here, and near contact it misses the logarithmic
48
- * lubrication divergence of the drag.
49
- * @internal
50
- */
51
- export declare function faxenParallel(aOverH: number): number;
52
- /**
53
- * λ = F/(6πηaU) for a sphere approaching a plane wall head-on, centre at h > a,
54
- * exact in Stokes flow (Brenner 1961, Chem. Eng. Sci. 16, 242, bispherical coordinates):
55
- * λ = (4/3) sinh α Σₙ n(n+1)/((2n−1)(2n+3)) · [(2 sinh(2n+1)α + (2n+1) sinh 2α) /
56
- * (4 sinh²(n+½)α − (2n+1)² sinh²α) − 1], cosh α = h/a. D_⊥ = D₀/λ.
57
- *
58
- * The bracket is rewritten over 4 sinh²(n+½)α so that no sinh overflows; its
59
- * terms fall as e^{−(2n+1)α}, so near contact (α → 0) the sum needs ~40/α terms,
60
- * and the low-n denominators lose ~α⁻² of relative precision to cancellation.
61
- * Limits: λ → 1 + (9/8)(a/h) far away (Lorentz 1907); λ → a/δ + (1/5) ln(a/δ) +
62
- * 0.971 as the gap δ = h − a → 0 (Cox & Brenner 1967, Chem. Eng. Sci. 22, 1753).
63
- * @throws Error if h/a ≤ 1.
64
- * @internal
65
- */
66
- export declare function brennerPerpendicular(hOverA: number): number;
67
- export declare const BROWNIAN_SPHERE_CASE: AppliedCase;
68
- //# sourceMappingURL=brownian-sphere.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"brownian-sphere.d.ts","sourceRoot":"","sources":["../../src/cases/brownian-sphere.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAoD,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAIhG,2EAA2E;AAC3E,eAAO,MAAM,UAAU,UAAU,CAAC;AAElC,uFAAuF;AACvF,eAAO,MAAM,MAAM,MAAM,CAAC;AAC1B,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC,uFAAuF;AACvF,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,wFAAwF;AACxF,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC,uGAAuG;AACvG,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC,0FAA0F;AAC1F,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC,qGAAqG;AACrG,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC,+GAA+G;AAC/G,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAcxE;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAkB3D;AAED,eAAO,MAAM,oBAAoB,EAAE,WA2OlC,CAAC"}