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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"power-law.js","sourceRoot":"","sources":["../../../src/composition/probe/power-law.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Power-law discovery over the Buckingham π-groups (proposal 8 of\n * docs/planning/2026-10-15-map-maker-discoverer-proposals.md).\n *\n * When the governing variables leave k ≥ 1 dimensionless groups, dimensional\n * analysis fixes the target only as `base · F(π₁, …, πₖ)` for an unknown F.\n * This module fits the one family a monomial search can state, F = C Π πₖ^{aₖ}:\n * `log(y/base) = log C + Σ aₖ log πₖ` by MathTS `ols` on the exploratory rows,\n * reads the coefficients and their standard errors back, and rationalises each\n * aₖ that lies within 2·stderr of a fraction with denominator ≤ 6 (a bounded\n * scan, not `Fraction.fromNumber`, whose continued fraction can exceed its\n * cap). An exponent that is not such a fraction is a NEGATIVE RESULT stated in\n * the abstention, not a candidate with a decimal exponent.\n *\n * The fit reads `problem.exploratory` only: the holdout rows are never seen\n * here, exactly as `fit.ts` never fits them.\n *\n * @internal\n */\n\nimport { matrixRank, ols } from '@danielsimonjr/mathts-functions';\nimport { buckinghamPi, dimensionallyDetermines, type PiGroup } from '../../dimensional/buckingham.js';\nimport type { DimensionalVariableRef, ObservationRow, SearchProblem } from './types.js';\n\n/** One fitted π-group exponent: the estimate, its standard error, the 2σ interval and the fraction chosen in it. @internal */\nexport interface PowerLawExponent {\n /** The π-group's display form, e.g. `a · b^-1`. */\n readonly group: string;\n /** The π-group's integer exponent per variable. */\n readonly exponents: Readonly<Record<string, number>>;\n readonly estimate: number;\n readonly stderr: number;\n /** estimate ± 2·stderr. */\n readonly interval: readonly [number, number];\n /** The fraction with the smallest denominator ≤ 6 inside the interval; null when there is none. */\n readonly rational: { readonly numerator: number; readonly denominator: number } | null;\n}\n\n/** A recovered rational power law: `monomial` is base + Σ (pₖ/qₖ)·πₖ per variable. @internal */\nexport interface PowerLawFit {\n readonly kind: 'fit';\n /** The base monomial of the target over a maximal dimensionally independent subset of the governing set. */\n readonly base: Readonly<Record<string, number>>;\n readonly exponents: readonly PowerLawExponent[];\n /** log C of the fit (the prefactor is refit on the linear scale by the pipeline, like any candidate's). */\n readonly logPrefactor: number;\n readonly r2: number;\n /** Rows the fit used: a positive finite observation, base and every π. */\n readonly nRows: number;\n readonly skippedRows: number;\n /** The combined exponent per governing variable, rational values as numbers. */\n readonly monomial: Readonly<Record<string, number>>;\n}\n\n/** The outcome of {@link powerLawDetermination}. @internal */\nexport type PowerLawDetermination =\n | PowerLawFit\n | { readonly kind: 'not-applicable'; readonly reason: string }\n | { readonly kind: 'abstained'; readonly reason: string; readonly nRows: number; readonly skippedRows: number };\n\n/** The largest denominator the exponent scan admits. @internal */\nexport const MAX_EXPONENT_DENOMINATOR = 6;\n\n/** A reduced fraction. @internal */\nexport interface Rational {\n readonly numerator: number;\n readonly denominator: number;\n}\n\n/**\n * Every distinct reduced fraction p/q with q ≤ `maxDen` within `tol` of `x`,\n * in order of denominator (so 1/2 comes before 2/3). Empty when none is near;\n * more than one when the tolerance is too wide to tell them apart. @internal\n */\nexport function rationalCandidates(x: number, tol: number, maxDen = MAX_EXPONENT_DENOMINATOR): Rational[] {\n if (!Number.isFinite(x) || !(tol >= 0)) return [];\n const out: Rational[] = [];\n for (let d = 1; d <= maxDen; d++) {\n const lo = Math.ceil((x - tol) * d);\n const hi = Math.floor((x + tol) * d);\n for (let n = lo; n <= hi; n++) {\n const g = gcd(Math.abs(n), d);\n const r = { numerator: n / g, denominator: d / g };\n if (!out.some((o) => o.numerator === r.numerator && o.denominator === r.denominator)) out.push(r);\n }\n }\n return out;\n}\n\n/**\n * The one fraction p/q with q ≤ `maxDen` within `tol` of `x`, or null when\n * there is none or more than one (an estimate whose interval holds two\n * admissible fractions does not determine either). @internal\n */\nexport function rationalizeExponent(x: number, tol: number, maxDen = MAX_EXPONENT_DENOMINATOR): Rational | null {\n const all = rationalCandidates(x, tol, maxDen);\n return all.length === 1 ? all[0]! : null;\n}\n\nfunction gcd(a: number, b: number): number {\n while (b !== 0) [a, b] = [b, a % b];\n return a === 0 ? 1 : a;\n}\n\n/** The π-groups of the governing set and the target's base monomial over a maximal dimensionally independent subset. @internal */\nexport interface PiStructure {\n readonly groups: readonly PiGroup[];\n /** Null when the target's dimension is not in the span of the governing variables. */\n readonly base: Readonly<Record<string, number>> | null;\n}\n\n/**\n * The π-groups among the governing variables (MathTS `rationalNullspace`\n * through {@link buckinghamPi}) and the base monomial: the unique monomial of\n * the target over the first maximal dimensionally independent subset of the\n * governing set, in declared order. @internal\n */\nexport function piStructure(target: DimensionalVariableRef, governing: readonly DimensionalVariableRef[]): PiStructure {\n if (governing.length === 0) return { groups: [], base: null };\n const groups = buckinghamPi(governing).piGroups;\n const independent: DimensionalVariableRef[] = [];\n for (const g of governing) {\n if (buckinghamPi([...independent, g]).piGroupCount === 0) independent.push(g);\n }\n const det = dimensionallyDetermines(target, independent);\n const base: Record<string, number> = {};\n if (det.determined && det.monomial) {\n for (const g of governing) base[g.name] = det.monomial[g.name] ?? 0;\n return { groups, base };\n }\n return { groups, base: null };\n}\n\n/** `Π row[name]^exp` over the non-zero exponents; NaN when a name is missing. */\nfunction monomialValue(exponents: Readonly<Record<string, number>>, row: ObservationRow): number {\n let v = 1;\n for (const [name, e] of Object.entries(exponents)) {\n if (e === 0) continue;\n const x = row[name];\n if (x === undefined) return NaN;\n v *= x ** e;\n }\n return v;\n}\n\n/** The log-design of a set of rows: `[1, log π₁, …, log πₖ]` per usable row. @internal */\nexport interface LogDesign {\n readonly rows: readonly (readonly number[])[];\n /** Rows where every π-group is positive and finite. */\n readonly used: number;\n readonly skipped: number;\n}\n\n/** The log-design matrix over the rows where every π-group is positive and finite. @internal */\nexport function logDesign(groups: readonly PiGroup[], rows: readonly ObservationRow[]): LogDesign {\n const out: number[][] = [];\n let skipped = 0;\n for (const row of rows) {\n const pis = groups.map((g) => monomialValue(g.exponents, row));\n if (!pis.every((p) => Number.isFinite(p) && p > 0)) {\n skipped += 1;\n continue;\n }\n out.push([1, ...pis.map((p) => Math.log(p))]);\n }\n return { rows: out, used: out.length, skipped };\n}\n\n/** Each column divided by its largest magnitude (a zero column stays zero): order one, as `ols` and `matrixRank` need. */\nfunction scaleColumns(rows: readonly (readonly number[])[]): { scaled: number[][]; scales: number[] } {\n const k = rows[0]?.length ?? 0;\n const scales = Array.from({ length: k }, (_, j) => rows.reduce((m, r) => Math.max(m, Math.abs(r[j]!)), 0));\n const scaled = rows.map((r) => r.map((v, j) => (scales[j]! > 0 ? v / scales[j]! : 0)));\n return { scaled, scales };\n}\n\n/**\n * The rank of a log-design (MathTS `matrixRank`, whose tolerance is an absolute\n * 1e-10, so the columns are scaled to order one first). 0 for no rows. @internal\n */\nexport function logDesignRank(design: LogDesign): number {\n if (design.rows.length === 0) return 0;\n const { scaled } = scaleColumns(design.rows);\n const r: unknown = matrixRank(scaled);\n if (typeof r !== 'number' || !Number.isInteger(r)) throw new TypeError('matrixRank did not return an integer');\n return r;\n}\n\n/** A finite number read back from a MathTS result array, or null. */\nfunction numberAt(arr: unknown, i: number): number | null {\n if (!Array.isArray(arr)) return null;\n const v: unknown = arr[i];\n return typeof v === 'number' && Number.isFinite(v) ? v : null;\n}\n\n/**\n * Fit `log(y/base) = log C + Σ aₖ log πₖ` on the exploratory rows and\n * rationalise the exponents (module docs). Not applicable when the governing\n * set already fixes the target (the unique-monomial path searches that), when\n * it leaves no π-group, or when the target is outside its span. Abstains, with\n * the reason, without exploratory rows, below k + 2 usable rows, when a\n * π-group does not vary, when the log-design is collinear, or when an exponent\n * is not within 2σ of a fraction with denominator ≤ 6. @internal\n */\nexport function powerLawDetermination(problem: SearchProblem): PowerLawDetermination {\n const full = dimensionallyDetermines(problem.target, problem.governing);\n if (full.determined) {\n return { kind: 'not-applicable', reason: 'the governing set fixes the target up to a constant; the unique-monomial path searches it' };\n }\n const { groups, base } = piStructure(problem.target, problem.governing);\n if (groups.length === 0) {\n return { kind: 'not-applicable', reason: 'the governing set leaves no dimensionless group to raise to a power' };\n }\n if (base === null) {\n return { kind: 'not-applicable', reason: \"the target's dimension is not in the span of the governing variables\" };\n }\n const rows = problem.exploratory?.rows ?? [];\n if (rows.length === 0) {\n return { kind: 'abstained', reason: 'no exploratory rows: the power-law fit needs data', nRows: 0, skippedRows: 0 };\n }\n const k = groups.length;\n const X: number[][] = [];\n const ylog: number[] = [];\n let skipped = 0;\n for (const row of rows) {\n const y = row[problem.target.name];\n const b = monomialValue(base, row);\n const pis = groups.map((g) => monomialValue(g.exponents, row));\n if (!(y !== undefined && Number.isFinite(y) && y > 0 && Number.isFinite(b) && b > 0) || !pis.every((p) => Number.isFinite(p) && p > 0)) {\n skipped += 1;\n continue;\n }\n X.push(pis.map((p) => Math.log(p)));\n ylog.push(Math.log(y / b));\n }\n const used = X.length;\n const abstain = (reason: string): PowerLawDetermination => ({ kind: 'abstained', reason, nRows: used, skippedRows: skipped });\n if (used < k + 2) {\n return abstain(`only ${used} usable row(s) (positive observation, base and π-groups) for ${k} exponent(s) and a prefactor; the fit needs at least ${k + 2}`);\n }\n // A π-group whose log spreads by no more than round-off (1e-12 of its magnitude, or absolute)\n // does not vary: a/b with b = a is 1 up to an ulp, and that ulp is not an exponent's evidence.\n for (let j = 0; j < k; j++) {\n // Reductions, not spreads: a spread of a large row set overflows the call stack.\n const lo = X.reduce((m, r) => Math.min(m, r[j]!), Number.POSITIVE_INFINITY);\n const hi = X.reduce((m, r) => Math.max(m, r[j]!), Number.NEGATIVE_INFINITY);\n if (hi - lo <= 1e-12 * Math.max(1, Math.abs(hi), Math.abs(lo))) {\n return abstain(`π-group ${groups[j]!.formula} does not vary over the usable rows, so its exponent is not identifiable`);\n }\n }\n // Columns scaled to order one. History: before @danielsimonjr/mathts-functions 0.68.4, `ols`\n // tested singularity with an absolute 1e-15, so a column of log π of magnitude 1e-9 read as\n // collinear unscaled. From 0.68.4 (installed) `ols` equilibrates the design itself, and an\n // unscaled 1e-9 column fits without throwing. The scaling stays, because it also conditions\n // `matrixRank` (logDesignRank, which scales the same way). Coefficients and errors are unscaled after.\n const { scaled, scales } = scaleColumns(X);\n let fit;\n try {\n fit = ols(scaled, ylog, { intercept: true });\n } catch (e) {\n return abstain(`the log-design is collinear over the rows (${(e as Error).message}); the exponents are not identifiable`);\n }\n const logPrefactor = numberAt(fit.coefficients, 0);\n const r2 = typeof fit.r2 === 'number' && Number.isFinite(fit.r2) ? fit.r2 : null;\n if (logPrefactor === null || r2 === null) return abstain('ols did not return a finite intercept and R²');\n const exponents: PowerLawExponent[] = [];\n for (let j = 0; j < k; j++) {\n const c = numberAt(fit.coefficients, j + 1);\n const se = numberAt(fit.stderr, j + 1);\n if (c === null || se === null) return abstain(`ols did not return a finite coefficient and standard error for π-group ${groups[j]!.formula}`);\n const estimate = c / scales[j]!;\n const stderr = se / scales[j]!;\n // Noise-free rows give stderr 0; a representation tolerance keeps 0.5000000000000001 at 1/2.\n const tol = Math.max(2 * stderr, 1e-9 * Math.max(1, Math.abs(estimate)));\n const near = rationalCandidates(estimate, tol);\n const rational = near.length === 1 ? near[0]! : null;\n const group = groups[j]!;\n exponents.push({ group: group.formula, exponents: group.exponents, estimate, stderr, interval: [estimate - 2 * stderr, estimate + 2 * stderr], rational });\n const value = `${estimate.toPrecision(4)} ± ${stderr.toPrecision(2)}`;\n if (near.length === 0) {\n return abstain(`the exponent of ${group.formula} is ${value}, not within 2σ of a fraction with denominator ≤ ${MAX_EXPONENT_DENOMINATOR}`);\n }\n if (near.length > 1) {\n const list = near.slice(0, 4).map((r) => (r.denominator === 1 ? `${r.numerator}` : `${r.numerator}/${r.denominator}`)).join(', ');\n return abstain(\n `the exponent of ${group.formula} is ${value}: its 2σ interval holds ${near.length} fractions with denominator ≤ ${MAX_EXPONENT_DENOMINATOR} (${list}${near.length > 4 ? ', …' : ''}), so the rows do not determine it`,\n );\n }\n }\n const monomial: Record<string, number> = { ...base };\n for (const e of exponents) {\n const a = e.rational!.numerator / e.rational!.denominator;\n for (const [name, p] of Object.entries(e.exponents)) monomial[name] = (monomial[name] ?? 0) + a * p;\n }\n return { kind: 'fit', base, exponents, logPrefactor, r2, nRows: used, skippedRows: skipped, monomial };\n}\n\n/** One line for a run's wording: what the power-law fit found or why it abstained. @internal */\nexport function powerLawWording(pl: PowerLawDetermination): string | null {\n if (pl.kind === 'not-applicable') return null;\n if (pl.kind === 'abstained') return `no power law from the exploratory rows: ${pl.reason}`;\n const terms = pl.exponents\n .map((e) => {\n const { numerator: p, denominator: q } = e.rational!;\n const frac = q === 1 ? `${p}` : `${p}/${q}`;\n return `(${e.group})^(${frac}) [a = ${e.estimate.toPrecision(3)} ± ${e.stderr.toPrecision(2)}]`;\n })\n .join(' · ');\n return `power law from the exploratory rows: base · ${terms}; R² = ${pl.r2.toPrecision(4)} on ${pl.nRows} row(s)${pl.skippedRows > 0 ? ` (${pl.skippedRows} skipped: non-positive)` : ''}; each exponent is the fraction with denominator ≤ ${MAX_EXPONENT_DENOMINATOR} within 2σ of the fit`;\n}\n"]}
|
|
@@ -10,9 +10,9 @@ export declare function isGapKind(s: string): s is FrontierGapKind;
|
|
|
10
10
|
/** Residual / unexplained-observation gap template. @internal */
|
|
11
11
|
export declare function makeResidualGap(id: string, summary: string, kind?: FrontierGapKind): FrontierGap;
|
|
12
12
|
/**
|
|
13
|
-
* A JSON file that is not a search-problem file: a field it must carry
|
|
14
|
-
* value of another kind. The message names the field; it never reports what
|
|
15
|
-
* said on reading it. @internal
|
|
13
|
+
* A JSON file that is not a search-problem file, or not an expression file: a field it must carry
|
|
14
|
+
* is missing or holds a value of another kind. The message names the field; it never reports what
|
|
15
|
+
* a JavaScript engine said on reading it. @internal
|
|
16
16
|
*/
|
|
17
17
|
export declare class ProblemFileError extends Error {
|
|
18
18
|
constructor(message: string);
|
|
@@ -50,6 +50,9 @@ export declare function loadSearchProblemFromJson(path: string): SearchProblem;
|
|
|
50
50
|
export declare function resolveObservationsPath(raw: Pick<ProblemFile, 'observationsPath'>, source?: string): string | null;
|
|
51
51
|
/** Build a SearchProblem from an already-parsed problem file. @internal */
|
|
52
52
|
export declare function searchProblemFromFile(raw: ProblemFile, source?: string): SearchProblem;
|
|
53
|
-
/**
|
|
53
|
+
/**
|
|
54
|
+
* Load an ExprNode from a JSON file (`{expression}` wrapper or bare node). The node shape is
|
|
55
|
+
* checked recursively; a file that is not an expression raises {@link ProblemFileError}. @internal
|
|
56
|
+
*/
|
|
54
57
|
export declare function parseExprJson(path: string): ExprNode;
|
|
55
58
|
//# sourceMappingURL=problem.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"problem.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/problem.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"problem.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/problem.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,EAEV,qBAAqB,EACrB,WAAW,EACX,eAAe,EAEf,aAAa,EACd,MAAM,YAAY,CAAC;AAIpB,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,eAAe,CAazD;AAED,iEAAiE;AACjE,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,eAA2C,GAChD,WAAW,CAuBb;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAiCD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE;QACb,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,QAAQ,CAAC,SAAS,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/E,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,qBAAqB,CAAC;IAC7C,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC1C,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,qBAAqB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpD;AAED,yFAAyF;AACzF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAGrE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,EAAE,MAAM,SAAW,GAAG,MAAM,GAAG,IAAI,CAKpH;AAED,2EAA2E;AAC3E,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,SAAW,GAAG,aAAa,CAiExF;AA+ID;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAOpD"}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @internal
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
6
|
+
import { readJsonFile } from '../../core/data-file.js';
|
|
7
|
+
import { isPlainObject } from '../../core/json-schema.js';
|
|
7
8
|
import { dirname, isAbsolute, resolve } from 'node:path';
|
|
8
9
|
import { parseDimensionSpec } from '../../dimensional/dimension-spec.js';
|
|
9
10
|
import { problemFromResidualGap } from './frontier.js';
|
|
@@ -47,9 +48,9 @@ export function makeResidualGap(id, summary, kind = 'unexplained-observation') {
|
|
|
47
48
|
};
|
|
48
49
|
}
|
|
49
50
|
/**
|
|
50
|
-
* A JSON file that is not a search-problem file: a field it must carry
|
|
51
|
-
* value of another kind. The message names the field; it never reports what
|
|
52
|
-
* said on reading it. @internal
|
|
51
|
+
* A JSON file that is not a search-problem file, or not an expression file: a field it must carry
|
|
52
|
+
* is missing or holds a value of another kind. The message names the field; it never reports what
|
|
53
|
+
* a JavaScript engine said on reading it. @internal
|
|
53
54
|
*/
|
|
54
55
|
export class ProblemFileError extends Error {
|
|
55
56
|
constructor(message) {
|
|
@@ -57,6 +58,11 @@ export class ProblemFileError extends Error {
|
|
|
57
58
|
this.name = 'ProblemFileError';
|
|
58
59
|
}
|
|
59
60
|
}
|
|
61
|
+
/** The `DiscrepancyKind` union as a runtime set, for a file's `discrepancy.kind`. */
|
|
62
|
+
const DISCREPANCY_KINDS = new Set([
|
|
63
|
+
'additive', 'relative', 'log-ratio', 'standardized', 'likelihood',
|
|
64
|
+
'vector', 'tensor', 'distributional', 'operator', 'custom',
|
|
65
|
+
]);
|
|
60
66
|
/** What a JSON value is, in the words a file author would use. */
|
|
61
67
|
function kindOf(v) {
|
|
62
68
|
if (v === null)
|
|
@@ -71,10 +77,9 @@ function kindOf(v) {
|
|
|
71
77
|
return 'true or false';
|
|
72
78
|
return typeof v === 'object' ? 'an object' : typeof v;
|
|
73
79
|
}
|
|
74
|
-
const isRecord = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
75
80
|
/** A `{"name", "dim"}` variable, read from `raw` and located by `where` in any refusal. */
|
|
76
81
|
function varFromJson(raw, where) {
|
|
77
|
-
if (!
|
|
82
|
+
if (!isPlainObject(raw)) {
|
|
78
83
|
throw new ProblemFileError(`${where} must be {"name": text, "dim": text} (found ${kindOf(raw)})`);
|
|
79
84
|
}
|
|
80
85
|
const { name, dim } = raw;
|
|
@@ -88,7 +93,7 @@ function varFromJson(raw, where) {
|
|
|
88
93
|
}
|
|
89
94
|
/** Load a SearchProblem from a JSON file (optionally with inline datasets). @internal */
|
|
90
95
|
export function loadSearchProblemFromJson(path) {
|
|
91
|
-
const raw =
|
|
96
|
+
const raw = readJsonFile(path);
|
|
92
97
|
return searchProblemFromFile(raw, path);
|
|
93
98
|
}
|
|
94
99
|
/**
|
|
@@ -107,7 +112,7 @@ export function searchProblemFromFile(raw, source = 'inline') {
|
|
|
107
112
|
// `ProblemFile` is what a well-formed file holds; a file read from disk is any JSON value, so
|
|
108
113
|
// each field is checked here before it is read, and a refusal names the field.
|
|
109
114
|
const file = raw;
|
|
110
|
-
if (!
|
|
115
|
+
if (!isPlainObject(file)) {
|
|
111
116
|
throw new ProblemFileError(`the top level must be a JSON object with "target" and "governing" (found ${kindOf(file)})`);
|
|
112
117
|
}
|
|
113
118
|
if (file.target === undefined)
|
|
@@ -117,7 +122,7 @@ export function searchProblemFromFile(raw, source = 'inline') {
|
|
|
117
122
|
if (!Array.isArray(file.governing)) {
|
|
118
123
|
throw new ProblemFileError(`"governing" must be a list of {"name": text, "dim": text} (found ${kindOf(file.governing)})`);
|
|
119
124
|
}
|
|
120
|
-
if (file.gap !== undefined && !
|
|
125
|
+
if (file.gap !== undefined && !isPlainObject(file.gap)) {
|
|
121
126
|
throw new ProblemFileError(`"gap" must be an object (found ${kindOf(file.gap)})`);
|
|
122
127
|
}
|
|
123
128
|
for (const field of ['id', 'kind', 'summary']) {
|
|
@@ -142,6 +147,9 @@ export function searchProblemFromFile(raw, source = 'inline') {
|
|
|
142
147
|
const governing = raw.governing.map((g, i) => varFromJson(g, `governing[${i}]`));
|
|
143
148
|
let exploratory;
|
|
144
149
|
let holdout;
|
|
150
|
+
if (file.observationsPath !== undefined && typeof file.observationsPath !== 'string') {
|
|
151
|
+
throw new ProblemFileError(`"observationsPath" must be text (found ${kindOf(file.observationsPath)})`);
|
|
152
|
+
}
|
|
145
153
|
const observationsPath = resolveObservationsPath(raw, source);
|
|
146
154
|
if (observationsPath !== null) {
|
|
147
155
|
const split = loadSplitDatasetsFromJson(observationsPath);
|
|
@@ -155,57 +163,177 @@ export function searchProblemFromFile(raw, source = 'inline') {
|
|
|
155
163
|
holdout = asDatasetSafe(raw.holdout, `${source}#holdout`, 'validation-holdout');
|
|
156
164
|
}
|
|
157
165
|
const problem = problemFromResidualGap(gap, target, governing, exploratory, holdout);
|
|
166
|
+
// The secondary fields. Each was once passed through unread, so `limits: 5` or
|
|
167
|
+
// `assumptions: "x"` reached `runProbeSearch` and threw a raw TypeError there.
|
|
158
168
|
return {
|
|
159
169
|
...problem,
|
|
160
|
-
baseline:
|
|
161
|
-
discrepancy:
|
|
162
|
-
assumptions:
|
|
163
|
-
limits:
|
|
164
|
-
claimedRegimes:
|
|
165
|
-
observationalBoundIds:
|
|
170
|
+
baseline: file.baseline === undefined ? undefined : assertExprNode(file.baseline, '"baseline"'),
|
|
171
|
+
discrepancy: file.discrepancy === undefined ? problem.discrepancy : discrepancyFromJson(file.discrepancy),
|
|
172
|
+
assumptions: file.assumptions === undefined ? gap.assumptions : textList(file.assumptions, 'assumptions'),
|
|
173
|
+
limits: file.limits === undefined ? undefined : limitsFromJson(file.limits),
|
|
174
|
+
claimedRegimes: file.claimedRegimes === undefined ? undefined : textRecord(file.claimedRegimes, 'claimedRegimes'),
|
|
175
|
+
observationalBoundIds: file.observationalBoundIds === undefined ? undefined : textList(file.observationalBoundIds, 'observationalBoundIds'),
|
|
166
176
|
};
|
|
167
177
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
178
|
+
/** A list of text, located by its field name. */
|
|
179
|
+
function textList(raw, field) {
|
|
180
|
+
const label = field.includes('.') ? field : `"${field}"`;
|
|
181
|
+
if (!Array.isArray(raw))
|
|
182
|
+
throw new ProblemFileError(`${label} must be a list of text (found ${kindOf(raw)})`);
|
|
183
|
+
return raw.map((v, i) => {
|
|
184
|
+
if (typeof v !== 'string')
|
|
185
|
+
throw new ProblemFileError(`${field}[${i}] must be text (found ${kindOf(v)})`);
|
|
186
|
+
return v;
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
/** A `{name: text}` object, located by its field name. */
|
|
190
|
+
function textRecord(raw, field) {
|
|
191
|
+
if (!isPlainObject(raw))
|
|
192
|
+
throw new ProblemFileError(`"${field}" must be {name: text} (found ${kindOf(raw)})`);
|
|
193
|
+
const out = {};
|
|
194
|
+
for (const [k, v] of Object.entries(raw)) {
|
|
195
|
+
if (typeof v !== 'string')
|
|
196
|
+
throw new ProblemFileError(`${field}.${k} must be text (found ${kindOf(v)})`);
|
|
197
|
+
out[k] = v;
|
|
198
|
+
}
|
|
199
|
+
return out;
|
|
200
|
+
}
|
|
201
|
+
function discrepancyFromJson(raw) {
|
|
202
|
+
if (!isPlainObject(raw))
|
|
203
|
+
throw new ProblemFileError(`"discrepancy" must be {"kind": text, "observableIds": [text]} (found ${kindOf(raw)})`);
|
|
204
|
+
if (typeof raw.kind !== 'string' || !DISCREPANCY_KINDS.has(raw.kind)) {
|
|
205
|
+
throw new ProblemFileError(`discrepancy.kind '${String(raw.kind)}' is not a discrepancy kind (${[...DISCREPANCY_KINDS].join(', ')})`);
|
|
206
|
+
}
|
|
207
|
+
const observableIds = textList(raw.observableIds, 'discrepancy.observableIds');
|
|
208
|
+
for (const key of ['covarianceRef', 'implementationRef']) {
|
|
209
|
+
if (raw[key] !== undefined && typeof raw[key] !== 'string') {
|
|
210
|
+
throw new ProblemFileError(`discrepancy.${key} must be text (found ${kindOf(raw[key])})`);
|
|
177
211
|
}
|
|
178
|
-
|
|
179
|
-
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
kind: raw.kind,
|
|
215
|
+
observableIds,
|
|
216
|
+
...(typeof raw.covarianceRef === 'string' ? { covarianceRef: raw.covarianceRef } : {}),
|
|
217
|
+
...(typeof raw.implementationRef === 'string' ? { implementationRef: raw.implementationRef } : {}),
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
function limitsFromJson(raw) {
|
|
221
|
+
const shape = '{"id": text, "regime": {name: text}}';
|
|
222
|
+
if (!Array.isArray(raw))
|
|
223
|
+
throw new ProblemFileError(`"limits" must be a list of ${shape} (found ${kindOf(raw)})`);
|
|
224
|
+
return raw.map((l, i) => {
|
|
225
|
+
if (!isPlainObject(l))
|
|
226
|
+
throw new ProblemFileError(`limits[${i}] must be ${shape} (found ${kindOf(l)})`);
|
|
227
|
+
if (typeof l.id !== 'string' || l.id === '')
|
|
228
|
+
throw new ProblemFileError(`limits[${i}].id must be text`);
|
|
229
|
+
if (!isPlainObject(l.regime))
|
|
230
|
+
throw new ProblemFileError(`limits[${i}].regime must be {name: text} (found ${kindOf(l.regime)})`);
|
|
231
|
+
const regime = textRecord(l.regime, `limits[${i}].regime`);
|
|
232
|
+
if (l.description !== undefined && typeof l.description !== 'string') {
|
|
233
|
+
throw new ProblemFileError(`limits[${i}].description must be text (found ${kindOf(l.description)})`);
|
|
180
234
|
}
|
|
181
|
-
return
|
|
235
|
+
return { id: l.id, regime, ...(typeof l.description === 'string' ? { description: l.description } : {}) };
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
/** The scalar operators an `op` node may carry. */
|
|
239
|
+
const SCALAR_OPS = new Set(['+', '-', '*', '/', '^']);
|
|
240
|
+
/** The `TranscendentalFn` union as a runtime set. */
|
|
241
|
+
const TRANSCENDENTAL_FNS = new Set(['exp', 'ln', 'log2', 'log10', 'sin', 'cos', 'tan', 'sinh', 'cosh', 'tanh']);
|
|
242
|
+
/** A decimal literal, as the validator reads a numeric-literal symbol. */
|
|
243
|
+
const DECIMAL_LITERAL = /^[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?$/;
|
|
244
|
+
const DIM_KEYS = ['L', 'M', 'T', 'I', 'Theta', 'N', 'J'];
|
|
245
|
+
const SCALAR_KINDS = 'symbol, op, integral, derivative, dirac-delta, variational-derivative, transcendental, abs';
|
|
246
|
+
/** `raw[field]` as a child node, or a refusal that names the field. */
|
|
247
|
+
function child(raw, field, path, what) {
|
|
248
|
+
if (raw[field] === undefined)
|
|
249
|
+
throw new ProblemFileError(`${path} ${what} node needs ${field === 'args' ? '' : 'an '}"${field}" node`);
|
|
250
|
+
return assertExprNode(raw[field], `${path}#${field}`);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Check that a JSON value has the shape of a scalar `ExprNode`, recursively:
|
|
254
|
+
* a kind per node, the children each kind owns, a finite literal where a
|
|
255
|
+
* symbol's name is a decimal literal, and the seven dimension exponents on a
|
|
256
|
+
* symbol. A tensor kind is refused here: the probe evaluates scalars.
|
|
257
|
+
* Refusals are {@link ProblemFileError}, located by `path`.
|
|
258
|
+
*/
|
|
259
|
+
function assertExprNode(raw, path) {
|
|
260
|
+
if (!isPlainObject(raw) || !('kind' in raw)) {
|
|
261
|
+
throw new ProblemFileError(`${path} is not an ExprNode JSON object (found ${kindOf(raw)})`);
|
|
182
262
|
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
263
|
+
const kind = raw.kind;
|
|
264
|
+
if (typeof kind !== 'string' || kind.length === 0) {
|
|
265
|
+
throw new ProblemFileError(`${path} has invalid kind (found ${kindOf(kind)})`);
|
|
266
|
+
}
|
|
267
|
+
switch (kind) {
|
|
268
|
+
case 'symbol': {
|
|
269
|
+
if (typeof raw.name !== 'string' || raw.name.length === 0) {
|
|
270
|
+
throw new ProblemFileError(`${path} symbol node missing name (needs "name": text)`);
|
|
271
|
+
}
|
|
272
|
+
if (!isPlainObject(raw.dim))
|
|
273
|
+
throw new ProblemFileError(`${path} symbol node missing dim`);
|
|
274
|
+
for (const k of DIM_KEYS) {
|
|
275
|
+
if (!(k in raw.dim))
|
|
276
|
+
throw new ProblemFileError(`${path} symbol node dim needs the exponents ${DIM_KEYS.join(', ')}`);
|
|
277
|
+
if (typeof raw.dim[k] !== 'number' || !Number.isFinite(raw.dim[k])) {
|
|
278
|
+
throw new ProblemFileError(`${path} symbol node dim.${k} must be a finite number (found ${kindOf(raw.dim[k])})`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
if (DECIMAL_LITERAL.test(raw.name) && !Number.isFinite(Number(raw.name))) {
|
|
282
|
+
throw new ProblemFileError(`${path} literal '${raw.name}' is not a finite number`);
|
|
283
|
+
}
|
|
284
|
+
return raw;
|
|
187
285
|
}
|
|
188
|
-
|
|
189
|
-
|
|
286
|
+
case 'op': {
|
|
287
|
+
if (typeof raw.op !== 'string' || !Array.isArray(raw.args)) {
|
|
288
|
+
throw new ProblemFileError(`${path} op node needs "op" and an "args" list (op node missing op/args)`);
|
|
289
|
+
}
|
|
290
|
+
if (!SCALAR_OPS.has(raw.op))
|
|
291
|
+
throw new ProblemFileError(`${path} op node has op '${raw.op}', not one of + - * / ^`);
|
|
292
|
+
raw.args.forEach((a, i) => assertExprNode(a, `${path}#args[${i}]`));
|
|
293
|
+
return raw;
|
|
190
294
|
}
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
295
|
+
case 'integral': {
|
|
296
|
+
child(raw, 'over', path, 'integral');
|
|
297
|
+
child(raw, 'integrand', path, 'integral');
|
|
298
|
+
for (const bound of ['lower', 'upper'])
|
|
299
|
+
if (raw[bound] !== undefined)
|
|
300
|
+
assertExprNode(raw[bound], `${path}#${bound}`);
|
|
301
|
+
return raw;
|
|
302
|
+
}
|
|
303
|
+
case 'derivative':
|
|
304
|
+
child(raw, 'of', path, 'derivative');
|
|
305
|
+
child(raw, 'wrt', path, 'derivative');
|
|
306
|
+
return raw;
|
|
307
|
+
case 'dirac-delta':
|
|
308
|
+
case 'abs':
|
|
309
|
+
child(raw, 'arg', path, kind);
|
|
310
|
+
return raw;
|
|
311
|
+
case 'variational-derivative':
|
|
312
|
+
for (const f of ['functional', 'field', 'over'])
|
|
313
|
+
child(raw, f, path, kind);
|
|
314
|
+
return raw;
|
|
315
|
+
case 'transcendental': {
|
|
316
|
+
if (typeof raw.fn !== 'string' || !TRANSCENDENTAL_FNS.has(raw.fn)) {
|
|
317
|
+
throw new ProblemFileError(`${path} transcendental node has fn '${String(raw.fn)}', not one of ${[...TRANSCENDENTAL_FNS].join(', ')}`);
|
|
318
|
+
}
|
|
319
|
+
child(raw, 'arg', path, kind);
|
|
320
|
+
return raw;
|
|
321
|
+
}
|
|
322
|
+
default:
|
|
323
|
+
throw new ProblemFileError(`${path} has kind '${kind}', which is not a scalar expression node (${SCALAR_KINDS})`);
|
|
195
324
|
}
|
|
196
|
-
return raw;
|
|
197
325
|
}
|
|
198
|
-
/**
|
|
326
|
+
/**
|
|
327
|
+
* Load an ExprNode from a JSON file (`{expression}` wrapper or bare node). The node shape is
|
|
328
|
+
* checked recursively; a file that is not an expression raises {@link ProblemFileError}. @internal
|
|
329
|
+
*/
|
|
199
330
|
export function parseExprJson(path) {
|
|
200
|
-
const raw =
|
|
201
|
-
if (raw &&
|
|
202
|
-
return
|
|
203
|
-
if (raw &&
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
return assertMinimalExprNode(raw.expression, path);
|
|
208
|
-
}
|
|
209
|
-
throw new Error(`${path} is not an ExprNode JSON object`);
|
|
331
|
+
const raw = readJsonFile(path);
|
|
332
|
+
if (isPlainObject(raw) && 'kind' in raw)
|
|
333
|
+
return assertExprNode(raw, path);
|
|
334
|
+
if (isPlainObject(raw) && 'expression' in raw && raw.expression) {
|
|
335
|
+
return assertExprNode(raw.expression, path);
|
|
336
|
+
}
|
|
337
|
+
throw new ProblemFileError(`${path} is not an ExprNode JSON object`);
|
|
210
338
|
}
|
|
211
339
|
//# sourceMappingURL=problem.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"problem.js","sourceRoot":"","sources":["../../../src/composition/probe/problem.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAUzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAExE,gGAAgG;AAChG,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,OAAO,CACL,CAAC,KAAK,qBAAqB;QAC3B,CAAC,KAAK,eAAe;QACrB,CAAC,KAAK,mBAAmB;QACzB,CAAC,KAAK,mBAAmB;QACzB,CAAC,KAAK,qBAAqB;QAC3B,CAAC,KAAK,kBAAkB;QACxB,CAAC,KAAK,yBAAyB;QAC/B,CAAC,KAAK,oBAAoB;QAC1B,CAAC,KAAK,kBAAkB;QACxB,CAAC,KAAK,OAAO,CACd,CAAC;AACJ,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,eAAe,CAC7B,EAAU,EACV,OAAe,EACf,IAAI,GAAoB,yBAAyB;IAEjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,UAAU,CAAC,mDAAmD,EAAE,IAAI,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,mBAAmB,EAAE,CAAC;QAC7D,MAAM,IAAI,UAAU,CAAC,oBAAoB,IAAI,6CAA6C,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO;QACL,EAAE;QACF,IAAI;QACJ,YAAY,EAAE,EAAE;QAChB,YAAY,EAAE,EAAE;QAChB,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,EAAE;QACf,WAAW,EAAE,EAAE;QACf,QAAQ,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;QACpC,eAAe,EAAE;YACf,IAAI,EAAE,YAAY;YAClB,UAAU,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,kBAAkB,CAAC,EAAE;SACjE;QACD,aAAa,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,cAAc,CAAC,EAAE;QAC9D,MAAM,EAAE,YAAY;KACrB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,kEAAkE;AAClE,SAAS,MAAM,CAAC,CAAU;IACxB,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IACtC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IACzC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,UAAU,CAAC;IAC7C,IAAI,OAAO,CAAC,KAAK,SAAS;QAAE,OAAO,eAAe,CAAC;IACnD,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,QAAQ,GAAG,CAAC,CAAU,EAAgC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAExH,2FAA2F;AAC3F,SAAS,WAAW,CAAC,GAAY,EAAE,KAAa;IAC9C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,gBAAgB,CAAC,GAAG,KAAK,+CAA+C,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpG,CAAC;IACD,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;IAC1B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,gBAAgB,CAAC,GAAG,KAAK,yBAAyB,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACrH,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,gBAAgB,CAAC,GAAG,KAAK,wBAAwB,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAClH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;AAChD,CAAC;AAqBD,yFAAyF;AACzF,MAAM,UAAU,yBAAyB,CAAC,IAAY;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAgB,CAAC;IAClE,OAAO,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAA0C,EAAE,MAAM,GAAG,QAAQ;IACnG,IAAI,CAAC,GAAG,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,UAAU,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACrC,CAAC,CAAC,GAAG,CAAC,gBAAgB;QACtB,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAC3F,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,qBAAqB,CAAC,GAAgB,EAAE,MAAM,GAAG,QAAQ;IACvE,8FAA8F;IAC9F,+EAA+E;IAC/E,MAAM,IAAI,GAAY,GAAG,CAAC;IAC1B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,gBAAgB,CAAC,4EAA4E,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1H,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,gBAAgB,CAAC,kDAAkD,CAAC,CAAC;IAC9G,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;QAAE,MAAM,IAAI,gBAAgB,CAAC,iEAAiE,CAAC,CAAC;IAChI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,gBAAgB,CAAC,oEAAoE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC5H,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,gBAAgB,CAAC,kCAAkC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpF,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAU,EAAE,CAAC;QACvD,MAAM,CAAC,GAAY,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC7C,MAAM,IAAI,gBAAgB,CAAC,OAAO,KAAK,wBAAwB,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,EAAE,IAAI,IAAI,yBAAyB,CAAC;IAC3D,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,gBAAgB,CAAC,qBAAqB,OAAO,sDAAsD,CAAC,CAAC;IACjH,CAAC;IACD,IAAI,OAAO,KAAK,eAAe,IAAI,OAAO,KAAK,mBAAmB,EAAE,CAAC;QACnE,MAAM,IAAI,gBAAgB,CAAC,aAAa,OAAO,uDAAuD,CAAC,CAAC;IAC1G,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,WAAW,CAAC;IACzC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,gBAAgB,CAAC,WAAW,KAAK,yBAAyB,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,IAAI,uBAAuB,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;IACjG,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IACjF,IAAI,WAAqC,CAAC;IAC1C,IAAI,OAAiC,CAAC;IACtC,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC9D,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;QAC1D,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QAChC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC1B,CAAC;IACD,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QACpB,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,MAAM,cAAc,EAAE,iBAAiB,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAChB,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,MAAM,UAAU,EAAE,oBAAoB,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,OAAO,GAAG,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACrF,OAAO;QACL,GAAG,OAAO;QACV,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW;QACnD,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,WAAW;QAC/C,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,qBAAqB,EAAE,GAAG,CAAC,qBAAqB;KACjD,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAY,EAAE,IAAY;IACvD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,iCAAiC,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,IAAI,GAAG,GAAwB,CAAC;IACtC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,GAAwC,CAAC;QACrD,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,2BAA2B,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,0BAA0B,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,GAAe,CAAC;IACzB,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,GAAuC,CAAC;QACnD,IAAI,OAAO,EAAE,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,0BAA0B,CAAC,CAAC;QACrD,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,qBAAqB,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,GAAe,CAAC;IACzB,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,mBAAmB,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,GAAe,CAAC;AACzB,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAyC,CAAC;IAC3F,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG;QAAE,OAAO,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7F,IACE,GAAG;QACH,OAAO,GAAG,KAAK,QAAQ;QACvB,YAAY,IAAI,GAAG;QAClB,GAAiC,CAAC,UAAU,EAC7C,CAAC;QACD,OAAO,qBAAqB,CAAE,GAA+B,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,iCAAiC,CAAC,CAAC;AAC5D,CAAC","sourcesContent":["/**\n * Search-problem construction and JSON loading for Product B.\n *\n * @internal\n */\n\nimport { readFileSync } from 'node:fs';\nimport { dirname, isAbsolute, resolve } from 'node:path';\nimport { parseDimensionSpec } from '../../dimensional/dimension-spec.js';\nimport type { ExprNode } from '../../dimensional/ast-types.js';\nimport type {\n DimensionalVariableRef,\n DiscrepancyDefinition,\n FrontierGap,\n FrontierGapKind,\n ProbeDataset,\n SearchProblem,\n} from './types.js';\nimport { problemFromResidualGap } from './frontier.js';\nimport { asDatasetSafe, loadSplitDatasetsFromJson } from './dataset.js';\n\n/** Return whether a string names a supported frontier-gap kind for probe problems. @internal */\nexport function isGapKind(s: string): s is FrontierGapKind {\n return (\n s === 'prediction-residual' ||\n s === 'relation-link' ||\n s === 'regime-transition' ||\n s === 'parameter-tension' ||\n s === 'assumption-conflict' ||\n s === 'missing-operator' ||\n s === 'unexplained-observation' ||\n s === 'model-disagreement' ||\n s === 'causal-mechanism' ||\n s === 'other'\n );\n}\n\n/** Residual / unexplained-observation gap template. @internal */\nexport function makeResidualGap(\n id: string,\n summary: string,\n kind: FrontierGapKind = 'unexplained-observation',\n): FrontierGap {\n if (!id.startsWith('fg-')) {\n throw new RangeError(`makeResidualGap: id must start with 'fg-' (got '${id}')`);\n }\n if (kind === 'relation-link' || kind === 'regime-transition') {\n throw new RangeError(`makeResidualGap: ${kind} is Product A — use upt discover, not probe`);\n }\n return {\n id,\n kind,\n participants: [],\n observations: [],\n regimes: [],\n assumptions: [],\n constraints: [],\n evidence: { summary, sourceIds: [] },\n identifiability: {\n kind: 'parametric',\n parametric: { status: 'unknown', reasons: ['not yet assessed'] },\n },\n searchability: { searchable: true, reasons: ['residual gap'] },\n status: 'identified',\n };\n}\n\n/**\n * A JSON file that is not a search-problem file: a field it must carry is missing or holds a\n * value of another kind. The message names the field; it never reports what a JavaScript engine\n * said on reading it. @internal\n */\nexport class ProblemFileError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ProblemFileError';\n }\n}\n\n/** What a JSON value is, in the words a file author would use. */\nfunction kindOf(v: unknown): string {\n if (v === null) return 'null';\n if (Array.isArray(v)) return 'a list';\n if (typeof v === 'string') return 'text';\n if (typeof v === 'number') return 'a number';\n if (typeof v === 'boolean') return 'true or false';\n return typeof v === 'object' ? 'an object' : typeof v;\n}\n\nconst isRecord = (v: unknown): v is Record<string, unknown> => typeof v === 'object' && v !== null && !Array.isArray(v);\n\n/** A `{\"name\", \"dim\"}` variable, read from `raw` and located by `where` in any refusal. */\nfunction varFromJson(raw: unknown, where: string): DimensionalVariableRef {\n if (!isRecord(raw)) {\n throw new ProblemFileError(`${where} must be {\"name\": text, \"dim\": text} (found ${kindOf(raw)})`);\n }\n const { name, dim } = raw;\n if (typeof name !== 'string' || name === '') {\n throw new ProblemFileError(`${where} needs a \"name\" (text)${name === undefined ? '' : `, found ${kindOf(name)}`}`);\n }\n if (typeof dim !== 'string' || dim === '') {\n throw new ProblemFileError(`${where} needs a \"dim\" (text)${dim === undefined ? '' : `, found ${kindOf(dim)}`}`);\n }\n return { name, dim: parseDimensionSpec(dim) };\n}\n\nexport interface ProblemFile {\n readonly gap?: {\n readonly id?: string;\n readonly kind?: string;\n readonly summary?: string;\n };\n readonly target: { readonly name: string; readonly dim: string };\n readonly governing: readonly { readonly name: string; readonly dim: string }[];\n readonly exploratory?: unknown;\n readonly holdout?: unknown;\n readonly observationsPath?: string;\n readonly baseline?: ExprNode;\n readonly discrepancy?: DiscrepancyDefinition;\n readonly assumptions?: readonly string[];\n readonly limits?: SearchProblem['limits'];\n readonly claimedRegimes?: Readonly<Record<string, string>>;\n readonly observationalBoundIds?: readonly string[];\n}\n\n/** Load a SearchProblem from a JSON file (optionally with inline datasets). @internal */\nexport function loadSearchProblemFromJson(path: string): SearchProblem {\n const raw = JSON.parse(readFileSync(path, 'utf8')) as ProblemFile;\n return searchProblemFromFile(raw, path);\n}\n\n/**\n * The observations file a problem file names, resolved against the problem file's directory\n * (the working directory for an inline problem), or null when it names none. @internal\n */\nexport function resolveObservationsPath(raw: Pick<ProblemFile, 'observationsPath'>, source = 'inline'): string | null {\n if (!raw.observationsPath) return null;\n return isAbsolute(raw.observationsPath)\n ? raw.observationsPath\n : resolve(source === 'inline' ? process.cwd() : dirname(source), raw.observationsPath);\n}\n\n/** Build a SearchProblem from an already-parsed problem file. @internal */\nexport function searchProblemFromFile(raw: ProblemFile, source = 'inline'): SearchProblem {\n // `ProblemFile` is what a well-formed file holds; a file read from disk is any JSON value, so\n // each field is checked here before it is read, and a refusal names the field.\n const file: unknown = raw;\n if (!isRecord(file)) {\n throw new ProblemFileError(`the top level must be a JSON object with \"target\" and \"governing\" (found ${kindOf(file)})`);\n }\n if (file.target === undefined) throw new ProblemFileError('it has no \"target\" ({\"name\": text, \"dim\": text})');\n if (file.governing === undefined) throw new ProblemFileError('it has no \"governing\" list ([{\"name\": text, \"dim\": text}, ...])');\n if (!Array.isArray(file.governing)) {\n throw new ProblemFileError(`\"governing\" must be a list of {\"name\": text, \"dim\": text} (found ${kindOf(file.governing)})`);\n }\n if (file.gap !== undefined && !isRecord(file.gap)) {\n throw new ProblemFileError(`\"gap\" must be an object (found ${kindOf(file.gap)})`);\n }\n for (const field of ['id', 'kind', 'summary'] as const) {\n const v: unknown = raw.gap?.[field];\n if (v !== undefined && typeof v !== 'string') {\n throw new ProblemFileError(`gap.${field} must be text (found ${kindOf(v)})`);\n }\n }\n const kindRaw = raw.gap?.kind ?? 'unexplained-observation';\n if (!isGapKind(kindRaw)) {\n throw new ProblemFileError(`unknown gap kind '${kindRaw}' in gap.kind (see \\`upt help probe\\`, PROBLEM FILE)`);\n }\n if (kindRaw === 'relation-link' || kindRaw === 'regime-transition') {\n throw new ProblemFileError(`gap.kind '${kindRaw}' is a Product A gap: use \\`upt discover\\`, not probe`);\n }\n const gapId = raw.gap?.id ?? 'fg-inline';\n if (!gapId.startsWith('fg-')) {\n throw new ProblemFileError(`gap.id '${gapId}' must start with \"fg-\"`);\n }\n const gap = makeResidualGap(gapId, raw.gap?.summary ?? `search problem from ${source}`, kindRaw);\n const target = varFromJson(raw.target, '\"target\"');\n const governing = raw.governing.map((g, i) => varFromJson(g, `governing[${i}]`));\n let exploratory: ProbeDataset | undefined;\n let holdout: ProbeDataset | undefined;\n const observationsPath = resolveObservationsPath(raw, source);\n if (observationsPath !== null) {\n const split = loadSplitDatasetsFromJson(observationsPath);\n exploratory = split.exploratory;\n holdout = split.holdout;\n }\n if (raw.exploratory) {\n exploratory = asDatasetSafe(raw.exploratory, `${source}#exploratory`, 'exploratory-fit');\n }\n if (raw.holdout) {\n holdout = asDatasetSafe(raw.holdout, `${source}#holdout`, 'validation-holdout');\n }\n const problem = problemFromResidualGap(gap, target, governing, exploratory, holdout);\n return {\n ...problem,\n baseline: raw.baseline,\n discrepancy: raw.discrepancy ?? problem.discrepancy,\n assumptions: raw.assumptions ?? gap.assumptions,\n limits: raw.limits,\n claimedRegimes: raw.claimedRegimes,\n observationalBoundIds: raw.observationalBoundIds,\n };\n}\n\nfunction assertMinimalExprNode(raw: unknown, path: string): ExprNode {\n if (!raw || typeof raw !== 'object' || !('kind' in raw)) {\n throw new Error(`${path} is not an ExprNode JSON object`);\n }\n const node = raw as { kind: unknown };\n if (node.kind === 'symbol') {\n const sym = raw as { name?: unknown; dim?: unknown };\n if (typeof sym.name !== 'string' || sym.name.length === 0) {\n throw new Error(`${path} symbol node missing name`);\n }\n if (!sym.dim || typeof sym.dim !== 'object') {\n throw new Error(`${path} symbol node missing dim`);\n }\n return raw as ExprNode;\n }\n if (node.kind === 'op') {\n const op = raw as { op?: unknown; args?: unknown };\n if (typeof op.op !== 'string' || !Array.isArray(op.args)) {\n throw new Error(`${path} op node missing op/args`);\n }\n for (let i = 0; i < op.args.length; i++) {\n assertMinimalExprNode(op.args[i], `${path}#args[${i}]`);\n }\n return raw as ExprNode;\n }\n if (typeof node.kind !== 'string' || node.kind.length === 0) {\n throw new Error(`${path} has invalid kind`);\n }\n return raw as ExprNode;\n}\n\n/** Load an ExprNode from a JSON file (`{expression}` wrapper or bare node). @internal */\nexport function parseExprJson(path: string): ExprNode {\n const raw = JSON.parse(readFileSync(path, 'utf8')) as { expression?: ExprNode } | ExprNode;\n if (raw && typeof raw === 'object' && 'kind' in raw) return assertMinimalExprNode(raw, path);\n if (\n raw &&\n typeof raw === 'object' &&\n 'expression' in raw &&\n (raw as { expression?: ExprNode }).expression\n ) {\n return assertMinimalExprNode((raw as { expression: unknown }).expression, path);\n }\n throw new Error(`${path} is not an ExprNode JSON object`);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"problem.js","sourceRoot":"","sources":["../../../src/composition/probe/problem.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Search-problem construction and JSON loading for Product B.\n *\n * @internal\n */\n\nimport { readJsonFile } from '../../core/data-file.js';\nimport { isPlainObject } from '../../core/json-schema.js';\nimport { dirname, isAbsolute, resolve } from 'node:path';\nimport { parseDimensionSpec } from '../../dimensional/dimension-spec.js';\nimport type { ExprNode } from '../../dimensional/ast-types.js';\nimport type {\n DimensionalVariableRef,\n DiscrepancyDefinition,\n FrontierGap,\n FrontierGapKind,\n ProbeDataset,\n SearchProblem,\n} from './types.js';\nimport { problemFromResidualGap } from './frontier.js';\nimport { asDatasetSafe, loadSplitDatasetsFromJson } from './dataset.js';\n\n/** Return whether a string names a supported frontier-gap kind for probe problems. @internal */\nexport function isGapKind(s: string): s is FrontierGapKind {\n return (\n s === 'prediction-residual' ||\n s === 'relation-link' ||\n s === 'regime-transition' ||\n s === 'parameter-tension' ||\n s === 'assumption-conflict' ||\n s === 'missing-operator' ||\n s === 'unexplained-observation' ||\n s === 'model-disagreement' ||\n s === 'causal-mechanism' ||\n s === 'other'\n );\n}\n\n/** Residual / unexplained-observation gap template. @internal */\nexport function makeResidualGap(\n id: string,\n summary: string,\n kind: FrontierGapKind = 'unexplained-observation',\n): FrontierGap {\n if (!id.startsWith('fg-')) {\n throw new RangeError(`makeResidualGap: id must start with 'fg-' (got '${id}')`);\n }\n if (kind === 'relation-link' || kind === 'regime-transition') {\n throw new RangeError(`makeResidualGap: ${kind} is Product A — use upt discover, not probe`);\n }\n return {\n id,\n kind,\n participants: [],\n observations: [],\n regimes: [],\n assumptions: [],\n constraints: [],\n evidence: { summary, sourceIds: [] },\n identifiability: {\n kind: 'parametric',\n parametric: { status: 'unknown', reasons: ['not yet assessed'] },\n },\n searchability: { searchable: true, reasons: ['residual gap'] },\n status: 'identified',\n };\n}\n\n/**\n * A JSON file that is not a search-problem file, or not an expression file: a field it must carry\n * is missing or holds a value of another kind. The message names the field; it never reports what\n * a JavaScript engine said on reading it. @internal\n */\nexport class ProblemFileError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ProblemFileError';\n }\n}\n\n/** The `DiscrepancyKind` union as a runtime set, for a file's `discrepancy.kind`. */\nconst DISCREPANCY_KINDS: ReadonlySet<string> = new Set([\n 'additive', 'relative', 'log-ratio', 'standardized', 'likelihood',\n 'vector', 'tensor', 'distributional', 'operator', 'custom',\n]);\n\n/** What a JSON value is, in the words a file author would use. */\nfunction kindOf(v: unknown): string {\n if (v === null) return 'null';\n if (Array.isArray(v)) return 'a list';\n if (typeof v === 'string') return 'text';\n if (typeof v === 'number') return 'a number';\n if (typeof v === 'boolean') return 'true or false';\n return typeof v === 'object' ? 'an object' : typeof v;\n}\n\n/** A `{\"name\", \"dim\"}` variable, read from `raw` and located by `where` in any refusal. */\nfunction varFromJson(raw: unknown, where: string): DimensionalVariableRef {\n if (!isPlainObject(raw)) {\n throw new ProblemFileError(`${where} must be {\"name\": text, \"dim\": text} (found ${kindOf(raw)})`);\n }\n const { name, dim } = raw;\n if (typeof name !== 'string' || name === '') {\n throw new ProblemFileError(`${where} needs a \"name\" (text)${name === undefined ? '' : `, found ${kindOf(name)}`}`);\n }\n if (typeof dim !== 'string' || dim === '') {\n throw new ProblemFileError(`${where} needs a \"dim\" (text)${dim === undefined ? '' : `, found ${kindOf(dim)}`}`);\n }\n return { name, dim: parseDimensionSpec(dim) };\n}\n\nexport interface ProblemFile {\n readonly gap?: {\n readonly id?: string;\n readonly kind?: string;\n readonly summary?: string;\n };\n readonly target: { readonly name: string; readonly dim: string };\n readonly governing: readonly { readonly name: string; readonly dim: string }[];\n readonly exploratory?: unknown;\n readonly holdout?: unknown;\n readonly observationsPath?: string;\n readonly baseline?: ExprNode;\n readonly discrepancy?: DiscrepancyDefinition;\n readonly assumptions?: readonly string[];\n readonly limits?: SearchProblem['limits'];\n readonly claimedRegimes?: Readonly<Record<string, string>>;\n readonly observationalBoundIds?: readonly string[];\n}\n\n/** Load a SearchProblem from a JSON file (optionally with inline datasets). @internal */\nexport function loadSearchProblemFromJson(path: string): SearchProblem {\n const raw = readJsonFile(path) as ProblemFile;\n return searchProblemFromFile(raw, path);\n}\n\n/**\n * The observations file a problem file names, resolved against the problem file's directory\n * (the working directory for an inline problem), or null when it names none. @internal\n */\nexport function resolveObservationsPath(raw: Pick<ProblemFile, 'observationsPath'>, source = 'inline'): string | null {\n if (!raw.observationsPath) return null;\n return isAbsolute(raw.observationsPath)\n ? raw.observationsPath\n : resolve(source === 'inline' ? process.cwd() : dirname(source), raw.observationsPath);\n}\n\n/** Build a SearchProblem from an already-parsed problem file. @internal */\nexport function searchProblemFromFile(raw: ProblemFile, source = 'inline'): SearchProblem {\n // `ProblemFile` is what a well-formed file holds; a file read from disk is any JSON value, so\n // each field is checked here before it is read, and a refusal names the field.\n const file: unknown = raw;\n if (!isPlainObject(file)) {\n throw new ProblemFileError(`the top level must be a JSON object with \"target\" and \"governing\" (found ${kindOf(file)})`);\n }\n if (file.target === undefined) throw new ProblemFileError('it has no \"target\" ({\"name\": text, \"dim\": text})');\n if (file.governing === undefined) throw new ProblemFileError('it has no \"governing\" list ([{\"name\": text, \"dim\": text}, ...])');\n if (!Array.isArray(file.governing)) {\n throw new ProblemFileError(`\"governing\" must be a list of {\"name\": text, \"dim\": text} (found ${kindOf(file.governing)})`);\n }\n if (file.gap !== undefined && !isPlainObject(file.gap)) {\n throw new ProblemFileError(`\"gap\" must be an object (found ${kindOf(file.gap)})`);\n }\n for (const field of ['id', 'kind', 'summary'] as const) {\n const v: unknown = raw.gap?.[field];\n if (v !== undefined && typeof v !== 'string') {\n throw new ProblemFileError(`gap.${field} must be text (found ${kindOf(v)})`);\n }\n }\n const kindRaw = raw.gap?.kind ?? 'unexplained-observation';\n if (!isGapKind(kindRaw)) {\n throw new ProblemFileError(`unknown gap kind '${kindRaw}' in gap.kind (see \\`upt help probe\\`, PROBLEM FILE)`);\n }\n if (kindRaw === 'relation-link' || kindRaw === 'regime-transition') {\n throw new ProblemFileError(`gap.kind '${kindRaw}' is a Product A gap: use \\`upt discover\\`, not probe`);\n }\n const gapId = raw.gap?.id ?? 'fg-inline';\n if (!gapId.startsWith('fg-')) {\n throw new ProblemFileError(`gap.id '${gapId}' must start with \"fg-\"`);\n }\n const gap = makeResidualGap(gapId, raw.gap?.summary ?? `search problem from ${source}`, kindRaw);\n const target = varFromJson(raw.target, '\"target\"');\n const governing = raw.governing.map((g, i) => varFromJson(g, `governing[${i}]`));\n let exploratory: ProbeDataset | undefined;\n let holdout: ProbeDataset | undefined;\n if (file.observationsPath !== undefined && typeof file.observationsPath !== 'string') {\n throw new ProblemFileError(`\"observationsPath\" must be text (found ${kindOf(file.observationsPath)})`);\n }\n const observationsPath = resolveObservationsPath(raw, source);\n if (observationsPath !== null) {\n const split = loadSplitDatasetsFromJson(observationsPath);\n exploratory = split.exploratory;\n holdout = split.holdout;\n }\n if (raw.exploratory) {\n exploratory = asDatasetSafe(raw.exploratory, `${source}#exploratory`, 'exploratory-fit');\n }\n if (raw.holdout) {\n holdout = asDatasetSafe(raw.holdout, `${source}#holdout`, 'validation-holdout');\n }\n const problem = problemFromResidualGap(gap, target, governing, exploratory, holdout);\n // The secondary fields. Each was once passed through unread, so `limits: 5` or\n // `assumptions: \"x\"` reached `runProbeSearch` and threw a raw TypeError there.\n return {\n ...problem,\n baseline: file.baseline === undefined ? undefined : assertExprNode(file.baseline, '\"baseline\"'),\n discrepancy: file.discrepancy === undefined ? problem.discrepancy : discrepancyFromJson(file.discrepancy),\n assumptions: file.assumptions === undefined ? gap.assumptions : textList(file.assumptions, 'assumptions'),\n limits: file.limits === undefined ? undefined : limitsFromJson(file.limits),\n claimedRegimes: file.claimedRegimes === undefined ? undefined : textRecord(file.claimedRegimes, 'claimedRegimes'),\n observationalBoundIds:\n file.observationalBoundIds === undefined ? undefined : textList(file.observationalBoundIds, 'observationalBoundIds'),\n };\n}\n\n/** A list of text, located by its field name. */\nfunction textList(raw: unknown, field: string): readonly string[] {\n const label = field.includes('.') ? field : `\"${field}\"`;\n if (!Array.isArray(raw)) throw new ProblemFileError(`${label} must be a list of text (found ${kindOf(raw)})`);\n return raw.map((v, i) => {\n if (typeof v !== 'string') throw new ProblemFileError(`${field}[${i}] must be text (found ${kindOf(v)})`);\n return v;\n });\n}\n\n/** A `{name: text}` object, located by its field name. */\nfunction textRecord(raw: unknown, field: string): Readonly<Record<string, string>> {\n if (!isPlainObject(raw)) throw new ProblemFileError(`\"${field}\" must be {name: text} (found ${kindOf(raw)})`);\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(raw)) {\n if (typeof v !== 'string') throw new ProblemFileError(`${field}.${k} must be text (found ${kindOf(v)})`);\n out[k] = v;\n }\n return out;\n}\n\nfunction discrepancyFromJson(raw: unknown): DiscrepancyDefinition {\n if (!isPlainObject(raw)) throw new ProblemFileError(`\"discrepancy\" must be {\"kind\": text, \"observableIds\": [text]} (found ${kindOf(raw)})`);\n if (typeof raw.kind !== 'string' || !DISCREPANCY_KINDS.has(raw.kind)) {\n throw new ProblemFileError(\n `discrepancy.kind '${String(raw.kind)}' is not a discrepancy kind (${[...DISCREPANCY_KINDS].join(', ')})`,\n );\n }\n const observableIds = textList(raw.observableIds, 'discrepancy.observableIds');\n for (const key of ['covarianceRef', 'implementationRef'] as const) {\n if (raw[key] !== undefined && typeof raw[key] !== 'string') {\n throw new ProblemFileError(`discrepancy.${key} must be text (found ${kindOf(raw[key])})`);\n }\n }\n return {\n kind: raw.kind as DiscrepancyDefinition['kind'],\n observableIds,\n ...(typeof raw.covarianceRef === 'string' ? { covarianceRef: raw.covarianceRef } : {}),\n ...(typeof raw.implementationRef === 'string' ? { implementationRef: raw.implementationRef } : {}),\n };\n}\n\nfunction limitsFromJson(raw: unknown): NonNullable<SearchProblem['limits']> {\n const shape = '{\"id\": text, \"regime\": {name: text}}';\n if (!Array.isArray(raw)) throw new ProblemFileError(`\"limits\" must be a list of ${shape} (found ${kindOf(raw)})`);\n return raw.map((l, i) => {\n if (!isPlainObject(l)) throw new ProblemFileError(`limits[${i}] must be ${shape} (found ${kindOf(l)})`);\n if (typeof l.id !== 'string' || l.id === '') throw new ProblemFileError(`limits[${i}].id must be text`);\n if (!isPlainObject(l.regime)) throw new ProblemFileError(`limits[${i}].regime must be {name: text} (found ${kindOf(l.regime)})`);\n const regime = textRecord(l.regime, `limits[${i}].regime`);\n if (l.description !== undefined && typeof l.description !== 'string') {\n throw new ProblemFileError(`limits[${i}].description must be text (found ${kindOf(l.description)})`);\n }\n return { id: l.id, regime, ...(typeof l.description === 'string' ? { description: l.description } : {}) };\n });\n}\n\n/** The scalar operators an `op` node may carry. */\nconst SCALAR_OPS: ReadonlySet<string> = new Set(['+', '-', '*', '/', '^']);\n/** The `TranscendentalFn` union as a runtime set. */\nconst TRANSCENDENTAL_FNS: ReadonlySet<string> = new Set(['exp', 'ln', 'log2', 'log10', 'sin', 'cos', 'tan', 'sinh', 'cosh', 'tanh']);\n/** A decimal literal, as the validator reads a numeric-literal symbol. */\nconst DECIMAL_LITERAL = /^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?$/;\nconst DIM_KEYS = ['L', 'M', 'T', 'I', 'Theta', 'N', 'J'] as const;\nconst SCALAR_KINDS = 'symbol, op, integral, derivative, dirac-delta, variational-derivative, transcendental, abs';\n\n/** `raw[field]` as a child node, or a refusal that names the field. */\nfunction child(raw: Record<string, unknown>, field: string, path: string, what: string): ExprNode {\n if (raw[field] === undefined) throw new ProblemFileError(`${path} ${what} node needs ${field === 'args' ? '' : 'an '}\"${field}\" node`);\n return assertExprNode(raw[field], `${path}#${field}`);\n}\n\n/**\n * Check that a JSON value has the shape of a scalar `ExprNode`, recursively:\n * a kind per node, the children each kind owns, a finite literal where a\n * symbol's name is a decimal literal, and the seven dimension exponents on a\n * symbol. A tensor kind is refused here: the probe evaluates scalars.\n * Refusals are {@link ProblemFileError}, located by `path`.\n */\nfunction assertExprNode(raw: unknown, path: string): ExprNode {\n if (!isPlainObject(raw) || !('kind' in raw)) {\n throw new ProblemFileError(`${path} is not an ExprNode JSON object (found ${kindOf(raw)})`);\n }\n const kind = raw.kind;\n if (typeof kind !== 'string' || kind.length === 0) {\n throw new ProblemFileError(`${path} has invalid kind (found ${kindOf(kind)})`);\n }\n switch (kind) {\n case 'symbol': {\n if (typeof raw.name !== 'string' || raw.name.length === 0) {\n throw new ProblemFileError(`${path} symbol node missing name (needs \"name\": text)`);\n }\n if (!isPlainObject(raw.dim)) throw new ProblemFileError(`${path} symbol node missing dim`);\n for (const k of DIM_KEYS) {\n if (!(k in raw.dim)) throw new ProblemFileError(`${path} symbol node dim needs the exponents ${DIM_KEYS.join(', ')}`);\n if (typeof raw.dim[k] !== 'number' || !Number.isFinite(raw.dim[k])) {\n throw new ProblemFileError(`${path} symbol node dim.${k} must be a finite number (found ${kindOf(raw.dim[k])})`);\n }\n }\n if (DECIMAL_LITERAL.test(raw.name) && !Number.isFinite(Number(raw.name))) {\n throw new ProblemFileError(`${path} literal '${raw.name}' is not a finite number`);\n }\n return raw as unknown as ExprNode;\n }\n case 'op': {\n if (typeof raw.op !== 'string' || !Array.isArray(raw.args)) {\n throw new ProblemFileError(`${path} op node needs \"op\" and an \"args\" list (op node missing op/args)`);\n }\n if (!SCALAR_OPS.has(raw.op)) throw new ProblemFileError(`${path} op node has op '${raw.op}', not one of + - * / ^`);\n raw.args.forEach((a, i) => assertExprNode(a, `${path}#args[${i}]`));\n return raw as unknown as ExprNode;\n }\n case 'integral': {\n child(raw, 'over', path, 'integral');\n child(raw, 'integrand', path, 'integral');\n for (const bound of ['lower', 'upper']) if (raw[bound] !== undefined) assertExprNode(raw[bound], `${path}#${bound}`);\n return raw as unknown as ExprNode;\n }\n case 'derivative':\n child(raw, 'of', path, 'derivative');\n child(raw, 'wrt', path, 'derivative');\n return raw as unknown as ExprNode;\n case 'dirac-delta':\n case 'abs':\n child(raw, 'arg', path, kind);\n return raw as unknown as ExprNode;\n case 'variational-derivative':\n for (const f of ['functional', 'field', 'over']) child(raw, f, path, kind);\n return raw as unknown as ExprNode;\n case 'transcendental': {\n if (typeof raw.fn !== 'string' || !TRANSCENDENTAL_FNS.has(raw.fn)) {\n throw new ProblemFileError(`${path} transcendental node has fn '${String(raw.fn)}', not one of ${[...TRANSCENDENTAL_FNS].join(', ')}`);\n }\n child(raw, 'arg', path, kind);\n return raw as unknown as ExprNode;\n }\n default:\n throw new ProblemFileError(`${path} has kind '${kind}', which is not a scalar expression node (${SCALAR_KINDS})`);\n }\n}\n\n/**\n * Load an ExprNode from a JSON file (`{expression}` wrapper or bare node). The node shape is\n * checked recursively; a file that is not an expression raises {@link ProblemFileError}. @internal\n */\nexport function parseExprJson(path: string): ExprNode {\n const raw: unknown = readJsonFile(path);\n if (isPlainObject(raw) && 'kind' in raw) return assertExprNode(raw, path);\n if (isPlainObject(raw) && 'expression' in raw && raw.expression) {\n return assertExprNode(raw.expression, path);\n }\n throw new ProblemFileError(`${path} is not an ExprNode JSON object`);\n}\n"]}
|
|
@@ -50,7 +50,7 @@ export function formatProbeReport(result) {
|
|
|
50
50
|
const mark = item.pareto ? '●' : '·';
|
|
51
51
|
const fit = result.fits[rec.id];
|
|
52
52
|
const fitBit = fit
|
|
53
|
-
? ` ĉ=${fit.prefactor.toPrecision(4)} RMSE_ex=${fit.exploratoryRmse.toPrecision(3)}` +
|
|
53
|
+
? ` ĉ=${fit.prefactor.toPrecision(4)}${fit.prefactorStderr !== null ? `±${fit.prefactorStderr.toPrecision(2)}` : ''} RMSE_ex=${fit.exploratoryRmse.toPrecision(3)}` +
|
|
54
54
|
(fit.holdoutRmse != null ? ` RMSE_ho=${fit.holdoutRmse.toPrecision(3)}` : '')
|
|
55
55
|
: '';
|
|
56
56
|
lines.push(` ${mark} ${rec.id} [${STATUS_LINE[rec.status]}] validity=${item.scores.validity.toFixed(2)} emp=${item.scores.empirical.toFixed(2)} parsimony=${item.scores.parsimony.toFixed(2)}${fitBit}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/composition/probe/report.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAIpD,MAAM,WAAW,GAAyC;IACxD,SAAS,EAAE,+BAA+B;IAC1C,oBAAoB,EAAE,kCAAkC;IACxD,iBAAiB,EAAE,mDAAmD;IACtE,mBAAmB,EAAE,iDAAiD;IACtE,wBAAwB,EAAE,2CAA2C;IACrE,wBAAwB,EAAE,oDAAoD;IAC9E,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,kBAAkB,EAAE,iEAAiE;IACrF,uBAAuB,EAAE,+CAA+C;CACzE,CAAC;AAEF,SAAS,WAAW,CAAC,MAA4B;IAC/C,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,iBAAiB,CAAC,MAAyB;IACzD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,6DAA6D,MAAM,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;IAClG,KAAK,CAAC,IAAI,CAAC,yFAAyF,CAAC,CAAC;IACtG,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,UAAU,CAAC,MAAM,kBAAkB,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAClG,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACvC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;IAC/E,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,GAAG;YAChB,CAAC,CAAC,OAAO,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/composition/probe/report.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Scientist-facing probe reports. Never prints a status stronger than the\n * stored candidate status. Novelty wording is always corpus-relative.\n *\n * @internal\n */\n\nimport { bodyExpression } from './fingerprint.js';\nimport { corpusRelativeWording } from './corpus.js';\nimport type { ProbeSearchResult } from './pipeline.js';\nimport type { FrontierGap, ProbeCandidateRecord, ProbeCandidateStatus } from './types.js';\n\nconst STATUS_LINE: Record<ProbeCandidateStatus, string> = {\n generated: 'generated (not yet validated)',\n 'structurally-valid': 'structurally valid (not yet fit)',\n 'empirically-fit': 'fit on exploratory data only (holdout not passed)',\n 'heldout-supported': 'supported on locked holdout (not yet falsified)',\n 'falsification-survivor': 'survived declared falsification batteries',\n 'expert-review-required': 'requires expert review — not a published discovery',\n rejected: 'rejected',\n falsified: 'falsified',\n 'equivalent-known': 'algebraically equivalent to a known corpus relation (not novel)',\n 'insufficient-evidence': 'insufficient evidence (no data or no holdout)',\n};\n\nfunction exprSummary(record: ProbeCandidateRecord): string {\n const expr = bodyExpression(record.body);\n try {\n return JSON.stringify(expr);\n } catch {\n return record.id;\n }\n}\n\n/** Format a Product B search result. @internal */\nexport function formatProbeReport(result: ProbeSearchResult): string {\n const lines: string[] = [];\n lines.push(`upt probe — experimental expression/residual search [run ${result.manifest.runId}]`);\n lines.push('⚠ Product B is experimental. `upt discover` remains the quantity-identification funnel.');\n lines.push(` stop: ${result.stopReason}`);\n lines.push(` candidates: ${result.candidates.length} · rejections: ${result.rejections.length}`);\n if (result.wording.length > 0) {\n lines.push('');\n for (const w of result.wording.slice(0, 8)) lines.push(` ${w}`);\n }\n lines.push('');\n if (result.ranked.length === 0) {\n lines.push(' no candidates to rank.');\n return lines.join('\\n');\n }\n lines.push(' ranked (Pareto front first; scores are not a discovery claim):');\n for (const item of result.ranked) {\n const rec = item.record;\n const mark = item.pareto ? '●' : '·';\n const fit = result.fits[rec.id];\n const fitBit = fit\n ? ` ĉ=${fit.prefactor.toPrecision(4)}${fit.prefactorStderr !== null ? `±${fit.prefactorStderr.toPrecision(2)}` : ''} RMSE_ex=${fit.exploratoryRmse.toPrecision(3)}` +\n (fit.holdoutRmse != null ? ` RMSE_ho=${fit.holdoutRmse.toPrecision(3)}` : '')\n : '';\n lines.push(\n ` ${mark} ${rec.id} [${STATUS_LINE[rec.status]}] validity=${item.scores.validity.toFixed(2)} emp=${item.scores.empirical.toFixed(2)} parsimony=${item.scores.parsimony.toFixed(2)}${fitBit}`,\n );\n const corp = result.corpus[rec.id];\n if (corp) lines.push(` ${corpusRelativeWording(corp)}`);\n for (const note of result.prefactorNotes[rec.id] ?? []) lines.push(` ${note}`);\n lines.push(` ${exprSummary(rec).slice(0, 180)}`);\n }\n return lines.join('\\n');\n}\n\n/** Format a frontier scan. @internal */\nexport function formatFrontierScan(gaps: readonly FrontierGap[]): string {\n const lines: string[] = [];\n lines.push('upt probe scan — typed frontier gaps');\n lines.push('⚠ relation-link / regime-transition gaps are Product A review surfaces (`upt discover`).');\n lines.push(` ${gaps.length} gap(s)\\n`);\n for (const g of gaps) {\n const search = g.searchability.searchable ? 'searchable' : 'not-searchable';\n lines.push(` ${g.id} [${g.kind} / ${search}]`);\n lines.push(` ${g.evidence.summary}`);\n if (!g.searchability.searchable) {\n lines.push(` → ${g.searchability.reasons.join('; ')}`);\n }\n }\n return lines.join('\\n');\n}\n\n/** Format a single gap. @internal */\nexport function formatFrontierGap(gap: FrontierGap): string {\n return [\n `upt probe show ${gap.id}`,\n ` kind: ${gap.kind}`,\n ` status: ${gap.status}`,\n ` searchable: ${gap.searchability.searchable} (${gap.searchability.reasons.join('; ')})`,\n ` identifiability: ${gap.identifiability.kind} ${gap.identifiability.parametric?.status ?? ''}`,\n ` ${gap.evidence.summary}`,\n ].join('\\n');\n}\n"]}
|
|
@@ -15,6 +15,11 @@ export declare class ResidualError extends Error {
|
|
|
15
15
|
* @internal
|
|
16
16
|
*/
|
|
17
17
|
export declare function scalarDiscrepancy(observed: number, predicted: number, kind: DiscrepancyKind, scale?: number): number;
|
|
18
|
-
/**
|
|
18
|
+
/**
|
|
19
|
+
* RMSE of a discrepancy over paired samples: core `norm2` of the discrepancies
|
|
20
|
+
* (the scaled, overflow-safe 2-norm) over √n. Empty or unequal-length samples
|
|
21
|
+
* are refused, as before; a non-finite sample still throws from
|
|
22
|
+
* {@link scalarDiscrepancy}. @internal
|
|
23
|
+
*/
|
|
19
24
|
export declare function rmse(observed: readonly number[], predicted: readonly number[], def: DiscrepancyDefinition, scale?: number): number;
|
|
20
25
|
//# sourceMappingURL=residual.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"residual.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/residual.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"residual.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/residual.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEzE,qBAAa,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,eAAe,EACrB,KAAK,SAAI,GACR,MAAM,CAyCR;AAED;;;;;GAKG;AACH,wBAAgB,IAAI,CAClB,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,GAAG,EAAE,qBAAqB,EAC1B,KAAK,SAAI,GACR,MAAM,CAMR"}
|