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
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* @module composition/probe/residual
|
|
6
6
|
*/
|
|
7
|
+
import { norm2 } from '@danielsimonjr/mathts-core';
|
|
7
8
|
export class ResidualError extends Error {
|
|
8
9
|
constructor(message) {
|
|
9
10
|
super(message);
|
|
@@ -57,16 +58,17 @@ export function scalarDiscrepancy(observed, predicted, kind, scale = 1) {
|
|
|
57
58
|
}
|
|
58
59
|
}
|
|
59
60
|
}
|
|
60
|
-
/**
|
|
61
|
+
/**
|
|
62
|
+
* RMSE of a discrepancy over paired samples: core `norm2` of the discrepancies
|
|
63
|
+
* (the scaled, overflow-safe 2-norm) over √n. Empty or unequal-length samples
|
|
64
|
+
* are refused, as before; a non-finite sample still throws from
|
|
65
|
+
* {@link scalarDiscrepancy}. @internal
|
|
66
|
+
*/
|
|
61
67
|
export function rmse(observed, predicted, def, scale = 1) {
|
|
62
68
|
if (observed.length !== predicted.length || observed.length === 0) {
|
|
63
69
|
throw new ResidualError('rmse: nonempty equal-length samples required');
|
|
64
70
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
const r = scalarDiscrepancy(observed[i], predicted[i], def.kind, scale);
|
|
68
|
-
acc += r * r;
|
|
69
|
-
}
|
|
70
|
-
return Math.sqrt(acc / observed.length);
|
|
71
|
+
const residuals = observed.map((o, i) => scalarDiscrepancy(o, predicted[i], def.kind, scale));
|
|
72
|
+
return norm2(residuals) / Math.sqrt(residuals.length);
|
|
71
73
|
}
|
|
72
74
|
//# sourceMappingURL=residual.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"residual.js","sourceRoot":"","sources":["../../../src/composition/probe/residual.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"residual.js","sourceRoot":"","sources":["../../../src/composition/probe/residual.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Explicit residual / discrepancy evaluation. Does not replace\n * `residualInSigma` on the confrontation spine.\n *\n * @module composition/probe/residual\n */\n\nimport { norm2 } from '@danielsimonjr/mathts-core';\nimport type { DiscrepancyDefinition, DiscrepancyKind } from './types.js';\n\nexport class ResidualError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ResidualError';\n }\n}\n\n/**\n * Scalar discrepancy. Covariance-standardized with a non-diagonal Σ is\n * unsupported and throws rather than silently using diagonal σ.\n *\n * @internal\n */\nexport function scalarDiscrepancy(\n observed: number,\n predicted: number,\n kind: DiscrepancyKind,\n scale = 1,\n): number {\n if (!Number.isFinite(observed) || !Number.isFinite(predicted)) {\n throw new ResidualError('scalarDiscrepancy: observed and predicted must be finite');\n }\n switch (kind) {\n case 'additive':\n return observed - predicted;\n case 'relative': {\n const s = scale !== 0 && Number.isFinite(scale) ? scale : Math.abs(predicted) || 1;\n return (observed - predicted) / s;\n }\n case 'log-ratio': {\n if (!(observed > 0 && predicted > 0)) {\n throw new ResidualError('log-ratio residual requires positive observed and predicted');\n }\n return Math.log(observed / predicted);\n }\n case 'standardized': {\n if (!(scale > 0 && Number.isFinite(scale))) {\n throw new ResidualError('standardized residual requires positive finite sigma');\n }\n return (observed - predicted) / scale;\n }\n case 'likelihood': {\n if (!(scale > 0)) throw new ResidualError('likelihood residual requires positive sigma');\n const z = (observed - predicted) / scale;\n return 0.5 * z * z + Math.log(scale * Math.sqrt(2 * Math.PI));\n }\n case 'vector':\n case 'tensor':\n case 'distributional':\n case 'operator':\n case 'custom':\n throw new ResidualError(\n `${kind} discrepancy is not implemented on the scalar path — abstain`,\n );\n default: {\n const _never: never = kind;\n return _never;\n }\n }\n}\n\n/**\n * RMSE of a discrepancy over paired samples: core `norm2` of the discrepancies\n * (the scaled, overflow-safe 2-norm) over √n. Empty or unequal-length samples\n * are refused, as before; a non-finite sample still throws from\n * {@link scalarDiscrepancy}. @internal\n */\nexport function rmse(\n observed: readonly number[],\n predicted: readonly number[],\n def: DiscrepancyDefinition,\n scale = 1,\n): number {\n if (observed.length !== predicted.length || observed.length === 0) {\n throw new ResidualError('rmse: nonempty equal-length samples required');\n }\n const residuals = observed.map((o, i) => scalarDiscrepancy(o, predicted[i]!, def.kind, scale));\n return norm2(residuals) / Math.sqrt(residuals.length);\n}\n"]}
|
|
@@ -1,51 +1,116 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Cheap structure probes: regime changepoint, scale symmetry,
|
|
2
|
+
* Cheap structure probes as TESTS: a regime changepoint, a scale symmetry, a
|
|
3
|
+
* conserved dQ/dt. Each verdict is scale-free: the same series scaled by 1e6
|
|
4
|
+
* or by 1e-6 gets the same answer, because every threshold is in units of
|
|
5
|
+
* the series' own scatter, never in the units of y.
|
|
3
6
|
*
|
|
4
7
|
* Task-0 style: recover a synthetic signal or honestly abstain. Never flips
|
|
5
8
|
* `axes.ts` `gated`.
|
|
6
9
|
*
|
|
7
10
|
* @internal
|
|
8
11
|
*/
|
|
12
|
+
/** A series sampled at `x` with values `y`, scanned for a step in its mean. @internal */
|
|
9
13
|
export interface ChangepointInput {
|
|
10
14
|
readonly x: readonly number[];
|
|
11
15
|
readonly y: readonly number[];
|
|
16
|
+
/** Significance level of the permutation test; default 0.01. */
|
|
17
|
+
readonly alpha?: number;
|
|
18
|
+
/** Permutation resamples of the null; default 999. */
|
|
19
|
+
readonly resamples?: number;
|
|
20
|
+
/** Seed of the permutation null (MathTS `permutationTest`); default 20261015, never the clock. */
|
|
21
|
+
readonly seed?: number;
|
|
12
22
|
}
|
|
23
|
+
/** The best split of {@link detectMeanChangepoint}, its tests, or an abstention with its reason. @internal */
|
|
13
24
|
export interface ChangepointResult {
|
|
25
|
+
/** The split index (the right segment starts here) when the step is significant; null otherwise. */
|
|
14
26
|
readonly index: number | null;
|
|
27
|
+
/** |Welch t| at the best split: the step in units of its own standard error (scale-free). */
|
|
15
28
|
readonly score: number;
|
|
29
|
+
/** μ_right − μ_left at the best split, in the units of y; null when nothing was scanned. */
|
|
30
|
+
readonly meanDifference: number | null;
|
|
31
|
+
/** MathTS `studentTTest` at the best split: the Welch t and its degrees of freedom. */
|
|
32
|
+
readonly tStatistic: number | null;
|
|
33
|
+
readonly degreesOfFreedom: number | null;
|
|
34
|
+
/**
|
|
35
|
+
* The direct two-sided Welch p at the best split (one split, as if chosen in advance; not
|
|
36
|
+
* corrected for the scan over splits, which is what `pPermutation` is for).
|
|
37
|
+
*/
|
|
38
|
+
readonly pWelch: number | null;
|
|
39
|
+
/** P(max over splits of |t| ≥ observed) under a seeded permutation of the series. */
|
|
40
|
+
readonly pPermutation: number | null;
|
|
16
41
|
readonly abstained: boolean;
|
|
17
42
|
readonly reason?: string;
|
|
18
43
|
}
|
|
19
44
|
/**
|
|
20
|
-
* Two-mean changepoint
|
|
21
|
-
*
|
|
45
|
+
* Two-mean changepoint as a test. The best split maximises Welch's t over
|
|
46
|
+
* the splits that leave at least two samples on each side; MathTS
|
|
47
|
+
* `studentTTest` gives the t, the degrees of freedom and the direct p at that
|
|
48
|
+
* split. Because the split was CHOSEN by the scan, that p is not the test:
|
|
49
|
+
* the verdict is the seeded permutation null (MathTS `permutationTest`) of
|
|
50
|
+
* the maximum over splits, flagged when `pPermutation < alpha` (default
|
|
51
|
+
* 0.01). Every quantity is in units of the series' scatter, so a series and
|
|
52
|
+
* its copy scaled by any factor get one verdict. Abstains below six samples.
|
|
22
53
|
*
|
|
23
54
|
* @internal
|
|
24
55
|
*/
|
|
25
|
-
export declare function detectMeanChangepoint(input: ChangepointInput
|
|
56
|
+
export declare function detectMeanChangepoint(input: ChangepointInput): ChangepointResult;
|
|
57
|
+
/** Positive samples `(x, y)` whose log-log slope is the scale exponent. @internal */
|
|
26
58
|
export interface ScaleSymmetryInput {
|
|
27
59
|
readonly x: readonly number[];
|
|
28
60
|
readonly y: readonly number[];
|
|
29
61
|
}
|
|
62
|
+
/** The log-log slope with its standard error and the direct two-sided p of slope = 0. @internal */
|
|
63
|
+
export interface ScaleExponentResult {
|
|
64
|
+
readonly exponent: number | null;
|
|
65
|
+
/** Standard error of the slope (MathTS `linearRegression.stdErr`). */
|
|
66
|
+
readonly stdErr: number | null;
|
|
67
|
+
/** P(|T_{n−2}| ≥ |exponent/stdErr|), the direct tail ({@link studentTwoSidedP}); null below n = 3. */
|
|
68
|
+
readonly pValue: number | null;
|
|
69
|
+
/** The positive pairs the fit used. */
|
|
70
|
+
readonly n: number;
|
|
71
|
+
readonly abstained: boolean;
|
|
72
|
+
readonly reason?: string;
|
|
73
|
+
}
|
|
30
74
|
/**
|
|
31
|
-
* Ordinary-least-squares log-log slope
|
|
75
|
+
* Ordinary-least-squares log-log slope, MathTS `linearRegression` on the
|
|
76
|
+
* logs, with its standard error. The p-value is NOT the one MathTS reports
|
|
77
|
+
* (`2·(1 − CDF)`, which rounds a far tail to 0): it is the direct t tail from
|
|
78
|
+
* `betainc`. Abstains if x or y are non-positive, or when the log-x spread
|
|
79
|
+
* (core `sumSquaredDeviations`, times n: the normal-equation denominator)
|
|
80
|
+
* is degenerate.
|
|
32
81
|
*
|
|
33
82
|
* @internal
|
|
34
83
|
*/
|
|
35
|
-
export declare function estimateScaleExponent(input: ScaleSymmetryInput):
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
84
|
+
export declare function estimateScaleExponent(input: ScaleSymmetryInput): ScaleExponentResult;
|
|
85
|
+
/** The verdict of {@link probeConservation}: no drift in q beyond k standard errors of its slope. @internal */
|
|
86
|
+
export interface ConservationResult {
|
|
87
|
+
readonly conserved: boolean;
|
|
88
|
+
/** Mean |dq/dt| from MathTS `gradient` (second-order central differences inside, one-sided at the ends). */
|
|
89
|
+
readonly meanAbsRate: number;
|
|
90
|
+
/** The slope of MathTS `linearRegression(t, q)` and its standard error. */
|
|
91
|
+
readonly slope: number | null;
|
|
92
|
+
readonly stdErr: number | null;
|
|
93
|
+
/** The multiple of the standard error a drift must exceed to count. */
|
|
94
|
+
readonly k: number;
|
|
95
|
+
readonly abstained: boolean;
|
|
96
|
+
readonly reason?: string;
|
|
97
|
+
}
|
|
40
98
|
/**
|
|
41
|
-
*
|
|
99
|
+
* Conservation probe as a test: q is conserved when the linear drift
|
|
100
|
+
* `slope` of `linearRegression(t, q)` satisfies |slope| ≤ k·stdErr. The
|
|
101
|
+
* standard error comes from the residual scatter of the same series, so the
|
|
102
|
+
* verdict is scale-free. k = 3 by default: a drift within three standard
|
|
103
|
+
* errors is not distinguishable from none at the series' own noise (a
|
|
104
|
+
* two-sided 0.27% under Gaussian residuals), the usual working threshold
|
|
105
|
+
* for "no effect seen". The test sees a linear drift only; a quantity that
|
|
106
|
+
* oscillates without drifting passes. The mean |dq/dt| is reported beside
|
|
107
|
+
* the verdict from MathTS `gradient` (second order inside the series), not
|
|
108
|
+
* from first-order forward differences, and never decides it. Abstains below
|
|
109
|
+
* three samples or when t is not strictly increasing.
|
|
42
110
|
*
|
|
43
111
|
* @internal
|
|
44
112
|
*/
|
|
45
|
-
export declare function probeConservation(q: readonly number[], t: readonly number[],
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
abstained: boolean;
|
|
49
|
-
reason?: string;
|
|
50
|
-
};
|
|
113
|
+
export declare function probeConservation(q: readonly number[], t: readonly number[], opts?: {
|
|
114
|
+
readonly k?: number;
|
|
115
|
+
}): ConservationResult;
|
|
51
116
|
//# sourceMappingURL=structure.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structure.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/structure.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"structure.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/structure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,yFAAyF;AACzF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,QAAQ,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,gEAAgE;IAChE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,sDAAsD;IACtD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,kGAAkG;IAClG,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,8GAA8G;AAC9G,MAAM,WAAW,iBAAiB;IAChC,oGAAoG;IACpG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,6FAA6F;IAC7F,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,4FAA4F;IAC5F,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,uFAAuF;IACvF,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,qFAAqF;IACrF,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AA2CD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CAuChF;AAED,qFAAqF;AACrF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,QAAQ,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B;AAED,mGAAmG;AACnG,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,sGAAsG;IACtG,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,uCAAuC;IACvC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,kBAAkB,GAAG,mBAAmB,CAgBpF;AAED,+GAA+G;AAC/G,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,4GAA4G;IAC5G,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,uEAAuE;IACvE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,SAAS,MAAM,EAAE,EACpB,CAAC,EAAE,SAAS,MAAM,EAAE,EACpB,IAAI,GAAE;IAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAA;CAAO,GACjC,kBAAkB,CAkBpB"}
|
|
@@ -1,42 +1,115 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Cheap structure probes: regime changepoint, scale symmetry,
|
|
2
|
+
* Cheap structure probes as TESTS: a regime changepoint, a scale symmetry, a
|
|
3
|
+
* conserved dQ/dt. Each verdict is scale-free: the same series scaled by 1e6
|
|
4
|
+
* or by 1e-6 gets the same answer, because every threshold is in units of
|
|
5
|
+
* the series' own scatter, never in the units of y.
|
|
3
6
|
*
|
|
4
7
|
* Task-0 style: recover a synthetic signal or honestly abstain. Never flips
|
|
5
8
|
* `axes.ts` `gated`.
|
|
6
9
|
*
|
|
7
10
|
* @internal
|
|
8
11
|
*/
|
|
12
|
+
import { pairwiseSum, sumSquaredDeviations } from '@danielsimonjr/mathts-core';
|
|
13
|
+
import { gradient, linearRegression, permutationTest, studentTTest } from '@danielsimonjr/mathts-functions';
|
|
14
|
+
import { meanOf } from '../../numerical/statistics.js';
|
|
15
|
+
import { studentTwoSidedP } from './t-tail.js';
|
|
16
|
+
/** The smallest segment a split may leave on either side. */
|
|
17
|
+
const MIN_SEGMENT = 2;
|
|
9
18
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
19
|
+
* |Welch t| at every admissible split of a series, from centred prefix sums:
|
|
20
|
+
* O(n) for the scan the permutation null repeats. Two segments with no
|
|
21
|
+
* scatter and different means give +Infinity; equal means give 0.
|
|
22
|
+
*/
|
|
23
|
+
function welchScan(y) {
|
|
24
|
+
const n = y.length;
|
|
25
|
+
const mean = meanOf(y);
|
|
26
|
+
const c = y.map((v) => v - mean);
|
|
27
|
+
const s1 = new Float64Array(n + 1);
|
|
28
|
+
const s2 = new Float64Array(n + 1);
|
|
29
|
+
for (let i = 0; i < n; i++) {
|
|
30
|
+
s1[i + 1] = s1[i] + c[i];
|
|
31
|
+
s2[i + 1] = s2[i] + c[i] * c[i];
|
|
32
|
+
}
|
|
33
|
+
let best = -1;
|
|
34
|
+
let bestIdx = MIN_SEGMENT;
|
|
35
|
+
for (let i = MIN_SEGMENT; i <= n - MIN_SEGMENT; i++) {
|
|
36
|
+
const nL = i;
|
|
37
|
+
const nR = n - i;
|
|
38
|
+
const mL = s1[i] / nL;
|
|
39
|
+
const mR = (s1[n] - s1[i]) / nR;
|
|
40
|
+
const vL = Math.max(0, s2[i] - nL * mL * mL) / (nL - 1);
|
|
41
|
+
const vR = Math.max(0, s2[n] - s2[i] - nR * mR * mR) / (nR - 1);
|
|
42
|
+
const se = Math.sqrt(vL / nL + vR / nR);
|
|
43
|
+
const d = Math.abs(mL - mR);
|
|
44
|
+
const t = se > 0 ? d / se : d > 0 ? Number.POSITIVE_INFINITY : 0;
|
|
45
|
+
if (t > best) {
|
|
46
|
+
best = t;
|
|
47
|
+
bestIdx = i;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return { best, bestIdx };
|
|
51
|
+
}
|
|
52
|
+
/** The max-|t| statistic of a permuted series, in the two-sample form `permutationTest` shuffles. */
|
|
53
|
+
const maxWelch = (a, b) => welchScan([...a, ...b]).best;
|
|
54
|
+
/**
|
|
55
|
+
* Two-mean changepoint as a test. The best split maximises Welch's t over
|
|
56
|
+
* the splits that leave at least two samples on each side; MathTS
|
|
57
|
+
* `studentTTest` gives the t, the degrees of freedom and the direct p at that
|
|
58
|
+
* split. Because the split was CHOSEN by the scan, that p is not the test:
|
|
59
|
+
* the verdict is the seeded permutation null (MathTS `permutationTest`) of
|
|
60
|
+
* the maximum over splits, flagged when `pPermutation < alpha` (default
|
|
61
|
+
* 0.01). Every quantity is in units of the series' scatter, so a series and
|
|
62
|
+
* its copy scaled by any factor get one verdict. Abstains below six samples.
|
|
12
63
|
*
|
|
13
64
|
* @internal
|
|
14
65
|
*/
|
|
15
|
-
export function detectMeanChangepoint(input
|
|
66
|
+
export function detectMeanChangepoint(input) {
|
|
16
67
|
const { x, y } = input;
|
|
68
|
+
const alpha = input.alpha ?? 0.01;
|
|
69
|
+
const resamples = input.resamples ?? 999;
|
|
70
|
+
const seed = input.seed ?? 20261015;
|
|
71
|
+
const none = { meanDifference: null, tStatistic: null, degreesOfFreedom: null, pWelch: null, pPermutation: null };
|
|
17
72
|
if (x.length !== y.length || x.length < 6) {
|
|
18
|
-
return { index: null, score: 0, abstained: true, reason: 'series too short' };
|
|
73
|
+
return { index: null, score: 0, ...none, abstained: true, reason: 'series too short' };
|
|
19
74
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
for (let i = 2; i < y.length - 2; i++) {
|
|
23
|
-
const left = y.slice(0, i);
|
|
24
|
-
const right = y.slice(i);
|
|
25
|
-
const μL = left.reduce((a, b) => a + b, 0) / left.length;
|
|
26
|
-
const μR = right.reduce((a, b) => a + b, 0) / right.length;
|
|
27
|
-
const score = Math.abs(μL - μR);
|
|
28
|
-
if (score > best) {
|
|
29
|
-
best = score;
|
|
30
|
-
bestIdx = i;
|
|
31
|
-
}
|
|
75
|
+
if (!y.every(Number.isFinite)) {
|
|
76
|
+
return { index: null, score: 0, ...none, abstained: true, reason: 'series has a non-finite value' };
|
|
32
77
|
}
|
|
33
|
-
|
|
34
|
-
|
|
78
|
+
const { best, bestIdx } = welchScan(y);
|
|
79
|
+
const left = y.slice(0, bestIdx);
|
|
80
|
+
const right = y.slice(bestIdx);
|
|
81
|
+
const welch = studentTTest([...left], [...right]);
|
|
82
|
+
const num = (v) => (typeof v === 'number' && !Number.isNaN(v) ? v : null);
|
|
83
|
+
const perm = permutationTest([...left], [...right], maxWelch, { resamples, seed });
|
|
84
|
+
const pPermutation = num(perm.pValue);
|
|
85
|
+
if (pPermutation === null) {
|
|
86
|
+
return { index: null, score: best, ...none, abstained: true, reason: 'the permutation null did not return a p-value' };
|
|
35
87
|
}
|
|
36
|
-
|
|
88
|
+
const tests = {
|
|
89
|
+
meanDifference: meanOf(right) - meanOf(left),
|
|
90
|
+
tStatistic: num(welch.statistic),
|
|
91
|
+
degreesOfFreedom: num(welch.degreesOfFreedom),
|
|
92
|
+
pWelch: num(welch.pValue),
|
|
93
|
+
pPermutation,
|
|
94
|
+
};
|
|
95
|
+
if (pPermutation >= alpha) {
|
|
96
|
+
return {
|
|
97
|
+
index: null,
|
|
98
|
+
score: best,
|
|
99
|
+
...tests,
|
|
100
|
+
abstained: true,
|
|
101
|
+
reason: `no changepoint: permutation p = ${pPermutation.toPrecision(3)} ≥ α = ${alpha} for the maximum |Welch t| = ${best.toPrecision(3)} over ${y.length - 2 * MIN_SEGMENT + 1} splits`,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
return { index: bestIdx, score: best, ...tests, abstained: false };
|
|
37
105
|
}
|
|
38
106
|
/**
|
|
39
|
-
* Ordinary-least-squares log-log slope
|
|
107
|
+
* Ordinary-least-squares log-log slope, MathTS `linearRegression` on the
|
|
108
|
+
* logs, with its standard error. The p-value is NOT the one MathTS reports
|
|
109
|
+
* (`2·(1 − CDF)`, which rounds a far tail to 0): it is the direct t tail from
|
|
110
|
+
* `betainc`. Abstains if x or y are non-positive, or when the log-x spread
|
|
111
|
+
* (core `sumSquaredDeviations`, times n: the normal-equation denominator)
|
|
112
|
+
* is degenerate.
|
|
40
113
|
*
|
|
41
114
|
* @internal
|
|
42
115
|
*/
|
|
@@ -45,49 +118,50 @@ export function estimateScaleExponent(input) {
|
|
|
45
118
|
.map((x, i) => [x, input.y[i]])
|
|
46
119
|
.filter(([x, y]) => x > 0 && y > 0);
|
|
47
120
|
if (pairs.length < 3) {
|
|
48
|
-
return { exponent: null, abstained: true, reason: 'need ≥3 positive (x,y) pairs' };
|
|
49
|
-
}
|
|
50
|
-
const n = pairs.length;
|
|
51
|
-
let sX = 0;
|
|
52
|
-
let sY = 0;
|
|
53
|
-
let sXX = 0;
|
|
54
|
-
let sXY = 0;
|
|
55
|
-
for (const [x, y] of pairs) {
|
|
56
|
-
const lx = Math.log(x);
|
|
57
|
-
const ly = Math.log(y);
|
|
58
|
-
sX += lx;
|
|
59
|
-
sY += ly;
|
|
60
|
-
sXX += lx * lx;
|
|
61
|
-
sXY += lx * ly;
|
|
121
|
+
return { exponent: null, stdErr: null, pValue: null, n: pairs.length, abstained: true, reason: 'need ≥3 positive (x,y) pairs' };
|
|
62
122
|
}
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
123
|
+
const lx = pairs.map(([x]) => Math.log(x));
|
|
124
|
+
const ly = pairs.map(([, y]) => Math.log(y));
|
|
125
|
+
if (pairs.length * sumSquaredDeviations(lx) < 1e-18) {
|
|
126
|
+
return { exponent: null, stdErr: null, pValue: null, n: pairs.length, abstained: true, reason: 'degenerate log-x variance' };
|
|
66
127
|
}
|
|
67
|
-
|
|
128
|
+
const fit = linearRegression(lx, ly);
|
|
129
|
+
const df = pairs.length - 2;
|
|
130
|
+
const pValue = fit.stdErr > 0 ? studentTwoSidedP(fit.slope / fit.stdErr, df) : fit.slope === 0 ? 1 : 0;
|
|
131
|
+
return { exponent: fit.slope, stdErr: fit.stdErr, pValue, n: pairs.length, abstained: false };
|
|
68
132
|
}
|
|
69
133
|
/**
|
|
70
|
-
*
|
|
134
|
+
* Conservation probe as a test: q is conserved when the linear drift
|
|
135
|
+
* `slope` of `linearRegression(t, q)` satisfies |slope| ≤ k·stdErr. The
|
|
136
|
+
* standard error comes from the residual scatter of the same series, so the
|
|
137
|
+
* verdict is scale-free. k = 3 by default: a drift within three standard
|
|
138
|
+
* errors is not distinguishable from none at the series' own noise (a
|
|
139
|
+
* two-sided 0.27% under Gaussian residuals), the usual working threshold
|
|
140
|
+
* for "no effect seen". The test sees a linear drift only; a quantity that
|
|
141
|
+
* oscillates without drifting passes. The mean |dq/dt| is reported beside
|
|
142
|
+
* the verdict from MathTS `gradient` (second order inside the series), not
|
|
143
|
+
* from first-order forward differences, and never decides it. Abstains below
|
|
144
|
+
* three samples or when t is not strictly increasing.
|
|
71
145
|
*
|
|
72
146
|
* @internal
|
|
73
147
|
*/
|
|
74
|
-
export function probeConservation(q, t,
|
|
75
|
-
|
|
76
|
-
|
|
148
|
+
export function probeConservation(q, t, opts = {}) {
|
|
149
|
+
const k = opts.k ?? 3;
|
|
150
|
+
const none = { slope: null, stdErr: null, k };
|
|
151
|
+
if (q.length !== t.length || q.length < 3) {
|
|
152
|
+
return { conserved: false, meanAbsRate: NaN, ...none, abstained: true, reason: 'need ≥3 samples' };
|
|
77
153
|
}
|
|
78
|
-
let
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
if (dt === 0)
|
|
83
|
-
continue;
|
|
84
|
-
acc += Math.abs((q[i] - q[i - 1]) / dt);
|
|
85
|
-
n += 1;
|
|
154
|
+
for (let i = 1; i < t.length; i++) {
|
|
155
|
+
if (!(t[i] > t[i - 1])) {
|
|
156
|
+
return { conserved: false, meanAbsRate: NaN, ...none, abstained: true, reason: 'zero or negative Δt: t must increase strictly' };
|
|
157
|
+
}
|
|
86
158
|
}
|
|
87
|
-
|
|
88
|
-
|
|
159
|
+
const rate = gradient([...q], [...t]);
|
|
160
|
+
const meanAbsRate = pairwiseSum(rate.map(Math.abs)) / rate.length;
|
|
161
|
+
const fit = linearRegression([...t], [...q]);
|
|
162
|
+
if (!Number.isFinite(fit.slope) || !Number.isFinite(fit.stdErr)) {
|
|
163
|
+
return { conserved: false, meanAbsRate, ...none, abstained: true, reason: 'the drift fit is not finite' };
|
|
89
164
|
}
|
|
90
|
-
|
|
91
|
-
return { conserved: meanAbsRate <= atol, meanAbsRate, abstained: false };
|
|
165
|
+
return { conserved: Math.abs(fit.slope) <= k * fit.stdErr, meanAbsRate, slope: fit.slope, stdErr: fit.stdErr, k, abstained: false };
|
|
92
166
|
}
|
|
93
167
|
//# sourceMappingURL=structure.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structure.js","sourceRoot":"","sources":["../../../src/composition/probe/structure.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Cheap structure probes: regime changepoint, scale symmetry, conserved dQ/dt.\n *\n * Task-0 style: recover a synthetic signal or honestly abstain. Never flips\n * `axes.ts` `gated`.\n *\n * @internal\n */\n\nexport interface ChangepointInput {\n readonly x: readonly number[];\n readonly y: readonly number[];\n}\n\nexport interface ChangepointResult {\n readonly index: number | null;\n readonly score: number;\n readonly abstained: boolean;\n readonly reason?: string;\n}\n\n/**\n * Two-mean changepoint: scan split index maximizing |μ_left − μ_right|.\n * Abstains on short series or when the best split is weaker than `minScore`.\n *\n * @internal\n */\nexport function detectMeanChangepoint(\n input: ChangepointInput,\n minScore = 0.5,\n): ChangepointResult {\n const { x, y } = input;\n if (x.length !== y.length || x.length < 6) {\n return { index: null, score: 0, abstained: true, reason: 'series too short' };\n }\n let bestIdx = 1;\n let best = 0;\n for (let i = 2; i < y.length - 2; i++) {\n const left = y.slice(0, i);\n const right = y.slice(i);\n const μL = left.reduce((a, b) => a + b, 0) / left.length;\n const μR = right.reduce((a, b) => a + b, 0) / right.length;\n const score = Math.abs(μL - μR);\n if (score > best) {\n best = score;\n bestIdx = i;\n }\n }\n if (best < minScore) {\n return { index: null, score: best, abstained: true, reason: 'no changepoint above threshold' };\n }\n return { index: bestIdx, score: best, abstained: false };\n}\n\nexport interface ScaleSymmetryInput {\n readonly x: readonly number[];\n readonly y: readonly number[];\n}\n\n/**\n * Ordinary-least-squares log-log slope. Abstains if x or y are non-positive.\n *\n * @internal\n */\nexport function estimateScaleExponent(input: ScaleSymmetryInput): {\n exponent: number | null;\n abstained: boolean;\n reason?: string;\n} {\n const pairs = input.x\n .map((x, i) => [x, input.y[i]!] as const)\n .filter(([x, y]) => x > 0 && y > 0);\n if (pairs.length < 3) {\n return { exponent: null, abstained: true, reason: 'need ≥3 positive (x,y) pairs' };\n }\n const n = pairs.length;\n let sX = 0;\n let sY = 0;\n let sXX = 0;\n let sXY = 0;\n for (const [x, y] of pairs) {\n const lx = Math.log(x);\n const ly = Math.log(y);\n sX += lx;\n sY += ly;\n sXX += lx * lx;\n sXY += lx * ly;\n }\n const denom = n * sXX - sX * sX;\n if (Math.abs(denom) < 1e-18) {\n return { exponent: null, abstained: true, reason: 'degenerate log-x variance' };\n }\n return { exponent: (n * sXY - sX * sY) / denom, abstained: false };\n}\n\n/**\n * Finite-difference conservation probe: mean |ΔQ/Δt| ≈ 0.\n *\n * @internal\n */\nexport function probeConservation(\n q: readonly number[],\n t: readonly number[],\n atol = 1e-6,\n): { conserved: boolean; meanAbsRate: number; abstained: boolean; reason?: string } {\n if (q.length !== t.length || q.length < 2) {\n return { conserved: false, meanAbsRate: NaN, abstained: true, reason: 'need ≥2 samples' };\n }\n let acc = 0;\n let n = 0;\n for (let i = 1; i < q.length; i++) {\n const dt = t[i]! - t[i - 1]!;\n if (dt === 0) continue;\n acc += Math.abs((q[i]! - q[i - 1]!) / dt);\n n += 1;\n }\n if (n === 0) {\n return { conserved: false, meanAbsRate: NaN, abstained: true, reason: 'zero Δt' };\n }\n const meanAbsRate = acc / n;\n return { conserved: meanAbsRate <= atol, meanAbsRate, abstained: false };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"structure.js","sourceRoot":"","sources":["../../../src/composition/probe/structure.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Cheap structure probes as TESTS: a regime changepoint, a scale symmetry, a\n * conserved dQ/dt. Each verdict is scale-free: the same series scaled by 1e6\n * or by 1e-6 gets the same answer, because every threshold is in units of\n * the series' own scatter, never in the units of y.\n *\n * Task-0 style: recover a synthetic signal or honestly abstain. Never flips\n * `axes.ts` `gated`.\n *\n * @internal\n */\n\nimport { pairwiseSum, sumSquaredDeviations } from '@danielsimonjr/mathts-core';\nimport { gradient, linearRegression, permutationTest, studentTTest } from '@danielsimonjr/mathts-functions';\nimport { meanOf } from '../../numerical/statistics.js';\nimport { studentTwoSidedP } from './t-tail.js';\n\n/** A series sampled at `x` with values `y`, scanned for a step in its mean. @internal */\nexport interface ChangepointInput {\n readonly x: readonly number[];\n readonly y: readonly number[];\n /** Significance level of the permutation test; default 0.01. */\n readonly alpha?: number;\n /** Permutation resamples of the null; default 999. */\n readonly resamples?: number;\n /** Seed of the permutation null (MathTS `permutationTest`); default 20261015, never the clock. */\n readonly seed?: number;\n}\n\n/** The best split of {@link detectMeanChangepoint}, its tests, or an abstention with its reason. @internal */\nexport interface ChangepointResult {\n /** The split index (the right segment starts here) when the step is significant; null otherwise. */\n readonly index: number | null;\n /** |Welch t| at the best split: the step in units of its own standard error (scale-free). */\n readonly score: number;\n /** μ_right − μ_left at the best split, in the units of y; null when nothing was scanned. */\n readonly meanDifference: number | null;\n /** MathTS `studentTTest` at the best split: the Welch t and its degrees of freedom. */\n readonly tStatistic: number | null;\n readonly degreesOfFreedom: number | null;\n /**\n * The direct two-sided Welch p at the best split (one split, as if chosen in advance; not\n * corrected for the scan over splits, which is what `pPermutation` is for).\n */\n readonly pWelch: number | null;\n /** P(max over splits of |t| ≥ observed) under a seeded permutation of the series. */\n readonly pPermutation: number | null;\n readonly abstained: boolean;\n readonly reason?: string;\n}\n\n/** The smallest segment a split may leave on either side. */\nconst MIN_SEGMENT = 2;\n\n/**\n * |Welch t| at every admissible split of a series, from centred prefix sums:\n * O(n) for the scan the permutation null repeats. Two segments with no\n * scatter and different means give +Infinity; equal means give 0.\n */\nfunction welchScan(y: readonly number[]): { best: number; bestIdx: number } {\n const n = y.length;\n const mean = meanOf(y);\n const c = y.map((v) => v - mean);\n const s1 = new Float64Array(n + 1);\n const s2 = new Float64Array(n + 1);\n for (let i = 0; i < n; i++) {\n s1[i + 1] = s1[i]! + c[i]!;\n s2[i + 1] = s2[i]! + c[i]! * c[i]!;\n }\n let best = -1;\n let bestIdx = MIN_SEGMENT;\n for (let i = MIN_SEGMENT; i <= n - MIN_SEGMENT; i++) {\n const nL = i;\n const nR = n - i;\n const mL = s1[i]! / nL;\n const mR = (s1[n]! - s1[i]!) / nR;\n const vL = Math.max(0, s2[i]! - nL * mL * mL) / (nL - 1);\n const vR = Math.max(0, s2[n]! - s2[i]! - nR * mR * mR) / (nR - 1);\n const se = Math.sqrt(vL / nL + vR / nR);\n const d = Math.abs(mL - mR);\n const t = se > 0 ? d / se : d > 0 ? Number.POSITIVE_INFINITY : 0;\n if (t > best) {\n best = t;\n bestIdx = i;\n }\n }\n return { best, bestIdx };\n}\n\n/** The max-|t| statistic of a permuted series, in the two-sample form `permutationTest` shuffles. */\nconst maxWelch = (a: number[], b: number[]): number => welchScan([...a, ...b]).best;\n\n/**\n * Two-mean changepoint as a test. The best split maximises Welch's t over\n * the splits that leave at least two samples on each side; MathTS\n * `studentTTest` gives the t, the degrees of freedom and the direct p at that\n * split. Because the split was CHOSEN by the scan, that p is not the test:\n * the verdict is the seeded permutation null (MathTS `permutationTest`) of\n * the maximum over splits, flagged when `pPermutation < alpha` (default\n * 0.01). Every quantity is in units of the series' scatter, so a series and\n * its copy scaled by any factor get one verdict. Abstains below six samples.\n *\n * @internal\n */\nexport function detectMeanChangepoint(input: ChangepointInput): ChangepointResult {\n const { x, y } = input;\n const alpha = input.alpha ?? 0.01;\n const resamples = input.resamples ?? 999;\n const seed = input.seed ?? 20261015;\n const none = { meanDifference: null, tStatistic: null, degreesOfFreedom: null, pWelch: null, pPermutation: null };\n if (x.length !== y.length || x.length < 6) {\n return { index: null, score: 0, ...none, abstained: true, reason: 'series too short' };\n }\n if (!y.every(Number.isFinite)) {\n return { index: null, score: 0, ...none, abstained: true, reason: 'series has a non-finite value' };\n }\n const { best, bestIdx } = welchScan(y);\n const left = y.slice(0, bestIdx);\n const right = y.slice(bestIdx);\n const welch = studentTTest([...left], [...right]);\n const num = (v: unknown): number | null => (typeof v === 'number' && !Number.isNaN(v) ? v : null);\n const perm = permutationTest([...left], [...right], maxWelch, { resamples, seed });\n const pPermutation = num(perm.pValue);\n if (pPermutation === null) {\n return { index: null, score: best, ...none, abstained: true, reason: 'the permutation null did not return a p-value' };\n }\n const tests = {\n meanDifference: meanOf(right) - meanOf(left),\n tStatistic: num(welch.statistic),\n degreesOfFreedom: num(welch.degreesOfFreedom),\n pWelch: num(welch.pValue),\n pPermutation,\n };\n if (pPermutation >= alpha) {\n return {\n index: null,\n score: best,\n ...tests,\n abstained: true,\n reason: `no changepoint: permutation p = ${pPermutation.toPrecision(3)} ≥ α = ${alpha} for the maximum |Welch t| = ${best.toPrecision(3)} over ${y.length - 2 * MIN_SEGMENT + 1} splits`,\n };\n }\n return { index: bestIdx, score: best, ...tests, abstained: false };\n}\n\n/** Positive samples `(x, y)` whose log-log slope is the scale exponent. @internal */\nexport interface ScaleSymmetryInput {\n readonly x: readonly number[];\n readonly y: readonly number[];\n}\n\n/** The log-log slope with its standard error and the direct two-sided p of slope = 0. @internal */\nexport interface ScaleExponentResult {\n readonly exponent: number | null;\n /** Standard error of the slope (MathTS `linearRegression.stdErr`). */\n readonly stdErr: number | null;\n /** P(|T_{n−2}| ≥ |exponent/stdErr|), the direct tail ({@link studentTwoSidedP}); null below n = 3. */\n readonly pValue: number | null;\n /** The positive pairs the fit used. */\n readonly n: number;\n readonly abstained: boolean;\n readonly reason?: string;\n}\n\n/**\n * Ordinary-least-squares log-log slope, MathTS `linearRegression` on the\n * logs, with its standard error. The p-value is NOT the one MathTS reports\n * (`2·(1 − CDF)`, which rounds a far tail to 0): it is the direct t tail from\n * `betainc`. Abstains if x or y are non-positive, or when the log-x spread\n * (core `sumSquaredDeviations`, times n: the normal-equation denominator)\n * is degenerate.\n *\n * @internal\n */\nexport function estimateScaleExponent(input: ScaleSymmetryInput): ScaleExponentResult {\n const pairs = input.x\n .map((x, i) => [x, input.y[i]!] as const)\n .filter(([x, y]) => x > 0 && y > 0);\n if (pairs.length < 3) {\n return { exponent: null, stdErr: null, pValue: null, n: pairs.length, abstained: true, reason: 'need ≥3 positive (x,y) pairs' };\n }\n const lx = pairs.map(([x]) => Math.log(x));\n const ly = pairs.map(([, y]) => Math.log(y));\n if (pairs.length * sumSquaredDeviations(lx) < 1e-18) {\n return { exponent: null, stdErr: null, pValue: null, n: pairs.length, abstained: true, reason: 'degenerate log-x variance' };\n }\n const fit = linearRegression(lx, ly);\n const df = pairs.length - 2;\n const pValue = fit.stdErr > 0 ? studentTwoSidedP(fit.slope / fit.stdErr, df) : fit.slope === 0 ? 1 : 0;\n return { exponent: fit.slope, stdErr: fit.stdErr, pValue, n: pairs.length, abstained: false };\n}\n\n/** The verdict of {@link probeConservation}: no drift in q beyond k standard errors of its slope. @internal */\nexport interface ConservationResult {\n readonly conserved: boolean;\n /** Mean |dq/dt| from MathTS `gradient` (second-order central differences inside, one-sided at the ends). */\n readonly meanAbsRate: number;\n /** The slope of MathTS `linearRegression(t, q)` and its standard error. */\n readonly slope: number | null;\n readonly stdErr: number | null;\n /** The multiple of the standard error a drift must exceed to count. */\n readonly k: number;\n readonly abstained: boolean;\n readonly reason?: string;\n}\n\n/**\n * Conservation probe as a test: q is conserved when the linear drift\n * `slope` of `linearRegression(t, q)` satisfies |slope| ≤ k·stdErr. The\n * standard error comes from the residual scatter of the same series, so the\n * verdict is scale-free. k = 3 by default: a drift within three standard\n * errors is not distinguishable from none at the series' own noise (a\n * two-sided 0.27% under Gaussian residuals), the usual working threshold\n * for \"no effect seen\". The test sees a linear drift only; a quantity that\n * oscillates without drifting passes. The mean |dq/dt| is reported beside\n * the verdict from MathTS `gradient` (second order inside the series), not\n * from first-order forward differences, and never decides it. Abstains below\n * three samples or when t is not strictly increasing.\n *\n * @internal\n */\nexport function probeConservation(\n q: readonly number[],\n t: readonly number[],\n opts: { readonly k?: number } = {},\n): ConservationResult {\n const k = opts.k ?? 3;\n const none = { slope: null, stdErr: null, k };\n if (q.length !== t.length || q.length < 3) {\n return { conserved: false, meanAbsRate: NaN, ...none, abstained: true, reason: 'need ≥3 samples' };\n }\n for (let i = 1; i < t.length; i++) {\n if (!(t[i]! > t[i - 1]!)) {\n return { conserved: false, meanAbsRate: NaN, ...none, abstained: true, reason: 'zero or negative Δt: t must increase strictly' };\n }\n }\n const rate = gradient([...q], [...t]);\n const meanAbsRate = pairwiseSum(rate.map(Math.abs)) / rate.length;\n const fit = linearRegression([...t], [...q]);\n if (!Number.isFinite(fit.slope) || !Number.isFinite(fit.stdErr)) {\n return { conserved: false, meanAbsRate, ...none, abstained: true, reason: 'the drift fit is not finite' };\n }\n return { conserved: Math.abs(fit.slope) <= k * fit.stdErr, meanAbsRate, slope: fit.slope, stdErr: fit.stdErr, k, abstained: false };\n}\n"]}
|
|
@@ -62,6 +62,12 @@ export interface StudyObservation {
|
|
|
62
62
|
export interface StudyCorrection {
|
|
63
63
|
readonly input: string;
|
|
64
64
|
readonly powers: readonly number[];
|
|
65
|
+
/**
|
|
66
|
+
* A reference value the file declares for a power's coefficient (keyed by the power's text,
|
|
67
|
+
* e.g. `{"2": 0.0625}` for the pendulum series θ²/16): the fitted coefficient's z against it
|
|
68
|
+
* is reported, and decides nothing.
|
|
69
|
+
*/
|
|
70
|
+
readonly reference?: Readonly<Record<string, number>>;
|
|
65
71
|
}
|
|
66
72
|
/** A declared comparison model formula and whether its scale is fit on exploratory rows. @internal */
|
|
67
73
|
export interface StudyBaseline {
|
|
@@ -181,8 +187,8 @@ export declare function studyCsvToRaw(text: string, source?: string): Record<str
|
|
|
181
187
|
/** P(χ²_ν ≥ chi2): the probability of a χ² at least this large if the model and σ are right. @internal */
|
|
182
188
|
export declare function chiSquareSurvival(chi2: number, dof: number): number;
|
|
183
189
|
/**
|
|
184
|
-
* P(χ²_ν ≤ chi2), computed directly in the lower tail
|
|
185
|
-
* round a small probability away. @internal
|
|
190
|
+
* P(χ²_ν ≤ chi2), computed directly in the lower tail (MathTS `gammainc` is
|
|
191
|
+
* the series there), where 1 − Q would round a small probability away. @internal
|
|
186
192
|
*/
|
|
187
193
|
export declare function chiSquareCdf(chi2: number, dof: number): number;
|
|
188
194
|
/** P(F_{d1,d2} ≥ f): the probability of an F ratio at least this large if the extra terms explain nothing. @internal */
|
|
@@ -207,6 +213,8 @@ export interface ModelTest {
|
|
|
207
213
|
readonly fittedParameters: number;
|
|
208
214
|
/** SI coherent; 1 for a fixed baseline, the level for the null model. */
|
|
209
215
|
readonly prefactor: number | null;
|
|
216
|
+
/** Standard error of the prefactor from (ΦᵀWΦ)⁻¹ with the declared σ; null when unfit or fixed. */
|
|
217
|
+
readonly prefactorStderr: number | null;
|
|
210
218
|
readonly exploratory: SetTest | null;
|
|
211
219
|
readonly holdout: SetTest | null;
|
|
212
220
|
readonly replication: SetTest | null;
|
|
@@ -215,8 +223,14 @@ export interface ModelTest {
|
|
|
215
223
|
type Predictor = (inputs: Readonly<Record<string, number>>) => number;
|
|
216
224
|
/**
|
|
217
225
|
* The effective σ of one row under a model f: σ_eff² = σ_y² + Σ_i (∂f/∂x_i · σ_xi)²
|
|
218
|
-
* over the inputs with a σ,
|
|
219
|
-
*
|
|
226
|
+
* over the inputs with a σ, the GUM first-order propagation of MathTS
|
|
227
|
+
* `propagateUncertainty` (the one uncertainty path of the library, as in
|
|
228
|
+
* `composition/uncertainty.ts`), each partial a central difference with the
|
|
229
|
+
* relative step 1e-6·|x_i| at the recorded inputs. An input that is exactly
|
|
230
|
+
* zero has no relative step, so it is passed to MathTS shifted by
|
|
231
|
+
* c = 1e3·σ_xi and read back as z − c inside the model: the derivative is
|
|
232
|
+
* unchanged and the step is 1e-6·c = 1e-3·σ_xi, the floor the hand-coded
|
|
233
|
+
* difference used before. First order in σ_x: exact for f linear in x_i.
|
|
220
234
|
*
|
|
221
235
|
* @internal
|
|
222
236
|
*/
|
|
@@ -243,13 +257,21 @@ export interface CandidateTest extends ModelTest {
|
|
|
243
257
|
/** Set on a candidate from the declared correction families: m(x)·(1 + Σ c_k·u_k^p_k). */
|
|
244
258
|
readonly correction?: {
|
|
245
259
|
readonly base: string;
|
|
246
|
-
readonly terms: readonly
|
|
247
|
-
readonly input: string;
|
|
248
|
-
readonly power: number;
|
|
249
|
-
readonly coefficient: number;
|
|
250
|
-
}[];
|
|
260
|
+
readonly terms: readonly CorrectionCoefficient[];
|
|
251
261
|
};
|
|
252
262
|
}
|
|
263
|
+
/** One fitted correction coefficient c_k = a_k/a_0, with its standard error and, when the file declared one, the reference it is compared with. @internal */
|
|
264
|
+
export interface CorrectionCoefficient {
|
|
265
|
+
readonly input: string;
|
|
266
|
+
readonly power: number;
|
|
267
|
+
readonly coefficient: number;
|
|
268
|
+
/** Delta-method standard error of a_k/a_0 from the fit's covariance; null when the inverse failed. */
|
|
269
|
+
readonly stderr: number | null;
|
|
270
|
+
/** The declared reference value, when the family states one for this power. */
|
|
271
|
+
readonly reference?: number;
|
|
272
|
+
/** (coefficient − reference)/stderr; present when both are. Reported, never a verdict. */
|
|
273
|
+
readonly z?: number;
|
|
274
|
+
}
|
|
253
275
|
/** How the declared correction families were searched. @internal */
|
|
254
276
|
export interface StudyCorrectionReport {
|
|
255
277
|
readonly families: readonly StudyCorrection[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"study.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/study.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;
|
|
1
|
+
{"version":3,"file":"study.d.ts","sourceRoot":"","sources":["../../../src/composition/probe/study.ts"],"names":[],"mappings":"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"}
|