universal-physics-tensor 0.7.3 → 0.15.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 +147 -109
- package/bin/upt.mjs +508 -0
- package/dist/bridges/be23-planckian-confrontation.d.ts +162 -0
- package/dist/bridges/be23-planckian-confrontation.d.ts.map +1 -0
- package/dist/bridges/be23-planckian-confrontation.js +196 -0
- package/dist/bridges/be23-planckian-confrontation.js.map +1 -0
- package/dist/bridges/be36-gw170817-confrontation.d.ts +111 -0
- package/dist/bridges/be36-gw170817-confrontation.d.ts.map +1 -0
- package/dist/bridges/be36-gw170817-confrontation.js +100 -0
- package/dist/bridges/be36-gw170817-confrontation.js.map +1 -0
- package/dist/bridges/bridge-equations.d.ts +129 -0
- package/dist/bridges/bridge-equations.d.ts.map +1 -0
- package/dist/bridges/bridge-equations.js +130 -0
- package/dist/bridges/bridge-equations.js.map +1 -0
- package/dist/bridges/catalog-adapter.d.ts +1 -1
- package/dist/bridges/catalog-adapter.js +1 -1
- package/dist/bridges/confrontation-coverage.d.ts +67 -0
- package/dist/bridges/confrontation-coverage.d.ts.map +1 -0
- package/dist/bridges/confrontation-coverage.js +83 -0
- package/dist/bridges/confrontation-coverage.js.map +1 -0
- package/dist/bridges/equations/_be-helpers.d.ts +2 -1
- package/dist/bridges/equations/_be-helpers.d.ts.map +1 -1
- package/dist/bridges/equations/be-12-coherence-length.d.ts +1 -1
- package/dist/bridges/equations/be-13-einstein-trace.d.ts +2 -2
- package/dist/bridges/equations/be-13-einstein-trace.js +1 -1
- package/dist/bridges/equations/be-14-ryu-takayanagi.d.ts +2 -2
- package/dist/bridges/equations/be-15-emergence.d.ts +19 -5
- package/dist/bridges/equations/be-15-emergence.d.ts.map +1 -1
- package/dist/bridges/equations/be-15-emergence.js +18 -4
- package/dist/bridges/equations/be-15-emergence.js.map +1 -1
- package/dist/bridges/equations/be-16-landauer.d.ts +1 -1
- package/dist/bridges/equations/be-17-einstein-cartan.d.ts +1 -1
- package/dist/bridges/equations/be-18-higgs-mass.d.ts +1 -1
- package/dist/bridges/equations/be-19-quantum-bounce.d.ts +1 -1
- package/dist/bridges/equations/be-20-vacuum-energy.d.ts +4 -4
- package/dist/bridges/equations/be-20-vacuum-energy.d.ts.map +1 -1
- package/dist/bridges/equations/be-20-vacuum-energy.js +4 -2
- package/dist/bridges/equations/be-20-vacuum-energy.js.map +1 -1
- package/dist/bridges/equations/be-22-topological-entanglement.d.ts +1 -1
- package/dist/bridges/equations/be-23-syk-planckian.d.ts +1 -1
- package/dist/bridges/equations/be-24-foerster-fret.d.ts +1 -1
- package/dist/bridges/equations/be-25-iit-phi.d.ts +1 -1
- package/dist/bridges/equations/be-25-orch-or.d.ts +13 -1
- package/dist/bridges/equations/be-25-orch-or.d.ts.map +1 -1
- package/dist/bridges/equations/be-25-orch-or.js +12 -0
- package/dist/bridges/equations/be-25-orch-or.js.map +1 -1
- package/dist/bridges/equations/be-26-dna-tunneling.d.ts +2 -2
- package/dist/bridges/equations/be-26-dna-tunneling.js +1 -1
- package/dist/bridges/equations/be-27-effective-temperature.d.ts +1 -1
- package/dist/bridges/equations/be-28-onsager-entropy-production.d.ts +1 -1
- package/dist/bridges/equations/be-29-jarzynski.d.ts +1 -1
- package/dist/bridges/equations/be-30-flm-first-law.d.ts +2 -2
- package/dist/bridges/equations/be-31-causal-set-bd.d.ts +1 -1
- package/dist/bridges/equations/be-32-quantum-reference-frame.d.ts +1 -1
- package/dist/bridges/equations/be-33-hertz-millis.d.ts +1 -1
- package/dist/bridges/equations/be-34-kibble-zurek.d.ts +1 -1
- package/dist/bridges/equations/be-35-conformal-bootstrap.d.ts +1 -1
- package/dist/bridges/equations/be-36-gw-speed-bound.d.ts +12 -5
- package/dist/bridges/equations/be-36-gw-speed-bound.d.ts.map +1 -1
- package/dist/bridges/equations/be-36-gw-speed-bound.js +11 -4
- package/dist/bridges/equations/be-36-gw-speed-bound.js.map +1 -1
- package/dist/bridges/equations/be-38-mond.d.ts +1 -1
- package/dist/bridges/equations/be-39-asymptotic-safety.d.ts +2 -2
- package/dist/bridges/equations/be-40-composite-higgs.d.ts +1 -1
- package/dist/bridges/equations/be-41-swampland.d.ts +1 -1
- package/dist/bridges/equations/be-43-er-epr.d.ts +1 -1
- package/dist/bridges/equations/be-44-soft-hair.d.ts +1 -1
- package/dist/bridges/equations/be-45-tcc.d.ts +1 -1
- package/dist/bridges/equations/be-46-multiverse-measure.d.ts +1 -1
- package/dist/bridges/equations/be-47-bbn-dark-sector.d.ts +1 -1
- package/dist/bridges/equations/be-48-grw-localization.d.ts +1 -1
- package/dist/bridges/equations/be-49-quantum-darwinism.d.ts +1 -1
- package/dist/bridges/equations/be-50-wheeler-feynman.d.ts +1 -1
- package/dist/bridges/index.d.ts +10 -7
- package/dist/bridges/index.d.ts.map +1 -1
- package/dist/bridges/index.js +47 -34
- package/dist/bridges/index.js.map +1 -1
- package/dist/bridges/membership.d.ts +44 -0
- package/dist/bridges/membership.d.ts.map +1 -0
- package/dist/bridges/membership.js +59 -0
- package/dist/bridges/membership.js.map +1 -0
- package/dist/bridges/rejected.d.ts +40 -0
- package/dist/bridges/rejected.d.ts.map +1 -0
- package/dist/bridges/rejected.js +81 -0
- package/dist/bridges/rejected.js.map +1 -0
- package/dist/composition/bridge-analysis.d.ts +189 -0
- package/dist/composition/bridge-analysis.d.ts.map +1 -0
- package/dist/composition/bridge-analysis.js +445 -0
- package/dist/composition/bridge-analysis.js.map +1 -0
- package/dist/composition/bridge-prediction.d.ts +95 -0
- package/dist/composition/bridge-prediction.d.ts.map +1 -0
- package/dist/composition/bridge-prediction.js +0 -0
- package/dist/composition/bridge-prediction.js.map +1 -0
- package/dist/composition/catalog-graph.d.ts +20 -0
- package/dist/composition/catalog-graph.d.ts.map +1 -0
- package/dist/composition/catalog-graph.js +39 -0
- package/dist/composition/catalog-graph.js.map +1 -0
- package/dist/composition/compose-surface.d.ts +12 -0
- package/dist/composition/compose-surface.d.ts.map +1 -0
- package/dist/composition/compose-surface.js +10 -0
- package/dist/composition/compose-surface.js.map +1 -0
- package/dist/composition/compose-symbolic.d.ts +75 -0
- package/dist/composition/compose-symbolic.d.ts.map +1 -0
- package/dist/composition/compose-symbolic.js +157 -0
- package/dist/composition/compose-symbolic.js.map +1 -0
- package/dist/composition/compose.d.ts +110 -0
- package/dist/composition/compose.d.ts.map +1 -0
- package/dist/composition/compose.js +231 -0
- package/dist/composition/compose.js.map +1 -0
- package/dist/composition/consistency.d.ts +24 -0
- package/dist/composition/consistency.d.ts.map +1 -0
- package/dist/composition/consistency.js +26 -0
- package/dist/composition/consistency.js.map +1 -0
- package/dist/composition/discovery.d.ts +104 -0
- package/dist/composition/discovery.d.ts.map +1 -0
- package/dist/composition/discovery.js +165 -0
- package/dist/composition/discovery.js.map +1 -0
- package/dist/composition/edge.d.ts +139 -0
- package/dist/composition/edge.d.ts.map +1 -0
- package/dist/composition/edge.js +72 -0
- package/dist/composition/edge.js.map +1 -0
- package/dist/composition/edges/calibration.d.ts +107 -0
- package/dist/composition/edges/calibration.d.ts.map +1 -0
- package/dist/composition/edges/calibration.js +373 -0
- package/dist/composition/edges/calibration.js.map +1 -0
- package/dist/composition/edges/catalog-full.d.ts +299 -0
- package/dist/composition/edges/catalog-full.d.ts.map +1 -0
- package/dist/composition/edges/catalog-full.js +989 -0
- package/dist/composition/edges/catalog-full.js.map +1 -0
- package/dist/composition/edges/catalog-tranche.d.ts +112 -0
- package/dist/composition/edges/catalog-tranche.d.ts.map +1 -0
- package/dist/composition/edges/catalog-tranche.js +241 -0
- package/dist/composition/edges/catalog-tranche.js.map +1 -0
- package/dist/composition/enumerate.d.ts +67 -0
- package/dist/composition/enumerate.d.ts.map +1 -0
- package/dist/composition/enumerate.js +78 -0
- package/dist/composition/enumerate.js.map +1 -0
- package/dist/composition/explain.d.ts +102 -0
- package/dist/composition/explain.d.ts.map +1 -0
- package/dist/composition/explain.js +244 -0
- package/dist/composition/explain.js.map +1 -0
- package/dist/composition/expr-eval.d.ts +33 -0
- package/dist/composition/expr-eval.d.ts.map +1 -0
- package/dist/composition/expr-eval.js +95 -0
- package/dist/composition/expr-eval.js.map +1 -0
- package/dist/composition/expr-simplify.d.ts +60 -0
- package/dist/composition/expr-simplify.d.ts.map +1 -0
- package/dist/composition/expr-simplify.js +330 -0
- package/dist/composition/expr-simplify.js.map +1 -0
- package/dist/composition/expr-subst.d.ts +29 -0
- package/dist/composition/expr-subst.d.ts.map +1 -0
- package/dist/composition/expr-subst.js +60 -0
- package/dist/composition/expr-subst.js.map +1 -0
- package/dist/composition/identifiability.d.ts +103 -0
- package/dist/composition/identifiability.d.ts.map +1 -0
- package/dist/composition/identifiability.js +148 -0
- package/dist/composition/identifiability.js.map +1 -0
- package/dist/composition/index.d.ts +37 -0
- package/dist/composition/index.d.ts.map +1 -0
- package/dist/composition/index.js +27 -0
- package/dist/composition/index.js.map +1 -0
- package/dist/composition/quantities.d.ts +297 -0
- package/dist/composition/quantities.d.ts.map +1 -0
- package/dist/composition/quantities.js +1017 -0
- package/dist/composition/quantities.js.map +1 -0
- package/dist/composition/quantity.d.ts +59 -0
- package/dist/composition/quantity.d.ts.map +1 -0
- package/dist/composition/quantity.js +36 -0
- package/dist/composition/quantity.js.map +1 -0
- package/dist/composition/retrodiction.d.ts +94 -0
- package/dist/composition/retrodiction.d.ts.map +1 -0
- package/dist/composition/retrodiction.js +171 -0
- package/dist/composition/retrodiction.js.map +1 -0
- package/dist/composition/symbolic-constants.d.ts +33 -0
- package/dist/composition/symbolic-constants.d.ts.map +1 -0
- package/dist/composition/symbolic-constants.js +50 -0
- package/dist/composition/symbolic-constants.js.map +1 -0
- package/dist/composition/uncertainty.d.ts +45 -0
- package/dist/composition/uncertainty.d.ts.map +1 -0
- package/dist/composition/uncertainty.js +59 -0
- package/dist/composition/uncertainty.js.map +1 -0
- package/dist/core/axes-registry.d.ts +1 -1
- package/dist/core/axes-registry.js +1 -1
- package/dist/core/cell.d.ts +0 -8
- package/dist/core/cell.d.ts.map +1 -1
- package/dist/core/cell.js +1 -1
- package/dist/core/cell.js.map +1 -1
- package/dist/core/constants.d.ts +15 -1
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +15 -1
- package/dist/core/constants.js.map +1 -1
- package/dist/core/flux-rules.d.ts +10 -13
- package/dist/core/flux-rules.d.ts.map +1 -1
- package/dist/core/flux-rules.js +19 -10
- package/dist/core/flux-rules.js.map +1 -1
- package/dist/core/labeled-tensor.d.ts +80 -1
- package/dist/core/labeled-tensor.d.ts.map +1 -1
- package/dist/core/labeled-tensor.js +263 -17
- package/dist/core/labeled-tensor.js.map +1 -1
- package/dist/core/universal-index.d.ts +1 -1
- package/dist/core/universal-index.js +1 -1
- package/dist/diff/bridge-gradient.d.ts +51 -8
- package/dist/diff/bridge-gradient.d.ts.map +1 -1
- package/dist/diff/bridge-gradient.js +75 -8
- package/dist/diff/bridge-gradient.js.map +1 -1
- package/dist/dimensional/buckingham.d.ts +103 -0
- package/dist/dimensional/buckingham.d.ts.map +1 -0
- package/dist/dimensional/buckingham.js +284 -0
- package/dist/dimensional/buckingham.js.map +1 -0
- package/dist/dimensional/dimension-spec.d.ts +24 -0
- package/dist/dimensional/dimension-spec.d.ts.map +1 -0
- package/dist/dimensional/dimension-spec.js +110 -0
- package/dist/dimensional/dimension-spec.js.map +1 -0
- package/dist/dimensional/field-equation-helpers.d.ts +1 -1
- package/dist/dimensional/field-equation-helpers.js +1 -1
- package/dist/dimensional/friedmann-equation.d.ts +1 -1
- package/dist/dimensional/friedmann-equation.js +1 -1
- package/dist/dimensional/gauge-field.d.ts +1 -1
- package/dist/dimensional/gauge-field.js +1 -1
- package/dist/dimensional/klein-gordon-equation.d.ts +8 -5
- package/dist/dimensional/klein-gordon-equation.d.ts.map +1 -1
- package/dist/dimensional/klein-gordon-equation.js +8 -5
- package/dist/dimensional/klein-gordon-equation.js.map +1 -1
- package/dist/dimensional/tensor-trace.d.ts +1 -1
- package/dist/dimensional/tensor-trace.js +1 -1
- package/dist/dimensional/validator.d.ts +13 -3
- package/dist/dimensional/validator.d.ts.map +1 -1
- package/dist/dimensional/validator.js +129 -42
- package/dist/dimensional/validator.js.map +1 -1
- package/dist/index.d.ts +34 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +64 -3
- package/dist/index.js.map +1 -1
- package/dist/numerical/be37-covariant-eikonal.d.ts.map +1 -1
- package/dist/numerical/be37-covariant-eikonal.js +15 -18
- package/dist/numerical/be37-covariant-eikonal.js.map +1 -1
- package/dist/numerical/curvature-lowering-helpers.d.ts +7 -13
- package/dist/numerical/curvature-lowering-helpers.d.ts.map +1 -1
- package/dist/numerical/curvature-lowering-helpers.js +1 -1
- package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
- package/dist/numerical/derivative-lowering.d.ts +2 -1
- package/dist/numerical/derivative-lowering.d.ts.map +1 -1
- package/dist/numerical/formula-dimension.d.ts +40 -0
- package/dist/numerical/formula-dimension.d.ts.map +1 -0
- package/dist/numerical/formula-dimension.js +199 -0
- package/dist/numerical/formula-dimension.js.map +1 -0
- package/dist/numerical/formula-mathts.d.ts +27 -0
- package/dist/numerical/formula-mathts.d.ts.map +1 -0
- package/dist/numerical/formula-mathts.js +98 -0
- package/dist/numerical/formula-mathts.js.map +1 -0
- package/dist/numerical/formula-registry.d.ts +30 -0
- package/dist/numerical/formula-registry.d.ts.map +1 -0
- package/dist/numerical/formula-registry.js +88 -0
- package/dist/numerical/formula-registry.js.map +1 -0
- package/dist/numerical/formula.d.ts +75 -0
- package/dist/numerical/formula.d.ts.map +1 -0
- package/dist/numerical/formula.js +275 -0
- package/dist/numerical/formula.js.map +1 -0
- package/dist/numerical/geometrized.d.ts +51 -0
- package/dist/numerical/geometrized.d.ts.map +1 -0
- package/dist/numerical/geometrized.js +66 -0
- package/dist/numerical/geometrized.js.map +1 -0
- package/dist/numerical/gl4-integrator.d.ts +8 -6
- package/dist/numerical/gl4-integrator.d.ts.map +1 -1
- package/dist/numerical/gl4-integrator.js +6 -6
- package/dist/numerical/gl4-integrator.js.map +1 -1
- package/dist/numerical/klein-gordon.d.ts +145 -0
- package/dist/numerical/klein-gordon.d.ts.map +1 -0
- package/dist/numerical/klein-gordon.js +145 -0
- package/dist/numerical/klein-gordon.js.map +1 -0
- package/dist/numerical/kretschmann.d.ts +43 -12
- package/dist/numerical/kretschmann.d.ts.map +1 -1
- package/dist/numerical/kretschmann.js +116 -29
- package/dist/numerical/kretschmann.js.map +1 -1
- package/dist/numerical/lowering.d.ts +18 -0
- package/dist/numerical/lowering.d.ts.map +1 -1
- package/dist/numerical/lowering.js +54 -42
- package/dist/numerical/lowering.js.map +1 -1
- package/dist/numerical/null-ic.d.ts +1 -1
- package/dist/numerical/null-ic.d.ts.map +1 -1
- package/dist/numerical/null-ic.js +3 -2
- package/dist/numerical/null-ic.js.map +1 -1
- package/dist/numerical/painleve-gullstrand-metric.d.ts +18 -6
- package/dist/numerical/painleve-gullstrand-metric.d.ts.map +1 -1
- package/dist/numerical/painleve-gullstrand-metric.js +31 -16
- package/dist/numerical/painleve-gullstrand-metric.js.map +1 -1
- package/dist/numerical/perihelion-finder.d.ts +4 -3
- package/dist/numerical/perihelion-finder.d.ts.map +1 -1
- package/dist/numerical/perihelion-finder.js +5 -4
- package/dist/numerical/perihelion-finder.js.map +1 -1
- package/dist/numerical/types.d.ts +6 -3
- package/dist/numerical/types.d.ts.map +1 -1
- package/dist/numerical/weyl-lowering.d.ts +4 -4
- package/dist/numerical/weyl-lowering.d.ts.map +1 -1
- package/dist/numerical/weyl-lowering.js +14 -1
- package/dist/numerical/weyl-lowering.js.map +1 -1
- package/package.json +19 -8
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MathTS-backed scalar-formula parser (Path A — see
|
|
3
|
+
* docs/planning/MathTS-Formula-Integration-Design-Note.md).
|
|
4
|
+
*
|
|
5
|
+
* Implements the same {@link FormulaParser} contract as the self-contained
|
|
6
|
+
* Path B parser (`formula.ts`), backed by `@danielsimonjr/mathts-functions`'s
|
|
7
|
+
* assembled mathjs-style engine (`parse(expr) → Node`, `node.evaluate(scope)`).
|
|
8
|
+
* The optional peer is loaded dynamically (it is NOT present at tsc time —
|
|
9
|
+
* the ambient declaration in `mathts-functions.ambient.d.ts` covers it), so
|
|
10
|
+
* the package still builds and runs without it; the registry
|
|
11
|
+
* (`formula-registry.ts`) falls back to Path B when it is absent.
|
|
12
|
+
*
|
|
13
|
+
* SCALAR-ONLY guard: the CLI/inference contract returns a `number`. If a
|
|
14
|
+
* formula evaluates to a non-number (matrix, complex, unit, function), this
|
|
15
|
+
* throws a {@link FormulaError} rather than leaking MathTS types through the
|
|
16
|
+
* seam — keeping the two parsers interchangeable.
|
|
17
|
+
*
|
|
18
|
+
* @module numerical/formula-mathts
|
|
19
|
+
*/
|
|
20
|
+
import { FormulaError } from './formula.js';
|
|
21
|
+
/**
|
|
22
|
+
* Build a {@link FormulaParser} bound to an already-loaded mathts-functions
|
|
23
|
+
* module. Pure (no I/O) — the dynamic import lives in the registry.
|
|
24
|
+
*/
|
|
25
|
+
function createMathtsFormulaParser(mod) {
|
|
26
|
+
const builtinCache = new Map();
|
|
27
|
+
const isBuiltin = (name) => {
|
|
28
|
+
const cached = builtinCache.get(name);
|
|
29
|
+
if (cached !== undefined)
|
|
30
|
+
return cached;
|
|
31
|
+
let builtin;
|
|
32
|
+
try {
|
|
33
|
+
mod.parse(name).evaluate({});
|
|
34
|
+
builtin = true; // pi / e / sin / … resolve with an empty scope
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
builtin = false; // a free variable does not
|
|
38
|
+
}
|
|
39
|
+
builtinCache.set(name, builtin);
|
|
40
|
+
return builtin;
|
|
41
|
+
};
|
|
42
|
+
return {
|
|
43
|
+
parse(expr) {
|
|
44
|
+
if (!expr || !expr.trim())
|
|
45
|
+
throw new FormulaError('empty formula');
|
|
46
|
+
let node;
|
|
47
|
+
try {
|
|
48
|
+
node = mod.parse(expr);
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
throw new FormulaError(`parse error: ${err instanceof Error ? err.message : String(err)}`);
|
|
52
|
+
}
|
|
53
|
+
// Free variables = symbol names − function callees − built-in
|
|
54
|
+
// constants/functions (MathTS's own namespace decides "built-in").
|
|
55
|
+
const callees = new Set(node
|
|
56
|
+
.filter((n) => n.isFunctionNode === true)
|
|
57
|
+
.map((n) => n.fn?.name)
|
|
58
|
+
.filter((n) => typeof n === 'string'));
|
|
59
|
+
const variables = [
|
|
60
|
+
...new Set(node
|
|
61
|
+
.filter((n) => n.isSymbolNode === true)
|
|
62
|
+
.map((n) => n.name)
|
|
63
|
+
.filter((n) => typeof n === 'string')
|
|
64
|
+
.filter((n) => !callees.has(n) && !isBuiltin(n))),
|
|
65
|
+
].sort();
|
|
66
|
+
return {
|
|
67
|
+
source: expr,
|
|
68
|
+
variables,
|
|
69
|
+
evaluate(scope) {
|
|
70
|
+
let result;
|
|
71
|
+
try {
|
|
72
|
+
result = node.evaluate(scope);
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
throw new FormulaError(err instanceof Error ? err.message : String(err));
|
|
76
|
+
}
|
|
77
|
+
if (typeof result !== 'number' || !Number.isFinite(result)) {
|
|
78
|
+
throw new FormulaError(`formula did not evaluate to a finite number (got ${typeof result})`);
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Dynamically load the optional peer and build the MathTS-backed parser.
|
|
88
|
+
* Throws if the peer is absent or fails to assemble — the registry catches
|
|
89
|
+
* this and falls back to the self-contained Path B parser.
|
|
90
|
+
*/
|
|
91
|
+
export async function loadMathtsFormulaParser() {
|
|
92
|
+
const mod = (await import('@danielsimonjr/mathts-functions'));
|
|
93
|
+
if (typeof mod.parse !== 'function') {
|
|
94
|
+
throw new FormulaError('mathts-functions: no parse() export');
|
|
95
|
+
}
|
|
96
|
+
return createMathtsFormulaParser(mod);
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=formula-mathts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formula-mathts.js","sourceRoot":"","sources":["../../src/numerical/formula-mathts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAkB5C;;;GAGG;AACH,SAAS,yBAAyB,CAChC,GAA0B;IAE1B,MAAM,YAAY,GAAG,IAAI,GAAG,EAAmB,CAAC;IAChD,MAAM,SAAS,GAAG,CAAC,IAAY,EAAW,EAAE;QAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QACxC,IAAI,OAAgB,CAAC;QACrB,IAAI,CAAC;YACH,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC7B,OAAO,GAAG,IAAI,CAAC,CAAC,+CAA+C;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,KAAK,CAAC,CAAC,2BAA2B;QAC9C,CAAC;QACD,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,IAAY;YAChB,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,MAAM,IAAI,YAAY,CAAC,eAAe,CAAC,CAAC;YACnE,IAAI,IAAc,CAAC;YACnB,IAAI,CAAC;gBACH,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,IAAI,YAAY,CACpB,gBAAgB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACnE,CAAC;YACJ,CAAC;YAED,8DAA8D;YAC9D,mEAAmE;YACnE,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,IAAI;iBACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,IAAI,CAAC;iBACxC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC;iBACtB,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CACrD,CAAC;YACF,MAAM,SAAS,GAAG;gBAChB,GAAG,IAAI,GAAG,CACR,IAAI;qBACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,IAAI,CAAC;qBACtC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;qBAClB,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;qBACjD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CACnD;aACF,CAAC,IAAI,EAAE,CAAC;YAET,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,SAAS;gBACT,QAAQ,CAAC,KAA6B;oBACpC,IAAI,MAAe,CAAC;oBACpB,IAAI,CAAC;wBACH,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;oBAChC,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,MAAM,IAAI,YAAY,CACpB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CACjD,CAAC;oBACJ,CAAC;oBACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC3D,MAAM,IAAI,YAAY,CACpB,oDAAoD,OAAO,MAAM,GAAG,CACrE,CAAC;oBACJ,CAAC;oBACD,OAAO,MAAM,CAAC;gBAChB,CAAC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CACvB,iCAAiC,CAClC,CAAqC,CAAC;IACvC,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACpC,MAAM,IAAI,YAAY,CAAC,qCAAqC,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,yBAAyB,CAAC,GAAG,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formula-parser registry (Path A selector — mirrors `engine-registry.ts`).
|
|
3
|
+
*
|
|
4
|
+
* `getFormulaParser()` returns the MathTS-backed parser when the optional
|
|
5
|
+
* peer is installed AND actually assembles and evaluates (smoke-tested),
|
|
6
|
+
* otherwise the self-contained Path B parser. The choice is detected once
|
|
7
|
+
* and cached. A broken or absent MathTS never breaks the caller — it falls
|
|
8
|
+
* back silently to Path B.
|
|
9
|
+
*
|
|
10
|
+
* The CLI and any inference code depend only on the {@link FormulaParser}
|
|
11
|
+
* interface, so swapping Path B ↔ Path A is transparent.
|
|
12
|
+
*
|
|
13
|
+
* @module numerical/formula-registry
|
|
14
|
+
*/
|
|
15
|
+
import type { FormulaParser } from './formula.js';
|
|
16
|
+
import type { FormulaDimensionChecker } from './formula-dimension.js';
|
|
17
|
+
type FormulaParserKind = 'mathts' | 'builtin';
|
|
18
|
+
/** Resolve the active formula parser (cached). @internal */
|
|
19
|
+
export declare function getFormulaParser(): Promise<FormulaParser>;
|
|
20
|
+
/** Which parser is active — `mathts` (Path A) or `builtin` (Path B). @internal */
|
|
21
|
+
export declare function getFormulaParserKind(): Promise<FormulaParserKind>;
|
|
22
|
+
/**
|
|
23
|
+
* The dimensional checker for user formulas (MathTS Phase 2). Always
|
|
24
|
+
* available: it uses the MathTS AST when the peer is installed and
|
|
25
|
+
* smoke-tests clean, else the self-contained Path B AST — both transpile to
|
|
26
|
+
* the same `ExprNode`, so the dimensional verdict is identical. @internal
|
|
27
|
+
*/
|
|
28
|
+
export declare function getFormulaDimensionChecker(): Promise<FormulaDimensionChecker>;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=formula-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formula-registry.d.ts","sourceRoot":"","sources":["../../src/numerical/formula-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAGtE,KAAK,iBAAiB,GAAG,QAAQ,GAAG,SAAS,CAAC;AA8C9C,4DAA4D;AAC5D,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,CAG/D;AAED,kFAAkF;AAClF,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAGvE;AAMD;;;;;GAKG;AACH,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,uBAAuB,CAAC,CAYnF"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formula-parser registry (Path A selector — mirrors `engine-registry.ts`).
|
|
3
|
+
*
|
|
4
|
+
* `getFormulaParser()` returns the MathTS-backed parser when the optional
|
|
5
|
+
* peer is installed AND actually assembles and evaluates (smoke-tested),
|
|
6
|
+
* otherwise the self-contained Path B parser. The choice is detected once
|
|
7
|
+
* and cached. A broken or absent MathTS never breaks the caller — it falls
|
|
8
|
+
* back silently to Path B.
|
|
9
|
+
*
|
|
10
|
+
* The CLI and any inference code depend only on the {@link FormulaParser}
|
|
11
|
+
* interface, so swapping Path B ↔ Path A is transparent.
|
|
12
|
+
*
|
|
13
|
+
* @module numerical/formula-registry
|
|
14
|
+
*/
|
|
15
|
+
import { defaultFormulaParser } from './formula.js';
|
|
16
|
+
import { loadMathtsFormulaParser } from './formula-mathts.js';
|
|
17
|
+
import { loadFormulaDimensionChecker, builtinFormulaDimensionChecker } from './formula-dimension.js';
|
|
18
|
+
let cached;
|
|
19
|
+
/** A formula MathTS must reproduce to be accepted (the §1-gate smoke test). */
|
|
20
|
+
const SMOKE_EXPR = 'a*b^2 + 1';
|
|
21
|
+
const SMOKE_SCOPE = { a: 3, b: 4 };
|
|
22
|
+
const SMOKE_EXPECTED = 49; // 3*16 + 1
|
|
23
|
+
/** Run `fn` with MathTS's import-time WASM-fallback chatter suppressed. */
|
|
24
|
+
async function quietly(fn) {
|
|
25
|
+
const origWarn = console.warn;
|
|
26
|
+
const origError = console.error;
|
|
27
|
+
const origWrite = process.stderr.write.bind(process.stderr);
|
|
28
|
+
console.warn = () => { };
|
|
29
|
+
console.error = () => { };
|
|
30
|
+
// mathts prints some notices via process.stderr.write directly.
|
|
31
|
+
process.stderr.write = () => true;
|
|
32
|
+
try {
|
|
33
|
+
return await fn();
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
console.warn = origWarn;
|
|
37
|
+
console.error = origError;
|
|
38
|
+
process.stderr.write = origWrite;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function detect() {
|
|
42
|
+
try {
|
|
43
|
+
const parser = await quietly(loadMathtsFormulaParser);
|
|
44
|
+
// Smoke test: it must actually assemble AND evaluate correctly.
|
|
45
|
+
const v = parser.parse(SMOKE_EXPR).evaluate(SMOKE_SCOPE);
|
|
46
|
+
if (Math.abs(v - SMOKE_EXPECTED) < 1e-9) {
|
|
47
|
+
return { parser, kind: 'mathts' };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
/* peer absent or failed to assemble — fall through */
|
|
52
|
+
}
|
|
53
|
+
return { parser: defaultFormulaParser, kind: 'builtin' };
|
|
54
|
+
}
|
|
55
|
+
/** Resolve the active formula parser (cached). @internal */
|
|
56
|
+
export async function getFormulaParser() {
|
|
57
|
+
cached ??= detect();
|
|
58
|
+
return (await cached).parser;
|
|
59
|
+
}
|
|
60
|
+
/** Which parser is active — `mathts` (Path A) or `builtin` (Path B). @internal */
|
|
61
|
+
export async function getFormulaParserKind() {
|
|
62
|
+
cached ??= detect();
|
|
63
|
+
return (await cached).kind;
|
|
64
|
+
}
|
|
65
|
+
let cachedChecker;
|
|
66
|
+
const LENGTH_DIM = { L: 1, M: 0, T: 0, I: 0, Theta: 0, N: 0, J: 0 };
|
|
67
|
+
/**
|
|
68
|
+
* The dimensional checker for user formulas (MathTS Phase 2). Always
|
|
69
|
+
* available: it uses the MathTS AST when the peer is installed and
|
|
70
|
+
* smoke-tests clean, else the self-contained Path B AST — both transpile to
|
|
71
|
+
* the same `ExprNode`, so the dimensional verdict is identical. @internal
|
|
72
|
+
*/
|
|
73
|
+
export async function getFormulaDimensionChecker() {
|
|
74
|
+
cachedChecker ??= (async () => {
|
|
75
|
+
try {
|
|
76
|
+
const checker = await quietly(loadFormulaDimensionChecker);
|
|
77
|
+
// smoke test: a dimensionless ratio is homogeneous and dimensionless.
|
|
78
|
+
if (checker.check('a/a', { a: LENGTH_DIM }).ok)
|
|
79
|
+
return checker;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
/* peer absent or failed — fall back to the built-in checker */
|
|
83
|
+
}
|
|
84
|
+
return builtinFormulaDimensionChecker();
|
|
85
|
+
})();
|
|
86
|
+
return cachedChecker;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=formula-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formula-registry.js","sourceRoot":"","sources":["../../src/numerical/formula-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-contained scalar-formula parser/evaluator (Path B).
|
|
3
|
+
*
|
|
4
|
+
* A small, dependency-free recursive-descent parser for closed-form
|
|
5
|
+
* scalar physics expressions — `hbar*c^3/(8*pi*G*M*k_B)` and the like —
|
|
6
|
+
* so non-TypeScript users can supply their OWN equation to the CLI
|
|
7
|
+
* without UPT shipping a code evaluator. It is SAFE: there is no `eval`,
|
|
8
|
+
* no function constructor, no property access — only arithmetic over
|
|
9
|
+
* numbers, a fixed whitelist of math functions, and the variables the
|
|
10
|
+
* caller explicitly supplies. An unknown symbol is an error, never an
|
|
11
|
+
* implicit global.
|
|
12
|
+
*
|
|
13
|
+
* It sits behind the {@link FormulaParser} interface so a MathTS-backed
|
|
14
|
+
* parser (Path A) can be dropped in later by implementing the same
|
|
15
|
+
* contract — the inference/CLI code depends only on the interface.
|
|
16
|
+
*
|
|
17
|
+
* Grammar (standard precedence; `^` is right-associative; unary minus
|
|
18
|
+
* binds looser than `^`, so `-2^2 = -4` and `2^-2` parses):
|
|
19
|
+
* expr → term (('+'|'-') term)*
|
|
20
|
+
* term → unary (('*'|'/') unary)*
|
|
21
|
+
* unary → ('+'|'-') unary | power
|
|
22
|
+
* power → atom ('^' unary)?
|
|
23
|
+
* atom → NUMBER | NAME | NAME '(' args ')' | '(' expr ')'
|
|
24
|
+
*
|
|
25
|
+
* @module numerical/formula
|
|
26
|
+
*/
|
|
27
|
+
/** A parse or evaluation failure (bad syntax, unknown symbol, arity). */
|
|
28
|
+
export declare class FormulaError extends Error {
|
|
29
|
+
constructor(message: string);
|
|
30
|
+
}
|
|
31
|
+
/** A parsed formula: its free variables and a safe evaluator. @internal */
|
|
32
|
+
export interface CompiledFormula {
|
|
33
|
+
/** The original source string. */
|
|
34
|
+
readonly source: string;
|
|
35
|
+
/** Free variable names (excludes built-in constants and functions). */
|
|
36
|
+
readonly variables: readonly string[];
|
|
37
|
+
/** Evaluate against a `name → value` scope. Throws on a missing var. */
|
|
38
|
+
evaluate(scope: Record<string, number>): number;
|
|
39
|
+
}
|
|
40
|
+
/** The swap point for Path A (a MathTS-backed parser implements this). */
|
|
41
|
+
export interface FormulaParser {
|
|
42
|
+
parse(expr: string): CompiledFormula;
|
|
43
|
+
}
|
|
44
|
+
type Node = {
|
|
45
|
+
kind: 'num';
|
|
46
|
+
value: number;
|
|
47
|
+
} | {
|
|
48
|
+
kind: 'sym';
|
|
49
|
+
name: string;
|
|
50
|
+
} | {
|
|
51
|
+
kind: 'unary';
|
|
52
|
+
op: '+' | '-';
|
|
53
|
+
arg: Node;
|
|
54
|
+
} | {
|
|
55
|
+
kind: 'bin';
|
|
56
|
+
op: '+' | '-' | '*' | '/' | '^';
|
|
57
|
+
left: Node;
|
|
58
|
+
right: Node;
|
|
59
|
+
} | {
|
|
60
|
+
kind: 'call';
|
|
61
|
+
fn: string;
|
|
62
|
+
args: Node[];
|
|
63
|
+
};
|
|
64
|
+
/** The self-contained Path B parser. @internal */
|
|
65
|
+
export declare const defaultFormulaParser: FormulaParser;
|
|
66
|
+
/** Parse a scalar formula with the default (self-contained) parser. @internal */
|
|
67
|
+
export declare function parseFormula(expr: string): CompiledFormula;
|
|
68
|
+
/** The Path B formula AST node. @internal */
|
|
69
|
+
export type FormulaAstNode = Node;
|
|
70
|
+
/** Parse a formula to its Path B AST. @internal */
|
|
71
|
+
export declare const parseFormulaToAst: (expr: string) => FormulaAstNode;
|
|
72
|
+
/** Evaluate a Path B AST node against a scope. @internal */
|
|
73
|
+
export declare const evalFormulaAst: (node: FormulaAstNode, scope: Record<string, number>) => number;
|
|
74
|
+
export {};
|
|
75
|
+
//# sourceMappingURL=formula.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formula.d.ts","sourceRoot":"","sources":["../../src/numerical/formula.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,yEAAyE;AACzE,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAED,2EAA2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,uEAAuE;IACvE,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;CACjD;AAED,0EAA0E;AAC1E,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC;CACtC;AA4CD,KAAK,IAAI,GACL;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,GAAG,GAAG,GAAG,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,EAAE,CAAA;CAAE,CAAC;AA4L/C,kDAAkD;AAClD,eAAO,MAAM,oBAAoB,EAAE,aAalC,CAAC;AAEF,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAE1D;AAQD,6CAA6C;AAC7C,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC;AAClC,mDAAmD;AACnD,eAAO,MAAM,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,cAA2B,CAAC;AAC9E,4DAA4D;AAC5D,eAAO,MAAM,cAAc,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAiB,CAAC"}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-contained scalar-formula parser/evaluator (Path B).
|
|
3
|
+
*
|
|
4
|
+
* A small, dependency-free recursive-descent parser for closed-form
|
|
5
|
+
* scalar physics expressions — `hbar*c^3/(8*pi*G*M*k_B)` and the like —
|
|
6
|
+
* so non-TypeScript users can supply their OWN equation to the CLI
|
|
7
|
+
* without UPT shipping a code evaluator. It is SAFE: there is no `eval`,
|
|
8
|
+
* no function constructor, no property access — only arithmetic over
|
|
9
|
+
* numbers, a fixed whitelist of math functions, and the variables the
|
|
10
|
+
* caller explicitly supplies. An unknown symbol is an error, never an
|
|
11
|
+
* implicit global.
|
|
12
|
+
*
|
|
13
|
+
* It sits behind the {@link FormulaParser} interface so a MathTS-backed
|
|
14
|
+
* parser (Path A) can be dropped in later by implementing the same
|
|
15
|
+
* contract — the inference/CLI code depends only on the interface.
|
|
16
|
+
*
|
|
17
|
+
* Grammar (standard precedence; `^` is right-associative; unary minus
|
|
18
|
+
* binds looser than `^`, so `-2^2 = -4` and `2^-2` parses):
|
|
19
|
+
* expr → term (('+'|'-') term)*
|
|
20
|
+
* term → unary (('*'|'/') unary)*
|
|
21
|
+
* unary → ('+'|'-') unary | power
|
|
22
|
+
* power → atom ('^' unary)?
|
|
23
|
+
* atom → NUMBER | NAME | NAME '(' args ')' | '(' expr ')'
|
|
24
|
+
*
|
|
25
|
+
* @module numerical/formula
|
|
26
|
+
*/
|
|
27
|
+
/** A parse or evaluation failure (bad syntax, unknown symbol, arity). */
|
|
28
|
+
export class FormulaError extends Error {
|
|
29
|
+
constructor(message) {
|
|
30
|
+
super(message);
|
|
31
|
+
this.name = 'FormulaError';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// --- built-ins ------------------------------------------------------------
|
|
35
|
+
const CONSTANTS = {
|
|
36
|
+
pi: Math.PI,
|
|
37
|
+
tau: 2 * Math.PI,
|
|
38
|
+
};
|
|
39
|
+
const arity1 = (f) => (a) => {
|
|
40
|
+
if (a.length !== 1)
|
|
41
|
+
throw new FormulaError('expected 1 argument');
|
|
42
|
+
return f(a[0]);
|
|
43
|
+
};
|
|
44
|
+
const FUNCTIONS = {
|
|
45
|
+
sqrt: arity1(Math.sqrt),
|
|
46
|
+
cbrt: arity1(Math.cbrt),
|
|
47
|
+
exp: arity1(Math.exp),
|
|
48
|
+
ln: arity1(Math.log),
|
|
49
|
+
log: arity1(Math.log), // natural log (physics convention)
|
|
50
|
+
log10: arity1(Math.log10),
|
|
51
|
+
log2: arity1(Math.log2),
|
|
52
|
+
abs: arity1(Math.abs),
|
|
53
|
+
sin: arity1(Math.sin),
|
|
54
|
+
cos: arity1(Math.cos),
|
|
55
|
+
tan: arity1(Math.tan),
|
|
56
|
+
asin: arity1(Math.asin),
|
|
57
|
+
acos: arity1(Math.acos),
|
|
58
|
+
atan: arity1(Math.atan),
|
|
59
|
+
sinh: arity1(Math.sinh),
|
|
60
|
+
cosh: arity1(Math.cosh),
|
|
61
|
+
tanh: arity1(Math.tanh),
|
|
62
|
+
pow: (a) => {
|
|
63
|
+
if (a.length !== 2)
|
|
64
|
+
throw new FormulaError('pow expects 2 arguments');
|
|
65
|
+
return Math.pow(a[0], a[1]);
|
|
66
|
+
},
|
|
67
|
+
atan2: (a) => {
|
|
68
|
+
if (a.length !== 2)
|
|
69
|
+
throw new FormulaError('atan2 expects 2 arguments');
|
|
70
|
+
return Math.atan2(a[0], a[1]);
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
const NUM_RE = /^(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?/;
|
|
74
|
+
const NAME_RE = /^[A-Za-z_][A-Za-z0-9_]*/;
|
|
75
|
+
function tokenize(src) {
|
|
76
|
+
const toks = [];
|
|
77
|
+
let s = src;
|
|
78
|
+
while (s.length) {
|
|
79
|
+
const ch = s[0];
|
|
80
|
+
if (ch === ' ' || ch === '\t' || ch === '\n') {
|
|
81
|
+
s = s.slice(1);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if ('+-*/^(),'.includes(ch)) {
|
|
85
|
+
toks.push({ t: 'op', v: ch });
|
|
86
|
+
s = s.slice(1);
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const num = NUM_RE.exec(s);
|
|
90
|
+
if (num) {
|
|
91
|
+
toks.push({ t: 'num', v: Number(num[0]) });
|
|
92
|
+
s = s.slice(num[0].length);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const name = NAME_RE.exec(s);
|
|
96
|
+
if (name) {
|
|
97
|
+
toks.push({ t: 'name', v: name[0] });
|
|
98
|
+
s = s.slice(name[0].length);
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
throw new FormulaError(`unexpected character '${ch}' in formula`);
|
|
102
|
+
}
|
|
103
|
+
return toks;
|
|
104
|
+
}
|
|
105
|
+
// --- parser (recursive descent) ------------------------------------------
|
|
106
|
+
function parseToAst(src) {
|
|
107
|
+
const toks = tokenize(src);
|
|
108
|
+
let i = 0;
|
|
109
|
+
const peek = () => toks[i];
|
|
110
|
+
const eat = (v) => {
|
|
111
|
+
const tk = toks[i];
|
|
112
|
+
if (!tk)
|
|
113
|
+
throw new FormulaError('unexpected end of formula');
|
|
114
|
+
if (v !== undefined && !(tk.t === 'op' && tk.v === v)) {
|
|
115
|
+
throw new FormulaError(`expected '${v}'`);
|
|
116
|
+
}
|
|
117
|
+
i++;
|
|
118
|
+
return tk;
|
|
119
|
+
};
|
|
120
|
+
const isOp = (v) => {
|
|
121
|
+
const tk = peek();
|
|
122
|
+
return !!tk && tk.t === 'op' && tk.v === v;
|
|
123
|
+
};
|
|
124
|
+
function expr() {
|
|
125
|
+
let node = term();
|
|
126
|
+
while (isOp('+') || isOp('-')) {
|
|
127
|
+
const op = eat().v;
|
|
128
|
+
node = { kind: 'bin', op, left: node, right: term() };
|
|
129
|
+
}
|
|
130
|
+
return node;
|
|
131
|
+
}
|
|
132
|
+
function term() {
|
|
133
|
+
let node = unary();
|
|
134
|
+
while (isOp('*') || isOp('/')) {
|
|
135
|
+
const op = eat().v;
|
|
136
|
+
node = { kind: 'bin', op, left: node, right: unary() };
|
|
137
|
+
}
|
|
138
|
+
return node;
|
|
139
|
+
}
|
|
140
|
+
function unary() {
|
|
141
|
+
if (isOp('+') || isOp('-')) {
|
|
142
|
+
const op = eat().v;
|
|
143
|
+
return { kind: 'unary', op, arg: unary() };
|
|
144
|
+
}
|
|
145
|
+
return power();
|
|
146
|
+
}
|
|
147
|
+
function power() {
|
|
148
|
+
const base = atom();
|
|
149
|
+
if (isOp('^')) {
|
|
150
|
+
eat('^');
|
|
151
|
+
return { kind: 'bin', op: '^', left: base, right: unary() };
|
|
152
|
+
}
|
|
153
|
+
return base;
|
|
154
|
+
}
|
|
155
|
+
function atom() {
|
|
156
|
+
const tk = peek();
|
|
157
|
+
if (!tk)
|
|
158
|
+
throw new FormulaError('unexpected end of formula');
|
|
159
|
+
if (tk.t === 'num') {
|
|
160
|
+
eat();
|
|
161
|
+
return { kind: 'num', value: tk.v };
|
|
162
|
+
}
|
|
163
|
+
if (tk.t === 'name') {
|
|
164
|
+
eat();
|
|
165
|
+
if (isOp('(')) {
|
|
166
|
+
eat('(');
|
|
167
|
+
const args = [];
|
|
168
|
+
if (!isOp(')')) {
|
|
169
|
+
args.push(expr());
|
|
170
|
+
while (isOp(',')) {
|
|
171
|
+
eat(',');
|
|
172
|
+
args.push(expr());
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
eat(')');
|
|
176
|
+
return { kind: 'call', fn: tk.v, args };
|
|
177
|
+
}
|
|
178
|
+
return { kind: 'sym', name: tk.v };
|
|
179
|
+
}
|
|
180
|
+
if (tk.t === 'op' && tk.v === '(') {
|
|
181
|
+
eat('(');
|
|
182
|
+
const node = expr();
|
|
183
|
+
eat(')');
|
|
184
|
+
return node;
|
|
185
|
+
}
|
|
186
|
+
throw new FormulaError(`unexpected token '${tk.v}'`);
|
|
187
|
+
}
|
|
188
|
+
const node = expr();
|
|
189
|
+
if (i !== toks.length) {
|
|
190
|
+
throw new FormulaError(`unexpected trailing input in formula`);
|
|
191
|
+
}
|
|
192
|
+
return node;
|
|
193
|
+
}
|
|
194
|
+
function collectSymbols(node, out) {
|
|
195
|
+
switch (node.kind) {
|
|
196
|
+
case 'num':
|
|
197
|
+
return;
|
|
198
|
+
case 'sym':
|
|
199
|
+
if (!(node.name in CONSTANTS))
|
|
200
|
+
out.add(node.name);
|
|
201
|
+
return;
|
|
202
|
+
case 'unary':
|
|
203
|
+
collectSymbols(node.arg, out);
|
|
204
|
+
return;
|
|
205
|
+
case 'bin':
|
|
206
|
+
collectSymbols(node.left, out);
|
|
207
|
+
collectSymbols(node.right, out);
|
|
208
|
+
return;
|
|
209
|
+
case 'call':
|
|
210
|
+
for (const a of node.args)
|
|
211
|
+
collectSymbols(a, out);
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
function evalNode(node, scope) {
|
|
216
|
+
switch (node.kind) {
|
|
217
|
+
case 'num':
|
|
218
|
+
return node.value;
|
|
219
|
+
case 'sym': {
|
|
220
|
+
if (node.name in CONSTANTS)
|
|
221
|
+
return CONSTANTS[node.name];
|
|
222
|
+
const v = scope[node.name];
|
|
223
|
+
if (v === undefined)
|
|
224
|
+
throw new FormulaError(`unknown variable '${node.name}'`);
|
|
225
|
+
return v;
|
|
226
|
+
}
|
|
227
|
+
case 'unary': {
|
|
228
|
+
const a = evalNode(node.arg, scope);
|
|
229
|
+
return node.op === '-' ? -a : a;
|
|
230
|
+
}
|
|
231
|
+
case 'bin': {
|
|
232
|
+
const l = evalNode(node.left, scope);
|
|
233
|
+
const r = evalNode(node.right, scope);
|
|
234
|
+
switch (node.op) {
|
|
235
|
+
case '+': return l + r;
|
|
236
|
+
case '-': return l - r;
|
|
237
|
+
case '*': return l * r;
|
|
238
|
+
case '/': return l / r;
|
|
239
|
+
case '^': return Math.pow(l, r);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// eslint-disable-next-line no-fallthrough
|
|
243
|
+
case 'call': {
|
|
244
|
+
const fn = FUNCTIONS[node.fn];
|
|
245
|
+
if (!fn)
|
|
246
|
+
throw new FormulaError(`unknown function '${node.fn}'`);
|
|
247
|
+
return fn(node.args.map((a) => evalNode(a, scope)));
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/** The self-contained Path B parser. @internal */
|
|
252
|
+
export const defaultFormulaParser = {
|
|
253
|
+
parse(expr) {
|
|
254
|
+
if (!expr || !expr.trim())
|
|
255
|
+
throw new FormulaError('empty formula');
|
|
256
|
+
const ast = parseToAst(expr);
|
|
257
|
+
const syms = new Set();
|
|
258
|
+
collectSymbols(ast, syms);
|
|
259
|
+
const variables = [...syms].sort();
|
|
260
|
+
return {
|
|
261
|
+
source: expr,
|
|
262
|
+
variables,
|
|
263
|
+
evaluate: (scope) => evalNode(ast, scope),
|
|
264
|
+
};
|
|
265
|
+
},
|
|
266
|
+
};
|
|
267
|
+
/** Parse a scalar formula with the default (self-contained) parser. @internal */
|
|
268
|
+
export function parseFormula(expr) {
|
|
269
|
+
return defaultFormulaParser.parse(expr);
|
|
270
|
+
}
|
|
271
|
+
/** Parse a formula to its Path B AST. @internal */
|
|
272
|
+
export const parseFormulaToAst = parseToAst;
|
|
273
|
+
/** Evaluate a Path B AST node against a scope. @internal */
|
|
274
|
+
export const evalFormulaAst = evalNode;
|
|
275
|
+
//# sourceMappingURL=formula.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formula.js","sourceRoot":"","sources":["../../src/numerical/formula.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Geometrized-units boundary adapters (G-9 increment 1).
|
|
3
|
+
*
|
|
4
|
+
* Converts a scalar between SI and geometrized (G = c = 1) units, driven
|
|
5
|
+
* MECHANICALLY by the `Dimension` exponent vector — the dimension functor
|
|
6
|
+
* earning its keep. For an SI quantity of dimension L^l M^m T^t the single
|
|
7
|
+
* conversion factor is `G^m · c^(t − 2m)` (each kg → G/c² metres, each second
|
|
8
|
+
* → c metres); the geometrized quantity is a pure length L^(l+m+t).
|
|
9
|
+
*
|
|
10
|
+
* This is the self-contained FOUNDATION of the units-normalization layer
|
|
11
|
+
* (design: docs/planning/v0.10.0-Units-Normalization-Design-Note.md, Adam-
|
|
12
|
+
* vetted r2; plan: docs/planning/v0.13-G9-Adapters-Plan.md, Eve-vetted). Only c
|
|
13
|
+
* and G are in scope: a nonzero electromagnetic / thermal / molar / luminous
|
|
14
|
+
* exponent (I/Θ/N/J) throws.
|
|
15
|
+
*
|
|
16
|
+
* PUBLIC boundary API (G-9 increment 2): a consumer running the GR pipeline in
|
|
17
|
+
* geometrized (G = c = 1) units converts scalars at the boundary with these
|
|
18
|
+
* adapters. The consumer-wide DEFAULT-pipeline migration (increment 3) was
|
|
19
|
+
* DECLINED after adversarial review — it is measured to give no precision win
|
|
20
|
+
* (and far worse far-field; see docs/planning/v0.14-G9-Increment3-Disposition.md).
|
|
21
|
+
* The SI pipeline stays the default; this geometrized layer is the optional
|
|
22
|
+
* boundary API.
|
|
23
|
+
*
|
|
24
|
+
* @module numerical/geometrized
|
|
25
|
+
*/
|
|
26
|
+
import type { Dimension } from '../dimensional/types.js';
|
|
27
|
+
import { UPTError } from '../dimensional/errors.js';
|
|
28
|
+
/**
|
|
29
|
+
* A dimension carries a non-c/G base (I/Θ/N/J ≠ 0) and cannot be geometrized
|
|
30
|
+
* by c and G alone (k_B / ε₀ extensions are out of scope for this increment).
|
|
31
|
+
*
|
|
32
|
+
* @public
|
|
33
|
+
*/
|
|
34
|
+
export declare class NonGeometrizableDimensionError extends UPTError {
|
|
35
|
+
constructor(message: string);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The single SI→geometrized conversion factor for `dim`: `G^M · c^(T − 2M)`
|
|
39
|
+
* (only the mass and time exponents enter). Shared by `toGeometrized` /
|
|
40
|
+
* `fromGeometrized` so the round-trip is a clean inverse. A nonzero I/Θ/N/J
|
|
41
|
+
* exponent throws `NonGeometrizableDimensionError` BEFORE any factor is
|
|
42
|
+
* computed.
|
|
43
|
+
*
|
|
44
|
+
* @public
|
|
45
|
+
*/
|
|
46
|
+
export declare function geometrizedFactor(dim: Dimension): number;
|
|
47
|
+
/** SI → geometrized (G = c = 1). @public */
|
|
48
|
+
export declare function toGeometrized(valueSI: number, dim: Dimension): number;
|
|
49
|
+
/** Geometrized (G = c = 1) → SI. @public */
|
|
50
|
+
export declare function fromGeometrized(valueGeom: number, dim: Dimension): number;
|
|
51
|
+
//# sourceMappingURL=geometrized.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometrized.d.ts","sourceRoot":"","sources":["../../src/numerical/geometrized.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAGpD;;;;;GAKG;AACH,qBAAa,8BAA+B,SAAQ,QAAQ;gBAC9C,OAAO,EAAE,MAAM;CAK5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,CASxD;AAED,4CAA4C;AAC5C,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,GAAG,MAAM,CAErE;AAED,4CAA4C;AAC5C,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,GAAG,MAAM,CAEzE"}
|