universal-physics-tensor 8.0.0 → 10.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 (916) hide show
  1. package/README.md +26 -21
  2. package/data/atlas/atlas.json +75 -64
  3. package/data/atlas/atlas.jsonld +1 -1
  4. package/data/atlas/diffusion.json +23 -22
  5. package/data/atlas/oscillators.json +21 -16
  6. package/data/atlas/waves.json +33 -28
  7. package/data/bridge-catalog.json +1356 -1791
  8. package/data/bridge-catalog.schema.json +789 -46
  9. package/data/quantities.json +280 -234
  10. package/data/quantities.schema.json +52 -0
  11. package/data/schemas/atlas-record.v0.json +184 -46
  12. package/data/units.json +1178 -0
  13. package/data/units.schema.json +124 -0
  14. package/dist/atlas/applicability.d.ts.map +1 -1
  15. package/dist/atlas/applicability.js +14 -3
  16. package/dist/atlas/applicability.js.map +1 -1
  17. package/dist/atlas/association.d.ts +1 -1
  18. package/dist/atlas/association.js.map +1 -1
  19. package/dist/atlas/benchmark/backend-shapes.d.ts.map +1 -1
  20. package/dist/atlas/benchmark/backend-shapes.js +5 -1
  21. package/dist/atlas/benchmark/backend-shapes.js.map +1 -1
  22. package/dist/atlas/benchmark/baselines.d.ts.map +1 -1
  23. package/dist/atlas/benchmark/baselines.js +8 -0
  24. package/dist/atlas/benchmark/baselines.js.map +1 -1
  25. package/dist/atlas/benchmark/hybrid-retrieval.d.ts +3 -2
  26. package/dist/atlas/benchmark/hybrid-retrieval.d.ts.map +1 -1
  27. package/dist/atlas/benchmark/hybrid-retrieval.js +16 -12
  28. package/dist/atlas/benchmark/hybrid-retrieval.js.map +1 -1
  29. package/dist/atlas/benchmark/leakage.js.map +1 -1
  30. package/dist/atlas/benchmark/loader.js.map +1 -1
  31. package/dist/atlas/benchmark/run-atlas.d.ts.map +1 -1
  32. package/dist/atlas/benchmark/run-atlas.js +14 -2
  33. package/dist/atlas/benchmark/run-atlas.js.map +1 -1
  34. package/dist/atlas/benchmark/stats.d.ts +1 -1
  35. package/dist/atlas/benchmark/stats.d.ts.map +1 -1
  36. package/dist/atlas/benchmark/stats.js +1 -1
  37. package/dist/atlas/benchmark/stats.js.map +1 -1
  38. package/dist/atlas/benchmark/study.js.map +1 -1
  39. package/dist/atlas/benchmark/types.js.map +1 -1
  40. package/dist/atlas/bridge-record.d.ts +4 -4
  41. package/dist/atlas/bridge-record.d.ts.map +1 -1
  42. package/dist/atlas/bridge-record.js +6 -6
  43. package/dist/atlas/bridge-record.js.map +1 -1
  44. package/dist/atlas/catalog-formal-ref.js.map +1 -1
  45. package/dist/atlas/chain-pipeline.d.ts +0 -11
  46. package/dist/atlas/chain-pipeline.d.ts.map +1 -1
  47. package/dist/atlas/chain-pipeline.js +5 -16
  48. package/dist/atlas/chain-pipeline.js.map +1 -1
  49. package/dist/atlas/composition-table.js.map +1 -1
  50. package/dist/atlas/conventions.js.map +1 -1
  51. package/dist/atlas/coverage.d.ts +2 -2
  52. package/dist/atlas/coverage.js.map +1 -1
  53. package/dist/atlas/derivation.js.map +1 -1
  54. package/dist/atlas/derive-evidence.d.ts +6 -4
  55. package/dist/atlas/derive-evidence.d.ts.map +1 -1
  56. package/dist/atlas/derive-evidence.js +7 -2
  57. package/dist/atlas/derive-evidence.js.map +1 -1
  58. package/dist/atlas/diffusion/bridges-closure.d.ts.map +1 -1
  59. package/dist/atlas/diffusion/bridges-closure.js +0 -5
  60. package/dist/atlas/diffusion/bridges-closure.js.map +1 -1
  61. package/dist/atlas/diffusion/bridges.d.ts.map +1 -1
  62. package/dist/atlas/diffusion/bridges.js +0 -3
  63. package/dist/atlas/diffusion/bridges.js.map +1 -1
  64. package/dist/atlas/diffusion/dimensions.js.map +1 -1
  65. package/dist/atlas/diffusion/index.d.ts +1 -1
  66. package/dist/atlas/diffusion/index.d.ts.map +1 -1
  67. package/dist/atlas/diffusion/index.js.map +1 -1
  68. package/dist/atlas/diffusion/models.js.map +1 -1
  69. package/dist/atlas/diffusion/numerics.js.map +1 -1
  70. package/dist/atlas/error-algebra.d.ts +6 -0
  71. package/dist/atlas/error-algebra.d.ts.map +1 -1
  72. package/dist/atlas/error-algebra.js +26 -0
  73. package/dist/atlas/error-algebra.js.map +1 -1
  74. package/dist/atlas/export.d.ts +18 -2
  75. package/dist/atlas/export.d.ts.map +1 -1
  76. package/dist/atlas/export.js +9 -3
  77. package/dist/atlas/export.js.map +1 -1
  78. package/dist/atlas/families.d.ts +19 -2
  79. package/dist/atlas/families.d.ts.map +1 -1
  80. package/dist/atlas/families.js +26 -3
  81. package/dist/atlas/families.js.map +1 -1
  82. package/dist/atlas/family.d.ts +27 -0
  83. package/dist/atlas/family.d.ts.map +1 -0
  84. package/dist/atlas/family.js +12 -0
  85. package/dist/atlas/family.js.map +1 -0
  86. package/dist/atlas/index.d.ts +3 -2
  87. package/dist/atlas/index.d.ts.map +1 -1
  88. package/dist/atlas/index.js +2 -1
  89. package/dist/atlas/index.js.map +1 -1
  90. package/dist/atlas/link-prediction.d.ts +1 -1
  91. package/dist/atlas/link-prediction.d.ts.map +1 -1
  92. package/dist/atlas/link-prediction.js.map +1 -1
  93. package/dist/atlas/model.js.map +1 -1
  94. package/dist/atlas/oscillators/bridges-coarse.d.ts.map +1 -1
  95. package/dist/atlas/oscillators/bridges-coarse.js +0 -1
  96. package/dist/atlas/oscillators/bridges-coarse.js.map +1 -1
  97. package/dist/atlas/oscillators/bridges-exact.d.ts.map +1 -1
  98. package/dist/atlas/oscillators/bridges-exact.js +0 -3
  99. package/dist/atlas/oscillators/bridges-exact.js.map +1 -1
  100. package/dist/atlas/oscillators/bridges-limits.d.ts.map +1 -1
  101. package/dist/atlas/oscillators/bridges-limits.js +0 -2
  102. package/dist/atlas/oscillators/bridges-limits.js.map +1 -1
  103. package/dist/atlas/oscillators/dimensions.js.map +1 -1
  104. package/dist/atlas/oscillators/index.d.ts +1 -16
  105. package/dist/atlas/oscillators/index.d.ts.map +1 -1
  106. package/dist/atlas/oscillators/index.js.map +1 -1
  107. package/dist/atlas/oscillators/limit-witnesses.js.map +1 -1
  108. package/dist/atlas/oscillators/models.js.map +1 -1
  109. package/dist/atlas/oscillators/norm-transport-witness.js.map +1 -1
  110. package/dist/atlas/oscillators/norm-transport.js.map +1 -1
  111. package/dist/atlas/oscillators/norms.js.map +1 -1
  112. package/dist/atlas/oscillators/pendulum-motion.js.map +1 -1
  113. package/dist/atlas/oscillators/phase-carriage.js.map +1 -1
  114. package/dist/atlas/oscillators/phase-translation.js.map +1 -1
  115. package/dist/atlas/oscillators/position-translation.js.map +1 -1
  116. package/dist/atlas/oscillators/rejections.js.map +1 -1
  117. package/dist/atlas/path-bound.js.map +1 -1
  118. package/dist/atlas/physjs-entries.generated.d.ts +1601 -220
  119. package/dist/atlas/physjs-entries.generated.d.ts.map +1 -1
  120. package/dist/atlas/physjs-entries.generated.js +1854 -345
  121. package/dist/atlas/physjs-entries.generated.js.map +1 -1
  122. package/dist/atlas/physjs-ref.d.ts +151 -117
  123. package/dist/atlas/physjs-ref.d.ts.map +1 -1
  124. package/dist/atlas/physjs-ref.js +244 -211
  125. package/dist/atlas/physjs-ref.js.map +1 -1
  126. package/dist/atlas/physjs-reviewed.d.ts +31 -0
  127. package/dist/atlas/physjs-reviewed.d.ts.map +1 -0
  128. package/dist/atlas/physjs-reviewed.js +194 -0
  129. package/dist/atlas/physjs-reviewed.js.map +1 -0
  130. package/dist/atlas/poster/associations.js.map +1 -1
  131. package/dist/atlas/poster/derivations.js.map +1 -1
  132. package/dist/atlas/poster/statements.js.map +1 -1
  133. package/dist/atlas/proof-target.d.ts +16 -8
  134. package/dist/atlas/proof-target.d.ts.map +1 -1
  135. package/dist/atlas/proof-target.js +34 -31
  136. package/dist/atlas/proof-target.js.map +1 -1
  137. package/dist/atlas/public.d.ts +2 -1
  138. package/dist/atlas/public.d.ts.map +1 -1
  139. package/dist/atlas/public.js +2 -1
  140. package/dist/atlas/public.js.map +1 -1
  141. package/dist/atlas/regime.js.map +1 -1
  142. package/dist/atlas/serialize.d.ts +18 -12
  143. package/dist/atlas/serialize.d.ts.map +1 -1
  144. package/dist/atlas/serialize.js +28 -18
  145. package/dist/atlas/serialize.js.map +1 -1
  146. package/dist/atlas/statement.js.map +1 -1
  147. package/dist/atlas/translation-registry.js.map +1 -1
  148. package/dist/atlas/translation.js.map +1 -1
  149. package/dist/atlas/types.d.ts +9 -2
  150. package/dist/atlas/types.d.ts.map +1 -1
  151. package/dist/atlas/types.js +1 -1
  152. package/dist/atlas/types.js.map +1 -1
  153. package/dist/atlas/waves/bridges-closure.d.ts.map +1 -1
  154. package/dist/atlas/waves/bridges-closure.js +0 -3
  155. package/dist/atlas/waves/bridges-closure.js.map +1 -1
  156. package/dist/atlas/waves/bridges.d.ts.map +1 -1
  157. package/dist/atlas/waves/bridges.js +0 -4
  158. package/dist/atlas/waves/bridges.js.map +1 -1
  159. package/dist/atlas/waves/index.d.ts +1 -1
  160. package/dist/atlas/waves/index.d.ts.map +1 -1
  161. package/dist/atlas/waves/index.js.map +1 -1
  162. package/dist/atlas/waves/models.js.map +1 -1
  163. package/dist/atlas/waves/numerics.js.map +1 -1
  164. package/dist/atlas/witness-artifact.js.map +1 -1
  165. package/dist/atlas/witness-dominance.d.ts +4 -3
  166. package/dist/atlas/witness-dominance.d.ts.map +1 -1
  167. package/dist/atlas/witness-dominance.js +15 -5
  168. package/dist/atlas/witness-dominance.js.map +1 -1
  169. package/dist/atlas/witness-numeric.d.ts +8 -4
  170. package/dist/atlas/witness-numeric.d.ts.map +1 -1
  171. package/dist/atlas/witness-numeric.js +27 -2
  172. package/dist/atlas/witness-numeric.js.map +1 -1
  173. package/dist/atlas/witness-result.d.ts +7 -1
  174. package/dist/atlas/witness-result.d.ts.map +1 -1
  175. package/dist/atlas/witness-result.js.map +1 -1
  176. package/dist/atlas/witness-specs.js.map +1 -1
  177. package/dist/atlas/witness-symbolic.js.map +1 -1
  178. package/dist/atlas/witnesses/quantum-support.js.map +1 -1
  179. package/dist/bridges/caller-table.d.ts +1 -1
  180. package/dist/bridges/caller-table.d.ts.map +1 -1
  181. package/dist/bridges/caller-table.js.map +1 -1
  182. package/dist/bridges/carrier-sign.d.ts.map +1 -1
  183. package/dist/bridges/carrier-sign.js +8 -3
  184. package/dist/bridges/carrier-sign.js.map +1 -1
  185. package/dist/bridges/catalog-adapter.d.ts +12 -3
  186. package/dist/bridges/catalog-adapter.d.ts.map +1 -1
  187. package/dist/bridges/catalog-adapter.js +22 -14
  188. package/dist/bridges/catalog-adapter.js.map +1 -1
  189. package/dist/bridges/catalog-load.d.ts +19 -2
  190. package/dist/bridges/catalog-load.d.ts.map +1 -1
  191. package/dist/bridges/catalog-load.js +233 -14
  192. package/dist/bridges/catalog-load.js.map +1 -1
  193. package/dist/bridges/catalog-types.d.ts +96 -27
  194. package/dist/bridges/catalog-types.d.ts.map +1 -1
  195. package/dist/bridges/catalog-types.js.map +1 -1
  196. package/dist/bridges/coefficient-statement.js +1 -5
  197. package/dist/bridges/coefficient-statement.js.map +1 -1
  198. package/dist/bridges/confrontation-coverage.js.map +1 -1
  199. package/dist/bridges/confrontations.d.ts +1 -1
  200. package/dist/bridges/confrontations.d.ts.map +1 -1
  201. package/dist/bridges/confrontations.js +1 -1
  202. package/dist/bridges/confrontations.js.map +1 -1
  203. package/dist/bridges/evaluation-errors.d.ts +89 -0
  204. package/dist/bridges/evaluation-errors.d.ts.map +1 -0
  205. package/dist/bridges/evaluation-errors.js +136 -0
  206. package/dist/bridges/evaluation-errors.js.map +1 -0
  207. package/dist/bridges/evaluator-inputs.d.ts +5 -3
  208. package/dist/bridges/evaluator-inputs.d.ts.map +1 -1
  209. package/dist/bridges/evaluator-inputs.js +24 -24
  210. package/dist/bridges/evaluator-inputs.js.map +1 -1
  211. package/dist/bridges/evaluators.d.ts +48 -8
  212. package/dist/bridges/evaluators.d.ts.map +1 -1
  213. package/dist/bridges/evaluators.js +173 -38
  214. package/dist/bridges/evaluators.js.map +1 -1
  215. package/dist/bridges/expr-parse.d.ts +38 -7
  216. package/dist/bridges/expr-parse.d.ts.map +1 -1
  217. package/dist/bridges/expr-parse.js +129 -156
  218. package/dist/bridges/expr-parse.js.map +1 -1
  219. package/dist/bridges/holds.d.ts +16 -8
  220. package/dist/bridges/holds.d.ts.map +1 -1
  221. package/dist/bridges/holds.js +130 -236
  222. package/dist/bridges/holds.js.map +1 -1
  223. package/dist/bridges/index.d.ts +15 -14
  224. package/dist/bridges/index.d.ts.map +1 -1
  225. package/dist/bridges/index.js +14 -15
  226. package/dist/bridges/index.js.map +1 -1
  227. package/dist/bridges/input-contract.d.ts +65 -0
  228. package/dist/bridges/input-contract.d.ts.map +1 -0
  229. package/dist/bridges/input-contract.js +97 -0
  230. package/dist/bridges/input-contract.js.map +1 -0
  231. package/dist/bridges/membership.d.ts +5 -3
  232. package/dist/bridges/membership.d.ts.map +1 -1
  233. package/dist/bridges/membership.js +5 -6
  234. package/dist/bridges/membership.js.map +1 -1
  235. package/dist/bridges/notices.d.ts +11 -0
  236. package/dist/bridges/notices.d.ts.map +1 -0
  237. package/dist/bridges/notices.js +22 -0
  238. package/dist/bridges/notices.js.map +1 -0
  239. package/dist/bridges/observations/types.js.map +1 -1
  240. package/dist/bridges/rejected.d.ts +11 -17
  241. package/dist/bridges/rejected.d.ts.map +1 -1
  242. package/dist/bridges/rejected.js +13 -68
  243. package/dist/bridges/rejected.js.map +1 -1
  244. package/dist/bridges/relation-eval.d.ts +5 -6
  245. package/dist/bridges/relation-eval.d.ts.map +1 -1
  246. package/dist/bridges/relation-eval.js +9 -38
  247. package/dist/bridges/relation-eval.js.map +1 -1
  248. package/dist/bridges/rhs-registry.js.map +1 -1
  249. package/dist/bridges/sensitivity.d.ts +11 -3
  250. package/dist/bridges/sensitivity.d.ts.map +1 -1
  251. package/dist/bridges/sensitivity.js +24 -10
  252. package/dist/bridges/sensitivity.js.map +1 -1
  253. package/dist/bridges/tensor-index.js.map +1 -1
  254. package/dist/bridges/types.d.ts +1 -7
  255. package/dist/bridges/types.d.ts.map +1 -1
  256. package/dist/bridges/types.js +1 -4
  257. package/dist/bridges/types.js.map +1 -1
  258. package/dist/canonical/canonical-equation.d.ts +31 -0
  259. package/dist/canonical/canonical-equation.d.ts.map +1 -1
  260. package/dist/canonical/canonical-equation.js.map +1 -1
  261. package/dist/canonical/dimensional-fields.js.map +1 -1
  262. package/dist/canonical/entries/_l1-build.js.map +1 -1
  263. package/dist/canonical/entries/atomic.d.ts.map +1 -1
  264. package/dist/canonical/entries/atomic.js +11 -1
  265. package/dist/canonical/entries/atomic.js.map +1 -1
  266. package/dist/canonical/entries/condensed-matter.d.ts.map +1 -1
  267. package/dist/canonical/entries/condensed-matter.js +7 -4
  268. package/dist/canonical/entries/condensed-matter.js.map +1 -1
  269. package/dist/canonical/entries/dimensional-classics.d.ts.map +1 -1
  270. package/dist/canonical/entries/dimensional-classics.js +50 -2
  271. package/dist/canonical/entries/dimensional-classics.js.map +1 -1
  272. package/dist/canonical/entries/electromagnetism.d.ts.map +1 -1
  273. package/dist/canonical/entries/electromagnetism.js +32 -2
  274. package/dist/canonical/entries/electromagnetism.js.map +1 -1
  275. package/dist/canonical/entries/fluids-waves.d.ts.map +1 -1
  276. package/dist/canonical/entries/fluids-waves.js +34 -0
  277. package/dist/canonical/entries/fluids-waves.js.map +1 -1
  278. package/dist/canonical/entries/mechanics.d.ts.map +1 -1
  279. package/dist/canonical/entries/mechanics.js +24 -0
  280. package/dist/canonical/entries/mechanics.js.map +1 -1
  281. package/dist/canonical/entries/nonmonomial.d.ts.map +1 -1
  282. package/dist/canonical/entries/nonmonomial.js +42 -24
  283. package/dist/canonical/entries/nonmonomial.js.map +1 -1
  284. package/dist/canonical/entries/relativity.d.ts.map +1 -1
  285. package/dist/canonical/entries/relativity.js +6 -0
  286. package/dist/canonical/entries/relativity.js.map +1 -1
  287. package/dist/canonical/entries/statistical-mechanics.d.ts.map +1 -1
  288. package/dist/canonical/entries/statistical-mechanics.js +24 -5
  289. package/dist/canonical/entries/statistical-mechanics.js.map +1 -1
  290. package/dist/canonical/entries/thermo-nuclear-cosmo.d.ts.map +1 -1
  291. package/dist/canonical/entries/thermo-nuclear-cosmo.js +15 -0
  292. package/dist/canonical/entries/thermo-nuclear-cosmo.js.map +1 -1
  293. package/dist/canonical/linkage.d.ts +29 -4
  294. package/dist/canonical/linkage.d.ts.map +1 -1
  295. package/dist/canonical/linkage.js +31 -29
  296. package/dist/canonical/linkage.js.map +1 -1
  297. package/dist/canonical/normal-form.d.ts +0 -8
  298. package/dist/canonical/normal-form.d.ts.map +1 -1
  299. package/dist/canonical/normal-form.js +17 -12
  300. package/dist/canonical/normal-form.js.map +1 -1
  301. package/dist/canonical/registry.js.map +1 -1
  302. package/dist/canonical/residual.js.map +1 -1
  303. package/dist/canonical/seed-l-layer.d.ts +7 -1
  304. package/dist/canonical/seed-l-layer.d.ts.map +1 -1
  305. package/dist/canonical/seed-l-layer.js +7 -1
  306. package/dist/canonical/seed-l-layer.js.map +1 -1
  307. package/dist/canonical/structural.d.ts +21 -0
  308. package/dist/canonical/structural.d.ts.map +1 -1
  309. package/dist/canonical/structural.js +24 -4
  310. package/dist/canonical/structural.js.map +1 -1
  311. package/dist/cases/brownian-sphere.js +4 -4
  312. package/dist/cases/brownian-sphere.js.map +1 -1
  313. package/dist/cases/damped-resonator.js +2 -2
  314. package/dist/cases/damped-resonator.js.map +1 -1
  315. package/dist/cases/index.d.ts +9 -2
  316. package/dist/cases/index.d.ts.map +1 -1
  317. package/dist/cases/index.js +26 -7
  318. package/dist/cases/index.js.map +1 -1
  319. package/dist/cases/kepler-rv.js +6 -6
  320. package/dist/cases/kepler-rv.js.map +1 -1
  321. package/dist/cases/lumped-cooling.js +1 -1
  322. package/dist/cases/lumped-cooling.js.map +1 -1
  323. package/dist/cases/quadrature.js.map +1 -1
  324. package/dist/cases/resistor-noise.js +3 -3
  325. package/dist/cases/resistor-noise.js.map +1 -1
  326. package/dist/cases/skin-depth.js.map +1 -1
  327. package/dist/cases/types.js.map +1 -1
  328. package/dist/cli/args.d.ts +7 -2
  329. package/dist/cli/args.d.ts.map +1 -1
  330. package/dist/cli/args.js +18 -2
  331. package/dist/cli/args.js.map +1 -1
  332. package/dist/cli/bindings.d.ts +13 -0
  333. package/dist/cli/bindings.d.ts.map +1 -0
  334. package/dist/cli/bindings.js +32 -0
  335. package/dist/cli/bindings.js.map +1 -0
  336. package/dist/cli/closed-form-range.js.map +1 -1
  337. package/dist/cli/command.js.map +1 -1
  338. package/dist/cli/commands/_atlas-map.d.ts +3 -3
  339. package/dist/cli/commands/_atlas-map.d.ts.map +1 -1
  340. package/dist/cli/commands/_atlas-map.js +43 -18
  341. package/dist/cli/commands/_atlas-map.js.map +1 -1
  342. package/dist/cli/commands/_atlas-route.js.map +1 -1
  343. package/dist/cli/commands/_discovery-opts.d.ts +2 -1
  344. package/dist/cli/commands/_discovery-opts.d.ts.map +1 -1
  345. package/dist/cli/commands/_discovery-opts.js +48 -18
  346. package/dist/cli/commands/_discovery-opts.js.map +1 -1
  347. package/dist/cli/commands/atlas.d.ts.map +1 -1
  348. package/dist/cli/commands/atlas.js +7 -12
  349. package/dist/cli/commands/atlas.js.map +1 -1
  350. package/dist/cli/commands/audit.d.ts.map +1 -1
  351. package/dist/cli/commands/audit.js +13 -21
  352. package/dist/cli/commands/audit.js.map +1 -1
  353. package/dist/cli/commands/axes.js.map +1 -1
  354. package/dist/cli/commands/candidates.d.ts.map +1 -1
  355. package/dist/cli/commands/candidates.js +16 -8
  356. package/dist/cli/commands/candidates.js.map +1 -1
  357. package/dist/cli/commands/canonical.js.map +1 -1
  358. package/dist/cli/commands/chain.js +1 -1
  359. package/dist/cli/commands/chain.js.map +1 -1
  360. package/dist/cli/commands/confront.d.ts.map +1 -1
  361. package/dist/cli/commands/confront.js +22 -14
  362. package/dist/cli/commands/confront.js.map +1 -1
  363. package/dist/cli/commands/connectors.d.ts.map +1 -1
  364. package/dist/cli/commands/connectors.js +8 -9
  365. package/dist/cli/commands/connectors.js.map +1 -1
  366. package/dist/cli/commands/coverage.js.map +1 -1
  367. package/dist/cli/commands/derive.d.ts.map +1 -1
  368. package/dist/cli/commands/derive.js +50 -26
  369. package/dist/cli/commands/derive.js.map +1 -1
  370. package/dist/cli/commands/discover.d.ts.map +1 -1
  371. package/dist/cli/commands/discover.js +18 -13
  372. package/dist/cli/commands/discover.js.map +1 -1
  373. package/dist/cli/commands/eval.d.ts.map +1 -1
  374. package/dist/cli/commands/eval.js +29 -26
  375. package/dist/cli/commands/eval.js.map +1 -1
  376. package/dist/cli/commands/evaluate.d.ts +1 -35
  377. package/dist/cli/commands/evaluate.d.ts.map +1 -1
  378. package/dist/cli/commands/evaluate.js +99 -208
  379. package/dist/cli/commands/evaluate.js.map +1 -1
  380. package/dist/cli/commands/explain.d.ts.map +1 -1
  381. package/dist/cli/commands/explain.js +57 -45
  382. package/dist/cli/commands/explain.js.map +1 -1
  383. package/dist/cli/commands/frontier.js.map +1 -1
  384. package/dist/cli/commands/ground.d.ts.map +1 -1
  385. package/dist/cli/commands/ground.js +41 -11
  386. package/dist/cli/commands/ground.js.map +1 -1
  387. package/dist/cli/commands/index.js.map +1 -1
  388. package/dist/cli/commands/map.d.ts.map +1 -1
  389. package/dist/cli/commands/map.js +84 -92
  390. package/dist/cli/commands/map.js.map +1 -1
  391. package/dist/cli/commands/metric.d.ts.map +1 -1
  392. package/dist/cli/commands/metric.js +53 -15
  393. package/dist/cli/commands/metric.js.map +1 -1
  394. package/dist/cli/commands/path.js +4 -4
  395. package/dist/cli/commands/path.js.map +1 -1
  396. package/dist/cli/commands/predict.js.map +1 -1
  397. package/dist/cli/commands/priority.js.map +1 -1
  398. package/dist/cli/commands/probe.d.ts.map +1 -1
  399. package/dist/cli/commands/probe.js +50 -26
  400. package/dist/cli/commands/probe.js.map +1 -1
  401. package/dist/cli/commands/recover.js +1 -1
  402. package/dist/cli/commands/recover.js.map +1 -1
  403. package/dist/cli/commands/regime.d.ts +5 -4
  404. package/dist/cli/commands/regime.d.ts.map +1 -1
  405. package/dist/cli/commands/regime.js +25 -27
  406. package/dist/cli/commands/regime.js.map +1 -1
  407. package/dist/cli/commands/retrieve.d.ts.map +1 -1
  408. package/dist/cli/commands/retrieve.js +22 -14
  409. package/dist/cli/commands/retrieve.js.map +1 -1
  410. package/dist/cli/commands/search.d.ts.map +1 -1
  411. package/dist/cli/commands/search.js +8 -4
  412. package/dist/cli/commands/search.js.map +1 -1
  413. package/dist/cli/commands/symbolic.d.ts.map +1 -1
  414. package/dist/cli/commands/symbolic.js +14 -7
  415. package/dist/cli/commands/symbolic.js.map +1 -1
  416. package/dist/cli/commands/testplan.js +4 -4
  417. package/dist/cli/commands/testplan.js.map +1 -1
  418. package/dist/cli/conventions.d.ts +6 -7
  419. package/dist/cli/conventions.d.ts.map +1 -1
  420. package/dist/cli/conventions.js +19 -28
  421. package/dist/cli/conventions.js.map +1 -1
  422. package/dist/cli/determination.js.map +1 -1
  423. package/dist/cli/errors.js.map +1 -1
  424. package/dist/cli/euler-guard.d.ts +13 -2
  425. package/dist/cli/euler-guard.d.ts.map +1 -1
  426. package/dist/cli/euler-guard.js +17 -3
  427. package/dist/cli/euler-guard.js.map +1 -1
  428. package/dist/cli/eval-numbers.d.ts +4 -9
  429. package/dist/cli/eval-numbers.d.ts.map +1 -1
  430. package/dist/cli/eval-numbers.js +11 -41
  431. package/dist/cli/eval-numbers.js.map +1 -1
  432. package/dist/cli/expr-print.d.ts +29 -2
  433. package/dist/cli/expr-print.d.ts.map +1 -1
  434. package/dist/cli/expr-print.js +46 -2
  435. package/dist/cli/expr-print.js.map +1 -1
  436. package/dist/cli/flag-help.js.map +1 -1
  437. package/dist/cli/graphs.js.map +1 -1
  438. package/dist/cli/library-defaults.d.ts +19 -0
  439. package/dist/cli/library-defaults.d.ts.map +1 -0
  440. package/dist/cli/library-defaults.js +22 -0
  441. package/dist/cli/library-defaults.js.map +1 -0
  442. package/dist/cli/main.js +7 -3
  443. package/dist/cli/main.js.map +1 -1
  444. package/dist/cli/map-evidence.js.map +1 -1
  445. package/dist/cli/output.d.ts +3 -6
  446. package/dist/cli/output.d.ts.map +1 -1
  447. package/dist/cli/output.js.map +1 -1
  448. package/dist/cli/published-url.d.ts +2 -0
  449. package/dist/cli/published-url.d.ts.map +1 -1
  450. package/dist/cli/published-url.js +5 -0
  451. package/dist/cli/published-url.js.map +1 -1
  452. package/dist/cli/record-reach.d.ts +6 -0
  453. package/dist/cli/record-reach.d.ts.map +1 -1
  454. package/dist/cli/record-reach.js +16 -10
  455. package/dist/cli/record-reach.js.map +1 -1
  456. package/dist/cli/record-tables.d.ts +2 -1
  457. package/dist/cli/record-tables.d.ts.map +1 -1
  458. package/dist/cli/record-tables.js +8 -3
  459. package/dist/cli/record-tables.js.map +1 -1
  460. package/dist/cli/record.d.ts.map +1 -1
  461. package/dist/cli/record.js +31 -12
  462. package/dist/cli/record.js.map +1 -1
  463. package/dist/cli/search-index.d.ts +5 -0
  464. package/dist/cli/search-index.d.ts.map +1 -1
  465. package/dist/cli/search-index.js +12 -1
  466. package/dist/cli/search-index.js.map +1 -1
  467. package/dist/cli/statuses.js.map +1 -1
  468. package/dist/cli/top-level-help.js.map +1 -1
  469. package/dist/cli/version.js.map +1 -1
  470. package/dist/cli-api.d.ts +57 -18
  471. package/dist/cli-api.d.ts.map +1 -1
  472. package/dist/cli-api.js +49 -21
  473. package/dist/cli-api.js.map +1 -1
  474. package/dist/composition/adjudication.d.ts +8 -30
  475. package/dist/composition/adjudication.d.ts.map +1 -1
  476. package/dist/composition/adjudication.js +15 -67
  477. package/dist/composition/adjudication.js.map +1 -1
  478. package/dist/composition/aliases.d.ts +1 -1
  479. package/dist/composition/aliases.d.ts.map +1 -1
  480. package/dist/composition/aliases.js +10 -20
  481. package/dist/composition/aliases.js.map +1 -1
  482. package/dist/composition/audit-coverage.d.ts +2 -0
  483. package/dist/composition/audit-coverage.d.ts.map +1 -1
  484. package/dist/composition/audit-coverage.js.map +1 -1
  485. package/dist/composition/axes.d.ts +12 -0
  486. package/dist/composition/axes.d.ts.map +1 -1
  487. package/dist/composition/axes.js +18 -6
  488. package/dist/composition/axes.js.map +1 -1
  489. package/dist/composition/axis-audit.js.map +1 -1
  490. package/dist/composition/bridge-analysis.d.ts +0 -14
  491. package/dist/composition/bridge-analysis.d.ts.map +1 -1
  492. package/dist/composition/bridge-analysis.js +66 -57
  493. package/dist/composition/bridge-analysis.js.map +1 -1
  494. package/dist/composition/bridge-prediction.d.ts +5 -1
  495. package/dist/composition/bridge-prediction.d.ts.map +1 -1
  496. package/dist/composition/bridge-prediction.js +12 -16
  497. package/dist/composition/bridge-prediction.js.map +1 -1
  498. package/dist/composition/buckingham-filter.js.map +1 -1
  499. package/dist/composition/canonical-compare.d.ts.map +1 -1
  500. package/dist/composition/canonical-compare.js +12 -2
  501. package/dist/composition/canonical-compare.js.map +1 -1
  502. package/dist/composition/canonical-graph.d.ts +15 -18
  503. package/dist/composition/canonical-graph.d.ts.map +1 -1
  504. package/dist/composition/canonical-graph.js +59 -85
  505. package/dist/composition/canonical-graph.js.map +1 -1
  506. package/dist/composition/canonical-json.js.map +1 -1
  507. package/dist/composition/canonical-prefactors.d.ts +10 -29
  508. package/dist/composition/canonical-prefactors.d.ts.map +1 -1
  509. package/dist/composition/canonical-prefactors.js +15 -202
  510. package/dist/composition/canonical-prefactors.js.map +1 -1
  511. package/dist/composition/catalog-graph.d.ts.map +1 -1
  512. package/dist/composition/catalog-graph.js +6 -20
  513. package/dist/composition/catalog-graph.js.map +1 -1
  514. package/dist/composition/chain-candidate.d.ts +2 -0
  515. package/dist/composition/chain-candidate.d.ts.map +1 -1
  516. package/dist/composition/chain-candidate.js +2 -0
  517. package/dist/composition/chain-candidate.js.map +1 -1
  518. package/dist/composition/chain-match.js.map +1 -1
  519. package/dist/composition/chain-regime.js.map +1 -1
  520. package/dist/composition/chain-result.js.map +1 -1
  521. package/dist/composition/compose-surface.js.map +1 -1
  522. package/dist/composition/compose-symbolic.js.map +1 -1
  523. package/dist/composition/compose.d.ts.map +1 -1
  524. package/dist/composition/compose.js +154 -36
  525. package/dist/composition/compose.js.map +1 -1
  526. package/dist/composition/composition-recovery.js.map +1 -1
  527. package/dist/composition/consequence.d.ts.map +1 -1
  528. package/dist/composition/consequence.js +15 -6
  529. package/dist/composition/consequence.js.map +1 -1
  530. package/dist/composition/consistency.js.map +1 -1
  531. package/dist/composition/descriptor.d.ts +1 -1
  532. package/dist/composition/descriptor.d.ts.map +1 -1
  533. package/dist/composition/descriptor.js.map +1 -1
  534. package/dist/composition/dimension-adjacency.js.map +1 -1
  535. package/dist/composition/discovery.d.ts +67 -7
  536. package/dist/composition/discovery.d.ts.map +1 -1
  537. package/dist/composition/discovery.js +83 -23
  538. package/dist/composition/discovery.js.map +1 -1
  539. package/dist/composition/edge.d.ts +19 -22
  540. package/dist/composition/edge.d.ts.map +1 -1
  541. package/dist/composition/edge.js +25 -28
  542. package/dist/composition/edge.js.map +1 -1
  543. package/dist/composition/enumerate.d.ts +2 -2
  544. package/dist/composition/enumerate.d.ts.map +1 -1
  545. package/dist/composition/enumerate.js.map +1 -1
  546. package/dist/composition/evaluate-relation.d.ts +29 -5
  547. package/dist/composition/evaluate-relation.d.ts.map +1 -1
  548. package/dist/composition/evaluate-relation.js +100 -72
  549. package/dist/composition/evaluate-relation.js.map +1 -1
  550. package/dist/composition/explain.d.ts +14 -4
  551. package/dist/composition/explain.d.ts.map +1 -1
  552. package/dist/composition/explain.js +53 -19
  553. package/dist/composition/explain.js.map +1 -1
  554. package/dist/composition/expr-eval.d.ts.map +1 -1
  555. package/dist/composition/expr-eval.js +2 -1
  556. package/dist/composition/expr-eval.js.map +1 -1
  557. package/dist/composition/expr-simplify.d.ts.map +1 -1
  558. package/dist/composition/expr-simplify.js +9 -39
  559. package/dist/composition/expr-simplify.js.map +1 -1
  560. package/dist/composition/expr-subst.js.map +1 -1
  561. package/dist/composition/formula-shape.d.ts +9 -0
  562. package/dist/composition/formula-shape.d.ts.map +1 -1
  563. package/dist/composition/formula-shape.js +54 -0
  564. package/dist/composition/formula-shape.js.map +1 -1
  565. package/dist/composition/frontier-account.d.ts +3 -2
  566. package/dist/composition/frontier-account.d.ts.map +1 -1
  567. package/dist/composition/frontier-account.js +7 -3
  568. package/dist/composition/frontier-account.js.map +1 -1
  569. package/dist/composition/graph-viz-svg.js.map +1 -1
  570. package/dist/composition/graph-viz.js.map +1 -1
  571. package/dist/composition/grounding.js.map +1 -1
  572. package/dist/composition/identifiability.js.map +1 -1
  573. package/dist/composition/index.d.ts +9 -5
  574. package/dist/composition/index.d.ts.map +1 -1
  575. package/dist/composition/index.js +7 -4
  576. package/dist/composition/index.js.map +1 -1
  577. package/dist/composition/mathts-quiet.d.ts +28 -0
  578. package/dist/composition/mathts-quiet.d.ts.map +1 -0
  579. package/dist/composition/mathts-quiet.js +56 -0
  580. package/dist/composition/mathts-quiet.js.map +1 -0
  581. package/dist/composition/mathts-scalar-symbols.d.ts.map +1 -1
  582. package/dist/composition/mathts-scalar-symbols.js +18 -34
  583. package/dist/composition/mathts-scalar-symbols.js.map +1 -1
  584. package/dist/composition/not-composable-seeds.d.ts +3 -1
  585. package/dist/composition/not-composable-seeds.d.ts.map +1 -1
  586. package/dist/composition/not-composable-seeds.js +2 -0
  587. package/dist/composition/not-composable-seeds.js.map +1 -1
  588. package/dist/composition/probe/backend-protocol.js.map +1 -1
  589. package/dist/composition/probe/candidate-store.js.map +1 -1
  590. package/dist/composition/probe/corpus.js.map +1 -1
  591. package/dist/composition/probe/dataset.js.map +1 -1
  592. package/dist/composition/probe/experiment-design.js.map +1 -1
  593. package/dist/composition/probe/expression-gaps.js.map +1 -1
  594. package/dist/composition/probe/falsify.d.ts +14 -3
  595. package/dist/composition/probe/falsify.d.ts.map +1 -1
  596. package/dist/composition/probe/falsify.js +14 -27
  597. package/dist/composition/probe/falsify.js.map +1 -1
  598. package/dist/composition/probe/fingerprint.js.map +1 -1
  599. package/dist/composition/probe/fit.d.ts +1 -1
  600. package/dist/composition/probe/fit.d.ts.map +1 -1
  601. package/dist/composition/probe/fit.js +2 -1
  602. package/dist/composition/probe/fit.js.map +1 -1
  603. package/dist/composition/probe/frontier.js.map +1 -1
  604. package/dist/composition/probe/generator.js.map +1 -1
  605. package/dist/composition/probe/index.d.ts +4 -2
  606. package/dist/composition/probe/index.d.ts.map +1 -1
  607. package/dist/composition/probe/index.js +4 -2
  608. package/dist/composition/probe/index.js.map +1 -1
  609. package/dist/composition/probe/limits.js.map +1 -1
  610. package/dist/composition/probe/metadata.js.map +1 -1
  611. package/dist/composition/probe/pipeline.d.ts +5 -0
  612. package/dist/composition/probe/pipeline.d.ts.map +1 -1
  613. package/dist/composition/probe/pipeline.js +13 -6
  614. package/dist/composition/probe/pipeline.js.map +1 -1
  615. package/dist/composition/probe/problem.d.ts +8 -0
  616. package/dist/composition/probe/problem.d.ts.map +1 -1
  617. package/dist/composition/probe/problem.js +78 -12
  618. package/dist/composition/probe/problem.js.map +1 -1
  619. package/dist/composition/probe/report.js.map +1 -1
  620. package/dist/composition/probe/residual.js.map +1 -1
  621. package/dist/composition/probe/run-manifest.js +2 -2
  622. package/dist/composition/probe/run-manifest.js.map +1 -1
  623. package/dist/composition/probe/scoring.d.ts +2 -1
  624. package/dist/composition/probe/scoring.d.ts.map +1 -1
  625. package/dist/composition/probe/scoring.js +21 -7
  626. package/dist/composition/probe/scoring.js.map +1 -1
  627. package/dist/composition/probe/search-budget.js.map +1 -1
  628. package/dist/composition/probe/serialize.js.map +1 -1
  629. package/dist/composition/probe/structure.js.map +1 -1
  630. package/dist/composition/probe/study.d.ts +4 -3
  631. package/dist/composition/probe/study.d.ts.map +1 -1
  632. package/dist/composition/probe/study.js +5 -3
  633. package/dist/composition/probe/study.js.map +1 -1
  634. package/dist/composition/probe/types.d.ts +3 -1
  635. package/dist/composition/probe/types.d.ts.map +1 -1
  636. package/dist/composition/probe/types.js +2 -0
  637. package/dist/composition/probe/types.js.map +1 -1
  638. package/dist/composition/proposed-bridges.d.ts +11 -4
  639. package/dist/composition/proposed-bridges.d.ts.map +1 -1
  640. package/dist/composition/proposed-bridges.js +14 -6
  641. package/dist/composition/proposed-bridges.js.map +1 -1
  642. package/dist/composition/quantities.d.ts +0 -4
  643. package/dist/composition/quantities.d.ts.map +1 -1
  644. package/dist/composition/quantities.js +5 -5
  645. package/dist/composition/quantities.js.map +1 -1
  646. package/dist/composition/quantity.d.ts +18 -2
  647. package/dist/composition/quantity.d.ts.map +1 -1
  648. package/dist/composition/quantity.js +35 -6
  649. package/dist/composition/quantity.js.map +1 -1
  650. package/dist/composition/representative-values.js.map +1 -1
  651. package/dist/composition/retrodiction.d.ts +18 -0
  652. package/dist/composition/retrodiction.d.ts.map +1 -1
  653. package/dist/composition/retrodiction.js +37 -7
  654. package/dist/composition/retrodiction.js.map +1 -1
  655. package/dist/composition/uncertainty.js.map +1 -1
  656. package/dist/composition/user-equation.d.ts +11 -7
  657. package/dist/composition/user-equation.d.ts.map +1 -1
  658. package/dist/composition/user-equation.js +24 -26
  659. package/dist/composition/user-equation.js.map +1 -1
  660. package/dist/core/axes-registry.d.ts +8 -5
  661. package/dist/core/axes-registry.d.ts.map +1 -1
  662. package/dist/core/axes-registry.js.map +1 -1
  663. package/dist/core/cell.js.map +1 -1
  664. package/dist/core/constants.d.ts +35 -12
  665. package/dist/core/constants.d.ts.map +1 -1
  666. package/dist/core/constants.js +46 -15
  667. package/dist/core/constants.js.map +1 -1
  668. package/dist/core/data-file.d.ts +27 -0
  669. package/dist/core/data-file.d.ts.map +1 -0
  670. package/dist/core/data-file.js +48 -0
  671. package/dist/core/data-file.js.map +1 -0
  672. package/dist/core/flux-rules.js +1 -1
  673. package/dist/core/flux-rules.js.map +1 -1
  674. package/dist/core/json-schema.d.ts +27 -0
  675. package/dist/core/json-schema.d.ts.map +1 -0
  676. package/dist/core/json-schema.js +177 -0
  677. package/dist/core/json-schema.js.map +1 -0
  678. package/dist/core/labeled-tensor.d.ts +6 -1
  679. package/dist/core/labeled-tensor.d.ts.map +1 -1
  680. package/dist/core/labeled-tensor.js +18 -8
  681. package/dist/core/labeled-tensor.js.map +1 -1
  682. package/dist/core/regime-registry.d.ts +6 -2
  683. package/dist/core/regime-registry.d.ts.map +1 -1
  684. package/dist/core/regime-registry.js.map +1 -1
  685. package/dist/core/regime-rule-install.js.map +1 -1
  686. package/dist/core/regimes-builtins.js.map +1 -1
  687. package/dist/core/tensor.d.ts +7 -4
  688. package/dist/core/tensor.d.ts.map +1 -1
  689. package/dist/core/tensor.js +40 -8
  690. package/dist/core/tensor.js.map +1 -1
  691. package/dist/core/types.d.ts +3 -2
  692. package/dist/core/types.d.ts.map +1 -1
  693. package/dist/core/types.js +16 -14
  694. package/dist/core/types.js.map +1 -1
  695. package/dist/core/universal-index.js.map +1 -1
  696. package/dist/diff/bridge-ast-gradient.d.ts +4 -5
  697. package/dist/diff/bridge-ast-gradient.d.ts.map +1 -1
  698. package/dist/diff/bridge-ast-gradient.js +16 -23
  699. package/dist/diff/bridge-ast-gradient.js.map +1 -1
  700. package/dist/diff/bridge-gradient.d.ts +24 -80
  701. package/dist/diff/bridge-gradient.d.ts.map +1 -1
  702. package/dist/diff/bridge-gradient.js +21 -98
  703. package/dist/diff/bridge-gradient.js.map +1 -1
  704. package/dist/diff/bridge-specs.d.ts +18 -6
  705. package/dist/diff/bridge-specs.d.ts.map +1 -1
  706. package/dist/diff/bridge-specs.js +17 -5
  707. package/dist/diff/bridge-specs.js.map +1 -1
  708. package/dist/dimensional/algebra.js.map +1 -1
  709. package/dist/dimensional/ast-builders.d.ts +5 -4
  710. package/dist/dimensional/ast-builders.d.ts.map +1 -1
  711. package/dist/dimensional/ast-builders.js +6 -5
  712. package/dist/dimensional/ast-builders.js.map +1 -1
  713. package/dist/dimensional/ast-types.js.map +1 -1
  714. package/dist/dimensional/bridge-check.d.ts.map +1 -1
  715. package/dist/dimensional/bridge-check.js +3 -5
  716. package/dist/dimensional/bridge-check.js.map +1 -1
  717. package/dist/dimensional/buckingham.js.map +1 -1
  718. package/dist/dimensional/connection-validators.d.ts +2 -1
  719. package/dist/dimensional/connection-validators.d.ts.map +1 -1
  720. package/dist/dimensional/connection-validators.js.map +1 -1
  721. package/dist/dimensional/connection.js.map +1 -1
  722. package/dist/dimensional/constant-rows.d.ts +54 -0
  723. package/dist/dimensional/constant-rows.d.ts.map +1 -0
  724. package/dist/dimensional/constant-rows.js +115 -0
  725. package/dist/dimensional/constant-rows.js.map +1 -0
  726. package/dist/dimensional/constants.d.ts +7 -17
  727. package/dist/dimensional/constants.d.ts.map +1 -1
  728. package/dist/dimensional/constants.js +12 -21
  729. package/dist/dimensional/constants.js.map +1 -1
  730. package/dist/dimensional/curvature-composite.js.map +1 -1
  731. package/dist/dimensional/curvature-invariants.js.map +1 -1
  732. package/dist/dimensional/curvature.js.map +1 -1
  733. package/dist/dimensional/dimension-inference.js.map +1 -1
  734. package/dist/dimensional/dimension-spec.d.ts +21 -6
  735. package/dist/dimensional/dimension-spec.d.ts.map +1 -1
  736. package/dist/dimensional/dimension-spec.js +150 -160
  737. package/dist/dimensional/dimension-spec.js.map +1 -1
  738. package/dist/dimensional/einstein-equation.js.map +1 -1
  739. package/dist/dimensional/errors.d.ts +3 -1
  740. package/dist/dimensional/errors.d.ts.map +1 -1
  741. package/dist/dimensional/errors.js +2 -2
  742. package/dist/dimensional/errors.js.map +1 -1
  743. package/dist/dimensional/exact-scale.d.ts +79 -0
  744. package/dist/dimensional/exact-scale.d.ts.map +1 -0
  745. package/dist/dimensional/exact-scale.js +222 -0
  746. package/dist/dimensional/exact-scale.js.map +1 -0
  747. package/dist/dimensional/field-equation-helpers.js.map +1 -1
  748. package/dist/dimensional/formula-names.d.ts +13 -12
  749. package/dist/dimensional/formula-names.d.ts.map +1 -1
  750. package/dist/dimensional/formula-names.js +28 -51
  751. package/dist/dimensional/formula-names.js.map +1 -1
  752. package/dist/dimensional/fresh-label.js.map +1 -1
  753. package/dist/dimensional/friedmann-equation.d.ts +3 -3
  754. package/dist/dimensional/friedmann-equation.js +3 -3
  755. package/dist/dimensional/friedmann-equation.js.map +1 -1
  756. package/dist/dimensional/gauge-field.d.ts +2 -3
  757. package/dist/dimensional/gauge-field.d.ts.map +1 -1
  758. package/dist/dimensional/gauge-field.js +0 -1
  759. package/dist/dimensional/gauge-field.js.map +1 -1
  760. package/dist/dimensional/hyphen-names.d.ts.map +1 -1
  761. package/dist/dimensional/hyphen-names.js +8 -0
  762. package/dist/dimensional/hyphen-names.js.map +1 -1
  763. package/dist/dimensional/killing-validators.js.map +1 -1
  764. package/dist/dimensional/klein-gordon-equation.js.map +1 -1
  765. package/dist/dimensional/metric-validators.d.ts +2 -1
  766. package/dist/dimensional/metric-validators.d.ts.map +1 -1
  767. package/dist/dimensional/metric-validators.js.map +1 -1
  768. package/dist/dimensional/metric.js.map +1 -1
  769. package/dist/dimensional/natural-units.js.map +1 -1
  770. package/dist/dimensional/quantity-registry.d.ts +23 -1
  771. package/dist/dimensional/quantity-registry.d.ts.map +1 -1
  772. package/dist/dimensional/quantity-registry.js +55 -18
  773. package/dist/dimensional/quantity-registry.js.map +1 -1
  774. package/dist/dimensional/rg-flow.js.map +1 -1
  775. package/dist/dimensional/stress-energy-validators.js.map +1 -1
  776. package/dist/dimensional/symbolic-constants.d.ts +63 -19
  777. package/dist/dimensional/symbolic-constants.d.ts.map +1 -1
  778. package/dist/dimensional/symbolic-constants.js +114 -92
  779. package/dist/dimensional/symbolic-constants.js.map +1 -1
  780. package/dist/dimensional/tensor-trace.js.map +1 -1
  781. package/dist/dimensional/tensor.js.map +1 -1
  782. package/dist/dimensional/types.js.map +1 -1
  783. package/dist/dimensional/unit-convention.d.ts +0 -2
  784. package/dist/dimensional/unit-convention.d.ts.map +1 -1
  785. package/dist/dimensional/unit-convention.js +2 -2
  786. package/dist/dimensional/unit-convention.js.map +1 -1
  787. package/dist/dimensional/unit-data.d.ts +70 -0
  788. package/dist/dimensional/unit-data.d.ts.map +1 -0
  789. package/dist/dimensional/unit-data.js +139 -0
  790. package/dist/dimensional/unit-data.js.map +1 -0
  791. package/dist/dimensional/units.d.ts +87 -24
  792. package/dist/dimensional/units.d.ts.map +1 -1
  793. package/dist/dimensional/units.js +290 -295
  794. package/dist/dimensional/units.js.map +1 -1
  795. package/dist/dimensional/validator-registry.js.map +1 -1
  796. package/dist/dimensional/validator.d.ts +0 -16
  797. package/dist/dimensional/validator.d.ts.map +1 -1
  798. package/dist/dimensional/validator.js +65 -29
  799. package/dist/dimensional/validator.js.map +1 -1
  800. package/dist/dimensional/weyl-validators.js.map +1 -1
  801. package/dist/index.d.ts +65 -18
  802. package/dist/index.d.ts.map +1 -1
  803. package/dist/index.js +19 -24
  804. package/dist/index.js.map +1 -1
  805. package/dist/numerical/bianchi-residual.js.map +1 -1
  806. package/dist/numerical/binding-value.d.ts +32 -7
  807. package/dist/numerical/binding-value.d.ts.map +1 -1
  808. package/dist/numerical/binding-value.js +218 -209
  809. package/dist/numerical/binding-value.js.map +1 -1
  810. package/dist/numerical/christoffel-flat.js.map +1 -1
  811. package/dist/numerical/connection-lowering-helpers.js.map +1 -1
  812. package/dist/numerical/covariant-eikonal.d.ts.map +1 -1
  813. package/dist/numerical/covariant-eikonal.js +2 -2
  814. package/dist/numerical/covariant-eikonal.js.map +1 -1
  815. package/dist/numerical/curvature-lowering-helpers.d.ts +20 -0
  816. package/dist/numerical/curvature-lowering-helpers.d.ts.map +1 -1
  817. package/dist/numerical/curvature-lowering-helpers.js +6 -3
  818. package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
  819. package/dist/numerical/derivative-lowering.js.map +1 -1
  820. package/dist/numerical/einstein-equation.js.map +1 -1
  821. package/dist/numerical/engine-registry.js.map +1 -1
  822. package/dist/numerical/errors.d.ts +7 -3
  823. package/dist/numerical/errors.d.ts.map +1 -1
  824. package/dist/numerical/errors.js +5 -5
  825. package/dist/numerical/errors.js.map +1 -1
  826. package/dist/numerical/evaluator-uncertainty.d.ts +34 -0
  827. package/dist/numerical/evaluator-uncertainty.d.ts.map +1 -0
  828. package/dist/numerical/evaluator-uncertainty.js +134 -0
  829. package/dist/numerical/evaluator-uncertainty.js.map +1 -0
  830. package/dist/numerical/formula-contract.d.ts +67 -7
  831. package/dist/numerical/formula-contract.d.ts.map +1 -1
  832. package/dist/numerical/formula-contract.js +68 -42
  833. package/dist/numerical/formula-contract.js.map +1 -1
  834. package/dist/numerical/formula-dimension.d.ts +17 -7
  835. package/dist/numerical/formula-dimension.d.ts.map +1 -1
  836. package/dist/numerical/formula-dimension.js +120 -44
  837. package/dist/numerical/formula-dimension.js.map +1 -1
  838. package/dist/numerical/formula-mathts.d.ts.map +1 -1
  839. package/dist/numerical/formula-mathts.js +10 -3
  840. package/dist/numerical/formula-mathts.js.map +1 -1
  841. package/dist/numerical/formula-registry.d.ts +13 -3
  842. package/dist/numerical/formula-registry.d.ts.map +1 -1
  843. package/dist/numerical/formula-registry.js +7 -2
  844. package/dist/numerical/formula-registry.js.map +1 -1
  845. package/dist/numerical/geodesic-integrator.js.map +1 -1
  846. package/dist/numerical/geometrized.js.map +1 -1
  847. package/dist/numerical/gl4-integrator.d.ts +28 -27
  848. package/dist/numerical/gl4-integrator.d.ts.map +1 -1
  849. package/dist/numerical/gl4-integrator.js +44 -45
  850. package/dist/numerical/gl4-integrator.js.map +1 -1
  851. package/dist/numerical/grid-field.js.map +1 -1
  852. package/dist/numerical/index.js.map +1 -1
  853. package/dist/numerical/input-validation.d.ts +3 -6
  854. package/dist/numerical/input-validation.d.ts.map +1 -1
  855. package/dist/numerical/input-validation.js +4 -8
  856. package/dist/numerical/input-validation.js.map +1 -1
  857. package/dist/numerical/killing.d.ts +8 -5
  858. package/dist/numerical/killing.d.ts.map +1 -1
  859. package/dist/numerical/killing.js.map +1 -1
  860. package/dist/numerical/klein-gordon.js.map +1 -1
  861. package/dist/numerical/kretschmann.js.map +1 -1
  862. package/dist/numerical/lowering-utils.js.map +1 -1
  863. package/dist/numerical/lowering.d.ts.map +1 -1
  864. package/dist/numerical/lowering.js +7 -17
  865. package/dist/numerical/lowering.js.map +1 -1
  866. package/dist/numerical/mathts-engine.d.ts.map +1 -1
  867. package/dist/numerical/mathts-engine.js +11 -6
  868. package/dist/numerical/mathts-engine.js.map +1 -1
  869. package/dist/numerical/metric-inverse.js.map +1 -1
  870. package/dist/numerical/null-ic.js.map +1 -1
  871. package/dist/numerical/null-ray-integrator.js +4 -4
  872. package/dist/numerical/null-ray-integrator.js.map +1 -1
  873. package/dist/numerical/painleve-gullstrand-metric.js.map +1 -1
  874. package/dist/numerical/pderiv.d.ts.map +1 -1
  875. package/dist/numerical/pderiv.js +9 -2
  876. package/dist/numerical/pderiv.js.map +1 -1
  877. package/dist/numerical/perihelion-finder.js.map +1 -1
  878. package/dist/numerical/quadrature.d.ts +5 -2
  879. package/dist/numerical/quadrature.d.ts.map +1 -1
  880. package/dist/numerical/quadrature.js +20 -3
  881. package/dist/numerical/quadrature.js.map +1 -1
  882. package/dist/numerical/spacetime-metrics.d.ts +17 -19
  883. package/dist/numerical/spacetime-metrics.d.ts.map +1 -1
  884. package/dist/numerical/spacetime-metrics.js +158 -250
  885. package/dist/numerical/spacetime-metrics.js.map +1 -1
  886. package/dist/numerical/strides.js.map +1 -1
  887. package/dist/numerical/tensor-engine.d.ts +9 -5
  888. package/dist/numerical/tensor-engine.d.ts.map +1 -1
  889. package/dist/numerical/tensor-engine.js.map +1 -1
  890. package/dist/numerical/types.js.map +1 -1
  891. package/dist/numerical/weyl-lowering.js.map +1 -1
  892. package/dist/relations/category.js.map +1 -1
  893. package/dist/relations/composition-table.d.ts +4 -4
  894. package/dist/relations/composition-table.js +4 -4
  895. package/dist/relations/composition-table.js.map +1 -1
  896. package/dist/relations/conventions.js.map +1 -1
  897. package/dist/relations/domain-regimes.js.map +1 -1
  898. package/dist/relations/regime-registration.js.map +1 -1
  899. package/dist/relations/regime-vocabularies.js.map +1 -1
  900. package/dist/relations/regime.d.ts +18 -8
  901. package/dist/relations/regime.d.ts.map +1 -1
  902. package/dist/relations/regime.js +26 -14
  903. package/dist/relations/regime.js.map +1 -1
  904. package/dist/relations/types.d.ts +26 -6
  905. package/dist/relations/types.d.ts.map +1 -1
  906. package/dist/relations/types.js +15 -3
  907. package/dist/relations/types.js.map +1 -1
  908. package/package.json +10 -14
  909. package/dist/bridges/registry.d.ts +0 -60
  910. package/dist/bridges/registry.d.ts.map +0 -1
  911. package/dist/bridges/registry.js +0 -87
  912. package/dist/bridges/registry.js.map +0 -1
  913. package/dist/cli/poster-source.d.ts +0 -154
  914. package/dist/cli/poster-source.d.ts.map +0 -1
  915. package/dist/cli/poster-source.js +0 -184
  916. package/dist/cli/poster-source.js.map +0 -1
@@ -2,12 +2,17 @@
2
2
  * A binding value: a bare number, a number with a unit, or an expression of
3
3
  * registered constants and unit literals (`pi/2`, `0.6*c`, `2*1km`).
4
4
  *
5
- * The MathTS parser produces the node this module evaluates, so a unit
6
- * literal keeps its dimension. A bare `e` is the elementary charge.
7
- * Euler's number is `exp(x)`. A bare number, or an expression whose result is
8
- * dimensionless and contains no unit literal, is already in the caller's
9
- * unit. Anything else is an SI quantity: the caller converts it into the
10
- * declared unit when the dimensions agree.
5
+ * The MathTS parser produces the node this module reads. The number is the
6
+ * MathTS formula parser's, evaluated over the registered constants and the
7
+ * spliced unit literals; this module walks the same parse tree for the
8
+ * dimension and the cycle count only, so a unit literal keeps its dimension
9
+ * and there is one arithmetic. The scalar functions are the one table in
10
+ * `formula-contract.ts`, read for arity and dimension rule here and for the
11
+ * numeric body there. A bare `e` is the elementary charge. Euler's number is
12
+ * `exp(x)`. A bare number, or an expression whose result is dimensionless
13
+ * and contains no unit literal, is already in the caller's unit. Anything
14
+ * else is an SI quantity: the caller converts it into the declared unit when
15
+ * the dimensions agree.
11
16
  *
12
17
  * A unit literal is recognized only where it is glued to a number (`1km`,
13
18
  * `1h`, `1G`). A bare name is a constant (`h`, `G`, `c`), never that unit.
@@ -17,16 +22,40 @@
17
22
  * @module numerical/binding-value
18
23
  * @internal
19
24
  */
20
- import { K_B_SI, M_SUN_SI } from '../core/constants.js';
21
- import { FORMULA_NAMED, assertSynonymAgreement, isTemperatureName, synonymGroup, temperatureQuantityRole, } from '../dimensional/formula-names.js';
25
+ import { K_B_SI } from '../core/constants.js';
26
+ import { assertSynonymAgreement, isTemperatureName, synonymGroup, temperatureQuantityRole, } from '../dimensional/formula-names.js';
22
27
  import { quantityConventionUnit } from '../dimensional/unit-convention.js';
23
28
  import { naturalConstantOverrides } from '../dimensional/natural-units.js';
24
- import { CONSTANTS as SYMBOLIC } from '../dimensional/symbolic-constants.js';
29
+ import { CONSTANT_REGISTRY, constantRecord } from '../dimensional/symbolic-constants.js';
25
30
  import { divide, equals, format, multiply, power } from '../dimensional/algebra.js';
26
- import { DIMENSIONLESS, ENERGY, MASS, TEMPERATURE } from '../dimensional/types.js';
27
- import { affineAbsoluteOffsetK, convertValue, mathTsAgreedQuantity, parseUnit, unitConventionNotes, UnitError, } from '../dimensional/units.js';
28
- import { callBuiltinFunction, EULER_NUMBER_ERROR, FormulaError } from './formula-contract.js';
29
- import { parseFormulaPNode } from './formula-dimension.js';
31
+ import { DIMENSIONLESS, ENERGY, TEMPERATURE } from '../dimensional/types.js';
32
+ import { AmbiguousUnitError, convertValue, parseUnit, readQuantityLiteral, readUnit, unitConventionNotes, UnitError, UnitRefusedError, UnknownUnitError, } from '../dimensional/units.js';
33
+ import { arityMessage, EulerNumberError, FormulaError, SCALAR_FUNCTIONS, unknownFunctionMessage } from './formula-contract.js';
34
+ import { constantExponent, parseFormulaPNode, UnsupportedSyntaxError } from './formula-dimension.js';
35
+ import { mathtsFormulaParser } from './formula-mathts.js';
36
+ /** A value on a temperature slot has a dimension that is neither a temperature nor an energy, or a temperature was read onto a dimensionless slot. @internal */
37
+ export class TemperatureBindingError extends UnitError {
38
+ constructor(message) {
39
+ super(message);
40
+ this.name = 'TemperatureBindingError';
41
+ }
42
+ }
43
+ /** The text is not a number, with or without a unit, or the number is not finite. @internal */
44
+ export class BindingNumberError extends UnitError {
45
+ constructor(message) {
46
+ super(message);
47
+ this.name = 'BindingNumberError';
48
+ }
49
+ }
50
+ /** An expression names something that is neither a registered constant nor a unit literal. @internal */
51
+ class UnknownNameError extends UnitError {
52
+ symbol;
53
+ constructor(symbol) {
54
+ super(`unknown name '${symbol}'`);
55
+ this.symbol = symbol;
56
+ this.name = 'UnknownNameError';
57
+ }
58
+ }
30
59
  /**
31
60
  * A temperature binding speaks kelvin. An energy is `k_B T` (the joules
32
61
  * divided by `kB`). Any other dimension is refused. A bare number, a
@@ -42,20 +71,21 @@ function alignTemperatureBinding(name, raw, read, kB = K_B_SI, declaredTemperatu
42
71
  }
43
72
  if (equals(read.dimension, ENERGY)) {
44
73
  if (!(kB > 0) || !Number.isFinite(kB)) {
45
- throw new UnitError(`cannot read '${raw.trim()}' as a temperature: k_B is not a positive finite number`);
74
+ throw new TemperatureBindingError(`cannot read '${raw.trim()}' as a temperature: k_B is not a positive finite number`);
46
75
  }
47
76
  const kelvin = read.value / kB;
77
+ const temperatureNote = `${name}=${raw.trim()} is read as k_B T, so ${name} is ${kelvin.toExponential(6)} K`;
48
78
  return {
49
79
  value: kelvin,
50
80
  dimensioned: true,
51
81
  dimension: TEMPERATURE,
52
- notes: [
53
- ...read.notes,
54
- `${name}=${raw.trim()} is read as k_B T, so ${name} is ${kelvin.toExponential(6)} K`,
55
- ],
82
+ notes: [...read.notes, temperatureNote],
83
+ cycles: 0,
84
+ temperatureNote,
56
85
  };
57
86
  }
58
- throw new UnitError(`'${raw.trim()}' is ${format(read.dimension)}, but ${name} is a temperature. An energy on a temperature is k_B T.`);
87
+ // An energy returned above, so this dimension is neither a temperature nor an energy.
88
+ throw new TemperatureBindingError(`'${raw.trim()}' is ${format(read.dimension)}, but ${name} is a temperature. Give kelvin, degC, or an energy (read as k_B T).`);
59
89
  }
60
90
  function sameSpelling(a, b) {
61
91
  return a === b || a.replace(/_/g, '-') === b.replace(/_/g, '-');
@@ -68,7 +98,7 @@ function sameSpelling(a, b) {
68
98
  */
69
99
  function boltzmannBindingScale(pending) {
70
100
  const group = synonymGroup('boltzmann-constant') ?? [];
71
- const dim = SYMBOLIC.k_B.dim;
101
+ const dim = constantRecord('k_B').dim;
72
102
  const hits = pending.filter((entry) => {
73
103
  if (!group.some((member) => sameSpelling(member, entry.name)))
74
104
  return false;
@@ -87,47 +117,29 @@ function boltzmannBindingScale(pending) {
87
117
  }
88
118
  return K_B_SI;
89
119
  }
90
- const NUMBER = /^[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?$/;
91
- const NUMBER_UNIT = /^([+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?)\s*(.*?)$/;
92
- const GLUED_NUMBER = /(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?/g;
120
+ /** A number glued to a unit; `spliceUnits` builds its own global copy. */
121
+ const GLUED_NUMBER = /(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?/;
93
122
  function finite(raw, value) {
94
123
  if (!Number.isFinite(value))
95
- throw new UnitError(`'${raw}' is not a finite number`);
124
+ throw new BindingNumberError(`'${raw}' is not a finite number`);
96
125
  return value;
97
126
  }
98
127
  function scopeFor(mode) {
99
128
  const m = new Map();
100
- const put = (name, value, dim) => {
101
- m.set(name, { value, dim });
102
- };
103
- put('pi', Math.PI, DIMENSIONLESS);
104
- put('tau', 2 * Math.PI, DIMENSIONLESS);
105
- for (const [name, c] of Object.entries(SYMBOLIC))
106
- put(name, c.value, c.dim);
107
- for (const n of FORMULA_NAMED)
108
- put(n.name, n.value, n.dim);
109
- const eps = m.get('epsilon_0');
110
- if (eps !== undefined)
111
- put('eps0', eps.value, eps.dim);
112
- const mu = m.get('mu_0');
113
- if (mu !== undefined)
114
- put('mu0', mu.value, mu.dim);
115
- const kb = m.get('k_B');
116
- if (kb !== undefined)
117
- put('kB', kb.value, kb.dim);
118
- put('M_sun', M_SUN_SI, MASS);
129
+ m.set('pi', { value: Math.PI, dim: DIMENSIONLESS, cycles: 0 });
130
+ m.set('tau', { value: 2 * Math.PI, dim: DIMENSIONLESS, cycles: 0 });
131
+ for (const record of CONSTANT_REGISTRY) {
132
+ for (const spelling of [record.name, ...record.spellings])
133
+ m.set(spelling, { value: record.value, dim: record.dim, cycles: 0 });
134
+ }
119
135
  if (mode !== 'si') {
120
136
  for (const [name, value] of Object.entries(naturalConstantOverrides(mode)))
121
- put(name, value, DIMENSIONLESS);
137
+ m.set(name, { value, dim: DIMENSIONLESS, cycles: 0 });
122
138
  }
123
139
  return m;
124
140
  }
125
- /** A unit the parser recognized and refused, rather than a prefix that is not a unit. */
126
- function unitRefusal(e) {
127
- if (!(e instanceof UnitError))
128
- return null;
129
- return /affine|more than one|ambiguous/.test(e.message) ? e : null;
130
- }
141
+ /** The text has an operator, so it is an expression rather than a lone word. */
142
+ const hasOperator = (text) => /[+\-*/^()]/.test(text);
131
143
  /** The longest unit expression at the start of `rest`, or null. */
132
144
  function longestUnit(rest) {
133
145
  if (rest.length === 0 || !/[A-Za-zµμ°ÅΩ]/.test(rest[0]))
@@ -139,19 +151,20 @@ function longestUnit(rest) {
139
151
  if (/[/*^·+\-(\s]$/.test(prefix))
140
152
  continue;
141
153
  try {
142
- parseUnit(prefix);
154
+ readUnit(prefix);
143
155
  // `deg` is a unit, but `degF` is Fahrenheit. Do not keep a prefix whose
144
156
  // next character continues the same token.
145
157
  const next = rest[n];
146
- if (next !== undefined && /[A-Za-z0-9µμ°ÅΩ]/.test(next))
158
+ if (next !== undefined && /[A-Za-z0-9_µμ°ÅΩ]/.test(next))
147
159
  continue;
148
160
  best = prefix;
149
161
  }
150
162
  catch (e) {
151
- const refused = unitRefusal(e);
152
- if (refused !== null)
153
- throw refused;
154
- // A longer prefix may still be a unit (`m` then `m/s`, `M` then `Msun`).
163
+ // An unknown unit at this length: a longer prefix may still be one
164
+ // (`m` then `m/s`, `M` then `Msun`). A refused or ambiguous unit, and
165
+ // anything that is not a unit error, propagates.
166
+ if (!(e instanceof UnknownUnitError))
167
+ throw e;
155
168
  }
156
169
  }
157
170
  return best;
@@ -175,13 +188,12 @@ function spliceUnits(src) {
175
188
  last = end;
176
189
  continue;
177
190
  }
178
- const parsed = parseUnit(unit);
191
+ const parsed = readUnit(unit);
179
192
  if (parsed.affine !== undefined) {
180
- throw new UnitError('an affine temperature cannot be part of an expression; give it alone, or use K');
193
+ throw new UnitRefusedError('an affine temperature cannot be part of an expression; give it alone, or use K');
181
194
  }
182
- const agreed = mathTsAgreedQuantity(1, unit, parsed);
183
195
  const name = `__u${slots.size}`;
184
- slots.set(name, { value: agreed?.value ?? parsed.scale, dim: agreed?.dim ?? parsed.dim });
196
+ slots.set(name, { value: parsed.scale, dim: parsed.dim, cycles: parsed.cycles });
185
197
  for (const note of unitConventionNotes(unit)) {
186
198
  if (!notes.includes(note))
187
199
  notes.push(note);
@@ -193,147 +205,141 @@ function spliceUnits(src) {
193
205
  out += src.slice(last);
194
206
  return { expr: out, slots, notes };
195
207
  }
196
- function evalAst(node, scope, slots) {
208
+ /**
209
+ * An exponent is a dimensionless numeric constant (`2`, `-1`, `1/2`); its
210
+ * value raises the base's dimension. The number of the whole expression is
211
+ * MathTS's, so this is the one place a value is folded here, and it is the
212
+ * same folding the formula dimension checker uses.
213
+ */
214
+ function exponentValue(node, scope, slots) {
215
+ const exp = dimensionWalk(node, scope, slots);
216
+ const value = constantExponent(node);
217
+ if (!equals(exp.dim, DIMENSIONLESS) || value === undefined) {
218
+ throw new UnitError('an exponent must be a dimensionless number');
219
+ }
220
+ return value;
221
+ }
222
+ /**
223
+ * The dimension and cycle count of a parse tree, by the dimensional rules of
224
+ * each node and the one function table. No number is computed here except an
225
+ * exponent's; unknown names, unlike sums and dimensioned transcendental
226
+ * arguments are refused.
227
+ */
228
+ function dimensionWalk(node, scope, slots) {
197
229
  switch (node.kind) {
198
230
  case 'num':
199
- return { value: node.value, dim: DIMENSIONLESS };
231
+ return { dim: DIMENSIONLESS, cycles: 0 };
200
232
  case 'sym': {
201
233
  if (node.name === 'euler')
202
- throw new FormulaError(EULER_NUMBER_ERROR);
203
- const slot = slots.get(node.name);
204
- if (slot !== undefined)
205
- return slot;
206
- const known = scope.get(node.name);
207
- if (known !== undefined)
208
- return known;
209
- throw new UnitError(`unknown name '${node.name}'`);
210
- }
211
- case 'neg': {
212
- const a = evalAst(node.arg, scope, slots);
213
- return { value: -a.value, dim: a.dim };
234
+ throw new EulerNumberError();
235
+ const known = slots.get(node.name) ?? scope.get(node.name);
236
+ if (known === undefined)
237
+ throw new UnknownNameError(node.name);
238
+ return { dim: known.dim, cycles: known.cycles };
214
239
  }
240
+ case 'neg':
241
+ return dimensionWalk(node.arg, scope, slots);
215
242
  case 'op':
216
- return evalOp(node.op, node.args.map((a) => evalAst(a, scope, slots)));
243
+ return dimensionOfOp(node.op, node.args.map((a) => dimensionWalk(a, scope, slots)));
217
244
  case 'pow': {
218
- const base = evalAst(node.base, scope, slots);
219
- const exp = evalAst(node.exp, scope, slots);
220
- if (!equals(exp.dim, DIMENSIONLESS))
221
- throw new UnitError('an exponent must be dimensionless');
222
- return { value: Math.pow(base.value, exp.value), dim: power(base.dim, exp.value) };
245
+ const base = dimensionWalk(node.base, scope, slots);
246
+ const n = exponentValue(node.exp, scope, slots);
247
+ return { dim: power(base.dim, n), cycles: base.cycles * n };
223
248
  }
224
249
  case 'call':
225
- if (node.fn === 'euler')
226
- throw new FormulaError(EULER_NUMBER_ERROR);
227
- return evalCall(node.fn, node.args.map((a) => evalAst(a, scope, slots)));
250
+ return dimensionOfCall(node.fn, node.args, scope, slots);
228
251
  }
229
252
  }
230
- function evalOp(op, args) {
231
- if (args.length === 0)
253
+ function dimensionOfOp(op, args) {
254
+ const first = args[0];
255
+ if (first === undefined)
232
256
  throw new UnitError(`cannot ${op}`);
233
257
  if (op === '+' || op === '-') {
234
- const first = args[0];
235
- if (args.length === 1) {
236
- return op === '-' ? { value: -first.value, dim: first.dim } : first;
237
- }
238
- let value = first.value;
258
+ let cycles = first.cycles;
239
259
  for (const next of args.slice(1)) {
240
260
  if (!equals(first.dim, next.dim)) {
241
261
  throw new UnitError(`cannot ${op === '+' ? 'add' : 'subtract'} ${format(first.dim)} and ${format(next.dim)}`);
242
262
  }
243
- value = op === '+' ? value + next.value : value - next.value;
244
- }
245
- return { value, dim: first.dim };
246
- }
247
- if (op === '*') {
248
- let value = 1;
249
- let dim = DIMENSIONLESS;
250
- for (const a of args) {
251
- value *= a.value;
252
- dim = multiply(dim, a.dim);
263
+ // A sum of a cycle rate and a plain rate has no single cycle count.
264
+ if (next.cycles !== cycles)
265
+ cycles = Number.NaN;
253
266
  }
254
- return { value, dim };
267
+ return { dim: first.dim, cycles };
255
268
  }
256
- let value = args[0].value;
257
- let dim = args[0].dim;
258
- for (const next of args.slice(1)) {
259
- value /= next.value;
260
- dim = divide(dim, next.dim);
269
+ let dim = op === '*' ? DIMENSIONLESS : first.dim;
270
+ let cycles = op === '*' ? 0 : first.cycles;
271
+ for (const a of op === '*' ? args : args.slice(1)) {
272
+ dim = op === '*' ? multiply(dim, a.dim) : divide(dim, a.dim);
273
+ cycles = op === '*' ? cycles + a.cycles : cycles - a.cycles;
261
274
  }
262
- return { value, dim };
275
+ return { dim, cycles };
263
276
  }
264
- function evalCall(fn, args) {
265
- if (fn === 'sqrt' || fn === 'cbrt') {
266
- if (args.length !== 1)
267
- throw new UnitError(`${fn} expected 1 argument`);
268
- const n = fn === 'sqrt' ? 0.5 : 1 / 3;
269
- const value = fn === 'sqrt' ? Math.sqrt(args[0].value) : Math.cbrt(args[0].value);
270
- return { value, dim: power(args[0].dim, n) };
271
- }
272
- if (fn === 'abs') {
273
- if (args.length !== 1)
274
- throw new UnitError('abs expected 1 argument');
275
- return { value: Math.abs(args[0].value), dim: args[0].dim };
276
- }
277
- if (fn === 'pow') {
278
- if (args.length !== 2)
279
- throw new UnitError('pow expects 2 arguments');
280
- if (!equals(args[1].dim, DIMENSIONLESS))
281
- throw new UnitError('an exponent must be dimensionless');
282
- return { value: Math.pow(args[0].value, args[1].value), dim: power(args[0].dim, args[1].value) };
283
- }
284
- if (fn === 'atan2') {
285
- if (args.length !== 2)
286
- throw new UnitError('atan2 expects 2 arguments');
287
- if (!equals(args[0].dim, args[1].dim))
288
- throw new UnitError('atan2 arguments must have the same dimension');
289
- return { value: Math.atan2(args[0].value, args[1].value), dim: DIMENSIONLESS };
290
- }
291
- for (const a of args) {
292
- if (!equals(a.dim, DIMENSIONLESS))
293
- throw new UnitError(`${fn} expects a dimensionless argument`);
277
+ /** A call, by the one table's arity and dimension rule. */
278
+ function dimensionOfCall(fn, args, scope, slots) {
279
+ if (fn === 'euler')
280
+ throw new EulerNumberError();
281
+ const spec = SCALAR_FUNCTIONS[fn];
282
+ if (spec === undefined)
283
+ throw new UnitError(unknownFunctionMessage(fn));
284
+ if (args.length !== spec.arity)
285
+ throw new UnitError(arityMessage(fn, spec.arity));
286
+ const rule = spec.dimension;
287
+ const first = dimensionWalk(args[0], scope, slots);
288
+ switch (rule.kind) {
289
+ case 'root':
290
+ return { dim: power(first.dim, rule.power), cycles: first.cycles * rule.power };
291
+ case 'same':
292
+ return first;
293
+ case 'transcendental':
294
+ if (!equals(first.dim, DIMENSIONLESS))
295
+ throw new UnitError(`${fn} expects a dimensionless argument`);
296
+ return { dim: DIMENSIONLESS, cycles: 0 };
297
+ case 'power': {
298
+ const n = exponentValue(args[1], scope, slots);
299
+ return { dim: power(first.dim, n), cycles: first.cycles * n };
300
+ }
301
+ case 'ratio': {
302
+ const second = dimensionWalk(args[1], scope, slots);
303
+ if (!equals(first.dim, second.dim))
304
+ throw new UnitError(`${fn} arguments must have the same dimension`);
305
+ return { dim: DIMENSIONLESS, cycles: 0 };
306
+ }
294
307
  }
308
+ }
309
+ /**
310
+ * The number of a spliced expression: the MathTS formula parser over the
311
+ * registered constants and the unit slots. The dimension walk has already
312
+ * refused unknown names, so a failure here is a non-finite result.
313
+ */
314
+ function numberOf(raw, expr, scope, slots) {
315
+ const values = {};
316
+ for (const [name, qty] of scope)
317
+ values[name] = qty.value;
318
+ for (const [name, qty] of slots)
319
+ values[name] = qty.value;
295
320
  try {
296
- return { value: callBuiltinFunction(fn, args.map((a) => a.value)), dim: DIMENSIONLESS };
321
+ return mathtsFormulaParser.parse(expr).evaluate(values);
297
322
  }
298
323
  catch (e) {
299
324
  if (e instanceof FormulaError)
300
- throw new UnitError(e.message);
325
+ throw new BindingNumberError(`'${raw}' is not a finite number`);
301
326
  throw e;
302
327
  }
303
328
  }
304
- function plainUnit(raw, reading) {
305
- const m = NUMBER_UNIT.exec(raw);
306
- // A leading `*` is multiplication (`2*h`, `0.6*c`). `parseUnit` would drop
307
- // it and read the name as a unit (`h` the hour). A leading `/` is a unit
308
- // (`1/s`) when the remainder parses, and an expression otherwise.
309
- if (m === null || m[2] === undefined || m[2] === '' || m[2].startsWith('*') || m[2].startsWith('·'))
310
- return null;
311
- let unit;
312
- try {
313
- unit = parseUnit(m[2]);
314
- }
315
- catch (e) {
316
- const refused = unitRefusal(e);
317
- if (refused !== null)
318
- throw refused;
329
+ /** The literal path: a number with an optional unit, read exactly by the one unit reader. */
330
+ function literalBinding(raw, reading) {
331
+ const literal = readQuantityLiteral(raw, reading);
332
+ if (literal === null)
319
333
  return null;
320
- }
321
- const v = finite(raw, Number(m[1]));
322
- const offset = unit.affine !== undefined && reading === 'absolute' ? affineAbsoluteOffsetK(unit.affine) : 0;
323
- const agreed = offset === 0 ? mathTsAgreedQuantity(v, m[2], unit) : undefined;
324
334
  return {
325
- value: agreed?.value ?? v * unit.scale + offset,
326
- dimensioned: true,
327
- dimension: agreed?.dim ?? unit.dim,
328
- notes: unitConventionNotes(m[2]),
335
+ value: finite(raw, literal.value),
336
+ dimensioned: literal.unit !== '',
337
+ dimension: literal.dim,
338
+ notes: unitConventionNotes(literal.unit),
339
+ cycles: literal.cycles,
340
+ ...(literal.affine === undefined ? {} : { affine: literal.affine }),
329
341
  };
330
342
  }
331
- function looksLikeNumberUnit(raw) {
332
- const matched = NUMBER_UNIT.exec(raw.trim());
333
- if (matched === null || matched[2] === undefined || matched[2] === '')
334
- return false;
335
- return !matched[2].startsWith('*') && !matched[2].startsWith('·');
336
- }
337
343
  /**
338
344
  * A number-plus-unit whose dimension matches `target`, including an ambiguous
339
345
  * token that has one reading of that dimension. A unique dimension mismatch
@@ -341,22 +347,25 @@ function looksLikeNumberUnit(raw) {
341
347
  * An ambiguous expression that matches nothing throws.
342
348
  */
343
349
  function declaredUnitReading(raw, target, reading) {
344
- if (!looksLikeNumberUnit(raw))
345
- return undefined;
346
350
  try {
347
351
  const converted = convertValue(raw, target, reading);
348
352
  if (converted.given === '')
349
353
  return undefined;
350
- const to = parseUnit(target);
351
354
  return {
352
355
  value: converted.value,
353
356
  dimensioned: true,
354
- dimension: to.dim,
357
+ dimension: parseUnit(target).dim,
355
358
  notes: unitConventionNotes(converted.given),
359
+ cycles: converted.cycles ?? 0,
360
+ ...(converted.affine === undefined ? {} : { affine: converted.affine }),
356
361
  };
357
362
  }
358
363
  catch (error) {
359
- if (error instanceof UnitError && /ambiguous/.test(error.message))
364
+ if (error instanceof AmbiguousUnitError)
365
+ throw error;
366
+ // A unit the reader could not match to the target is the "not this
367
+ // reading" outcome; anything that is not a unit error propagates.
368
+ if (!(error instanceof UnitError))
360
369
  throw error;
361
370
  return undefined;
362
371
  }
@@ -388,8 +397,11 @@ export function readNamedBinding(name, raw, opts) {
388
397
  try {
389
398
  pending.push({ name: sibling.name, read: readBinding(sibling.raw, { mode, reading }) });
390
399
  }
391
- catch {
392
- // A sibling that does not parse is that sibling's own error.
400
+ catch (error) {
401
+ // A sibling that does not read as a value is that sibling's own error,
402
+ // reported where it is read. A programming error propagates.
403
+ if (!(error instanceof UnitError))
404
+ throw error;
393
405
  }
394
406
  }
395
407
  const declaredDim = declared !== undefined && declared !== '' ? parseUnit(declared).dim : undefined;
@@ -400,7 +412,7 @@ export function readNamedBinding(name, raw, opts) {
400
412
  const energyBecameTemperature = aligned.dimensioned && equals(aligned.dimension, TEMPERATURE) && !equals(read.dimension, TEMPERATURE);
401
413
  if (energyBecameTemperature) {
402
414
  if (target === '') {
403
- throw new UnitError(`'${raw.trim()}' is a temperature, but this input is dimensionless`);
415
+ throw new TemperatureBindingError(`'${raw.trim()}' is a temperature, but this input is dimensionless`);
404
416
  }
405
417
  const to = parseUnit(target);
406
418
  if (to.affine !== undefined)
@@ -408,12 +420,7 @@ export function readNamedBinding(name, raw, opts) {
408
420
  if (!equals(aligned.dimension, to.dim)) {
409
421
  throw new UnitError(`'${raw.trim()}' is ${format(aligned.dimension)}, but this input is ${format(to.dim)} (${target})`);
410
422
  }
411
- return {
412
- value: aligned.value / to.scale,
413
- dimensioned: true,
414
- dimension: to.dim,
415
- notes: aligned.notes,
416
- };
423
+ return { ...aligned, value: aligned.value / to.scale, dimensioned: true, dimension: to.dim };
417
424
  }
418
425
  const converted = bindingInUnit(raw, target, reading, mode);
419
426
  return {
@@ -421,6 +428,8 @@ export function readNamedBinding(name, raw, opts) {
421
428
  dimensioned: converted.given !== '',
422
429
  dimension: target === '' ? DIMENSIONLESS : parseUnit(target).dim,
423
430
  notes: unitConventionNotes(converted.given),
431
+ cycles: converted.cycles ?? 0,
432
+ ...(converted.affine === undefined ? {} : { affine: converted.affine }),
424
433
  };
425
434
  }
426
435
  /**
@@ -433,48 +442,47 @@ export function readBinding(raw, opts) {
433
442
  const mode = opts?.mode ?? 'si';
434
443
  const reading = opts?.reading ?? 'absolute';
435
444
  if (trimmed === '')
436
- throw new UnitError(`'${raw}' is not a finite number`);
437
- if (NUMBER.test(trimmed)) {
438
- return { value: finite(trimmed, Number(trimmed)), dimensioned: false, dimension: DIMENSIONLESS, notes: [] };
439
- }
440
- const plain = plainUnit(trimmed, reading);
441
- if (plain !== null)
442
- return plain;
445
+ throw new BindingNumberError(`'${raw}' is not a finite number`);
446
+ const literal = literalBinding(trimmed, reading);
447
+ if (literal !== null)
448
+ return literal;
443
449
  const spliced = spliceUnits(trimmed);
450
+ const notANumber = () => new BindingNumberError(`'${trimmed}' is not a number with an optional unit`);
444
451
  let ast;
445
452
  try {
446
453
  ast = parseFormulaPNode(spliced.expr);
447
454
  }
448
455
  catch (e) {
456
+ // Syntax the normalized form has no shape for (`1.2.3`, `a.b`) is not a value.
457
+ if (e instanceof UnsupportedSyntaxError)
458
+ throw notANumber();
459
+ // `euler` names the refused constant; keep that sentence.
460
+ if (e instanceof EulerNumberError)
461
+ throw new UnitError(e.message);
449
462
  if (e instanceof FormulaError) {
450
- // `euler` names the refused constant. Keep that sentence; a bare unknown
451
- // word is not an expression, and a token with an operator (`2*`) is.
452
- if (e.message.includes('exp(x)'))
453
- throw new UnitError(e.message);
454
- if (!/[+\-*/^()]/.test(trimmed))
455
- throw new UnitError(`'${trimmed}' is not a number with an optional unit`);
463
+ // A bare unknown word is not an expression; a token with an operator (`2*`) is.
464
+ if (!hasOperator(trimmed))
465
+ throw notANumber();
456
466
  throw new UnitError(e.message);
457
467
  }
458
468
  throw e;
459
469
  }
460
- let qty;
470
+ const scope = scopeFor(mode);
471
+ let shape;
461
472
  try {
462
- qty = evalAst(ast, scopeFor(mode), spliced.slots);
473
+ shape = dimensionWalk(ast, scope, spliced.slots);
463
474
  }
464
475
  catch (e) {
465
- if (e instanceof UnitError &&
466
- /unknown name '/.test(e.message) &&
467
- spliced.slots.size === 0 &&
468
- !/[+\-*/^()]/.test(trimmed)) {
469
- throw new UnitError(`'${trimmed}' is not a number with an optional unit`);
470
- }
476
+ if (e instanceof UnknownNameError && spliced.slots.size === 0 && !hasOperator(trimmed))
477
+ throw notANumber();
471
478
  throw e;
472
479
  }
473
480
  return {
474
- value: finite(trimmed, qty.value),
475
- dimensioned: spliced.slots.size > 0 || !equals(qty.dim, DIMENSIONLESS),
476
- dimension: qty.dim,
481
+ value: finite(trimmed, numberOf(trimmed, spliced.expr, scope, spliced.slots)),
482
+ dimensioned: spliced.slots.size > 0 || !equals(shape.dim, DIMENSIONLESS),
483
+ dimension: shape.dim,
477
484
  notes: spliced.notes,
485
+ cycles: shape.cycles,
478
486
  };
479
487
  }
480
488
  /**
@@ -483,9 +491,10 @@ export function readBinding(raw, opts) {
483
491
  * @internal
484
492
  */
485
493
  export function bindingInUnit(raw, target, reading = 'absolute', mode = 'si') {
486
- if (NUMBER.test(raw.trim()) || looksLikeNumberUnit(raw)) {
494
+ // A literal the one unit reader accepts converts exactly, unit to unit; anything else
495
+ // (an expression such as `1Hz + 1/(1s)`) is read as an expression and converted from SI.
496
+ if (readQuantityLiteral(raw, reading) !== null)
487
497
  return convertValue(raw, target, reading);
488
- }
489
498
  const b = readBinding(raw, { reading, mode });
490
499
  if (!b.dimensioned)
491
500
  return { value: b.value, given: '' };
@@ -495,7 +504,7 @@ export function bindingInUnit(raw, target, reading = 'absolute', mode = 'si') {
495
504
  if (!equals(b.dimension, to.dim)) {
496
505
  throw new UnitError(`'${raw.trim()}' is ${format(b.dimension)}, but this input is ${format(to.dim)} (${target || 'dimensionless'})`);
497
506
  }
498
- return { value: b.value / to.scale, given: raw.trim() };
507
+ return { value: b.value / to.scale, given: raw.trim(), ...(b.cycles === 0 ? {} : { cycles: b.cycles }) };
499
508
  }
500
509
  /**
501
510
  * A parameter whose unit is the SI base of `expected`. A bare number is