universal-physics-tensor 10.0.0 → 11.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 +4 -3
- package/bin/upt.mjs +13 -1
- package/data/atlas/atlas.json +25 -25
- package/data/atlas/atlas.jsonld +1 -1
- package/data/atlas/diffusion.json +6 -6
- package/data/atlas/oscillators.json +7 -7
- package/data/atlas/waves.json +14 -14
- package/data/atlas/witness-results.json +11 -11
- package/data/bridge-catalog.json +371 -228
- package/data/bridge-catalog.schema.json +45 -7
- package/dist/atlas/applicability.d.ts.map +1 -1
- package/dist/atlas/applicability.js +21 -15
- package/dist/atlas/applicability.js.map +1 -1
- package/dist/atlas/benchmark/hybrid-retrieval.d.ts +9 -1
- package/dist/atlas/benchmark/hybrid-retrieval.d.ts.map +1 -1
- package/dist/atlas/benchmark/hybrid-retrieval.js +15 -13
- package/dist/atlas/benchmark/hybrid-retrieval.js.map +1 -1
- package/dist/atlas/benchmark/loader.js +2 -2
- package/dist/atlas/benchmark/loader.js.map +1 -1
- package/dist/atlas/benchmark/stats.d.ts +2 -2
- package/dist/atlas/benchmark/stats.d.ts.map +1 -1
- package/dist/atlas/benchmark/stats.js +15 -7
- package/dist/atlas/benchmark/stats.js.map +1 -1
- package/dist/atlas/catalog-formal-ref.d.ts +26 -3
- package/dist/atlas/catalog-formal-ref.d.ts.map +1 -1
- package/dist/atlas/catalog-formal-ref.js +52 -5
- package/dist/atlas/catalog-formal-ref.js.map +1 -1
- package/dist/atlas/chain-pipeline.d.ts.map +1 -1
- package/dist/atlas/chain-pipeline.js +7 -8
- package/dist/atlas/chain-pipeline.js.map +1 -1
- package/dist/atlas/diffusion/bridges-closure.d.ts +0 -4
- package/dist/atlas/diffusion/bridges-closure.d.ts.map +1 -1
- package/dist/atlas/diffusion/bridges-closure.js +8 -12
- 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 +27 -39
- package/dist/atlas/diffusion/bridges.js.map +1 -1
- package/dist/atlas/diffusion/dimensions.d.ts +6 -14
- package/dist/atlas/diffusion/dimensions.d.ts.map +1 -1
- package/dist/atlas/diffusion/dimensions.js +8 -16
- package/dist/atlas/diffusion/dimensions.js.map +1 -1
- package/dist/atlas/diffusion/models.d.ts +3 -3
- package/dist/atlas/diffusion/models.d.ts.map +1 -1
- package/dist/atlas/diffusion/models.js +5 -10
- package/dist/atlas/diffusion/models.js.map +1 -1
- package/dist/atlas/diffusion/numerics.d.ts +16 -4
- package/dist/atlas/diffusion/numerics.d.ts.map +1 -1
- package/dist/atlas/diffusion/numerics.js +38 -24
- package/dist/atlas/diffusion/numerics.js.map +1 -1
- package/dist/atlas/link-prediction.d.ts +106 -3
- package/dist/atlas/link-prediction.d.ts.map +1 -1
- package/dist/atlas/link-prediction.js +212 -66
- package/dist/atlas/link-prediction.js.map +1 -1
- package/dist/atlas/oscillators/bridges-coarse.d.ts.map +1 -1
- package/dist/atlas/oscillators/bridges-coarse.js +7 -11
- 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 +6 -7
- package/dist/atlas/oscillators/bridges-exact.js.map +1 -1
- package/dist/atlas/oscillators/bridges-limits.d.ts +3 -16
- package/dist/atlas/oscillators/bridges-limits.d.ts.map +1 -1
- package/dist/atlas/oscillators/bridges-limits.js +23 -34
- package/dist/atlas/oscillators/bridges-limits.js.map +1 -1
- package/dist/atlas/oscillators/dimensions.d.ts +9 -21
- package/dist/atlas/oscillators/dimensions.d.ts.map +1 -1
- package/dist/atlas/oscillators/dimensions.js +9 -21
- package/dist/atlas/oscillators/dimensions.js.map +1 -1
- package/dist/atlas/oscillators/limit-witnesses.d.ts +2 -2
- package/dist/atlas/oscillators/limit-witnesses.d.ts.map +1 -1
- package/dist/atlas/oscillators/limit-witnesses.js +17 -15
- package/dist/atlas/oscillators/limit-witnesses.js.map +1 -1
- package/dist/atlas/oscillators/models.d.ts.map +1 -1
- package/dist/atlas/oscillators/models.js +2 -6
- package/dist/atlas/oscillators/models.js.map +1 -1
- package/dist/atlas/oscillators/pendulum-motion.d.ts +29 -6
- package/dist/atlas/oscillators/pendulum-motion.d.ts.map +1 -1
- package/dist/atlas/oscillators/pendulum-motion.js +60 -40
- package/dist/atlas/oscillators/pendulum-motion.js.map +1 -1
- package/dist/atlas/oscillators/phase-translation.d.ts +0 -11
- package/dist/atlas/oscillators/phase-translation.d.ts.map +1 -1
- package/dist/atlas/oscillators/phase-translation.js +3 -4
- package/dist/atlas/oscillators/phase-translation.js.map +1 -1
- package/dist/atlas/oscillators/position-translation.d.ts +68 -7
- package/dist/atlas/oscillators/position-translation.d.ts.map +1 -1
- package/dist/atlas/oscillators/position-translation.js +123 -12
- package/dist/atlas/oscillators/position-translation.js.map +1 -1
- package/dist/atlas/oscillators/rejections.d.ts +0 -2
- package/dist/atlas/oscillators/rejections.d.ts.map +1 -1
- package/dist/atlas/oscillators/rejections.js +0 -7
- package/dist/atlas/oscillators/rejections.js.map +1 -1
- package/dist/atlas/physjs-entries.generated.d.ts +25 -24
- package/dist/atlas/physjs-entries.generated.d.ts.map +1 -1
- package/dist/atlas/physjs-entries.generated.js +25 -24
- package/dist/atlas/physjs-entries.generated.js.map +1 -1
- package/dist/atlas/physjs-ref.d.ts +34 -31
- package/dist/atlas/physjs-ref.d.ts.map +1 -1
- package/dist/atlas/physjs-ref.js +55 -53
- package/dist/atlas/physjs-ref.js.map +1 -1
- package/dist/atlas/physjs-reviewed.d.ts +1 -1
- package/dist/atlas/physjs-reviewed.js +15 -15
- package/dist/atlas/physjs-reviewed.js.map +1 -1
- package/dist/atlas/poster/statements.d.ts +0 -19
- package/dist/atlas/poster/statements.d.ts.map +1 -1
- package/dist/atlas/poster/statements.js +1 -1
- package/dist/atlas/poster/statements.js.map +1 -1
- package/dist/atlas/proof-target.d.ts +1 -1
- package/dist/atlas/proof-target.js +1 -1
- package/dist/atlas/proof-target.js.map +1 -1
- package/dist/atlas/regime.d.ts +1 -1
- package/dist/atlas/regime.d.ts.map +1 -1
- package/dist/atlas/regime.js +1 -1
- package/dist/atlas/regime.js.map +1 -1
- package/dist/atlas/text-overlap.d.ts +23 -0
- package/dist/atlas/text-overlap.d.ts.map +1 -0
- package/dist/atlas/text-overlap.js +41 -0
- package/dist/atlas/text-overlap.js.map +1 -0
- package/dist/atlas/waves/bridges-closure.d.ts.map +1 -1
- package/dist/atlas/waves/bridges-closure.js +2 -6
- 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 +32 -48
- package/dist/atlas/waves/bridges.js.map +1 -1
- package/dist/atlas/waves/models.d.ts +5 -6
- package/dist/atlas/waves/models.d.ts.map +1 -1
- package/dist/atlas/waves/models.js +7 -13
- package/dist/atlas/waves/models.js.map +1 -1
- package/dist/atlas/waves/numerics.d.ts.map +1 -1
- package/dist/atlas/waves/numerics.js +10 -3
- package/dist/atlas/waves/numerics.js.map +1 -1
- package/dist/atlas/witness-numeric.d.ts +30 -0
- package/dist/atlas/witness-numeric.d.ts.map +1 -1
- package/dist/atlas/witness-numeric.js +53 -0
- package/dist/atlas/witness-numeric.js.map +1 -1
- package/dist/atlas/witness-specs.d.ts.map +1 -1
- package/dist/atlas/witness-specs.js +19 -0
- package/dist/atlas/witness-specs.js.map +1 -1
- package/dist/atlas/witness-symbolic.d.ts +75 -3
- package/dist/atlas/witness-symbolic.d.ts.map +1 -1
- package/dist/atlas/witness-symbolic.js +116 -10
- package/dist/atlas/witness-symbolic.js.map +1 -1
- package/dist/bridges/catalog-load.d.ts.map +1 -1
- package/dist/bridges/catalog-load.js +13 -8
- package/dist/bridges/catalog-load.js.map +1 -1
- package/dist/bridges/catalog-types.d.ts +26 -2
- package/dist/bridges/catalog-types.d.ts.map +1 -1
- package/dist/bridges/catalog-types.js +11 -1
- package/dist/bridges/catalog-types.js.map +1 -1
- package/dist/bridges/evaluation-errors.d.ts +31 -1
- package/dist/bridges/evaluation-errors.d.ts.map +1 -1
- package/dist/bridges/evaluation-errors.js +20 -2
- package/dist/bridges/evaluation-errors.js.map +1 -1
- package/dist/bridges/evaluator-inputs.d.ts.map +1 -1
- package/dist/bridges/evaluator-inputs.js +7 -5
- package/dist/bridges/evaluator-inputs.js.map +1 -1
- package/dist/bridges/evaluators.d.ts.map +1 -1
- package/dist/bridges/evaluators.js +27 -12
- package/dist/bridges/evaluators.js.map +1 -1
- package/dist/bridges/expr-parse.d.ts +11 -0
- package/dist/bridges/expr-parse.d.ts.map +1 -1
- package/dist/bridges/expr-parse.js +14 -5
- package/dist/bridges/expr-parse.js.map +1 -1
- package/dist/bridges/holds.d.ts +35 -3
- package/dist/bridges/holds.d.ts.map +1 -1
- package/dist/bridges/holds.js +117 -23
- package/dist/bridges/holds.js.map +1 -1
- package/dist/bridges/notices.d.ts.map +1 -1
- package/dist/bridges/notices.js +5 -5
- package/dist/bridges/notices.js.map +1 -1
- package/dist/bridges/relation-eval.d.ts +4 -4
- package/dist/bridges/relation-eval.d.ts.map +1 -1
- package/dist/bridges/relation-eval.js +15 -16
- package/dist/bridges/relation-eval.js.map +1 -1
- package/dist/bridges/sensitivity.d.ts.map +1 -1
- package/dist/bridges/sensitivity.js +3 -3
- package/dist/bridges/sensitivity.js.map +1 -1
- package/dist/bridges/validity.d.ts +33 -0
- package/dist/bridges/validity.d.ts.map +1 -0
- package/dist/bridges/validity.js +67 -0
- package/dist/bridges/validity.js.map +1 -0
- package/dist/canonical/entries/atomic.js +1 -3
- 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 +4 -5
- 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 +3 -4
- 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 +4 -10
- 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 +3 -7
- 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 +4 -6
- 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 +9 -17
- 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 -6
- package/dist/canonical/entries/relativity.js.map +1 -1
- package/dist/canonical/entries/thermo-nuclear-cosmo.d.ts.map +1 -1
- package/dist/canonical/entries/thermo-nuclear-cosmo.js +6 -10
- package/dist/canonical/entries/thermo-nuclear-cosmo.js.map +1 -1
- package/dist/canonical/fixed-points.d.ts +94 -0
- package/dist/canonical/fixed-points.d.ts.map +1 -0
- package/dist/canonical/fixed-points.js +81 -0
- package/dist/canonical/fixed-points.js.map +1 -0
- package/dist/canonical/linkage.d.ts.map +1 -1
- package/dist/canonical/linkage.js +25 -44
- package/dist/canonical/linkage.js.map +1 -1
- package/dist/canonical/normal-form.d.ts.map +1 -1
- package/dist/canonical/normal-form.js +5 -11
- package/dist/canonical/normal-form.js.map +1 -1
- package/dist/canonical/structural.d.ts +21 -21
- package/dist/canonical/structural.d.ts.map +1 -1
- package/dist/canonical/structural.js +40 -19
- package/dist/canonical/structural.js.map +1 -1
- package/dist/cases/brownian-sphere.d.ts +3 -3
- package/dist/cases/brownian-sphere.d.ts.map +1 -1
- package/dist/cases/brownian-sphere.js +6 -5
- package/dist/cases/brownian-sphere.js.map +1 -1
- package/dist/cases/damped-resonator.d.ts.map +1 -1
- package/dist/cases/damped-resonator.js +6 -9
- package/dist/cases/damped-resonator.js.map +1 -1
- package/dist/cases/kepler-rv.d.ts +1 -1
- package/dist/cases/kepler-rv.d.ts.map +1 -1
- package/dist/cases/kepler-rv.js +3 -2
- package/dist/cases/kepler-rv.js.map +1 -1
- package/dist/cases/lumped-cooling.d.ts +8 -3
- package/dist/cases/lumped-cooling.d.ts.map +1 -1
- package/dist/cases/lumped-cooling.js +21 -23
- package/dist/cases/lumped-cooling.js.map +1 -1
- package/dist/cases/quadrature.d.ts +7 -9
- package/dist/cases/quadrature.d.ts.map +1 -1
- package/dist/cases/quadrature.js +28 -32
- package/dist/cases/quadrature.js.map +1 -1
- package/dist/cases/resistor-noise.js +4 -4
- package/dist/cases/resistor-noise.js.map +1 -1
- package/dist/cases/skin-depth.d.ts +0 -4
- package/dist/cases/skin-depth.d.ts.map +1 -1
- package/dist/cases/skin-depth.js +3 -7
- package/dist/cases/skin-depth.js.map +1 -1
- package/dist/cli/args.d.ts +23 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +30 -8
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/bindings.d.ts.map +1 -1
- package/dist/cli/bindings.js +5 -4
- package/dist/cli/bindings.js.map +1 -1
- package/dist/cli/command.d.ts +8 -1
- package/dist/cli/command.d.ts.map +1 -1
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/commands/_atlas-map.d.ts +0 -9
- package/dist/cli/commands/_atlas-map.d.ts.map +1 -1
- package/dist/cli/commands/_atlas-map.js +8 -18
- package/dist/cli/commands/_atlas-map.js.map +1 -1
- package/dist/cli/commands/_atlas-route.d.ts.map +1 -1
- package/dist/cli/commands/_atlas-route.js +6 -2
- package/dist/cli/commands/_atlas-route.js.map +1 -1
- package/dist/cli/commands/_discovery-opts.d.ts.map +1 -1
- package/dist/cli/commands/_discovery-opts.js +8 -9
- 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 +8 -5
- 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 +8 -1
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/cli/commands/axes.d.ts.map +1 -1
- package/dist/cli/commands/axes.js +20 -1
- package/dist/cli/commands/axes.js.map +1 -1
- package/dist/cli/commands/confront.d.ts.map +1 -1
- package/dist/cli/commands/confront.js +8 -14
- package/dist/cli/commands/confront.js.map +1 -1
- package/dist/cli/commands/derive.d.ts.map +1 -1
- package/dist/cli/commands/derive.js +22 -22
- 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 +6 -2
- 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 +1 -0
- package/dist/cli/commands/eval.js.map +1 -1
- package/dist/cli/commands/evaluate.d.ts.map +1 -1
- package/dist/cli/commands/evaluate.js +65 -37
- 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 +2 -1
- package/dist/cli/commands/explain.js.map +1 -1
- package/dist/cli/commands/ground.d.ts.map +1 -1
- package/dist/cli/commands/ground.js +1 -0
- package/dist/cli/commands/ground.js.map +1 -1
- package/dist/cli/commands/map.d.ts.map +1 -1
- package/dist/cli/commands/map.js +75 -5
- 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 +12 -9
- package/dist/cli/commands/metric.js.map +1 -1
- package/dist/cli/commands/path.d.ts +10 -0
- package/dist/cli/commands/path.d.ts.map +1 -1
- package/dist/cli/commands/path.js +25 -3
- package/dist/cli/commands/path.js.map +1 -1
- package/dist/cli/commands/probe.d.ts.map +1 -1
- package/dist/cli/commands/probe.js +59 -16
- package/dist/cli/commands/probe.js.map +1 -1
- package/dist/cli/commands/regime.d.ts.map +1 -1
- package/dist/cli/commands/regime.js +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +19 -28
- package/dist/cli/commands/symbolic.js.map +1 -1
- package/dist/cli/commands/testplan.d.ts.map +1 -1
- package/dist/cli/commands/testplan.js +4 -2
- package/dist/cli/commands/testplan.js.map +1 -1
- package/dist/cli/expr-print.d.ts +0 -2
- package/dist/cli/expr-print.d.ts.map +1 -1
- package/dist/cli/expr-print.js +7 -31
- package/dist/cli/expr-print.js.map +1 -1
- package/dist/cli/main.d.ts +7 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +18 -3
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/numeric-flag.d.ts +12 -0
- package/dist/cli/numeric-flag.d.ts.map +1 -0
- package/dist/cli/numeric-flag.js +44 -0
- package/dist/cli/numeric-flag.js.map +1 -0
- package/dist/cli/output.d.ts +20 -0
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +15 -0
- package/dist/cli/output.js.map +1 -1
- package/dist/cli/record-reach.js +2 -2
- package/dist/cli/record-reach.js.map +1 -1
- package/dist/cli/record-tables.d.ts.map +1 -1
- package/dist/cli/record-tables.js +6 -5
- package/dist/cli/record-tables.js.map +1 -1
- package/dist/cli/record.d.ts +1 -5
- package/dist/cli/record.d.ts.map +1 -1
- package/dist/cli/record.js +9 -8
- package/dist/cli/record.js.map +1 -1
- package/dist/cli/search-index.d.ts.map +1 -1
- package/dist/cli/search-index.js +7 -6
- package/dist/cli/search-index.js.map +1 -1
- package/dist/cli/statuses.d.ts +0 -2
- package/dist/cli/statuses.d.ts.map +1 -1
- package/dist/cli/statuses.js +0 -7
- package/dist/cli/statuses.js.map +1 -1
- package/dist/cli/stored-results.d.ts +7 -0
- package/dist/cli/stored-results.d.ts.map +1 -0
- package/dist/cli/stored-results.js +23 -0
- package/dist/cli/stored-results.js.map +1 -0
- package/dist/cli/version.d.ts.map +1 -1
- package/dist/cli/version.js +7 -5
- package/dist/cli/version.js.map +1 -1
- package/dist/cli-api.d.ts +34 -5
- package/dist/cli-api.d.ts.map +1 -1
- package/dist/cli-api.js +28 -4
- package/dist/cli-api.js.map +1 -1
- package/dist/composition/algebraic-equivalence.d.ts +43 -0
- package/dist/composition/algebraic-equivalence.d.ts.map +1 -0
- package/dist/composition/algebraic-equivalence.js +115 -0
- package/dist/composition/algebraic-equivalence.js.map +1 -0
- package/dist/composition/axes.d.ts +0 -6
- package/dist/composition/axes.d.ts.map +1 -1
- package/dist/composition/axes.js +6 -6
- package/dist/composition/axes.js.map +1 -1
- package/dist/composition/axis-audit.d.ts +47 -20
- package/dist/composition/axis-audit.d.ts.map +1 -1
- package/dist/composition/axis-audit.js +82 -9
- package/dist/composition/axis-audit.js.map +1 -1
- package/dist/composition/bridge-analysis.d.ts +17 -0
- package/dist/composition/bridge-analysis.d.ts.map +1 -1
- package/dist/composition/bridge-analysis.js +102 -55
- package/dist/composition/bridge-analysis.js.map +1 -1
- package/dist/composition/canonical-compare.d.ts +40 -0
- package/dist/composition/canonical-compare.d.ts.map +1 -1
- package/dist/composition/canonical-compare.js +122 -24
- package/dist/composition/canonical-compare.js.map +1 -1
- package/dist/composition/canonical-graph.d.ts +1 -1
- package/dist/composition/canonical-graph.d.ts.map +1 -1
- package/dist/composition/canonical-graph.js +9 -36
- package/dist/composition/canonical-graph.js.map +1 -1
- package/dist/composition/canonical-json.js +2 -2
- package/dist/composition/canonical-json.js.map +1 -1
- package/dist/composition/catalog-graph.d.ts.map +1 -1
- package/dist/composition/catalog-graph.js +2 -5
- package/dist/composition/catalog-graph.js.map +1 -1
- package/dist/composition/chain-candidate.d.ts +8 -0
- package/dist/composition/chain-candidate.d.ts.map +1 -1
- package/dist/composition/chain-candidate.js +9 -2
- package/dist/composition/chain-candidate.js.map +1 -1
- package/dist/composition/chain-match.d.ts +6 -3
- package/dist/composition/chain-match.d.ts.map +1 -1
- package/dist/composition/chain-match.js +4 -1
- package/dist/composition/chain-match.js.map +1 -1
- package/dist/composition/chain-result.d.ts.map +1 -1
- package/dist/composition/chain-result.js +2 -14
- package/dist/composition/chain-result.js.map +1 -1
- package/dist/composition/compose-symbolic.d.ts.map +1 -1
- package/dist/composition/compose-symbolic.js +3 -2
- package/dist/composition/compose-symbolic.js.map +1 -1
- package/dist/composition/compose.d.ts.map +1 -1
- package/dist/composition/compose.js +13 -5
- package/dist/composition/compose.js.map +1 -1
- package/dist/composition/composition-recovery.d.ts.map +1 -1
- package/dist/composition/composition-recovery.js +4 -7
- package/dist/composition/composition-recovery.js.map +1 -1
- package/dist/composition/discovery.d.ts +56 -0
- package/dist/composition/discovery.d.ts.map +1 -1
- package/dist/composition/discovery.js +114 -60
- package/dist/composition/discovery.js.map +1 -1
- package/dist/composition/edge.d.ts +21 -2
- package/dist/composition/edge.d.ts.map +1 -1
- package/dist/composition/edge.js +23 -1
- package/dist/composition/edge.js.map +1 -1
- package/dist/composition/enumerate.d.ts.map +1 -1
- package/dist/composition/enumerate.js +18 -3
- package/dist/composition/enumerate.js.map +1 -1
- package/dist/composition/evaluate-relation.d.ts +35 -11
- package/dist/composition/evaluate-relation.d.ts.map +1 -1
- package/dist/composition/evaluate-relation.js +60 -39
- package/dist/composition/evaluate-relation.js.map +1 -1
- package/dist/composition/explain.d.ts +3 -12
- package/dist/composition/explain.d.ts.map +1 -1
- package/dist/composition/explain.js +7 -20
- 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 -11
- package/dist/composition/expr-eval.js.map +1 -1
- package/dist/composition/expr-simplify.d.ts +16 -0
- package/dist/composition/expr-simplify.d.ts.map +1 -1
- package/dist/composition/expr-simplify.js +15 -20
- package/dist/composition/expr-simplify.js.map +1 -1
- package/dist/composition/formula-shape.d.ts +23 -4
- package/dist/composition/formula-shape.d.ts.map +1 -1
- package/dist/composition/formula-shape.js +57 -17
- package/dist/composition/formula-shape.js.map +1 -1
- package/dist/composition/graph-structure.d.ts +98 -0
- package/dist/composition/graph-structure.d.ts.map +1 -0
- package/dist/composition/graph-structure.js +167 -0
- package/dist/composition/graph-structure.js.map +1 -0
- package/dist/composition/graph-viz-svg.d.ts.map +1 -1
- package/dist/composition/graph-viz-svg.js +1 -1
- package/dist/composition/graph-viz-svg.js.map +1 -1
- package/dist/composition/graph-viz.d.ts.map +1 -1
- package/dist/composition/graph-viz.js +8 -37
- package/dist/composition/graph-viz.js.map +1 -1
- package/dist/composition/identifiability.d.ts +91 -4
- package/dist/composition/identifiability.d.ts.map +1 -1
- package/dist/composition/identifiability.js +363 -6
- package/dist/composition/identifiability.js.map +1 -1
- package/dist/composition/index.d.ts +8 -4
- package/dist/composition/index.d.ts.map +1 -1
- package/dist/composition/index.js +3 -2
- package/dist/composition/index.js.map +1 -1
- package/dist/composition/mathts-quiet.d.ts +4 -3
- package/dist/composition/mathts-quiet.d.ts.map +1 -1
- package/dist/composition/mathts-quiet.js +4 -3
- package/dist/composition/mathts-quiet.js.map +1 -1
- package/dist/composition/mathts-scalar-symbols.d.ts.map +1 -1
- package/dist/composition/mathts-scalar-symbols.js +2 -1
- package/dist/composition/mathts-scalar-symbols.js.map +1 -1
- package/dist/composition/probe/corpus.d.ts +4 -2
- package/dist/composition/probe/corpus.d.ts.map +1 -1
- package/dist/composition/probe/corpus.js +20 -9
- package/dist/composition/probe/corpus.js.map +1 -1
- package/dist/composition/probe/dataset.d.ts +17 -0
- package/dist/composition/probe/dataset.d.ts.map +1 -1
- package/dist/composition/probe/dataset.js +95 -50
- package/dist/composition/probe/dataset.js.map +1 -1
- package/dist/composition/probe/experiment-design.d.ts +5 -1
- package/dist/composition/probe/experiment-design.d.ts.map +1 -1
- package/dist/composition/probe/experiment-design.js +44 -24
- package/dist/composition/probe/experiment-design.js.map +1 -1
- package/dist/composition/probe/falsify.d.ts.map +1 -1
- package/dist/composition/probe/falsify.js +2 -0
- package/dist/composition/probe/falsify.js.map +1 -1
- package/dist/composition/probe/fit.d.ts +6 -0
- package/dist/composition/probe/fit.d.ts.map +1 -1
- package/dist/composition/probe/fit.js +46 -22
- package/dist/composition/probe/fit.js.map +1 -1
- package/dist/composition/probe/frontier.d.ts.map +1 -1
- package/dist/composition/probe/frontier.js +33 -15
- package/dist/composition/probe/frontier.js.map +1 -1
- package/dist/composition/probe/generator.d.ts +27 -1
- package/dist/composition/probe/generator.d.ts.map +1 -1
- package/dist/composition/probe/generator.js +53 -30
- package/dist/composition/probe/generator.js.map +1 -1
- package/dist/composition/probe/index.d.ts +14 -0
- package/dist/composition/probe/index.d.ts.map +1 -1
- package/dist/composition/probe/index.js +6 -0
- package/dist/composition/probe/index.js.map +1 -1
- package/dist/composition/probe/limits.d.ts +24 -1
- package/dist/composition/probe/limits.d.ts.map +1 -1
- package/dist/composition/probe/limits.js +53 -11
- package/dist/composition/probe/limits.js.map +1 -1
- package/dist/composition/probe/pipeline.d.ts.map +1 -1
- package/dist/composition/probe/pipeline.js +10 -4
- package/dist/composition/probe/pipeline.js.map +1 -1
- package/dist/composition/probe/power-law.d.ts +121 -0
- package/dist/composition/probe/power-law.d.ts.map +1 -0
- package/dist/composition/probe/power-law.js +255 -0
- package/dist/composition/probe/power-law.js.map +1 -0
- package/dist/composition/probe/problem.d.ts +7 -4
- package/dist/composition/probe/problem.d.ts.map +1 -1
- package/dist/composition/probe/problem.js +177 -49
- package/dist/composition/probe/problem.js.map +1 -1
- package/dist/composition/probe/report.js +1 -1
- package/dist/composition/probe/report.js.map +1 -1
- package/dist/composition/probe/residual.d.ts +6 -1
- package/dist/composition/probe/residual.d.ts.map +1 -1
- package/dist/composition/probe/residual.js +9 -7
- package/dist/composition/probe/residual.js.map +1 -1
- package/dist/composition/probe/structure.d.ts +82 -17
- package/dist/composition/probe/structure.d.ts.map +1 -1
- package/dist/composition/probe/structure.js +129 -55
- package/dist/composition/probe/structure.js.map +1 -1
- package/dist/composition/probe/study.d.ts +31 -9
- package/dist/composition/probe/study.d.ts.map +1 -1
- package/dist/composition/probe/study.js +236 -181
- package/dist/composition/probe/study.js.map +1 -1
- package/dist/composition/probe/t-tail.d.ts +17 -0
- package/dist/composition/probe/t-tail.d.ts.map +1 -0
- package/dist/composition/probe/t-tail.js +32 -0
- package/dist/composition/probe/t-tail.js.map +1 -0
- package/dist/composition/probe/types.d.ts +3 -0
- package/dist/composition/probe/types.d.ts.map +1 -1
- package/dist/composition/probe/types.js.map +1 -1
- package/dist/composition/proposed-bridges.d.ts +41 -10
- package/dist/composition/proposed-bridges.d.ts.map +1 -1
- package/dist/composition/proposed-bridges.js +100 -55
- package/dist/composition/proposed-bridges.js.map +1 -1
- package/dist/composition/quantity-clusters.d.ts +48 -0
- package/dist/composition/quantity-clusters.d.ts.map +1 -0
- package/dist/composition/quantity-clusters.js +98 -0
- package/dist/composition/quantity-clusters.js.map +1 -0
- package/dist/composition/rational-exponent.d.ts +40 -0
- package/dist/composition/rational-exponent.d.ts.map +1 -0
- package/dist/composition/rational-exponent.js +65 -0
- package/dist/composition/rational-exponent.js.map +1 -0
- package/dist/composition/representative-values.d.ts +22 -0
- package/dist/composition/representative-values.d.ts.map +1 -1
- package/dist/composition/representative-values.js +23 -0
- package/dist/composition/representative-values.js.map +1 -1
- package/dist/composition/retrodiction.d.ts.map +1 -1
- package/dist/composition/retrodiction.js +2 -1
- package/dist/composition/retrodiction.js.map +1 -1
- package/dist/composition/user-equation.d.ts.map +1 -1
- package/dist/composition/user-equation.js +2 -2
- package/dist/composition/user-equation.js.map +1 -1
- package/dist/core/assignment.d.ts +19 -0
- package/dist/core/assignment.d.ts.map +1 -0
- package/dist/core/assignment.js +19 -0
- package/dist/core/assignment.js.map +1 -0
- package/dist/core/compare.d.ts +32 -0
- package/dist/core/compare.d.ts.map +1 -0
- package/dist/core/compare.js +46 -0
- package/dist/core/compare.js.map +1 -0
- package/dist/core/constants.d.ts +30 -30
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +47 -30
- package/dist/core/constants.js.map +1 -1
- package/dist/core/data-file.d.ts +7 -0
- package/dist/core/data-file.d.ts.map +1 -1
- package/dist/core/data-file.js +17 -0
- package/dist/core/data-file.js.map +1 -1
- package/dist/core/format.d.ts +36 -0
- package/dist/core/format.d.ts.map +1 -0
- package/dist/core/format.js +39 -0
- package/dist/core/format.js.map +1 -0
- package/dist/core/hash.d.ts +14 -0
- package/dist/core/hash.d.ts.map +1 -0
- package/dist/core/hash.js +17 -0
- package/dist/core/hash.js.map +1 -0
- package/dist/core/json-schema.d.ts +2 -0
- package/dist/core/json-schema.d.ts.map +1 -1
- package/dist/core/json-schema.js +14 -13
- package/dist/core/json-schema.js.map +1 -1
- package/dist/core/labeled-tensor.d.ts.map +1 -1
- package/dist/core/labeled-tensor.js +0 -8
- package/dist/core/labeled-tensor.js.map +1 -1
- package/dist/core/mathts-read.d.ts +25 -0
- package/dist/core/mathts-read.d.ts.map +1 -0
- package/dist/core/mathts-read.js +51 -0
- package/dist/core/mathts-read.js.map +1 -0
- package/dist/core/tensor.d.ts.map +1 -1
- package/dist/core/tensor.js +24 -0
- package/dist/core/tensor.js.map +1 -1
- package/dist/core/types.d.ts +5 -5
- package/dist/diff/bridge-gradient.d.ts +19 -6
- package/dist/diff/bridge-gradient.d.ts.map +1 -1
- package/dist/diff/bridge-gradient.js +19 -11
- package/dist/diff/bridge-gradient.js.map +1 -1
- package/dist/diff/bridge-specs.d.ts.map +1 -1
- package/dist/diff/bridge-specs.js +3 -0
- package/dist/diff/bridge-specs.js.map +1 -1
- package/dist/dimensional/algebra.d.ts +18 -0
- package/dist/dimensional/algebra.d.ts.map +1 -1
- package/dist/dimensional/algebra.js +41 -1
- package/dist/dimensional/algebra.js.map +1 -1
- package/dist/dimensional/ast-builders.d.ts +7 -0
- package/dist/dimensional/ast-builders.d.ts.map +1 -1
- package/dist/dimensional/ast-builders.js +11 -0
- package/dist/dimensional/ast-builders.js.map +1 -1
- package/dist/dimensional/ast-leaves.d.ts +81 -0
- package/dist/dimensional/ast-leaves.d.ts.map +1 -0
- package/dist/dimensional/ast-leaves.js +146 -0
- package/dist/dimensional/ast-leaves.js.map +1 -0
- package/dist/dimensional/buckingham.d.ts.map +1 -1
- package/dist/dimensional/buckingham.js +15 -27
- package/dist/dimensional/buckingham.js.map +1 -1
- package/dist/dimensional/constant-rows.js +9 -9
- package/dist/dimensional/constant-rows.js.map +1 -1
- package/dist/dimensional/dimension-inference.d.ts.map +1 -1
- package/dist/dimensional/dimension-inference.js +1 -2
- package/dist/dimensional/dimension-inference.js.map +1 -1
- package/dist/dimensional/errors.d.ts +1 -1
- package/dist/dimensional/errors.d.ts.map +1 -1
- package/dist/dimensional/errors.js +1 -15
- package/dist/dimensional/errors.js.map +1 -1
- package/dist/dimensional/exact-scale.d.ts +0 -17
- package/dist/dimensional/exact-scale.d.ts.map +1 -1
- package/dist/dimensional/exact-scale.js +8 -8
- package/dist/dimensional/exact-scale.js.map +1 -1
- package/dist/dimensional/gauge-field.d.ts.map +1 -1
- package/dist/dimensional/gauge-field.js +2 -2
- package/dist/dimensional/gauge-field.js.map +1 -1
- package/dist/dimensional/hyphen-names.d.ts +12 -2
- package/dist/dimensional/hyphen-names.d.ts.map +1 -1
- package/dist/dimensional/hyphen-names.js +44 -19
- package/dist/dimensional/hyphen-names.js.map +1 -1
- package/dist/dimensional/metric.d.ts.map +1 -1
- package/dist/dimensional/metric.js +0 -1
- package/dist/dimensional/metric.js.map +1 -1
- package/dist/dimensional/symbolic-constants.d.ts +9 -0
- package/dist/dimensional/symbolic-constants.d.ts.map +1 -1
- package/dist/dimensional/symbolic-constants.js +13 -1
- package/dist/dimensional/symbolic-constants.js.map +1 -1
- package/dist/dimensional/types.d.ts +36 -0
- package/dist/dimensional/types.d.ts.map +1 -1
- package/dist/dimensional/types.js +45 -7
- package/dist/dimensional/types.js.map +1 -1
- package/dist/dimensional/unit-data.js +2 -2
- package/dist/dimensional/unit-data.js.map +1 -1
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -4
- package/dist/index.js.map +1 -1
- package/dist/numerical/christoffel-flat.d.ts.map +1 -1
- package/dist/numerical/christoffel-flat.js +3 -2
- package/dist/numerical/christoffel-flat.js.map +1 -1
- package/dist/numerical/covariant-eikonal.d.ts.map +1 -1
- package/dist/numerical/covariant-eikonal.js +34 -11
- package/dist/numerical/covariant-eikonal.js.map +1 -1
- package/dist/numerical/curvature-lowering-helpers.js +3 -2
- package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
- package/dist/numerical/errors.d.ts.map +1 -1
- package/dist/numerical/errors.js +0 -3
- package/dist/numerical/errors.js.map +1 -1
- package/dist/numerical/finite-difference.d.ts +22 -0
- package/dist/numerical/finite-difference.d.ts.map +1 -0
- package/dist/numerical/finite-difference.js +27 -0
- package/dist/numerical/finite-difference.js.map +1 -0
- package/dist/numerical/geodesic-integrator.d.ts.map +1 -1
- package/dist/numerical/geodesic-integrator.js +22 -14
- package/dist/numerical/geodesic-integrator.js.map +1 -1
- package/dist/numerical/geometrized.d.ts.map +1 -1
- package/dist/numerical/geometrized.js +0 -1
- package/dist/numerical/geometrized.js.map +1 -1
- package/dist/numerical/mathts-engine.d.ts.map +1 -1
- package/dist/numerical/mathts-engine.js +10 -24
- package/dist/numerical/mathts-engine.js.map +1 -1
- package/dist/numerical/metric-inverse.d.ts.map +1 -1
- package/dist/numerical/metric-inverse.js +83 -46
- package/dist/numerical/metric-inverse.js.map +1 -1
- package/dist/numerical/null-ray-integrator.d.ts +2 -1
- package/dist/numerical/null-ray-integrator.d.ts.map +1 -1
- package/dist/numerical/null-ray-integrator.js +12 -12
- package/dist/numerical/null-ray-integrator.js.map +1 -1
- package/dist/numerical/painleve-gullstrand-metric.js +2 -2
- package/dist/numerical/painleve-gullstrand-metric.js.map +1 -1
- package/dist/numerical/perihelion-finder.d.ts +0 -36
- package/dist/numerical/perihelion-finder.d.ts.map +1 -1
- package/dist/numerical/perihelion-finder.js +41 -87
- package/dist/numerical/perihelion-finder.js.map +1 -1
- package/dist/numerical/quadrature.d.ts.map +1 -1
- package/dist/numerical/quadrature.js +8 -10
- package/dist/numerical/quadrature.js.map +1 -1
- package/dist/numerical/rk4-trajectory.d.ts +10 -0
- package/dist/numerical/rk4-trajectory.d.ts.map +1 -0
- package/dist/numerical/rk4-trajectory.js +37 -0
- package/dist/numerical/rk4-trajectory.js.map +1 -0
- package/dist/numerical/schwarzschild.d.ts +14 -0
- package/dist/numerical/schwarzschild.d.ts.map +1 -0
- package/dist/numerical/schwarzschild.js +17 -0
- package/dist/numerical/schwarzschild.js.map +1 -0
- package/dist/numerical/spacetime-metrics.d.ts +12 -0
- package/dist/numerical/spacetime-metrics.d.ts.map +1 -1
- package/dist/numerical/spacetime-metrics.js +72 -56
- package/dist/numerical/spacetime-metrics.js.map +1 -1
- package/dist/numerical/statistics.d.ts +24 -0
- package/dist/numerical/statistics.d.ts.map +1 -0
- package/dist/numerical/statistics.js +52 -0
- package/dist/numerical/statistics.js.map +1 -0
- package/dist/numerical/tensor-engine.d.ts +21 -0
- package/dist/numerical/tensor-engine.d.ts.map +1 -1
- package/dist/numerical/tensor-engine.js +12 -0
- package/dist/numerical/tensor-engine.js.map +1 -1
- package/dist/relations/regime.d.ts +10 -0
- package/dist/relations/regime.d.ts.map +1 -1
- package/dist/relations/regime.js +18 -1
- package/dist/relations/regime.js.map +1 -1
- package/package.json +7 -7
|
@@ -22,9 +22,11 @@
|
|
|
22
22
|
*
|
|
23
23
|
* @module composition/canonical-compare
|
|
24
24
|
*/
|
|
25
|
+
import { matrixRank, ols } from '@danielsimonjr/mathts-functions';
|
|
25
26
|
import { equals } from '../dimensional/algebra.js';
|
|
26
27
|
import { CANONICAL_EQUATIONS } from '../canonical/registry.js';
|
|
27
|
-
import { CONSTANTS, piMultipleValue } from '../dimensional/symbolic-constants.js';
|
|
28
|
+
import { CONSTANTS, isRegisteredConstant, piMultipleValue } from '../dimensional/symbolic-constants.js';
|
|
29
|
+
import { forEachScalarLeaf, isDecimalLiteral } from '../dimensional/ast-leaves.js';
|
|
28
30
|
import { evalExpr } from './expr-eval.js';
|
|
29
31
|
import { CANONICAL_GROUP_PREFACTORS, canonicalPrefactor } from './canonical-prefactors.js';
|
|
30
32
|
import { formulaNameDimensions } from '../dimensional/formula-names.js';
|
|
@@ -35,16 +37,15 @@ import { getFormulaParser, parsePhysics } from '../numerical/formula-registry.js
|
|
|
35
37
|
import { formulaSymbolDimension } from '../numerical/formula-dimension.js';
|
|
36
38
|
import { CATALOG_GRAPH } from './catalog-graph.js';
|
|
37
39
|
import { DIMENSIONLESS } from '../dimensional/types.js';
|
|
40
|
+
import { FIXED_POINT_EXPONENTS, constantRatio, fixedPoint } from '../canonical/fixed-points.js';
|
|
41
|
+
import { formatRational, rationalize } from './rational-exponent.js';
|
|
38
42
|
/**
|
|
39
43
|
* The comparison points: variable `i` (in sorted name order) takes the value
|
|
40
|
-
* `(1.7 + i)^p` at
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* every ratio such as ℓ/g fixed, and `T ∝ ℓ/g` would then pass as the form of
|
|
44
|
-
* `T ∝ √(ℓ/g)`.
|
|
45
|
-
* @internal
|
|
44
|
+
* `(1.7 + i)^p` at each exponent of `FIXED_POINT_EXPONENTS`, the scheme
|
|
45
|
+
* `upt derive` uses to recover a prefactor (`canonical/fixed-points.ts` says
|
|
46
|
+
* why each variable has its own base).
|
|
46
47
|
*/
|
|
47
|
-
const
|
|
48
|
+
const COMPARISON_SCHEME = { base: 1.7, step: 1 };
|
|
48
49
|
/** Relative tolerance for "the ratio is constant" and "the ratio is 1". @internal */
|
|
49
50
|
const RATIO_TOLERANCE = 1e-9;
|
|
50
51
|
/** What a dimensionless registry stub stands for, when the symbol is not the latex. */
|
|
@@ -123,7 +124,7 @@ function peelConstantAliases(sources, variables, constants) {
|
|
|
123
124
|
continue;
|
|
124
125
|
}
|
|
125
126
|
// h and ħ are both action. A formula that writes one is not the other.
|
|
126
|
-
if (
|
|
127
|
+
if (isRegisteredConstant(s.name)) {
|
|
127
128
|
forVariables.push(s);
|
|
128
129
|
continue;
|
|
129
130
|
}
|
|
@@ -157,16 +158,12 @@ function targetThroughRestatedBridge(entry, wantTarget) {
|
|
|
157
158
|
}
|
|
158
159
|
/** The free (non-constant, non-literal) symbols of an AST, with their dimensions. */
|
|
159
160
|
function freeSymbols(node, out) {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
if (!
|
|
163
|
-
out.set(
|
|
161
|
+
// The arms are `op` and `tensor-product`: the two node kinds that carry `args`.
|
|
162
|
+
forEachScalarLeaf(node, (leaf) => {
|
|
163
|
+
if (!isDecimalLiteral(leaf.name) && !isRegisteredConstant(leaf.name) && piMultipleValue(leaf.name) === undefined) {
|
|
164
|
+
out.set(leaf.name, leaf.dim);
|
|
164
165
|
}
|
|
165
|
-
|
|
166
|
-
}
|
|
167
|
-
const args = node.args ?? [];
|
|
168
|
-
for (const a of args)
|
|
169
|
-
freeSymbols(a, out);
|
|
166
|
+
}, { tensorProduct: true });
|
|
170
167
|
return out;
|
|
171
168
|
}
|
|
172
169
|
/**
|
|
@@ -246,20 +243,113 @@ function alignmentDetail(symbols, variables) {
|
|
|
246
243
|
}
|
|
247
244
|
return 'its variables could not be aligned by name or by a unique dimension';
|
|
248
245
|
}
|
|
246
|
+
/** The relative tolerance within which a fitted exponent is a small rational, and R² is 1. */
|
|
247
|
+
const EXPONENT_FIT_TOLERANCE = 1e-6;
|
|
248
|
+
/** The denominator cap of a rationalised exponent difference. */
|
|
249
|
+
const EXPONENT_MAX_DENOMINATOR = 24;
|
|
250
|
+
/**
|
|
251
|
+
* Fit `log|ratio|` on the logs of the variables over a full-rank design: the
|
|
252
|
+
* base point of the comparison scheme, each variable doubled, each variable
|
|
253
|
+
* quadrupled, and all of them doubled together (2k + 2 rows for k variables,
|
|
254
|
+
* so a difference that is not a monomial has rows to fail on). The design's
|
|
255
|
+
* rank is checked before the fit. `undefined` when there is no variable, when
|
|
256
|
+
* the ratio is zero, negative or not finite at a point, or when the fit
|
|
257
|
+
* cannot run.
|
|
258
|
+
*
|
|
259
|
+
* @internal
|
|
260
|
+
*/
|
|
261
|
+
export function diagnoseExponentDifference(names, ratioAt) {
|
|
262
|
+
const k = names.length;
|
|
263
|
+
if (k === 0)
|
|
264
|
+
return undefined;
|
|
265
|
+
const base = fixedPoint(names, 1, COMPARISON_SCHEME);
|
|
266
|
+
const scales = [Array(k).fill(1)];
|
|
267
|
+
for (const factor of [2, 4]) {
|
|
268
|
+
for (let i = 0; i < k; i++) {
|
|
269
|
+
const row = Array(k).fill(1);
|
|
270
|
+
row[i] = factor;
|
|
271
|
+
scales.push(row);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
scales.push(Array(k).fill(2));
|
|
275
|
+
const logX = [];
|
|
276
|
+
const y = [];
|
|
277
|
+
for (const row of scales) {
|
|
278
|
+
const point = {};
|
|
279
|
+
names.forEach((name, i) => {
|
|
280
|
+
point[name] = base[name] * row[i];
|
|
281
|
+
});
|
|
282
|
+
let ratio;
|
|
283
|
+
try {
|
|
284
|
+
ratio = ratioAt(point);
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
return undefined;
|
|
288
|
+
}
|
|
289
|
+
if (!Number.isFinite(ratio) || ratio <= 0)
|
|
290
|
+
return undefined;
|
|
291
|
+
logX.push(row.map((s) => Math.log(s)));
|
|
292
|
+
y.push(Math.log(ratio));
|
|
293
|
+
}
|
|
294
|
+
if (matrixRank(logX) !== k)
|
|
295
|
+
return undefined;
|
|
296
|
+
let fit;
|
|
297
|
+
try {
|
|
298
|
+
fit = ols(logX, y);
|
|
299
|
+
}
|
|
300
|
+
catch {
|
|
301
|
+
return undefined;
|
|
302
|
+
}
|
|
303
|
+
const exponents = {};
|
|
304
|
+
const exact = {};
|
|
305
|
+
names.forEach((name, i) => {
|
|
306
|
+
const c = fit.coefficients[i + 1];
|
|
307
|
+
if (Math.abs(c) < 1e-9) {
|
|
308
|
+
exponents[name] = 0;
|
|
309
|
+
exact[name] = '0';
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
const q = rationalize(c, { maxDenominator: EXPONENT_MAX_DENOMINATOR, tolerance: EXPONENT_FIT_TOLERANCE });
|
|
313
|
+
exponents[name] = q === undefined ? c : Number(q.numerator) / Number(q.denominator);
|
|
314
|
+
exact[name] = q === undefined ? c.toPrecision(6) : formatRational(q);
|
|
315
|
+
});
|
|
316
|
+
const r2 = fit.r2;
|
|
317
|
+
return { exponents, exact, r2, monomial: Number.isFinite(r2) && r2 >= 1 - 1e-9 };
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* One line for an exponent difference: `yours/canonical ∝ mass^-1 (R² = 1):
|
|
321
|
+
* the difference is a monomial in these variables`. A rational exponent is
|
|
322
|
+
* braced (`speed^{1/2}`), a unit one is bare, a zero one is omitted.
|
|
323
|
+
*
|
|
324
|
+
* @internal
|
|
325
|
+
*/
|
|
326
|
+
export function describeExponentDifference(d) {
|
|
327
|
+
const parts = Object.keys(d.exact)
|
|
328
|
+
.sort()
|
|
329
|
+
.filter((name) => d.exact[name] !== '0')
|
|
330
|
+
.map((name) => {
|
|
331
|
+
const e = d.exact[name];
|
|
332
|
+
if (e === '1')
|
|
333
|
+
return name;
|
|
334
|
+
return e.includes('/') ? `${name}^{${e}}` : `${name}^${e}`;
|
|
335
|
+
});
|
|
336
|
+
const r2 = d.monomial ? '1' : Number.isFinite(d.r2) ? d.r2.toFixed(3) : 'undefined';
|
|
337
|
+
const verdict = d.monomial
|
|
338
|
+
? 'the difference is a monomial in these variables'
|
|
339
|
+
: 'the difference is not a monomial in these variables (R² below 1)';
|
|
340
|
+
return `yours/canonical ∝ ${parts.join(' · ') || '1'} (R² = ${r2}): ${verdict}`;
|
|
341
|
+
}
|
|
249
342
|
/** True when every alignment produced the same ratio at each fixed point. */
|
|
250
343
|
function sameRatios(series) {
|
|
251
344
|
const first = series[0];
|
|
252
345
|
if (first === undefined)
|
|
253
346
|
return false;
|
|
254
|
-
return
|
|
255
|
-
const r0 = first[i];
|
|
256
|
-
return Number.isFinite(r) && Number.isFinite(r0) && r0 !== 0 && Math.abs(r / r0 - 1) <= RATIO_TOLERANCE;
|
|
257
|
-
}));
|
|
347
|
+
return first.every((_, i) => constantRatio(series.map((s) => s[i]), RATIO_TOLERANCE).constant);
|
|
258
348
|
}
|
|
259
349
|
function classify(entry, ratios, recordsPrefactor) {
|
|
260
350
|
const base = { id: entry.id, name: entry.name };
|
|
261
351
|
const r0 = ratios[0];
|
|
262
|
-
const constant = ratios
|
|
352
|
+
const constant = constantRatio(ratios, RATIO_TOLERANCE).constant;
|
|
263
353
|
if (!constant)
|
|
264
354
|
return { ...base, kind: 'form' };
|
|
265
355
|
if (!recordsPrefactor) {
|
|
@@ -375,7 +465,7 @@ export function compareWithCanonical(target, sources, evaluateUser, entries = CA
|
|
|
375
465
|
const paired = byDimension.length > 0 ? { paired: byDimension } : {};
|
|
376
466
|
const names = variables.map((g) => normalize(g.name)).sort();
|
|
377
467
|
const points = FIXED_POINT_EXPONENTS.map((p) => {
|
|
378
|
-
const row =
|
|
468
|
+
const row = fixedPoint(names, p, COMPARISON_SCHEME);
|
|
379
469
|
if (boundGroup !== undefined)
|
|
380
470
|
row['__group'] = Math.pow(2.3, p);
|
|
381
471
|
return row;
|
|
@@ -491,8 +581,16 @@ export function compareWithCanonical(target, sources, evaluateUser, entries = CA
|
|
|
491
581
|
? `the dimensionless group ${groupSpec.group} is bound, so the prefactor includes ${groupSpec.coefficient}·${groupSpec.group}^${groupSpec.exponent}`
|
|
492
582
|
: undefined;
|
|
493
583
|
const classified = classify(entry, ratios, recordsPrefactor);
|
|
584
|
+
// A form mismatch gets its diagnosis: which exponent differs, by a log-design fit.
|
|
585
|
+
const exponentDifference = classified.kind === 'form'
|
|
586
|
+
? diagnoseExponentDifference(names, (point) => {
|
|
587
|
+
const row = boundGroup === undefined ? point : { ...point, __group: 2.3 };
|
|
588
|
+
return userAt(row) / canonicalAt(row);
|
|
589
|
+
})
|
|
590
|
+
: undefined;
|
|
494
591
|
results.push({
|
|
495
592
|
...classified,
|
|
593
|
+
...(exponentDifference === undefined ? {} : { exponentDifference }),
|
|
496
594
|
...(extension !== undefined && classified.detail === undefined ? { detail: extension } : {}),
|
|
497
595
|
...(names.length === 0 ? { constantsOnly: true } : {}),
|
|
498
596
|
...paired, ...targetVia,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical-compare.js","sourceRoot":"","sources":["../../src/composition/canonical-compare.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Compare a user's formula with the canonical (textbook) equation it restates.\n *\n * Dimensional analysis cannot see a dimensionless prefactor, so `T = π√(ℓ/g)`\n * and `K = m v²` pass every dimensional check. When the registry holds an\n * equation with the same target and the same variables, this module evaluates\n * both sides at {@link FIXED_POINT_EXPONENTS}, fixed points documented here, and\n * classifies the ratio `yours / canonical`:\n *\n * - `agrees` — constant and equal to 1: the prefactor is checked and right.\n * - `factor` — constant but not 1: the forms agree and the prefactor does not.\n * - `form` — not constant across the points: a different law.\n * - `prefactor-unchecked` — the forms agree, but the registry records the law\n * only up to a constant or only dimensionally, so it holds no prefactor to\n * compare with. That is reported as unchecked, never as agreement.\n * - `not-compared` — the variables could not be aligned, or an evaluation\n * failed; `detail` says which.\n *\n * The points are fixed so the output is identical on every run.\n *\n * INTERNAL — surfaced by `upt map --equation` and `upt derive --formula`.\n *\n * @module composition/canonical-compare\n */\n\nimport type { ExprNode } from '../dimensional/validator.js';\nimport type { Dimension } from '../dimensional/types.js';\nimport { equals } from '../dimensional/algebra.js';\nimport { CANONICAL_EQUATIONS } from '../canonical/registry.js';\nimport type { CanonicalEquation } from '../canonical/canonical-equation.js';\nimport { CONSTANTS, piMultipleValue } from '../dimensional/symbolic-constants.js';\nimport { evalExpr } from './expr-eval.js';\nimport { CANONICAL_GROUP_PREFACTORS, canonicalPrefactor } from './canonical-prefactors.js';\nimport { formulaNameDimensions } from '../dimensional/formula-names.js';\nimport { NAME_TABLE } from './aliases.js';\nimport { parseUserEquation } from './user-equation.js';\nimport { resolveQuantityName } from '../dimensional/formula-names.js';\nimport { getFormulaParser, parsePhysics } from '../numerical/formula-registry.js';\nimport { formulaSymbolDimension } from '../numerical/formula-dimension.js';\nimport type { CompiledFormula } from '../numerical/formula-contract.js';\nimport { CATALOG_GRAPH } from './catalog-graph.js';\nimport { DIMENSIONLESS } from '../dimensional/types.js';\n\n/**\n * The comparison points: variable `i` (in sorted name order) takes the value\n * `(1.7 + i)^p` at point `p` of this list, the scheme `upt derive` uses to\n * recover a prefactor. Each variable has its own base, so the RATIOS between\n * variables change from point to point too. A common scale factor would leave\n * every ratio such as ℓ/g fixed, and `T ∝ ℓ/g` would then pass as the form of\n * `T ∝ √(ℓ/g)`.\n * @internal\n */\nconst FIXED_POINT_EXPONENTS: readonly number[] = [1, 1.3, 1.6];\n\n/** Relative tolerance for \"the ratio is constant\" and \"the ratio is 1\". @internal */\nconst RATIO_TOLERANCE = 1e-9;\n\n/** What a dimensionless registry stub stands for, when the symbol is not the latex. */\nconst STUB_GLOSS: Readonly<Record<string, string>> = {\n one_minus_e_sq: '1-e²',\n};\n\n/** How a user formula compares with one canonical equation. @internal */\nexport interface CanonicalComparison {\n readonly id: string;\n readonly name: string;\n readonly kind: 'agrees' | 'factor' | 'form' | 'prefactor-unchecked' | 'not-compared';\n /** `yours / canonical`, present only for `agrees` and `factor`. */\n readonly ratio?: number;\n /** Why the prefactor is unchecked, or why no comparison was made. */\n readonly detail?: string;\n /** `[yours, canonical]` for each variable paired by dimension, not by name (persona finding N1). */\n readonly paired?: readonly (readonly [string, string])[];\n /**\n * True when neither side has a free variable (every name is a registered constant, persona\n * finding W5): the two sides are compared once, at the SI constant values, so the form is not\n * tested, only the value.\n */\n readonly constantsOnly?: true;\n /**\n * Present when your target matched through the catalog bridge this entry restates\n * (`restatesBridge`), not by the entry's own target name: that bridge's id and the entry's target.\n */\n readonly targetVia?: { readonly bridge: string; readonly its: string };\n /**\n * Set when the comparison evaluated c, ħ, h or G at a non-SI value\n * (`--natural` / `--geometrized`). Absent on an SI comparison.\n */\n readonly evaluatedAt?: string;\n}\n\n/** A user source variable; with a dimension it may pair with a differently named canonical variable. */\nexport type ComparisonSource = string | { readonly name: string; readonly dim: Dimension };\n\nconst normalize = (name: string): string => name.replace(/_/g, '-');\n\n/**\n * Pair each user source with one canonical variable: by name first, then by a dimension that\n * exactly one remaining canonical variable carries, repeated until nothing changes. `null` when the\n * sources cannot be this entry's variables (a count, a name without a dimension, or a dimension no\n * variable left carries); `'ambiguous'` when every source has a same-dimension partner but the\n * pairing is not unique. Returns user name → canonical name, both normalized.\n */\nfunction pairSources(\n sources: readonly { name: string; dim?: Dimension }[],\n variables: readonly { name: string; dim: Dimension }[],\n): Map<string, string> | 'ambiguous' | null {\n if (sources.length !== variables.length) return null;\n const pairs = new Map<string, string>();\n const freeVars = new Map(variables.map((v) => [normalize(v.name), v.dim]));\n let open = sources.filter((s) => {\n if (!freeVars.has(s.name)) return true;\n pairs.set(s.name, s.name);\n freeVars.delete(s.name);\n return false;\n });\n let progress = true;\n while (open.length > 0 && progress) {\n progress = false;\n for (const s of open) {\n if (s.dim === undefined) return null;\n const partners = [...freeVars].filter(([, dim]) => equals(dim, s.dim!));\n if (partners.length === 0) return null;\n if (partners.length === 1) {\n pairs.set(s.name, partners[0]![0]);\n freeVars.delete(partners[0]![0]);\n progress = true;\n }\n }\n open = open.filter((s) => !pairs.has(s.name));\n }\n return open.length === 0 ? pairs : 'ambiguous';\n}\n\n/**\n * Peel user sources that restate a CE governing *constant* (persona finding W1).\n *\n * CE-mass-energy lists `c` as governing, but `c` is in {@link CONSTANTS}, so it is not a free\n * variable of the comparison. Writing the catalog quantity `speed-of-light` (same dimension) must\n * not make the source set look larger than `{mass}` and skip the prefactor check. A source pairs\n * with a constant by name, or by a dimension that exactly one remaining constant carries and that\n * no free variable carries (variables win — `velocity` still pairs with CE-kinetic-energy's\n * `speed`). Returns the sources left for {@link pairSources}, plus user→constant name pairs.\n * Leftover sources that match no variable and no unique constant make the entry a non-match\n * (`null` from the caller when `forVariables` then fails to pair).\n */\nfunction peelConstantAliases(\n sources: readonly { name: string; dim?: Dimension }[],\n variables: readonly { name: string; dim: Dimension }[],\n constants: readonly { name: string; dim: Dimension }[],\n): { forVariables: { name: string; dim?: Dimension }[]; constPairs: Map<string, string> } {\n const constPairs = new Map<string, string>();\n const freeConsts = new Map(constants.map((c) => [normalize(c.name), c.dim]));\n const forVariables: { name: string; dim?: Dimension }[] = [];\n for (const s of sources) {\n if (variables.some((v) => normalize(v.name) === s.name)) {\n forVariables.push(s);\n continue;\n }\n if (freeConsts.has(s.name)) {\n constPairs.set(s.name, s.name);\n freeConsts.delete(s.name);\n continue;\n }\n if (s.dim !== undefined) {\n const varHits = variables.filter((v) => equals(v.dim, s.dim!));\n if (varHits.length > 0) {\n forVariables.push(s);\n continue;\n }\n // h and ħ are both action. A formula that writes one is not the other.\n if (Object.prototype.hasOwnProperty.call(CONSTANTS, s.name)) {\n forVariables.push(s);\n continue;\n }\n const constHits = [...freeConsts].filter(([, dim]) => equals(dim, s.dim!));\n if (constHits.length === 1) {\n constPairs.set(s.name, constHits[0]![0]);\n freeConsts.delete(constHits[0]![0]);\n continue;\n }\n }\n forVariables.push(s);\n }\n return { forVariables, constPairs };\n}\n\n/** A governing variable that is a registered physical constant of the same dimension. */\nfunction isConstant(v: { name: string; dim: Dimension }): boolean {\n const c = CONSTANTS[v.name];\n return c !== undefined && equals(c.dim, v.dim);\n}\n\n/**\n * The catalog bridge through which `wantTarget` names this entry's target: the entry records that\n * it restates that bridge (`restatesBridge`), and the bridge's graph edge has `wantTarget` as its\n * target (persona finding W7: `landauer-erasure-energy` is BE-16's target, and CE-landauer, which\n * restates BE-16, names it `erasure-energy`). A recorded restatement, never a shared dimension.\n */\nfunction targetThroughRestatedBridge(entry: CanonicalEquation, wantTarget: string): string | undefined {\n if (entry.restatesBridge === undefined) return undefined;\n const beId = Number(entry.restatesBridge);\n return CATALOG_GRAPH.find((e) => e.beId === beId && normalize(e.target.name) === wantTarget)?.id;\n}\n\n/** The free (non-constant, non-literal) symbols of an AST, with their dimensions. */\nfunction freeSymbols(node: ExprNode, out: Map<string, Dimension>): Map<string, Dimension> {\n if (node.kind === 'symbol') {\n const literal = Number.isFinite(Number(node.name));\n if (!literal && CONSTANTS[node.name] === undefined && piMultipleValue(node.name) === undefined) {\n out.set(node.name, node.dim);\n }\n return out;\n }\n const args = (node as { args?: readonly ExprNode[] }).args ?? [];\n for (const a of args) freeSymbols(a, out);\n return out;\n}\n\n/**\n * Dimensionless symbols the entry's AST holds that its governing set does not, and that the user\n * names too: CE-ideal-gas writes `P = N k_B T/V` with the count `N` in its AST only (persona finding\n * L6). They join the comparison variables BY NAME only; pairing a dimensionless stub such as\n * `one_minus_e_sq` with any dimensionless user quantity by dimension would compare different laws.\n */\nfunction astOnlyCounts(\n entry: CanonicalEquation,\n userNames: ReadonlySet<string>,\n): { name: string; dim: Dimension }[] {\n if (entry.scalarAst === undefined) return [];\n const governing = new Set(entry.dimensional.governing.map((g) => normalize(g.name)));\n return [...freeSymbols(entry.scalarAst, new Map())]\n .filter(([name, dim]) => /^[A-Za-z][A-Za-z0-9_]*$/.test(name) && equals(dim, DIMENSIONLESS))\n .filter(([name]) => !governing.has(normalize(name)) && userNames.has(normalize(name)))\n .map(([name, dim]) => ({ name, dim }));\n}\n\n/**\n * Every way to map free AST symbols onto governing variables: by name first,\n * then any bijection that respects dimension. One map when each remaining\n * symbol has a unique dimension; several when a product such as m₁ m₂ can be\n * assigned either way. Empty when the counts differ or a symbol has no\n * variable of its dimension. More than 24 bijections is treated as empty —\n * that pairing is not checked, rather than searched.\n */\nfunction symbolAlignments(\n symbols: ReadonlyMap<string, Dimension>,\n governing: readonly { name: string; dim: Dimension }[],\n): Map<string, string>[] {\n if (symbols.size !== governing.length) return [];\n const assignment = new Map<string, string>();\n const free = new Set(governing.map((g) => g.name));\n for (const s of [...symbols.keys()].sort()) {\n if (free.has(s)) {\n assignment.set(s, s);\n free.delete(s);\n }\n }\n const rest = [...symbols.entries()]\n .filter(([s]) => !assignment.has(s))\n .sort(([a], [b]) => a.localeCompare(b));\n const out: Map<string, string>[] = [];\n const CAP = 24;\n const rec = (i: number): void => {\n if (out.length > CAP) return;\n if (i === rest.length) {\n out.push(new Map(assignment));\n return;\n }\n const [s, dim] = rest[i]!;\n const candidates = governing\n .filter((g) => free.has(g.name) && equals(g.dim, dim))\n .map((g) => g.name)\n .sort();\n for (const c of candidates) {\n assignment.set(s, c);\n free.delete(c);\n rec(i + 1);\n free.add(c);\n assignment.delete(s);\n if (out.length > CAP) return;\n }\n };\n rec(0);\n return out.length > CAP ? [] : out;\n}\n\n/** Why an AST could not be aligned, naming a dimensionless stub the user did not. */\nfunction alignmentDetail(\n symbols: ReadonlyMap<string, Dimension>,\n variables: readonly { name: string; dim: Dimension }[],\n): string {\n const named = new Set(variables.map((v) => v.name));\n const stubs = [...symbols.entries()]\n .filter(([name, dim]) => !named.has(name) && equals(dim, DIMENSIONLESS))\n .map(([name]) => name)\n .sort();\n if (symbols.size !== variables.length && stubs.length > 0) {\n const shown = stubs.map((s) => (STUB_GLOSS[s] === undefined ? s : `${s} (${STUB_GLOSS[s]})`));\n return `its formula depends on ${shown.join(', ')}, which your formula does not name`;\n }\n return 'its variables could not be aligned by name or by a unique dimension';\n}\n\n/** True when every alignment produced the same ratio at each fixed point. */\nfunction sameRatios(series: readonly (readonly number[])[]): boolean {\n const first = series[0];\n if (first === undefined) return false;\n return series.every((s) =>\n s.every((r, i) => {\n const r0 = first[i]!;\n return Number.isFinite(r) && Number.isFinite(r0) && r0 !== 0 && Math.abs(r / r0 - 1) <= RATIO_TOLERANCE;\n }),\n );\n}\n\nfunction classify(\n entry: CanonicalEquation,\n ratios: readonly number[],\n recordsPrefactor: boolean,\n): CanonicalComparison {\n const base = { id: entry.id, name: entry.name };\n const r0 = ratios[0]!;\n const constant = ratios.every((r) => Math.abs(r / r0 - 1) <= RATIO_TOLERANCE);\n if (!constant) return { ...base, kind: 'form' };\n if (!recordsPrefactor) {\n return {\n ...base,\n kind: 'prefactor-unchecked',\n detail:\n entry.epistemicStatus === 'dimensional'\n ? 'the registry records its dimensional form only'\n : entry.epistemicStatus === 'fully-quantitative' && entry.fieldEquation !== undefined\n ? 'the registry records its prefactor only in its field equation, and its scalar record is the dimensional monomial'\n : entry.epistemicStatus === 'fully-quantitative'\n ? 'its scalar record is the dimensional monomial only'\n : 'the registry records it only up to a constant',\n };\n }\n return Math.abs(r0 - 1) <= RATIO_TOLERANCE\n ? { ...base, kind: 'agrees', ratio: r0 }\n : { ...base, kind: 'factor', ratio: r0 };\n}\n\n/**\n * Compare a user formula with every canonical equation that has the same\n * target and the same non-constant variables. The target must match by name\n * (after `_` → `-`): pairing it by dimension would reach every law of that\n * dimension. Each source matches a variable by name, or, when the source\n * carries a dimension, by a dimension exactly one remaining variable carries\n * (`velocity` → CE-kinetic-energy's `speed`); such pairs are listed in\n * `paired`. A non-unique pairing is reported as `not-compared`, never guessed.\n * `evaluateUser` receives values keyed by the user's (normalized) source names.\n * Returns one comparison per matching entry, in registry order; empty when\n * no entry matches.\n *\n * @internal\n */\nfunction overrideValue(\n name: string,\n si: number,\n overrides: Readonly<Record<string, number>> | undefined,\n): number {\n if (overrides !== undefined && Object.prototype.hasOwnProperty.call(overrides, name)) return overrides[name]!;\n return si;\n}\n\n/** A short label for a non-SI constant table, or undefined when the table is SI. */\nfunction overrideLabel(overrides: Readonly<Record<string, number>> | undefined): string | undefined {\n if (overrides === undefined) return undefined;\n const bits: string[] = [];\n if (overrides.c === 1) bits.push('c = 1');\n if (overrides.hbar === 1) bits.push('ħ = 1');\n if (overrides.h === 2 * Math.PI) bits.push('h = 2π');\n if (overrides.G === 1) bits.push('G = 1');\n return bits.length === 0 ? undefined : bits.join(', ');\n}\n\n/** Compare a user expression against the canonical equations that share its target and source quantities. `evaluateUser` is called only for the user's expression; each canonical value comes from that entry's `scalarAst` or from its registry monomial. */\nexport function compareWithCanonical(\n target: string,\n sources: readonly ComparisonSource[],\n evaluateUser: (values: Readonly<Record<string, number>>) => number,\n entries: readonly CanonicalEquation[] = CANONICAL_EQUATIONS,\n constantOverrides?: Readonly<Record<string, number>>,\n): CanonicalComparison[] {\n const wantTarget = normalize(target);\n const wantSources = new Map<string, { name: string; dim?: Dimension }>();\n for (const s of sources) {\n const name = normalize(typeof s === 'string' ? s : s.name);\n if (!wantSources.has(name)) wantSources.set(name, typeof s === 'string' ? { name } : { name, dim: s.dim });\n }\n const results: CanonicalComparison[] = [];\n\n for (const entry of entries) {\n const d = entry.dimensional;\n const via = normalize(d.target.name) === wantTarget ? undefined : targetThroughRestatedBridge(entry, wantTarget);\n const alias = (NAME_TABLE.canonicalTargets[entry.id] ?? []).includes(wantTarget);\n if (normalize(d.target.name) !== wantTarget && via === undefined && !alias) continue;\n const targetVia = via === undefined ? {} : { targetVia: { bridge: via, its: d.target.name } };\n let variables = d.governing.filter((g) => !isConstant(g));\n const constants = d.governing.filter(isConstant);\n // W1: sources that restate a governing constant (speed-of-light ↔ c) peel off first so they\n // do not inflate the free-variable count and skip the prefactor check.\n const { forVariables, constPairs } = peelConstantAliases(\n [...wantSources.values()],\n variables,\n constants,\n );\n // A dimensionless group the record does not carry (sound-speed γ) is checked only when the\n // user wrote it. Friedmann's curvature term is CE-friedmann-curvature, not an extension of the flat entry.\n const groupSpec = CANONICAL_GROUP_PREFACTORS.find((g) => g.id === entry.id);\n let boundGroup: string | undefined;\n if (groupSpec) {\n const idx = forVariables.findIndex((s) => s.name === groupSpec.group);\n if (idx >= 0) {\n boundGroup = forVariables[idx]!.name;\n forVariables.splice(idx, 1);\n }\n }\n let pairing = pairSources(forVariables, variables);\n if (pairing === null) {\n // L6: a count the AST holds but the governing set does not (CE-ideal-gas's N), named by the user.\n const counts = astOnlyCounts(entry, new Set(forVariables.map((s) => s.name)));\n if (counts.length > 0) {\n const widened = [...variables, ...counts];\n pairing = pairSources(forVariables, widened);\n if (pairing !== null) variables = widened;\n }\n }\n if (pairing === null) continue;\n if (pairing === 'ambiguous') {\n results.push({\n id: entry.id,\n name: entry.name,\n kind: 'not-compared',\n detail: 'your variable names differ from its names, and they pair with its variables by dimension in more than one way',\n ...targetVia,\n });\n continue;\n }\n const byDimension = [...pairing, ...constPairs]\n .filter(([u, c]) => u !== c)\n .sort(([a], [b]) => a.localeCompare(b));\n const paired = byDimension.length > 0 ? { paired: byDimension } : {};\n const names = variables.map((g) => normalize(g.name)).sort();\n\n const points = FIXED_POINT_EXPONENTS.map((p) => {\n const row: Record<string, number> = Object.fromEntries(names.map((n, i) => [n, Math.pow(1.7 + i, p)]));\n if (boundGroup !== undefined) row['__group'] = Math.pow(2.3, p);\n return row;\n });\n // Constant aliases bind to the registered SI value (same as the canonical AST's CONSTANTS\n // lookup), not to a fixed-point sample — otherwise the ratio would wander with the points.\n const constBindings = Object.fromEntries(\n [...constPairs].map(([u, cName]) => {\n const c = CONSTANTS[cName];\n if (c === undefined) {\n throw new Error(`compareWithCanonical: governing constant '${cName}' is not in CONSTANTS`);\n }\n return [u, overrideValue(cName, c.value, constantOverrides)];\n }),\n );\n const userAt = (p: Readonly<Record<string, number>>) =>\n evaluateUser({\n ...Object.fromEntries([...pairing].map(([u, c]) => [u, p[c]!])),\n ...constBindings,\n ...(boundGroup === undefined ? {} : { [boundGroup]: p['__group']! }),\n });\n\n // A prefactor the entry does not record may come from the sourced table,\n // which lives outside the pinned src/canonical tree.\n const tabled = entry.epistemicStatus === 'fully-quantitative' ? undefined : canonicalPrefactor(entry.id);\n const extraFactor = (p: Readonly<Record<string, number>>): number =>\n boundGroup === undefined || groupSpec === undefined\n ? 1\n : groupSpec.coefficient * Math.pow(p['__group']!, groupSpec.exponent);\n const scale = (flat: number, p: Readonly<Record<string, number>>): number =>\n (tabled ?? 1) * extraFactor(p) * flat;\n let canonicalAt: (p: Readonly<Record<string, number>>) => number;\n if (entry.scalarAst !== undefined) {\n const ast = entry.scalarAst;\n const symbols = freeSymbols(ast, new Map());\n const alignments = symbolAlignments(symbols, variables);\n const at = (alignment: ReadonlyMap<string, string>) => (p: Readonly<Record<string, number>>) =>\n scale(\n evalExpr(ast, {\n ...(constantOverrides ?? {}),\n ...Object.fromEntries([...alignment].map(([sym, g]) => [sym, p[normalize(g)]!])),\n }),\n p,\n );\n if (alignments.length === 0) {\n results.push({\n id: entry.id,\n name: entry.name,\n kind: 'not-compared',\n detail: alignmentDetail(symbols, variables),\n ...paired, ...targetVia,\n });\n continue;\n }\n if (alignments.length === 1) {\n const alignment = alignments[0]!;\n canonicalAt = at(alignment);\n } else {\n let series: number[][];\n try {\n series = alignments.map((alignment) => points.map((p) => userAt(p) / at(alignment)(p)));\n } catch (e) {\n results.push({\n id: entry.id,\n name: entry.name,\n kind: 'not-compared',\n detail: `an evaluation failed (${e instanceof Error ? e.message : String(e)})`,\n ...paired, ...targetVia,\n });\n continue;\n }\n if (!sameRatios(series)) {\n results.push({\n id: entry.id,\n name: entry.name,\n kind: 'not-compared',\n detail: 'swapping its same-dimension symbols changes the ratio, so they were not paired',\n ...paired, ...targetVia,\n });\n continue;\n }\n // The ratio does not depend on which same-dimension symbol takes which\n // variable (m₁ m₂ = m₂ m₁). One assignment is enough; none is named.\n canonicalAt = at(alignments[0]!);\n }\n } else if (d.monomial !== null) {\n // W4: a governing constant takes its SI value, as on the user side and in the AST branch. A\n // name that is neither a variable nor a constant has no value, so the ratio is not finite and\n // the entry is reported as not compared; reading it as 1 made Kepler III \"factor 122404\".\n const monomial = d.monomial;\n const constValues = new Map(\n constants.map((g) => [normalize(g.name), overrideValue(g.name, CONSTANTS[g.name]!.value, constantOverrides)]),\n );\n canonicalAt = (p) =>\n scale(\n Object.entries(monomial).reduce(\n (acc, [n, e]) => acc * Math.pow(p[normalize(n)] ?? constValues.get(normalize(n)) ?? Number.NaN, e),\n 1,\n ),\n p,\n );\n } else {\n continue;\n }\n\n let ratios: number[];\n try {\n ratios = points.map((p) => userAt(p) / canonicalAt(p));\n } catch (e) {\n results.push({\n id: entry.id,\n name: entry.name,\n kind: 'not-compared',\n detail: `an evaluation failed (${e instanceof Error ? e.message : String(e)})`,\n ...paired, ...targetVia,\n });\n continue;\n }\n if (!ratios.every((r) => Number.isFinite(r) && r !== 0)) {\n results.push({ id: entry.id, name: entry.name, kind: 'not-compared', detail: 'a ratio was zero or not finite', ...paired, ...targetVia });\n continue;\n }\n // A monomial-only record carries no prefactor. A fully-quantitative scalar AST does.\n const recordsPrefactor =\n tabled !== undefined ||\n boundGroup !== undefined ||\n (entry.epistemicStatus === 'fully-quantitative' && entry.scalarAst !== undefined);\n const extension =\n boundGroup !== undefined && groupSpec !== undefined\n ? `the dimensionless group ${groupSpec.group} is bound, so the prefactor includes ${groupSpec.coefficient}·${groupSpec.group}^${groupSpec.exponent}`\n : undefined;\n const classified = classify(entry, ratios, recordsPrefactor);\n results.push({\n ...classified,\n ...(extension !== undefined && classified.detail === undefined ? { detail: extension } : {}),\n ...(names.length === 0 ? { constantsOnly: true as const } : {}),\n ...paired, ...targetVia,\n });\n }\n const label = overrideLabel(constantOverrides);\n return label === undefined ? results : results.map((r) => ({ ...r, evaluatedAt: label }));\n}\n\n/**\n * Compare a `TARGET = EXPR` user equation (the `upt map --equation` input) with\n * the canonical registry. Names resolve onto `catalogDims` the way\n * `analyzeUserEquation` resolves them; `pi` and `tau` are the only named numbers.\n * The right-hand side is dimension-checked through `parsePhysics` and evaluated by\n * the active formula parser, the one `upt eval` uses, so a comparison accepts every\n * function `eval` accepts (`ln(2)`, `asin`, `atan2`; persona finding W7). A registered\n * constant takes its SI value, as in the canonical AST, unless\n * `constantOverrides` replaces c, ħ, h or G (`--natural` / `--geometrized`).\n * Returns `[]` when the equation does not parse or no entry matches.\n *\n * @internal\n */\nexport async function compareUserEquation(\n equation: string,\n catalogDims: ReadonlyMap<string, Dimension>,\n options?: { readonly bindShortNames?: boolean; readonly constantOverrides?: Readonly<Record<string, number>> },\n): Promise<CanonicalComparison[]> {\n const dimsIn = new Map(catalogDims);\n for (const [name, dim] of formulaNameDimensions()) {\n if (!dimsIn.has(name)) dimsIn.set(name, dim);\n }\n const catalogNames = new Set(dimsIn.keys());\n const bindShort = options?.bindShortNames === true;\n const declined = (token: string): boolean => !bindShort && token.length === 1 && catalogNames.has(token);\n // W2: same kebab→underscore rewrite as analyzeUserEquation, so comparison and\n // dimensional check see one formula.\n const eq = await parseUserEquation(equation, catalogNames);\n const resolved = new Map(\n eq.sources.map((s) => [s, declined(s) ? s : (resolveQuantityName(s, catalogNames) ?? s)]),\n );\n const target = declined(eq.target) ? eq.target : (resolveQuantityName(eq.target, catalogNames) ?? eq.target);\n const dims: Record<string, Dimension> = {};\n for (const [name, c] of Object.entries(CONSTANTS)) dims[name] = c.dim;\n for (const [s, r] of resolved) {\n dims[s] = declined(s) ? DIMENSIONLESS : (dimsIn.get(r) ?? formulaSymbolDimension(s) ?? DIMENSIONLESS);\n }\n const rhs = eq.text.slice(eq.text.indexOf('=') + 1);\n let compiled: CompiledFormula;\n try {\n await parsePhysics(rhs, dims);\n compiled = (await getFormulaParser()).parse(rhs);\n } catch (error) {\n // \"The equation could not be read\" is a different fact from \"no canonical\n // equation has this target and these variables\"; an empty list says the\n // second. The row carries the parser's message (9.0.0 audit §4 C7).\n return [\n {\n id: target,\n name: equation,\n kind: 'not-compared',\n detail: `the equation did not parse: ${error instanceof Error ? error.message : String(error)}`,\n },\n ];\n }\n const overrides = options?.constantOverrides;\n const constantValues = Object.fromEntries(\n Object.entries(CONSTANTS).map(([name, c]) => [name, overrideValue(name, c.value, overrides)]),\n );\n // A name the catalog does not know carries no dimension, so it never pairs by dimension.\n const sources = [...resolved.entries()].map(([token, r]) => {\n if (declined(token)) return r;\n const dim = dimsIn.get(r);\n return dim === undefined ? r : { name: r, dim };\n });\n return compareWithCanonical(\n target,\n sources,\n (values) =>\n compiled.evaluate({\n ...constantValues,\n ...Object.fromEntries([...resolved].map(([s, r]) => [s, values[normalize(r)]!])),\n }),\n CANONICAL_EQUATIONS,\n overrides,\n );\n}\n\n/**\n * The report lines for a comparison result, shared by `upt map --equation` and\n * `upt derive`. An empty result is itself a line: a dimensional MATCH never\n * checks a prefactor, and the reader must not take silence for a check.\n * @internal\n */\nexport function describeComparisons(cs: readonly CanonicalComparison[]): string[] {\n return cs.length === 0\n ? ['· no canonical equation has this target and these variables, so the prefactor is NOT checked']\n : cs.map(describeComparison);\n}\n\n/** A catalog edge named because the formula's quantities are that edge. @internal */\nexport interface CatalogEdgeMatch {\n readonly id: string;\n readonly label: string;\n /** `exact` when every source is present. `dimensionful` when every omitted source is dimensionless. */\n readonly fit: 'exact' | 'dimensionful';\n}\n\n/** The slice of a catalog edge this report reads. */\ninterface FormulaEdge {\n readonly id: string;\n readonly label: string;\n readonly target: { readonly name: string };\n readonly sources: readonly { readonly name: string; readonly dim: Dimension }[];\n readonly aliases?: Readonly<Record<string, readonly string[]>>;\n}\n\nfunction registeredConstant(name: string, dim: Dimension | undefined): boolean {\n const c = CONSTANTS[name];\n if (c === undefined) return false;\n return dim === undefined || equals(c.dim, dim);\n}\n\nfunction resolvedFormulaSources(\n edge: FormulaEdge,\n sources: readonly { readonly name: string; readonly dim?: Dimension }[],\n): string[] {\n const alias = new Map<string, string>();\n for (const [quantity, keys] of Object.entries(edge.aliases ?? {})) {\n for (const key of keys) alias.set(normalize(key), normalize(quantity));\n }\n const out: string[] = [];\n for (const source of sources) {\n const name = normalize(source.name);\n if (registeredConstant(name, source.dim)) continue;\n out.push(alias.get(name) ?? name);\n }\n return out;\n}\n\nfunction sameSet(a: readonly string[], b: ReadonlySet<string>): boolean {\n if (a.length !== b.size) return false;\n const seen = new Set<string>();\n for (const name of a) {\n if (!b.has(name) || seen.has(name)) return false;\n seen.add(name);\n }\n return true;\n}\n\n/**\n * Catalog edges whose target and sources are this formula.\n *\n * A registered constant (`c`, `k_B`) is not a source. An omitted source that\n * is dimensionless is not a different edge: it cannot appear in a unique\n * monomial. An omitted or extra dimensionful source is a different edge.\n * Two edges that both fit only by dropping a dimensionless source are not\n * named: a shared quantity is not this report.\n * @internal\n */\nexport function matchingCatalogEdges(\n target: string,\n sources: readonly ({ readonly name: string; readonly dim?: Dimension } | string)[],\n edges: readonly FormulaEdge[] = CATALOG_GRAPH,\n): CatalogEdgeMatch[] {\n const given = sources.map((source) => (typeof source === 'string' ? { name: source } : source));\n const want = normalize(target);\n const exact: CatalogEdgeMatch[] = [];\n const dimensionful: CatalogEdgeMatch[] = [];\n for (const edge of edges) {\n if (normalize(edge.target.name) !== want) continue;\n const got = resolvedFormulaSources(edge, given);\n if (got.length === 0) continue;\n const all = new Set(edge.sources.map((source) => normalize(source.name)));\n if (sameSet(got, all)) {\n exact.push({ id: edge.id, label: edge.label, fit: 'exact' });\n continue;\n }\n const dimensional = new Set(\n edge.sources.filter((source) => !equals(source.dim, DIMENSIONLESS)).map((source) => normalize(source.name)),\n );\n const omitted = edge.sources.filter((source) => !got.includes(normalize(source.name)));\n if (sameSet(got, dimensional) && omitted.every((source) => equals(source.dim, DIMENSIONLESS))) {\n dimensionful.push({ id: edge.id, label: edge.label, fit: 'dimensionful' });\n }\n }\n if (exact.length > 0) return exact;\n return dimensionful.length === 1 ? dimensionful : [];\n}\n\n/**\n * The known-relation report: the canonical comparison, then a catalog edge\n * whose target and sources are the formula. Both `upt derive` and `upt map`\n * print this. The canonical sentence stays when that half has nothing to check.\n * @internal\n */\nexport function describeKnownRelation(\n comparisons: readonly CanonicalComparison[],\n target: string,\n sources: readonly ({ readonly name: string; readonly dim?: Dimension } | string)[],\n edges: readonly FormulaEdge[] = CATALOG_GRAPH,\n): string[] {\n const lines = describeComparisons(comparisons);\n for (const edge of matchingCatalogEdges(target, sources, edges)) {\n const who = `${edge.id} (${edge.label})`;\n lines.push(\n edge.fit === 'exact'\n ? `● ${who}: the target and the sources are this catalog edge`\n : `● ${who}: the target and the dimensionful sources are this catalog edge`,\n );\n }\n return lines;\n}\n\n/** One report line per comparison. @internal */\nexport function describeComparison(c: CanonicalComparison): string {\n const pairs = [\n ...(c.targetVia === undefined\n ? []\n : [`your target as its ${c.targetVia.its}, the target of ${c.targetVia.bridge}, which it restates`]),\n ...(c.paired === undefined ? [] : [`${c.paired.map(([yours, its]) => `your ${yours} as its ${its}`).join(', ')}, paired by dimension`]),\n ];\n const who = `${c.id} (${c.name}${pairs.length === 0 ? '' : `; ${pairs.join('; ')}`})`;\n const at =\n c.constantsOnly === true\n ? `at the ${c.evaluatedAt ?? 'SI'} constant values (no free variable, so only the value is compared, not the form)`\n : `at ${FIXED_POINT_EXPONENTS.length} fixed points${c.evaluatedAt === undefined ? '' : ` (${c.evaluatedAt})`}`;\n switch (c.kind) {\n case 'agrees':\n return `✓ agrees with ${who}, prefactor included: yours/canonical = 1 ${at}${c.detail ? ` (${c.detail})` : ''}`;\n case 'factor':\n return `⚠ differs from ${who} by a constant factor: yours/canonical = ${c.ratio!.toPrecision(6)} ${at}`;\n case 'form':\n return `⚠ differs in FORM from ${who}: yours/canonical is not constant across ${FIXED_POINT_EXPONENTS.length} fixed points`;\n case 'prefactor-unchecked':\n return `· same form as ${who}, but ${c.detail}, so your prefactor is NOT checked`;\n case 'not-compared':\n return `· ${who} shares your target and variables, but was not compared: ${c.detail}`;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"canonical-compare.js","sourceRoot":"","sources":["../../src/composition/canonical-compare.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Compare a user's formula with the canonical (textbook) equation it restates.\n *\n * Dimensional analysis cannot see a dimensionless prefactor, so `T = π√(ℓ/g)`\n * and `K = m v²` pass every dimensional check. When the registry holds an\n * equation with the same target and the same variables, this module evaluates\n * both sides at {@link FIXED_POINT_EXPONENTS}, fixed points documented here, and\n * classifies the ratio `yours / canonical`:\n *\n * - `agrees` — constant and equal to 1: the prefactor is checked and right.\n * - `factor` — constant but not 1: the forms agree and the prefactor does not.\n * - `form` — not constant across the points: a different law.\n * - `prefactor-unchecked` — the forms agree, but the registry records the law\n * only up to a constant or only dimensionally, so it holds no prefactor to\n * compare with. That is reported as unchecked, never as agreement.\n * - `not-compared` — the variables could not be aligned, or an evaluation\n * failed; `detail` says which.\n *\n * The points are fixed so the output is identical on every run.\n *\n * INTERNAL — surfaced by `upt map --equation` and `upt derive --formula`.\n *\n * @module composition/canonical-compare\n */\n\nimport { matrixRank, ols } from '@danielsimonjr/mathts-functions';\nimport type { ExprNode } from '../dimensional/validator.js';\nimport type { Dimension } from '../dimensional/types.js';\nimport { equals } from '../dimensional/algebra.js';\nimport { CANONICAL_EQUATIONS } from '../canonical/registry.js';\nimport type { CanonicalEquation } from '../canonical/canonical-equation.js';\nimport { CONSTANTS, isRegisteredConstant, piMultipleValue } from '../dimensional/symbolic-constants.js';\nimport { forEachScalarLeaf, isDecimalLiteral } from '../dimensional/ast-leaves.js';\nimport { evalExpr } from './expr-eval.js';\nimport { CANONICAL_GROUP_PREFACTORS, canonicalPrefactor } from './canonical-prefactors.js';\nimport { formulaNameDimensions } from '../dimensional/formula-names.js';\nimport { NAME_TABLE } from './aliases.js';\nimport { parseUserEquation } from './user-equation.js';\nimport { resolveQuantityName } from '../dimensional/formula-names.js';\nimport { getFormulaParser, parsePhysics } from '../numerical/formula-registry.js';\nimport { formulaSymbolDimension } from '../numerical/formula-dimension.js';\nimport type { CompiledFormula } from '../numerical/formula-contract.js';\nimport { CATALOG_GRAPH } from './catalog-graph.js';\nimport { DIMENSIONLESS } from '../dimensional/types.js';\nimport { FIXED_POINT_EXPONENTS, constantRatio, fixedPoint } from '../canonical/fixed-points.js';\nimport { formatRational, rationalize } from './rational-exponent.js';\n\n/**\n * The comparison points: variable `i` (in sorted name order) takes the value\n * `(1.7 + i)^p` at each exponent of `FIXED_POINT_EXPONENTS`, the scheme\n * `upt derive` uses to recover a prefactor (`canonical/fixed-points.ts` says\n * why each variable has its own base).\n */\nconst COMPARISON_SCHEME = { base: 1.7, step: 1 } as const;\n\n/** Relative tolerance for \"the ratio is constant\" and \"the ratio is 1\". @internal */\nconst RATIO_TOLERANCE = 1e-9;\n\n/** What a dimensionless registry stub stands for, when the symbol is not the latex. */\nconst STUB_GLOSS: Readonly<Record<string, string>> = {\n one_minus_e_sq: '1-e²',\n};\n\n/**\n * Which exponent differs, when a formula differs in FORM from the canonical\n * monomial (proposal 4): the fit of `log|yours/canonical|` on the logs of the\n * variables over a full-rank design. `exponents` are the fitted powers,\n * replaced by the small rational they stand for when one fits; `exact` is the\n * rational spelled (`-1`, `1/2`, `0`) or the fitted decimal when none fits.\n * `r2` is the fit's coefficient of determination: 1 means the ratio IS a\n * monomial in these variables, below 1 it is not.\n *\n * @internal\n */\nexport interface ExponentDifference {\n readonly exponents: Readonly<Record<string, number>>;\n readonly exact: Readonly<Record<string, string>>;\n readonly r2: number;\n /** True when `r2` is 1 to within 1e-9: the difference is a monomial. */\n readonly monomial: boolean;\n}\n\n/** How a user formula compares with one canonical equation. @internal */\nexport interface CanonicalComparison {\n readonly id: string;\n readonly name: string;\n readonly kind: 'agrees' | 'factor' | 'form' | 'prefactor-unchecked' | 'not-compared';\n /** `yours / canonical`, present only for `agrees` and `factor`. */\n readonly ratio?: number;\n /** Why the prefactor is unchecked, or why no comparison was made. */\n readonly detail?: string;\n /** For `form` only: which exponent differs, from a log-design fit. Absent when the fit could not run. */\n readonly exponentDifference?: ExponentDifference;\n /** `[yours, canonical]` for each variable paired by dimension, not by name (persona finding N1). */\n readonly paired?: readonly (readonly [string, string])[];\n /**\n * True when neither side has a free variable (every name is a registered constant, persona\n * finding W5): the two sides are compared once, at the SI constant values, so the form is not\n * tested, only the value.\n */\n readonly constantsOnly?: true;\n /**\n * Present when your target matched through the catalog bridge this entry restates\n * (`restatesBridge`), not by the entry's own target name: that bridge's id and the entry's target.\n */\n readonly targetVia?: { readonly bridge: string; readonly its: string };\n /**\n * Set when the comparison evaluated c, ħ, h or G at a non-SI value\n * (`--natural` / `--geometrized`). Absent on an SI comparison.\n */\n readonly evaluatedAt?: string;\n}\n\n/** A user source variable; with a dimension it may pair with a differently named canonical variable. */\nexport type ComparisonSource = string | { readonly name: string; readonly dim: Dimension };\n\nconst normalize = (name: string): string => name.replace(/_/g, '-');\n\n/**\n * Pair each user source with one canonical variable: by name first, then by a dimension that\n * exactly one remaining canonical variable carries, repeated until nothing changes. `null` when the\n * sources cannot be this entry's variables (a count, a name without a dimension, or a dimension no\n * variable left carries); `'ambiguous'` when every source has a same-dimension partner but the\n * pairing is not unique. Returns user name → canonical name, both normalized.\n */\nfunction pairSources(\n sources: readonly { name: string; dim?: Dimension }[],\n variables: readonly { name: string; dim: Dimension }[],\n): Map<string, string> | 'ambiguous' | null {\n if (sources.length !== variables.length) return null;\n const pairs = new Map<string, string>();\n const freeVars = new Map(variables.map((v) => [normalize(v.name), v.dim]));\n let open = sources.filter((s) => {\n if (!freeVars.has(s.name)) return true;\n pairs.set(s.name, s.name);\n freeVars.delete(s.name);\n return false;\n });\n let progress = true;\n while (open.length > 0 && progress) {\n progress = false;\n for (const s of open) {\n if (s.dim === undefined) return null;\n const partners = [...freeVars].filter(([, dim]) => equals(dim, s.dim!));\n if (partners.length === 0) return null;\n if (partners.length === 1) {\n pairs.set(s.name, partners[0]![0]);\n freeVars.delete(partners[0]![0]);\n progress = true;\n }\n }\n open = open.filter((s) => !pairs.has(s.name));\n }\n return open.length === 0 ? pairs : 'ambiguous';\n}\n\n/**\n * Peel user sources that restate a CE governing *constant* (persona finding W1).\n *\n * CE-mass-energy lists `c` as governing, but `c` is in {@link CONSTANTS}, so it is not a free\n * variable of the comparison. Writing the catalog quantity `speed-of-light` (same dimension) must\n * not make the source set look larger than `{mass}` and skip the prefactor check. A source pairs\n * with a constant by name, or by a dimension that exactly one remaining constant carries and that\n * no free variable carries (variables win — `velocity` still pairs with CE-kinetic-energy's\n * `speed`). Returns the sources left for {@link pairSources}, plus user→constant name pairs.\n * Leftover sources that match no variable and no unique constant make the entry a non-match\n * (`null` from the caller when `forVariables` then fails to pair).\n */\nfunction peelConstantAliases(\n sources: readonly { name: string; dim?: Dimension }[],\n variables: readonly { name: string; dim: Dimension }[],\n constants: readonly { name: string; dim: Dimension }[],\n): { forVariables: { name: string; dim?: Dimension }[]; constPairs: Map<string, string> } {\n const constPairs = new Map<string, string>();\n const freeConsts = new Map(constants.map((c) => [normalize(c.name), c.dim]));\n const forVariables: { name: string; dim?: Dimension }[] = [];\n for (const s of sources) {\n if (variables.some((v) => normalize(v.name) === s.name)) {\n forVariables.push(s);\n continue;\n }\n if (freeConsts.has(s.name)) {\n constPairs.set(s.name, s.name);\n freeConsts.delete(s.name);\n continue;\n }\n if (s.dim !== undefined) {\n const varHits = variables.filter((v) => equals(v.dim, s.dim!));\n if (varHits.length > 0) {\n forVariables.push(s);\n continue;\n }\n // h and ħ are both action. A formula that writes one is not the other.\n if (isRegisteredConstant(s.name)) {\n forVariables.push(s);\n continue;\n }\n const constHits = [...freeConsts].filter(([, dim]) => equals(dim, s.dim!));\n if (constHits.length === 1) {\n constPairs.set(s.name, constHits[0]![0]);\n freeConsts.delete(constHits[0]![0]);\n continue;\n }\n }\n forVariables.push(s);\n }\n return { forVariables, constPairs };\n}\n\n/** A governing variable that is a registered physical constant of the same dimension. */\nfunction isConstant(v: { name: string; dim: Dimension }): boolean {\n const c = CONSTANTS[v.name];\n return c !== undefined && equals(c.dim, v.dim);\n}\n\n/**\n * The catalog bridge through which `wantTarget` names this entry's target: the entry records that\n * it restates that bridge (`restatesBridge`), and the bridge's graph edge has `wantTarget` as its\n * target (persona finding W7: `landauer-erasure-energy` is BE-16's target, and CE-landauer, which\n * restates BE-16, names it `erasure-energy`). A recorded restatement, never a shared dimension.\n */\nfunction targetThroughRestatedBridge(entry: CanonicalEquation, wantTarget: string): string | undefined {\n if (entry.restatesBridge === undefined) return undefined;\n const beId = Number(entry.restatesBridge);\n return CATALOG_GRAPH.find((e) => e.beId === beId && normalize(e.target.name) === wantTarget)?.id;\n}\n\n/** The free (non-constant, non-literal) symbols of an AST, with their dimensions. */\nfunction freeSymbols(node: ExprNode, out: Map<string, Dimension>): Map<string, Dimension> {\n // The arms are `op` and `tensor-product`: the two node kinds that carry `args`.\n forEachScalarLeaf(\n node,\n (leaf) => {\n if (!isDecimalLiteral(leaf.name) && !isRegisteredConstant(leaf.name) && piMultipleValue(leaf.name) === undefined) {\n out.set(leaf.name, leaf.dim);\n }\n },\n { tensorProduct: true },\n );\n return out;\n}\n\n/**\n * Dimensionless symbols the entry's AST holds that its governing set does not, and that the user\n * names too: CE-ideal-gas writes `P = N k_B T/V` with the count `N` in its AST only (persona finding\n * L6). They join the comparison variables BY NAME only; pairing a dimensionless stub such as\n * `one_minus_e_sq` with any dimensionless user quantity by dimension would compare different laws.\n */\nfunction astOnlyCounts(\n entry: CanonicalEquation,\n userNames: ReadonlySet<string>,\n): { name: string; dim: Dimension }[] {\n if (entry.scalarAst === undefined) return [];\n const governing = new Set(entry.dimensional.governing.map((g) => normalize(g.name)));\n return [...freeSymbols(entry.scalarAst, new Map())]\n .filter(([name, dim]) => /^[A-Za-z][A-Za-z0-9_]*$/.test(name) && equals(dim, DIMENSIONLESS))\n .filter(([name]) => !governing.has(normalize(name)) && userNames.has(normalize(name)))\n .map(([name, dim]) => ({ name, dim }));\n}\n\n/**\n * Every way to map free AST symbols onto governing variables: by name first,\n * then any bijection that respects dimension. One map when each remaining\n * symbol has a unique dimension; several when a product such as m₁ m₂ can be\n * assigned either way. Empty when the counts differ or a symbol has no\n * variable of its dimension. More than 24 bijections is treated as empty —\n * that pairing is not checked, rather than searched.\n */\nfunction symbolAlignments(\n symbols: ReadonlyMap<string, Dimension>,\n governing: readonly { name: string; dim: Dimension }[],\n): Map<string, string>[] {\n if (symbols.size !== governing.length) return [];\n const assignment = new Map<string, string>();\n const free = new Set(governing.map((g) => g.name));\n for (const s of [...symbols.keys()].sort()) {\n if (free.has(s)) {\n assignment.set(s, s);\n free.delete(s);\n }\n }\n const rest = [...symbols.entries()]\n .filter(([s]) => !assignment.has(s))\n .sort(([a], [b]) => a.localeCompare(b));\n const out: Map<string, string>[] = [];\n const CAP = 24;\n const rec = (i: number): void => {\n if (out.length > CAP) return;\n if (i === rest.length) {\n out.push(new Map(assignment));\n return;\n }\n const [s, dim] = rest[i]!;\n const candidates = governing\n .filter((g) => free.has(g.name) && equals(g.dim, dim))\n .map((g) => g.name)\n .sort();\n for (const c of candidates) {\n assignment.set(s, c);\n free.delete(c);\n rec(i + 1);\n free.add(c);\n assignment.delete(s);\n if (out.length > CAP) return;\n }\n };\n rec(0);\n return out.length > CAP ? [] : out;\n}\n\n/** Why an AST could not be aligned, naming a dimensionless stub the user did not. */\nfunction alignmentDetail(\n symbols: ReadonlyMap<string, Dimension>,\n variables: readonly { name: string; dim: Dimension }[],\n): string {\n const named = new Set(variables.map((v) => v.name));\n const stubs = [...symbols.entries()]\n .filter(([name, dim]) => !named.has(name) && equals(dim, DIMENSIONLESS))\n .map(([name]) => name)\n .sort();\n if (symbols.size !== variables.length && stubs.length > 0) {\n const shown = stubs.map((s) => (STUB_GLOSS[s] === undefined ? s : `${s} (${STUB_GLOSS[s]})`));\n return `its formula depends on ${shown.join(', ')}, which your formula does not name`;\n }\n return 'its variables could not be aligned by name or by a unique dimension';\n}\n\n/** The relative tolerance within which a fitted exponent is a small rational, and R² is 1. */\nconst EXPONENT_FIT_TOLERANCE = 1e-6;\n/** The denominator cap of a rationalised exponent difference. */\nconst EXPONENT_MAX_DENOMINATOR = 24;\n\n/**\n * Fit `log|ratio|` on the logs of the variables over a full-rank design: the\n * base point of the comparison scheme, each variable doubled, each variable\n * quadrupled, and all of them doubled together (2k + 2 rows for k variables,\n * so a difference that is not a monomial has rows to fail on). The design's\n * rank is checked before the fit. `undefined` when there is no variable, when\n * the ratio is zero, negative or not finite at a point, or when the fit\n * cannot run.\n *\n * @internal\n */\nexport function diagnoseExponentDifference(\n names: readonly string[],\n ratioAt: (point: Readonly<Record<string, number>>) => number,\n): ExponentDifference | undefined {\n const k = names.length;\n if (k === 0) return undefined;\n const base = fixedPoint(names, 1, COMPARISON_SCHEME);\n const scales: number[][] = [Array<number>(k).fill(1)];\n for (const factor of [2, 4]) {\n for (let i = 0; i < k; i++) {\n const row = Array<number>(k).fill(1);\n row[i] = factor;\n scales.push(row);\n }\n }\n scales.push(Array<number>(k).fill(2));\n const logX: number[][] = [];\n const y: number[] = [];\n for (const row of scales) {\n const point: Record<string, number> = {};\n names.forEach((name, i) => {\n point[name] = base[name]! * row[i]!;\n });\n let ratio: number;\n try {\n ratio = ratioAt(point);\n } catch {\n return undefined;\n }\n if (!Number.isFinite(ratio) || ratio <= 0) return undefined;\n logX.push(row.map((s) => Math.log(s)));\n y.push(Math.log(ratio));\n }\n if (matrixRank(logX) !== k) return undefined;\n let fit: { coefficients: number[]; r2: number };\n try {\n fit = ols(logX, y);\n } catch {\n return undefined;\n }\n const exponents: Record<string, number> = {};\n const exact: Record<string, string> = {};\n names.forEach((name, i) => {\n const c = fit.coefficients[i + 1]!;\n if (Math.abs(c) < 1e-9) {\n exponents[name] = 0;\n exact[name] = '0';\n return;\n }\n const q = rationalize(c, { maxDenominator: EXPONENT_MAX_DENOMINATOR, tolerance: EXPONENT_FIT_TOLERANCE });\n exponents[name] = q === undefined ? c : Number(q.numerator) / Number(q.denominator);\n exact[name] = q === undefined ? c.toPrecision(6) : formatRational(q);\n });\n const r2 = fit.r2;\n return { exponents, exact, r2, monomial: Number.isFinite(r2) && r2 >= 1 - 1e-9 };\n}\n\n/**\n * One line for an exponent difference: `yours/canonical ∝ mass^-1 (R² = 1):\n * the difference is a monomial in these variables`. A rational exponent is\n * braced (`speed^{1/2}`), a unit one is bare, a zero one is omitted.\n *\n * @internal\n */\nexport function describeExponentDifference(d: ExponentDifference): string {\n const parts = Object.keys(d.exact)\n .sort()\n .filter((name) => d.exact[name] !== '0')\n .map((name) => {\n const e = d.exact[name]!;\n if (e === '1') return name;\n return e.includes('/') ? `${name}^{${e}}` : `${name}^${e}`;\n });\n const r2 = d.monomial ? '1' : Number.isFinite(d.r2) ? d.r2.toFixed(3) : 'undefined';\n const verdict = d.monomial\n ? 'the difference is a monomial in these variables'\n : 'the difference is not a monomial in these variables (R² below 1)';\n return `yours/canonical ∝ ${parts.join(' · ') || '1'} (R² = ${r2}): ${verdict}`;\n}\n\n/** True when every alignment produced the same ratio at each fixed point. */\nfunction sameRatios(series: readonly (readonly number[])[]): boolean {\n const first = series[0];\n if (first === undefined) return false;\n return first.every((_, i) => constantRatio(series.map((s) => s[i]!), RATIO_TOLERANCE).constant);\n}\n\nfunction classify(\n entry: CanonicalEquation,\n ratios: readonly number[],\n recordsPrefactor: boolean,\n): CanonicalComparison {\n const base = { id: entry.id, name: entry.name };\n const r0 = ratios[0]!;\n const constant = constantRatio(ratios, RATIO_TOLERANCE).constant;\n if (!constant) return { ...base, kind: 'form' };\n if (!recordsPrefactor) {\n return {\n ...base,\n kind: 'prefactor-unchecked',\n detail:\n entry.epistemicStatus === 'dimensional'\n ? 'the registry records its dimensional form only'\n : entry.epistemicStatus === 'fully-quantitative' && entry.fieldEquation !== undefined\n ? 'the registry records its prefactor only in its field equation, and its scalar record is the dimensional monomial'\n : entry.epistemicStatus === 'fully-quantitative'\n ? 'its scalar record is the dimensional monomial only'\n : 'the registry records it only up to a constant',\n };\n }\n return Math.abs(r0 - 1) <= RATIO_TOLERANCE\n ? { ...base, kind: 'agrees', ratio: r0 }\n : { ...base, kind: 'factor', ratio: r0 };\n}\n\n/**\n * Compare a user formula with every canonical equation that has the same\n * target and the same non-constant variables. The target must match by name\n * (after `_` → `-`): pairing it by dimension would reach every law of that\n * dimension. Each source matches a variable by name, or, when the source\n * carries a dimension, by a dimension exactly one remaining variable carries\n * (`velocity` → CE-kinetic-energy's `speed`); such pairs are listed in\n * `paired`. A non-unique pairing is reported as `not-compared`, never guessed.\n * `evaluateUser` receives values keyed by the user's (normalized) source names.\n * Returns one comparison per matching entry, in registry order; empty when\n * no entry matches.\n *\n * @internal\n */\nfunction overrideValue(\n name: string,\n si: number,\n overrides: Readonly<Record<string, number>> | undefined,\n): number {\n if (overrides !== undefined && Object.prototype.hasOwnProperty.call(overrides, name)) return overrides[name]!;\n return si;\n}\n\n/** A short label for a non-SI constant table, or undefined when the table is SI. */\nfunction overrideLabel(overrides: Readonly<Record<string, number>> | undefined): string | undefined {\n if (overrides === undefined) return undefined;\n const bits: string[] = [];\n if (overrides.c === 1) bits.push('c = 1');\n if (overrides.hbar === 1) bits.push('ħ = 1');\n if (overrides.h === 2 * Math.PI) bits.push('h = 2π');\n if (overrides.G === 1) bits.push('G = 1');\n return bits.length === 0 ? undefined : bits.join(', ');\n}\n\n/** Compare a user expression against the canonical equations that share its target and source quantities. `evaluateUser` is called only for the user's expression; each canonical value comes from that entry's `scalarAst` or from its registry monomial. */\nexport function compareWithCanonical(\n target: string,\n sources: readonly ComparisonSource[],\n evaluateUser: (values: Readonly<Record<string, number>>) => number,\n entries: readonly CanonicalEquation[] = CANONICAL_EQUATIONS,\n constantOverrides?: Readonly<Record<string, number>>,\n): CanonicalComparison[] {\n const wantTarget = normalize(target);\n const wantSources = new Map<string, { name: string; dim?: Dimension }>();\n for (const s of sources) {\n const name = normalize(typeof s === 'string' ? s : s.name);\n if (!wantSources.has(name)) wantSources.set(name, typeof s === 'string' ? { name } : { name, dim: s.dim });\n }\n const results: CanonicalComparison[] = [];\n\n for (const entry of entries) {\n const d = entry.dimensional;\n const via = normalize(d.target.name) === wantTarget ? undefined : targetThroughRestatedBridge(entry, wantTarget);\n const alias = (NAME_TABLE.canonicalTargets[entry.id] ?? []).includes(wantTarget);\n if (normalize(d.target.name) !== wantTarget && via === undefined && !alias) continue;\n const targetVia = via === undefined ? {} : { targetVia: { bridge: via, its: d.target.name } };\n let variables = d.governing.filter((g) => !isConstant(g));\n const constants = d.governing.filter(isConstant);\n // W1: sources that restate a governing constant (speed-of-light ↔ c) peel off first so they\n // do not inflate the free-variable count and skip the prefactor check.\n const { forVariables, constPairs } = peelConstantAliases(\n [...wantSources.values()],\n variables,\n constants,\n );\n // A dimensionless group the record does not carry (sound-speed γ) is checked only when the\n // user wrote it. Friedmann's curvature term is CE-friedmann-curvature, not an extension of the flat entry.\n const groupSpec = CANONICAL_GROUP_PREFACTORS.find((g) => g.id === entry.id);\n let boundGroup: string | undefined;\n if (groupSpec) {\n const idx = forVariables.findIndex((s) => s.name === groupSpec.group);\n if (idx >= 0) {\n boundGroup = forVariables[idx]!.name;\n forVariables.splice(idx, 1);\n }\n }\n let pairing = pairSources(forVariables, variables);\n if (pairing === null) {\n // L6: a count the AST holds but the governing set does not (CE-ideal-gas's N), named by the user.\n const counts = astOnlyCounts(entry, new Set(forVariables.map((s) => s.name)));\n if (counts.length > 0) {\n const widened = [...variables, ...counts];\n pairing = pairSources(forVariables, widened);\n if (pairing !== null) variables = widened;\n }\n }\n if (pairing === null) continue;\n if (pairing === 'ambiguous') {\n results.push({\n id: entry.id,\n name: entry.name,\n kind: 'not-compared',\n detail: 'your variable names differ from its names, and they pair with its variables by dimension in more than one way',\n ...targetVia,\n });\n continue;\n }\n const byDimension = [...pairing, ...constPairs]\n .filter(([u, c]) => u !== c)\n .sort(([a], [b]) => a.localeCompare(b));\n const paired = byDimension.length > 0 ? { paired: byDimension } : {};\n const names = variables.map((g) => normalize(g.name)).sort();\n\n const points = FIXED_POINT_EXPONENTS.map((p) => {\n const row = fixedPoint(names, p, COMPARISON_SCHEME);\n if (boundGroup !== undefined) row['__group'] = Math.pow(2.3, p);\n return row;\n });\n // Constant aliases bind to the registered SI value (same as the canonical AST's CONSTANTS\n // lookup), not to a fixed-point sample — otherwise the ratio would wander with the points.\n const constBindings = Object.fromEntries(\n [...constPairs].map(([u, cName]) => {\n const c = CONSTANTS[cName];\n if (c === undefined) {\n throw new Error(`compareWithCanonical: governing constant '${cName}' is not in CONSTANTS`);\n }\n return [u, overrideValue(cName, c.value, constantOverrides)];\n }),\n );\n const userAt = (p: Readonly<Record<string, number>>) =>\n evaluateUser({\n ...Object.fromEntries([...pairing].map(([u, c]) => [u, p[c]!])),\n ...constBindings,\n ...(boundGroup === undefined ? {} : { [boundGroup]: p['__group']! }),\n });\n\n // A prefactor the entry does not record may come from the sourced table,\n // which lives outside the pinned src/canonical tree.\n const tabled = entry.epistemicStatus === 'fully-quantitative' ? undefined : canonicalPrefactor(entry.id);\n const extraFactor = (p: Readonly<Record<string, number>>): number =>\n boundGroup === undefined || groupSpec === undefined\n ? 1\n : groupSpec.coefficient * Math.pow(p['__group']!, groupSpec.exponent);\n const scale = (flat: number, p: Readonly<Record<string, number>>): number =>\n (tabled ?? 1) * extraFactor(p) * flat;\n let canonicalAt: (p: Readonly<Record<string, number>>) => number;\n if (entry.scalarAst !== undefined) {\n const ast = entry.scalarAst;\n const symbols = freeSymbols(ast, new Map());\n const alignments = symbolAlignments(symbols, variables);\n const at = (alignment: ReadonlyMap<string, string>) => (p: Readonly<Record<string, number>>) =>\n scale(\n evalExpr(ast, {\n ...(constantOverrides ?? {}),\n ...Object.fromEntries([...alignment].map(([sym, g]) => [sym, p[normalize(g)]!])),\n }),\n p,\n );\n if (alignments.length === 0) {\n results.push({\n id: entry.id,\n name: entry.name,\n kind: 'not-compared',\n detail: alignmentDetail(symbols, variables),\n ...paired, ...targetVia,\n });\n continue;\n }\n if (alignments.length === 1) {\n const alignment = alignments[0]!;\n canonicalAt = at(alignment);\n } else {\n let series: number[][];\n try {\n series = alignments.map((alignment) => points.map((p) => userAt(p) / at(alignment)(p)));\n } catch (e) {\n results.push({\n id: entry.id,\n name: entry.name,\n kind: 'not-compared',\n detail: `an evaluation failed (${e instanceof Error ? e.message : String(e)})`,\n ...paired, ...targetVia,\n });\n continue;\n }\n if (!sameRatios(series)) {\n results.push({\n id: entry.id,\n name: entry.name,\n kind: 'not-compared',\n detail: 'swapping its same-dimension symbols changes the ratio, so they were not paired',\n ...paired, ...targetVia,\n });\n continue;\n }\n // The ratio does not depend on which same-dimension symbol takes which\n // variable (m₁ m₂ = m₂ m₁). One assignment is enough; none is named.\n canonicalAt = at(alignments[0]!);\n }\n } else if (d.monomial !== null) {\n // W4: a governing constant takes its SI value, as on the user side and in the AST branch. A\n // name that is neither a variable nor a constant has no value, so the ratio is not finite and\n // the entry is reported as not compared; reading it as 1 made Kepler III \"factor 122404\".\n const monomial = d.monomial;\n const constValues = new Map(\n constants.map((g) => [normalize(g.name), overrideValue(g.name, CONSTANTS[g.name]!.value, constantOverrides)]),\n );\n canonicalAt = (p) =>\n scale(\n Object.entries(monomial).reduce(\n (acc, [n, e]) => acc * Math.pow(p[normalize(n)] ?? constValues.get(normalize(n)) ?? Number.NaN, e),\n 1,\n ),\n p,\n );\n } else {\n continue;\n }\n\n let ratios: number[];\n try {\n ratios = points.map((p) => userAt(p) / canonicalAt(p));\n } catch (e) {\n results.push({\n id: entry.id,\n name: entry.name,\n kind: 'not-compared',\n detail: `an evaluation failed (${e instanceof Error ? e.message : String(e)})`,\n ...paired, ...targetVia,\n });\n continue;\n }\n if (!ratios.every((r) => Number.isFinite(r) && r !== 0)) {\n results.push({ id: entry.id, name: entry.name, kind: 'not-compared', detail: 'a ratio was zero or not finite', ...paired, ...targetVia });\n continue;\n }\n // A monomial-only record carries no prefactor. A fully-quantitative scalar AST does.\n const recordsPrefactor =\n tabled !== undefined ||\n boundGroup !== undefined ||\n (entry.epistemicStatus === 'fully-quantitative' && entry.scalarAst !== undefined);\n const extension =\n boundGroup !== undefined && groupSpec !== undefined\n ? `the dimensionless group ${groupSpec.group} is bound, so the prefactor includes ${groupSpec.coefficient}·${groupSpec.group}^${groupSpec.exponent}`\n : undefined;\n const classified = classify(entry, ratios, recordsPrefactor);\n // A form mismatch gets its diagnosis: which exponent differs, by a log-design fit.\n const exponentDifference =\n classified.kind === 'form'\n ? diagnoseExponentDifference(names, (point) => {\n const row = boundGroup === undefined ? point : { ...point, __group: 2.3 };\n return userAt(row) / canonicalAt(row);\n })\n : undefined;\n results.push({\n ...classified,\n ...(exponentDifference === undefined ? {} : { exponentDifference }),\n ...(extension !== undefined && classified.detail === undefined ? { detail: extension } : {}),\n ...(names.length === 0 ? { constantsOnly: true as const } : {}),\n ...paired, ...targetVia,\n });\n }\n const label = overrideLabel(constantOverrides);\n return label === undefined ? results : results.map((r) => ({ ...r, evaluatedAt: label }));\n}\n\n/**\n * Compare a `TARGET = EXPR` user equation (the `upt map --equation` input) with\n * the canonical registry. Names resolve onto `catalogDims` the way\n * `analyzeUserEquation` resolves them; `pi` and `tau` are the only named numbers.\n * The right-hand side is dimension-checked through `parsePhysics` and evaluated by\n * the active formula parser, the one `upt eval` uses, so a comparison accepts every\n * function `eval` accepts (`ln(2)`, `asin`, `atan2`; persona finding W7). A registered\n * constant takes its SI value, as in the canonical AST, unless\n * `constantOverrides` replaces c, ħ, h or G (`--natural` / `--geometrized`).\n * Returns `[]` when the equation does not parse or no entry matches.\n *\n * @internal\n */\nexport async function compareUserEquation(\n equation: string,\n catalogDims: ReadonlyMap<string, Dimension>,\n options?: { readonly bindShortNames?: boolean; readonly constantOverrides?: Readonly<Record<string, number>> },\n): Promise<CanonicalComparison[]> {\n const dimsIn = new Map(catalogDims);\n for (const [name, dim] of formulaNameDimensions()) {\n if (!dimsIn.has(name)) dimsIn.set(name, dim);\n }\n const catalogNames = new Set(dimsIn.keys());\n const bindShort = options?.bindShortNames === true;\n const declined = (token: string): boolean => !bindShort && token.length === 1 && catalogNames.has(token);\n // W2: same kebab→underscore rewrite as analyzeUserEquation, so comparison and\n // dimensional check see one formula.\n const eq = await parseUserEquation(equation, catalogNames);\n const resolved = new Map(\n eq.sources.map((s) => [s, declined(s) ? s : (resolveQuantityName(s, catalogNames) ?? s)]),\n );\n const target = declined(eq.target) ? eq.target : (resolveQuantityName(eq.target, catalogNames) ?? eq.target);\n const dims: Record<string, Dimension> = {};\n for (const [name, c] of Object.entries(CONSTANTS)) dims[name] = c.dim;\n for (const [s, r] of resolved) {\n dims[s] = declined(s) ? DIMENSIONLESS : (dimsIn.get(r) ?? formulaSymbolDimension(s) ?? DIMENSIONLESS);\n }\n const rhs = eq.text.slice(eq.text.indexOf('=') + 1);\n let compiled: CompiledFormula;\n try {\n await parsePhysics(rhs, dims);\n compiled = (await getFormulaParser()).parse(rhs);\n } catch (error) {\n // \"The equation could not be read\" is a different fact from \"no canonical\n // equation has this target and these variables\"; an empty list says the\n // second. The row carries the parser's message (9.0.0 audit §4 C7).\n return [\n {\n id: target,\n name: equation,\n kind: 'not-compared',\n detail: `the equation did not parse: ${error instanceof Error ? error.message : String(error)}`,\n },\n ];\n }\n const overrides = options?.constantOverrides;\n const constantValues = Object.fromEntries(\n Object.entries(CONSTANTS).map(([name, c]) => [name, overrideValue(name, c.value, overrides)]),\n );\n // A name the catalog does not know carries no dimension, so it never pairs by dimension.\n const sources = [...resolved.entries()].map(([token, r]) => {\n if (declined(token)) return r;\n const dim = dimsIn.get(r);\n return dim === undefined ? r : { name: r, dim };\n });\n return compareWithCanonical(\n target,\n sources,\n (values) =>\n compiled.evaluate({\n ...constantValues,\n ...Object.fromEntries([...resolved].map(([s, r]) => [s, values[normalize(r)]!])),\n }),\n CANONICAL_EQUATIONS,\n overrides,\n );\n}\n\n/**\n * The report lines for a comparison result, shared by `upt map --equation` and\n * `upt derive`. An empty result is itself a line: a dimensional MATCH never\n * checks a prefactor, and the reader must not take silence for a check.\n * @internal\n */\nexport function describeComparisons(cs: readonly CanonicalComparison[]): string[] {\n return cs.length === 0\n ? ['· no canonical equation has this target and these variables, so the prefactor is NOT checked']\n : cs.map(describeComparison);\n}\n\n/** A catalog edge named because the formula's quantities are that edge. @internal */\nexport interface CatalogEdgeMatch {\n readonly id: string;\n readonly label: string;\n /** `exact` when every source is present. `dimensionful` when every omitted source is dimensionless. */\n readonly fit: 'exact' | 'dimensionful';\n}\n\n/** The slice of a catalog edge this report reads. */\ninterface FormulaEdge {\n readonly id: string;\n readonly label: string;\n readonly target: { readonly name: string };\n readonly sources: readonly { readonly name: string; readonly dim: Dimension }[];\n readonly aliases?: Readonly<Record<string, readonly string[]>>;\n}\n\nfunction registeredConstant(name: string, dim: Dimension | undefined): boolean {\n const c = CONSTANTS[name];\n if (c === undefined) return false;\n return dim === undefined || equals(c.dim, dim);\n}\n\nfunction resolvedFormulaSources(\n edge: FormulaEdge,\n sources: readonly { readonly name: string; readonly dim?: Dimension }[],\n): string[] {\n const alias = new Map<string, string>();\n for (const [quantity, keys] of Object.entries(edge.aliases ?? {})) {\n for (const key of keys) alias.set(normalize(key), normalize(quantity));\n }\n const out: string[] = [];\n for (const source of sources) {\n const name = normalize(source.name);\n if (registeredConstant(name, source.dim)) continue;\n out.push(alias.get(name) ?? name);\n }\n return out;\n}\n\nfunction sameSet(a: readonly string[], b: ReadonlySet<string>): boolean {\n if (a.length !== b.size) return false;\n const seen = new Set<string>();\n for (const name of a) {\n if (!b.has(name) || seen.has(name)) return false;\n seen.add(name);\n }\n return true;\n}\n\n/**\n * Catalog edges whose target and sources are this formula.\n *\n * A registered constant (`c`, `k_B`) is not a source. An omitted source that\n * is dimensionless is not a different edge: it cannot appear in a unique\n * monomial. An omitted or extra dimensionful source is a different edge.\n * Two edges that both fit only by dropping a dimensionless source are not\n * named: a shared quantity is not this report.\n * @internal\n */\nexport function matchingCatalogEdges(\n target: string,\n sources: readonly ({ readonly name: string; readonly dim?: Dimension } | string)[],\n edges: readonly FormulaEdge[] = CATALOG_GRAPH,\n): CatalogEdgeMatch[] {\n const given = sources.map((source) => (typeof source === 'string' ? { name: source } : source));\n const want = normalize(target);\n const exact: CatalogEdgeMatch[] = [];\n const dimensionful: CatalogEdgeMatch[] = [];\n for (const edge of edges) {\n if (normalize(edge.target.name) !== want) continue;\n const got = resolvedFormulaSources(edge, given);\n if (got.length === 0) continue;\n const all = new Set(edge.sources.map((source) => normalize(source.name)));\n if (sameSet(got, all)) {\n exact.push({ id: edge.id, label: edge.label, fit: 'exact' });\n continue;\n }\n const dimensional = new Set(\n edge.sources.filter((source) => !equals(source.dim, DIMENSIONLESS)).map((source) => normalize(source.name)),\n );\n const omitted = edge.sources.filter((source) => !got.includes(normalize(source.name)));\n if (sameSet(got, dimensional) && omitted.every((source) => equals(source.dim, DIMENSIONLESS))) {\n dimensionful.push({ id: edge.id, label: edge.label, fit: 'dimensionful' });\n }\n }\n if (exact.length > 0) return exact;\n return dimensionful.length === 1 ? dimensionful : [];\n}\n\n/**\n * The known-relation report: the canonical comparison, then a catalog edge\n * whose target and sources are the formula. Both `upt derive` and `upt map`\n * print this. The canonical sentence stays when that half has nothing to check.\n * @internal\n */\nexport function describeKnownRelation(\n comparisons: readonly CanonicalComparison[],\n target: string,\n sources: readonly ({ readonly name: string; readonly dim?: Dimension } | string)[],\n edges: readonly FormulaEdge[] = CATALOG_GRAPH,\n): string[] {\n const lines = describeComparisons(comparisons);\n for (const edge of matchingCatalogEdges(target, sources, edges)) {\n const who = `${edge.id} (${edge.label})`;\n lines.push(\n edge.fit === 'exact'\n ? `● ${who}: the target and the sources are this catalog edge`\n : `● ${who}: the target and the dimensionful sources are this catalog edge`,\n );\n }\n return lines;\n}\n\n/** One report line per comparison. @internal */\nexport function describeComparison(c: CanonicalComparison): string {\n const pairs = [\n ...(c.targetVia === undefined\n ? []\n : [`your target as its ${c.targetVia.its}, the target of ${c.targetVia.bridge}, which it restates`]),\n ...(c.paired === undefined ? [] : [`${c.paired.map(([yours, its]) => `your ${yours} as its ${its}`).join(', ')}, paired by dimension`]),\n ];\n const who = `${c.id} (${c.name}${pairs.length === 0 ? '' : `; ${pairs.join('; ')}`})`;\n const at =\n c.constantsOnly === true\n ? `at the ${c.evaluatedAt ?? 'SI'} constant values (no free variable, so only the value is compared, not the form)`\n : `at ${FIXED_POINT_EXPONENTS.length} fixed points${c.evaluatedAt === undefined ? '' : ` (${c.evaluatedAt})`}`;\n switch (c.kind) {\n case 'agrees':\n return `✓ agrees with ${who}, prefactor included: yours/canonical = 1 ${at}${c.detail ? ` (${c.detail})` : ''}`;\n case 'factor':\n return `⚠ differs from ${who} by a constant factor: yours/canonical = ${c.ratio!.toPrecision(6)} ${at}`;\n case 'form':\n return `⚠ differs in FORM from ${who}: yours/canonical is not constant across ${FIXED_POINT_EXPONENTS.length} fixed points`;\n case 'prefactor-unchecked':\n return `· same form as ${who}, but ${c.detail}, so your prefactor is NOT checked`;\n case 'not-compared':\n return `· ${who} shares your target and variables, but was not compared: ${c.detail}`;\n }\n}\n"]}
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
*
|
|
63
63
|
* @module composition/canonical-graph
|
|
64
64
|
*/
|
|
65
|
-
import type
|
|
65
|
+
import { type BridgeEdge } from './edge.js';
|
|
66
66
|
import type { CanonicalEquation } from '../canonical/canonical-equation.js';
|
|
67
67
|
import type { Dimension } from '../dimensional/types.js';
|
|
68
68
|
/** A universal constant a canonical `governing` list may name: SI value + dim. Named by the public `CANONICAL_CONSTANTS`. @public */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical-graph.d.ts","sourceRoot":"","sources":["../../src/composition/canonical-graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"canonical-graph.d.ts","sourceRoot":"","sources":["../../src/composition/canonical-graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AAEH,OAAO,EAAkB,KAAK,UAAU,EAAuB,MAAM,WAAW,CAAC;AAIjF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAK5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AASzD,qIAAqI;AACrI,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;CACzB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAIrE,CAAC;AAyZF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,GAAE,SAAS,iBAAiB,EAAwB,GAC5D,UAAU,EAAE,CAEd;AAED;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,UAAU,EAAuB,CAAC"}
|