universal-physics-tensor 0.4.5
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/LICENSE +21 -0
- package/README.md +377 -0
- package/dist/bridges/equations/be-11-decoherence-master.d.ts +83 -0
- package/dist/bridges/equations/be-11-decoherence-master.d.ts.map +1 -0
- package/dist/bridges/equations/be-11-decoherence-master.js +116 -0
- package/dist/bridges/equations/be-11-decoherence-master.js.map +1 -0
- package/dist/bridges/equations/be-12-coherence-length.d.ts +80 -0
- package/dist/bridges/equations/be-12-coherence-length.d.ts.map +1 -0
- package/dist/bridges/equations/be-12-coherence-length.js +128 -0
- package/dist/bridges/equations/be-12-coherence-length.js.map +1 -0
- package/dist/bridges/equations/be-13-einstein-trace.d.ts +89 -0
- package/dist/bridges/equations/be-13-einstein-trace.d.ts.map +1 -0
- package/dist/bridges/equations/be-13-einstein-trace.js +143 -0
- package/dist/bridges/equations/be-13-einstein-trace.js.map +1 -0
- package/dist/bridges/equations/be-14-ryu-takayanagi.d.ts +67 -0
- package/dist/bridges/equations/be-14-ryu-takayanagi.d.ts.map +1 -0
- package/dist/bridges/equations/be-14-ryu-takayanagi.js +112 -0
- package/dist/bridges/equations/be-14-ryu-takayanagi.js.map +1 -0
- package/dist/bridges/equations/be-15-emergence.d.ts +164 -0
- package/dist/bridges/equations/be-15-emergence.d.ts.map +1 -0
- package/dist/bridges/equations/be-15-emergence.js +204 -0
- package/dist/bridges/equations/be-15-emergence.js.map +1 -0
- package/dist/bridges/equations/be-16-landauer.d.ts +180 -0
- package/dist/bridges/equations/be-16-landauer.d.ts.map +1 -0
- package/dist/bridges/equations/be-16-landauer.js +206 -0
- package/dist/bridges/equations/be-16-landauer.js.map +1 -0
- package/dist/bridges/equations/be-17-einstein-cartan.d.ts +245 -0
- package/dist/bridges/equations/be-17-einstein-cartan.d.ts.map +1 -0
- package/dist/bridges/equations/be-17-einstein-cartan.js +304 -0
- package/dist/bridges/equations/be-17-einstein-cartan.js.map +1 -0
- package/dist/bridges/equations/be-18-higgs-mass.d.ts +65 -0
- package/dist/bridges/equations/be-18-higgs-mass.d.ts.map +1 -0
- package/dist/bridges/equations/be-18-higgs-mass.js +86 -0
- package/dist/bridges/equations/be-18-higgs-mass.js.map +1 -0
- package/dist/bridges/equations/be-19-quantum-bounce.d.ts +72 -0
- package/dist/bridges/equations/be-19-quantum-bounce.d.ts.map +1 -0
- package/dist/bridges/equations/be-19-quantum-bounce.js +151 -0
- package/dist/bridges/equations/be-19-quantum-bounce.js.map +1 -0
- package/dist/bridges/equations/be-20-vacuum-energy.d.ts +72 -0
- package/dist/bridges/equations/be-20-vacuum-energy.d.ts.map +1 -0
- package/dist/bridges/equations/be-20-vacuum-energy.js +115 -0
- package/dist/bridges/equations/be-20-vacuum-energy.js.map +1 -0
- package/dist/bridges/equations/be-21-kss-bound.d.ts +72 -0
- package/dist/bridges/equations/be-21-kss-bound.d.ts.map +1 -0
- package/dist/bridges/equations/be-21-kss-bound.js +103 -0
- package/dist/bridges/equations/be-21-kss-bound.js.map +1 -0
- package/dist/bridges/equations/be-22-topological-entanglement.d.ts +90 -0
- package/dist/bridges/equations/be-22-topological-entanglement.d.ts.map +1 -0
- package/dist/bridges/equations/be-22-topological-entanglement.js +123 -0
- package/dist/bridges/equations/be-22-topological-entanglement.js.map +1 -0
- package/dist/bridges/equations/be-23-syk-planckian.d.ts +89 -0
- package/dist/bridges/equations/be-23-syk-planckian.d.ts.map +1 -0
- package/dist/bridges/equations/be-23-syk-planckian.js +155 -0
- package/dist/bridges/equations/be-23-syk-planckian.js.map +1 -0
- package/dist/bridges/equations/be-24-foerster-fret.d.ts +81 -0
- package/dist/bridges/equations/be-24-foerster-fret.d.ts.map +1 -0
- package/dist/bridges/equations/be-24-foerster-fret.js +121 -0
- package/dist/bridges/equations/be-24-foerster-fret.js.map +1 -0
- package/dist/bridges/equations/be-25-iit-phi.d.ts +220 -0
- package/dist/bridges/equations/be-25-iit-phi.d.ts.map +1 -0
- package/dist/bridges/equations/be-25-iit-phi.js +259 -0
- package/dist/bridges/equations/be-25-iit-phi.js.map +1 -0
- package/dist/bridges/equations/be-25-orch-or.d.ts +78 -0
- package/dist/bridges/equations/be-25-orch-or.d.ts.map +1 -0
- package/dist/bridges/equations/be-25-orch-or.js +121 -0
- package/dist/bridges/equations/be-25-orch-or.js.map +1 -0
- package/dist/bridges/equations/be-26-dna-tunneling.d.ts +75 -0
- package/dist/bridges/equations/be-26-dna-tunneling.d.ts.map +1 -0
- package/dist/bridges/equations/be-26-dna-tunneling.js +138 -0
- package/dist/bridges/equations/be-26-dna-tunneling.js.map +1 -0
- package/dist/bridges/equations/be-27-effective-temperature.d.ts +81 -0
- package/dist/bridges/equations/be-27-effective-temperature.d.ts.map +1 -0
- package/dist/bridges/equations/be-27-effective-temperature.js +120 -0
- package/dist/bridges/equations/be-27-effective-temperature.js.map +1 -0
- package/dist/bridges/equations/be-28-onsager-entropy-production.d.ts +175 -0
- package/dist/bridges/equations/be-28-onsager-entropy-production.d.ts.map +1 -0
- package/dist/bridges/equations/be-28-onsager-entropy-production.js +203 -0
- package/dist/bridges/equations/be-28-onsager-entropy-production.js.map +1 -0
- package/dist/bridges/equations/be-29-jarzynski.d.ts +86 -0
- package/dist/bridges/equations/be-29-jarzynski.d.ts.map +1 -0
- package/dist/bridges/equations/be-29-jarzynski.js +132 -0
- package/dist/bridges/equations/be-29-jarzynski.js.map +1 -0
- package/dist/bridges/equations/be-30-flm-first-law.d.ts +93 -0
- package/dist/bridges/equations/be-30-flm-first-law.d.ts.map +1 -0
- package/dist/bridges/equations/be-30-flm-first-law.js +109 -0
- package/dist/bridges/equations/be-30-flm-first-law.js.map +1 -0
- package/dist/bridges/equations/be-31-causal-set-bd.d.ts +96 -0
- package/dist/bridges/equations/be-31-causal-set-bd.d.ts.map +1 -0
- package/dist/bridges/equations/be-31-causal-set-bd.js +133 -0
- package/dist/bridges/equations/be-31-causal-set-bd.js.map +1 -0
- package/dist/bridges/equations/be-32-quantum-reference-frame.d.ts +113 -0
- package/dist/bridges/equations/be-32-quantum-reference-frame.d.ts.map +1 -0
- package/dist/bridges/equations/be-32-quantum-reference-frame.js +155 -0
- package/dist/bridges/equations/be-32-quantum-reference-frame.js.map +1 -0
- package/dist/bridges/equations/be-33-hertz-millis.d.ts +77 -0
- package/dist/bridges/equations/be-33-hertz-millis.d.ts.map +1 -0
- package/dist/bridges/equations/be-33-hertz-millis.js +113 -0
- package/dist/bridges/equations/be-33-hertz-millis.js.map +1 -0
- package/dist/bridges/equations/be-34-kibble-zurek.d.ts +76 -0
- package/dist/bridges/equations/be-34-kibble-zurek.d.ts.map +1 -0
- package/dist/bridges/equations/be-34-kibble-zurek.js +139 -0
- package/dist/bridges/equations/be-34-kibble-zurek.js.map +1 -0
- package/dist/bridges/equations/be-35-conformal-bootstrap.d.ts +117 -0
- package/dist/bridges/equations/be-35-conformal-bootstrap.d.ts.map +1 -0
- package/dist/bridges/equations/be-35-conformal-bootstrap.js +167 -0
- package/dist/bridges/equations/be-35-conformal-bootstrap.js.map +1 -0
- package/dist/bridges/equations/be-36-gw-speed-bound.d.ts +77 -0
- package/dist/bridges/equations/be-36-gw-speed-bound.d.ts.map +1 -0
- package/dist/bridges/equations/be-36-gw-speed-bound.js +107 -0
- package/dist/bridges/equations/be-36-gw-speed-bound.js.map +1 -0
- package/dist/bridges/equations/be-37-shapiro-delay.d.ts +260 -0
- package/dist/bridges/equations/be-37-shapiro-delay.d.ts.map +1 -0
- package/dist/bridges/equations/be-37-shapiro-delay.js +429 -0
- package/dist/bridges/equations/be-37-shapiro-delay.js.map +1 -0
- package/dist/bridges/equations/be-38-mond.d.ts +86 -0
- package/dist/bridges/equations/be-38-mond.d.ts.map +1 -0
- package/dist/bridges/equations/be-38-mond.js +122 -0
- package/dist/bridges/equations/be-38-mond.js.map +1 -0
- package/dist/bridges/equations/be-39-asymptotic-safety.d.ts +106 -0
- package/dist/bridges/equations/be-39-asymptotic-safety.d.ts.map +1 -0
- package/dist/bridges/equations/be-39-asymptotic-safety.js +155 -0
- package/dist/bridges/equations/be-39-asymptotic-safety.js.map +1 -0
- package/dist/bridges/equations/be-40-composite-higgs.d.ts +81 -0
- package/dist/bridges/equations/be-40-composite-higgs.d.ts.map +1 -0
- package/dist/bridges/equations/be-40-composite-higgs.js +149 -0
- package/dist/bridges/equations/be-40-composite-higgs.js.map +1 -0
- package/dist/bridges/equations/be-41-swampland.d.ts +67 -0
- package/dist/bridges/equations/be-41-swampland.d.ts.map +1 -0
- package/dist/bridges/equations/be-41-swampland.js +109 -0
- package/dist/bridges/equations/be-41-swampland.js.map +1 -0
- package/dist/bridges/equations/be-42-hawking-temperature.d.ts +67 -0
- package/dist/bridges/equations/be-42-hawking-temperature.d.ts.map +1 -0
- package/dist/bridges/equations/be-42-hawking-temperature.js +109 -0
- package/dist/bridges/equations/be-42-hawking-temperature.js.map +1 -0
- package/dist/bridges/equations/be-43-er-epr.d.ts +73 -0
- package/dist/bridges/equations/be-43-er-epr.d.ts.map +1 -0
- package/dist/bridges/equations/be-43-er-epr.js +114 -0
- package/dist/bridges/equations/be-43-er-epr.js.map +1 -0
- package/dist/bridges/equations/be-44-soft-hair.d.ts +151 -0
- package/dist/bridges/equations/be-44-soft-hair.d.ts.map +1 -0
- package/dist/bridges/equations/be-44-soft-hair.js +185 -0
- package/dist/bridges/equations/be-44-soft-hair.js.map +1 -0
- package/dist/bridges/equations/be-45-tcc.d.ts +116 -0
- package/dist/bridges/equations/be-45-tcc.d.ts.map +1 -0
- package/dist/bridges/equations/be-45-tcc.js +157 -0
- package/dist/bridges/equations/be-45-tcc.js.map +1 -0
- package/dist/bridges/equations/be-46-multiverse-measure.d.ts +163 -0
- package/dist/bridges/equations/be-46-multiverse-measure.d.ts.map +1 -0
- package/dist/bridges/equations/be-46-multiverse-measure.js +198 -0
- package/dist/bridges/equations/be-46-multiverse-measure.js.map +1 -0
- package/dist/bridges/equations/be-47-bbn-dark-sector.d.ts +72 -0
- package/dist/bridges/equations/be-47-bbn-dark-sector.d.ts.map +1 -0
- package/dist/bridges/equations/be-47-bbn-dark-sector.js +121 -0
- package/dist/bridges/equations/be-47-bbn-dark-sector.js.map +1 -0
- package/dist/bridges/equations/be-48-grw-localization.d.ts +84 -0
- package/dist/bridges/equations/be-48-grw-localization.d.ts.map +1 -0
- package/dist/bridges/equations/be-48-grw-localization.js +107 -0
- package/dist/bridges/equations/be-48-grw-localization.js.map +1 -0
- package/dist/bridges/equations/be-49-quantum-darwinism.d.ts +97 -0
- package/dist/bridges/equations/be-49-quantum-darwinism.d.ts.map +1 -0
- package/dist/bridges/equations/be-49-quantum-darwinism.js +129 -0
- package/dist/bridges/equations/be-49-quantum-darwinism.js.map +1 -0
- package/dist/bridges/equations/be-50-wheeler-feynman.d.ts +120 -0
- package/dist/bridges/equations/be-50-wheeler-feynman.d.ts.map +1 -0
- package/dist/bridges/equations/be-50-wheeler-feynman.js +151 -0
- package/dist/bridges/equations/be-50-wheeler-feynman.js.map +1 -0
- package/dist/bridges/gravitational-lensing.d.ts +52 -0
- package/dist/bridges/gravitational-lensing.d.ts.map +1 -0
- package/dist/bridges/gravitational-lensing.js +48 -0
- package/dist/bridges/gravitational-lensing.js.map +1 -0
- package/dist/bridges/index.d.ts +104 -0
- package/dist/bridges/index.d.ts.map +1 -0
- package/dist/bridges/index.js +1663 -0
- package/dist/bridges/index.js.map +1 -0
- package/dist/bridges/perihelion-precession.d.ts +62 -0
- package/dist/bridges/perihelion-precession.d.ts.map +1 -0
- package/dist/bridges/perihelion-precession.js +68 -0
- package/dist/bridges/perihelion-precession.js.map +1 -0
- package/dist/core/tensor.d.ts +135 -0
- package/dist/core/tensor.d.ts.map +1 -0
- package/dist/core/tensor.js +376 -0
- package/dist/core/tensor.js.map +1 -0
- package/dist/core/types.d.ts +131 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +25 -0
- package/dist/core/types.js.map +1 -0
- package/dist/dimensional/algebra.d.ts +34 -0
- package/dist/dimensional/algebra.d.ts.map +1 -0
- package/dist/dimensional/algebra.js +90 -0
- package/dist/dimensional/algebra.js.map +1 -0
- package/dist/dimensional/bridge-check.d.ts +48 -0
- package/dist/dimensional/bridge-check.d.ts.map +1 -0
- package/dist/dimensional/bridge-check.js +137 -0
- package/dist/dimensional/bridge-check.js.map +1 -0
- package/dist/dimensional/connection-validators.d.ts +53 -0
- package/dist/dimensional/connection-validators.d.ts.map +1 -0
- package/dist/dimensional/connection-validators.js +84 -0
- package/dist/dimensional/connection-validators.js.map +1 -0
- package/dist/dimensional/connection.d.ts +40 -0
- package/dist/dimensional/connection.d.ts.map +1 -0
- package/dist/dimensional/connection.js +81 -0
- package/dist/dimensional/connection.js.map +1 -0
- package/dist/dimensional/constants.d.ts +30 -0
- package/dist/dimensional/constants.d.ts.map +1 -0
- package/dist/dimensional/constants.js +31 -0
- package/dist/dimensional/constants.js.map +1 -0
- package/dist/dimensional/errors.d.ts +161 -0
- package/dist/dimensional/errors.d.ts.map +1 -0
- package/dist/dimensional/errors.js +254 -0
- package/dist/dimensional/errors.js.map +1 -0
- package/dist/dimensional/fresh-label.d.ts +26 -0
- package/dist/dimensional/fresh-label.d.ts.map +1 -0
- package/dist/dimensional/fresh-label.js +31 -0
- package/dist/dimensional/fresh-label.js.map +1 -0
- package/dist/dimensional/metric-validators.d.ts +124 -0
- package/dist/dimensional/metric-validators.d.ts.map +1 -0
- package/dist/dimensional/metric-validators.js +141 -0
- package/dist/dimensional/metric-validators.js.map +1 -0
- package/dist/dimensional/metric.d.ts +67 -0
- package/dist/dimensional/metric.d.ts.map +1 -0
- package/dist/dimensional/metric.js +177 -0
- package/dist/dimensional/metric.js.map +1 -0
- package/dist/dimensional/tensor.d.ts +153 -0
- package/dist/dimensional/tensor.d.ts.map +1 -0
- package/dist/dimensional/tensor.js +138 -0
- package/dist/dimensional/tensor.js.map +1 -0
- package/dist/dimensional/types.d.ts +50 -0
- package/dist/dimensional/types.d.ts.map +1 -0
- package/dist/dimensional/types.js +66 -0
- package/dist/dimensional/types.js.map +1 -0
- package/dist/dimensional/validator.d.ts +84 -0
- package/dist/dimensional/validator.d.ts.map +1 -0
- package/dist/dimensional/validator.js +505 -0
- package/dist/dimensional/validator.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/numerical/be37-covariant-eikonal.d.ts +90 -0
- package/dist/numerical/be37-covariant-eikonal.d.ts.map +1 -0
- package/dist/numerical/be37-covariant-eikonal.js +79 -0
- package/dist/numerical/be37-covariant-eikonal.js.map +1 -0
- package/dist/numerical/connection-lowering-helpers.d.ts +107 -0
- package/dist/numerical/connection-lowering-helpers.d.ts.map +1 -0
- package/dist/numerical/connection-lowering-helpers.js +315 -0
- package/dist/numerical/connection-lowering-helpers.js.map +1 -0
- package/dist/numerical/engine-registry.d.ts +50 -0
- package/dist/numerical/engine-registry.d.ts.map +1 -0
- package/dist/numerical/engine-registry.js +82 -0
- package/dist/numerical/engine-registry.js.map +1 -0
- package/dist/numerical/errors.d.ts +28 -0
- package/dist/numerical/errors.d.ts.map +1 -0
- package/dist/numerical/errors.js +39 -0
- package/dist/numerical/errors.js.map +1 -0
- package/dist/numerical/float64-engine.d.ts +53 -0
- package/dist/numerical/float64-engine.d.ts.map +1 -0
- package/dist/numerical/float64-engine.js +638 -0
- package/dist/numerical/float64-engine.js.map +1 -0
- package/dist/numerical/geodesic-integrator.d.ts +62 -0
- package/dist/numerical/geodesic-integrator.d.ts.map +1 -0
- package/dist/numerical/geodesic-integrator.js +103 -0
- package/dist/numerical/geodesic-integrator.js.map +1 -0
- package/dist/numerical/grid-field.d.ts +24 -0
- package/dist/numerical/grid-field.d.ts.map +1 -0
- package/dist/numerical/grid-field.js +2 -0
- package/dist/numerical/grid-field.js.map +1 -0
- package/dist/numerical/index.d.ts +80 -0
- package/dist/numerical/index.d.ts.map +1 -0
- package/dist/numerical/index.js +75 -0
- package/dist/numerical/index.js.map +1 -0
- package/dist/numerical/lowering.d.ts +48 -0
- package/dist/numerical/lowering.d.ts.map +1 -0
- package/dist/numerical/lowering.js +443 -0
- package/dist/numerical/lowering.js.map +1 -0
- package/dist/numerical/mathts-engine.d.ts +55 -0
- package/dist/numerical/mathts-engine.d.ts.map +1 -0
- package/dist/numerical/mathts-engine.js +164 -0
- package/dist/numerical/mathts-engine.js.map +1 -0
- package/dist/numerical/metric-inverse.d.ts +31 -0
- package/dist/numerical/metric-inverse.d.ts.map +1 -0
- package/dist/numerical/metric-inverse.js +68 -0
- package/dist/numerical/metric-inverse.js.map +1 -0
- package/dist/numerical/null-ray-integrator.d.ts +13 -0
- package/dist/numerical/null-ray-integrator.d.ts.map +1 -0
- package/dist/numerical/null-ray-integrator.js +53 -0
- package/dist/numerical/null-ray-integrator.js.map +1 -0
- package/dist/numerical/pderiv.d.ts +43 -0
- package/dist/numerical/pderiv.d.ts.map +1 -0
- package/dist/numerical/pderiv.js +121 -0
- package/dist/numerical/pderiv.js.map +1 -0
- package/dist/numerical/tensor-engine.d.ts +114 -0
- package/dist/numerical/tensor-engine.d.ts.map +1 -0
- package/dist/numerical/tensor-engine.js +64 -0
- package/dist/numerical/tensor-engine.js.map +1 -0
- package/dist/numerical/types.d.ts +37 -0
- package/dist/numerical/types.d.ts.map +1 -0
- package/dist/numerical/types.js +8 -0
- package/dist/numerical/types.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validator: walks an ExprNode tree and infers / checks SI dimensions.
|
|
3
|
+
*
|
|
4
|
+
* Honest-claude scope notes:
|
|
5
|
+
* - This MVP does NOT track tensor index structure (rank, contractions).
|
|
6
|
+
* Bridge Eq 17's index-rank mismatch from the spec cannot be caught here.
|
|
7
|
+
* Tier 4.5 follow-up — see README.
|
|
8
|
+
* - Special functions (log, exp, trig) are out of scope; their arguments
|
|
9
|
+
* must be dimensionless but the validator does not yet enforce that.
|
|
10
|
+
*
|
|
11
|
+
* @module dimensional/validator
|
|
12
|
+
*/
|
|
13
|
+
import { DIMENSIONLESS, } from './types.js';
|
|
14
|
+
import { multiply, divide, power, add, subtract, equals, format, DimensionMismatchError, } from './algebra.js';
|
|
15
|
+
import { TensorInScalarOpError, FreeIndexMismatchError, TensorProductChildInferenceError, } from './errors.js';
|
|
16
|
+
import { validateTensorSymbol, computeContraction } from './tensor.js';
|
|
17
|
+
import { validateMetricTensor, validateKroneckerDelta, validatePartialDerivative, checkInverseMetricStructure, } from './metric-validators.js';
|
|
18
|
+
import { validateCovariantDerivative } from './connection-validators.js';
|
|
19
|
+
function joinPath(path, segment) {
|
|
20
|
+
return path === '' ? segment : `${path}.${segment}`;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Structural equality for freeIndices maps. Two maps are equal iff they
|
|
24
|
+
* contain the same label set and each label's `{upper, lower}` counts
|
|
25
|
+
* match. Used by `op '+'` / `'-'` (Task 7 / Part-VII §VII.5) to enforce
|
|
26
|
+
* that all operands of a tensor sum share the same free-index signature.
|
|
27
|
+
*/
|
|
28
|
+
function freeIndicesEqual(a, b) {
|
|
29
|
+
if (a.size !== b.size)
|
|
30
|
+
return false;
|
|
31
|
+
for (const [label, counts] of a) {
|
|
32
|
+
const other = b.get(label);
|
|
33
|
+
if (!other)
|
|
34
|
+
return false;
|
|
35
|
+
if (other.upper !== counts.upper || other.lower !== counts.lower)
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Human-readable summary of a freeIndices map for use in error messages.
|
|
42
|
+
* Empty map renders as `{}` so a tensor-vs-scalar mismatch is visually
|
|
43
|
+
* obvious in the thrown FreeIndexMismatchError text.
|
|
44
|
+
*/
|
|
45
|
+
function formatFreeIndices(m) {
|
|
46
|
+
if (m.size === 0)
|
|
47
|
+
return '{}';
|
|
48
|
+
const parts = [];
|
|
49
|
+
for (const [label, counts] of m) {
|
|
50
|
+
parts.push(`${label}:{upper:${counts.upper},lower:${counts.lower}}`);
|
|
51
|
+
}
|
|
52
|
+
return `{${parts.join(', ')}}`;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Infer an arg's dimension and capture its LOCAL freeIndices map. Used by
|
|
56
|
+
* `op '+'` / `'-'` (to compare maps across args) and by `op '*'` / `'/'` /
|
|
57
|
+
* `'^'` (to reject any tensor-valued operand). The arg's freeIndices are
|
|
58
|
+
* NOT merged into `ctx.freeIndices` here — the caller decides whether to
|
|
59
|
+
* merge (op '+' merges after equality check) or discard (op '*' rejects).
|
|
60
|
+
*
|
|
61
|
+
* Violations from the arg's subtree are forwarded to `ctx.violations`, so
|
|
62
|
+
* error reports stay coherent with the rest of the walker.
|
|
63
|
+
*/
|
|
64
|
+
function inferArgLocal(node, ctx, segment) {
|
|
65
|
+
const localFI = new Map();
|
|
66
|
+
const localCtx = {
|
|
67
|
+
path: joinPath(ctx.path, segment),
|
|
68
|
+
violations: ctx.violations,
|
|
69
|
+
freeIndices: localFI,
|
|
70
|
+
};
|
|
71
|
+
const dim = infer(node, localCtx);
|
|
72
|
+
return { dim, freeIndices: localFI };
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Resolve a child node for `computeContraction` — returns a LOCAL
|
|
76
|
+
* `{dim, freeIndices}` result with no shared mutable state. This is the
|
|
77
|
+
* cycle-breaker and nested-safety primitive: it lets tensor-product
|
|
78
|
+
* recursion avoid touching `ctx.freeIndices` for any subtree.
|
|
79
|
+
*
|
|
80
|
+
* - tensor-symbol → forwards to `validateTensorSymbol` (returns a local Map).
|
|
81
|
+
* - tensor-product → recurses into `computeContraction` with this same
|
|
82
|
+
* resolver, threading violations + path through `parentCtx` so error
|
|
83
|
+
* reports stay informative.
|
|
84
|
+
* - all other kinds → invoke `infer()` against a throwaway context so the
|
|
85
|
+
* dimension is computed but no free-indices state leaks; non-tensor
|
|
86
|
+
* nodes contribute an empty freeIndices map.
|
|
87
|
+
*
|
|
88
|
+
* Violations from non-tensor children DO get appended to `parentCtx.violations`
|
|
89
|
+
* (via the throwaway ctx's violations array, which we then splice in). This
|
|
90
|
+
* keeps error reporting equivalent to the inline-recursion shape used by
|
|
91
|
+
* the scalar `op` / `integral` / `derivative` cases.
|
|
92
|
+
*/
|
|
93
|
+
function resolveChildForContraction(node, parentCtx) {
|
|
94
|
+
if (node.kind === 'tensor-symbol') {
|
|
95
|
+
return validateTensorSymbol(node);
|
|
96
|
+
}
|
|
97
|
+
if (node.kind === 'metric-tensor') {
|
|
98
|
+
return validateMetricTensor(node);
|
|
99
|
+
}
|
|
100
|
+
if (node.kind === 'kronecker-delta') {
|
|
101
|
+
return validateKroneckerDelta(node);
|
|
102
|
+
}
|
|
103
|
+
if (node.kind === 'tensor-product') {
|
|
104
|
+
return computeContraction(node.args, (grandchild) => resolveChildForContraction(grandchild, parentCtx));
|
|
105
|
+
}
|
|
106
|
+
// Non-tensor child: use `infer()` for dimension only. Use a throwaway
|
|
107
|
+
// freeIndices map (discarded) but forward violations to the parent so
|
|
108
|
+
// error reports remain coherent.
|
|
109
|
+
const probe = {
|
|
110
|
+
path: parentCtx.path,
|
|
111
|
+
violations: parentCtx.violations,
|
|
112
|
+
freeIndices: new Map(),
|
|
113
|
+
};
|
|
114
|
+
const dim = infer(node, probe);
|
|
115
|
+
if (dim === null) {
|
|
116
|
+
// Surface as an error rather than silently producing a malformed
|
|
117
|
+
// ContractionResult. The probe already recorded the violation in
|
|
118
|
+
// parentCtx.violations, so the message here is the second signal.
|
|
119
|
+
// Subclass of UPTError (§14.7) so downstream consumers can
|
|
120
|
+
// discriminate UPT-source errors uniformly with `instanceof UPTError`.
|
|
121
|
+
throw new TensorProductChildInferenceError('tensor-product: a non-tensor operand failed dimension inference; ' +
|
|
122
|
+
'see ValidationResult.violations for the underlying cause.');
|
|
123
|
+
}
|
|
124
|
+
return { dim, freeIndices: probe.freeIndices };
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Resolve a child of a tensor-partial-derivative to its local
|
|
128
|
+
* {dim, freeIndices, role?} carrier. Same shape as
|
|
129
|
+
* `resolveChildForContraction` but returns role-aware result so the
|
|
130
|
+
* pderiv validator can pass through `of.role` (Design §13 Q1).
|
|
131
|
+
*/
|
|
132
|
+
function resolveChildForPartialDerivative(node, parentCtx) {
|
|
133
|
+
const typed = node;
|
|
134
|
+
if (typed.kind === 'tensor-symbol') {
|
|
135
|
+
const result = validateTensorSymbol(typed);
|
|
136
|
+
return { dim: result.dim, freeIndices: result.freeIndices, role: typed.role };
|
|
137
|
+
}
|
|
138
|
+
if (typed.kind === 'metric-tensor') {
|
|
139
|
+
const result = validateMetricTensor(typed);
|
|
140
|
+
return { dim: result.dim, freeIndices: result.freeIndices };
|
|
141
|
+
}
|
|
142
|
+
if (typed.kind === 'kronecker-delta') {
|
|
143
|
+
const result = validateKroneckerDelta(typed);
|
|
144
|
+
return { dim: result.dim, freeIndices: result.freeIndices };
|
|
145
|
+
}
|
|
146
|
+
if (typed.kind === 'tensor-partial-derivative') {
|
|
147
|
+
const result = validatePartialDerivative(typed, (grandchild) => resolveChildForPartialDerivative(grandchild, parentCtx));
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
// For scalars / op / integral / derivative / tensor-product nodes, use
|
|
151
|
+
// inferArgLocal for dim + freeIndices, no role.
|
|
152
|
+
const probe = inferArgLocal(typed, parentCtx, '<pderiv-child>');
|
|
153
|
+
if (probe.dim === null) {
|
|
154
|
+
throw new TensorProductChildInferenceError('tensor-partial-derivative child failed dimension inference; ' +
|
|
155
|
+
'see ValidationResult.violations for cause.');
|
|
156
|
+
}
|
|
157
|
+
return { dim: probe.dim, freeIndices: probe.freeIndices };
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Resolve a child of a covariant-derivative to its local {dim, freeIndices, role?}
|
|
161
|
+
* carrier. Same recursion pattern as resolveChildForPartialDerivative — reuses
|
|
162
|
+
* the partial-derivative resolver since the same child kinds appear.
|
|
163
|
+
*/
|
|
164
|
+
function resolveChildForCovariantDerivative(node, parentCtx) {
|
|
165
|
+
return resolveChildForPartialDerivative(node, parentCtx);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Recursive dimension inference. On any sub-expression error we record a
|
|
169
|
+
* violation, return `null`, and let parent ops propagate the null up.
|
|
170
|
+
*/
|
|
171
|
+
function infer(node, ctx) {
|
|
172
|
+
switch (node.kind) {
|
|
173
|
+
case 'symbol':
|
|
174
|
+
return node.dim;
|
|
175
|
+
case 'op': {
|
|
176
|
+
if (node.op === '^') {
|
|
177
|
+
// a^n — base is an arbitrary expression; exponent must be a numeric symbol
|
|
178
|
+
// (we read its `name` as a number). Non-numeric exponents would require
|
|
179
|
+
// the base to be dimensionless; we don't support that yet.
|
|
180
|
+
if (node.args.length !== 2) {
|
|
181
|
+
ctx.violations.push({
|
|
182
|
+
location: ctx.path,
|
|
183
|
+
expected: DIMENSIONLESS,
|
|
184
|
+
actual: DIMENSIONLESS,
|
|
185
|
+
note: `^ requires exactly 2 args (base, exponent), got ${node.args.length}`,
|
|
186
|
+
});
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
const [baseNode, expNode] = node.args;
|
|
190
|
+
// Per Part-VII §VII.5: '^' is a scalar operator. Capture the base's
|
|
191
|
+
// local freeIndices and reject if non-empty (tensor base).
|
|
192
|
+
const baseProbe = inferArgLocal(baseNode, ctx, 'args[0]');
|
|
193
|
+
const baseDim = baseProbe.dim;
|
|
194
|
+
if (baseDim === null)
|
|
195
|
+
return null;
|
|
196
|
+
if (baseProbe.freeIndices.size > 0) {
|
|
197
|
+
throw new TensorInScalarOpError('^');
|
|
198
|
+
}
|
|
199
|
+
if (!expNode || expNode.kind !== 'symbol') {
|
|
200
|
+
// Try to recover the exponent expression's inferred dim so the
|
|
201
|
+
// violation is informative (expected ≠ actual). If inference itself
|
|
202
|
+
// fails, fall back to DIMENSIONLESS — but the note still carries
|
|
203
|
+
// the structural reason, so a downstream consumer keying on
|
|
204
|
+
// `equals(expected,actual)` will still see the mismatch in the
|
|
205
|
+
// generic case.
|
|
206
|
+
let actualDim = DIMENSIONLESS;
|
|
207
|
+
if (expNode) {
|
|
208
|
+
// Use a throwaway local violation channel so a deeper
|
|
209
|
+
// inference error doesn't double-report — we only want the
|
|
210
|
+
// dim if it can be inferred cleanly.
|
|
211
|
+
const probeCtx = { path: joinPath(ctx.path, 'args[1]'), violations: [], freeIndices: new Map() };
|
|
212
|
+
const probed = infer(expNode, probeCtx);
|
|
213
|
+
if (probed !== null && probed !== undefined && probeCtx.violations.length === 0) {
|
|
214
|
+
actualDim = probed;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
ctx.violations.push({
|
|
218
|
+
location: joinPath(ctx.path, 'args[1]'),
|
|
219
|
+
expected: DIMENSIONLESS,
|
|
220
|
+
actual: actualDim,
|
|
221
|
+
note: '^ exponent must be a numeric literal symbol in this MVP',
|
|
222
|
+
});
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
const n = Number(expNode.name);
|
|
226
|
+
if (!Number.isFinite(n)) {
|
|
227
|
+
ctx.violations.push({
|
|
228
|
+
location: joinPath(ctx.path, 'args[1]'),
|
|
229
|
+
expected: DIMENSIONLESS,
|
|
230
|
+
actual: expNode.dim,
|
|
231
|
+
note: `^ exponent "${expNode.name}" is not a finite number`,
|
|
232
|
+
});
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
return power(baseDim, n);
|
|
236
|
+
}
|
|
237
|
+
if (node.op === '*' || node.op === '/') {
|
|
238
|
+
if (node.args.length === 0)
|
|
239
|
+
return DIMENSIONLESS;
|
|
240
|
+
// Per Part-VII §VII.5: '*' / '/' are scalar-only operators. Any
|
|
241
|
+
// arg with non-empty freeIndices is rejected with
|
|
242
|
+
// TensorInScalarOpError; users must use 'tensor-product' for
|
|
243
|
+
// tensor multiplication. Scalar-only operand lists retain the
|
|
244
|
+
// existing dim-accumulation behavior.
|
|
245
|
+
let acc = null;
|
|
246
|
+
for (let i = 0; i < node.args.length; i++) {
|
|
247
|
+
const probe = inferArgLocal(node.args[i], ctx, `args[${i}]`);
|
|
248
|
+
const childDim = probe.dim;
|
|
249
|
+
if (childDim === null)
|
|
250
|
+
return null;
|
|
251
|
+
if (probe.freeIndices.size > 0) {
|
|
252
|
+
throw new TensorInScalarOpError(node.op);
|
|
253
|
+
}
|
|
254
|
+
if (i === 0)
|
|
255
|
+
acc = childDim;
|
|
256
|
+
else if (node.op === '*')
|
|
257
|
+
acc = multiply(acc, childDim);
|
|
258
|
+
else
|
|
259
|
+
acc = divide(acc, childDim);
|
|
260
|
+
}
|
|
261
|
+
return acc;
|
|
262
|
+
}
|
|
263
|
+
// '+' or '-' — all operands must share a common dimension AND
|
|
264
|
+
// (per Part-VII §VII.5) the same freeIndices signature. Mismatched
|
|
265
|
+
// free-index maps raise FreeIndexMismatchError; this catches both
|
|
266
|
+
// tensor + scalar (one map non-empty, one empty) and tensor + tensor
|
|
267
|
+
// with differing variance / labels / counts.
|
|
268
|
+
if (node.args.length === 0)
|
|
269
|
+
return DIMENSIONLESS;
|
|
270
|
+
let acc = null;
|
|
271
|
+
let firstFI = null;
|
|
272
|
+
for (let i = 0; i < node.args.length; i++) {
|
|
273
|
+
const probe = inferArgLocal(node.args[i], ctx, `args[${i}]`);
|
|
274
|
+
const childDim = probe.dim;
|
|
275
|
+
if (childDim === null)
|
|
276
|
+
return null;
|
|
277
|
+
if (i === 0) {
|
|
278
|
+
acc = childDim;
|
|
279
|
+
firstFI = probe.freeIndices;
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
if (!freeIndicesEqual(firstFI, probe.freeIndices)) {
|
|
283
|
+
throw new FreeIndexMismatchError(`op '${node.op}' args have mismatched freeIndices: ` +
|
|
284
|
+
`args[0] has ${formatFreeIndices(firstFI)} but ` +
|
|
285
|
+
`args[${i}] has ${formatFreeIndices(probe.freeIndices)}. ` +
|
|
286
|
+
`All operands of a tensor sum must share the same free-index signature.`);
|
|
287
|
+
}
|
|
288
|
+
try {
|
|
289
|
+
acc = node.op === '+' ? add(acc, childDim) : subtract(acc, childDim);
|
|
290
|
+
}
|
|
291
|
+
catch (err) {
|
|
292
|
+
if (err instanceof DimensionMismatchError) {
|
|
293
|
+
ctx.violations.push({
|
|
294
|
+
location: joinPath(ctx.path, `args[${i}]`),
|
|
295
|
+
expected: acc,
|
|
296
|
+
actual: childDim,
|
|
297
|
+
note: `Cannot ${node.op === '+' ? 'add' : 'subtract'} ${format(childDim)} with running ${format(acc)} (dimension mismatch).`,
|
|
298
|
+
});
|
|
299
|
+
return null;
|
|
300
|
+
}
|
|
301
|
+
throw err;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
// Propagate the (shared) freeIndices signature to the parent ctx so
|
|
306
|
+
// a tensor-sum can flow into another tensor-aware operator above.
|
|
307
|
+
if (firstFI !== null) {
|
|
308
|
+
for (const [label, counts] of firstFI) {
|
|
309
|
+
ctx.freeIndices.set(label, counts);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return acc;
|
|
313
|
+
}
|
|
314
|
+
case 'integral': {
|
|
315
|
+
// ∫ f dx — result has dim(f) * dim(x).
|
|
316
|
+
// Guard against malformed nodes loaded from JSON / hand-built test
|
|
317
|
+
// fixtures that omit `integrand` or `over` (TypeScript requires them
|
|
318
|
+
// but `as unknown as ExprNode` casts can bypass the check).
|
|
319
|
+
if (!node.integrand || !node.over) {
|
|
320
|
+
ctx.violations.push({
|
|
321
|
+
location: ctx.path,
|
|
322
|
+
expected: DIMENSIONLESS,
|
|
323
|
+
actual: DIMENSIONLESS,
|
|
324
|
+
note: `integral requires both 'integrand' and 'over' fields`,
|
|
325
|
+
});
|
|
326
|
+
return null;
|
|
327
|
+
}
|
|
328
|
+
// v0.3.1 audit fix: shallow `{ ...ctx, path }` shared ctx.freeIndices
|
|
329
|
+
// (a Map, copied by reference), so a tensor-valued integrand silently
|
|
330
|
+
// leaked its free indices into the parent accumulator. Use
|
|
331
|
+
// inferArgLocal() to give each child a fresh local freeIndices Map.
|
|
332
|
+
// v0.3.0 has no tensor-integral semantics; the operator is dimensional
|
|
333
|
+
// scalar and child free-indices stay local.
|
|
334
|
+
const fProbe = inferArgLocal(node.integrand, ctx, 'integrand');
|
|
335
|
+
const xProbe = inferArgLocal(node.over, ctx, 'over');
|
|
336
|
+
if (fProbe.dim === null || xProbe.dim === null)
|
|
337
|
+
return null;
|
|
338
|
+
return multiply(fProbe.dim, xProbe.dim);
|
|
339
|
+
}
|
|
340
|
+
case 'derivative': {
|
|
341
|
+
// d f / d x — result has dim(f) / dim(x).
|
|
342
|
+
// Same shape guard as `integral` above.
|
|
343
|
+
if (!node.of || !node.wrt) {
|
|
344
|
+
ctx.violations.push({
|
|
345
|
+
location: ctx.path,
|
|
346
|
+
expected: DIMENSIONLESS,
|
|
347
|
+
actual: DIMENSIONLESS,
|
|
348
|
+
note: `derivative requires both 'of' and 'wrt' fields`,
|
|
349
|
+
});
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
// v0.3.1 audit fix: same shallow-spread ctx.freeIndices leak as the
|
|
353
|
+
// integral case above. Use inferArgLocal() so a tensor-valued `of`
|
|
354
|
+
// doesn't bleed its free indices into the parent. v0.3.0 has no
|
|
355
|
+
// tensor-derivative semantics (tensor-partial-derivative is the
|
|
356
|
+
// dedicated node for that); this `derivative` node stays dimensional
|
|
357
|
+
// scalar.
|
|
358
|
+
const fProbe = inferArgLocal(node.of, ctx, 'of');
|
|
359
|
+
const xProbe = inferArgLocal(node.wrt, ctx, 'wrt');
|
|
360
|
+
if (fProbe.dim === null || xProbe.dim === null)
|
|
361
|
+
return null;
|
|
362
|
+
return divide(fProbe.dim, xProbe.dim);
|
|
363
|
+
}
|
|
364
|
+
case 'tensor-symbol': {
|
|
365
|
+
// Real validation per Part-VII §VII.4. Builds the free-indices map
|
|
366
|
+
// from declared indices and merges into the context accumulator so
|
|
367
|
+
// the root validate() call sees them in its ValidationResult.
|
|
368
|
+
const { dim, freeIndices } = validateTensorSymbol(node);
|
|
369
|
+
for (const [label, counts] of freeIndices) {
|
|
370
|
+
ctx.freeIndices.set(label, counts);
|
|
371
|
+
}
|
|
372
|
+
return dim;
|
|
373
|
+
}
|
|
374
|
+
case 'tensor-product': {
|
|
375
|
+
// Task 6 — Einstein contraction. We delegate the algebra to the
|
|
376
|
+
// pure `computeContraction(args, validateChild)` helper in tensor.ts
|
|
377
|
+
// and inject `validateChild` to break the module cycle that would
|
|
378
|
+
// otherwise arise from tensor.ts importing the validator.
|
|
379
|
+
//
|
|
380
|
+
// CRITICAL: every nested call uses *local* freeIndices maps; we never
|
|
381
|
+
// mutate ctx.freeIndices from inside the recursion. Only the outer-
|
|
382
|
+
// most tensor-product case merges its final residual map into the
|
|
383
|
+
// shared ctx.freeIndices accumulator. This is what makes
|
|
384
|
+
// (A·B)·C-style nested products correct: the inner product's dummy
|
|
385
|
+
// indices stay scoped to the inner call.
|
|
386
|
+
try {
|
|
387
|
+
const result = computeContraction(node.args, (child) => resolveChildForContraction(child, ctx));
|
|
388
|
+
for (const [label, counts] of result.freeIndices) {
|
|
389
|
+
ctx.freeIndices.set(label, counts);
|
|
390
|
+
}
|
|
391
|
+
return result.dim;
|
|
392
|
+
}
|
|
393
|
+
catch (err) {
|
|
394
|
+
// Errors from the contraction (IndexLabelCollisionError,
|
|
395
|
+
// VarianceMismatchError) are part of the public surface — propagate
|
|
396
|
+
// them so callers / tests can catch by type.
|
|
397
|
+
throw err;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
case 'metric-tensor': {
|
|
401
|
+
const { dim, freeIndices } = validateMetricTensor(node);
|
|
402
|
+
for (const [label, counts] of freeIndices) {
|
|
403
|
+
ctx.freeIndices.set(label, counts);
|
|
404
|
+
}
|
|
405
|
+
return dim;
|
|
406
|
+
}
|
|
407
|
+
case 'kronecker-delta': {
|
|
408
|
+
const { dim, freeIndices } = validateKroneckerDelta(node);
|
|
409
|
+
for (const [label, counts] of freeIndices) {
|
|
410
|
+
ctx.freeIndices.set(label, counts);
|
|
411
|
+
}
|
|
412
|
+
return dim;
|
|
413
|
+
}
|
|
414
|
+
case 'tensor-partial-derivative': {
|
|
415
|
+
const result = validatePartialDerivative(node, (child) => resolveChildForPartialDerivative(child, ctx));
|
|
416
|
+
for (const [label, counts] of result.freeIndices) {
|
|
417
|
+
ctx.freeIndices.set(label, counts);
|
|
418
|
+
}
|
|
419
|
+
return result.dim;
|
|
420
|
+
}
|
|
421
|
+
case 'covariant-derivative': {
|
|
422
|
+
const result = validateCovariantDerivative(node, (child) => resolveChildForCovariantDerivative(child, ctx));
|
|
423
|
+
for (const [label, counts] of result.freeIndices) {
|
|
424
|
+
ctx.freeIndices.set(label, counts);
|
|
425
|
+
}
|
|
426
|
+
return result.dim;
|
|
427
|
+
}
|
|
428
|
+
default: {
|
|
429
|
+
// Exhaustiveness guard: if a future ExprNode arm is added but not
|
|
430
|
+
// handled here, this branch records a shape violation rather than
|
|
431
|
+
// silently returning `undefined` (which validate() would coerce to
|
|
432
|
+
// `ok: true, inferredDimension: undefined` — see silent-failure F1).
|
|
433
|
+
const _exhaustive = node;
|
|
434
|
+
void _exhaustive;
|
|
435
|
+
const kind = node?.kind;
|
|
436
|
+
ctx.violations.push({
|
|
437
|
+
location: ctx.path,
|
|
438
|
+
expected: DIMENSIONLESS,
|
|
439
|
+
actual: DIMENSIONLESS,
|
|
440
|
+
note: `Validator: unknown ExprNode.kind ${JSON.stringify(kind)}`,
|
|
441
|
+
});
|
|
442
|
+
return null;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* A violation set passes iff it contains no error-severity violation.
|
|
448
|
+
* Violations with `severity` absent default to 'error' (v0.3.5 §4).
|
|
449
|
+
*/
|
|
450
|
+
function okFromViolations(violations) {
|
|
451
|
+
return !violations.some((v) => (v.severity ?? 'error') === 'error');
|
|
452
|
+
}
|
|
453
|
+
export function validate(expr) {
|
|
454
|
+
const ctx = { path: '', violations: [], freeIndices: new Map() };
|
|
455
|
+
const dim = infer(expr, ctx);
|
|
456
|
+
return {
|
|
457
|
+
ok: okFromViolations(ctx.violations) && dim !== null && dim !== undefined,
|
|
458
|
+
inferredDimension: dim ?? null,
|
|
459
|
+
freeIndices: ctx.freeIndices,
|
|
460
|
+
violations: ctx.violations,
|
|
461
|
+
};
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Opt-in symbolic InverseMetricInconsistencyWarning check. Given a
|
|
465
|
+
* lower/upper metric pair, returns a deduplicated (at most one) warning-
|
|
466
|
+
* severity Violation set. v0.3.5 §7. (Deliberately not folded into
|
|
467
|
+
* validate() — that is the hot path for the whole test suite.)
|
|
468
|
+
*/
|
|
469
|
+
export function validateInverseMetricPair(gLower, gUpper) {
|
|
470
|
+
const note = checkInverseMetricStructure(gLower, gUpper);
|
|
471
|
+
if (note === null)
|
|
472
|
+
return [];
|
|
473
|
+
return [{
|
|
474
|
+
location: `${gLower.name}/${gUpper.name}`,
|
|
475
|
+
expected: gLower.dim,
|
|
476
|
+
actual: gUpper.dim,
|
|
477
|
+
note,
|
|
478
|
+
severity: 'warning',
|
|
479
|
+
}];
|
|
480
|
+
}
|
|
481
|
+
export function validateEquation(lhs, rhs) {
|
|
482
|
+
const lhsCtx = { path: 'lhs', violations: [], freeIndices: new Map() };
|
|
483
|
+
const rhsCtx = { path: 'rhs', violations: [], freeIndices: new Map() };
|
|
484
|
+
const lhsDim = infer(lhs, lhsCtx);
|
|
485
|
+
const rhsDim = infer(rhs, rhsCtx);
|
|
486
|
+
const violations = [...lhsCtx.violations, ...rhsCtx.violations];
|
|
487
|
+
if (lhsDim !== null && rhsDim !== null && !equals(lhsDim, rhsDim)) {
|
|
488
|
+
violations.push({
|
|
489
|
+
location: '<equation>',
|
|
490
|
+
expected: lhsDim,
|
|
491
|
+
actual: rhsDim,
|
|
492
|
+
note: `LHS has ${format(lhsDim)} but RHS has ${format(rhsDim)} — equation is not dimensionally homogeneous.`,
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
return {
|
|
496
|
+
ok: okFromViolations(violations) && lhsDim !== null && rhsDim !== null,
|
|
497
|
+
inferredDimension: lhsDim, // by convention, LHS dimension is the canonical answer
|
|
498
|
+
// By convention LHS free-indices map is the canonical answer (mirrors
|
|
499
|
+
// inferredDimension's LHS bias). Equation-level free-index agreement
|
|
500
|
+
// checks are deferred to Task 7 (op-tensor boundary rules).
|
|
501
|
+
freeIndices: lhsCtx.freeIndices,
|
|
502
|
+
violations,
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/dimensional/validator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal Physics Tensor Framework
|
|
3
|
+
*
|
|
4
|
+
* Computational framework for exploring unified physics through tensor formalism
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
export { UniversalTensor } from './core/tensor.js';
|
|
9
|
+
export type { TensorConfig, TensorIndices, PhysicalLaw, BridgeEquation, EmergentPhenomenon, PhysicalScale, Force, Symmetry, InformationMeasure, } from './core/types.js';
|
|
10
|
+
export { PhysicalConstants } from './core/types.js';
|
|
11
|
+
export { BRIDGE_EQUATIONS } from './bridges/index.js';
|
|
12
|
+
export type { BridgeEquationEntry, BridgeEquationStatus, BridgeIssueSeverity, BridgeIssueFixable, KnownIssue, } from './bridges/index.js';
|
|
13
|
+
export { evaluateGravitationalLensing, type GravitationalLensingInputs, type GravitationalLensingResult, evaluatePerihelionPrecession, type PerihelionPrecessionInputs, type PerihelionPrecessionResult, } from './bridges/index.js';
|
|
14
|
+
export { christoffel } from './dimensional/connection.js';
|
|
15
|
+
export type { CovariantDerivativeNode } from './dimensional/validator.js';
|
|
16
|
+
export { integrateGeodesic, type GeodesicIntegratorInputs, type GeodesicIntegratorResult, } from './numerical/geodesic-integrator.js';
|
|
17
|
+
export type { Dimension } from './dimensional/types.js';
|
|
18
|
+
export { DIMENSIONLESS, LENGTH, AREA, TIME, FREQUENCY, MASS, VELOCITY, ACCELERATION, FORCE, ENERGY, POWER, ACTION, TEMPERATURE, ENTROPY, CHARGE, } from './dimensional/types.js';
|
|
19
|
+
export { multiply, divide, power, add, subtract, equals, format, DimensionMismatchError, } from './dimensional/algebra.js';
|
|
20
|
+
export type { ExprNode, ValidationResult, Violation } from './dimensional/validator.js';
|
|
21
|
+
export { validate, validateEquation, validateInverseMetricPair } from './dimensional/validator.js';
|
|
22
|
+
export { inferDimensionForBridge } from './dimensional/bridge-check.js';
|
|
23
|
+
export { evaluateNumerical, evaluateNumericalRaw, evaluateMetricInverse, Float64ReferenceEngine, getActiveEngine, setActiveEngine, NumericalBackendError, DuplicateCoordinateWarning, EngineCapabilityError, hasAutogradSupport, evaluateBE37CovariantEikonalNumerical, } from './numerical/index.js';
|
|
24
|
+
export type { NumericalResult, NumericalRawResult, EvaluateOptions, NumericalInputs, TensorEngine, EngineTensor, EinsumSpec, NestedArray, GridField, ForwardGradResult, ReverseGradResult, } from './numerical/index.js';
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,YAAY,EACV,YAAY,EACZ,aAAa,EACb,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,KAAK,EACL,QAAQ,EACR,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAOpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EACV,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,GACX,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,4BAA4B,EAC5B,KAAK,0BAA0B,EAC/B,KAAK,0BAA0B,EAC/B,4BAA4B,EAC5B,KAAK,0BAA0B,EAC/B,KAAK,0BAA0B,GAChC,MAAM,oBAAoB,CAAC;AAM5B,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAG1D,YAAY,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAG1E,OAAO,EACL,iBAAiB,EACjB,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,GAC9B,MAAM,oCAAoC,CAAC;AAM5C,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EACL,aAAa,EACb,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,KAAK,EACL,MAAM,EACN,KAAK,EACL,MAAM,EACN,WAAW,EACX,OAAO,EACP,MAAM,GACP,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,QAAQ,EACR,MAAM,EACN,KAAK,EACL,GAAG,EACH,QAAQ,EACR,MAAM,EACN,MAAM,EACN,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACxF,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACnG,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAOxE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,EACf,eAAe,EACf,qBAAqB,EAErB,0BAA0B,EAC1B,qBAAqB,EACrB,kBAAkB,EAClB,qCAAqC,GACtC,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,WAAW,EACX,SAAS,EAET,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal Physics Tensor Framework
|
|
3
|
+
*
|
|
4
|
+
* Computational framework for exploring unified physics through tensor formalism
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
export { UniversalTensor } from './core/tensor.js';
|
|
9
|
+
export { PhysicalConstants } from './core/types.js';
|
|
10
|
+
// Machine-readable bridge equation index — the 40+ catalogued equations.
|
|
11
|
+
// `BridgeEquationEntry` is intentionally a different shape from the runtime
|
|
12
|
+
// `BridgeEquation` interface above; the entry captures spec-level metadata
|
|
13
|
+
// (status, known issues, references, dependencies), while `BridgeEquation`
|
|
14
|
+
// describes a runtime bridge between two tensor regimes.
|
|
15
|
+
export { BRIDGE_EQUATIONS } from './bridges/index.js';
|
|
16
|
+
// v0.4.0 bridge implementations (evaluator functions beyond the spec catalog)
|
|
17
|
+
export { evaluateGravitationalLensing, evaluatePerihelionPrecession, } from './bridges/index.js';
|
|
18
|
+
// v0.4.0 connection layer — Christoffel formula builder and covariant derivative
|
|
19
|
+
// AST node type. `christoffel` is public because bridge modules and downstream
|
|
20
|
+
// callers compose Γ trees directly; `CovariantDerivativeNode` is the structural
|
|
21
|
+
// type for the new ∇_μ AST kind.
|
|
22
|
+
export { christoffel } from './dimensional/connection.js';
|
|
23
|
+
// v0.4.0 geodesic integrator (RK4 solver — headline feature of v0.4.0)
|
|
24
|
+
export { integrateGeodesic, } from './numerical/geodesic-integrator.js';
|
|
25
|
+
export { DIMENSIONLESS, LENGTH, AREA, TIME, FREQUENCY, MASS, VELOCITY, ACCELERATION, FORCE, ENERGY, POWER, ACTION, TEMPERATURE, ENTROPY, CHARGE, } from './dimensional/types.js';
|
|
26
|
+
export { multiply, divide, power, add, subtract, equals, format, DimensionMismatchError, } from './dimensional/algebra.js';
|
|
27
|
+
export { validate, validateEquation, validateInverseMetricPair } from './dimensional/validator.js';
|
|
28
|
+
export { inferDimensionForBridge } from './dimensional/bridge-check.js';
|
|
29
|
+
// v0.3.5 numerical-contraction backend. See docs/planning/v0.3.5-Design.md.
|
|
30
|
+
// Every symbol below is `@public` — the consumer-facing (TensorJS) surface.
|
|
31
|
+
// `MathTSEngine` is intentionally NOT re-exported here: it lives behind the
|
|
32
|
+
// `@danielsimonjr/mathts-tensor` optionalDependency and is reachable only via
|
|
33
|
+
// the `universal-physics-tensor/numerical/mathts-engine` exports subpath.
|
|
34
|
+
export { evaluateNumerical, evaluateNumericalRaw, evaluateMetricInverse, Float64ReferenceEngine, getActiveEngine, setActiveEngine, NumericalBackendError,
|
|
35
|
+
// v0.4.0 additions to the numerical surface
|
|
36
|
+
DuplicateCoordinateWarning, EngineCapabilityError, hasAutogradSupport, evaluateBE37CovariantEikonalNumerical, } from './numerical/index.js';
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAYnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,yEAAyE;AACzE,4EAA4E;AAC5E,2EAA2E;AAC3E,2EAA2E;AAC3E,yDAAyD;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAStD,8EAA8E;AAC9E,OAAO,EACL,4BAA4B,EAG5B,4BAA4B,GAG7B,MAAM,oBAAoB,CAAC;AAE5B,iFAAiF;AACjF,+EAA+E;AAC/E,gFAAgF;AAChF,iCAAiC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAK1D,uEAAuE;AACvE,OAAO,EACL,iBAAiB,GAGlB,MAAM,oCAAoC,CAAC;AAO5C,OAAO,EACL,aAAa,EACb,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,KAAK,EACL,MAAM,EACN,KAAK,EACL,MAAM,EACN,WAAW,EACX,OAAO,EACP,MAAM,GACP,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,QAAQ,EACR,MAAM,EACN,KAAK,EACL,GAAG,EACH,QAAQ,EACR,MAAM,EACN,MAAM,EACN,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACnG,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAExE,4EAA4E;AAC5E,4EAA4E;AAC5E,4EAA4E;AAC5E,8EAA8E;AAC9E,0EAA0E;AAC1E,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,EACf,eAAe,EACf,qBAAqB;AACrB,4CAA4C;AAC5C,0BAA0B,EAC1B,qBAAqB,EACrB,kBAAkB,EAClB,qCAAqC,GACtC,MAAM,sBAAsB,CAAC"}
|