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.
- package/README.md +8 -6
- package/data/atlas/atlas.json +21 -21
- package/data/atlas/atlas.jsonld +1 -1
- package/data/atlas/diffusion.json +5 -5
- package/data/atlas/oscillators.json +7 -7
- package/data/atlas/waves.json +11 -11
- package/data/bridge-catalog.json +490 -338
- package/data/bridge-catalog.schema.json +566 -40
- package/data/quantities.json +230 -218
- package/data/quantities.schema.json +52 -0
- package/data/units.json +1149 -0
- package/data/units.schema.json +124 -0
- package/dist/atlas/association.d.ts +1 -1
- package/dist/atlas/benchmark/hybrid-retrieval.d.ts.map +1 -1
- package/dist/atlas/benchmark/hybrid-retrieval.js +2 -5
- package/dist/atlas/benchmark/hybrid-retrieval.js.map +1 -1
- package/dist/atlas/physjs-entries.generated.d.ts +1601 -220
- package/dist/atlas/physjs-entries.generated.d.ts.map +1 -1
- package/dist/atlas/physjs-entries.generated.js +1854 -345
- package/dist/atlas/physjs-entries.generated.js.map +1 -1
- package/dist/atlas/physjs-ref.d.ts +89 -89
- package/dist/atlas/physjs-ref.d.ts.map +1 -1
- package/dist/atlas/physjs-ref.js +128 -176
- package/dist/atlas/physjs-ref.js.map +1 -1
- package/dist/atlas/proof-target.d.ts +16 -8
- package/dist/atlas/proof-target.d.ts.map +1 -1
- package/dist/atlas/proof-target.js +34 -31
- package/dist/atlas/proof-target.js.map +1 -1
- package/dist/bridges/catalog-adapter.d.ts.map +1 -1
- package/dist/bridges/catalog-adapter.js +5 -5
- package/dist/bridges/catalog-adapter.js.map +1 -1
- package/dist/bridges/catalog-load.d.ts +7 -0
- package/dist/bridges/catalog-load.d.ts.map +1 -1
- package/dist/bridges/catalog-load.js +69 -13
- package/dist/bridges/catalog-load.js.map +1 -1
- package/dist/bridges/catalog-types.d.ts +51 -6
- package/dist/bridges/catalog-types.d.ts.map +1 -1
- package/dist/bridges/evaluation-errors.d.ts +76 -0
- package/dist/bridges/evaluation-errors.d.ts.map +1 -0
- package/dist/bridges/evaluation-errors.js +118 -0
- package/dist/bridges/evaluation-errors.js.map +1 -0
- package/dist/bridges/evaluator-inputs.d.ts +5 -3
- package/dist/bridges/evaluator-inputs.d.ts.map +1 -1
- package/dist/bridges/evaluator-inputs.js +24 -24
- package/dist/bridges/evaluator-inputs.js.map +1 -1
- package/dist/bridges/evaluators.d.ts +32 -7
- package/dist/bridges/evaluators.d.ts.map +1 -1
- package/dist/bridges/evaluators.js +131 -29
- package/dist/bridges/evaluators.js.map +1 -1
- package/dist/bridges/expr-parse.d.ts +11 -3
- package/dist/bridges/expr-parse.d.ts.map +1 -1
- package/dist/bridges/expr-parse.js +46 -153
- package/dist/bridges/expr-parse.js.map +1 -1
- package/dist/bridges/holds.d.ts +11 -7
- package/dist/bridges/holds.d.ts.map +1 -1
- package/dist/bridges/holds.js +113 -234
- package/dist/bridges/holds.js.map +1 -1
- package/dist/bridges/input-contract.d.ts +65 -0
- package/dist/bridges/input-contract.d.ts.map +1 -0
- package/dist/bridges/input-contract.js +97 -0
- package/dist/bridges/input-contract.js.map +1 -0
- package/dist/bridges/notices.d.ts +11 -0
- package/dist/bridges/notices.d.ts.map +1 -0
- package/dist/bridges/notices.js +22 -0
- package/dist/bridges/notices.js.map +1 -0
- package/dist/canonical/canonical-equation.d.ts +31 -0
- package/dist/canonical/canonical-equation.d.ts.map +1 -1
- package/dist/canonical/entries/atomic.d.ts.map +1 -1
- package/dist/canonical/entries/atomic.js +11 -1
- package/dist/canonical/entries/atomic.js.map +1 -1
- package/dist/canonical/entries/condensed-matter.d.ts.map +1 -1
- package/dist/canonical/entries/condensed-matter.js +3 -0
- package/dist/canonical/entries/condensed-matter.js.map +1 -1
- package/dist/canonical/entries/dimensional-classics.d.ts.map +1 -1
- package/dist/canonical/entries/dimensional-classics.js +48 -0
- package/dist/canonical/entries/dimensional-classics.js.map +1 -1
- package/dist/canonical/entries/electromagnetism.d.ts.map +1 -1
- package/dist/canonical/entries/electromagnetism.js +30 -0
- package/dist/canonical/entries/electromagnetism.js.map +1 -1
- package/dist/canonical/entries/fluids-waves.d.ts.map +1 -1
- package/dist/canonical/entries/fluids-waves.js +34 -0
- package/dist/canonical/entries/fluids-waves.js.map +1 -1
- package/dist/canonical/entries/mechanics.d.ts.map +1 -1
- package/dist/canonical/entries/mechanics.js +24 -0
- package/dist/canonical/entries/mechanics.js.map +1 -1
- package/dist/canonical/entries/nonmonomial.d.ts.map +1 -1
- package/dist/canonical/entries/nonmonomial.js +15 -4
- package/dist/canonical/entries/nonmonomial.js.map +1 -1
- package/dist/canonical/entries/relativity.d.ts.map +1 -1
- package/dist/canonical/entries/relativity.js +6 -0
- package/dist/canonical/entries/relativity.js.map +1 -1
- package/dist/canonical/entries/statistical-mechanics.d.ts.map +1 -1
- package/dist/canonical/entries/statistical-mechanics.js +19 -0
- package/dist/canonical/entries/statistical-mechanics.js.map +1 -1
- package/dist/canonical/entries/thermo-nuclear-cosmo.d.ts.map +1 -1
- package/dist/canonical/entries/thermo-nuclear-cosmo.js +15 -0
- package/dist/canonical/entries/thermo-nuclear-cosmo.js.map +1 -1
- package/dist/cases/index.d.ts +9 -2
- package/dist/cases/index.d.ts.map +1 -1
- package/dist/cases/index.js +26 -7
- package/dist/cases/index.js.map +1 -1
- package/dist/cases/kepler-rv.js +6 -6
- package/dist/cases/kepler-rv.js.map +1 -1
- package/dist/cli/commands/_discovery-opts.d.ts +2 -1
- package/dist/cli/commands/_discovery-opts.d.ts.map +1 -1
- package/dist/cli/commands/_discovery-opts.js +7 -12
- package/dist/cli/commands/_discovery-opts.js.map +1 -1
- package/dist/cli/commands/atlas.d.ts.map +1 -1
- package/dist/cli/commands/atlas.js +6 -9
- package/dist/cli/commands/atlas.js.map +1 -1
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/audit.js +1 -2
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/cli/commands/connectors.d.ts.map +1 -1
- package/dist/cli/commands/connectors.js +8 -9
- package/dist/cli/commands/connectors.js.map +1 -1
- package/dist/cli/commands/derive.js +9 -10
- package/dist/cli/commands/derive.js.map +1 -1
- package/dist/cli/commands/discover.d.ts.map +1 -1
- package/dist/cli/commands/discover.js +3 -4
- package/dist/cli/commands/discover.js.map +1 -1
- package/dist/cli/commands/eval.d.ts.map +1 -1
- package/dist/cli/commands/eval.js +17 -17
- package/dist/cli/commands/eval.js.map +1 -1
- package/dist/cli/commands/evaluate.d.ts +1 -35
- package/dist/cli/commands/evaluate.d.ts.map +1 -1
- package/dist/cli/commands/evaluate.js +56 -187
- package/dist/cli/commands/evaluate.js.map +1 -1
- package/dist/cli/commands/explain.d.ts.map +1 -1
- package/dist/cli/commands/explain.js +43 -38
- package/dist/cli/commands/explain.js.map +1 -1
- package/dist/cli/commands/ground.js +1 -1
- package/dist/cli/commands/ground.js.map +1 -1
- package/dist/cli/commands/map.js +3 -4
- package/dist/cli/commands/map.js.map +1 -1
- package/dist/cli/commands/metric.d.ts.map +1 -1
- package/dist/cli/commands/metric.js +3 -0
- package/dist/cli/commands/metric.js.map +1 -1
- package/dist/cli/commands/regime.js +1 -1
- package/dist/cli/commands/regime.js.map +1 -1
- package/dist/cli/commands/symbolic.d.ts.map +1 -1
- package/dist/cli/commands/symbolic.js +5 -2
- package/dist/cli/commands/symbolic.js.map +1 -1
- package/dist/cli/commands/testplan.js +3 -3
- package/dist/cli/commands/testplan.js.map +1 -1
- package/dist/cli/conventions.d.ts +6 -7
- package/dist/cli/conventions.d.ts.map +1 -1
- package/dist/cli/conventions.js +19 -28
- package/dist/cli/conventions.js.map +1 -1
- package/dist/cli/euler-guard.d.ts +13 -2
- package/dist/cli/euler-guard.d.ts.map +1 -1
- package/dist/cli/euler-guard.js +17 -3
- package/dist/cli/euler-guard.js.map +1 -1
- package/dist/cli/eval-numbers.d.ts +4 -9
- package/dist/cli/eval-numbers.d.ts.map +1 -1
- package/dist/cli/eval-numbers.js +11 -41
- package/dist/cli/eval-numbers.js.map +1 -1
- package/dist/cli/published-url.d.ts +2 -0
- package/dist/cli/published-url.d.ts.map +1 -1
- package/dist/cli/published-url.js +5 -0
- package/dist/cli/published-url.js.map +1 -1
- package/dist/cli/record-tables.d.ts +2 -1
- package/dist/cli/record-tables.d.ts.map +1 -1
- package/dist/cli/record-tables.js +8 -3
- package/dist/cli/record-tables.js.map +1 -1
- package/dist/cli-api.d.ts +45 -12
- package/dist/cli-api.d.ts.map +1 -1
- package/dist/cli-api.js +38 -11
- package/dist/cli-api.js.map +1 -1
- package/dist/composition/adjudication.d.ts +8 -30
- package/dist/composition/adjudication.d.ts.map +1 -1
- package/dist/composition/adjudication.js +15 -67
- package/dist/composition/adjudication.js.map +1 -1
- package/dist/composition/aliases.d.ts +1 -1
- package/dist/composition/aliases.d.ts.map +1 -1
- package/dist/composition/aliases.js +10 -20
- package/dist/composition/aliases.js.map +1 -1
- package/dist/composition/bridge-analysis.d.ts +4 -0
- package/dist/composition/bridge-analysis.d.ts.map +1 -1
- package/dist/composition/bridge-analysis.js +13 -14
- package/dist/composition/bridge-analysis.js.map +1 -1
- package/dist/composition/canonical-graph.d.ts +7 -9
- package/dist/composition/canonical-graph.d.ts.map +1 -1
- package/dist/composition/canonical-graph.js +35 -19
- package/dist/composition/canonical-graph.js.map +1 -1
- package/dist/composition/canonical-prefactors.d.ts +10 -29
- package/dist/composition/canonical-prefactors.d.ts.map +1 -1
- package/dist/composition/canonical-prefactors.js +15 -202
- package/dist/composition/canonical-prefactors.js.map +1 -1
- package/dist/composition/compose.js +2 -1
- package/dist/composition/compose.js.map +1 -1
- package/dist/composition/discovery.d.ts +50 -0
- package/dist/composition/discovery.d.ts.map +1 -1
- package/dist/composition/discovery.js +2 -2
- package/dist/composition/discovery.js.map +1 -1
- package/dist/composition/edge.d.ts +0 -14
- package/dist/composition/edge.d.ts.map +1 -1
- package/dist/composition/edge.js +1 -17
- package/dist/composition/edge.js.map +1 -1
- package/dist/composition/evaluate-relation.d.ts +29 -5
- package/dist/composition/evaluate-relation.d.ts.map +1 -1
- package/dist/composition/evaluate-relation.js +100 -72
- package/dist/composition/evaluate-relation.js.map +1 -1
- package/dist/composition/explain.d.ts +5 -0
- package/dist/composition/explain.d.ts.map +1 -1
- package/dist/composition/explain.js +9 -8
- package/dist/composition/explain.js.map +1 -1
- package/dist/composition/expr-eval.d.ts.map +1 -1
- package/dist/composition/expr-eval.js +2 -1
- package/dist/composition/expr-eval.js.map +1 -1
- package/dist/composition/index.d.ts +3 -1
- package/dist/composition/index.d.ts.map +1 -1
- package/dist/composition/index.js +3 -1
- package/dist/composition/index.js.map +1 -1
- package/dist/composition/proposed-bridges.d.ts.map +1 -1
- package/dist/composition/proposed-bridges.js +3 -2
- package/dist/composition/proposed-bridges.js.map +1 -1
- package/dist/composition/retrodiction.d.ts +8 -0
- package/dist/composition/retrodiction.d.ts.map +1 -1
- package/dist/composition/retrodiction.js +5 -0
- package/dist/composition/retrodiction.js.map +1 -1
- package/dist/composition/user-equation.d.ts +11 -7
- package/dist/composition/user-equation.d.ts.map +1 -1
- package/dist/composition/user-equation.js +24 -26
- package/dist/composition/user-equation.js.map +1 -1
- package/dist/core/constants.d.ts +27 -4
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +38 -5
- package/dist/core/constants.js.map +1 -1
- package/dist/core/data-file.d.ts +27 -0
- package/dist/core/data-file.d.ts.map +1 -0
- package/dist/core/data-file.js +48 -0
- package/dist/core/data-file.js.map +1 -0
- package/dist/core/json-schema.d.ts +27 -0
- package/dist/core/json-schema.d.ts.map +1 -0
- package/dist/core/json-schema.js +153 -0
- package/dist/core/json-schema.js.map +1 -0
- package/dist/core/types.d.ts +3 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +16 -14
- package/dist/core/types.js.map +1 -1
- package/dist/diff/bridge-ast-gradient.d.ts.map +1 -1
- package/dist/diff/bridge-ast-gradient.js +6 -17
- package/dist/diff/bridge-ast-gradient.js.map +1 -1
- package/dist/diff/bridge-specs.d.ts +2 -1
- package/dist/diff/bridge-specs.d.ts.map +1 -1
- package/dist/diff/bridge-specs.js +1 -1
- package/dist/diff/bridge-specs.js.map +1 -1
- package/dist/dimensional/bridge-check.d.ts.map +1 -1
- package/dist/dimensional/bridge-check.js +3 -5
- package/dist/dimensional/bridge-check.js.map +1 -1
- package/dist/dimensional/constant-rows.d.ts +54 -0
- package/dist/dimensional/constant-rows.d.ts.map +1 -0
- package/dist/dimensional/constant-rows.js +111 -0
- package/dist/dimensional/constant-rows.js.map +1 -0
- package/dist/dimensional/constants.d.ts +4 -13
- package/dist/dimensional/constants.d.ts.map +1 -1
- package/dist/dimensional/constants.js +11 -19
- package/dist/dimensional/constants.js.map +1 -1
- package/dist/dimensional/dimension-spec.d.ts +12 -3
- package/dist/dimensional/dimension-spec.d.ts.map +1 -1
- package/dist/dimensional/dimension-spec.js +114 -150
- package/dist/dimensional/dimension-spec.js.map +1 -1
- package/dist/dimensional/exact-scale.d.ts +79 -0
- package/dist/dimensional/exact-scale.d.ts.map +1 -0
- package/dist/dimensional/exact-scale.js +222 -0
- package/dist/dimensional/exact-scale.js.map +1 -0
- package/dist/dimensional/formula-names.d.ts +13 -12
- package/dist/dimensional/formula-names.d.ts.map +1 -1
- package/dist/dimensional/formula-names.js +28 -51
- package/dist/dimensional/formula-names.js.map +1 -1
- package/dist/dimensional/quantity-registry.d.ts +10 -1
- package/dist/dimensional/quantity-registry.d.ts.map +1 -1
- package/dist/dimensional/quantity-registry.js +45 -16
- package/dist/dimensional/quantity-registry.js.map +1 -1
- package/dist/dimensional/symbolic-constants.d.ts +63 -19
- package/dist/dimensional/symbolic-constants.d.ts.map +1 -1
- package/dist/dimensional/symbolic-constants.js +109 -92
- package/dist/dimensional/symbolic-constants.js.map +1 -1
- package/dist/dimensional/unit-data.d.ts +70 -0
- package/dist/dimensional/unit-data.d.ts.map +1 -0
- package/dist/dimensional/unit-data.js +135 -0
- package/dist/dimensional/unit-data.js.map +1 -0
- package/dist/dimensional/units.d.ts +87 -24
- package/dist/dimensional/units.d.ts.map +1 -1
- package/dist/dimensional/units.js +253 -276
- package/dist/dimensional/units.js.map +1 -1
- package/dist/index.d.ts +15 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -4
- package/dist/index.js.map +1 -1
- package/dist/numerical/binding-value.d.ts +21 -1
- package/dist/numerical/binding-value.d.ts.map +1 -1
- package/dist/numerical/binding-value.js +123 -118
- package/dist/numerical/binding-value.js.map +1 -1
- package/dist/numerical/evaluator-uncertainty.d.ts +34 -0
- package/dist/numerical/evaluator-uncertainty.d.ts.map +1 -0
- package/dist/numerical/evaluator-uncertainty.js +117 -0
- package/dist/numerical/evaluator-uncertainty.js.map +1 -0
- package/dist/numerical/formula-contract.d.ts +4 -0
- package/dist/numerical/formula-contract.d.ts.map +1 -1
- package/dist/numerical/formula-contract.js +7 -0
- package/dist/numerical/formula-contract.js.map +1 -1
- package/dist/numerical/formula-dimension.d.ts +9 -0
- package/dist/numerical/formula-dimension.d.ts.map +1 -1
- package/dist/numerical/formula-dimension.js +64 -10
- package/dist/numerical/formula-dimension.js.map +1 -1
- package/dist/numerical/formula-mathts.d.ts.map +1 -1
- package/dist/numerical/formula-mathts.js +6 -2
- package/dist/numerical/formula-mathts.js.map +1 -1
- package/dist/numerical/gl4-integrator.d.ts.map +1 -1
- package/dist/numerical/gl4-integrator.js +3 -3
- package/dist/numerical/gl4-integrator.js.map +1 -1
- package/dist/numerical/spacetime-metrics.d.ts +4 -0
- package/dist/numerical/spacetime-metrics.d.ts.map +1 -1
- package/dist/numerical/spacetime-metrics.js +34 -4
- package/dist/numerical/spacetime-metrics.js.map +1 -1
- package/dist/relations/types.d.ts +8 -1
- package/dist/relations/types.d.ts.map +1 -1
- package/dist/relations/types.js +10 -0
- package/dist/relations/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,222 @@
|
|
|
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
|
+
function gcd(a, b) {
|
|
19
|
+
let x = a < 0n ? -a : a;
|
|
20
|
+
let y = b < 0n ? -b : b;
|
|
21
|
+
while (y !== 0n)
|
|
22
|
+
[x, y] = [y, x % y];
|
|
23
|
+
return x;
|
|
24
|
+
}
|
|
25
|
+
function make(num, den, irrational) {
|
|
26
|
+
if (den === 0n)
|
|
27
|
+
throw new RangeError('exact scale: zero denominator');
|
|
28
|
+
if (den < 0n) {
|
|
29
|
+
num = -num;
|
|
30
|
+
den = -den;
|
|
31
|
+
}
|
|
32
|
+
const g = gcd(num, den);
|
|
33
|
+
return g > 1n ? { num: num / g, den: den / g, irrational } : { num, den, irrational };
|
|
34
|
+
}
|
|
35
|
+
/** The scale 1. @internal */
|
|
36
|
+
export const UNIT_SCALE = { num: 1n, den: 1n, irrational: 1 };
|
|
37
|
+
const DECIMAL = /^([+-]?)(\d*)(?:\.(\d*))?(?:[eE]([+-]?\d+))?$/;
|
|
38
|
+
/**
|
|
39
|
+
* The exact value of a decimal literal (`72`, `0.45359237`, `1.602176634e-19`),
|
|
40
|
+
* or null when `text` is not one.
|
|
41
|
+
* @internal
|
|
42
|
+
*/
|
|
43
|
+
export function decimalScale(text) {
|
|
44
|
+
const m = DECIMAL.exec(text.trim());
|
|
45
|
+
if (m === null)
|
|
46
|
+
return null;
|
|
47
|
+
const whole = m[2] ?? '';
|
|
48
|
+
const fraction = m[3] ?? '';
|
|
49
|
+
if (whole === '' && fraction === '')
|
|
50
|
+
return null;
|
|
51
|
+
const exponent = Number(m[4] ?? '0') - fraction.length;
|
|
52
|
+
if (!Number.isSafeInteger(exponent) || Math.abs(exponent) > 10_000)
|
|
53
|
+
return null;
|
|
54
|
+
let num = BigInt(whole + fraction);
|
|
55
|
+
if (m[1] === '-')
|
|
56
|
+
num = -num;
|
|
57
|
+
return exponent >= 0 ? make(num * 10n ** BigInt(exponent), 1n, 1) : make(num, 10n ** BigInt(-exponent), 1);
|
|
58
|
+
}
|
|
59
|
+
/** The exact scale a finite JavaScript number was written as. @internal */
|
|
60
|
+
export function scaleOf(x) {
|
|
61
|
+
if (!Number.isFinite(x))
|
|
62
|
+
throw new RangeError(`exact scale: ${x} is not finite`);
|
|
63
|
+
return decimalScale(String(x));
|
|
64
|
+
}
|
|
65
|
+
/** `num / den`, exactly. @internal */
|
|
66
|
+
export function ratioScale(num, den) {
|
|
67
|
+
return make(BigInt(num), BigInt(den), 1);
|
|
68
|
+
}
|
|
69
|
+
/** A factor no rational states, such as π or ln 2. @internal */
|
|
70
|
+
export function irrationalScale(x) {
|
|
71
|
+
if (!Number.isFinite(x))
|
|
72
|
+
throw new RangeError(`exact scale: ${x} is not finite`);
|
|
73
|
+
return { num: 1n, den: 1n, irrational: x };
|
|
74
|
+
}
|
|
75
|
+
/** `a × b × …`. @internal */
|
|
76
|
+
export function multiplyScales(...factors) {
|
|
77
|
+
let num = 1n;
|
|
78
|
+
let den = 1n;
|
|
79
|
+
let irrational = 1;
|
|
80
|
+
for (const f of factors) {
|
|
81
|
+
num *= f.num;
|
|
82
|
+
den *= f.den;
|
|
83
|
+
irrational *= f.irrational;
|
|
84
|
+
}
|
|
85
|
+
return make(num, den, irrational);
|
|
86
|
+
}
|
|
87
|
+
/** `a / b`. @internal */
|
|
88
|
+
export function divideScales(a, b) {
|
|
89
|
+
if (b.num === 0n)
|
|
90
|
+
throw new RangeError('exact scale: division by zero');
|
|
91
|
+
return make(a.num * b.den, a.den * b.num, a.irrational / b.irrational);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* `a ^ n`. An integer power stays exact. A fractional power has no exact
|
|
95
|
+
* rational in general, so it becomes one floating factor.
|
|
96
|
+
* @internal
|
|
97
|
+
*/
|
|
98
|
+
export function powerScale(a, n) {
|
|
99
|
+
if (Number.isInteger(n)) {
|
|
100
|
+
const k = BigInt(Math.abs(n));
|
|
101
|
+
const up = make(a.num ** k, a.den ** k, a.irrational ** Math.abs(n));
|
|
102
|
+
return n >= 0 ? up : divideScales(UNIT_SCALE, up);
|
|
103
|
+
}
|
|
104
|
+
return irrationalScale(scaleToNumber(a) ** n);
|
|
105
|
+
}
|
|
106
|
+
/** `a + b`: exact when both are rational multiples of the same irrational factor. @internal */
|
|
107
|
+
export function addScales(a, b) {
|
|
108
|
+
if (a.irrational === b.irrational)
|
|
109
|
+
return make(a.num * b.den + b.num * a.den, a.den * b.den, a.irrational);
|
|
110
|
+
return irrationalScale(scaleToNumber(a) + scaleToNumber(b));
|
|
111
|
+
}
|
|
112
|
+
/** The fewest significant digits kept before the sticky digit; far beyond a double's 17. */
|
|
113
|
+
const MIN_DIGITS = 40;
|
|
114
|
+
/** Decimal places of `1 / den` when it terminates (`den` = 2^a·5^b): max(a, b). Null otherwise. */
|
|
115
|
+
function terminatingPlaces(den) {
|
|
116
|
+
let d = den;
|
|
117
|
+
let twos = 0;
|
|
118
|
+
let fives = 0;
|
|
119
|
+
while (d % 2n === 0n) {
|
|
120
|
+
d /= 2n;
|
|
121
|
+
twos++;
|
|
122
|
+
}
|
|
123
|
+
while (d % 5n === 0n) {
|
|
124
|
+
d /= 5n;
|
|
125
|
+
fives++;
|
|
126
|
+
}
|
|
127
|
+
return d === 1n ? Math.max(twos, fives) : null;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* The rational `num / den` (`den > 0`), reduced, rounded once to the nearest double.
|
|
131
|
+
*
|
|
132
|
+
* A terminating quotient (`den` = 2^a·5^b) is written out exactly, every digit,
|
|
133
|
+
* and parsed: a tie between two doubles is a dyadic rational, so it always
|
|
134
|
+
* lands here and rounds half to even. Any other quotient is not a tie, and it
|
|
135
|
+
* is at least `1 / (den·2^54)` of its magnitude away from every tie; truncating
|
|
136
|
+
* it to `max(40, digits(den) + 20)` significant digits stays closer than that,
|
|
137
|
+
* and a sticky `1` puts the string strictly inside the truncation interval, so
|
|
138
|
+
* the string rounds the way the quotient does for any denominator.
|
|
139
|
+
*/
|
|
140
|
+
function rationalToNumber(num, den) {
|
|
141
|
+
if (num === 0n)
|
|
142
|
+
return 0;
|
|
143
|
+
const negative = num < 0n;
|
|
144
|
+
const g = gcd(num, den);
|
|
145
|
+
const a = (negative ? -num : num) / g;
|
|
146
|
+
den /= g;
|
|
147
|
+
const places = terminatingPlaces(den);
|
|
148
|
+
if (places !== null) {
|
|
149
|
+
const value = Number(`${(a * 10n ** BigInt(places)) / den}e-${places}`);
|
|
150
|
+
return negative ? -value : value;
|
|
151
|
+
}
|
|
152
|
+
const digits = Math.max(MIN_DIGITS, den.toString().length + 20);
|
|
153
|
+
const shift = digits - (a.toString().length - den.toString().length);
|
|
154
|
+
let q;
|
|
155
|
+
if (shift >= 0) {
|
|
156
|
+
q = (a * 10n ** BigInt(shift)) / den;
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
q = a / (den * 10n ** BigInt(-shift));
|
|
160
|
+
}
|
|
161
|
+
// Not terminating, so the remainder is never zero: the sticky digit is always due.
|
|
162
|
+
const value = Number(`${q.toString()}1e${-(shift + 1)}`);
|
|
163
|
+
return negative ? -value : value;
|
|
164
|
+
}
|
|
165
|
+
/** The scale as a double: the rational rounded once, times the irrational factor. @internal */
|
|
166
|
+
export function scaleToNumber(s) {
|
|
167
|
+
const rational = rationalToNumber(s.num, s.den);
|
|
168
|
+
return s.irrational === 1 ? rational : rational * s.irrational;
|
|
169
|
+
}
|
|
170
|
+
const FACTOR = /^([^*/^\s]+)(?:\^([+-]?\d+))?$/;
|
|
171
|
+
/**
|
|
172
|
+
* The two sides of a unit text or a scale expression under the single-solidus
|
|
173
|
+
* convention of ISO 80000-1: everything after the first `/` is the
|
|
174
|
+
* denominator, so a chain is one denominator (`km/s/Mpc` is km/(s·Mpc), and
|
|
175
|
+
* `W/m*K` is W/(m·K), not (W/m)·K). The denominator comes back as one
|
|
176
|
+
* `*`-joined product, each `/`-part's outer parentheses dropped. `units.ts`
|
|
177
|
+
* and {@link readScaleExpression} both split here, so a unit text and a scale
|
|
178
|
+
* expression in `data/units.json` read a `/` the same way.
|
|
179
|
+
* @internal
|
|
180
|
+
*/
|
|
181
|
+
export function solidusSides(text) {
|
|
182
|
+
const parts = text.split('/');
|
|
183
|
+
return {
|
|
184
|
+
numerator: parts[0],
|
|
185
|
+
denominator: parts
|
|
186
|
+
.slice(1)
|
|
187
|
+
.map((part) => part.replace(/^\((.*)\)$/, '$1'))
|
|
188
|
+
.join('*'),
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* The exact value of a scale expression, the form `data/units.json` stores:
|
|
193
|
+
* factors joined by `*`, then optionally `/` and the denominator's factors,
|
|
194
|
+
* each a decimal literal or a name with an optional integer power
|
|
195
|
+
* (`4.1868*453.59237/1.8`, `pi/180`, `lbf/inch^2`). A `/` follows the unit
|
|
196
|
+
* grammar ({@link solidusSides}): `a/b*c` is a/(b·c). `resolve` gives a name
|
|
197
|
+
* its scale and returns undefined for a name it does not know, which throws
|
|
198
|
+
* here. A decimal literal is read digit for digit, so the result is the
|
|
199
|
+
* rational the text states.
|
|
200
|
+
* @internal
|
|
201
|
+
*/
|
|
202
|
+
export function readScaleExpression(text, resolve) {
|
|
203
|
+
const product = (side) => {
|
|
204
|
+
let scale = UNIT_SCALE;
|
|
205
|
+
for (const part of side.split('*')) {
|
|
206
|
+
const m = FACTOR.exec(part);
|
|
207
|
+
if (m === null)
|
|
208
|
+
throw new RangeError(`exact scale: '${text}' is not a product of factors`);
|
|
209
|
+
const atom = m[1];
|
|
210
|
+
const base = decimalScale(atom) ?? resolve(atom);
|
|
211
|
+
if (base === undefined)
|
|
212
|
+
throw new RangeError(`exact scale: '${text}' names '${atom}', which is not a known scale`);
|
|
213
|
+
scale = multiplyScales(scale, m[2] === undefined ? base : powerScale(base, Number(m[2])));
|
|
214
|
+
}
|
|
215
|
+
return scale;
|
|
216
|
+
};
|
|
217
|
+
const trimmed = text.trim();
|
|
218
|
+
const { numerator, denominator } = solidusSides(trimmed);
|
|
219
|
+
const top = product(numerator);
|
|
220
|
+
return trimmed.includes('/') ? divideScales(top, product(denominator)) : top;
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=exact-scale.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exact-scale.js","sourceRoot":"","sources":["../../src/dimensional/exact-scale.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Names a formula may use that are not leaves of {@link CONSTANTS}
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
2
|
+
* Names a formula may use that are not leaves of {@link CONSTANTS}: the
|
|
3
|
+
* non-canonical rows of the constant registry. Spreading them into
|
|
4
|
+
* `CONSTANTS` would bake them into the canonical graph (`CANONICAL_CONSTANTS`
|
|
5
|
+
* spreads that table). They are an overlay for dimensional assignment and for
|
|
6
|
+
* `upt eval` only.
|
|
7
7
|
*
|
|
8
8
|
* @module dimensional/formula-names
|
|
9
9
|
*/
|
|
10
10
|
import type { Dimension } from './types.js';
|
|
11
|
-
/** Vacuum permittivity, the same CODATA value `CONSTANTS.epsilon_0` holds. */
|
|
12
|
-
export declare const EPS0_SI = 8.8541878128e-12;
|
|
13
|
-
/** Vacuum permeability from ε₀ and the exact c. */
|
|
14
|
-
export declare const MU0_SI: number;
|
|
15
11
|
/** One formula-only name. @internal */
|
|
16
12
|
export interface FormulaName {
|
|
17
13
|
readonly name: string;
|
|
@@ -19,9 +15,8 @@ export interface FormulaName {
|
|
|
19
15
|
readonly value: number;
|
|
20
16
|
}
|
|
21
17
|
/**
|
|
22
|
-
* Overlay names
|
|
23
|
-
* so it is not listed here.
|
|
24
|
-
* curvature extension (the frozen `CE-friedmann` entry is the flat term).
|
|
18
|
+
* Overlay names: the registry rows a canonical equation may not bake. `eps0`
|
|
19
|
+
* is a spelling of `epsilon_0`, so it is not listed here.
|
|
25
20
|
* @internal
|
|
26
21
|
*/
|
|
27
22
|
export declare const FORMULA_NAMED: readonly FormulaName[];
|
|
@@ -82,6 +77,12 @@ export declare function temperatureQuantityRole(name: string): 'absolute' | 'dif
|
|
|
82
77
|
export declare class SynonymDisagreementError extends Error {
|
|
83
78
|
constructor(message: string);
|
|
84
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* The error for spellings of one quantity that carry different numbers, or
|
|
82
|
+
* null when they agree. Every caller that refuses a disagreement builds its
|
|
83
|
+
* message here.
|
|
84
|
+
*/
|
|
85
|
+
export declare function synonymDisagreement(present: readonly string[], values: Readonly<Record<string, number | undefined>>): SynonymDisagreementError | null;
|
|
85
86
|
/**
|
|
86
87
|
* Refuse two spellings of one quantity that carry different numbers.
|
|
87
88
|
* The message names the keys the caller typed.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formula-names.d.ts","sourceRoot":"","sources":["../../src/dimensional/formula-names.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"formula-names.d.ts","sourceRoot":"","sources":["../../src/dimensional/formula-names.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAK5C,uCAAuC;AACvC,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAE/C,CAAC;AAEF,6FAA6F;AAC7F,wBAAgB,qBAAqB,IAAI,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAEtE;AAED,2EAA2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,eAAe,EAKvD,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,qEAAqE;AACrE,eAAO,MAAM,cAAc,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAgC,CAAC;AAI1F;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKtE;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAGxE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGvD;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,YAAY,CAE/E;AAED;;;GAGG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,GACnD,wBAAwB,GAAG,IAAI,CAMjC;AAOD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,CAKrF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAYlF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,EACjC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACxC,MAAM,GAAG,IAAI,CAmBf"}
|
|
@@ -1,52 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Names a formula may use that are not leaves of {@link CONSTANTS}
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
2
|
+
* Names a formula may use that are not leaves of {@link CONSTANTS}: the
|
|
3
|
+
* non-canonical rows of the constant registry. Spreading them into
|
|
4
|
+
* `CONSTANTS` would bake them into the canonical graph (`CANONICAL_CONSTANTS`
|
|
5
|
+
* spreads that table). They are an overlay for dimensional assignment and for
|
|
6
|
+
* `upt eval` only.
|
|
7
7
|
*
|
|
8
8
|
* @module dimensional/formula-names
|
|
9
9
|
*/
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import { allQuantityRecords, quantityRecord, synonymGroupsFromRegistry } from './quantity-registry.js';
|
|
13
|
-
const PERMITTIVITY = { L: -3, M: -1, T: 4, I: 2, Theta: 0, N: 0, J: 0 };
|
|
14
|
-
/** μ₀ = 1/(ε₀ c²), [M L T⁻² I⁻²]. */
|
|
15
|
-
const PERMEABILITY = { L: 1, M: 1, T: -2, I: -2, Theta: 0, N: 0, J: 0 };
|
|
16
|
-
/** N_A — [N⁻¹]. */
|
|
17
|
-
const PER_AMOUNT = { L: 0, M: 0, T: 0, I: 0, Theta: 0, N: -1, J: 0 };
|
|
18
|
-
/** Faraday constant — charge per amount, [T I N⁻¹]. */
|
|
19
|
-
const FARADAY = { L: 0, M: 0, T: 1, I: 1, Theta: 0, N: -1, J: 0 };
|
|
20
|
-
/** Thomson cross-section — area. */
|
|
21
|
-
const AREA = { L: 2, M: 0, T: 0, I: 0, Theta: 0, N: 0, J: 0 };
|
|
22
|
-
/** Vacuum permittivity, the same CODATA value `CONSTANTS.epsilon_0` holds. */
|
|
23
|
-
export const EPS0_SI = 8.8541878128e-12;
|
|
24
|
-
/** Vacuum permeability from ε₀ and the exact c. */
|
|
25
|
-
export const MU0_SI = 1 / (EPS0_SI * C_SI * C_SI);
|
|
10
|
+
import { MASS, TEMPERATURE } from './types.js';
|
|
11
|
+
import { CONSTANT_REGISTRY } from './symbolic-constants.js';
|
|
12
|
+
import { allQuantityRecords, foldName, quantityRecord, synonymGroupsFromRegistry } from './quantity-registry.js';
|
|
26
13
|
/**
|
|
27
|
-
* Overlay names
|
|
28
|
-
* so it is not listed here.
|
|
29
|
-
* curvature extension (the frozen `CE-friedmann` entry is the flat term).
|
|
14
|
+
* Overlay names: the registry rows a canonical equation may not bake. `eps0`
|
|
15
|
+
* is a spelling of `epsilon_0`, so it is not listed here.
|
|
30
16
|
* @internal
|
|
31
17
|
*/
|
|
32
|
-
export const FORMULA_NAMED =
|
|
33
|
-
{ name: 'm_e', dim: MASS, value: M_E_SI },
|
|
34
|
-
{ name: 'electron_mass', dim: MASS, value: M_E_SI },
|
|
35
|
-
{ name: 'e_charge', dim: CHARGE, value: E_SI },
|
|
36
|
-
{ name: 'mu_0', dim: PERMEABILITY, value: MU0_SI },
|
|
37
|
-
{ name: 'm_p', dim: MASS, value: M_PROTON_SI },
|
|
38
|
-
{ name: 'm_proton', dim: MASS, value: M_PROTON_SI },
|
|
39
|
-
{ name: 'N_A', dim: PER_AMOUNT, value: N_A_SI },
|
|
40
|
-
{ name: 'F', dim: FARADAY, value: FARADAY_SI },
|
|
41
|
-
{ name: 'curvature_k', dim: DIMENSIONLESS, value: 0 },
|
|
42
|
-
{ name: 'scale_factor', dim: LENGTH, value: 1 },
|
|
43
|
-
{ name: 'sigma_T', dim: AREA, value: THOMSON_CROSS_SECTION_SI },
|
|
44
|
-
{ name: 'lane_emden_omega_3', dim: DIMENSIONLESS, value: LANE_EMDEN_OMEGA3 },
|
|
45
|
-
// GRW mass amplification: λ = λ₀ · (m / m₀), with λ₀ a rate and m₀ a mass.
|
|
46
|
-
// The two numbers are the catalog expression's, so the rate is unchanged.
|
|
47
|
-
{ name: 'grw_lambda0', dim: FREQUENCY, value: 1e-16 },
|
|
48
|
-
{ name: 'grw_m0', dim: MASS, value: 1.67e-27 },
|
|
49
|
-
];
|
|
18
|
+
export const FORMULA_NAMED = CONSTANT_REGISTRY.filter((row) => !row.canonical).map((row) => ({ name: row.name, dim: row.dim, value: row.value }));
|
|
50
19
|
/** Name → dimension for the formula overlay. Does not override a catalog entry. @internal */
|
|
51
20
|
export function formulaNameDimensions() {
|
|
52
21
|
return new Map(FORMULA_NAMED.map((n) => [n.name, n.dim]));
|
|
@@ -78,7 +47,6 @@ export const DIMENSION_RENAMES = [
|
|
|
78
47
|
*/
|
|
79
48
|
/** Synonym groups projected from the quantity registry's aliases. */
|
|
80
49
|
export const SYNONYM_GROUPS = synonymGroupsFromRegistry();
|
|
81
|
-
const foldName = (s) => s.replace(/_/g, '-');
|
|
82
50
|
const QUANTITY_IDS = new Set(allQuantityRecords().map((row) => row.id));
|
|
83
51
|
/**
|
|
84
52
|
* The registry id for `name`, or for the same spelling with `_` written as `-`.
|
|
@@ -125,6 +93,20 @@ export class SynonymDisagreementError extends Error {
|
|
|
125
93
|
this.name = 'SynonymDisagreementError';
|
|
126
94
|
}
|
|
127
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* The error for spellings of one quantity that carry different numbers, or
|
|
98
|
+
* null when they agree. Every caller that refuses a disagreement builds its
|
|
99
|
+
* message here.
|
|
100
|
+
*/
|
|
101
|
+
export function synonymDisagreement(present, values) {
|
|
102
|
+
if (present.length < 2)
|
|
103
|
+
return null;
|
|
104
|
+
const first = values[present[0]];
|
|
105
|
+
if (!present.some((key) => values[key] !== first))
|
|
106
|
+
return null;
|
|
107
|
+
const shown = present.map((key) => `${key}=${values[key]}`).join(', ');
|
|
108
|
+
return new SynonymDisagreementError(`${present.join(' and ')} are one quantity and disagree (${shown})`);
|
|
109
|
+
}
|
|
128
110
|
/** Spellings of one group that `values` actually binds. */
|
|
129
111
|
function presentSpellings(group, values) {
|
|
130
112
|
return Object.keys(values).filter((key) => group.some((member) => member === key || foldName(member) === foldName(key)));
|
|
@@ -135,14 +117,9 @@ function presentSpellings(group, values) {
|
|
|
135
117
|
*/
|
|
136
118
|
export function assertSynonymAgreement(values) {
|
|
137
119
|
for (const group of SYNONYM_GROUPS) {
|
|
138
|
-
const
|
|
139
|
-
if (
|
|
140
|
-
|
|
141
|
-
const first = values[present[0]];
|
|
142
|
-
if (present.some((key) => values[key] !== first)) {
|
|
143
|
-
const shown = present.map((key) => `${key}=${values[key]}`).join(', ');
|
|
144
|
-
throw new SynonymDisagreementError(`${present.join(' and ')} are one quantity and disagree (${shown})`);
|
|
145
|
-
}
|
|
120
|
+
const disagreement = synonymDisagreement(presentSpellings(group, values), values);
|
|
121
|
+
if (disagreement !== null)
|
|
122
|
+
throw disagreement;
|
|
146
123
|
}
|
|
147
124
|
}
|
|
148
125
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formula-names.js","sourceRoot":"","sources":["../../src/dimensional/formula-names.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"formula-names.js","sourceRoot":"","sources":["../../src/dimensional/formula-names.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The quantity registry. Canonical id, aliases, dimension, and whether an
|
|
3
3
|
* affine temperature is an absolute point or an interval. Synonym groups and
|
|
4
|
-
* the temperature role are projections of this table.
|
|
4
|
+
* the temperature role are projections of this table. The aliases of a
|
|
5
|
+
* quantity that is also a registered constant come from the constant registry.
|
|
5
6
|
*
|
|
6
7
|
* @module dimensional/quantity-registry
|
|
7
8
|
*/
|
|
@@ -21,6 +22,14 @@ export interface QuantityRecord {
|
|
|
21
22
|
readonly signRole?: SignRole;
|
|
22
23
|
readonly graphNode: boolean;
|
|
23
24
|
}
|
|
25
|
+
/** `_` written as `-`: the one fold every spelling comparison uses. */
|
|
26
|
+
export declare const foldName: (s: string) => string;
|
|
27
|
+
/**
|
|
28
|
+
* Folded spelling → row, over every id and alias. Two rows that one folded
|
|
29
|
+
* spelling names throw: the later row would silently shadow the earlier.
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
export declare function quantitySpellingIndex(rows: readonly QuantityRecord[]): ReadonlyMap<string, QuantityRecord>;
|
|
24
33
|
/** Every quantity record, graph nodes and spellings. */
|
|
25
34
|
export declare function allQuantityRecords(): readonly QuantityRecord[];
|
|
26
35
|
/** The record `name` spells, comparing `_` and `-` as the same character. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quantity-registry.d.ts","sourceRoot":"","sources":["../../src/dimensional/quantity-registry.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"quantity-registry.d.ts","sourceRoot":"","sources":["../../src/dimensional/quantity-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,uDAAuD;AACvD,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,UAAU,CAAC;AAEnD,wDAAwD;AACxD,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE7C,kFAAkF;AAClF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAMD,uEAAuE;AACvE,eAAO,MAAM,QAAQ,MAAO,MAAM,KAAG,MAA8B,CAAC;AA2BpE;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,cAAc,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAY1G;AAID,wDAAwD;AACxD,wBAAgB,kBAAkB,IAAI,SAAS,cAAc,EAAE,CAE9D;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEvE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAQ1E"}
|
|
@@ -1,36 +1,65 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The quantity registry. Canonical id, aliases, dimension, and whether an
|
|
3
3
|
* affine temperature is an absolute point or an interval. Synonym groups and
|
|
4
|
-
* the temperature role are projections of this table.
|
|
4
|
+
* the temperature role are projections of this table. The aliases of a
|
|
5
|
+
* quantity that is also a registered constant come from the constant registry.
|
|
5
6
|
*
|
|
6
7
|
* @module dimensional/quantity-registry
|
|
7
8
|
*/
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
const foldName = (s) => s.replace(/_/g, '-');
|
|
9
|
+
import { checkedDataFile } from '../core/data-file.js';
|
|
10
|
+
import { CONSTANT_REGISTRY } from './symbolic-constants.js';
|
|
11
|
+
/** `_` written as `-`: the one fold every spelling comparison uses. */
|
|
12
|
+
export const foldName = (s) => s.replace(/_/g, '-');
|
|
13
|
+
/**
|
|
14
|
+
* The rows of `data/quantities.json`. A constant that is also a quantity
|
|
15
|
+
* (`k_B` is `boltzmann-constant`) gives that row its spellings as aliases:
|
|
16
|
+
* the constant registry owns them and the file does not repeat them.
|
|
17
|
+
*/
|
|
12
18
|
function loadQuantities() {
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
|
|
19
|
+
const parsed = checkedDataFile('quantities.json');
|
|
20
|
+
const ids = new Set(parsed.quantities.map((row) => row.id));
|
|
21
|
+
const derived = new Map();
|
|
22
|
+
for (const constant of CONSTANT_REGISTRY) {
|
|
23
|
+
if (constant.quantity === undefined)
|
|
24
|
+
continue;
|
|
25
|
+
if (!ids.has(constant.quantity)) {
|
|
26
|
+
throw new Error(`constant '${constant.name}' names quantity '${constant.quantity}', which data/quantities.json does not have`);
|
|
27
|
+
}
|
|
28
|
+
derived.set(constant.quantity, [...(derived.get(constant.quantity) ?? []), constant.name, ...constant.spellings]);
|
|
29
|
+
}
|
|
30
|
+
return parsed.quantities.map((row) => {
|
|
31
|
+
const known = new Set([row.id, ...(row.aliases ?? [])].map(foldName));
|
|
32
|
+
const spellings = (derived.get(row.id) ?? []).filter((spelling) => !known.has(foldName(spelling)));
|
|
33
|
+
return spellings.length === 0 ? row : { ...row, aliases: [...(row.aliases ?? []), ...spellings] };
|
|
34
|
+
});
|
|
16
35
|
}
|
|
17
36
|
const QUANTITIES = loadQuantities();
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
37
|
+
/**
|
|
38
|
+
* Folded spelling → row, over every id and alias. Two rows that one folded
|
|
39
|
+
* spelling names throw: the later row would silently shadow the earlier.
|
|
40
|
+
* @internal
|
|
41
|
+
*/
|
|
42
|
+
export function quantitySpellingIndex(rows) {
|
|
43
|
+
const index = new Map();
|
|
44
|
+
for (const row of rows) {
|
|
45
|
+
for (const spelling of new Set([row.id, ...(row.aliases ?? [])].map(foldName))) {
|
|
46
|
+
const other = index.get(spelling);
|
|
47
|
+
if (other !== undefined) {
|
|
48
|
+
throw new Error(`data/quantities.json: '${spelling}' spells both '${other.id}' and '${row.id}' (\`_\` and \`-\` are one character)`);
|
|
49
|
+
}
|
|
50
|
+
index.set(spelling, row);
|
|
51
|
+
}
|
|
25
52
|
}
|
|
53
|
+
return index;
|
|
26
54
|
}
|
|
55
|
+
const BY_KEY = quantitySpellingIndex(QUANTITIES);
|
|
27
56
|
/** Every quantity record, graph nodes and spellings. */
|
|
28
57
|
export function allQuantityRecords() {
|
|
29
58
|
return QUANTITIES;
|
|
30
59
|
}
|
|
31
60
|
/** The record `name` spells, comparing `_` and `-` as the same character. */
|
|
32
61
|
export function quantityRecord(name) {
|
|
33
|
-
return BY_KEY.get(
|
|
62
|
+
return BY_KEY.get(foldName(name));
|
|
34
63
|
}
|
|
35
64
|
/**
|
|
36
65
|
* Synonym groups projected from declared aliases. The canonical id is first.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quantity-registry.js","sourceRoot":"","sources":["../../src/dimensional/quantity-registry.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"quantity-registry.js","sourceRoot":"","sources":["../../src/dimensional/quantity-registry.ts"],"names":[],"mappings":"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"}
|