universal-physics-tensor 0.7.2 → 0.14.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/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 +32 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +63 -2
- 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 +21 -4
|
@@ -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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
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 { UPTError } from '../dimensional/errors.js';
|
|
27
|
+
import { C_SI, G_SI } from '../core/constants.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 class NonGeometrizableDimensionError extends UPTError {
|
|
35
|
+
constructor(message) {
|
|
36
|
+
super(message);
|
|
37
|
+
this.name = 'NonGeometrizableDimensionError';
|
|
38
|
+
Object.setPrototypeOf(this, NonGeometrizableDimensionError.prototype);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The single SI→geometrized conversion factor for `dim`: `G^M · c^(T − 2M)`
|
|
43
|
+
* (only the mass and time exponents enter). Shared by `toGeometrized` /
|
|
44
|
+
* `fromGeometrized` so the round-trip is a clean inverse. A nonzero I/Θ/N/J
|
|
45
|
+
* exponent throws `NonGeometrizableDimensionError` BEFORE any factor is
|
|
46
|
+
* computed.
|
|
47
|
+
*
|
|
48
|
+
* @public
|
|
49
|
+
*/
|
|
50
|
+
export function geometrizedFactor(dim) {
|
|
51
|
+
if (dim.I !== 0 || dim.Theta !== 0 || dim.N !== 0 || dim.J !== 0) {
|
|
52
|
+
throw new NonGeometrizableDimensionError(`geometrizedFactor: only c and G are in scope; this dimension has a ` +
|
|
53
|
+
`nonzero non-mechanizable exponent (I=${dim.I}, Θ=${dim.Theta}, ` +
|
|
54
|
+
`N=${dim.N}, J=${dim.J}). Geometrization handles length / mass / time.`);
|
|
55
|
+
}
|
|
56
|
+
return Math.pow(G_SI, dim.M) * Math.pow(C_SI, dim.T - 2 * dim.M);
|
|
57
|
+
}
|
|
58
|
+
/** SI → geometrized (G = c = 1). @public */
|
|
59
|
+
export function toGeometrized(valueSI, dim) {
|
|
60
|
+
return valueSI * geometrizedFactor(dim);
|
|
61
|
+
}
|
|
62
|
+
/** Geometrized (G = c = 1) → SI. @public */
|
|
63
|
+
export function fromGeometrized(valueGeom, dim) {
|
|
64
|
+
return valueGeom / geometrizedFactor(dim);
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=geometrized.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometrized.js","sourceRoot":"","sources":["../../src/numerical/geometrized.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAElD;;;;;GAKG;AACH,MAAM,OAAO,8BAA+B,SAAQ,QAAQ;IAC1D,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gCAAgC,CAAC;QAC7C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,8BAA8B,CAAC,SAAS,CAAC,CAAC;IACxE,CAAC;CACF;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAc;IAC9C,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,8BAA8B,CACtC,qEAAqE;YACnE,wCAAwC,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC,KAAK,IAAI;YACjE,KAAK,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,iDAAiD,CAC1E,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,GAAc;IAC3D,OAAO,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,GAAc;IAC/D,OAAO,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -71,14 +71,16 @@ export interface GL4Options {
|
|
|
71
71
|
readonly steps: number;
|
|
72
72
|
/** Final proper time τ_max (initial τ = 0). */
|
|
73
73
|
readonly tauMax: number;
|
|
74
|
-
/** Inverse-metric closure
|
|
75
|
-
|
|
74
|
+
/** Inverse-metric closure (v0.9.0 O-1 flat layout):
|
|
75
|
+
* `gInverseFn(x)[μ*dim + ν] = g^{μν}(x)`, row-major Float64Array(dim²). */
|
|
76
|
+
readonly gInverseFn: (x: readonly number[]) => Float64Array;
|
|
76
77
|
/**
|
|
77
78
|
* Partial derivatives of the inverse metric.
|
|
78
|
-
* Index order
|
|
79
|
+
* Index order (v0.9.0 O-1 flat layout):
|
|
80
|
+
* `dgInverseFn(x)[lambda*dim² + mu*dim + nu] = ∂_lambda g^{mu nu}` at coords x.
|
|
79
81
|
* (I2: axis semantics pinned here to prevent silent transposition bugs.)
|
|
80
82
|
*/
|
|
81
|
-
readonly dgInverseFn: (x: readonly number[]) =>
|
|
83
|
+
readonly dgInverseFn: (x: readonly number[]) => Float64Array;
|
|
82
84
|
/** Picard fixed-point tolerance (default chosen in Task 2). */
|
|
83
85
|
readonly picardTol?: number;
|
|
84
86
|
/** Picard fixed-point iteration cap (default chosen in Task 2). */
|
|
@@ -141,7 +143,7 @@ interface StageSolveResult {
|
|
|
141
143
|
* The `dgInverseFn` index order is `dg[λ][μ][ν] = ∂_λ g^{μν}` (Task 0 I2
|
|
142
144
|
* pin, also recorded on `GL4Options.dgInverseFn`). When we evaluate
|
|
143
145
|
* `dp_μ = −½ (∂_μ g^{νρ}) P_ν P_ρ` we therefore read
|
|
144
|
-
* `dgInvAtXj[mu
|
|
146
|
+
* `dgInvAtXj[mu*dim²+nu*dim+rho]` — `mu` is the differentiation axis (λ in the
|
|
145
147
|
* pinned order) and `(nu, rho)` are the upper metric indices.
|
|
146
148
|
*
|
|
147
149
|
* Throws `GL4ConvergenceError` with message matching
|
|
@@ -149,7 +151,7 @@ interface StageSolveResult {
|
|
|
149
151
|
*
|
|
150
152
|
* @internal
|
|
151
153
|
*/
|
|
152
|
-
export declare function solveGL4Stage(state: GL4State, h: number, gInverseFn: (x: readonly number[]) =>
|
|
154
|
+
export declare function solveGL4Stage(state: GL4State, h: number, gInverseFn: (x: readonly number[]) => Float64Array, dgInverseFn: (x: readonly number[]) => Float64Array, opts: {
|
|
153
155
|
picardTol: number;
|
|
154
156
|
picardMaxIter: number;
|
|
155
157
|
}): StageSolveResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gl4-integrator.d.ts","sourceRoot":"","sources":["../../src/numerical/gl4-integrator.ts"],"names":[],"mappings":"AA6BA;;;;;;;;GAQG;AACH,eAAO,MAAM,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAA4C,CAAC;AAEzF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAGjF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAc,CAAC;AAE3D;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,QAAQ;IACvB,+BAA+B;IAC/B,QAAQ,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,yCAAyC;IACzC,QAAQ,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,QAAQ,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB;qCACiC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB
|
|
1
|
+
{"version":3,"file":"gl4-integrator.d.ts","sourceRoot":"","sources":["../../src/numerical/gl4-integrator.ts"],"names":[],"mappings":"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"}
|