universal-physics-tensor 8.0.0 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -21
- package/data/atlas/atlas.json +75 -64
- package/data/atlas/atlas.jsonld +1 -1
- package/data/atlas/diffusion.json +23 -22
- package/data/atlas/oscillators.json +21 -16
- package/data/atlas/waves.json +33 -28
- package/data/bridge-catalog.json +1356 -1791
- package/data/bridge-catalog.schema.json +789 -46
- package/data/quantities.json +280 -234
- package/data/quantities.schema.json +52 -0
- package/data/schemas/atlas-record.v0.json +184 -46
- package/data/units.json +1178 -0
- package/data/units.schema.json +124 -0
- package/dist/atlas/applicability.d.ts.map +1 -1
- package/dist/atlas/applicability.js +14 -3
- package/dist/atlas/applicability.js.map +1 -1
- package/dist/atlas/association.d.ts +1 -1
- package/dist/atlas/association.js.map +1 -1
- package/dist/atlas/benchmark/backend-shapes.d.ts.map +1 -1
- package/dist/atlas/benchmark/backend-shapes.js +5 -1
- package/dist/atlas/benchmark/backend-shapes.js.map +1 -1
- package/dist/atlas/benchmark/baselines.d.ts.map +1 -1
- package/dist/atlas/benchmark/baselines.js +8 -0
- package/dist/atlas/benchmark/baselines.js.map +1 -1
- package/dist/atlas/benchmark/hybrid-retrieval.d.ts +3 -2
- package/dist/atlas/benchmark/hybrid-retrieval.d.ts.map +1 -1
- package/dist/atlas/benchmark/hybrid-retrieval.js +16 -12
- package/dist/atlas/benchmark/hybrid-retrieval.js.map +1 -1
- package/dist/atlas/benchmark/leakage.js.map +1 -1
- package/dist/atlas/benchmark/loader.js.map +1 -1
- package/dist/atlas/benchmark/run-atlas.d.ts.map +1 -1
- package/dist/atlas/benchmark/run-atlas.js +14 -2
- package/dist/atlas/benchmark/run-atlas.js.map +1 -1
- package/dist/atlas/benchmark/stats.d.ts +1 -1
- package/dist/atlas/benchmark/stats.d.ts.map +1 -1
- package/dist/atlas/benchmark/stats.js +1 -1
- package/dist/atlas/benchmark/stats.js.map +1 -1
- package/dist/atlas/benchmark/study.js.map +1 -1
- package/dist/atlas/benchmark/types.js.map +1 -1
- package/dist/atlas/bridge-record.d.ts +4 -4
- package/dist/atlas/bridge-record.d.ts.map +1 -1
- package/dist/atlas/bridge-record.js +6 -6
- package/dist/atlas/bridge-record.js.map +1 -1
- package/dist/atlas/catalog-formal-ref.js.map +1 -1
- package/dist/atlas/chain-pipeline.d.ts +0 -11
- package/dist/atlas/chain-pipeline.d.ts.map +1 -1
- package/dist/atlas/chain-pipeline.js +5 -16
- package/dist/atlas/chain-pipeline.js.map +1 -1
- package/dist/atlas/composition-table.js.map +1 -1
- package/dist/atlas/conventions.js.map +1 -1
- package/dist/atlas/coverage.d.ts +2 -2
- package/dist/atlas/coverage.js.map +1 -1
- package/dist/atlas/derivation.js.map +1 -1
- package/dist/atlas/derive-evidence.d.ts +6 -4
- package/dist/atlas/derive-evidence.d.ts.map +1 -1
- package/dist/atlas/derive-evidence.js +7 -2
- package/dist/atlas/derive-evidence.js.map +1 -1
- package/dist/atlas/diffusion/bridges-closure.d.ts.map +1 -1
- package/dist/atlas/diffusion/bridges-closure.js +0 -5
- package/dist/atlas/diffusion/bridges-closure.js.map +1 -1
- package/dist/atlas/diffusion/bridges.d.ts.map +1 -1
- package/dist/atlas/diffusion/bridges.js +0 -3
- package/dist/atlas/diffusion/bridges.js.map +1 -1
- package/dist/atlas/diffusion/dimensions.js.map +1 -1
- package/dist/atlas/diffusion/index.d.ts +1 -1
- package/dist/atlas/diffusion/index.d.ts.map +1 -1
- package/dist/atlas/diffusion/index.js.map +1 -1
- package/dist/atlas/diffusion/models.js.map +1 -1
- package/dist/atlas/diffusion/numerics.js.map +1 -1
- package/dist/atlas/error-algebra.d.ts +6 -0
- package/dist/atlas/error-algebra.d.ts.map +1 -1
- package/dist/atlas/error-algebra.js +26 -0
- package/dist/atlas/error-algebra.js.map +1 -1
- package/dist/atlas/export.d.ts +18 -2
- package/dist/atlas/export.d.ts.map +1 -1
- package/dist/atlas/export.js +9 -3
- package/dist/atlas/export.js.map +1 -1
- package/dist/atlas/families.d.ts +19 -2
- package/dist/atlas/families.d.ts.map +1 -1
- package/dist/atlas/families.js +26 -3
- package/dist/atlas/families.js.map +1 -1
- package/dist/atlas/family.d.ts +27 -0
- package/dist/atlas/family.d.ts.map +1 -0
- package/dist/atlas/family.js +12 -0
- package/dist/atlas/family.js.map +1 -0
- package/dist/atlas/index.d.ts +3 -2
- package/dist/atlas/index.d.ts.map +1 -1
- package/dist/atlas/index.js +2 -1
- package/dist/atlas/index.js.map +1 -1
- package/dist/atlas/link-prediction.d.ts +1 -1
- package/dist/atlas/link-prediction.d.ts.map +1 -1
- package/dist/atlas/link-prediction.js.map +1 -1
- package/dist/atlas/model.js.map +1 -1
- package/dist/atlas/oscillators/bridges-coarse.d.ts.map +1 -1
- package/dist/atlas/oscillators/bridges-coarse.js +0 -1
- package/dist/atlas/oscillators/bridges-coarse.js.map +1 -1
- package/dist/atlas/oscillators/bridges-exact.d.ts.map +1 -1
- package/dist/atlas/oscillators/bridges-exact.js +0 -3
- package/dist/atlas/oscillators/bridges-exact.js.map +1 -1
- package/dist/atlas/oscillators/bridges-limits.d.ts.map +1 -1
- package/dist/atlas/oscillators/bridges-limits.js +0 -2
- package/dist/atlas/oscillators/bridges-limits.js.map +1 -1
- package/dist/atlas/oscillators/dimensions.js.map +1 -1
- package/dist/atlas/oscillators/index.d.ts +1 -16
- package/dist/atlas/oscillators/index.d.ts.map +1 -1
- package/dist/atlas/oscillators/index.js.map +1 -1
- package/dist/atlas/oscillators/limit-witnesses.js.map +1 -1
- package/dist/atlas/oscillators/models.js.map +1 -1
- package/dist/atlas/oscillators/norm-transport-witness.js.map +1 -1
- package/dist/atlas/oscillators/norm-transport.js.map +1 -1
- package/dist/atlas/oscillators/norms.js.map +1 -1
- package/dist/atlas/oscillators/pendulum-motion.js.map +1 -1
- package/dist/atlas/oscillators/phase-carriage.js.map +1 -1
- package/dist/atlas/oscillators/phase-translation.js.map +1 -1
- package/dist/atlas/oscillators/position-translation.js.map +1 -1
- package/dist/atlas/oscillators/rejections.js.map +1 -1
- package/dist/atlas/path-bound.js.map +1 -1
- package/dist/atlas/physjs-entries.generated.d.ts +1601 -220
- package/dist/atlas/physjs-entries.generated.d.ts.map +1 -1
- package/dist/atlas/physjs-entries.generated.js +1854 -345
- package/dist/atlas/physjs-entries.generated.js.map +1 -1
- package/dist/atlas/physjs-ref.d.ts +151 -117
- package/dist/atlas/physjs-ref.d.ts.map +1 -1
- package/dist/atlas/physjs-ref.js +244 -211
- package/dist/atlas/physjs-ref.js.map +1 -1
- package/dist/atlas/physjs-reviewed.d.ts +31 -0
- package/dist/atlas/physjs-reviewed.d.ts.map +1 -0
- package/dist/atlas/physjs-reviewed.js +194 -0
- package/dist/atlas/physjs-reviewed.js.map +1 -0
- package/dist/atlas/poster/associations.js.map +1 -1
- package/dist/atlas/poster/derivations.js.map +1 -1
- package/dist/atlas/poster/statements.js.map +1 -1
- package/dist/atlas/proof-target.d.ts +16 -8
- package/dist/atlas/proof-target.d.ts.map +1 -1
- package/dist/atlas/proof-target.js +34 -31
- package/dist/atlas/proof-target.js.map +1 -1
- package/dist/atlas/public.d.ts +2 -1
- package/dist/atlas/public.d.ts.map +1 -1
- package/dist/atlas/public.js +2 -1
- package/dist/atlas/public.js.map +1 -1
- package/dist/atlas/regime.js.map +1 -1
- package/dist/atlas/serialize.d.ts +18 -12
- package/dist/atlas/serialize.d.ts.map +1 -1
- package/dist/atlas/serialize.js +28 -18
- package/dist/atlas/serialize.js.map +1 -1
- package/dist/atlas/statement.js.map +1 -1
- package/dist/atlas/translation-registry.js.map +1 -1
- package/dist/atlas/translation.js.map +1 -1
- package/dist/atlas/types.d.ts +9 -2
- package/dist/atlas/types.d.ts.map +1 -1
- package/dist/atlas/types.js +1 -1
- package/dist/atlas/types.js.map +1 -1
- package/dist/atlas/waves/bridges-closure.d.ts.map +1 -1
- package/dist/atlas/waves/bridges-closure.js +0 -3
- package/dist/atlas/waves/bridges-closure.js.map +1 -1
- package/dist/atlas/waves/bridges.d.ts.map +1 -1
- package/dist/atlas/waves/bridges.js +0 -4
- package/dist/atlas/waves/bridges.js.map +1 -1
- package/dist/atlas/waves/index.d.ts +1 -1
- package/dist/atlas/waves/index.d.ts.map +1 -1
- package/dist/atlas/waves/index.js.map +1 -1
- package/dist/atlas/waves/models.js.map +1 -1
- package/dist/atlas/waves/numerics.js.map +1 -1
- package/dist/atlas/witness-artifact.js.map +1 -1
- package/dist/atlas/witness-dominance.d.ts +4 -3
- package/dist/atlas/witness-dominance.d.ts.map +1 -1
- package/dist/atlas/witness-dominance.js +15 -5
- package/dist/atlas/witness-dominance.js.map +1 -1
- package/dist/atlas/witness-numeric.d.ts +8 -4
- package/dist/atlas/witness-numeric.d.ts.map +1 -1
- package/dist/atlas/witness-numeric.js +27 -2
- package/dist/atlas/witness-numeric.js.map +1 -1
- package/dist/atlas/witness-result.d.ts +7 -1
- package/dist/atlas/witness-result.d.ts.map +1 -1
- package/dist/atlas/witness-result.js.map +1 -1
- package/dist/atlas/witness-specs.js.map +1 -1
- package/dist/atlas/witness-symbolic.js.map +1 -1
- package/dist/atlas/witnesses/quantum-support.js.map +1 -1
- package/dist/bridges/caller-table.d.ts +1 -1
- package/dist/bridges/caller-table.d.ts.map +1 -1
- package/dist/bridges/caller-table.js.map +1 -1
- package/dist/bridges/carrier-sign.d.ts.map +1 -1
- package/dist/bridges/carrier-sign.js +8 -3
- package/dist/bridges/carrier-sign.js.map +1 -1
- package/dist/bridges/catalog-adapter.d.ts +12 -3
- package/dist/bridges/catalog-adapter.d.ts.map +1 -1
- package/dist/bridges/catalog-adapter.js +22 -14
- package/dist/bridges/catalog-adapter.js.map +1 -1
- package/dist/bridges/catalog-load.d.ts +19 -2
- package/dist/bridges/catalog-load.d.ts.map +1 -1
- package/dist/bridges/catalog-load.js +233 -14
- package/dist/bridges/catalog-load.js.map +1 -1
- package/dist/bridges/catalog-types.d.ts +96 -27
- package/dist/bridges/catalog-types.d.ts.map +1 -1
- package/dist/bridges/catalog-types.js.map +1 -1
- package/dist/bridges/coefficient-statement.js +1 -5
- package/dist/bridges/coefficient-statement.js.map +1 -1
- package/dist/bridges/confrontation-coverage.js.map +1 -1
- package/dist/bridges/confrontations.d.ts +1 -1
- package/dist/bridges/confrontations.d.ts.map +1 -1
- package/dist/bridges/confrontations.js +1 -1
- package/dist/bridges/confrontations.js.map +1 -1
- package/dist/bridges/evaluation-errors.d.ts +89 -0
- package/dist/bridges/evaluation-errors.d.ts.map +1 -0
- package/dist/bridges/evaluation-errors.js +136 -0
- package/dist/bridges/evaluation-errors.js.map +1 -0
- package/dist/bridges/evaluator-inputs.d.ts +5 -3
- package/dist/bridges/evaluator-inputs.d.ts.map +1 -1
- package/dist/bridges/evaluator-inputs.js +24 -24
- package/dist/bridges/evaluator-inputs.js.map +1 -1
- package/dist/bridges/evaluators.d.ts +48 -8
- package/dist/bridges/evaluators.d.ts.map +1 -1
- package/dist/bridges/evaluators.js +173 -38
- package/dist/bridges/evaluators.js.map +1 -1
- package/dist/bridges/expr-parse.d.ts +38 -7
- package/dist/bridges/expr-parse.d.ts.map +1 -1
- package/dist/bridges/expr-parse.js +129 -156
- package/dist/bridges/expr-parse.js.map +1 -1
- package/dist/bridges/holds.d.ts +16 -8
- package/dist/bridges/holds.d.ts.map +1 -1
- package/dist/bridges/holds.js +130 -236
- package/dist/bridges/holds.js.map +1 -1
- package/dist/bridges/index.d.ts +15 -14
- package/dist/bridges/index.d.ts.map +1 -1
- package/dist/bridges/index.js +14 -15
- package/dist/bridges/index.js.map +1 -1
- package/dist/bridges/input-contract.d.ts +65 -0
- package/dist/bridges/input-contract.d.ts.map +1 -0
- package/dist/bridges/input-contract.js +97 -0
- package/dist/bridges/input-contract.js.map +1 -0
- package/dist/bridges/membership.d.ts +5 -3
- package/dist/bridges/membership.d.ts.map +1 -1
- package/dist/bridges/membership.js +5 -6
- package/dist/bridges/membership.js.map +1 -1
- package/dist/bridges/notices.d.ts +11 -0
- package/dist/bridges/notices.d.ts.map +1 -0
- package/dist/bridges/notices.js +22 -0
- package/dist/bridges/notices.js.map +1 -0
- package/dist/bridges/observations/types.js.map +1 -1
- package/dist/bridges/rejected.d.ts +11 -17
- package/dist/bridges/rejected.d.ts.map +1 -1
- package/dist/bridges/rejected.js +13 -68
- package/dist/bridges/rejected.js.map +1 -1
- package/dist/bridges/relation-eval.d.ts +5 -6
- package/dist/bridges/relation-eval.d.ts.map +1 -1
- package/dist/bridges/relation-eval.js +9 -38
- package/dist/bridges/relation-eval.js.map +1 -1
- package/dist/bridges/rhs-registry.js.map +1 -1
- package/dist/bridges/sensitivity.d.ts +11 -3
- package/dist/bridges/sensitivity.d.ts.map +1 -1
- package/dist/bridges/sensitivity.js +24 -10
- package/dist/bridges/sensitivity.js.map +1 -1
- package/dist/bridges/tensor-index.js.map +1 -1
- package/dist/bridges/types.d.ts +1 -7
- package/dist/bridges/types.d.ts.map +1 -1
- package/dist/bridges/types.js +1 -4
- package/dist/bridges/types.js.map +1 -1
- package/dist/canonical/canonical-equation.d.ts +31 -0
- package/dist/canonical/canonical-equation.d.ts.map +1 -1
- package/dist/canonical/canonical-equation.js.map +1 -1
- package/dist/canonical/dimensional-fields.js.map +1 -1
- package/dist/canonical/entries/_l1-build.js.map +1 -1
- package/dist/canonical/entries/atomic.d.ts.map +1 -1
- package/dist/canonical/entries/atomic.js +11 -1
- package/dist/canonical/entries/atomic.js.map +1 -1
- package/dist/canonical/entries/condensed-matter.d.ts.map +1 -1
- package/dist/canonical/entries/condensed-matter.js +7 -4
- package/dist/canonical/entries/condensed-matter.js.map +1 -1
- package/dist/canonical/entries/dimensional-classics.d.ts.map +1 -1
- package/dist/canonical/entries/dimensional-classics.js +50 -2
- package/dist/canonical/entries/dimensional-classics.js.map +1 -1
- package/dist/canonical/entries/electromagnetism.d.ts.map +1 -1
- package/dist/canonical/entries/electromagnetism.js +32 -2
- package/dist/canonical/entries/electromagnetism.js.map +1 -1
- package/dist/canonical/entries/fluids-waves.d.ts.map +1 -1
- package/dist/canonical/entries/fluids-waves.js +34 -0
- package/dist/canonical/entries/fluids-waves.js.map +1 -1
- package/dist/canonical/entries/mechanics.d.ts.map +1 -1
- package/dist/canonical/entries/mechanics.js +24 -0
- package/dist/canonical/entries/mechanics.js.map +1 -1
- package/dist/canonical/entries/nonmonomial.d.ts.map +1 -1
- package/dist/canonical/entries/nonmonomial.js +42 -24
- package/dist/canonical/entries/nonmonomial.js.map +1 -1
- package/dist/canonical/entries/relativity.d.ts.map +1 -1
- package/dist/canonical/entries/relativity.js +6 -0
- package/dist/canonical/entries/relativity.js.map +1 -1
- package/dist/canonical/entries/statistical-mechanics.d.ts.map +1 -1
- package/dist/canonical/entries/statistical-mechanics.js +24 -5
- package/dist/canonical/entries/statistical-mechanics.js.map +1 -1
- package/dist/canonical/entries/thermo-nuclear-cosmo.d.ts.map +1 -1
- package/dist/canonical/entries/thermo-nuclear-cosmo.js +15 -0
- package/dist/canonical/entries/thermo-nuclear-cosmo.js.map +1 -1
- package/dist/canonical/linkage.d.ts +29 -4
- package/dist/canonical/linkage.d.ts.map +1 -1
- package/dist/canonical/linkage.js +31 -29
- package/dist/canonical/linkage.js.map +1 -1
- package/dist/canonical/normal-form.d.ts +0 -8
- package/dist/canonical/normal-form.d.ts.map +1 -1
- package/dist/canonical/normal-form.js +17 -12
- package/dist/canonical/normal-form.js.map +1 -1
- package/dist/canonical/registry.js.map +1 -1
- package/dist/canonical/residual.js.map +1 -1
- package/dist/canonical/seed-l-layer.d.ts +7 -1
- package/dist/canonical/seed-l-layer.d.ts.map +1 -1
- package/dist/canonical/seed-l-layer.js +7 -1
- package/dist/canonical/seed-l-layer.js.map +1 -1
- package/dist/canonical/structural.d.ts +21 -0
- package/dist/canonical/structural.d.ts.map +1 -1
- package/dist/canonical/structural.js +24 -4
- package/dist/canonical/structural.js.map +1 -1
- package/dist/cases/brownian-sphere.js +4 -4
- package/dist/cases/brownian-sphere.js.map +1 -1
- package/dist/cases/damped-resonator.js +2 -2
- package/dist/cases/damped-resonator.js.map +1 -1
- package/dist/cases/index.d.ts +9 -2
- package/dist/cases/index.d.ts.map +1 -1
- package/dist/cases/index.js +26 -7
- package/dist/cases/index.js.map +1 -1
- package/dist/cases/kepler-rv.js +6 -6
- package/dist/cases/kepler-rv.js.map +1 -1
- package/dist/cases/lumped-cooling.js +1 -1
- package/dist/cases/lumped-cooling.js.map +1 -1
- package/dist/cases/quadrature.js.map +1 -1
- package/dist/cases/resistor-noise.js +3 -3
- package/dist/cases/resistor-noise.js.map +1 -1
- package/dist/cases/skin-depth.js.map +1 -1
- package/dist/cases/types.js.map +1 -1
- package/dist/cli/args.d.ts +7 -2
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +18 -2
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/bindings.d.ts +13 -0
- package/dist/cli/bindings.d.ts.map +1 -0
- package/dist/cli/bindings.js +32 -0
- package/dist/cli/bindings.js.map +1 -0
- package/dist/cli/closed-form-range.js.map +1 -1
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/commands/_atlas-map.d.ts +3 -3
- package/dist/cli/commands/_atlas-map.d.ts.map +1 -1
- package/dist/cli/commands/_atlas-map.js +43 -18
- package/dist/cli/commands/_atlas-map.js.map +1 -1
- package/dist/cli/commands/_atlas-route.js.map +1 -1
- package/dist/cli/commands/_discovery-opts.d.ts +2 -1
- package/dist/cli/commands/_discovery-opts.d.ts.map +1 -1
- package/dist/cli/commands/_discovery-opts.js +48 -18
- package/dist/cli/commands/_discovery-opts.js.map +1 -1
- package/dist/cli/commands/atlas.d.ts.map +1 -1
- package/dist/cli/commands/atlas.js +7 -12
- package/dist/cli/commands/atlas.js.map +1 -1
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/audit.js +13 -21
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/cli/commands/axes.js.map +1 -1
- package/dist/cli/commands/candidates.d.ts.map +1 -1
- package/dist/cli/commands/candidates.js +16 -8
- package/dist/cli/commands/candidates.js.map +1 -1
- package/dist/cli/commands/canonical.js.map +1 -1
- package/dist/cli/commands/chain.js +1 -1
- package/dist/cli/commands/chain.js.map +1 -1
- package/dist/cli/commands/confront.d.ts.map +1 -1
- package/dist/cli/commands/confront.js +22 -14
- package/dist/cli/commands/confront.js.map +1 -1
- package/dist/cli/commands/connectors.d.ts.map +1 -1
- package/dist/cli/commands/connectors.js +8 -9
- package/dist/cli/commands/connectors.js.map +1 -1
- package/dist/cli/commands/coverage.js.map +1 -1
- package/dist/cli/commands/derive.d.ts.map +1 -1
- package/dist/cli/commands/derive.js +50 -26
- package/dist/cli/commands/derive.js.map +1 -1
- package/dist/cli/commands/discover.d.ts.map +1 -1
- package/dist/cli/commands/discover.js +18 -13
- package/dist/cli/commands/discover.js.map +1 -1
- package/dist/cli/commands/eval.d.ts.map +1 -1
- package/dist/cli/commands/eval.js +29 -26
- package/dist/cli/commands/eval.js.map +1 -1
- package/dist/cli/commands/evaluate.d.ts +1 -35
- package/dist/cli/commands/evaluate.d.ts.map +1 -1
- package/dist/cli/commands/evaluate.js +99 -208
- package/dist/cli/commands/evaluate.js.map +1 -1
- package/dist/cli/commands/explain.d.ts.map +1 -1
- package/dist/cli/commands/explain.js +57 -45
- package/dist/cli/commands/explain.js.map +1 -1
- package/dist/cli/commands/frontier.js.map +1 -1
- package/dist/cli/commands/ground.d.ts.map +1 -1
- package/dist/cli/commands/ground.js +41 -11
- package/dist/cli/commands/ground.js.map +1 -1
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/map.d.ts.map +1 -1
- package/dist/cli/commands/map.js +84 -92
- package/dist/cli/commands/map.js.map +1 -1
- package/dist/cli/commands/metric.d.ts.map +1 -1
- package/dist/cli/commands/metric.js +53 -15
- package/dist/cli/commands/metric.js.map +1 -1
- package/dist/cli/commands/path.js +4 -4
- package/dist/cli/commands/path.js.map +1 -1
- package/dist/cli/commands/predict.js.map +1 -1
- package/dist/cli/commands/priority.js.map +1 -1
- package/dist/cli/commands/probe.d.ts.map +1 -1
- package/dist/cli/commands/probe.js +50 -26
- package/dist/cli/commands/probe.js.map +1 -1
- package/dist/cli/commands/recover.js +1 -1
- package/dist/cli/commands/recover.js.map +1 -1
- package/dist/cli/commands/regime.d.ts +5 -4
- package/dist/cli/commands/regime.d.ts.map +1 -1
- package/dist/cli/commands/regime.js +25 -27
- package/dist/cli/commands/regime.js.map +1 -1
- package/dist/cli/commands/retrieve.d.ts.map +1 -1
- package/dist/cli/commands/retrieve.js +22 -14
- package/dist/cli/commands/retrieve.js.map +1 -1
- package/dist/cli/commands/search.d.ts.map +1 -1
- package/dist/cli/commands/search.js +8 -4
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/symbolic.d.ts.map +1 -1
- package/dist/cli/commands/symbolic.js +14 -7
- package/dist/cli/commands/symbolic.js.map +1 -1
- package/dist/cli/commands/testplan.js +4 -4
- package/dist/cli/commands/testplan.js.map +1 -1
- package/dist/cli/conventions.d.ts +6 -7
- package/dist/cli/conventions.d.ts.map +1 -1
- package/dist/cli/conventions.js +19 -28
- package/dist/cli/conventions.js.map +1 -1
- package/dist/cli/determination.js.map +1 -1
- package/dist/cli/errors.js.map +1 -1
- package/dist/cli/euler-guard.d.ts +13 -2
- package/dist/cli/euler-guard.d.ts.map +1 -1
- package/dist/cli/euler-guard.js +17 -3
- package/dist/cli/euler-guard.js.map +1 -1
- package/dist/cli/eval-numbers.d.ts +4 -9
- package/dist/cli/eval-numbers.d.ts.map +1 -1
- package/dist/cli/eval-numbers.js +11 -41
- package/dist/cli/eval-numbers.js.map +1 -1
- package/dist/cli/expr-print.d.ts +29 -2
- package/dist/cli/expr-print.d.ts.map +1 -1
- package/dist/cli/expr-print.js +46 -2
- package/dist/cli/expr-print.js.map +1 -1
- package/dist/cli/flag-help.js.map +1 -1
- package/dist/cli/graphs.js.map +1 -1
- package/dist/cli/library-defaults.d.ts +19 -0
- package/dist/cli/library-defaults.d.ts.map +1 -0
- package/dist/cli/library-defaults.js +22 -0
- package/dist/cli/library-defaults.js.map +1 -0
- package/dist/cli/main.js +7 -3
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/map-evidence.js.map +1 -1
- package/dist/cli/output.d.ts +3 -6
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js.map +1 -1
- package/dist/cli/published-url.d.ts +2 -0
- package/dist/cli/published-url.d.ts.map +1 -1
- package/dist/cli/published-url.js +5 -0
- package/dist/cli/published-url.js.map +1 -1
- package/dist/cli/record-reach.d.ts +6 -0
- package/dist/cli/record-reach.d.ts.map +1 -1
- package/dist/cli/record-reach.js +16 -10
- package/dist/cli/record-reach.js.map +1 -1
- package/dist/cli/record-tables.d.ts +2 -1
- package/dist/cli/record-tables.d.ts.map +1 -1
- package/dist/cli/record-tables.js +8 -3
- package/dist/cli/record-tables.js.map +1 -1
- package/dist/cli/record.d.ts.map +1 -1
- package/dist/cli/record.js +31 -12
- package/dist/cli/record.js.map +1 -1
- package/dist/cli/search-index.d.ts +5 -0
- package/dist/cli/search-index.d.ts.map +1 -1
- package/dist/cli/search-index.js +12 -1
- package/dist/cli/search-index.js.map +1 -1
- package/dist/cli/statuses.js.map +1 -1
- package/dist/cli/top-level-help.js.map +1 -1
- package/dist/cli/version.js.map +1 -1
- package/dist/cli-api.d.ts +57 -18
- package/dist/cli-api.d.ts.map +1 -1
- package/dist/cli-api.js +49 -21
- package/dist/cli-api.js.map +1 -1
- package/dist/composition/adjudication.d.ts +8 -30
- package/dist/composition/adjudication.d.ts.map +1 -1
- package/dist/composition/adjudication.js +15 -67
- package/dist/composition/adjudication.js.map +1 -1
- package/dist/composition/aliases.d.ts +1 -1
- package/dist/composition/aliases.d.ts.map +1 -1
- package/dist/composition/aliases.js +10 -20
- package/dist/composition/aliases.js.map +1 -1
- package/dist/composition/audit-coverage.d.ts +2 -0
- package/dist/composition/audit-coverage.d.ts.map +1 -1
- package/dist/composition/audit-coverage.js.map +1 -1
- package/dist/composition/axes.d.ts +12 -0
- package/dist/composition/axes.d.ts.map +1 -1
- package/dist/composition/axes.js +18 -6
- package/dist/composition/axes.js.map +1 -1
- package/dist/composition/axis-audit.js.map +1 -1
- package/dist/composition/bridge-analysis.d.ts +0 -14
- package/dist/composition/bridge-analysis.d.ts.map +1 -1
- package/dist/composition/bridge-analysis.js +66 -57
- package/dist/composition/bridge-analysis.js.map +1 -1
- package/dist/composition/bridge-prediction.d.ts +5 -1
- package/dist/composition/bridge-prediction.d.ts.map +1 -1
- package/dist/composition/bridge-prediction.js +12 -16
- package/dist/composition/bridge-prediction.js.map +1 -1
- package/dist/composition/buckingham-filter.js.map +1 -1
- package/dist/composition/canonical-compare.d.ts.map +1 -1
- package/dist/composition/canonical-compare.js +12 -2
- package/dist/composition/canonical-compare.js.map +1 -1
- package/dist/composition/canonical-graph.d.ts +15 -18
- package/dist/composition/canonical-graph.d.ts.map +1 -1
- package/dist/composition/canonical-graph.js +59 -85
- package/dist/composition/canonical-graph.js.map +1 -1
- package/dist/composition/canonical-json.js.map +1 -1
- package/dist/composition/canonical-prefactors.d.ts +10 -29
- package/dist/composition/canonical-prefactors.d.ts.map +1 -1
- package/dist/composition/canonical-prefactors.js +15 -202
- package/dist/composition/canonical-prefactors.js.map +1 -1
- package/dist/composition/catalog-graph.d.ts.map +1 -1
- package/dist/composition/catalog-graph.js +6 -20
- package/dist/composition/catalog-graph.js.map +1 -1
- package/dist/composition/chain-candidate.d.ts +2 -0
- package/dist/composition/chain-candidate.d.ts.map +1 -1
- package/dist/composition/chain-candidate.js +2 -0
- package/dist/composition/chain-candidate.js.map +1 -1
- package/dist/composition/chain-match.js.map +1 -1
- package/dist/composition/chain-regime.js.map +1 -1
- package/dist/composition/chain-result.js.map +1 -1
- package/dist/composition/compose-surface.js.map +1 -1
- package/dist/composition/compose-symbolic.js.map +1 -1
- package/dist/composition/compose.d.ts.map +1 -1
- package/dist/composition/compose.js +154 -36
- package/dist/composition/compose.js.map +1 -1
- package/dist/composition/composition-recovery.js.map +1 -1
- package/dist/composition/consequence.d.ts.map +1 -1
- package/dist/composition/consequence.js +15 -6
- package/dist/composition/consequence.js.map +1 -1
- package/dist/composition/consistency.js.map +1 -1
- package/dist/composition/descriptor.d.ts +1 -1
- package/dist/composition/descriptor.d.ts.map +1 -1
- package/dist/composition/descriptor.js.map +1 -1
- package/dist/composition/dimension-adjacency.js.map +1 -1
- package/dist/composition/discovery.d.ts +67 -7
- package/dist/composition/discovery.d.ts.map +1 -1
- package/dist/composition/discovery.js +83 -23
- package/dist/composition/discovery.js.map +1 -1
- package/dist/composition/edge.d.ts +19 -22
- package/dist/composition/edge.d.ts.map +1 -1
- package/dist/composition/edge.js +25 -28
- package/dist/composition/edge.js.map +1 -1
- package/dist/composition/enumerate.d.ts +2 -2
- package/dist/composition/enumerate.d.ts.map +1 -1
- package/dist/composition/enumerate.js.map +1 -1
- package/dist/composition/evaluate-relation.d.ts +29 -5
- package/dist/composition/evaluate-relation.d.ts.map +1 -1
- package/dist/composition/evaluate-relation.js +100 -72
- package/dist/composition/evaluate-relation.js.map +1 -1
- package/dist/composition/explain.d.ts +14 -4
- package/dist/composition/explain.d.ts.map +1 -1
- package/dist/composition/explain.js +53 -19
- package/dist/composition/explain.js.map +1 -1
- package/dist/composition/expr-eval.d.ts.map +1 -1
- package/dist/composition/expr-eval.js +2 -1
- package/dist/composition/expr-eval.js.map +1 -1
- package/dist/composition/expr-simplify.d.ts.map +1 -1
- package/dist/composition/expr-simplify.js +9 -39
- package/dist/composition/expr-simplify.js.map +1 -1
- package/dist/composition/expr-subst.js.map +1 -1
- package/dist/composition/formula-shape.d.ts +9 -0
- package/dist/composition/formula-shape.d.ts.map +1 -1
- package/dist/composition/formula-shape.js +54 -0
- package/dist/composition/formula-shape.js.map +1 -1
- package/dist/composition/frontier-account.d.ts +3 -2
- package/dist/composition/frontier-account.d.ts.map +1 -1
- package/dist/composition/frontier-account.js +7 -3
- package/dist/composition/frontier-account.js.map +1 -1
- package/dist/composition/graph-viz-svg.js.map +1 -1
- package/dist/composition/graph-viz.js.map +1 -1
- package/dist/composition/grounding.js.map +1 -1
- package/dist/composition/identifiability.js.map +1 -1
- package/dist/composition/index.d.ts +9 -5
- package/dist/composition/index.d.ts.map +1 -1
- package/dist/composition/index.js +7 -4
- package/dist/composition/index.js.map +1 -1
- package/dist/composition/mathts-quiet.d.ts +28 -0
- package/dist/composition/mathts-quiet.d.ts.map +1 -0
- package/dist/composition/mathts-quiet.js +56 -0
- package/dist/composition/mathts-quiet.js.map +1 -0
- package/dist/composition/mathts-scalar-symbols.d.ts.map +1 -1
- package/dist/composition/mathts-scalar-symbols.js +18 -34
- package/dist/composition/mathts-scalar-symbols.js.map +1 -1
- package/dist/composition/not-composable-seeds.d.ts +3 -1
- package/dist/composition/not-composable-seeds.d.ts.map +1 -1
- package/dist/composition/not-composable-seeds.js +2 -0
- package/dist/composition/not-composable-seeds.js.map +1 -1
- package/dist/composition/probe/backend-protocol.js.map +1 -1
- package/dist/composition/probe/candidate-store.js.map +1 -1
- package/dist/composition/probe/corpus.js.map +1 -1
- package/dist/composition/probe/dataset.js.map +1 -1
- package/dist/composition/probe/experiment-design.js.map +1 -1
- package/dist/composition/probe/expression-gaps.js.map +1 -1
- package/dist/composition/probe/falsify.d.ts +14 -3
- package/dist/composition/probe/falsify.d.ts.map +1 -1
- package/dist/composition/probe/falsify.js +14 -27
- package/dist/composition/probe/falsify.js.map +1 -1
- package/dist/composition/probe/fingerprint.js.map +1 -1
- package/dist/composition/probe/fit.d.ts +1 -1
- package/dist/composition/probe/fit.d.ts.map +1 -1
- package/dist/composition/probe/fit.js +2 -1
- package/dist/composition/probe/fit.js.map +1 -1
- package/dist/composition/probe/frontier.js.map +1 -1
- package/dist/composition/probe/generator.js.map +1 -1
- package/dist/composition/probe/index.d.ts +4 -2
- package/dist/composition/probe/index.d.ts.map +1 -1
- package/dist/composition/probe/index.js +4 -2
- package/dist/composition/probe/index.js.map +1 -1
- package/dist/composition/probe/limits.js.map +1 -1
- package/dist/composition/probe/metadata.js.map +1 -1
- package/dist/composition/probe/pipeline.d.ts +5 -0
- package/dist/composition/probe/pipeline.d.ts.map +1 -1
- package/dist/composition/probe/pipeline.js +13 -6
- package/dist/composition/probe/pipeline.js.map +1 -1
- package/dist/composition/probe/problem.d.ts +8 -0
- package/dist/composition/probe/problem.d.ts.map +1 -1
- package/dist/composition/probe/problem.js +78 -12
- package/dist/composition/probe/problem.js.map +1 -1
- package/dist/composition/probe/report.js.map +1 -1
- package/dist/composition/probe/residual.js.map +1 -1
- package/dist/composition/probe/run-manifest.js +2 -2
- package/dist/composition/probe/run-manifest.js.map +1 -1
- package/dist/composition/probe/scoring.d.ts +2 -1
- package/dist/composition/probe/scoring.d.ts.map +1 -1
- package/dist/composition/probe/scoring.js +21 -7
- package/dist/composition/probe/scoring.js.map +1 -1
- package/dist/composition/probe/search-budget.js.map +1 -1
- package/dist/composition/probe/serialize.js.map +1 -1
- package/dist/composition/probe/structure.js.map +1 -1
- package/dist/composition/probe/study.d.ts +4 -3
- package/dist/composition/probe/study.d.ts.map +1 -1
- package/dist/composition/probe/study.js +5 -3
- package/dist/composition/probe/study.js.map +1 -1
- package/dist/composition/probe/types.d.ts +3 -1
- package/dist/composition/probe/types.d.ts.map +1 -1
- package/dist/composition/probe/types.js +2 -0
- package/dist/composition/probe/types.js.map +1 -1
- package/dist/composition/proposed-bridges.d.ts +11 -4
- package/dist/composition/proposed-bridges.d.ts.map +1 -1
- package/dist/composition/proposed-bridges.js +14 -6
- package/dist/composition/proposed-bridges.js.map +1 -1
- package/dist/composition/quantities.d.ts +0 -4
- package/dist/composition/quantities.d.ts.map +1 -1
- package/dist/composition/quantities.js +5 -5
- package/dist/composition/quantities.js.map +1 -1
- package/dist/composition/quantity.d.ts +18 -2
- package/dist/composition/quantity.d.ts.map +1 -1
- package/dist/composition/quantity.js +35 -6
- package/dist/composition/quantity.js.map +1 -1
- package/dist/composition/representative-values.js.map +1 -1
- package/dist/composition/retrodiction.d.ts +18 -0
- package/dist/composition/retrodiction.d.ts.map +1 -1
- package/dist/composition/retrodiction.js +37 -7
- package/dist/composition/retrodiction.js.map +1 -1
- package/dist/composition/uncertainty.js.map +1 -1
- package/dist/composition/user-equation.d.ts +11 -7
- package/dist/composition/user-equation.d.ts.map +1 -1
- package/dist/composition/user-equation.js +24 -26
- package/dist/composition/user-equation.js.map +1 -1
- package/dist/core/axes-registry.d.ts +8 -5
- package/dist/core/axes-registry.d.ts.map +1 -1
- package/dist/core/axes-registry.js.map +1 -1
- package/dist/core/cell.js.map +1 -1
- package/dist/core/constants.d.ts +35 -12
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +46 -15
- package/dist/core/constants.js.map +1 -1
- package/dist/core/data-file.d.ts +27 -0
- package/dist/core/data-file.d.ts.map +1 -0
- package/dist/core/data-file.js +48 -0
- package/dist/core/data-file.js.map +1 -0
- package/dist/core/flux-rules.js +1 -1
- package/dist/core/flux-rules.js.map +1 -1
- package/dist/core/json-schema.d.ts +27 -0
- package/dist/core/json-schema.d.ts.map +1 -0
- package/dist/core/json-schema.js +177 -0
- package/dist/core/json-schema.js.map +1 -0
- package/dist/core/labeled-tensor.d.ts +6 -1
- package/dist/core/labeled-tensor.d.ts.map +1 -1
- package/dist/core/labeled-tensor.js +18 -8
- package/dist/core/labeled-tensor.js.map +1 -1
- package/dist/core/regime-registry.d.ts +6 -2
- package/dist/core/regime-registry.d.ts.map +1 -1
- package/dist/core/regime-registry.js.map +1 -1
- package/dist/core/regime-rule-install.js.map +1 -1
- package/dist/core/regimes-builtins.js.map +1 -1
- package/dist/core/tensor.d.ts +7 -4
- package/dist/core/tensor.d.ts.map +1 -1
- package/dist/core/tensor.js +40 -8
- package/dist/core/tensor.js.map +1 -1
- package/dist/core/types.d.ts +3 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +16 -14
- package/dist/core/types.js.map +1 -1
- package/dist/core/universal-index.js.map +1 -1
- package/dist/diff/bridge-ast-gradient.d.ts +4 -5
- package/dist/diff/bridge-ast-gradient.d.ts.map +1 -1
- package/dist/diff/bridge-ast-gradient.js +16 -23
- package/dist/diff/bridge-ast-gradient.js.map +1 -1
- package/dist/diff/bridge-gradient.d.ts +24 -80
- package/dist/diff/bridge-gradient.d.ts.map +1 -1
- package/dist/diff/bridge-gradient.js +21 -98
- package/dist/diff/bridge-gradient.js.map +1 -1
- package/dist/diff/bridge-specs.d.ts +18 -6
- package/dist/diff/bridge-specs.d.ts.map +1 -1
- package/dist/diff/bridge-specs.js +17 -5
- package/dist/diff/bridge-specs.js.map +1 -1
- package/dist/dimensional/algebra.js.map +1 -1
- package/dist/dimensional/ast-builders.d.ts +5 -4
- package/dist/dimensional/ast-builders.d.ts.map +1 -1
- package/dist/dimensional/ast-builders.js +6 -5
- package/dist/dimensional/ast-builders.js.map +1 -1
- package/dist/dimensional/ast-types.js.map +1 -1
- package/dist/dimensional/bridge-check.d.ts.map +1 -1
- package/dist/dimensional/bridge-check.js +3 -5
- package/dist/dimensional/bridge-check.js.map +1 -1
- package/dist/dimensional/buckingham.js.map +1 -1
- package/dist/dimensional/connection-validators.d.ts +2 -1
- package/dist/dimensional/connection-validators.d.ts.map +1 -1
- package/dist/dimensional/connection-validators.js.map +1 -1
- package/dist/dimensional/connection.js.map +1 -1
- package/dist/dimensional/constant-rows.d.ts +54 -0
- package/dist/dimensional/constant-rows.d.ts.map +1 -0
- package/dist/dimensional/constant-rows.js +115 -0
- package/dist/dimensional/constant-rows.js.map +1 -0
- package/dist/dimensional/constants.d.ts +7 -17
- package/dist/dimensional/constants.d.ts.map +1 -1
- package/dist/dimensional/constants.js +12 -21
- package/dist/dimensional/constants.js.map +1 -1
- package/dist/dimensional/curvature-composite.js.map +1 -1
- package/dist/dimensional/curvature-invariants.js.map +1 -1
- package/dist/dimensional/curvature.js.map +1 -1
- package/dist/dimensional/dimension-inference.js.map +1 -1
- package/dist/dimensional/dimension-spec.d.ts +21 -6
- package/dist/dimensional/dimension-spec.d.ts.map +1 -1
- package/dist/dimensional/dimension-spec.js +150 -160
- package/dist/dimensional/dimension-spec.js.map +1 -1
- package/dist/dimensional/einstein-equation.js.map +1 -1
- package/dist/dimensional/errors.d.ts +3 -1
- package/dist/dimensional/errors.d.ts.map +1 -1
- package/dist/dimensional/errors.js +2 -2
- package/dist/dimensional/errors.js.map +1 -1
- package/dist/dimensional/exact-scale.d.ts +79 -0
- package/dist/dimensional/exact-scale.d.ts.map +1 -0
- package/dist/dimensional/exact-scale.js +222 -0
- package/dist/dimensional/exact-scale.js.map +1 -0
- package/dist/dimensional/field-equation-helpers.js.map +1 -1
- package/dist/dimensional/formula-names.d.ts +13 -12
- package/dist/dimensional/formula-names.d.ts.map +1 -1
- package/dist/dimensional/formula-names.js +28 -51
- package/dist/dimensional/formula-names.js.map +1 -1
- package/dist/dimensional/fresh-label.js.map +1 -1
- package/dist/dimensional/friedmann-equation.d.ts +3 -3
- package/dist/dimensional/friedmann-equation.js +3 -3
- package/dist/dimensional/friedmann-equation.js.map +1 -1
- package/dist/dimensional/gauge-field.d.ts +2 -3
- package/dist/dimensional/gauge-field.d.ts.map +1 -1
- package/dist/dimensional/gauge-field.js +0 -1
- package/dist/dimensional/gauge-field.js.map +1 -1
- package/dist/dimensional/hyphen-names.d.ts.map +1 -1
- package/dist/dimensional/hyphen-names.js +8 -0
- package/dist/dimensional/hyphen-names.js.map +1 -1
- package/dist/dimensional/killing-validators.js.map +1 -1
- package/dist/dimensional/klein-gordon-equation.js.map +1 -1
- package/dist/dimensional/metric-validators.d.ts +2 -1
- package/dist/dimensional/metric-validators.d.ts.map +1 -1
- package/dist/dimensional/metric-validators.js.map +1 -1
- package/dist/dimensional/metric.js.map +1 -1
- package/dist/dimensional/natural-units.js.map +1 -1
- package/dist/dimensional/quantity-registry.d.ts +23 -1
- package/dist/dimensional/quantity-registry.d.ts.map +1 -1
- package/dist/dimensional/quantity-registry.js +55 -18
- package/dist/dimensional/quantity-registry.js.map +1 -1
- package/dist/dimensional/rg-flow.js.map +1 -1
- package/dist/dimensional/stress-energy-validators.js.map +1 -1
- package/dist/dimensional/symbolic-constants.d.ts +63 -19
- package/dist/dimensional/symbolic-constants.d.ts.map +1 -1
- package/dist/dimensional/symbolic-constants.js +114 -92
- package/dist/dimensional/symbolic-constants.js.map +1 -1
- package/dist/dimensional/tensor-trace.js.map +1 -1
- package/dist/dimensional/tensor.js.map +1 -1
- package/dist/dimensional/types.js.map +1 -1
- package/dist/dimensional/unit-convention.d.ts +0 -2
- package/dist/dimensional/unit-convention.d.ts.map +1 -1
- package/dist/dimensional/unit-convention.js +2 -2
- package/dist/dimensional/unit-convention.js.map +1 -1
- package/dist/dimensional/unit-data.d.ts +70 -0
- package/dist/dimensional/unit-data.d.ts.map +1 -0
- package/dist/dimensional/unit-data.js +139 -0
- package/dist/dimensional/unit-data.js.map +1 -0
- package/dist/dimensional/units.d.ts +87 -24
- package/dist/dimensional/units.d.ts.map +1 -1
- package/dist/dimensional/units.js +290 -295
- package/dist/dimensional/units.js.map +1 -1
- package/dist/dimensional/validator-registry.js.map +1 -1
- package/dist/dimensional/validator.d.ts +0 -16
- package/dist/dimensional/validator.d.ts.map +1 -1
- package/dist/dimensional/validator.js +65 -29
- package/dist/dimensional/validator.js.map +1 -1
- package/dist/dimensional/weyl-validators.js.map +1 -1
- package/dist/index.d.ts +65 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -24
- package/dist/index.js.map +1 -1
- package/dist/numerical/bianchi-residual.js.map +1 -1
- package/dist/numerical/binding-value.d.ts +32 -7
- package/dist/numerical/binding-value.d.ts.map +1 -1
- package/dist/numerical/binding-value.js +218 -209
- package/dist/numerical/binding-value.js.map +1 -1
- package/dist/numerical/christoffel-flat.js.map +1 -1
- package/dist/numerical/connection-lowering-helpers.js.map +1 -1
- package/dist/numerical/covariant-eikonal.d.ts.map +1 -1
- package/dist/numerical/covariant-eikonal.js +2 -2
- package/dist/numerical/covariant-eikonal.js.map +1 -1
- package/dist/numerical/curvature-lowering-helpers.d.ts +20 -0
- package/dist/numerical/curvature-lowering-helpers.d.ts.map +1 -1
- package/dist/numerical/curvature-lowering-helpers.js +6 -3
- package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
- package/dist/numerical/derivative-lowering.js.map +1 -1
- package/dist/numerical/einstein-equation.js.map +1 -1
- package/dist/numerical/engine-registry.js.map +1 -1
- package/dist/numerical/errors.d.ts +7 -3
- package/dist/numerical/errors.d.ts.map +1 -1
- package/dist/numerical/errors.js +5 -5
- package/dist/numerical/errors.js.map +1 -1
- package/dist/numerical/evaluator-uncertainty.d.ts +34 -0
- package/dist/numerical/evaluator-uncertainty.d.ts.map +1 -0
- package/dist/numerical/evaluator-uncertainty.js +134 -0
- package/dist/numerical/evaluator-uncertainty.js.map +1 -0
- package/dist/numerical/formula-contract.d.ts +67 -7
- package/dist/numerical/formula-contract.d.ts.map +1 -1
- package/dist/numerical/formula-contract.js +68 -42
- package/dist/numerical/formula-contract.js.map +1 -1
- package/dist/numerical/formula-dimension.d.ts +17 -7
- package/dist/numerical/formula-dimension.d.ts.map +1 -1
- package/dist/numerical/formula-dimension.js +120 -44
- package/dist/numerical/formula-dimension.js.map +1 -1
- package/dist/numerical/formula-mathts.d.ts.map +1 -1
- package/dist/numerical/formula-mathts.js +10 -3
- package/dist/numerical/formula-mathts.js.map +1 -1
- package/dist/numerical/formula-registry.d.ts +13 -3
- package/dist/numerical/formula-registry.d.ts.map +1 -1
- package/dist/numerical/formula-registry.js +7 -2
- package/dist/numerical/formula-registry.js.map +1 -1
- package/dist/numerical/geodesic-integrator.js.map +1 -1
- package/dist/numerical/geometrized.js.map +1 -1
- package/dist/numerical/gl4-integrator.d.ts +28 -27
- package/dist/numerical/gl4-integrator.d.ts.map +1 -1
- package/dist/numerical/gl4-integrator.js +44 -45
- package/dist/numerical/gl4-integrator.js.map +1 -1
- package/dist/numerical/grid-field.js.map +1 -1
- package/dist/numerical/index.js.map +1 -1
- package/dist/numerical/input-validation.d.ts +3 -6
- package/dist/numerical/input-validation.d.ts.map +1 -1
- package/dist/numerical/input-validation.js +4 -8
- package/dist/numerical/input-validation.js.map +1 -1
- package/dist/numerical/killing.d.ts +8 -5
- package/dist/numerical/killing.d.ts.map +1 -1
- package/dist/numerical/killing.js.map +1 -1
- package/dist/numerical/klein-gordon.js.map +1 -1
- package/dist/numerical/kretschmann.js.map +1 -1
- package/dist/numerical/lowering-utils.js.map +1 -1
- package/dist/numerical/lowering.d.ts.map +1 -1
- package/dist/numerical/lowering.js +7 -17
- package/dist/numerical/lowering.js.map +1 -1
- package/dist/numerical/mathts-engine.d.ts.map +1 -1
- package/dist/numerical/mathts-engine.js +11 -6
- package/dist/numerical/mathts-engine.js.map +1 -1
- package/dist/numerical/metric-inverse.js.map +1 -1
- package/dist/numerical/null-ic.js.map +1 -1
- package/dist/numerical/null-ray-integrator.js +4 -4
- package/dist/numerical/null-ray-integrator.js.map +1 -1
- package/dist/numerical/painleve-gullstrand-metric.js.map +1 -1
- package/dist/numerical/pderiv.d.ts.map +1 -1
- package/dist/numerical/pderiv.js +9 -2
- package/dist/numerical/pderiv.js.map +1 -1
- package/dist/numerical/perihelion-finder.js.map +1 -1
- package/dist/numerical/quadrature.d.ts +5 -2
- package/dist/numerical/quadrature.d.ts.map +1 -1
- package/dist/numerical/quadrature.js +20 -3
- package/dist/numerical/quadrature.js.map +1 -1
- package/dist/numerical/spacetime-metrics.d.ts +17 -19
- package/dist/numerical/spacetime-metrics.d.ts.map +1 -1
- package/dist/numerical/spacetime-metrics.js +158 -250
- package/dist/numerical/spacetime-metrics.js.map +1 -1
- package/dist/numerical/strides.js.map +1 -1
- package/dist/numerical/tensor-engine.d.ts +9 -5
- package/dist/numerical/tensor-engine.d.ts.map +1 -1
- package/dist/numerical/tensor-engine.js.map +1 -1
- package/dist/numerical/types.js.map +1 -1
- package/dist/numerical/weyl-lowering.js.map +1 -1
- package/dist/relations/category.js.map +1 -1
- package/dist/relations/composition-table.d.ts +4 -4
- package/dist/relations/composition-table.js +4 -4
- package/dist/relations/composition-table.js.map +1 -1
- package/dist/relations/conventions.js.map +1 -1
- package/dist/relations/domain-regimes.js.map +1 -1
- package/dist/relations/regime-registration.js.map +1 -1
- package/dist/relations/regime-vocabularies.js.map +1 -1
- package/dist/relations/regime.d.ts +18 -8
- package/dist/relations/regime.d.ts.map +1 -1
- package/dist/relations/regime.js +26 -14
- package/dist/relations/regime.js.map +1 -1
- package/dist/relations/types.d.ts +26 -6
- package/dist/relations/types.d.ts.map +1 -1
- package/dist/relations/types.js +15 -3
- package/dist/relations/types.js.map +1 -1
- package/package.json +10 -14
- package/dist/bridges/registry.d.ts +0 -60
- package/dist/bridges/registry.d.ts.map +0 -1
- package/dist/bridges/registry.js +0 -87
- package/dist/bridges/registry.js.map +0 -1
- package/dist/cli/poster-source.d.ts +0 -154
- package/dist/cli/poster-source.d.ts.map +0 -1
- package/dist/cli/poster-source.js +0 -184
- package/dist/cli/poster-source.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"curvature.js","sourceRoot":"","sources":["../../src/dimensional/curvature.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"curvature.js","sourceRoot":"","sources":["../../src/dimensional/curvature.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Curvature-derived helpers — Ricci and Einstein (v0.5.0 Phase 1d).\n *\n * Module hosts the layer of GR objects derived by contraction of a\n * `RiemannTensorNode`:\n *\n * - `ricci(R)` → R_μν = R^λ_{λμν}\n * - `einstein(R)` → G_μν = R_μν − ½ g_μν R\n *\n * The Bianchi validator stays here. `bianchiResidual`, the evaluator that\n * calls `evaluateNumerical`, lives in `numerical/bianchi-residual.ts` so\n * this module does not import `numerical`.\n *\n * Separation rationale (Design §3 Task 1d): the bare `RiemannTensorNode`\n * stays in `connection-validators.ts` next to `CovariantDerivativeNode`\n * (both are *primary* curvature objects: connection + first-derivative).\n * Everything *contracted from* Riemann lives here — keeps the module\n * graph: tensor → metric → connection-validators → curvature.\n *\n * @module dimensional/curvature\n */\n\nimport type { Dimension } from './types.js';\n// Node/index types + ExprNode now live in the leaf `ast-types.ts` — no longer\n// imported from validator.ts (that back-edge formed a type-only cycle). The\n// curvature node types are re-exported below for existing importers.\nimport type {\n ExprNode,\n CovariantIndex,\n RiemannTensorNode,\n MetricTensorNode,\n RicciTensorNode,\n EinsteinTensorNode,\n BianchiResidualNode,\n} from './ast-types.js';\nimport { IndexLabelCollisionError } from './errors.js';\n\nexport type { RicciTensorNode, EinsteinTensorNode, BianchiResidualNode } from './ast-types.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Shared pattern-B callback type\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Shared callback shape used by every pattern-B validator (`validate\n * RicciTensor`, `validateEinsteinTensor`, `validateBianchiResidual`).\n *\n * The callback re-enters the Riemann validator for an embedded\n * `RiemannTensorNode`, returning the validated `{dim, freeIndices}`\n * pair without the surrounding validator-result envelope (the caller\n * is responsible for merging or discarding the free-index map per\n * the contraction it is performing).\n *\n * Co-located here with the three consumer functions (rather than in\n * `validator-registry.ts`) to avoid a `curvature.ts ↔ validator-\n * registry.ts` import cycle — the registry imports the validators\n * from this module, so this module must own the callback type.\n *\n * @internal\n */\nexport type RiemannChildCallback = (child: RiemannTensorNode) => {\n dim: Dimension;\n freeIndices: Map<string, { upper: number; lower: number }>;\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// RicciTensorNode — new ExprNode kind\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * v0.5.0 Task 7: Ricci tensor AST node R_μν.\n *\n * Internally wraps a RiemannTensorNode and represents the contraction\n *\n * R_μν = R^λ_{μλν} (Carroll Eq. 3.91)\n *\n * Index-map on the wrapped Riemann (R^ρ_σμν per RiemannTensorNode):\n *\n * R^ρ σ μ ν\n * │ │ │ │\n * │ │ └── lowerIndices[1] = the dummy contraction slot (λ)\n * │ │ contracts against upperIndex.label (ρ ↔ λ)\n * │ └── lowerIndices[0] = free output index #1 (μ_out, lower)\n * └── upperIndex (ρ) — contracts against lowerIndices[1]\n * lowerIndices[2] = free output index #2 (ν_out, lower)\n *\n * After contraction: R_μν free indices = {μ_out: lower, ν_out: lower}, dim {L: -2}.\n *\n * NOTE (post-S1 correction, commit `76628c4`): prior to v0.5.0 Task 7 this\n * docstring incorrectly said `lowerIndices[0]` was the dummy slot. Carroll\n * Eq. 3.91 contracts on the SECOND lower (the μ slot in R^ρ_σμν), giving\n * R_σν after the contraction. The implementation in `validateRicciTensor`\n * below (lines ~87-101) is the authoritative reference. See memory entry\n * `feedback_v0_5_0_ricci_contraction_bug.md` for the bug history.\n *\n * The node is its own validation arm in validator.ts and its own lowering\n * arm in numerical/lowering.ts — same pattern as RiemannTensorNode (no\n * AST-rewrite; the contraction is a single primitive walked directly).\n *\n * @public\n */\n/**\n * v0.6.0 Task 3.10b: RicciTensorNode expressed via CurvatureCompositeNode<K, S>.\n * The runtime shape is identical — pure type-alias migration.\n */\n/**\n * Result of validating a RicciTensorNode.\n * @public\n */\ninterface RicciTensorValidationResult {\n readonly dim: Dimension;\n readonly freeIndices: Map<string, { upper: number; lower: number }>;\n}\n\n/**\n * Validate a `ricci-tensor` node.\n *\n * Throws:\n * - IndexLabelCollisionError if the embedded Riemann's two free output\n * labels (the σ slot — lowerIndices[0] — and the ν slot —\n * lowerIndices[2]) collide. (The contracted middle slot\n * lowerIndices[1] is invisible to this check; any label is allowed\n * there because it's a dummy.)\n *\n * The Riemann sub-node is validated structurally by re-entering its own\n * validator via the `validateRiemannChild` callback (so its signature\n * checks fire), but its free indices are NOT propagated — the ρ slot\n * collapses into the contraction with the μ slot (Carroll Eq. 3.91:\n * `R_μν = R^λ_{μλν}`), and the surviving σ / ν slots become the new\n * free indices of the Ricci tensor.\n */\nexport function validateRicciTensor(\n node: RicciTensorNode,\n validateRiemannChild: RiemannChildCallback,\n): RicciTensorValidationResult {\n // Re-validate the embedded Riemann so its signature checks (upperIndex /\n // lowerIndices variance, gLower / gInverse signature, free-index\n // disjointness) fire here too. We discard its freeIndices map: the ρ slot\n // and the μ slot (lowerIndices[1]) are the contraction; the surviving σ\n // (lowerIndices[0]) and ν (lowerIndices[2]) are reconstructed below from\n // the authoritative axis source.\n const rResult = validateRiemannChild(node.riemann);\n\n // Dim is inherited 1:1 from the Riemann (contraction does not change\n // per-component units — multiplying by δ^ρ_μ is dimensionless).\n const dim = rResult.dim;\n\n // Surviving free indices: Ricci's μ_out ← lowerIndices[0] (σ slot),\n // Ricci's ν_out ← lowerIndices[2] (ν slot). Contracted middle slot\n // (lowerIndices[1]) is dummied and not surfaced as free.\n const muOutIdx: CovariantIndex = node.riemann.lowerIndices[0];\n const nuOutIdx: CovariantIndex = node.riemann.lowerIndices[2];\n if (muOutIdx.label === nuOutIdx.label) {\n throw new IndexLabelCollisionError(muOutIdx.label, 2, ['ricci-tensor']);\n }\n\n const freeIndices = new Map<string, { upper: number; lower: number }>();\n freeIndices.set(muOutIdx.label, { upper: 0, lower: 1 });\n freeIndices.set(nuOutIdx.label, { upper: 0, lower: 1 });\n\n return { dim, freeIndices };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ricci() — user-facing constructor\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Build the Ricci tensor R_μν = R^λ_{μλν} as a composite ExprNode.\n *\n * **Convention (Carroll Eq. 3.91).** Contract upper-ρ against the SECOND\n * lower slot — the μ position in R^ρ_σμν, i.e., `lowerIndices[1]` in the\n * RiemannTensorNode storage. The surviving free indices are the σ slot\n * (`lowerIndices[0]`) → Ricci's first free output μ_out, and the ν slot\n * (`lowerIndices[2]`) → Ricci's second free output ν_out.\n *\n * Index mapping after contraction:\n * - upperIndex (ρ) → contracted with lowerIndices[1] (the μ slot, λ dummy)\n * - lowerIndices[0] (σ) → Ricci's free output index 0 (μ_out)\n * - lowerIndices[2] (ν) → Ricci's free output index 1 (ν_out)\n * Result: R_μν with free indices {σ_label: lower, ν_label: lower}\n *\n * Index-map diagram:\n * R^ρ _ σ _ μ _ ν (RiemannTensorNode slots)\n * ↑ ↑\n * upper lower[1] <- contract these two (ρ = μ = λ)\n * lower[0] lower[2] <- become R_μν free indices\n *\n * **Why not \"upper ↔ lowerIndices[0]\" (the first-lower trace)?** The trace\n * `R^λ_{λμν}` over the first pair (ρ ↔ σ) is identically zero by the\n * first-pair antisymmetry of the (lowered) Riemann tensor — for any\n * metric, including non-vacuum solutions like de Sitter. The\n * constant-curvature identity `R_μν = (n-1) K g_μν` (Carroll §8.1,\n * `R = 4Λ` in n=4) only matches the upper↔second-lower contraction.\n * The de-Sitter Ricci-scalar test in `tests/dimensional/ricci.test.ts`\n * is the discriminating fixture that pins this convention.\n *\n * The returned tree is a single `ricci-tensor` node wrapping the supplied\n * Riemann. Validator and numerical lowering each have a dedicated arm —\n * no AST rewrite into a `tensor-product`-of-Riemann happens here (the\n * RiemannTensorNode is not contractable in the v0.3.5 tensor-product\n * einsum sense; the contraction is a primitive operation walked directly).\n *\n * @public\n */\nexport function ricci(R: RiemannTensorNode): ExprNode {\n return { kind: 'ricci-tensor', riemann: R };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// EinsteinTensorNode — new ExprNode kind (Task 8)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * v0.5.0 Task 8: Einstein tensor AST node G_μν = R_μν − ½ R g_μν.\n *\n * Wraps a `RiemannTensorNode` (contracted via the same Carroll-Eq.-3.91\n * convention as `RicciTensorNode` — see ricci()'s JSDoc) plus the metric\n * pair needed for the scalar trace `R = g^μν R_μν` and the `½ R g_μν`\n * subtraction term. Storage mirrors the `RicciTensorNode` pattern: own\n * validator + lowering arms, no AST rewrite into op('-', ricci, scale·g).\n *\n * Free indices match `R.lowerIndices[0]` and `R.lowerIndices[2]` — same as\n * ricci(R), with the same Carroll-Eq.-3.91 contraction; the embedded\n * Riemann's middle slot lowerIndices[1] is the dummy λ.\n *\n * Dim: {L: -2} — inherited from Riemann/Ricci (both `R_μν` and `R · g_μν`\n * carry 1/L²; subtraction preserves dim).\n *\n * @public\n */\n/**\n * v0.6.0 Task 3.10b: EinsteinTensorNode expressed via CurvatureCompositeNode<K, S>.\n * The runtime shape is identical — pure type-alias migration.\n */\n/**\n * Result of validating an EinsteinTensorNode.\n * @public\n */\ninterface EinsteinTensorValidationResult {\n readonly dim: Dimension;\n readonly freeIndices: Map<string, { upper: number; lower: number }>;\n}\n\n/**\n * Validate an `einstein-tensor` node.\n *\n * Delegates structural checks to the embedded Riemann via the\n * `validateRiemannChild` callback (same pattern as `validateRicciTensor`)\n * and reuses `validateRicciTensor` for the surviving free-index labels —\n * an Einstein tensor's free indices are exactly the Ricci tensor's free\n * indices (subtracting `½ R g_μν` with matching {μ_out, ν_out} labels\n * preserves the index structure).\n *\n * The `gLower` / `gInverse` sub-nodes are deliberately NOT propagated as\n * free indices — they are consumed internally by the scalar-trace\n * contraction and the `½ R g_μν` multiplication (same H1 discipline as\n * RiemannTensorNode for its gLower/gInverse fields).\n *\n * Throws:\n * - Everything `validateRicciTensor` throws (IndexLabelCollisionError on\n * surviving free-index collision; MetricSignatureError /\n * PartialDerivativeIndexVarianceError from the inner Riemann).\n */\nexport function validateEinsteinTensor(\n node: EinsteinTensorNode,\n validateRiemannChild: RiemannChildCallback,\n): EinsteinTensorValidationResult {\n // Delegate to Ricci validation — the surviving free-index labels and dim\n // are identical (R_μν has the same {μ_out, ν_out} as G_μν, dim {L:-2}).\n const ricciNode: RicciTensorNode = { kind: 'ricci-tensor', riemann: node.riemann };\n const r = validateRicciTensor(ricciNode, validateRiemannChild);\n\n // Defense in depth: the `½ R g_μν` term involves g_μν, but its free\n // indices are NOT propagated — they are the same {μ_out, ν_out} as Ricci\n // by construction (we contract them down to a 4×4 in the same axis order\n // during lowering). Mirrors H1: gLower / gInverse on RiemannTensorNode.\n return { dim: r.dim, freeIndices: r.freeIndices };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// einstein() — user-facing constructor\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Build the Einstein tensor G_μν = R_μν − ½ R g_μν as a composite ExprNode.\n *\n * **Convention.** The Einstein tensor adds the scalar-trace subtraction\n * term `½ R g_μν` to Ricci — it does NOT introduce a new contraction\n * convention. The inner Ricci `R_μν` inherits Carroll Eq. 3.91 from\n * `ricci(R)` (contraction on `lowerIndices[1]`, the middle/μ slot in\n * R^ρ_σμν; see RicciTensorNode JSDoc for the index-map diagram). The\n * scalar trace is `R = g^μν R_μν`. The result `G_μν` shares free indices\n * {μ_out, ν_out} with `ricci(R)`.\n *\n * **Algebra (sanity check).**\n * - de Sitter (n=4): `R_μν = Λ g_μν`, `R = 4Λ` ⇒\n * `G_μν = Λ g_μν − ½·4Λ·g_μν = −Λ g_μν`. Vacuum Einstein equation\n * `G_μν + Λ g_μν = 0` holds.\n * - Schwarzschild (vacuum): `R_μν ≡ 0`, `R = 0` ⇒ `G_μν ≡ 0`.\n * - Trace identity (any metric, n=4): `g^μν G_μν = R − ½·R·4 = −R`.\n *\n * **AST shape.** Single `einstein-tensor` node wrapping `R`, `gLower`,\n * `gInverse`. Validator and numerical lowering each have a dedicated arm;\n * no AST rewrite into `ricci(R) − ½ R g_μν` happens (the subtraction term\n * would need a tensor-valued scalar-multiply that the v0.3.5 tensor-product\n * einsum does not support directly). Same walk-directly pattern as Ricci.\n *\n * **Matter coupling is out of scope.** The vacuum / cosmological-constant\n * tests pin G_μν only; `G_μν = κ T_μν` (Einstein field equations with a\n * stress-energy source) is deferred to v0.6.0+.\n *\n * @public\n */\nexport function einstein(\n R: RiemannTensorNode,\n g: MetricTensorNode,\n gInverse: MetricTensorNode,\n): ExprNode {\n return { kind: 'einstein-tensor', riemann: R, gLower: g, gInverse };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// BianchiResidualNode — new ExprNode kind (Task 9)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * v0.5.0 Task 9: Second-Bianchi-identity residual AST node.\n *\n * Represents the cyclic-over-first-three-indices sum that vanishes by the\n * second Bianchi identity (Carroll Eq. 3.95):\n *\n * B_{λμνρσ} = ∇_λ R_{μνρσ} + ∇_μ R_{νλρσ} + ∇_ν R_{λμρσ} ≡ 0\n *\n * Storage: wraps the originating RiemannTensorNode. Lowering computes B\n * numerically by:\n * 1. Lowering the upper-ρ of the Riemann tensor JS-side via g_{aρ}.\n * 2. Computing ∂_λ R_{αβγδ} via a 4th-order centered FD (one MORE layer\n * on top of the Riemann lowering's already-FD-laden Γ + ∂Γ stack).\n * 3. Adding Christoffel-correction terms to form ∇_λ R_{μνρσ} (Approach 1:\n * canonical, not partial-only).\n * 4. Summing cyclically over (λ, μ, ν) with (ρ, σ) fixed.\n *\n * **Dim L⁻³.** R_{μνρσ} has dim L⁻² (inherited from R^ρ_{σμν}, since lowering\n * with the dimensionless metric preserves dim per our convention). One ∂/∂x\n * divides by L, giving L⁻³ on ∇R and on the cyclic sum B.\n *\n * **Free indices (5 lower):** λ, μ, ν, ρ, σ — taken from the same axis\n * convention as RiemannTensorNode.lowerIndices plus a fresh λ slot. To avoid\n * label collisions we synthesise `lambda` as the 5th index and reuse\n * R.lowerIndices[0..2] for {μ_out, ν_out, ρ_out}; the 4th wrapped slot\n * surfaces as `sigma_out`. (See `validateBianchiResidual` below for the\n * label-collision rule.)\n *\n * **Why not lower via the v0.3.0 `lower()` AST function?** lower() returns a\n * `tensor-product` node referencing the metric and operand by label/free-\n * index merge, intended for compositional expressions. The lowered Riemann\n * here is consumed point-wise by the FD stencil; building an AST product +\n * re-validating + re-lowering on every of the 25 FD samples is needless\n * machinery for a closed JS-side contraction. Matches the walk-directly\n * philosophy of Tasks 6, 7, 8.\n *\n * @public\n */\n/**\n * v0.6.0 Task 3.10c: BianchiResidualNode expressed via CurvatureCompositeNode<K, S>.\n * The runtime shape is identical — pure type-alias migration.\n */\n/**\n * Result of validating a BianchiResidualNode.\n * @public\n */\ninterface BianchiResidualValidationResult {\n readonly dim: Dimension;\n readonly freeIndices: Map<string, { upper: number; lower: number }>;\n}\n\n/**\n * Validate a `bianchi-residual` node.\n *\n * Inherits all structural checks from the embedded Riemann via\n * `validateRiemannChild`. The output freeIndices are 5 lower labels:\n *\n * - `lambda` — the synthesised FIRST cyclic-derivative axis (a new label;\n * must not collide with the wrapped Riemann's free labels)\n * - The Riemann's `lowerIndices[0]` label → μ_out\n * - The Riemann's `lowerIndices[1]` label → ν_out\n * - The Riemann's `lowerIndices[2]` label → ρ_out\n * - A synthesised `sigma_out` — the fourth Riemann index after lowering ρ.\n *\n * Throws:\n * - IndexLabelCollisionError if the synthesised `lambda` / `sigma_out`\n * labels collide with any wrapped-Riemann label.\n */\nexport function validateBianchiResidual(\n node: BianchiResidualNode,\n validateRiemannChild: RiemannChildCallback,\n): BianchiResidualValidationResult {\n // Re-validate the embedded Riemann for its own signature/index checks.\n validateRiemannChild(node.riemann);\n\n // Build the 5 free-index labels. The Riemann's lowerIndices[0..2] become\n // the μ_out, ν_out, ρ_out of the all-lower Riemann (after lowering ρ to a\n // synthesised 'sigma_out'... wait — the convention here is:\n // ∇_λ R_{αβγδ} has 5 indices: λ + 4 from the lowered Riemann.\n // The 4 from the lowered Riemann are: the freshly-lowered ρ (renamed\n // from `upperIndex.label`) + lowerIndices[0..2].\n // We use literal label `lambda` for the cyclic-deriv axis. The freshly-\n // lowered ρ takes a literal `alpha_lower` label.\n //\n // Collision rule: `lambda` and `alpha_lower` must not collide with any of\n // {upperIndex.label, lowerIndices[0..2].label}.\n const wrappedLabels = new Set<string>([\n node.riemann.upperIndex.label,\n node.riemann.lowerIndices[0].label,\n node.riemann.lowerIndices[1].label,\n node.riemann.lowerIndices[2].label,\n ]);\n const synthesised = ['lambda', 'alpha_lower'];\n for (const s of synthesised) {\n if (wrappedLabels.has(s)) {\n throw new IndexLabelCollisionError(s, 2, ['bianchi-residual']);\n }\n }\n\n // Per Design §3 Task 1f / F8 / I3: Bianchi residual carries 1/L³ (one\n // covariant derivative on R, which is 1/L²).\n const dim: Dimension = { L: -3, M: 0, T: 0, I: 0, Theta: 0, N: 0, J: 0 };\n\n // 5 free indices, all lower.\n const freeIndices = new Map<string, { upper: number; lower: number }>();\n freeIndices.set('lambda', { upper: 0, lower: 1 });\n freeIndices.set('alpha_lower', { upper: 0, lower: 1 });\n freeIndices.set(node.riemann.lowerIndices[0].label, { upper: 0, lower: 1 });\n freeIndices.set(node.riemann.lowerIndices[1].label, { upper: 0, lower: 1 });\n freeIndices.set(node.riemann.lowerIndices[2].label, { upper: 0, lower: 1 });\n\n return { dim, freeIndices };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dimension-inference.js","sourceRoot":"","sources":["../../src/dimensional/dimension-inference.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dimension-inference.js","sourceRoot":"","sources":["../../src/dimensional/dimension-inference.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Single-unknown dimensional inference.\n *\n * Given a parsed scalar `ExprNode` (e.g. the RHS of a user equation) in which\n * exactly one symbol's dimension is unknown, and the known dimension the whole\n * expression must equal (the target), recover the unknown's dimension from\n * dimensional homogeneity — or abstain (`null`) when it is not uniquely pinned\n * (the unknown is sum-constrained, absent, or appears non-cleanly).\n *\n * Method (no symbolic differentiation): probe the unknown with two dimensions\n * and read off its net power. With the unknown set to `DIMENSIONLESS` the\n * expression has dimension `D0`; set to `LENGTH` it has `D1`. The unknown enters\n * the dimension as a single power `p`, so `D1 / D0 = LENGTH^p`; if that quotient\n * is a clean power of the probe (only the `L` component nonzero), then from\n * `target = D0 · unknown^p` we get `unknown = (target / D0)^(1/p)`. Pure; reuses\n * the dimensional `algebra`.\n *\n * @module dimensional/dimension-inference\n */\n\nimport type { Dimension } from './types.js';\nimport { DIMENSIONLESS, LENGTH } from './types.js';\nimport { divide, power, EXPONENT_TOL } from './algebra.js';\nimport type { ExprNode } from './validator.js';\nimport { validate } from './validator.js';\n\nconst BASES: ReadonlyArray<keyof Dimension> = ['L', 'M', 'T', 'I', 'Theta', 'N', 'J'];\n\n/**\n * Rebuild `node`, replacing the dimension of every `symbol` named `name` with\n * `dim`. Walks the scalar arms (`symbol`/`op`/`transcendental`/`abs`); other\n * arms are returned unchanged (they do not occur in parsed scalar expressions).\n *\n * @public\n */\nexport function substituteSymbolDim(node: ExprNode, name: string, dim: Dimension): ExprNode {\n switch (node.kind) {\n case 'symbol':\n return node.name === name ? { ...node, dim } : node;\n case 'op':\n return { ...node, args: node.args.map((a) => substituteSymbolDim(a, name, dim)) };\n case 'transcendental':\n return { ...node, arg: substituteSymbolDim(node.arg, name, dim) };\n case 'abs':\n return { ...node, arg: substituteSymbolDim(node.arg, name, dim) };\n default:\n return node;\n }\n}\n\n/** Homogeneous dimension of `node`, or `null` if it is not well-formed. */\nfunction dimensionOrNull(node: ExprNode): Dimension | null {\n const r = validate(node);\n return r.ok && r.inferredDimension !== null ? r.inferredDimension : null;\n}\n\n/**\n * Infer the dimension of `unknown` in `expr` such that `expr` has dimension\n * `targetDim`, or `null` when it is not uniquely determined.\n *\n * @public\n */\nexport function inferUnknownDimension(\n expr: ExprNode,\n unknown: string,\n targetDim: Dimension,\n): Dimension | null {\n const d0 = dimensionOrNull(substituteSymbolDim(expr, unknown, DIMENSIONLESS));\n const d1 = dimensionOrNull(substituteSymbolDim(expr, unknown, LENGTH));\n if (d0 === null || d1 === null) return null;\n\n // D1 / D0 must be a clean power of the probe (LENGTH): only the L exponent.\n const quotient = divide(d1, d0);\n const p = quotient.L;\n if (p === 0) return null; // the unknown does not affect the dimension\n for (const base of BASES) {\n if (base !== 'L' && quotient[base] !== 0) return null; // not a clean power\n }\n const result = power(divide(targetDim, d0), 1 / p);\n // Snap each exponent to its nearest integer within tolerance, then abstain if\n // any is GENUINELY fractional (e.g. x^2 = [length] ⟹ [length]^½ is not a real\n // physical dimension). The tolerance absorbs FP round-off that arrives in the\n // target from a v0.20 fractional-power computation, so a real integer answer\n // (L = 2 + ε) is not spuriously rejected — consistent with `equals` (bb15432).\n const snapped = { ...result };\n for (const base of BASES) {\n const rounded = Math.round(result[base]);\n if (Math.abs(result[base] - rounded) > EXPONENT_TOL) return null;\n snapped[base] = rounded;\n }\n return snapped;\n}\n"]}
|
|
@@ -3,9 +3,14 @@
|
|
|
3
3
|
* so CLI users can declare a quantity's dimensions without TypeScript.
|
|
4
4
|
*
|
|
5
5
|
* Accepts (in priority order):
|
|
6
|
-
* 1. a named dimension —
|
|
7
|
-
* `
|
|
8
|
-
* `temperature`, `entropy`, `charge`, `area`,
|
|
6
|
+
* 1. a named dimension — the `types.ts` constants (`length`, `time`,
|
|
7
|
+
* `mass`, `velocity`, `acceleration`, `force`, `energy`, `power`,
|
|
8
|
+
* `action`, `frequency`, `temperature`, `entropy`, `charge`, `area`,
|
|
9
|
+
* `dimensionless`, `density`) and the dimensions of the SI units
|
|
10
|
+
* `m^3`, `Pa`, `Pa*s`, `ohm`, `T`, `H/m`, `A`, `mol`, `cd` under the
|
|
11
|
+
* names `volume`, `pressure`, `viscosity`, `resistance`,
|
|
12
|
+
* `magnetic-field`, `permeability`, `current`, `amount` (or
|
|
13
|
+
* `amount-of-substance`), `luminous-intensity`;
|
|
9
14
|
* 2. a fundamental constant by name — `hbar`/`ℏ`, `c`, `G`, `k_B`/`kB`,
|
|
10
15
|
* `e` (its SI dimension);
|
|
11
16
|
* 3. a product/quotient of named dimensions or constants — `power/area`,
|
|
@@ -18,6 +23,16 @@
|
|
|
18
23
|
* separated by `.`, `*`, or spaces; `^` optional; fractional exponents
|
|
19
24
|
* like `T^1/2` allowed).
|
|
20
25
|
*
|
|
26
|
+
* Forms 3 and 4 are one grammar, the formula grammar MathTS parses
|
|
27
|
+
* ({@link parseFormulaPNode}). The dimension notation differs from a formula
|
|
28
|
+
* only in spelling, and {@link formulaSyntax} rewrites those spellings
|
|
29
|
+
* before the parse: a `.` between factors is `*`, a space between factors is
|
|
30
|
+
* `*`, a glued exponent (`L2`, `T-2`) takes its `^` unless the letters and
|
|
31
|
+
* the digit together spell a registered atom (`mu0`, `eps0`), a fractional
|
|
32
|
+
* exponent (`T^1/2`) is parenthesized, and a hyphen inside a name
|
|
33
|
+
* (`magnetic-field`) is `_`. There is no subtraction in a dimension, so `-`
|
|
34
|
+
* after a name is always an exponent's sign.
|
|
35
|
+
*
|
|
21
36
|
* @module dimensional/dimension-spec
|
|
22
37
|
*/
|
|
23
38
|
import type { Dimension } from './types.js';
|
|
@@ -26,9 +41,9 @@ export declare class DimensionSpecError extends Error {
|
|
|
26
41
|
constructor(message: string);
|
|
27
42
|
}
|
|
28
43
|
/**
|
|
29
|
-
* One constant's exact-case spellings
|
|
30
|
-
*
|
|
31
|
-
* names. A dimension term reads this record
|
|
44
|
+
* One constant's exact-case spellings, projected from the constant registry.
|
|
45
|
+
* The first name is the formula name the equation path rewrites the others
|
|
46
|
+
* to. `upt eval` binds the same names. A dimension term reads this record.
|
|
32
47
|
*
|
|
33
48
|
* @internal
|
|
34
49
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dimension-spec.d.ts","sourceRoot":"","sources":["../../src/dimensional/dimension-spec.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dimension-spec.d.ts","sourceRoot":"","sources":["../../src/dimensional/dimension-spec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAyB5C,4BAA4B;AAC5B,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAqCD;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAA;CAAE,EACf,CAAC;AAkI1F,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAkB1D"}
|
|
@@ -3,9 +3,14 @@
|
|
|
3
3
|
* so CLI users can declare a quantity's dimensions without TypeScript.
|
|
4
4
|
*
|
|
5
5
|
* Accepts (in priority order):
|
|
6
|
-
* 1. a named dimension —
|
|
7
|
-
* `
|
|
8
|
-
* `temperature`, `entropy`, `charge`, `area`,
|
|
6
|
+
* 1. a named dimension — the `types.ts` constants (`length`, `time`,
|
|
7
|
+
* `mass`, `velocity`, `acceleration`, `force`, `energy`, `power`,
|
|
8
|
+
* `action`, `frequency`, `temperature`, `entropy`, `charge`, `area`,
|
|
9
|
+
* `dimensionless`, `density`) and the dimensions of the SI units
|
|
10
|
+
* `m^3`, `Pa`, `Pa*s`, `ohm`, `T`, `H/m`, `A`, `mol`, `cd` under the
|
|
11
|
+
* names `volume`, `pressure`, `viscosity`, `resistance`,
|
|
12
|
+
* `magnetic-field`, `permeability`, `current`, `amount` (or
|
|
13
|
+
* `amount-of-substance`), `luminous-intensity`;
|
|
9
14
|
* 2. a fundamental constant by name — `hbar`/`ℏ`, `c`, `G`, `k_B`/`kB`,
|
|
10
15
|
* `e` (its SI dimension);
|
|
11
16
|
* 3. a product/quotient of named dimensions or constants — `power/area`,
|
|
@@ -18,10 +23,24 @@
|
|
|
18
23
|
* separated by `.`, `*`, or spaces; `^` optional; fractional exponents
|
|
19
24
|
* like `T^1/2` allowed).
|
|
20
25
|
*
|
|
26
|
+
* Forms 3 and 4 are one grammar, the formula grammar MathTS parses
|
|
27
|
+
* ({@link parseFormulaPNode}). The dimension notation differs from a formula
|
|
28
|
+
* only in spelling, and {@link formulaSyntax} rewrites those spellings
|
|
29
|
+
* before the parse: a `.` between factors is `*`, a space between factors is
|
|
30
|
+
* `*`, a glued exponent (`L2`, `T-2`) takes its `^` unless the letters and
|
|
31
|
+
* the digit together spell a registered atom (`mu0`, `eps0`), a fractional
|
|
32
|
+
* exponent (`T^1/2`) is parenthesized, and a hyphen inside a name
|
|
33
|
+
* (`magnetic-field`) is `_`. There is no subtraction in a dimension, so `-`
|
|
34
|
+
* after a name is always an exponent's sign.
|
|
35
|
+
*
|
|
21
36
|
* @module dimensional/dimension-spec
|
|
22
37
|
*/
|
|
23
|
-
import { DIMENSIONLESS, LENGTH, AREA, TIME, FREQUENCY, MASS, VELOCITY, ACCELERATION, FORCE, ENERGY, POWER, ACTION, TEMPERATURE, ENTROPY, CHARGE, } from './types.js';
|
|
38
|
+
import { DIMENSIONLESS, LENGTH, AREA, TIME, FREQUENCY, MASS, MASS_DENSITY, VELOCITY, ACCELERATION, FORCE, ENERGY, POWER, ACTION, TEMPERATURE, ENTROPY, CHARGE, } from './types.js';
|
|
24
39
|
import { divide, multiply, power } from './algebra.js';
|
|
40
|
+
import { dim } from './ast-builders.js';
|
|
41
|
+
import { CONSTANT_REGISTRY } from './symbolic-constants.js';
|
|
42
|
+
import { unitDimension } from './units.js';
|
|
43
|
+
import { parseFormulaPNode } from '../numerical/formula-dimension.js';
|
|
25
44
|
/** A bad dimension spec. */
|
|
26
45
|
export class DimensionSpecError extends Error {
|
|
27
46
|
constructor(message) {
|
|
@@ -29,15 +48,20 @@ export class DimensionSpecError extends Error {
|
|
|
29
48
|
this.name = 'DimensionSpecError';
|
|
30
49
|
}
|
|
31
50
|
}
|
|
32
|
-
|
|
33
|
-
|
|
51
|
+
/**
|
|
52
|
+
* Named dimensions — matched case-insensitively. Each is a `types.ts`
|
|
53
|
+
* constant or the dimension of an SI unit read by the one unit reader; no
|
|
54
|
+
* exponent tuple is typed here.
|
|
55
|
+
*/
|
|
34
56
|
const NAMED_DIMS = {
|
|
35
57
|
dimensionless: DIMENSIONLESS,
|
|
36
58
|
length: LENGTH,
|
|
37
59
|
area: AREA,
|
|
60
|
+
volume: unitDimension('m^3'),
|
|
38
61
|
time: TIME,
|
|
39
62
|
frequency: FREQUENCY,
|
|
40
63
|
mass: MASS,
|
|
64
|
+
density: MASS_DENSITY,
|
|
41
65
|
velocity: VELOCITY,
|
|
42
66
|
acceleration: ACCELERATION,
|
|
43
67
|
force: FORCE,
|
|
@@ -47,30 +71,25 @@ const NAMED_DIMS = {
|
|
|
47
71
|
temperature: TEMPERATURE,
|
|
48
72
|
entropy: ENTROPY,
|
|
49
73
|
charge: CHARGE,
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
74
|
+
current: unitDimension('A'),
|
|
75
|
+
electric_current: unitDimension('A'),
|
|
76
|
+
amount: unitDimension('mol'),
|
|
77
|
+
amount_of_substance: unitDimension('mol'),
|
|
78
|
+
luminous_intensity: unitDimension('cd'),
|
|
79
|
+
pressure: unitDimension('Pa'),
|
|
80
|
+
viscosity: unitDimension('Pa*s'),
|
|
81
|
+
resistance: unitDimension('ohm'),
|
|
82
|
+
magnetic_field: unitDimension('T'),
|
|
83
|
+
permeability: unitDimension('H/m'),
|
|
57
84
|
};
|
|
58
85
|
/**
|
|
59
|
-
* One constant's exact-case spellings
|
|
60
|
-
*
|
|
61
|
-
* names. A dimension term reads this record
|
|
86
|
+
* One constant's exact-case spellings, projected from the constant registry.
|
|
87
|
+
* The first name is the formula name the equation path rewrites the others
|
|
88
|
+
* to. `upt eval` binds the same names. A dimension term reads this record.
|
|
62
89
|
*
|
|
63
90
|
* @internal
|
|
64
91
|
*/
|
|
65
|
-
export const CONSTANT_SPELLINGS = [
|
|
66
|
-
{ names: ['hbar', 'ℏ'], dim: ACTION },
|
|
67
|
-
{ names: ['c'], dim: VELOCITY },
|
|
68
|
-
{ names: ['G'], dim: d(3, -1, -2) },
|
|
69
|
-
{ names: ['k_B', 'kB'], dim: ENTROPY },
|
|
70
|
-
{ names: ['e'], dim: CHARGE },
|
|
71
|
-
{ names: ['mu_0', 'mu0'], dim: d(1, 1, -2, 0, -2) },
|
|
72
|
-
{ names: ['epsilon_0', 'epsilon0', 'eps0'], dim: d(-3, -1, 4, 0, 2) },
|
|
73
|
-
];
|
|
92
|
+
export const CONSTANT_SPELLINGS = CONSTANT_REGISTRY.map((row) => ({ names: [row.name, ...row.spellings], dim: row.dim }));
|
|
74
93
|
/** Fundamental constants by their SI dimension — matched EXACT-case, so
|
|
75
94
|
* `G` (Newton's constant) is never confused with `g` (acceleration). */
|
|
76
95
|
const CONST_DIMS = Object.fromEntries(CONSTANT_SPELLINGS.flatMap(({ names, dim }) => names.map((name) => [name, dim])));
|
|
@@ -84,164 +103,135 @@ const BASES = {
|
|
|
84
103
|
N: 'N',
|
|
85
104
|
J: 'J',
|
|
86
105
|
};
|
|
87
|
-
|
|
88
|
-
if (raw === '')
|
|
89
|
-
return 1;
|
|
90
|
-
if (raw.includes('/')) {
|
|
91
|
-
const [n, den] = raw.split('/');
|
|
92
|
-
const num = Number(n);
|
|
93
|
-
const dd = Number(den);
|
|
94
|
-
if (!Number.isFinite(num) || !Number.isFinite(dd) || dd === 0) {
|
|
95
|
-
throw new DimensionSpecError(`bad exponent '${raw}'`);
|
|
96
|
-
}
|
|
97
|
-
return num / dd;
|
|
98
|
-
}
|
|
99
|
-
const v = Number(raw);
|
|
100
|
-
if (!Number.isFinite(v))
|
|
101
|
-
throw new DimensionSpecError(`bad exponent '${raw}'`);
|
|
102
|
-
return v;
|
|
103
|
-
}
|
|
104
|
-
/** Resolve one atom: constant (exact case) or named dimension (case-insensitive). */
|
|
106
|
+
/** Resolve one atom: constant (exact case, `_` or `-`) or named dimension (case-insensitive). */
|
|
105
107
|
function resolveAtom(raw) {
|
|
106
108
|
const s = raw.trim();
|
|
107
109
|
if (!s)
|
|
108
110
|
return null;
|
|
109
|
-
|
|
110
|
-
|
|
111
|
+
const constant = CONST_DIMS[s] ?? CONST_DIMS[s.replaceAll('_', '-')];
|
|
112
|
+
if (constant)
|
|
113
|
+
return constant;
|
|
111
114
|
const key = s.toLowerCase().replace(/[\s-]+/g, '_');
|
|
112
115
|
return NAMED_DIMS[key] ?? NAMED_DIMS[s.toLowerCase()] ?? null;
|
|
113
116
|
}
|
|
114
117
|
function baseAtom(id) {
|
|
115
|
-
|
|
118
|
+
// A single base letter is read in its own case: `m` is the metre's symbol, not mass,
|
|
119
|
+
// and `t`, `i`, `n`, `j` are not bases either (Tom's second round; it read `m^3` as M³).
|
|
120
|
+
// `Theta`/`THETA`/`Θ` are the one multi-letter base and stay case-insensitive.
|
|
121
|
+
if (id.length === 1 && /[a-z]/.test(id)) {
|
|
122
|
+
const upper = id.toUpperCase();
|
|
123
|
+
if (BASES[upper] !== undefined) {
|
|
124
|
+
throw new DimensionSpecError(`'${id}' is not a base letter: the bases are L M T I Θ N J in that case (mass is M, length is L); a unit symbol is not a dimension`);
|
|
125
|
+
}
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
const baseKey = id.length > 1 ? BASES[id.toUpperCase()] ?? BASES[id] : BASES[id];
|
|
116
129
|
if (!baseKey)
|
|
117
130
|
return null;
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
-
return
|
|
131
|
+
const out = dim();
|
|
132
|
+
out[baseKey] = 1;
|
|
133
|
+
return out;
|
|
121
134
|
}
|
|
122
135
|
/**
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
* Returns `null` when the string is not this form (so the base-exponent path
|
|
127
|
-
* can try).
|
|
128
|
-
*/
|
|
129
|
-
/**
|
|
130
|
-
* A product/quotient with parentheses and exponents: `power/(area*temperature^4)`,
|
|
131
|
-
* `mass/length^3`, `M/L^3`. A slash followed by a digit is a fractional
|
|
132
|
-
* exponent on the explicit-base path (`T^1/2`), not this one.
|
|
136
|
+
* The dimension notation in formula syntax. Each rewrite is a spelling the
|
|
137
|
+
* notation allows and a formula does not; none adds an operator a reader
|
|
138
|
+
* did not write.
|
|
133
139
|
*/
|
|
134
|
-
function
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
140
|
+
function formulaSyntax(spec) {
|
|
141
|
+
return (spec
|
|
142
|
+
// A hyphen inside a name: `magnetic-field` is `magnetic_field`.
|
|
143
|
+
.replace(/(?<=[A-Za-zΘ])-(?=[A-Za-zΘ])/g, '_')
|
|
144
|
+
// Spaces around an operator carry nothing; between two factors they multiply.
|
|
145
|
+
.replace(/\s*([*/^().])\s*/g, '$1')
|
|
146
|
+
.replace(/\s+/g, '*')
|
|
147
|
+
// A glued exponent: `L2`, `T-2`, `T-2.5`. The letters and the digit
|
|
148
|
+
// together may spell a registered atom (`mu0`, `eps0`, `mu_0`); that
|
|
149
|
+
// token is a name, not a base with an exponent.
|
|
150
|
+
.replace(/([A-Za-zΘ_]+)([+-]?\d)/g, (token, word, digit) => resolveAtom(token) !== null ? token : `${word}^${digit}`)
|
|
151
|
+
// A fractional exponent: `T^1/2` is `T^(1/2)`.
|
|
152
|
+
.replace(/\^([+-]?\d+(?:\.\d+)?)\/(\d+(?:\.\d+)?)/g, '^($1/$2)')
|
|
153
|
+
// A dot between factors is a product; a dot before a digit is a decimal point.
|
|
154
|
+
.replace(/\.(?!\d)/g, '*'));
|
|
155
|
+
}
|
|
156
|
+
/** A numeric exponent: a number, a signed number, or a quotient or product of numbers. */
|
|
157
|
+
function exponentOf(node, spec) {
|
|
158
|
+
switch (node.kind) {
|
|
159
|
+
case 'num':
|
|
160
|
+
return node.value;
|
|
161
|
+
case 'neg':
|
|
162
|
+
return -exponentOf(node.arg, spec);
|
|
163
|
+
case 'op': {
|
|
164
|
+
const values = node.args.map((arg) => exponentOf(arg, spec));
|
|
165
|
+
if (node.op === '/')
|
|
166
|
+
return values.reduce((a, b) => a / b);
|
|
167
|
+
if (node.op === '*')
|
|
168
|
+
return values.reduce((a, b) => a * b, 1);
|
|
169
|
+
if (node.op === '+')
|
|
170
|
+
return values.reduce((a, b) => a + b, 0);
|
|
171
|
+
return values.length === 1 ? -values[0] : values.reduce((a, b) => a - b);
|
|
153
172
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
173
|
+
default:
|
|
174
|
+
throw new DimensionSpecError(`bad exponent in '${spec}'`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function unknownTerm(id) {
|
|
178
|
+
return new DimensionSpecError(`unknown base dimension '${id}' (use L M T I Theta N J, a named dimension, a constant name, ` +
|
|
179
|
+
'or a named product/quotient like power/area)');
|
|
180
|
+
}
|
|
181
|
+
/** The dimension a parsed spec states. */
|
|
182
|
+
function dimensionOf(node, spec) {
|
|
183
|
+
switch (node.kind) {
|
|
184
|
+
case 'sym': {
|
|
185
|
+
const found = resolveAtom(node.name) ?? baseAtom(node.name);
|
|
186
|
+
if (found === null)
|
|
187
|
+
throw unknownTerm(node.name);
|
|
188
|
+
return { ...found };
|
|
166
189
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
if (base)
|
|
178
|
-
return base;
|
|
179
|
-
throw new DimensionSpecError(`unrecognized dimension term '${id}' (use a named dimension, a constant, ` +
|
|
180
|
-
`or bases L M T I Theta N J)`);
|
|
181
|
-
};
|
|
182
|
-
const parsePower = () => {
|
|
183
|
-
const base = parseAtom();
|
|
184
|
-
skip();
|
|
185
|
-
if (s[i] !== '^')
|
|
186
|
-
return base;
|
|
187
|
-
i++;
|
|
188
|
-
return power(base, parseExponentToken());
|
|
189
|
-
};
|
|
190
|
-
const parseProduct = () => {
|
|
191
|
-
let acc = parsePower();
|
|
192
|
-
while (true) {
|
|
193
|
-
skip();
|
|
194
|
-
const op = s[i];
|
|
195
|
-
if (op !== '*' && op !== '/')
|
|
196
|
-
break;
|
|
197
|
-
i++;
|
|
198
|
-
const rhs = parsePower();
|
|
199
|
-
acc = op === '*' ? multiply(acc, rhs) : divide(acc, rhs);
|
|
190
|
+
case 'num':
|
|
191
|
+
// A literal 1 is the dimensionless numerator: `1/time`.
|
|
192
|
+
if (node.value === 1)
|
|
193
|
+
return dim();
|
|
194
|
+
throw new DimensionSpecError(`a number is not a dimension term ('${node.value}' in '${spec}')`);
|
|
195
|
+
case 'pow': {
|
|
196
|
+
const exponent = exponentOf(node.exp, spec);
|
|
197
|
+
if (!Number.isFinite(exponent))
|
|
198
|
+
throw new DimensionSpecError(`bad exponent in '${spec}'`);
|
|
199
|
+
return { ...power(dimensionOf(node.base, spec), exponent) };
|
|
200
200
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
return true;
|
|
214
|
-
return /\*/.test(s) && /[A-Za-z]{2,}/.test(s);
|
|
201
|
+
case 'op': {
|
|
202
|
+
if (node.op !== '*' && node.op !== '/') {
|
|
203
|
+
throw new DimensionSpecError(`unrecognized dimension term '${spec}' (a dimension has no '${node.op}')`);
|
|
204
|
+
}
|
|
205
|
+
const [first, ...rest] = node.args.map((arg) => dimensionOf(arg, spec));
|
|
206
|
+
return { ...rest.reduce((acc, next) => (node.op === '*' ? multiply(acc, next) : divide(acc, next)), first) };
|
|
207
|
+
}
|
|
208
|
+
case 'neg':
|
|
209
|
+
throw new DimensionSpecError(`unrecognized dimension term '${spec}' (a dimension has no sign)`);
|
|
210
|
+
case 'call':
|
|
211
|
+
throw new DimensionSpecError(`unrecognized dimension term '${node.fn}' in '${spec}'`);
|
|
212
|
+
}
|
|
215
213
|
}
|
|
216
214
|
/** Parse a dimension spec string into a {@link Dimension}. @internal */
|
|
217
215
|
export function parseDimensionSpec(spec) {
|
|
218
216
|
const s = spec.trim();
|
|
219
217
|
if (!s)
|
|
220
218
|
throw new DimensionSpecError('empty dimension spec');
|
|
221
|
-
//
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
// (4) explicit base exponents.
|
|
232
|
-
const out = d();
|
|
233
|
-
const parts = s.split(/[.*\s]+/).filter(Boolean);
|
|
234
|
-
for (const part of parts) {
|
|
235
|
-
const m = /^([A-Za-zΘ]+)\^?(-?\d+(?:\/\d+)?)?$/.exec(part);
|
|
236
|
-
if (!m)
|
|
237
|
-
throw new DimensionSpecError(`unrecognized dimension term '${part}'`);
|
|
238
|
-
const baseKey = BASES[m[1].toUpperCase()] ?? BASES[m[1]];
|
|
239
|
-
if (!baseKey) {
|
|
240
|
-
throw new DimensionSpecError(`unknown base dimension '${m[1]}' (use L M T I Theta N J, a named ` +
|
|
241
|
-
`dimension, a constant name, or a named product/quotient like power/area)`);
|
|
242
|
-
}
|
|
243
|
-
out[baseKey] += parseExponent(m[2] ?? '');
|
|
219
|
+
// A whole name: a constant (exact case, so G is not g) or a named dimension.
|
|
220
|
+
const whole = resolveAtom(s);
|
|
221
|
+
if (whole)
|
|
222
|
+
return whole;
|
|
223
|
+
let node;
|
|
224
|
+
try {
|
|
225
|
+
node = parseFormulaPNode(formulaSyntax(s));
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
throw new DimensionSpecError(`unrecognized dimension spec '${s}' (${error instanceof Error ? error.message : String(error)})`);
|
|
244
229
|
}
|
|
230
|
+
const out = dimensionOf(node, s);
|
|
231
|
+
// A zero exponent raised to a negative power is -0; a dimension has no signed zero.
|
|
232
|
+
for (const key of Object.keys(out))
|
|
233
|
+
if (out[key] === 0)
|
|
234
|
+
out[key] = 0;
|
|
245
235
|
return out;
|
|
246
236
|
}
|
|
247
237
|
//# sourceMappingURL=dimension-spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dimension-spec.js","sourceRoot":"","sources":["../../src/dimensional/dimension-spec.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dimension-spec.js","sourceRoot":"","sources":["../../src/dimensional/dimension-spec.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Dimension-spec parser — turns a human string into a {@link Dimension},\n * so CLI users can declare a quantity's dimensions without TypeScript.\n *\n * Accepts (in priority order):\n * 1. a named dimension — the `types.ts` constants (`length`, `time`,\n * `mass`, `velocity`, `acceleration`, `force`, `energy`, `power`,\n * `action`, `frequency`, `temperature`, `entropy`, `charge`, `area`,\n * `dimensionless`, `density`) and the dimensions of the SI units\n * `m^3`, `Pa`, `Pa*s`, `ohm`, `T`, `H/m`, `A`, `mol`, `cd` under the\n * names `volume`, `pressure`, `viscosity`, `resistance`,\n * `magnetic-field`, `permeability`, `current`, `amount` (or\n * `amount-of-substance`), `luminous-intensity`;\n * 2. a fundamental constant by name — `hbar`/`ℏ`, `c`, `G`, `k_B`/`kB`,\n * `e` (its SI dimension);\n * 3. a product/quotient of named dimensions or constants — `power/area`,\n * `length*temperature` (persona finding L1); parentheses group a\n * denominator or factor (`power/(area*temperature^4)`), a name may\n * carry an exponent (`mass/length^3`), and a single base letter works\n * in a quotient (`M/L^3`). A slash that is only the bar of a fractional\n * exponent (`T^1/2`) stays on the explicit-base path;\n * 4. explicit base exponents — `L^3.M^-1.T^-2` (bases L M T I Theta/Θ N J,\n * separated by `.`, `*`, or spaces; `^` optional; fractional exponents\n * like `T^1/2` allowed).\n *\n * Forms 3 and 4 are one grammar, the formula grammar MathTS parses\n * ({@link parseFormulaPNode}). The dimension notation differs from a formula\n * only in spelling, and {@link formulaSyntax} rewrites those spellings\n * before the parse: a `.` between factors is `*`, a space between factors is\n * `*`, a glued exponent (`L2`, `T-2`) takes its `^` unless the letters and\n * the digit together spell a registered atom (`mu0`, `eps0`), a fractional\n * exponent (`T^1/2`) is parenthesized, and a hyphen inside a name\n * (`magnetic-field`) is `_`. There is no subtraction in a dimension, so `-`\n * after a name is always an exponent's sign.\n *\n * @module dimensional/dimension-spec\n */\n\nimport type { Dimension } from './types.js';\nimport {\n DIMENSIONLESS,\n LENGTH,\n AREA,\n TIME,\n FREQUENCY,\n MASS,\n MASS_DENSITY,\n VELOCITY,\n ACCELERATION,\n FORCE,\n ENERGY,\n POWER,\n ACTION,\n TEMPERATURE,\n ENTROPY,\n CHARGE,\n} from './types.js';\nimport { divide, multiply, power } from './algebra.js';\nimport { dim } from './ast-builders.js';\nimport { CONSTANT_REGISTRY } from './symbolic-constants.js';\nimport { unitDimension } from './units.js';\nimport { parseFormulaPNode, type FormulaPNode } from '../numerical/formula-dimension.js';\n\n/** A bad dimension spec. */\nexport class DimensionSpecError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'DimensionSpecError';\n }\n}\n\n/**\n * Named dimensions — matched case-insensitively. Each is a `types.ts`\n * constant or the dimension of an SI unit read by the one unit reader; no\n * exponent tuple is typed here.\n */\nconst NAMED_DIMS: Readonly<Record<string, Dimension>> = {\n dimensionless: DIMENSIONLESS,\n length: LENGTH,\n area: AREA,\n volume: unitDimension('m^3'),\n time: TIME,\n frequency: FREQUENCY,\n mass: MASS,\n density: MASS_DENSITY,\n velocity: VELOCITY,\n acceleration: ACCELERATION,\n force: FORCE,\n energy: ENERGY,\n power: POWER,\n action: ACTION,\n temperature: TEMPERATURE,\n entropy: ENTROPY,\n charge: CHARGE,\n current: unitDimension('A'),\n electric_current: unitDimension('A'),\n amount: unitDimension('mol'),\n amount_of_substance: unitDimension('mol'),\n luminous_intensity: unitDimension('cd'),\n pressure: unitDimension('Pa'),\n viscosity: unitDimension('Pa*s'),\n resistance: unitDimension('ohm'),\n magnetic_field: unitDimension('T'),\n permeability: unitDimension('H/m'),\n};\n\n/**\n * One constant's exact-case spellings, projected from the constant registry.\n * The first name is the formula name the equation path rewrites the others\n * to. `upt eval` binds the same names. A dimension term reads this record.\n *\n * @internal\n */\nexport const CONSTANT_SPELLINGS: readonly { readonly names: readonly string[]; readonly dim: Dimension }[] =\n CONSTANT_REGISTRY.map((row) => ({ names: [row.name, ...row.spellings], dim: row.dim }));\n\n/** Fundamental constants by their SI dimension — matched EXACT-case, so\n * `G` (Newton's constant) is never confused with `g` (acceleration). */\nconst CONST_DIMS: Readonly<Record<string, Dimension>> = Object.fromEntries(\n CONSTANT_SPELLINGS.flatMap(({ names, dim }) => names.map((name) => [name, dim])),\n);\n\nconst BASES: Record<string, keyof Dimension> = {\n L: 'L',\n M: 'M',\n T: 'T',\n I: 'I',\n THETA: 'Theta',\n 'Θ': 'Theta',\n N: 'N',\n J: 'J',\n};\n\n/** Resolve one atom: constant (exact case, `_` or `-`) or named dimension (case-insensitive). */\nfunction resolveAtom(raw: string): Dimension | null {\n const s = raw.trim();\n if (!s) return null;\n const constant = CONST_DIMS[s] ?? CONST_DIMS[s.replaceAll('_', '-')];\n if (constant) return constant;\n const key = s.toLowerCase().replace(/[\\s-]+/g, '_');\n return NAMED_DIMS[key] ?? NAMED_DIMS[s.toLowerCase()] ?? null;\n}\n\nfunction baseAtom(id: string): Dimension | null {\n // A single base letter is read in its own case: `m` is the metre's symbol, not mass,\n // and `t`, `i`, `n`, `j` are not bases either (Tom's second round; it read `m^3` as M³).\n // `Theta`/`THETA`/`Θ` are the one multi-letter base and stay case-insensitive.\n if (id.length === 1 && /[a-z]/.test(id)) {\n const upper = id.toUpperCase();\n if (BASES[upper] !== undefined) {\n throw new DimensionSpecError(`'${id}' is not a base letter: the bases are L M T I Θ N J in that case (mass is M, length is L); a unit symbol is not a dimension`);\n }\n return null;\n }\n const baseKey = id.length > 1 ? BASES[id.toUpperCase()] ?? BASES[id] : BASES[id];\n if (!baseKey) return null;\n const out = dim();\n out[baseKey] = 1;\n return out;\n}\n\n/**\n * The dimension notation in formula syntax. Each rewrite is a spelling the\n * notation allows and a formula does not; none adds an operator a reader\n * did not write.\n */\nfunction formulaSyntax(spec: string): string {\n return (\n spec\n // A hyphen inside a name: `magnetic-field` is `magnetic_field`.\n .replace(/(?<=[A-Za-zΘ])-(?=[A-Za-zΘ])/g, '_')\n // Spaces around an operator carry nothing; between two factors they multiply.\n .replace(/\\s*([*/^().])\\s*/g, '$1')\n .replace(/\\s+/g, '*')\n // A glued exponent: `L2`, `T-2`, `T-2.5`. The letters and the digit\n // together may spell a registered atom (`mu0`, `eps0`, `mu_0`); that\n // token is a name, not a base with an exponent.\n .replace(/([A-Za-zΘ_]+)([+-]?\\d)/g, (token, word: string, digit: string) =>\n resolveAtom(token) !== null ? token : `${word}^${digit}`,\n )\n // A fractional exponent: `T^1/2` is `T^(1/2)`.\n .replace(/\\^([+-]?\\d+(?:\\.\\d+)?)\\/(\\d+(?:\\.\\d+)?)/g, '^($1/$2)')\n // A dot between factors is a product; a dot before a digit is a decimal point.\n .replace(/\\.(?!\\d)/g, '*')\n );\n}\n\n/** A numeric exponent: a number, a signed number, or a quotient or product of numbers. */\nfunction exponentOf(node: FormulaPNode, spec: string): number {\n switch (node.kind) {\n case 'num':\n return node.value;\n case 'neg':\n return -exponentOf(node.arg, spec);\n case 'op': {\n const values = node.args.map((arg) => exponentOf(arg, spec));\n if (node.op === '/') return values.reduce((a, b) => a / b);\n if (node.op === '*') return values.reduce((a, b) => a * b, 1);\n if (node.op === '+') return values.reduce((a, b) => a + b, 0);\n return values.length === 1 ? -values[0]! : values.reduce((a, b) => a - b);\n }\n default:\n throw new DimensionSpecError(`bad exponent in '${spec}'`);\n }\n}\n\nfunction unknownTerm(id: string): DimensionSpecError {\n return new DimensionSpecError(\n `unknown base dimension '${id}' (use L M T I Theta N J, a named dimension, a constant name, ` +\n 'or a named product/quotient like power/area)',\n );\n}\n\n/** The dimension a parsed spec states. */\nfunction dimensionOf(node: FormulaPNode, spec: string): Dimension {\n switch (node.kind) {\n case 'sym': {\n const found = resolveAtom(node.name) ?? baseAtom(node.name);\n if (found === null) throw unknownTerm(node.name);\n return { ...found };\n }\n case 'num':\n // A literal 1 is the dimensionless numerator: `1/time`.\n if (node.value === 1) return dim();\n throw new DimensionSpecError(`a number is not a dimension term ('${node.value}' in '${spec}')`);\n case 'pow': {\n const exponent = exponentOf(node.exp, spec);\n if (!Number.isFinite(exponent)) throw new DimensionSpecError(`bad exponent in '${spec}'`);\n return { ...power(dimensionOf(node.base, spec), exponent) };\n }\n case 'op': {\n if (node.op !== '*' && node.op !== '/') {\n throw new DimensionSpecError(`unrecognized dimension term '${spec}' (a dimension has no '${node.op}')`);\n }\n const [first, ...rest] = node.args.map((arg) => dimensionOf(arg, spec));\n return { ...rest.reduce((acc, next) => (node.op === '*' ? multiply(acc, next) : divide(acc, next)), first!) };\n }\n case 'neg':\n throw new DimensionSpecError(`unrecognized dimension term '${spec}' (a dimension has no sign)`);\n case 'call':\n throw new DimensionSpecError(`unrecognized dimension term '${node.fn}' in '${spec}'`);\n }\n}\n\n/** Parse a dimension spec string into a {@link Dimension}. @internal */\nexport function parseDimensionSpec(spec: string): Dimension {\n const s = spec.trim();\n if (!s) throw new DimensionSpecError('empty dimension spec');\n // A whole name: a constant (exact case, so G is not g) or a named dimension.\n const whole = resolveAtom(s);\n if (whole) return whole;\n let node: FormulaPNode;\n try {\n node = parseFormulaPNode(formulaSyntax(s));\n } catch (error) {\n throw new DimensionSpecError(\n `unrecognized dimension spec '${s}' (${error instanceof Error ? error.message : String(error)})`,\n );\n }\n const out = dimensionOf(node, s);\n // A zero exponent raised to a negative power is -0; a dimension has no signed zero.\n for (const key of Object.keys(out) as (keyof Dimension)[]) if (out[key] === 0) out[key] = 0;\n return out;\n}\n"]}
|