universal-physics-tensor 8.0.0 → 9.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 (322) hide show
  1. package/README.md +8 -6
  2. package/data/atlas/atlas.json +21 -21
  3. package/data/atlas/atlas.jsonld +1 -1
  4. package/data/atlas/diffusion.json +5 -5
  5. package/data/atlas/oscillators.json +7 -7
  6. package/data/atlas/waves.json +11 -11
  7. package/data/bridge-catalog.json +490 -338
  8. package/data/bridge-catalog.schema.json +566 -40
  9. package/data/quantities.json +230 -218
  10. package/data/quantities.schema.json +52 -0
  11. package/data/units.json +1149 -0
  12. package/data/units.schema.json +124 -0
  13. package/dist/atlas/association.d.ts +1 -1
  14. package/dist/atlas/benchmark/hybrid-retrieval.d.ts.map +1 -1
  15. package/dist/atlas/benchmark/hybrid-retrieval.js +2 -5
  16. package/dist/atlas/benchmark/hybrid-retrieval.js.map +1 -1
  17. package/dist/atlas/physjs-entries.generated.d.ts +1601 -220
  18. package/dist/atlas/physjs-entries.generated.d.ts.map +1 -1
  19. package/dist/atlas/physjs-entries.generated.js +1854 -345
  20. package/dist/atlas/physjs-entries.generated.js.map +1 -1
  21. package/dist/atlas/physjs-ref.d.ts +89 -89
  22. package/dist/atlas/physjs-ref.d.ts.map +1 -1
  23. package/dist/atlas/physjs-ref.js +128 -176
  24. package/dist/atlas/physjs-ref.js.map +1 -1
  25. package/dist/atlas/proof-target.d.ts +16 -8
  26. package/dist/atlas/proof-target.d.ts.map +1 -1
  27. package/dist/atlas/proof-target.js +34 -31
  28. package/dist/atlas/proof-target.js.map +1 -1
  29. package/dist/bridges/catalog-adapter.d.ts.map +1 -1
  30. package/dist/bridges/catalog-adapter.js +5 -5
  31. package/dist/bridges/catalog-adapter.js.map +1 -1
  32. package/dist/bridges/catalog-load.d.ts +7 -0
  33. package/dist/bridges/catalog-load.d.ts.map +1 -1
  34. package/dist/bridges/catalog-load.js +69 -13
  35. package/dist/bridges/catalog-load.js.map +1 -1
  36. package/dist/bridges/catalog-types.d.ts +51 -6
  37. package/dist/bridges/catalog-types.d.ts.map +1 -1
  38. package/dist/bridges/evaluation-errors.d.ts +76 -0
  39. package/dist/bridges/evaluation-errors.d.ts.map +1 -0
  40. package/dist/bridges/evaluation-errors.js +118 -0
  41. package/dist/bridges/evaluation-errors.js.map +1 -0
  42. package/dist/bridges/evaluator-inputs.d.ts +5 -3
  43. package/dist/bridges/evaluator-inputs.d.ts.map +1 -1
  44. package/dist/bridges/evaluator-inputs.js +24 -24
  45. package/dist/bridges/evaluator-inputs.js.map +1 -1
  46. package/dist/bridges/evaluators.d.ts +32 -7
  47. package/dist/bridges/evaluators.d.ts.map +1 -1
  48. package/dist/bridges/evaluators.js +131 -29
  49. package/dist/bridges/evaluators.js.map +1 -1
  50. package/dist/bridges/expr-parse.d.ts +11 -3
  51. package/dist/bridges/expr-parse.d.ts.map +1 -1
  52. package/dist/bridges/expr-parse.js +46 -153
  53. package/dist/bridges/expr-parse.js.map +1 -1
  54. package/dist/bridges/holds.d.ts +11 -7
  55. package/dist/bridges/holds.d.ts.map +1 -1
  56. package/dist/bridges/holds.js +113 -234
  57. package/dist/bridges/holds.js.map +1 -1
  58. package/dist/bridges/input-contract.d.ts +65 -0
  59. package/dist/bridges/input-contract.d.ts.map +1 -0
  60. package/dist/bridges/input-contract.js +97 -0
  61. package/dist/bridges/input-contract.js.map +1 -0
  62. package/dist/bridges/notices.d.ts +11 -0
  63. package/dist/bridges/notices.d.ts.map +1 -0
  64. package/dist/bridges/notices.js +22 -0
  65. package/dist/bridges/notices.js.map +1 -0
  66. package/dist/canonical/canonical-equation.d.ts +31 -0
  67. package/dist/canonical/canonical-equation.d.ts.map +1 -1
  68. package/dist/canonical/entries/atomic.d.ts.map +1 -1
  69. package/dist/canonical/entries/atomic.js +11 -1
  70. package/dist/canonical/entries/atomic.js.map +1 -1
  71. package/dist/canonical/entries/condensed-matter.d.ts.map +1 -1
  72. package/dist/canonical/entries/condensed-matter.js +3 -0
  73. package/dist/canonical/entries/condensed-matter.js.map +1 -1
  74. package/dist/canonical/entries/dimensional-classics.d.ts.map +1 -1
  75. package/dist/canonical/entries/dimensional-classics.js +48 -0
  76. package/dist/canonical/entries/dimensional-classics.js.map +1 -1
  77. package/dist/canonical/entries/electromagnetism.d.ts.map +1 -1
  78. package/dist/canonical/entries/electromagnetism.js +30 -0
  79. package/dist/canonical/entries/electromagnetism.js.map +1 -1
  80. package/dist/canonical/entries/fluids-waves.d.ts.map +1 -1
  81. package/dist/canonical/entries/fluids-waves.js +34 -0
  82. package/dist/canonical/entries/fluids-waves.js.map +1 -1
  83. package/dist/canonical/entries/mechanics.d.ts.map +1 -1
  84. package/dist/canonical/entries/mechanics.js +24 -0
  85. package/dist/canonical/entries/mechanics.js.map +1 -1
  86. package/dist/canonical/entries/nonmonomial.d.ts.map +1 -1
  87. package/dist/canonical/entries/nonmonomial.js +15 -4
  88. package/dist/canonical/entries/nonmonomial.js.map +1 -1
  89. package/dist/canonical/entries/relativity.d.ts.map +1 -1
  90. package/dist/canonical/entries/relativity.js +6 -0
  91. package/dist/canonical/entries/relativity.js.map +1 -1
  92. package/dist/canonical/entries/statistical-mechanics.d.ts.map +1 -1
  93. package/dist/canonical/entries/statistical-mechanics.js +19 -0
  94. package/dist/canonical/entries/statistical-mechanics.js.map +1 -1
  95. package/dist/canonical/entries/thermo-nuclear-cosmo.d.ts.map +1 -1
  96. package/dist/canonical/entries/thermo-nuclear-cosmo.js +15 -0
  97. package/dist/canonical/entries/thermo-nuclear-cosmo.js.map +1 -1
  98. package/dist/cases/index.d.ts +9 -2
  99. package/dist/cases/index.d.ts.map +1 -1
  100. package/dist/cases/index.js +26 -7
  101. package/dist/cases/index.js.map +1 -1
  102. package/dist/cases/kepler-rv.js +6 -6
  103. package/dist/cases/kepler-rv.js.map +1 -1
  104. package/dist/cli/commands/_discovery-opts.d.ts +2 -1
  105. package/dist/cli/commands/_discovery-opts.d.ts.map +1 -1
  106. package/dist/cli/commands/_discovery-opts.js +7 -12
  107. package/dist/cli/commands/_discovery-opts.js.map +1 -1
  108. package/dist/cli/commands/atlas.d.ts.map +1 -1
  109. package/dist/cli/commands/atlas.js +6 -9
  110. package/dist/cli/commands/atlas.js.map +1 -1
  111. package/dist/cli/commands/audit.d.ts.map +1 -1
  112. package/dist/cli/commands/audit.js +1 -2
  113. package/dist/cli/commands/audit.js.map +1 -1
  114. package/dist/cli/commands/connectors.d.ts.map +1 -1
  115. package/dist/cli/commands/connectors.js +8 -9
  116. package/dist/cli/commands/connectors.js.map +1 -1
  117. package/dist/cli/commands/derive.js +9 -10
  118. package/dist/cli/commands/derive.js.map +1 -1
  119. package/dist/cli/commands/discover.d.ts.map +1 -1
  120. package/dist/cli/commands/discover.js +3 -4
  121. package/dist/cli/commands/discover.js.map +1 -1
  122. package/dist/cli/commands/eval.d.ts.map +1 -1
  123. package/dist/cli/commands/eval.js +17 -17
  124. package/dist/cli/commands/eval.js.map +1 -1
  125. package/dist/cli/commands/evaluate.d.ts +1 -35
  126. package/dist/cli/commands/evaluate.d.ts.map +1 -1
  127. package/dist/cli/commands/evaluate.js +56 -187
  128. package/dist/cli/commands/evaluate.js.map +1 -1
  129. package/dist/cli/commands/explain.d.ts.map +1 -1
  130. package/dist/cli/commands/explain.js +43 -38
  131. package/dist/cli/commands/explain.js.map +1 -1
  132. package/dist/cli/commands/ground.js +1 -1
  133. package/dist/cli/commands/ground.js.map +1 -1
  134. package/dist/cli/commands/map.js +3 -4
  135. package/dist/cli/commands/map.js.map +1 -1
  136. package/dist/cli/commands/metric.d.ts.map +1 -1
  137. package/dist/cli/commands/metric.js +3 -0
  138. package/dist/cli/commands/metric.js.map +1 -1
  139. package/dist/cli/commands/regime.js +1 -1
  140. package/dist/cli/commands/regime.js.map +1 -1
  141. package/dist/cli/commands/symbolic.d.ts.map +1 -1
  142. package/dist/cli/commands/symbolic.js +5 -2
  143. package/dist/cli/commands/symbolic.js.map +1 -1
  144. package/dist/cli/commands/testplan.js +3 -3
  145. package/dist/cli/commands/testplan.js.map +1 -1
  146. package/dist/cli/conventions.d.ts +6 -7
  147. package/dist/cli/conventions.d.ts.map +1 -1
  148. package/dist/cli/conventions.js +19 -28
  149. package/dist/cli/conventions.js.map +1 -1
  150. package/dist/cli/euler-guard.d.ts +13 -2
  151. package/dist/cli/euler-guard.d.ts.map +1 -1
  152. package/dist/cli/euler-guard.js +17 -3
  153. package/dist/cli/euler-guard.js.map +1 -1
  154. package/dist/cli/eval-numbers.d.ts +4 -9
  155. package/dist/cli/eval-numbers.d.ts.map +1 -1
  156. package/dist/cli/eval-numbers.js +11 -41
  157. package/dist/cli/eval-numbers.js.map +1 -1
  158. package/dist/cli/published-url.d.ts +2 -0
  159. package/dist/cli/published-url.d.ts.map +1 -1
  160. package/dist/cli/published-url.js +5 -0
  161. package/dist/cli/published-url.js.map +1 -1
  162. package/dist/cli/record-tables.d.ts +2 -1
  163. package/dist/cli/record-tables.d.ts.map +1 -1
  164. package/dist/cli/record-tables.js +8 -3
  165. package/dist/cli/record-tables.js.map +1 -1
  166. package/dist/cli-api.d.ts +45 -12
  167. package/dist/cli-api.d.ts.map +1 -1
  168. package/dist/cli-api.js +38 -11
  169. package/dist/cli-api.js.map +1 -1
  170. package/dist/composition/adjudication.d.ts +8 -30
  171. package/dist/composition/adjudication.d.ts.map +1 -1
  172. package/dist/composition/adjudication.js +15 -67
  173. package/dist/composition/adjudication.js.map +1 -1
  174. package/dist/composition/aliases.d.ts +1 -1
  175. package/dist/composition/aliases.d.ts.map +1 -1
  176. package/dist/composition/aliases.js +10 -20
  177. package/dist/composition/aliases.js.map +1 -1
  178. package/dist/composition/bridge-analysis.d.ts +4 -0
  179. package/dist/composition/bridge-analysis.d.ts.map +1 -1
  180. package/dist/composition/bridge-analysis.js +13 -14
  181. package/dist/composition/bridge-analysis.js.map +1 -1
  182. package/dist/composition/canonical-graph.d.ts +7 -9
  183. package/dist/composition/canonical-graph.d.ts.map +1 -1
  184. package/dist/composition/canonical-graph.js +35 -19
  185. package/dist/composition/canonical-graph.js.map +1 -1
  186. package/dist/composition/canonical-prefactors.d.ts +10 -29
  187. package/dist/composition/canonical-prefactors.d.ts.map +1 -1
  188. package/dist/composition/canonical-prefactors.js +15 -202
  189. package/dist/composition/canonical-prefactors.js.map +1 -1
  190. package/dist/composition/compose.js +2 -1
  191. package/dist/composition/compose.js.map +1 -1
  192. package/dist/composition/discovery.d.ts +50 -0
  193. package/dist/composition/discovery.d.ts.map +1 -1
  194. package/dist/composition/discovery.js +2 -2
  195. package/dist/composition/discovery.js.map +1 -1
  196. package/dist/composition/edge.d.ts +0 -14
  197. package/dist/composition/edge.d.ts.map +1 -1
  198. package/dist/composition/edge.js +1 -17
  199. package/dist/composition/edge.js.map +1 -1
  200. package/dist/composition/evaluate-relation.d.ts +29 -5
  201. package/dist/composition/evaluate-relation.d.ts.map +1 -1
  202. package/dist/composition/evaluate-relation.js +100 -72
  203. package/dist/composition/evaluate-relation.js.map +1 -1
  204. package/dist/composition/explain.d.ts +5 -0
  205. package/dist/composition/explain.d.ts.map +1 -1
  206. package/dist/composition/explain.js +9 -8
  207. package/dist/composition/explain.js.map +1 -1
  208. package/dist/composition/expr-eval.d.ts.map +1 -1
  209. package/dist/composition/expr-eval.js +2 -1
  210. package/dist/composition/expr-eval.js.map +1 -1
  211. package/dist/composition/index.d.ts +3 -1
  212. package/dist/composition/index.d.ts.map +1 -1
  213. package/dist/composition/index.js +3 -1
  214. package/dist/composition/index.js.map +1 -1
  215. package/dist/composition/proposed-bridges.d.ts.map +1 -1
  216. package/dist/composition/proposed-bridges.js +3 -2
  217. package/dist/composition/proposed-bridges.js.map +1 -1
  218. package/dist/composition/retrodiction.d.ts +8 -0
  219. package/dist/composition/retrodiction.d.ts.map +1 -1
  220. package/dist/composition/retrodiction.js +5 -0
  221. package/dist/composition/retrodiction.js.map +1 -1
  222. package/dist/composition/user-equation.d.ts +11 -7
  223. package/dist/composition/user-equation.d.ts.map +1 -1
  224. package/dist/composition/user-equation.js +24 -26
  225. package/dist/composition/user-equation.js.map +1 -1
  226. package/dist/core/constants.d.ts +27 -4
  227. package/dist/core/constants.d.ts.map +1 -1
  228. package/dist/core/constants.js +38 -5
  229. package/dist/core/constants.js.map +1 -1
  230. package/dist/core/data-file.d.ts +27 -0
  231. package/dist/core/data-file.d.ts.map +1 -0
  232. package/dist/core/data-file.js +48 -0
  233. package/dist/core/data-file.js.map +1 -0
  234. package/dist/core/json-schema.d.ts +27 -0
  235. package/dist/core/json-schema.d.ts.map +1 -0
  236. package/dist/core/json-schema.js +153 -0
  237. package/dist/core/json-schema.js.map +1 -0
  238. package/dist/core/types.d.ts +3 -2
  239. package/dist/core/types.d.ts.map +1 -1
  240. package/dist/core/types.js +16 -14
  241. package/dist/core/types.js.map +1 -1
  242. package/dist/diff/bridge-ast-gradient.d.ts.map +1 -1
  243. package/dist/diff/bridge-ast-gradient.js +6 -17
  244. package/dist/diff/bridge-ast-gradient.js.map +1 -1
  245. package/dist/diff/bridge-specs.d.ts +2 -1
  246. package/dist/diff/bridge-specs.d.ts.map +1 -1
  247. package/dist/diff/bridge-specs.js +1 -1
  248. package/dist/diff/bridge-specs.js.map +1 -1
  249. package/dist/dimensional/bridge-check.d.ts.map +1 -1
  250. package/dist/dimensional/bridge-check.js +3 -5
  251. package/dist/dimensional/bridge-check.js.map +1 -1
  252. package/dist/dimensional/constant-rows.d.ts +54 -0
  253. package/dist/dimensional/constant-rows.d.ts.map +1 -0
  254. package/dist/dimensional/constant-rows.js +111 -0
  255. package/dist/dimensional/constant-rows.js.map +1 -0
  256. package/dist/dimensional/constants.d.ts +4 -13
  257. package/dist/dimensional/constants.d.ts.map +1 -1
  258. package/dist/dimensional/constants.js +11 -19
  259. package/dist/dimensional/constants.js.map +1 -1
  260. package/dist/dimensional/dimension-spec.d.ts +12 -3
  261. package/dist/dimensional/dimension-spec.d.ts.map +1 -1
  262. package/dist/dimensional/dimension-spec.js +114 -150
  263. package/dist/dimensional/dimension-spec.js.map +1 -1
  264. package/dist/dimensional/exact-scale.d.ts +79 -0
  265. package/dist/dimensional/exact-scale.d.ts.map +1 -0
  266. package/dist/dimensional/exact-scale.js +222 -0
  267. package/dist/dimensional/exact-scale.js.map +1 -0
  268. package/dist/dimensional/formula-names.d.ts +13 -12
  269. package/dist/dimensional/formula-names.d.ts.map +1 -1
  270. package/dist/dimensional/formula-names.js +28 -51
  271. package/dist/dimensional/formula-names.js.map +1 -1
  272. package/dist/dimensional/quantity-registry.d.ts +10 -1
  273. package/dist/dimensional/quantity-registry.d.ts.map +1 -1
  274. package/dist/dimensional/quantity-registry.js +45 -16
  275. package/dist/dimensional/quantity-registry.js.map +1 -1
  276. package/dist/dimensional/symbolic-constants.d.ts +63 -19
  277. package/dist/dimensional/symbolic-constants.d.ts.map +1 -1
  278. package/dist/dimensional/symbolic-constants.js +109 -92
  279. package/dist/dimensional/symbolic-constants.js.map +1 -1
  280. package/dist/dimensional/unit-data.d.ts +70 -0
  281. package/dist/dimensional/unit-data.d.ts.map +1 -0
  282. package/dist/dimensional/unit-data.js +135 -0
  283. package/dist/dimensional/unit-data.js.map +1 -0
  284. package/dist/dimensional/units.d.ts +87 -24
  285. package/dist/dimensional/units.d.ts.map +1 -1
  286. package/dist/dimensional/units.js +253 -276
  287. package/dist/dimensional/units.js.map +1 -1
  288. package/dist/index.d.ts +15 -13
  289. package/dist/index.d.ts.map +1 -1
  290. package/dist/index.js +7 -4
  291. package/dist/index.js.map +1 -1
  292. package/dist/numerical/binding-value.d.ts +21 -1
  293. package/dist/numerical/binding-value.d.ts.map +1 -1
  294. package/dist/numerical/binding-value.js +123 -118
  295. package/dist/numerical/binding-value.js.map +1 -1
  296. package/dist/numerical/evaluator-uncertainty.d.ts +34 -0
  297. package/dist/numerical/evaluator-uncertainty.d.ts.map +1 -0
  298. package/dist/numerical/evaluator-uncertainty.js +117 -0
  299. package/dist/numerical/evaluator-uncertainty.js.map +1 -0
  300. package/dist/numerical/formula-contract.d.ts +4 -0
  301. package/dist/numerical/formula-contract.d.ts.map +1 -1
  302. package/dist/numerical/formula-contract.js +7 -0
  303. package/dist/numerical/formula-contract.js.map +1 -1
  304. package/dist/numerical/formula-dimension.d.ts +9 -0
  305. package/dist/numerical/formula-dimension.d.ts.map +1 -1
  306. package/dist/numerical/formula-dimension.js +64 -10
  307. package/dist/numerical/formula-dimension.js.map +1 -1
  308. package/dist/numerical/formula-mathts.d.ts.map +1 -1
  309. package/dist/numerical/formula-mathts.js +6 -2
  310. package/dist/numerical/formula-mathts.js.map +1 -1
  311. package/dist/numerical/gl4-integrator.d.ts.map +1 -1
  312. package/dist/numerical/gl4-integrator.js +3 -3
  313. package/dist/numerical/gl4-integrator.js.map +1 -1
  314. package/dist/numerical/spacetime-metrics.d.ts +4 -0
  315. package/dist/numerical/spacetime-metrics.d.ts.map +1 -1
  316. package/dist/numerical/spacetime-metrics.js +34 -4
  317. package/dist/numerical/spacetime-metrics.js.map +1 -1
  318. package/dist/relations/types.d.ts +8 -1
  319. package/dist/relations/types.d.ts.map +1 -1
  320. package/dist/relations/types.js +10 -0
  321. package/dist/relations/types.js.map +1 -1
  322. package/package.json +1 -1
@@ -18,10 +18,22 @@
18
18
  * separated by `.`, `*`, or spaces; `^` optional; fractional exponents
19
19
  * like `T^1/2` allowed).
20
20
  *
21
+ * Forms 3 and 4 are one grammar, the formula grammar MathTS parses
22
+ * ({@link parseFormulaPNode}). The dimension notation differs from a formula
23
+ * only in spelling, and {@link formulaSyntax} rewrites those spellings
24
+ * before the parse: a `.` between factors is `*`, a space between factors is
25
+ * `*`, a glued exponent (`L2`, `T-2`) takes its `^`, a fractional exponent
26
+ * (`T^1/2`) is parenthesized, and a hyphen inside a name (`magnetic-field`)
27
+ * is `_`. There is no subtraction in a dimension, so `-` after a name is
28
+ * always an exponent's sign.
29
+ *
21
30
  * @module dimensional/dimension-spec
22
31
  */
23
32
  import { DIMENSIONLESS, LENGTH, AREA, TIME, FREQUENCY, MASS, VELOCITY, ACCELERATION, FORCE, ENERGY, POWER, ACTION, TEMPERATURE, ENTROPY, CHARGE, } from './types.js';
24
33
  import { divide, multiply, power } from './algebra.js';
34
+ import { dim } from './ast-builders.js';
35
+ import { CONSTANT_REGISTRY } from './symbolic-constants.js';
36
+ import { parseFormulaPNode } from '../numerical/formula-dimension.js';
25
37
  /** A bad dimension spec. */
26
38
  export class DimensionSpecError extends Error {
27
39
  constructor(message) {
@@ -29,7 +41,8 @@ export class DimensionSpecError extends Error {
29
41
  this.name = 'DimensionSpecError';
30
42
  }
31
43
  }
32
- const d = (L = 0, M = 0, T = 0, Theta = 0, I = 0) => ({ L, M, T, I, Theta, N: 0, J: 0 });
44
+ /** `dim(L, M, T, I, Θ)`, the one builder, from `ast-builders`. */
45
+ const d = dim;
33
46
  /** Named dimensions — matched case-insensitively. */
34
47
  const NAMED_DIMS = {
35
48
  dimensionless: DIMENSIONLESS,
@@ -51,26 +64,18 @@ const NAMED_DIMS = {
51
64
  density: d(-3, 1),
52
65
  volume: d(3),
53
66
  viscosity: d(-1, 1, -1),
54
- resistance: d(2, 1, -3, 0, -2),
55
- magnetic_field: d(0, 1, -2, 0, -1),
56
- permeability: d(1, 1, -2, 0, -2),
67
+ resistance: d(2, 1, -3, -2, 0),
68
+ magnetic_field: d(0, 1, -2, -1, 0),
69
+ permeability: d(1, 1, -2, -2, 0),
57
70
  };
58
71
  /**
59
- * One constant's exact-case spellings. The first name is the formula name
60
- * the equation path rewrites the others to. `upt eval` binds the same
61
- * names. A dimension term reads this record; it does not keep a second list.
72
+ * One constant's exact-case spellings, projected from the constant registry.
73
+ * The first name is the formula name the equation path rewrites the others
74
+ * to. `upt eval` binds the same names. A dimension term reads this record.
62
75
  *
63
76
  * @internal
64
77
  */
65
- export const CONSTANT_SPELLINGS = [
66
- { names: ['hbar', 'ℏ'], dim: ACTION },
67
- { names: ['c'], dim: VELOCITY },
68
- { names: ['G'], dim: d(3, -1, -2) },
69
- { names: ['k_B', 'kB'], dim: ENTROPY },
70
- { names: ['e'], dim: CHARGE },
71
- { names: ['mu_0', 'mu0'], dim: d(1, 1, -2, 0, -2) },
72
- { names: ['epsilon_0', 'epsilon0', 'eps0'], dim: d(-3, -1, 4, 0, 2) },
73
- ];
78
+ export const CONSTANT_SPELLINGS = CONSTANT_REGISTRY.map((row) => ({ names: [row.name, ...row.spellings], dim: row.dim }));
74
79
  /** Fundamental constants by their SI dimension — matched EXACT-case, so
75
80
  * `G` (Newton's constant) is never confused with `g` (acceleration). */
76
81
  const CONST_DIMS = Object.fromEntries(CONSTANT_SPELLINGS.flatMap(({ names, dim }) => names.map((name) => [name, dim])));
@@ -84,30 +89,14 @@ const BASES = {
84
89
  N: 'N',
85
90
  J: 'J',
86
91
  };
87
- function parseExponent(raw) {
88
- if (raw === '')
89
- return 1;
90
- if (raw.includes('/')) {
91
- const [n, den] = raw.split('/');
92
- const num = Number(n);
93
- const dd = Number(den);
94
- if (!Number.isFinite(num) || !Number.isFinite(dd) || dd === 0) {
95
- throw new DimensionSpecError(`bad exponent '${raw}'`);
96
- }
97
- return num / dd;
98
- }
99
- const v = Number(raw);
100
- if (!Number.isFinite(v))
101
- throw new DimensionSpecError(`bad exponent '${raw}'`);
102
- return v;
103
- }
104
- /** Resolve one atom: constant (exact case) or named dimension (case-insensitive). */
92
+ /** Resolve one atom: constant (exact case, `_` or `-`) or named dimension (case-insensitive). */
105
93
  function resolveAtom(raw) {
106
94
  const s = raw.trim();
107
95
  if (!s)
108
96
  return null;
109
- if (CONST_DIMS[s])
110
- return CONST_DIMS[s];
97
+ const constant = CONST_DIMS[s] ?? CONST_DIMS[s.replaceAll('_', '-')];
98
+ if (constant)
99
+ return constant;
111
100
  const key = s.toLowerCase().replace(/[\s-]+/g, '_');
112
101
  return NAMED_DIMS[key] ?? NAMED_DIMS[s.toLowerCase()] ?? null;
113
102
  }
@@ -115,133 +104,108 @@ function baseAtom(id) {
115
104
  const baseKey = BASES[id.toUpperCase()] ?? BASES[id];
116
105
  if (!baseKey)
117
106
  return null;
118
- const dim = d();
119
- dim[baseKey] = 1;
120
- return dim;
107
+ const out = d();
108
+ out[baseKey] = 1;
109
+ return out;
121
110
  }
122
111
  /**
123
- * Parse a product/quotient of named dims and constants: `power/area`,
124
- * `length*temperature`, `L*Theta` is NOT this path (bases go to step 4).
125
- * Only `*` and `/` as top-level operators; no parentheses, no `^` on names.
126
- * Returns `null` when the string is not this form (so the base-exponent path
127
- * can try).
128
- */
129
- /**
130
- * A product/quotient with parentheses and exponents: `power/(area*temperature^4)`,
131
- * `mass/length^3`, `M/L^3`. A slash followed by a digit is a fractional
132
- * exponent on the explicit-base path (`T^1/2`), not this one.
112
+ * The dimension notation in formula syntax. Each rewrite is a spelling the
113
+ * notation allows and a formula does not; none adds an operator a reader
114
+ * did not write.
133
115
  */
134
- function parseGroupedProduct(s) {
135
- let i = 0;
136
- const skip = () => {
137
- while (s[i] === ' ')
138
- i++;
139
- };
140
- const parseExponentToken = () => {
141
- skip();
142
- const start = i;
143
- if (s[i] === '+' || s[i] === '-')
144
- i++;
145
- if (!/\d/.test(s[i] ?? ''))
146
- throw new DimensionSpecError(`bad exponent in '${s}'`);
147
- while (/\d/.test(s[i] ?? ''))
148
- i++;
149
- if (s[i] === '/' && /\d/.test(s[i + 1] ?? '')) {
150
- i++;
151
- while (/\d/.test(s[i] ?? ''))
152
- i++;
116
+ function formulaSyntax(spec) {
117
+ return (spec
118
+ // A hyphen inside a name: `magnetic-field` is `magnetic_field`.
119
+ .replace(/(?<=[A-Za-zΘ])-(?=[A-Za-zΘ])/g, '_')
120
+ // Spaces around an operator carry nothing; between two factors they multiply.
121
+ .replace(/\s*([*/^().])\s*/g, '$1')
122
+ .replace(/\s+/g, '*')
123
+ // A glued exponent: `L2`, `T-2`, `T-2.5` (a name's own digits follow `_`, as in `mu_0`).
124
+ .replace(/(?<=[A-Za-zΘ])([+-]?\d)/g, '^$1')
125
+ // A fractional exponent: `T^1/2` is `T^(1/2)`.
126
+ .replace(/\^([+-]?\d+(?:\.\d+)?)\/(\d+(?:\.\d+)?)/g, '^($1/$2)')
127
+ // A dot between factors is a product; a dot before a digit is a decimal point.
128
+ .replace(/\.(?!\d)/g, '*'));
129
+ }
130
+ /** A numeric exponent: a number, a signed number, or a quotient or product of numbers. */
131
+ function exponentOf(node, spec) {
132
+ switch (node.kind) {
133
+ case 'num':
134
+ return node.value;
135
+ case 'neg':
136
+ return -exponentOf(node.arg, spec);
137
+ case 'op': {
138
+ const values = node.args.map((arg) => exponentOf(arg, spec));
139
+ if (node.op === '/')
140
+ return values.reduce((a, b) => a / b);
141
+ if (node.op === '*')
142
+ return values.reduce((a, b) => a * b, 1);
143
+ if (node.op === '+')
144
+ return values.reduce((a, b) => a + b, 0);
145
+ return values.length === 1 ? -values[0] : values.reduce((a, b) => a - b);
153
146
  }
154
- return parseExponent(s.slice(start, i));
155
- };
156
- const parseAtom = () => {
157
- skip();
158
- if (s[i] === '(') {
159
- i++;
160
- const inner = parseProduct();
161
- skip();
162
- if (s[i] !== ')')
163
- throw new DimensionSpecError(`unbalanced '(' in '${s}'`);
164
- i++;
165
- return inner;
147
+ default:
148
+ throw new DimensionSpecError(`bad exponent in '${spec}'`);
149
+ }
150
+ }
151
+ function unknownTerm(id) {
152
+ return new DimensionSpecError(`unknown base dimension '${id}' (use L M T I Theta N J, a named dimension, a constant name, ` +
153
+ 'or a named product/quotient like power/area)');
154
+ }
155
+ /** The dimension a parsed spec states. */
156
+ function dimensionOf(node, spec) {
157
+ switch (node.kind) {
158
+ case 'sym': {
159
+ const found = resolveAtom(node.name) ?? baseAtom(node.name);
160
+ if (found === null)
161
+ throw unknownTerm(node.name);
162
+ return { ...found };
166
163
  }
167
- const start = i;
168
- while (i < s.length && /[A-Za-zΘ_]/.test(s[i]))
169
- i++;
170
- const id = s.slice(start, i);
171
- if (!id)
172
- throw new DimensionSpecError(`unrecognized dimension term '${s.slice(start)}'`);
173
- const named = resolveAtom(id);
174
- if (named)
175
- return named;
176
- const base = baseAtom(id);
177
- if (base)
178
- return base;
179
- throw new DimensionSpecError(`unrecognized dimension term '${id}' (use a named dimension, a constant, ` +
180
- `or bases L M T I Theta N J)`);
181
- };
182
- const parsePower = () => {
183
- const base = parseAtom();
184
- skip();
185
- if (s[i] !== '^')
186
- return base;
187
- i++;
188
- return power(base, parseExponentToken());
189
- };
190
- const parseProduct = () => {
191
- let acc = parsePower();
192
- while (true) {
193
- skip();
194
- const op = s[i];
195
- if (op !== '*' && op !== '/')
196
- break;
197
- i++;
198
- const rhs = parsePower();
199
- acc = op === '*' ? multiply(acc, rhs) : divide(acc, rhs);
164
+ case 'num':
165
+ // A literal 1 is the dimensionless numerator: `1/time`.
166
+ if (node.value === 1)
167
+ return d();
168
+ throw new DimensionSpecError(`a number is not a dimension term ('${node.value}' in '${spec}')`);
169
+ case 'pow': {
170
+ const exponent = exponentOf(node.exp, spec);
171
+ if (!Number.isFinite(exponent))
172
+ throw new DimensionSpecError(`bad exponent in '${spec}'`);
173
+ return { ...power(dimensionOf(node.base, spec), exponent) };
200
174
  }
201
- return acc;
202
- };
203
- const out = parseProduct();
204
- skip();
205
- if (i !== s.length)
206
- throw new DimensionSpecError(`unrecognized dimension term '${s.slice(i)}'`);
207
- return out;
208
- }
209
- function wantsGroupedProduct(s) {
210
- if (/[()]/.test(s))
211
- return true;
212
- if (/\/\s*[(A-Za-zΘ]/.test(s))
213
- return true;
214
- return /\*/.test(s) && /[A-Za-z]{2,}/.test(s);
175
+ case 'op': {
176
+ if (node.op !== '*' && node.op !== '/') {
177
+ throw new DimensionSpecError(`unrecognized dimension term '${spec}' (a dimension has no '${node.op}')`);
178
+ }
179
+ const [first, ...rest] = node.args.map((arg) => dimensionOf(arg, spec));
180
+ return { ...rest.reduce((acc, next) => (node.op === '*' ? multiply(acc, next) : divide(acc, next)), first) };
181
+ }
182
+ case 'neg':
183
+ throw new DimensionSpecError(`unrecognized dimension term '${spec}' (a dimension has no sign)`);
184
+ case 'call':
185
+ throw new DimensionSpecError(`unrecognized dimension term '${node.fn}' in '${spec}'`);
186
+ }
215
187
  }
216
188
  /** Parse a dimension spec string into a {@link Dimension}. @internal */
217
189
  export function parseDimensionSpec(spec) {
218
190
  const s = spec.trim();
219
191
  if (!s)
220
192
  throw new DimensionSpecError('empty dimension spec');
221
- // (1) fundamental constant — EXACT case (G ≠ g).
222
- if (CONST_DIMS[s])
223
- return CONST_DIMS[s];
224
- // (2) named dimension — case-insensitive.
225
- const named = NAMED_DIMS[s.toLowerCase()];
226
- if (named)
227
- return named;
228
- // (3) product/quotient, including parentheses and named exponents.
229
- if (wantsGroupedProduct(s))
230
- return parseGroupedProduct(s);
231
- // (4) explicit base exponents.
232
- const out = d();
233
- const parts = s.split(/[.*\s]+/).filter(Boolean);
234
- for (const part of parts) {
235
- const m = /^([A-Za-zΘ]+)\^?(-?\d+(?:\/\d+)?)?$/.exec(part);
236
- if (!m)
237
- throw new DimensionSpecError(`unrecognized dimension term '${part}'`);
238
- const baseKey = BASES[m[1].toUpperCase()] ?? BASES[m[1]];
239
- if (!baseKey) {
240
- throw new DimensionSpecError(`unknown base dimension '${m[1]}' (use L M T I Theta N J, a named ` +
241
- `dimension, a constant name, or a named product/quotient like power/area)`);
242
- }
243
- out[baseKey] += parseExponent(m[2] ?? '');
193
+ // A whole name: a constant (exact case, so G is not g) or a named dimension.
194
+ const whole = resolveAtom(s);
195
+ if (whole)
196
+ return whole;
197
+ let node;
198
+ try {
199
+ node = parseFormulaPNode(formulaSyntax(s));
200
+ }
201
+ catch (error) {
202
+ throw new DimensionSpecError(`unrecognized dimension spec '${s}' (${error instanceof Error ? error.message : String(error)})`);
244
203
  }
204
+ const out = dimensionOf(node, s);
205
+ // A zero exponent raised to a negative power is -0; a dimension has no signed zero.
206
+ for (const key of Object.keys(out))
207
+ if (out[key] === 0)
208
+ out[key] = 0;
245
209
  return out;
246
210
  }
247
211
  //# sourceMappingURL=dimension-spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dimension-spec.js","sourceRoot":"","sources":["../../src/dimensional/dimension-spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dimension-spec.js","sourceRoot":"","sources":["../../src/dimensional/dimension-spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Exact unit scales.
3
+ *
4
+ * A unit's scale to SI is a rational number times one floating factor that
5
+ * holds its irrational part (π for an angle, ln 2 for a bit). Prefixes,
6
+ * products, quotients and integer powers multiply the rationals exactly, so
7
+ * `g/cm^3` is 1000 and `72 mN/m` is 0.072 with no float noise to round away.
8
+ * The one rounding is {@link scaleToNumber}, which rounds the rational
9
+ * correctly and then multiplies by the irrational factor once.
10
+ *
11
+ * A decimal literal is read digit for digit. A JavaScript number is read
12
+ * through its shortest round-trip decimal (`String(x)`), which is the
13
+ * literal a constant was written with.
14
+ *
15
+ * @module dimensional/exact-scale
16
+ * @internal
17
+ */
18
+ /** `num / den × irrational`, with `den > 0` and the fraction in lowest terms. @internal */
19
+ export interface ExactScale {
20
+ readonly num: bigint;
21
+ readonly den: bigint;
22
+ /** The factor no rational states (π, ln 2). 1 for a rational scale. */
23
+ readonly irrational: number;
24
+ }
25
+ /** The scale 1. @internal */
26
+ export declare const UNIT_SCALE: ExactScale;
27
+ /**
28
+ * The exact value of a decimal literal (`72`, `0.45359237`, `1.602176634e-19`),
29
+ * or null when `text` is not one.
30
+ * @internal
31
+ */
32
+ export declare function decimalScale(text: string): ExactScale | null;
33
+ /** The exact scale a finite JavaScript number was written as. @internal */
34
+ export declare function scaleOf(x: number): ExactScale;
35
+ /** `num / den`, exactly. @internal */
36
+ export declare function ratioScale(num: number | bigint, den: number | bigint): ExactScale;
37
+ /** A factor no rational states, such as π or ln 2. @internal */
38
+ export declare function irrationalScale(x: number): ExactScale;
39
+ /** `a × b × …`. @internal */
40
+ export declare function multiplyScales(...factors: readonly ExactScale[]): ExactScale;
41
+ /** `a / b`. @internal */
42
+ export declare function divideScales(a: ExactScale, b: ExactScale): ExactScale;
43
+ /**
44
+ * `a ^ n`. An integer power stays exact. A fractional power has no exact
45
+ * rational in general, so it becomes one floating factor.
46
+ * @internal
47
+ */
48
+ export declare function powerScale(a: ExactScale, n: number): ExactScale;
49
+ /** `a + b`: exact when both are rational multiples of the same irrational factor. @internal */
50
+ export declare function addScales(a: ExactScale, b: ExactScale): ExactScale;
51
+ /** The scale as a double: the rational rounded once, times the irrational factor. @internal */
52
+ export declare function scaleToNumber(s: ExactScale): number;
53
+ /**
54
+ * The two sides of a unit text or a scale expression under the single-solidus
55
+ * convention of ISO 80000-1: everything after the first `/` is the
56
+ * denominator, so a chain is one denominator (`km/s/Mpc` is km/(s·Mpc), and
57
+ * `W/m*K` is W/(m·K), not (W/m)·K). The denominator comes back as one
58
+ * `*`-joined product, each `/`-part's outer parentheses dropped. `units.ts`
59
+ * and {@link readScaleExpression} both split here, so a unit text and a scale
60
+ * expression in `data/units.json` read a `/` the same way.
61
+ * @internal
62
+ */
63
+ export declare function solidusSides(text: string): {
64
+ readonly numerator: string;
65
+ readonly denominator: string;
66
+ };
67
+ /**
68
+ * The exact value of a scale expression, the form `data/units.json` stores:
69
+ * factors joined by `*`, then optionally `/` and the denominator's factors,
70
+ * each a decimal literal or a name with an optional integer power
71
+ * (`4.1868*453.59237/1.8`, `pi/180`, `lbf/inch^2`). A `/` follows the unit
72
+ * grammar ({@link solidusSides}): `a/b*c` is a/(b·c). `resolve` gives a name
73
+ * its scale and returns undefined for a name it does not know, which throws
74
+ * here. A decimal literal is read digit for digit, so the result is the
75
+ * rational the text states.
76
+ * @internal
77
+ */
78
+ export declare function readScaleExpression(text: string, resolve: (name: string) => ExactScale | undefined): ExactScale;
79
+ //# sourceMappingURL=exact-scale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exact-scale.d.ts","sourceRoot":"","sources":["../../src/dimensional/exact-scale.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,2FAA2F;AAC3F,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAmBD,6BAA6B;AAC7B,eAAO,MAAM,UAAU,EAAE,UAAgD,CAAC;AAI1E;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAW5D;AAED,2EAA2E;AAC3E,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,CAG7C;AAED,sCAAsC;AACtC,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAEjF;AAED,gEAAgE;AAChE,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,CAGrD;AAED,6BAA6B;AAC7B,wBAAgB,cAAc,CAAC,GAAG,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,CAU5E;AAED,yBAAyB;AACzB,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,UAAU,CAGrE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU,CAO/D;AAED,+FAA+F;AAC/F,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,UAAU,CAGlE;AAwDD,+FAA+F;AAC/F,wBAAgB,aAAa,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAGnD;AAID;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CASvG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,GAAG,UAAU,CAiB/G"}