universal-physics-tensor 9.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 +21 -17
- package/bin/upt.mjs +13 -1
- package/data/atlas/atlas.json +79 -68
- package/data/atlas/atlas.jsonld +1 -1
- package/data/atlas/diffusion.json +24 -23
- package/data/atlas/oscillators.json +21 -16
- package/data/atlas/waves.json +36 -31
- package/data/atlas/witness-results.json +11 -11
- package/data/bridge-catalog.json +1192 -1636
- package/data/bridge-catalog.schema.json +390 -135
- package/data/quantities.json +53 -19
- package/data/schemas/atlas-record.v0.json +184 -46
- package/data/units.json +33 -4
- package/dist/atlas/applicability.d.ts.map +1 -1
- package/dist/atlas/applicability.js +35 -18
- package/dist/atlas/applicability.js.map +1 -1
- package/dist/atlas/association.js.map +1 -1
- package/dist/atlas/benchmark/backend-shapes.d.ts.map +1 -1
- package/dist/atlas/benchmark/backend-shapes.js +5 -1
- package/dist/atlas/benchmark/backend-shapes.js.map +1 -1
- package/dist/atlas/benchmark/baselines.d.ts.map +1 -1
- package/dist/atlas/benchmark/baselines.js +8 -0
- package/dist/atlas/benchmark/baselines.js.map +1 -1
- package/dist/atlas/benchmark/hybrid-retrieval.d.ts +12 -3
- package/dist/atlas/benchmark/hybrid-retrieval.d.ts.map +1 -1
- package/dist/atlas/benchmark/hybrid-retrieval.js +30 -21
- package/dist/atlas/benchmark/hybrid-retrieval.js.map +1 -1
- package/dist/atlas/benchmark/leakage.js.map +1 -1
- package/dist/atlas/benchmark/loader.js +2 -2
- package/dist/atlas/benchmark/loader.js.map +1 -1
- package/dist/atlas/benchmark/run-atlas.d.ts.map +1 -1
- package/dist/atlas/benchmark/run-atlas.js +14 -2
- package/dist/atlas/benchmark/run-atlas.js.map +1 -1
- package/dist/atlas/benchmark/stats.d.ts +3 -3
- package/dist/atlas/benchmark/stats.d.ts.map +1 -1
- package/dist/atlas/benchmark/stats.js +16 -8
- package/dist/atlas/benchmark/stats.js.map +1 -1
- package/dist/atlas/benchmark/study.js.map +1 -1
- package/dist/atlas/benchmark/types.js.map +1 -1
- package/dist/atlas/bridge-record.d.ts +4 -4
- package/dist/atlas/bridge-record.d.ts.map +1 -1
- package/dist/atlas/bridge-record.js +6 -6
- package/dist/atlas/bridge-record.js.map +1 -1
- package/dist/atlas/catalog-formal-ref.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 +0 -11
- package/dist/atlas/chain-pipeline.d.ts.map +1 -1
- package/dist/atlas/chain-pipeline.js +12 -24
- package/dist/atlas/chain-pipeline.js.map +1 -1
- package/dist/atlas/composition-table.js.map +1 -1
- package/dist/atlas/conventions.js.map +1 -1
- package/dist/atlas/coverage.d.ts +2 -2
- package/dist/atlas/coverage.js.map +1 -1
- package/dist/atlas/derivation.js.map +1 -1
- package/dist/atlas/derive-evidence.d.ts +6 -4
- package/dist/atlas/derive-evidence.d.ts.map +1 -1
- package/dist/atlas/derive-evidence.js +7 -2
- package/dist/atlas/derive-evidence.js.map +1 -1
- package/dist/atlas/diffusion/bridges-closure.d.ts +0 -4
- package/dist/atlas/diffusion/bridges-closure.d.ts.map +1 -1
- package/dist/atlas/diffusion/bridges-closure.js +8 -17
- 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 -42
- 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/index.d.ts +1 -1
- package/dist/atlas/diffusion/index.d.ts.map +1 -1
- package/dist/atlas/diffusion/index.js.map +1 -1
- package/dist/atlas/diffusion/models.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/error-algebra.d.ts +6 -0
- package/dist/atlas/error-algebra.d.ts.map +1 -1
- package/dist/atlas/error-algebra.js +26 -0
- package/dist/atlas/error-algebra.js.map +1 -1
- package/dist/atlas/export.d.ts +18 -2
- package/dist/atlas/export.d.ts.map +1 -1
- package/dist/atlas/export.js +9 -3
- package/dist/atlas/export.js.map +1 -1
- package/dist/atlas/families.d.ts +19 -2
- package/dist/atlas/families.d.ts.map +1 -1
- package/dist/atlas/families.js +26 -3
- package/dist/atlas/families.js.map +1 -1
- package/dist/atlas/family.d.ts +27 -0
- package/dist/atlas/family.d.ts.map +1 -0
- package/dist/atlas/family.js +12 -0
- package/dist/atlas/family.js.map +1 -0
- package/dist/atlas/index.d.ts +3 -2
- package/dist/atlas/index.d.ts.map +1 -1
- package/dist/atlas/index.js +2 -1
- package/dist/atlas/index.js.map +1 -1
- package/dist/atlas/link-prediction.d.ts +107 -4
- 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/model.js.map +1 -1
- package/dist/atlas/oscillators/bridges-coarse.d.ts.map +1 -1
- package/dist/atlas/oscillators/bridges-coarse.js +7 -12
- 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 -10
- 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 -36
- 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/index.d.ts +1 -16
- package/dist/atlas/oscillators/index.d.ts.map +1 -1
- package/dist/atlas/oscillators/index.js.map +1 -1
- package/dist/atlas/oscillators/limit-witnesses.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/norm-transport-witness.js.map +1 -1
- package/dist/atlas/oscillators/norm-transport.js.map +1 -1
- package/dist/atlas/oscillators/norms.js.map +1 -1
- package/dist/atlas/oscillators/pendulum-motion.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-carriage.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/path-bound.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 +107 -70
- package/dist/atlas/physjs-ref.d.ts.map +1 -1
- package/dist/atlas/physjs-ref.js +184 -101
- package/dist/atlas/physjs-ref.js.map +1 -1
- package/dist/atlas/physjs-reviewed.d.ts +31 -0
- package/dist/atlas/physjs-reviewed.d.ts.map +1 -0
- package/dist/atlas/physjs-reviewed.js +194 -0
- package/dist/atlas/physjs-reviewed.js.map +1 -0
- package/dist/atlas/poster/associations.js.map +1 -1
- package/dist/atlas/poster/derivations.js.map +1 -1
- package/dist/atlas/poster/statements.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/public.d.ts +2 -1
- package/dist/atlas/public.d.ts.map +1 -1
- package/dist/atlas/public.js +2 -1
- package/dist/atlas/public.js.map +1 -1
- package/dist/atlas/regime.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/serialize.d.ts +18 -12
- package/dist/atlas/serialize.d.ts.map +1 -1
- package/dist/atlas/serialize.js +28 -18
- package/dist/atlas/serialize.js.map +1 -1
- package/dist/atlas/statement.js.map +1 -1
- package/dist/atlas/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/translation-registry.js.map +1 -1
- package/dist/atlas/translation.js.map +1 -1
- package/dist/atlas/types.d.ts +9 -2
- package/dist/atlas/types.d.ts.map +1 -1
- package/dist/atlas/types.js +1 -1
- package/dist/atlas/types.js.map +1 -1
- package/dist/atlas/waves/bridges-closure.d.ts.map +1 -1
- package/dist/atlas/waves/bridges-closure.js +2 -9
- 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 -52
- package/dist/atlas/waves/bridges.js.map +1 -1
- package/dist/atlas/waves/index.d.ts +1 -1
- package/dist/atlas/waves/index.d.ts.map +1 -1
- package/dist/atlas/waves/index.js.map +1 -1
- package/dist/atlas/waves/models.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-artifact.js.map +1 -1
- package/dist/atlas/witness-dominance.d.ts +4 -3
- package/dist/atlas/witness-dominance.d.ts.map +1 -1
- package/dist/atlas/witness-dominance.js +15 -5
- package/dist/atlas/witness-dominance.js.map +1 -1
- package/dist/atlas/witness-numeric.d.ts +38 -4
- package/dist/atlas/witness-numeric.d.ts.map +1 -1
- package/dist/atlas/witness-numeric.js +80 -2
- package/dist/atlas/witness-numeric.js.map +1 -1
- package/dist/atlas/witness-result.d.ts +7 -1
- package/dist/atlas/witness-result.d.ts.map +1 -1
- package/dist/atlas/witness-result.js.map +1 -1
- package/dist/atlas/witness-specs.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/atlas/witnesses/quantum-support.js.map +1 -1
- package/dist/bridges/caller-table.d.ts +1 -1
- package/dist/bridges/caller-table.d.ts.map +1 -1
- package/dist/bridges/caller-table.js.map +1 -1
- package/dist/bridges/carrier-sign.d.ts.map +1 -1
- package/dist/bridges/carrier-sign.js +8 -3
- package/dist/bridges/carrier-sign.js.map +1 -1
- package/dist/bridges/catalog-adapter.d.ts +12 -3
- package/dist/bridges/catalog-adapter.d.ts.map +1 -1
- package/dist/bridges/catalog-adapter.js +17 -9
- package/dist/bridges/catalog-adapter.js.map +1 -1
- package/dist/bridges/catalog-load.d.ts +12 -2
- package/dist/bridges/catalog-load.d.ts.map +1 -1
- package/dist/bridges/catalog-load.js +181 -13
- package/dist/bridges/catalog-load.js.map +1 -1
- package/dist/bridges/catalog-types.d.ts +74 -26
- 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/coefficient-statement.js +1 -5
- package/dist/bridges/coefficient-statement.js.map +1 -1
- package/dist/bridges/confrontation-coverage.js.map +1 -1
- package/dist/bridges/confrontations.d.ts +1 -1
- package/dist/bridges/confrontations.d.ts.map +1 -1
- package/dist/bridges/confrontations.js +1 -1
- package/dist/bridges/confrontations.js.map +1 -1
- package/dist/bridges/evaluation-errors.d.ts +46 -3
- package/dist/bridges/evaluation-errors.d.ts.map +1 -1
- package/dist/bridges/evaluation-errors.js +40 -4
- 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 +17 -2
- package/dist/bridges/evaluators.d.ts.map +1 -1
- package/dist/bridges/evaluators.js +76 -28
- package/dist/bridges/evaluators.js.map +1 -1
- package/dist/bridges/expr-parse.d.ts +38 -4
- package/dist/bridges/expr-parse.d.ts.map +1 -1
- package/dist/bridges/expr-parse.js +101 -12
- package/dist/bridges/expr-parse.js.map +1 -1
- package/dist/bridges/holds.d.ts +40 -4
- package/dist/bridges/holds.d.ts.map +1 -1
- package/dist/bridges/holds.js +128 -19
- package/dist/bridges/holds.js.map +1 -1
- package/dist/bridges/index.d.ts +15 -14
- package/dist/bridges/index.d.ts.map +1 -1
- package/dist/bridges/index.js +14 -15
- package/dist/bridges/index.js.map +1 -1
- package/dist/bridges/input-contract.js.map +1 -1
- package/dist/bridges/membership.d.ts +5 -3
- package/dist/bridges/membership.d.ts.map +1 -1
- package/dist/bridges/membership.js +5 -6
- package/dist/bridges/membership.js.map +1 -1
- package/dist/bridges/notices.d.ts.map +1 -1
- package/dist/bridges/notices.js +5 -5
- package/dist/bridges/notices.js.map +1 -1
- package/dist/bridges/observations/types.js.map +1 -1
- package/dist/bridges/rejected.d.ts +11 -17
- package/dist/bridges/rejected.d.ts.map +1 -1
- package/dist/bridges/rejected.js +13 -68
- package/dist/bridges/rejected.js.map +1 -1
- package/dist/bridges/relation-eval.d.ts +6 -7
- package/dist/bridges/relation-eval.d.ts.map +1 -1
- package/dist/bridges/relation-eval.js +20 -50
- package/dist/bridges/relation-eval.js.map +1 -1
- package/dist/bridges/rhs-registry.js.map +1 -1
- package/dist/bridges/sensitivity.d.ts +11 -3
- package/dist/bridges/sensitivity.d.ts.map +1 -1
- package/dist/bridges/sensitivity.js +27 -13
- package/dist/bridges/sensitivity.js.map +1 -1
- package/dist/bridges/tensor-index.js.map +1 -1
- package/dist/bridges/types.d.ts +1 -7
- package/dist/bridges/types.d.ts.map +1 -1
- package/dist/bridges/types.js +1 -4
- package/dist/bridges/types.js.map +1 -1
- package/dist/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/canonical-equation.js.map +1 -1
- package/dist/canonical/dimensional-fields.js.map +1 -1
- package/dist/canonical/entries/_l1-build.js.map +1 -1
- package/dist/canonical/entries/atomic.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 +8 -9
- 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 +5 -6
- 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 +6 -12
- 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 +38 -39
- 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/statistical-mechanics.js +5 -5
- package/dist/canonical/entries/statistical-mechanics.js.map +1 -1
- package/dist/canonical/entries/thermo-nuclear-cosmo.d.ts.map +1 -1
- package/dist/canonical/entries/thermo-nuclear-cosmo.js +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 +29 -4
- package/dist/canonical/linkage.d.ts.map +1 -1
- package/dist/canonical/linkage.js +47 -64
- package/dist/canonical/linkage.js.map +1 -1
- package/dist/canonical/normal-form.d.ts +0 -8
- package/dist/canonical/normal-form.d.ts.map +1 -1
- package/dist/canonical/normal-form.js +22 -23
- package/dist/canonical/normal-form.js.map +1 -1
- package/dist/canonical/registry.js.map +1 -1
- package/dist/canonical/residual.js.map +1 -1
- package/dist/canonical/seed-l-layer.d.ts +7 -1
- package/dist/canonical/seed-l-layer.d.ts.map +1 -1
- package/dist/canonical/seed-l-layer.js +7 -1
- package/dist/canonical/seed-l-layer.js.map +1 -1
- package/dist/canonical/structural.d.ts +42 -21
- package/dist/canonical/structural.d.ts.map +1 -1
- package/dist/canonical/structural.js +64 -23
- 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 +10 -9
- 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 +8 -11
- package/dist/cases/damped-resonator.js.map +1 -1
- package/dist/cases/index.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 +22 -24
- 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 +7 -7
- 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/cases/types.js.map +1 -1
- package/dist/cli/args.d.ts +30 -3
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +47 -9
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/bindings.d.ts +13 -0
- package/dist/cli/bindings.d.ts.map +1 -0
- package/dist/cli/bindings.js +33 -0
- package/dist/cli/bindings.js.map +1 -0
- package/dist/cli/closed-form-range.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 +2 -11
- package/dist/cli/commands/_atlas-map.d.ts.map +1 -1
- package/dist/cli/commands/_atlas-map.js +50 -35
- 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 +48 -14
- 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 +9 -8
- 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 +20 -20
- 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/candidates.d.ts.map +1 -1
- package/dist/cli/commands/candidates.js +16 -8
- package/dist/cli/commands/candidates.js.map +1 -1
- package/dist/cli/commands/canonical.js.map +1 -1
- package/dist/cli/commands/chain.js +1 -1
- package/dist/cli/commands/chain.js.map +1 -1
- package/dist/cli/commands/confront.d.ts.map +1 -1
- package/dist/cli/commands/confront.js +22 -20
- package/dist/cli/commands/confront.js.map +1 -1
- package/dist/cli/commands/connectors.js.map +1 -1
- package/dist/cli/commands/coverage.js.map +1 -1
- package/dist/cli/commands/derive.d.ts.map +1 -1
- package/dist/cli/commands/derive.js +60 -35
- 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 +20 -10
- 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 +14 -10
- 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 +108 -58
- 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 +16 -8
- package/dist/cli/commands/explain.js.map +1 -1
- package/dist/cli/commands/frontier.js.map +1 -1
- package/dist/cli/commands/ground.d.ts.map +1 -1
- package/dist/cli/commands/ground.js +41 -10
- package/dist/cli/commands/ground.js.map +1 -1
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/map.d.ts.map +1 -1
- package/dist/cli/commands/map.js +155 -92
- package/dist/cli/commands/map.js.map +1 -1
- package/dist/cli/commands/metric.d.ts.map +1 -1
- package/dist/cli/commands/metric.js +58 -20
- 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 +29 -7
- package/dist/cli/commands/path.js.map +1 -1
- package/dist/cli/commands/predict.js.map +1 -1
- package/dist/cli/commands/priority.js.map +1 -1
- package/dist/cli/commands/probe.d.ts.map +1 -1
- package/dist/cli/commands/probe.js +105 -38
- package/dist/cli/commands/probe.js.map +1 -1
- package/dist/cli/commands/recover.js +1 -1
- package/dist/cli/commands/recover.js.map +1 -1
- package/dist/cli/commands/regime.d.ts +5 -4
- package/dist/cli/commands/regime.d.ts.map +1 -1
- package/dist/cli/commands/regime.js +25 -26
- 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 +23 -14
- package/dist/cli/commands/retrieve.js.map +1 -1
- package/dist/cli/commands/search.d.ts.map +1 -1
- package/dist/cli/commands/search.js +9 -4
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/symbolic.js +31 -36
- 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 +5 -3
- package/dist/cli/commands/testplan.js.map +1 -1
- package/dist/cli/conventions.js.map +1 -1
- package/dist/cli/determination.js.map +1 -1
- package/dist/cli/errors.js.map +1 -1
- package/dist/cli/euler-guard.js.map +1 -1
- package/dist/cli/eval-numbers.js.map +1 -1
- package/dist/cli/expr-print.d.ts +28 -3
- package/dist/cli/expr-print.d.ts.map +1 -1
- package/dist/cli/expr-print.js +42 -22
- package/dist/cli/expr-print.js.map +1 -1
- package/dist/cli/flag-help.js.map +1 -1
- package/dist/cli/graphs.js.map +1 -1
- package/dist/cli/library-defaults.d.ts +19 -0
- package/dist/cli/library-defaults.d.ts.map +1 -0
- package/dist/cli/library-defaults.js +22 -0
- package/dist/cli/library-defaults.js.map +1 -0
- package/dist/cli/main.d.ts +7 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +25 -6
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/map-evidence.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 +23 -6
- 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/published-url.js.map +1 -1
- package/dist/cli/record-reach.d.ts +6 -0
- package/dist/cli/record-reach.d.ts.map +1 -1
- package/dist/cli/record-reach.js +17 -11
- 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 +7 -6
- 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 +40 -20
- package/dist/cli/record.js.map +1 -1
- package/dist/cli/search-index.d.ts +5 -0
- package/dist/cli/search-index.d.ts.map +1 -1
- package/dist/cli/search-index.js +19 -7
- 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/top-level-help.js.map +1 -1
- 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 +49 -14
- package/dist/cli-api.d.ts.map +1 -1
- package/dist/cli-api.js +42 -17
- package/dist/cli-api.js.map +1 -1
- package/dist/composition/adjudication.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/aliases.js.map +1 -1
- package/dist/composition/audit-coverage.d.ts +2 -0
- package/dist/composition/audit-coverage.d.ts.map +1 -1
- package/dist/composition/audit-coverage.js.map +1 -1
- package/dist/composition/axes.d.ts +6 -0
- package/dist/composition/axes.d.ts.map +1 -1
- package/dist/composition/axes.js +18 -6
- package/dist/composition/axes.js.map +1 -1
- package/dist/composition/axis-audit.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 +14 -15
- package/dist/composition/bridge-analysis.d.ts.map +1 -1
- package/dist/composition/bridge-analysis.js +148 -91
- package/dist/composition/bridge-analysis.js.map +1 -1
- package/dist/composition/bridge-prediction.d.ts +5 -1
- package/dist/composition/bridge-prediction.d.ts.map +1 -1
- package/dist/composition/bridge-prediction.js +12 -16
- package/dist/composition/bridge-prediction.js.map +1 -1
- package/dist/composition/buckingham-filter.js.map +1 -1
- package/dist/composition/canonical-compare.d.ts +40 -0
- package/dist/composition/canonical-compare.d.ts.map +1 -1
- package/dist/composition/canonical-compare.js +134 -26
- package/dist/composition/canonical-compare.js.map +1 -1
- package/dist/composition/canonical-graph.d.ts +9 -10
- package/dist/composition/canonical-graph.d.ts.map +1 -1
- package/dist/composition/canonical-graph.js +33 -102
- 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/canonical-prefactors.js.map +1 -1
- package/dist/composition/catalog-graph.d.ts.map +1 -1
- package/dist/composition/catalog-graph.js +8 -25
- package/dist/composition/catalog-graph.js.map +1 -1
- package/dist/composition/chain-candidate.d.ts +10 -0
- package/dist/composition/chain-candidate.d.ts.map +1 -1
- package/dist/composition/chain-candidate.js +11 -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-regime.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-surface.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 +166 -41
- 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/consequence.d.ts.map +1 -1
- package/dist/composition/consequence.js +15 -6
- package/dist/composition/consequence.js.map +1 -1
- package/dist/composition/consistency.js.map +1 -1
- package/dist/composition/descriptor.d.ts +1 -1
- package/dist/composition/descriptor.d.ts.map +1 -1
- package/dist/composition/descriptor.js.map +1 -1
- package/dist/composition/dimension-adjacency.js.map +1 -1
- package/dist/composition/discovery.d.ts +77 -11
- package/dist/composition/discovery.d.ts.map +1 -1
- package/dist/composition/discovery.js +194 -80
- package/dist/composition/discovery.js.map +1 -1
- package/dist/composition/edge.d.ts +40 -10
- package/dist/composition/edge.d.ts.map +1 -1
- package/dist/composition/edge.js +47 -12
- package/dist/composition/edge.js.map +1 -1
- package/dist/composition/enumerate.d.ts +2 -2
- package/dist/composition/enumerate.d.ts.map +1 -1
- package/dist/composition/enumerate.js +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 +5 -9
- package/dist/composition/explain.d.ts.map +1 -1
- package/dist/composition/explain.js +38 -18
- 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 +24 -59
- package/dist/composition/expr-simplify.js.map +1 -1
- package/dist/composition/expr-subst.js.map +1 -1
- package/dist/composition/formula-shape.d.ts +28 -0
- package/dist/composition/formula-shape.d.ts.map +1 -1
- package/dist/composition/formula-shape.js +96 -2
- package/dist/composition/formula-shape.js.map +1 -1
- package/dist/composition/frontier-account.d.ts +3 -2
- package/dist/composition/frontier-account.d.ts.map +1 -1
- package/dist/composition/frontier-account.js +7 -3
- package/dist/composition/frontier-account.js.map +1 -1
- package/dist/composition/graph-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/grounding.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 +14 -8
- package/dist/composition/index.d.ts.map +1 -1
- package/dist/composition/index.js +7 -5
- package/dist/composition/index.js.map +1 -1
- package/dist/composition/mathts-quiet.d.ts +29 -0
- package/dist/composition/mathts-quiet.d.ts.map +1 -0
- package/dist/composition/mathts-quiet.js +57 -0
- package/dist/composition/mathts-quiet.js.map +1 -0
- package/dist/composition/mathts-scalar-symbols.d.ts.map +1 -1
- package/dist/composition/mathts-scalar-symbols.js +20 -35
- package/dist/composition/mathts-scalar-symbols.js.map +1 -1
- package/dist/composition/not-composable-seeds.d.ts +3 -1
- package/dist/composition/not-composable-seeds.d.ts.map +1 -1
- package/dist/composition/not-composable-seeds.js +2 -0
- package/dist/composition/not-composable-seeds.js.map +1 -1
- package/dist/composition/probe/backend-protocol.js.map +1 -1
- package/dist/composition/probe/candidate-store.js.map +1 -1
- package/dist/composition/probe/corpus.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/expression-gaps.js.map +1 -1
- package/dist/composition/probe/falsify.d.ts +14 -3
- package/dist/composition/probe/falsify.d.ts.map +1 -1
- package/dist/composition/probe/falsify.js +16 -27
- package/dist/composition/probe/falsify.js.map +1 -1
- package/dist/composition/probe/fingerprint.js.map +1 -1
- package/dist/composition/probe/fit.d.ts +7 -1
- package/dist/composition/probe/fit.d.ts.map +1 -1
- package/dist/composition/probe/fit.js +48 -23
- 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 +18 -2
- package/dist/composition/probe/index.d.ts.map +1 -1
- package/dist/composition/probe/index.js +10 -2
- 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/metadata.js.map +1 -1
- package/dist/composition/probe/pipeline.d.ts +5 -0
- package/dist/composition/probe/pipeline.d.ts.map +1 -1
- package/dist/composition/probe/pipeline.js +22 -9
- 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 +12 -1
- package/dist/composition/probe/problem.d.ts.map +1 -1
- package/dist/composition/probe/problem.js +242 -48
- 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/run-manifest.js +2 -2
- package/dist/composition/probe/run-manifest.js.map +1 -1
- package/dist/composition/probe/scoring.d.ts +2 -1
- package/dist/composition/probe/scoring.d.ts.map +1 -1
- package/dist/composition/probe/scoring.js +21 -7
- package/dist/composition/probe/scoring.js.map +1 -1
- package/dist/composition/probe/search-budget.js.map +1 -1
- package/dist/composition/probe/serialize.js.map +1 -1
- package/dist/composition/probe/structure.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 +35 -12
- package/dist/composition/probe/study.d.ts.map +1 -1
- package/dist/composition/probe/study.js +241 -184
- 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 +6 -1
- package/dist/composition/probe/types.d.ts.map +1 -1
- package/dist/composition/probe/types.js +2 -0
- package/dist/composition/probe/types.js.map +1 -1
- package/dist/composition/proposed-bridges.d.ts +51 -13
- package/dist/composition/proposed-bridges.d.ts.map +1 -1
- package/dist/composition/proposed-bridges.js +110 -58
- package/dist/composition/proposed-bridges.js.map +1 -1
- package/dist/composition/quantities.d.ts +0 -4
- package/dist/composition/quantities.d.ts.map +1 -1
- package/dist/composition/quantities.js +5 -5
- package/dist/composition/quantities.js.map +1 -1
- package/dist/composition/quantity-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/quantity.d.ts +18 -2
- package/dist/composition/quantity.d.ts.map +1 -1
- package/dist/composition/quantity.js +35 -6
- package/dist/composition/quantity.js.map +1 -1
- package/dist/composition/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 +16 -6
- package/dist/composition/retrodiction.d.ts.map +1 -1
- package/dist/composition/retrodiction.js +36 -10
- package/dist/composition/retrodiction.js.map +1 -1
- package/dist/composition/uncertainty.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/axes-registry.d.ts +8 -5
- package/dist/core/axes-registry.d.ts.map +1 -1
- package/dist/core/axes-registry.js.map +1 -1
- package/dist/core/cell.js.map +1 -1
- package/dist/core/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 +35 -35
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +52 -37
- 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/flux-rules.js +1 -1
- package/dist/core/flux-rules.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 +3 -1
- package/dist/core/json-schema.d.ts.map +1 -1
- package/dist/core/json-schema.js +41 -16
- package/dist/core/json-schema.js.map +1 -1
- package/dist/core/labeled-tensor.d.ts +6 -1
- package/dist/core/labeled-tensor.d.ts.map +1 -1
- package/dist/core/labeled-tensor.js +18 -16
- 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/regime-registry.d.ts +6 -2
- package/dist/core/regime-registry.d.ts.map +1 -1
- package/dist/core/regime-registry.js.map +1 -1
- package/dist/core/regime-rule-install.js.map +1 -1
- package/dist/core/regimes-builtins.js.map +1 -1
- package/dist/core/tensor.d.ts +7 -4
- package/dist/core/tensor.d.ts.map +1 -1
- package/dist/core/tensor.js +64 -8
- package/dist/core/tensor.js.map +1 -1
- package/dist/core/types.d.ts +5 -5
- package/dist/core/types.js.map +1 -1
- package/dist/core/universal-index.js.map +1 -1
- package/dist/diff/bridge-ast-gradient.d.ts +4 -5
- package/dist/diff/bridge-ast-gradient.d.ts.map +1 -1
- package/dist/diff/bridge-ast-gradient.js +10 -6
- package/dist/diff/bridge-ast-gradient.js.map +1 -1
- package/dist/diff/bridge-gradient.d.ts +43 -86
- package/dist/diff/bridge-gradient.d.ts.map +1 -1
- package/dist/diff/bridge-gradient.js +40 -109
- package/dist/diff/bridge-gradient.js.map +1 -1
- package/dist/diff/bridge-specs.d.ts +16 -5
- package/dist/diff/bridge-specs.d.ts.map +1 -1
- package/dist/diff/bridge-specs.js +19 -4
- 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 +12 -4
- package/dist/dimensional/ast-builders.d.ts.map +1 -1
- package/dist/dimensional/ast-builders.js +17 -5
- 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/ast-types.js.map +1 -1
- package/dist/dimensional/bridge-check.js.map +1 -1
- 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/connection-validators.d.ts +2 -1
- package/dist/dimensional/connection-validators.d.ts.map +1 -1
- package/dist/dimensional/connection-validators.js.map +1 -1
- package/dist/dimensional/connection.js.map +1 -1
- package/dist/dimensional/constant-rows.d.ts.map +1 -1
- package/dist/dimensional/constant-rows.js +17 -13
- package/dist/dimensional/constant-rows.js.map +1 -1
- package/dist/dimensional/constants.d.ts +5 -6
- package/dist/dimensional/constants.d.ts.map +1 -1
- package/dist/dimensional/constants.js +5 -6
- package/dist/dimensional/constants.js.map +1 -1
- package/dist/dimensional/curvature-composite.js.map +1 -1
- package/dist/dimensional/curvature-invariants.js.map +1 -1
- package/dist/dimensional/curvature.js.map +1 -1
- package/dist/dimensional/dimension-inference.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/dimension-spec.d.ts +13 -7
- package/dist/dimensional/dimension-spec.d.ts.map +1 -1
- package/dist/dimensional/dimension-spec.js +49 -23
- package/dist/dimensional/dimension-spec.js.map +1 -1
- package/dist/dimensional/einstein-equation.js.map +1 -1
- package/dist/dimensional/errors.d.ts +4 -2
- package/dist/dimensional/errors.d.ts.map +1 -1
- package/dist/dimensional/errors.js +3 -17
- 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/field-equation-helpers.js.map +1 -1
- package/dist/dimensional/formula-names.js.map +1 -1
- package/dist/dimensional/fresh-label.js.map +1 -1
- package/dist/dimensional/friedmann-equation.d.ts +3 -3
- package/dist/dimensional/friedmann-equation.js +3 -3
- package/dist/dimensional/friedmann-equation.js.map +1 -1
- package/dist/dimensional/gauge-field.d.ts +2 -3
- package/dist/dimensional/gauge-field.d.ts.map +1 -1
- package/dist/dimensional/gauge-field.js +2 -3
- 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 +45 -12
- package/dist/dimensional/hyphen-names.js.map +1 -1
- package/dist/dimensional/killing-validators.js.map +1 -1
- package/dist/dimensional/klein-gordon-equation.js.map +1 -1
- package/dist/dimensional/metric-validators.d.ts +2 -1
- package/dist/dimensional/metric-validators.d.ts.map +1 -1
- package/dist/dimensional/metric-validators.js.map +1 -1
- package/dist/dimensional/metric.d.ts.map +1 -1
- package/dist/dimensional/metric.js +0 -1
- package/dist/dimensional/metric.js.map +1 -1
- package/dist/dimensional/natural-units.js.map +1 -1
- package/dist/dimensional/quantity-registry.d.ts +13 -0
- package/dist/dimensional/quantity-registry.d.ts.map +1 -1
- package/dist/dimensional/quantity-registry.js +14 -6
- package/dist/dimensional/quantity-registry.js.map +1 -1
- package/dist/dimensional/rg-flow.js.map +1 -1
- package/dist/dimensional/stress-energy-validators.js.map +1 -1
- package/dist/dimensional/symbolic-constants.d.ts +9 -0
- package/dist/dimensional/symbolic-constants.d.ts.map +1 -1
- package/dist/dimensional/symbolic-constants.js +20 -3
- package/dist/dimensional/symbolic-constants.js.map +1 -1
- package/dist/dimensional/tensor-trace.js.map +1 -1
- package/dist/dimensional/tensor.js.map +1 -1
- package/dist/dimensional/types.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-convention.d.ts +0 -2
- package/dist/dimensional/unit-convention.d.ts.map +1 -1
- package/dist/dimensional/unit-convention.js +2 -2
- package/dist/dimensional/unit-convention.js.map +1 -1
- package/dist/dimensional/unit-data.d.ts.map +1 -1
- package/dist/dimensional/unit-data.js +11 -7
- package/dist/dimensional/unit-data.js.map +1 -1
- package/dist/dimensional/units.d.ts.map +1 -1
- package/dist/dimensional/units.js +38 -20
- package/dist/dimensional/units.js.map +1 -1
- package/dist/dimensional/validator-registry.js.map +1 -1
- package/dist/dimensional/validator.d.ts +0 -16
- package/dist/dimensional/validator.d.ts.map +1 -1
- package/dist/dimensional/validator.js +65 -29
- package/dist/dimensional/validator.js.map +1 -1
- package/dist/dimensional/weyl-validators.js.map +1 -1
- package/dist/index.d.ts +59 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -24
- package/dist/index.js.map +1 -1
- package/dist/numerical/bianchi-residual.js.map +1 -1
- package/dist/numerical/binding-value.d.ts +11 -6
- package/dist/numerical/binding-value.d.ts.map +1 -1
- package/dist/numerical/binding-value.js +126 -122
- package/dist/numerical/binding-value.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/connection-lowering-helpers.js.map +1 -1
- package/dist/numerical/covariant-eikonal.d.ts.map +1 -1
- package/dist/numerical/covariant-eikonal.js +36 -13
- package/dist/numerical/covariant-eikonal.js.map +1 -1
- package/dist/numerical/curvature-lowering-helpers.d.ts +20 -0
- package/dist/numerical/curvature-lowering-helpers.d.ts.map +1 -1
- package/dist/numerical/curvature-lowering-helpers.js +9 -5
- package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
- package/dist/numerical/derivative-lowering.js.map +1 -1
- package/dist/numerical/einstein-equation.js.map +1 -1
- package/dist/numerical/engine-registry.js.map +1 -1
- package/dist/numerical/errors.d.ts +7 -3
- package/dist/numerical/errors.d.ts.map +1 -1
- package/dist/numerical/errors.js +5 -8
- package/dist/numerical/errors.js.map +1 -1
- package/dist/numerical/evaluator-uncertainty.d.ts.map +1 -1
- package/dist/numerical/evaluator-uncertainty.js +19 -2
- package/dist/numerical/evaluator-uncertainty.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/formula-contract.d.ts +63 -7
- package/dist/numerical/formula-contract.d.ts.map +1 -1
- package/dist/numerical/formula-contract.js +61 -42
- package/dist/numerical/formula-contract.js.map +1 -1
- package/dist/numerical/formula-dimension.d.ts +8 -7
- package/dist/numerical/formula-dimension.d.ts.map +1 -1
- package/dist/numerical/formula-dimension.js +58 -36
- package/dist/numerical/formula-dimension.js.map +1 -1
- package/dist/numerical/formula-mathts.d.ts.map +1 -1
- package/dist/numerical/formula-mathts.js +5 -2
- package/dist/numerical/formula-mathts.js.map +1 -1
- package/dist/numerical/formula-registry.d.ts +13 -3
- package/dist/numerical/formula-registry.d.ts.map +1 -1
- package/dist/numerical/formula-registry.js +7 -2
- package/dist/numerical/formula-registry.js.map +1 -1
- package/dist/numerical/geodesic-integrator.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/gl4-integrator.d.ts +28 -27
- package/dist/numerical/gl4-integrator.d.ts.map +1 -1
- package/dist/numerical/gl4-integrator.js +41 -42
- package/dist/numerical/gl4-integrator.js.map +1 -1
- package/dist/numerical/grid-field.js.map +1 -1
- package/dist/numerical/index.js.map +1 -1
- package/dist/numerical/input-validation.d.ts +3 -6
- package/dist/numerical/input-validation.d.ts.map +1 -1
- package/dist/numerical/input-validation.js +4 -8
- package/dist/numerical/input-validation.js.map +1 -1
- package/dist/numerical/killing.d.ts +8 -5
- package/dist/numerical/killing.d.ts.map +1 -1
- package/dist/numerical/killing.js.map +1 -1
- package/dist/numerical/klein-gordon.js.map +1 -1
- package/dist/numerical/kretschmann.js.map +1 -1
- package/dist/numerical/lowering-utils.js.map +1 -1
- package/dist/numerical/lowering.d.ts.map +1 -1
- package/dist/numerical/lowering.js +7 -17
- package/dist/numerical/lowering.js.map +1 -1
- package/dist/numerical/mathts-engine.d.ts.map +1 -1
- package/dist/numerical/mathts-engine.js +16 -25
- 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-ic.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/pderiv.d.ts.map +1 -1
- package/dist/numerical/pderiv.js +9 -2
- package/dist/numerical/pderiv.js.map +1 -1
- package/dist/numerical/perihelion-finder.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 +5 -2
- package/dist/numerical/quadrature.d.ts.map +1 -1
- package/dist/numerical/quadrature.js +19 -4
- 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 +25 -19
- package/dist/numerical/spacetime-metrics.d.ts.map +1 -1
- package/dist/numerical/spacetime-metrics.js +180 -286
- 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/strides.js.map +1 -1
- package/dist/numerical/tensor-engine.d.ts +30 -5
- 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/numerical/types.js.map +1 -1
- package/dist/numerical/weyl-lowering.js.map +1 -1
- package/dist/relations/category.js.map +1 -1
- package/dist/relations/composition-table.d.ts +4 -4
- package/dist/relations/composition-table.js +4 -4
- package/dist/relations/composition-table.js.map +1 -1
- package/dist/relations/conventions.js.map +1 -1
- package/dist/relations/domain-regimes.js.map +1 -1
- package/dist/relations/regime-registration.js.map +1 -1
- package/dist/relations/regime-vocabularies.js.map +1 -1
- package/dist/relations/regime.d.ts +28 -8
- package/dist/relations/regime.d.ts.map +1 -1
- package/dist/relations/regime.js +44 -15
- package/dist/relations/regime.js.map +1 -1
- package/dist/relations/types.d.ts +18 -5
- package/dist/relations/types.d.ts.map +1 -1
- package/dist/relations/types.js +5 -3
- package/dist/relations/types.js.map +1 -1
- package/package.json +16 -20
- package/dist/bridges/registry.d.ts +0 -60
- package/dist/bridges/registry.d.ts.map +0 -1
- package/dist/bridges/registry.js +0 -87
- package/dist/bridges/registry.js.map +0 -1
- package/dist/cli/poster-source.d.ts +0 -154
- package/dist/cli/poster-source.d.ts.map +0 -1
- package/dist/cli/poster-source.js +0 -184
- package/dist/cli/poster-source.js.map +0 -1
|
@@ -26,6 +26,11 @@
|
|
|
26
26
|
*
|
|
27
27
|
* @internal
|
|
28
28
|
*/
|
|
29
|
+
import { pairwiseDot, pairwiseSum } from '@danielsimonjr/mathts-core';
|
|
30
|
+
import { betainc, gammainc, gammaincp, inv, propagateUncertainty } from '@danielsimonjr/mathts-functions';
|
|
31
|
+
import { numberFrom } from '../../core/mathts-read.js';
|
|
32
|
+
import { readJsonFile } from '../../core/data-file.js';
|
|
33
|
+
import { isPlainObject } from '../../core/json-schema.js';
|
|
29
34
|
import { readFileSync } from 'node:fs';
|
|
30
35
|
import { DIMENSIONLESS } from '../../dimensional/types.js';
|
|
31
36
|
import { equals, format } from '../../dimensional/algebra.js';
|
|
@@ -47,7 +52,8 @@ export class StudyRefusal extends Error {
|
|
|
47
52
|
this.name = 'StudyRefusal';
|
|
48
53
|
}
|
|
49
54
|
}
|
|
50
|
-
|
|
55
|
+
/** The χ² test level a study file states none of. @internal */
|
|
56
|
+
export const DEFAULT_ALPHA = 0.001;
|
|
51
57
|
const TOP_KEYS = new Set([
|
|
52
58
|
'description', 'gap', 'provenance', 'target', 'governing', 'observations', 'baselines', 'criterion', 'design',
|
|
53
59
|
'correction',
|
|
@@ -55,18 +61,16 @@ const TOP_KEYS = new Set([
|
|
|
55
61
|
const ROW_KEYS = new Set(['id', 'role', 'source', 'values', 'observed', 'sigma', 'inputSigma', 'note']);
|
|
56
62
|
/** The keys a separate replication file may carry; the rest belong in the study file. */
|
|
57
63
|
const REPLICATION_KEYS = new Set(['description', 'provenance', 'target', 'governing', 'observations']);
|
|
58
|
-
|
|
64
|
+
/** How many powers a study file's correction may list in all. @internal */
|
|
65
|
+
export const MAX_CORRECTION_TERMS = 6;
|
|
59
66
|
function refuse(where, why) {
|
|
60
67
|
throw new StudyRefusal(`study refused (${where}): ${why}`);
|
|
61
68
|
}
|
|
62
|
-
function isObject(v) {
|
|
63
|
-
return !!v && typeof v === 'object' && !Array.isArray(v);
|
|
64
|
-
}
|
|
65
69
|
function nonEmptyString(v) {
|
|
66
70
|
return typeof v === 'string' && v.trim().length > 0;
|
|
67
71
|
}
|
|
68
72
|
function quantity(raw, where) {
|
|
69
|
-
if (!
|
|
73
|
+
if (!isPlainObject(raw) || !nonEmptyString(raw.name) || typeof raw.unit !== 'string') {
|
|
70
74
|
refuse(where, 'needs {"name", "unit"} ("unit": "" for a dimensionless quantity)');
|
|
71
75
|
}
|
|
72
76
|
let parsed;
|
|
@@ -109,11 +113,11 @@ function governingQuantity(raw, where) {
|
|
|
109
113
|
return sigma === undefined ? q : { ...q, sigma: positiveSigma(sigma, q, `${where}.sigma`) };
|
|
110
114
|
}
|
|
111
115
|
function parseFamily(raw, governing, where) {
|
|
112
|
-
if (!
|
|
116
|
+
if (!isPlainObject(raw) || !nonEmptyString(raw.input) || !Array.isArray(raw.powers)) {
|
|
113
117
|
refuse(where, 'needs {"input": <dimensionless governing input>, "powers": [p, ...]}');
|
|
114
118
|
}
|
|
115
119
|
for (const k of Object.keys(raw)) {
|
|
116
|
-
if (k !== 'input' && k !== 'powers')
|
|
120
|
+
if (k !== 'input' && k !== 'powers' && k !== 'reference')
|
|
117
121
|
refuse(where, `undeclared key '${k}'`);
|
|
118
122
|
}
|
|
119
123
|
const q = governing.find((g) => g.name === raw.input);
|
|
@@ -131,7 +135,19 @@ function parseFamily(raw, governing, where) {
|
|
|
131
135
|
}
|
|
132
136
|
if (new Set(powers).size !== powers.length)
|
|
133
137
|
refuse(`${where}.powers`, 'must be distinct');
|
|
134
|
-
|
|
138
|
+
if (raw.reference === undefined)
|
|
139
|
+
return { input: q.name, powers };
|
|
140
|
+
if (!isPlainObject(raw.reference))
|
|
141
|
+
refuse(`${where}.reference`, 'must be {"<power>": number}, keyed by a declared power');
|
|
142
|
+
const reference = {};
|
|
143
|
+
for (const [k, v] of Object.entries(raw.reference)) {
|
|
144
|
+
if (!powers.some((p) => String(p) === k))
|
|
145
|
+
refuse(`${where}.reference`, `'${k}' is not a declared power of this family`);
|
|
146
|
+
if (typeof v !== 'number' || !Number.isFinite(v))
|
|
147
|
+
refuse(`${where}.reference`, `'${k}' must be a finite number`);
|
|
148
|
+
reference[k] = v;
|
|
149
|
+
}
|
|
150
|
+
return { input: q.name, powers, reference };
|
|
135
151
|
}
|
|
136
152
|
/** One family `{input, powers}`, or a list of them, each in a different dimensionless input. */
|
|
137
153
|
function parseCorrection(raw, governing) {
|
|
@@ -157,7 +173,7 @@ function parseCorrection(raw, governing) {
|
|
|
157
173
|
/** Provenance text compared without case, spacing or punctuation: "Lab A" and "lab-a" are one source. */
|
|
158
174
|
const provenanceKey = (s) => s.toLowerCase().replace(/[^\p{L}\p{N}]+/gu, ' ').trim();
|
|
159
175
|
function parseProvenance(raw) {
|
|
160
|
-
if (!
|
|
176
|
+
if (!isPlainObject(raw))
|
|
161
177
|
refuse('provenance', 'is required: {"synthetic": true|false, "source": "..."}');
|
|
162
178
|
if (typeof raw.synthetic !== 'boolean') {
|
|
163
179
|
refuse('provenance.synthetic', 'must be declared true or false; it is never inferred');
|
|
@@ -180,7 +196,7 @@ function parseBaselines(raw, target, governing) {
|
|
|
180
196
|
const checker = builtinFormulaDimensionChecker();
|
|
181
197
|
return raw.map((b, i) => {
|
|
182
198
|
const where = `baselines[${i}]`;
|
|
183
|
-
if (!
|
|
199
|
+
if (!isPlainObject(b) || !nonEmptyString(b.name) || !nonEmptyString(b.formula)) {
|
|
184
200
|
refuse(where, 'needs {"name", "formula"}');
|
|
185
201
|
}
|
|
186
202
|
let vars;
|
|
@@ -208,7 +224,7 @@ function parseBaselines(raw, target, governing) {
|
|
|
208
224
|
function parseDesign(raw, governing) {
|
|
209
225
|
if (raw === undefined)
|
|
210
226
|
return undefined;
|
|
211
|
-
if (!
|
|
227
|
+
if (!isPlainObject(raw) || !isPlainObject(raw.variables))
|
|
212
228
|
refuse('design', 'needs {"variables": {name: {"min", "max"}}}');
|
|
213
229
|
const byName = new Map(governing.map((g) => [g.name, g]));
|
|
214
230
|
const out = {};
|
|
@@ -217,7 +233,7 @@ function parseDesign(raw, governing) {
|
|
|
217
233
|
const where = `design.variables.${name}`;
|
|
218
234
|
if (!q)
|
|
219
235
|
refuse(where, 'is not a declared governing input');
|
|
220
|
-
if (!
|
|
236
|
+
if (!isPlainObject(spec))
|
|
221
237
|
refuse(where, 'needs {"min", "max"}');
|
|
222
238
|
const min = toSi(spec.min, q, `${where}.min`, 'absolute');
|
|
223
239
|
const max = toSi(spec.max, q, `${where}.max`, 'absolute');
|
|
@@ -235,9 +251,9 @@ function parseObservations(raw, provenance, target, governing, defaultSigma) {
|
|
|
235
251
|
refuse('observations', 'must be a non-empty array');
|
|
236
252
|
const ids = new Set();
|
|
237
253
|
const rows = raw.map((row, i) => {
|
|
238
|
-
const id =
|
|
254
|
+
const id = isPlainObject(row) && nonEmptyString(row.id) ? row.id : `row-${i + 1}`;
|
|
239
255
|
const where = `observation ${id}`;
|
|
240
|
-
if (!
|
|
256
|
+
if (!isPlainObject(row))
|
|
241
257
|
refuse(where, 'is not an object');
|
|
242
258
|
for (const k of Object.keys(row)) {
|
|
243
259
|
if (!ROW_KEYS.has(k))
|
|
@@ -249,7 +265,7 @@ function parseObservations(raw, provenance, target, governing, defaultSigma) {
|
|
|
249
265
|
if (row.role !== 'exploratory' && row.role !== 'holdout' && row.role !== 'replication') {
|
|
250
266
|
refuse(where, `role must be exploratory, holdout or replication (got '${String(row.role)}')`);
|
|
251
267
|
}
|
|
252
|
-
if (!
|
|
268
|
+
if (!isPlainObject(row.values))
|
|
253
269
|
refuse(where, 'needs "values": {input: value}');
|
|
254
270
|
for (const k of Object.keys(row.values)) {
|
|
255
271
|
if (!governing.some((g) => g.name === k))
|
|
@@ -269,7 +285,7 @@ function parseObservations(raw, provenance, target, governing, defaultSigma) {
|
|
|
269
285
|
refuse(where, 'has no uncertainty: give "sigma" on the row or on the target');
|
|
270
286
|
}
|
|
271
287
|
const sigma = positiveSigma(sigmaRaw, target, `${where} sigma`);
|
|
272
|
-
if (row.inputSigma !== undefined && !
|
|
288
|
+
if (row.inputSigma !== undefined && !isPlainObject(row.inputSigma))
|
|
273
289
|
refuse(where, '"inputSigma" must be {input: σ}');
|
|
274
290
|
const rowInputSigma = (row.inputSigma ?? {});
|
|
275
291
|
for (const k of Object.keys(rowInputSigma)) {
|
|
@@ -327,7 +343,7 @@ function guardLeakage(rows) {
|
|
|
327
343
|
}
|
|
328
344
|
/** Parse and validate a study file. Throws {@link StudyRefusal}. @internal */
|
|
329
345
|
export function parseStudy(raw, source = 'inline') {
|
|
330
|
-
if (!
|
|
346
|
+
if (!isPlainObject(raw))
|
|
331
347
|
refuse(source, 'is not a JSON object');
|
|
332
348
|
for (const k of Object.keys(raw)) {
|
|
333
349
|
if (!TOP_KEYS.has(k))
|
|
@@ -342,7 +358,7 @@ export function parseStudy(raw, source = 'inline') {
|
|
|
342
358
|
const names = [target.name, ...governing.map((g) => g.name)];
|
|
343
359
|
if (new Set(names).size !== names.length)
|
|
344
360
|
refuse('governing', 'names must be distinct from each other and from the target');
|
|
345
|
-
const gapRaw =
|
|
361
|
+
const gapRaw = isPlainObject(raw.gap) ? raw.gap : {};
|
|
346
362
|
const gap = {
|
|
347
363
|
id: nonEmptyString(gapRaw.id) ? gapRaw.id : 'fg-study',
|
|
348
364
|
kind: nonEmptyString(gapRaw.kind) ? gapRaw.kind : 'unexplained-observation',
|
|
@@ -352,7 +368,7 @@ export function parseStudy(raw, source = 'inline') {
|
|
|
352
368
|
refuse('gap.kind', `unknown gap kind '${gap.kind}'`);
|
|
353
369
|
let alpha = DEFAULT_ALPHA;
|
|
354
370
|
if (raw.criterion !== undefined) {
|
|
355
|
-
if (!
|
|
371
|
+
if (!isPlainObject(raw.criterion) || typeof raw.criterion.alpha !== 'number') {
|
|
356
372
|
refuse('criterion', 'needs {"alpha": number}');
|
|
357
373
|
}
|
|
358
374
|
alpha = raw.criterion.alpha;
|
|
@@ -379,18 +395,12 @@ export function parseStudy(raw, source = 'inline') {
|
|
|
379
395
|
}
|
|
380
396
|
/** Load a study JSON file. @internal */
|
|
381
397
|
export function loadStudyFromJson(path) {
|
|
382
|
-
return parseStudy(
|
|
398
|
+
return parseStudy(readJsonFile(path), path);
|
|
383
399
|
}
|
|
384
400
|
function readStudyRaw(path) {
|
|
385
|
-
const text = readFileSync(path, 'utf8');
|
|
386
401
|
if (/\.csv$/i.test(path))
|
|
387
|
-
return studyCsvToRaw(
|
|
388
|
-
|
|
389
|
-
return JSON.parse(text);
|
|
390
|
-
}
|
|
391
|
-
catch (e) {
|
|
392
|
-
throw e instanceof SyntaxError ? new SyntaxError(`${path}: ${e.message}`) : e;
|
|
393
|
-
}
|
|
402
|
+
return studyCsvToRaw(readFileSync(path, 'utf8'), path);
|
|
403
|
+
return readJsonFile(path);
|
|
394
404
|
}
|
|
395
405
|
/**
|
|
396
406
|
* Load a study file (`.csv`, else JSON) and, optionally, a separate
|
|
@@ -412,7 +422,7 @@ const sameDim = (a, b) => a.name === b.name && equals(a.dim, b.dim);
|
|
|
412
422
|
* @internal
|
|
413
423
|
*/
|
|
414
424
|
export function attachReplication(study, raw, source) {
|
|
415
|
-
if (!
|
|
425
|
+
if (!isPlainObject(raw))
|
|
416
426
|
refuse(source, 'is not a JSON object');
|
|
417
427
|
for (const k of Object.keys(raw)) {
|
|
418
428
|
if (!REPLICATION_KEYS.has(k)) {
|
|
@@ -469,23 +479,31 @@ function closeness(chi2, dof, alpha) {
|
|
|
469
479
|
const pLower = chiSquareCdf(chi2, dof);
|
|
470
480
|
return { chi2, dof, pLower, flagged: pLower < alpha / 2 };
|
|
471
481
|
}
|
|
472
|
-
/**
|
|
482
|
+
/**
|
|
483
|
+
* Weighted straight line y = a + b·x with the effective variance σ_y² + b²σ_x², iterated from b = 1.
|
|
484
|
+
* The weighted sums are core `pairwiseDot` and `pairwiseSum` (the stable sums), not a `reduce`.
|
|
485
|
+
*/
|
|
473
486
|
function affineFit(pts) {
|
|
474
487
|
let b = 1;
|
|
475
488
|
let a = 0;
|
|
489
|
+
const xs = pts.map((p) => p.x);
|
|
490
|
+
const ys = pts.map((p) => p.y);
|
|
491
|
+
const variance = (slope) => pts.map((p) => p.sy ** 2 + slope * slope * p.sx ** 2);
|
|
476
492
|
for (let it = 0; it < 6; it++) {
|
|
477
|
-
const w =
|
|
478
|
-
const W = w
|
|
479
|
-
const xm =
|
|
480
|
-
const ym =
|
|
481
|
-
const
|
|
482
|
-
const
|
|
493
|
+
const w = variance(b).map((v) => 1 / v);
|
|
494
|
+
const W = pairwiseSum(w);
|
|
495
|
+
const xm = pairwiseDot(w, xs) / W;
|
|
496
|
+
const ym = pairwiseDot(w, ys) / W;
|
|
497
|
+
const dx = xs.map((x) => x - xm);
|
|
498
|
+
const sxx = pairwiseDot(w, dx.map((d) => d * d));
|
|
499
|
+
const sxy = pairwiseDot(w, dx.map((d, i) => d * (ys[i] - ym)));
|
|
483
500
|
if (!(sxx > 0) || !Number.isFinite(sxy))
|
|
484
501
|
return null;
|
|
485
502
|
b = sxy / sxx;
|
|
486
503
|
a = ym - b * xm;
|
|
487
504
|
}
|
|
488
|
-
const
|
|
505
|
+
const v = variance(b);
|
|
506
|
+
const chi2 = pairwiseSum(pts.map((p, i) => (p.y - a - b * p.x) ** 2 / v[i]));
|
|
489
507
|
return Number.isFinite(chi2) ? { a, b, chi2 } : null;
|
|
490
508
|
}
|
|
491
509
|
/**
|
|
@@ -594,7 +612,7 @@ function setPath(obj, path, value, where) {
|
|
|
594
612
|
for (const k of path.slice(0, -1)) {
|
|
595
613
|
if (at[k] === undefined)
|
|
596
614
|
at[k] = {};
|
|
597
|
-
if (!
|
|
615
|
+
if (!isPlainObject(at[k]))
|
|
598
616
|
refuse(where, `'${k}' is already set to a value`);
|
|
599
617
|
at = at[k];
|
|
600
618
|
}
|
|
@@ -630,7 +648,9 @@ export function studyCsvToRaw(text, source = 'inline.csv') {
|
|
|
630
648
|
const m = /^\s*#\s*([A-Za-z_][\w.()-]*)\s*:\s?(.*)$/.exec(l);
|
|
631
649
|
if (!m)
|
|
632
650
|
refuse(where, "a declaration is '# key: value'");
|
|
633
|
-
|
|
651
|
+
// Both groups are unconditional in the pattern, so a match carries them.
|
|
652
|
+
const key = m[1];
|
|
653
|
+
const valueText = m[2];
|
|
634
654
|
const value = declValue(valueText.trim());
|
|
635
655
|
const path = key.split('.');
|
|
636
656
|
if (key === 'target') {
|
|
@@ -700,13 +720,13 @@ export function studyCsvToRaw(text, source = 'inline.csv') {
|
|
|
700
720
|
if (!governing.some((g) => g.name === k))
|
|
701
721
|
refuse(`${source} governing.${k}.sigma`, `'${k}' is not a governing input column`);
|
|
702
722
|
}
|
|
703
|
-
if (
|
|
723
|
+
if (isPlainObject(raw.target)) {
|
|
704
724
|
for (const k of Object.keys(raw.target)) {
|
|
705
725
|
if (k !== 'sigma')
|
|
706
726
|
refuse(`${source} target.${k}`, "the target's name and unit come from its column; only 'target.sigma' is declared");
|
|
707
727
|
}
|
|
708
728
|
}
|
|
709
|
-
raw.target = { name: targetCol.name, unit: targetCol.unit, ...(
|
|
729
|
+
raw.target = { name: targetCol.name, unit: targetCol.unit, ...(isPlainObject(raw.target) ? raw.target : {}) };
|
|
710
730
|
raw.governing = governing.map((g) => ({
|
|
711
731
|
name: g.name,
|
|
712
732
|
unit: g.unit,
|
|
@@ -742,64 +762,23 @@ export function studyCsvToRaw(text, source = 'inline.csv') {
|
|
|
742
762
|
});
|
|
743
763
|
return raw;
|
|
744
764
|
}
|
|
745
|
-
// --- χ² survival
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
x += LANCZOS[i] / (zz + i);
|
|
757
|
-
const t = zz + 7.5;
|
|
758
|
-
return 0.5 * Math.log(2 * Math.PI) + (zz + 0.5) * Math.log(t) - t + Math.log(x);
|
|
759
|
-
}
|
|
760
|
-
/** The series for the regularized lower incomplete gamma P(a, x); converges fast for x < a + 1. */
|
|
761
|
-
function gammaSeries(a, x) {
|
|
762
|
-
const front = Math.exp(-x + a * Math.log(x) - lnGamma(a));
|
|
763
|
-
let ap = a;
|
|
764
|
-
let del = 1 / a;
|
|
765
|
-
let sum = del;
|
|
766
|
-
for (let n = 0; n < 1000; n++) {
|
|
767
|
-
ap += 1;
|
|
768
|
-
del *= x / ap;
|
|
769
|
-
sum += del;
|
|
770
|
-
if (Math.abs(del) < Math.abs(sum) * 1e-16)
|
|
771
|
-
break;
|
|
772
|
-
}
|
|
773
|
-
return sum * front;
|
|
765
|
+
// --- χ² and F survival functions ------------------------------------------
|
|
766
|
+
//
|
|
767
|
+
// MathTS carries the regularized lower incomplete gamma `gammainc` (the
|
|
768
|
+
// series for x < a + 1, else 1 − Q by continued fraction), the upper one
|
|
769
|
+
// `gammaincp` (from `@danielsimonjr/mathts-functions` 0.68.3 the modified
|
|
770
|
+
// Lentz continued fraction for x ≥ a + 1, computed directly; before that it
|
|
771
|
+
// was `1 − gammainc`, which rounded a far upper tail to 0, and the χ² p-value
|
|
772
|
+
// of a bad fit IS that tail) and the regularized incomplete beta `betainc`.
|
|
773
|
+
/** Regularized lower incomplete gamma P(a, x), MathTS `gammainc`. */
|
|
774
|
+
function gammaP(a, x) {
|
|
775
|
+
return numberFrom('gammainc', gammainc(a, x));
|
|
774
776
|
}
|
|
775
|
-
/** Regularized upper incomplete gamma Q(a, x). */
|
|
777
|
+
/** Regularized upper incomplete gamma Q(a, x), MathTS `gammaincp` (direct in the upper tail). */
|
|
776
778
|
function gammaQ(a, x) {
|
|
777
779
|
if (x <= 0)
|
|
778
780
|
return 1;
|
|
779
|
-
|
|
780
|
-
return Math.max(0, 1 - gammaSeries(a, x));
|
|
781
|
-
const front = Math.exp(-x + a * Math.log(x) - lnGamma(a));
|
|
782
|
-
const tiny = 1e-300;
|
|
783
|
-
let b = x + 1 - a;
|
|
784
|
-
let c = 1 / tiny;
|
|
785
|
-
let d = 1 / b;
|
|
786
|
-
let h = d;
|
|
787
|
-
for (let i = 1; i < 1000; i++) {
|
|
788
|
-
const an = -i * (i - a);
|
|
789
|
-
b += 2;
|
|
790
|
-
d = an * d + b;
|
|
791
|
-
if (Math.abs(d) < tiny)
|
|
792
|
-
d = tiny;
|
|
793
|
-
c = b + an / c;
|
|
794
|
-
if (Math.abs(c) < tiny)
|
|
795
|
-
c = tiny;
|
|
796
|
-
d = 1 / d;
|
|
797
|
-
const del = d * c;
|
|
798
|
-
h *= del;
|
|
799
|
-
if (Math.abs(del - 1) < 1e-16)
|
|
800
|
-
break;
|
|
801
|
-
}
|
|
802
|
-
return front * h;
|
|
781
|
+
return numberFrom('gammaincp', gammaincp(a, x));
|
|
803
782
|
}
|
|
804
783
|
/** P(χ²_ν ≥ chi2): the probability of a χ² at least this large if the model and σ are right. @internal */
|
|
805
784
|
export function chiSquareSurvival(chi2, dof) {
|
|
@@ -810,8 +789,8 @@ export function chiSquareSurvival(chi2, dof) {
|
|
|
810
789
|
return gammaQ(dof / 2, chi2 / 2);
|
|
811
790
|
}
|
|
812
791
|
/**
|
|
813
|
-
* P(χ²_ν ≤ chi2), computed directly in the lower tail
|
|
814
|
-
* round a small probability away. @internal
|
|
792
|
+
* P(χ²_ν ≤ chi2), computed directly in the lower tail (MathTS `gammainc` is
|
|
793
|
+
* the series there), where 1 − Q would round a small probability away. @internal
|
|
815
794
|
*/
|
|
816
795
|
export function chiSquareCdf(chi2, dof) {
|
|
817
796
|
if (!(dof > 0))
|
|
@@ -820,51 +799,15 @@ export function chiSquareCdf(chi2, dof) {
|
|
|
820
799
|
return 0;
|
|
821
800
|
const a = dof / 2;
|
|
822
801
|
const x = chi2 / 2;
|
|
823
|
-
return x < a + 1 ? Math.min(1,
|
|
824
|
-
}
|
|
825
|
-
/** Continued fraction for the incomplete beta function (modified Lentz). */
|
|
826
|
-
function betaCf(a, b, x) {
|
|
827
|
-
const tiny = 1e-300;
|
|
828
|
-
let c = 1;
|
|
829
|
-
let d = 1 - ((a + b) * x) / (a + 1);
|
|
830
|
-
if (Math.abs(d) < tiny)
|
|
831
|
-
d = tiny;
|
|
832
|
-
d = 1 / d;
|
|
833
|
-
let h = d;
|
|
834
|
-
for (let m = 1; m < 1000; m++) {
|
|
835
|
-
const m2 = 2 * m;
|
|
836
|
-
let aa = (m * (b - m) * x) / ((a + m2 - 1) * (a + m2));
|
|
837
|
-
d = 1 + aa * d;
|
|
838
|
-
if (Math.abs(d) < tiny)
|
|
839
|
-
d = tiny;
|
|
840
|
-
c = 1 + aa / c;
|
|
841
|
-
if (Math.abs(c) < tiny)
|
|
842
|
-
c = tiny;
|
|
843
|
-
d = 1 / d;
|
|
844
|
-
h *= d * c;
|
|
845
|
-
aa = (-(a + m) * (a + b + m) * x) / ((a + m2) * (a + m2 + 1));
|
|
846
|
-
d = 1 + aa * d;
|
|
847
|
-
if (Math.abs(d) < tiny)
|
|
848
|
-
d = tiny;
|
|
849
|
-
c = 1 + aa / c;
|
|
850
|
-
if (Math.abs(c) < tiny)
|
|
851
|
-
c = tiny;
|
|
852
|
-
d = 1 / d;
|
|
853
|
-
const del = d * c;
|
|
854
|
-
h *= del;
|
|
855
|
-
if (Math.abs(del - 1) < 1e-16)
|
|
856
|
-
break;
|
|
857
|
-
}
|
|
858
|
-
return h;
|
|
802
|
+
return x < a + 1 ? Math.min(1, gammaP(a, x)) : 1 - gammaQ(a, x);
|
|
859
803
|
}
|
|
860
|
-
/** Regularized incomplete beta I_x(a, b)
|
|
804
|
+
/** Regularized incomplete beta I_x(a, b), MathTS `betainc`. */
|
|
861
805
|
function betaI(a, b, x) {
|
|
862
806
|
if (x <= 0)
|
|
863
807
|
return 0;
|
|
864
808
|
if (x >= 1)
|
|
865
809
|
return 1;
|
|
866
|
-
|
|
867
|
-
return x < (a + 1) / (a + b + 2) ? (front * betaCf(a, b, x)) / a : 1 - (front * betaCf(b, a, 1 - x)) / b;
|
|
810
|
+
return numberFrom('betainc', betainc(a, b, x));
|
|
868
811
|
}
|
|
869
812
|
/** P(F_{d1,d2} ≥ f): the probability of an F ratio at least this large if the extra terms explain nothing. @internal */
|
|
870
813
|
export function fSurvival(f, d1, d2) {
|
|
@@ -878,22 +821,58 @@ export function fSurvival(f, d1, d2) {
|
|
|
878
821
|
}
|
|
879
822
|
/**
|
|
880
823
|
* The effective σ of one row under a model f: σ_eff² = σ_y² + Σ_i (∂f/∂x_i · σ_xi)²
|
|
881
|
-
* over the inputs with a σ,
|
|
882
|
-
*
|
|
824
|
+
* over the inputs with a σ, the GUM first-order propagation of MathTS
|
|
825
|
+
* `propagateUncertainty` (the one uncertainty path of the library, as in
|
|
826
|
+
* `composition/uncertainty.ts`), each partial a central difference with the
|
|
827
|
+
* relative step 1e-6·|x_i| at the recorded inputs. An input that is exactly
|
|
828
|
+
* zero has no relative step, so it is passed to MathTS shifted by
|
|
829
|
+
* c = 1e3·σ_xi and read back as z − c inside the model: the derivative is
|
|
830
|
+
* unchanged and the step is 1e-6·c = 1e-3·σ_xi, the floor the hand-coded
|
|
831
|
+
* difference used before. First order in σ_x: exact for f linear in x_i.
|
|
883
832
|
*
|
|
884
833
|
* @internal
|
|
885
834
|
*/
|
|
886
835
|
export function effectiveSigma(r, predict) {
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
836
|
+
const names = Object.keys(r.inputSigma);
|
|
837
|
+
if (names.length === 0)
|
|
838
|
+
return r.sigma;
|
|
839
|
+
const values = {};
|
|
840
|
+
const shift = {};
|
|
841
|
+
for (const name of names) {
|
|
842
|
+
const x = r.inputs[name] ?? NaN;
|
|
843
|
+
shift[name] = x === 0 ? 1e3 * r.inputSigma[name] : 0;
|
|
844
|
+
values[name] = x + shift[name];
|
|
845
|
+
}
|
|
846
|
+
const unshifted = (v) => {
|
|
847
|
+
const inputs = { ...r.inputs };
|
|
848
|
+
for (const name of names)
|
|
849
|
+
inputs[name] = v[name] - shift[name];
|
|
850
|
+
return inputs;
|
|
851
|
+
};
|
|
852
|
+
const notFinite = (name) => new RangeError(`the model's slope in ${name} is not finite on row ${r.id}`);
|
|
853
|
+
// MathTS varies one input at a time; the input being varied when the model is not finite is
|
|
854
|
+
// the one to name, read from the stencil point itself rather than from MathTS's message.
|
|
855
|
+
let culprit = null;
|
|
856
|
+
const model = (v) => {
|
|
857
|
+
const y = predict(unshifted(v));
|
|
858
|
+
if (!Number.isFinite(y) && culprit === null)
|
|
859
|
+
culprit = names.find((name) => v[name] !== values[name]) ?? names[0];
|
|
860
|
+
return y;
|
|
861
|
+
};
|
|
862
|
+
let u;
|
|
863
|
+
try {
|
|
864
|
+
u = propagateUncertainty(model, values, r.inputSigma, { relativeStep: 1e-6 });
|
|
865
|
+
}
|
|
866
|
+
catch (e) {
|
|
867
|
+
if (culprit !== null)
|
|
868
|
+
throw notFinite(culprit);
|
|
869
|
+
throw e;
|
|
870
|
+
}
|
|
871
|
+
for (const name of names) {
|
|
872
|
+
if (!Number.isFinite(u.partials[name]))
|
|
873
|
+
throw notFinite(name);
|
|
874
|
+
}
|
|
875
|
+
return Math.hypot(r.sigma, u.sigma);
|
|
897
876
|
}
|
|
898
877
|
const hasInputSigma = (rows) => rows.some((r) => Object.keys(r.inputSigma).length > 0);
|
|
899
878
|
function testRows(rows, predict, fitted, alpha) {
|
|
@@ -915,7 +894,42 @@ function testRows(rows, predict, fitted, alpha) {
|
|
|
915
894
|
return { n: rows.length, chi2, dof, p, maxAbsZ, worstRow, pass: p === null ? null : p >= alpha };
|
|
916
895
|
}
|
|
917
896
|
const combine = (basis, coef) => (x) => basis.reduce((s, b, j) => s + coef[j] * b(x), 0);
|
|
918
|
-
/**
|
|
897
|
+
/**
|
|
898
|
+
* The inverse of the equilibrated normal matrix B (k×k, unit diagonal), MathTS `inv`,
|
|
899
|
+
* unscaled back to the covariance of the coefficients: Σ = S⁻¹ B⁻¹ S⁻¹. Null when
|
|
900
|
+
* MathTS refuses the inverse or returns something other than a k×k number matrix.
|
|
901
|
+
*/
|
|
902
|
+
function covarianceOf(B, s) {
|
|
903
|
+
let raw;
|
|
904
|
+
try {
|
|
905
|
+
raw = inv(B.map((row) => [...row]));
|
|
906
|
+
}
|
|
907
|
+
catch {
|
|
908
|
+
return null;
|
|
909
|
+
}
|
|
910
|
+
const k = s.length;
|
|
911
|
+
if (!Array.isArray(raw) || raw.length !== k)
|
|
912
|
+
return null;
|
|
913
|
+
const out = [];
|
|
914
|
+
for (let a = 0; a < k; a++) {
|
|
915
|
+
const row = raw[a];
|
|
916
|
+
if (!Array.isArray(row) || row.length !== k)
|
|
917
|
+
return null;
|
|
918
|
+
const unscaled = [];
|
|
919
|
+
for (let b = 0; b < k; b++) {
|
|
920
|
+
const v = row[b];
|
|
921
|
+
if (typeof v !== 'number' || !Number.isFinite(v))
|
|
922
|
+
return null;
|
|
923
|
+
unscaled.push(v / (s[a] * s[b]));
|
|
924
|
+
}
|
|
925
|
+
out.push(unscaled);
|
|
926
|
+
}
|
|
927
|
+
return out;
|
|
928
|
+
}
|
|
929
|
+
/**
|
|
930
|
+
* Solve the weighted normal equations for y ≈ Σ a_j·φ_j; null when they are singular.
|
|
931
|
+
* The covariance of the solution is the inverse of the same (equilibrated) matrix.
|
|
932
|
+
*/
|
|
919
933
|
function solveWeighted(phi, y, sigma) {
|
|
920
934
|
const k = phi[0]?.length ?? 0;
|
|
921
935
|
const A = Array.from({ length: k }, () => new Array(k + 1).fill(0));
|
|
@@ -927,8 +941,10 @@ function solveWeighted(phi, y, sigma) {
|
|
|
927
941
|
A[a][k] += w * f[a] * y[i];
|
|
928
942
|
}
|
|
929
943
|
});
|
|
930
|
-
if (k === 1)
|
|
931
|
-
|
|
944
|
+
if (k === 1) {
|
|
945
|
+
const a00 = A[0][0];
|
|
946
|
+
return a00 > 0 ? { coef: [A[0][1] / a00], covariance: [[1 / a00]] } : null;
|
|
947
|
+
}
|
|
932
948
|
// Equilibrate so the pivot test is scale-free, then eliminate with partial pivoting.
|
|
933
949
|
const s = A.map((row, a) => Math.sqrt(row[a]));
|
|
934
950
|
if (!s.every((v) => v > 0))
|
|
@@ -938,6 +954,7 @@ function solveWeighted(phi, y, sigma) {
|
|
|
938
954
|
A[a][b] /= s[a] * s[b];
|
|
939
955
|
A[a][k] /= s[a];
|
|
940
956
|
}
|
|
957
|
+
const covariance = covarianceOf(A.map((row) => row.slice(0, k)), s);
|
|
941
958
|
for (let c = 0; c < k; c++) {
|
|
942
959
|
let p = c;
|
|
943
960
|
for (let r = c + 1; r < k; r++)
|
|
@@ -954,13 +971,14 @@ function solveWeighted(phi, y, sigma) {
|
|
|
954
971
|
A[r][q] -= m * A[c][q];
|
|
955
972
|
}
|
|
956
973
|
}
|
|
957
|
-
return A.map((row, a) => row[k] / row[a] / s[a]);
|
|
974
|
+
return { coef: A.map((row, a) => row[k] / row[a] / s[a]), covariance };
|
|
958
975
|
}
|
|
959
976
|
const EV_ROUNDS = 50;
|
|
960
977
|
/**
|
|
961
978
|
* Weighted least squares y ≈ Σ a_j·φ_j(x), from the exploratory rows only.
|
|
962
979
|
* With input σ the weights are 1/σ_eff² of the current fit, iterated to a
|
|
963
|
-
* fixed point (the effective-variance method)
|
|
980
|
+
* fixed point (the effective-variance method); the covariance is that of the
|
|
981
|
+
* last solve, with the fixed-point weights.
|
|
964
982
|
*/
|
|
965
983
|
function fitLinear(rows, basis) {
|
|
966
984
|
const phi = rows.map((r) => basis.map((b) => {
|
|
@@ -970,20 +988,21 @@ function fitLinear(rows, basis) {
|
|
|
970
988
|
return f;
|
|
971
989
|
}));
|
|
972
990
|
const y = rows.map((r) => r.observed);
|
|
973
|
-
let
|
|
991
|
+
let sol = solveWeighted(phi, y, rows.map((r) => r.sigma));
|
|
974
992
|
if (!hasInputSigma(rows))
|
|
975
|
-
return
|
|
976
|
-
for (let round = 0;
|
|
993
|
+
return sol;
|
|
994
|
+
for (let round = 0; sol !== null && round < EV_ROUNDS; round++) {
|
|
995
|
+
const coef = sol.coef;
|
|
977
996
|
const predict = combine(basis, coef);
|
|
978
997
|
const next = solveWeighted(phi, y, rows.map((r) => effectiveSigma(r, predict)));
|
|
979
998
|
if (next === null)
|
|
980
999
|
return null;
|
|
981
|
-
const settled = next.every((a, j) => Math.abs(a - coef[j]) <= 1e-13 * Math.max(Math.abs(a), 1e-300));
|
|
982
|
-
|
|
1000
|
+
const settled = next.coef.every((a, j) => Math.abs(a - coef[j]) <= 1e-13 * Math.max(Math.abs(a), 1e-300));
|
|
1001
|
+
sol = next;
|
|
983
1002
|
if (settled)
|
|
984
1003
|
break;
|
|
985
1004
|
}
|
|
986
|
-
return
|
|
1005
|
+
return sol;
|
|
987
1006
|
}
|
|
988
1007
|
function split(study) {
|
|
989
1008
|
return {
|
|
@@ -1000,19 +1019,22 @@ function scoreModel(spec, sets, alpha, withheld) {
|
|
|
1000
1019
|
const { id, kind, label } = spec;
|
|
1001
1020
|
const k = spec.fit ? spec.basis.length : 0;
|
|
1002
1021
|
const failed = (error) => ({
|
|
1003
|
-
test: { id, kind, label, fittedParameters: k, prefactor: null, exploratory: null, holdout: null, replication: null, error },
|
|
1022
|
+
test: { id, kind, label, fittedParameters: k, prefactor: null, prefactorStderr: null, exploratory: null, holdout: null, replication: null, error },
|
|
1004
1023
|
predict: null,
|
|
1005
1024
|
coef: null,
|
|
1025
|
+
covariance: null,
|
|
1006
1026
|
});
|
|
1007
1027
|
try {
|
|
1008
|
-
const
|
|
1009
|
-
if (
|
|
1028
|
+
const sol = spec.fit ? fitLinear(sets.exploratory, spec.basis) : { coef: [1], covariance: null };
|
|
1029
|
+
if (sol === null) {
|
|
1010
1030
|
return failed(k === 1
|
|
1011
1031
|
? 'model is zero on every exploratory row; no scale can be fit'
|
|
1012
1032
|
: 'the model\'s terms are degenerate on the exploratory rows; they cannot be fit');
|
|
1013
1033
|
}
|
|
1034
|
+
const { coef, covariance } = sol;
|
|
1014
1035
|
const predict = combine(spec.basis, coef);
|
|
1015
1036
|
const on = (rows) => (withheld && rows.length > 0 ? testRows(rows, predict, 0, alpha) : null);
|
|
1037
|
+
const v00 = covariance?.[0]?.[0];
|
|
1016
1038
|
return {
|
|
1017
1039
|
test: {
|
|
1018
1040
|
id,
|
|
@@ -1020,12 +1042,14 @@ function scoreModel(spec, sets, alpha, withheld) {
|
|
|
1020
1042
|
label,
|
|
1021
1043
|
fittedParameters: k,
|
|
1022
1044
|
prefactor: coef[0],
|
|
1045
|
+
prefactorStderr: v00 !== undefined && v00 >= 0 ? Math.sqrt(v00) : null,
|
|
1023
1046
|
exploratory: sets.exploratory.length > 0 ? testRows(sets.exploratory, predict, k, alpha) : null,
|
|
1024
1047
|
holdout: on(sets.holdout),
|
|
1025
1048
|
replication: on(sets.replication),
|
|
1026
1049
|
},
|
|
1027
1050
|
predict,
|
|
1028
1051
|
coef,
|
|
1052
|
+
covariance,
|
|
1029
1053
|
};
|
|
1030
1054
|
}
|
|
1031
1055
|
catch (e) {
|
|
@@ -1048,8 +1072,8 @@ function correctionBasis(shape, terms) {
|
|
|
1048
1072
|
function admitCorrection(shape, families, rows, alpha) {
|
|
1049
1073
|
const chi2With = (terms) => {
|
|
1050
1074
|
const basis = correctionBasis(shape, terms);
|
|
1051
|
-
const
|
|
1052
|
-
return
|
|
1075
|
+
const sol = fitLinear(rows, basis);
|
|
1076
|
+
return sol === null ? null : testRows(rows, combine(basis, sol.coef), terms.length + 1, alpha).chi2;
|
|
1053
1077
|
};
|
|
1054
1078
|
const steps = [];
|
|
1055
1079
|
const admitted = [];
|
|
@@ -1058,23 +1082,25 @@ function admitCorrection(shape, families, rows, alpha) {
|
|
|
1058
1082
|
for (const power of family.powers) {
|
|
1059
1083
|
if (prev === null)
|
|
1060
1084
|
break families;
|
|
1061
|
-
const
|
|
1085
|
+
const reference = family.reference?.[String(power)];
|
|
1086
|
+
const term = { input: family.input, power, ...(reference !== undefined ? { reference } : {}) };
|
|
1062
1087
|
const trial = [...admitted, term];
|
|
1063
1088
|
const dof = rows.length - (trial.length + 1);
|
|
1064
1089
|
if (dof < 1) {
|
|
1065
|
-
steps.push({
|
|
1090
|
+
steps.push({ input: term.input, power: term.power, F: null, dof, p: null, admitted: false, reason: 'ν < 1: too few exploratory rows to test another term' });
|
|
1066
1091
|
break families;
|
|
1067
1092
|
}
|
|
1068
1093
|
const cur = chi2With(trial);
|
|
1069
1094
|
if (cur === null) {
|
|
1070
|
-
steps.push({
|
|
1095
|
+
steps.push({ input: term.input, power: term.power, F: null, dof, p: null, admitted: false, reason: 'degenerate with the terms before it on the exploratory rows' });
|
|
1071
1096
|
break;
|
|
1072
1097
|
}
|
|
1073
1098
|
const F = cur > 0 ? Math.max(0, prev - cur) / (cur / dof) : Infinity;
|
|
1074
1099
|
const p = fSurvival(F, 1, dof);
|
|
1075
1100
|
const ok = p < alpha;
|
|
1076
1101
|
steps.push({
|
|
1077
|
-
|
|
1102
|
+
input: term.input,
|
|
1103
|
+
power: term.power,
|
|
1078
1104
|
F,
|
|
1079
1105
|
dof,
|
|
1080
1106
|
p,
|
|
@@ -1090,7 +1116,7 @@ function admitCorrection(shape, families, rows, alpha) {
|
|
|
1090
1116
|
return { terms: admitted, steps };
|
|
1091
1117
|
}
|
|
1092
1118
|
/** Infix rendering of a scalar ExprNode for reports. */
|
|
1093
|
-
|
|
1119
|
+
function exprToInfix(e) {
|
|
1094
1120
|
if (e.kind === 'symbol')
|
|
1095
1121
|
return e.name;
|
|
1096
1122
|
if (e.kind === 'op') {
|
|
@@ -1125,9 +1151,10 @@ function credibility(t, nullTest, alpha) {
|
|
|
1125
1151
|
function designAgainst(study, sets, candidate, baselines) {
|
|
1126
1152
|
if (!candidate.predict)
|
|
1127
1153
|
return { abstained: true, reason: 'no credible candidate to discriminate' };
|
|
1128
|
-
const
|
|
1129
|
-
|
|
1130
|
-
|
|
1154
|
+
const predict = candidate.predict;
|
|
1155
|
+
// A live competitor has a predictor and passed on the exploratory rows; the guard types both.
|
|
1156
|
+
const isLive = (b) => b.predict !== null && b.test.exploratory?.pass === true;
|
|
1157
|
+
const live = baselines.filter(isLive).sort((a, b) => (b.test.exploratory.p ?? 0) - (a.test.exploratory.p ?? 0));
|
|
1131
1158
|
const best = live[0];
|
|
1132
1159
|
if (!best) {
|
|
1133
1160
|
return {
|
|
@@ -1156,7 +1183,7 @@ function designAgainst(study, sets, candidate, baselines) {
|
|
|
1156
1183
|
study.governing.forEach((g, i) => (point[g.name] = grids[i][idx[i]]));
|
|
1157
1184
|
let disc;
|
|
1158
1185
|
try {
|
|
1159
|
-
disc = Math.abs(
|
|
1186
|
+
disc = Math.abs(predict(point) - best.predict(point)) / sigma;
|
|
1160
1187
|
}
|
|
1161
1188
|
catch {
|
|
1162
1189
|
return;
|
|
@@ -1176,7 +1203,8 @@ function designAgainst(study, sets, candidate, baselines) {
|
|
|
1176
1203
|
if (bestPoint === null)
|
|
1177
1204
|
return { abstained: true, reason: 'neither model is finite anywhere in the design bounds' };
|
|
1178
1205
|
const chosen = bestPoint;
|
|
1179
|
-
|
|
1206
|
+
// A reduce, not a spread: a spread of a large row set overflows the call stack.
|
|
1207
|
+
const maxEx = sets.exploratory.reduce((m, r) => Math.max(m, Math.abs(predict(r.inputs) - best.predict(r.inputs)) / r.sigma), 0);
|
|
1180
1208
|
return {
|
|
1181
1209
|
abstained: false,
|
|
1182
1210
|
against: best.test.label,
|
|
@@ -1250,17 +1278,39 @@ export async function runProbeStudy(study, opts = {}) {
|
|
|
1250
1278
|
},
|
|
1251
1279
|
];
|
|
1252
1280
|
});
|
|
1253
|
-
const correctionOf = (s, coef) =>
|
|
1254
|
-
|
|
1281
|
+
const correctionOf = (s, coef, covariance) => {
|
|
1282
|
+
if (!('correction' in s) || !s.correction || !coef)
|
|
1283
|
+
return {};
|
|
1284
|
+
const a0 = coef[0];
|
|
1285
|
+
return {
|
|
1255
1286
|
correction: {
|
|
1256
1287
|
base: s.correction.base,
|
|
1257
|
-
terms: s.correction.terms.map((t, j) =>
|
|
1288
|
+
terms: s.correction.terms.map((t, j) => {
|
|
1289
|
+
const a = coef[j + 1];
|
|
1290
|
+
const coefficient = a / a0;
|
|
1291
|
+
// Delta method on c = a/a₀: Var(c) = Var(a)/a₀² + a²Var(a₀)/a₀⁴ − 2a·Cov(a, a₀)/a₀³.
|
|
1292
|
+
const cov = covariance;
|
|
1293
|
+
const variance = cov
|
|
1294
|
+
? cov[j + 1][j + 1] / a0 ** 2 + (a * a * cov[0][0]) / a0 ** 4 - (2 * a * cov[j + 1][0]) / a0 ** 3
|
|
1295
|
+
: null;
|
|
1296
|
+
const stderr = variance !== null && Number.isFinite(variance) ? Math.sqrt(Math.max(0, variance)) : null;
|
|
1297
|
+
const reference = t.reference;
|
|
1298
|
+
const z = reference !== undefined && stderr !== null && stderr > 0 ? (coefficient - reference) / stderr : undefined;
|
|
1299
|
+
return {
|
|
1300
|
+
input: t.input,
|
|
1301
|
+
power: t.power,
|
|
1302
|
+
coefficient,
|
|
1303
|
+
stderr,
|
|
1304
|
+
...(reference !== undefined ? { reference } : {}),
|
|
1305
|
+
...(z !== undefined ? { z } : {}),
|
|
1306
|
+
};
|
|
1307
|
+
}),
|
|
1258
1308
|
},
|
|
1259
|
-
}
|
|
1260
|
-
|
|
1309
|
+
};
|
|
1310
|
+
};
|
|
1261
1311
|
const scored = specs.map((s) => {
|
|
1262
1312
|
const m = scoreModel(s.spec, sets, alpha, false);
|
|
1263
|
-
return { model: m, spec: s.spec, complexity: s.complexity, extra: correctionOf(s, m.coef), ...credibility(m.test, nullModel, alpha) };
|
|
1313
|
+
return { model: m, spec: s.spec, complexity: s.complexity, extra: correctionOf(s, m.coef, m.covariance), ...credibility(m.test, nullModel, alpha) };
|
|
1264
1314
|
});
|
|
1265
1315
|
const credibleOnes = scored
|
|
1266
1316
|
.filter((s) => s.credible)
|
|
@@ -1460,11 +1510,18 @@ export function formatProbeStudy(r) {
|
|
|
1460
1510
|
}
|
|
1461
1511
|
L.push(` null model (constant ${r.target.name}) — ${setLine('exploratory', r.nullModel.exploratory)}`);
|
|
1462
1512
|
L.push('');
|
|
1513
|
+
const pm = (stderr) => (stderr === null ? '' : ` ± ${stderr.toPrecision(2)}`);
|
|
1463
1514
|
for (const c of r.candidates) {
|
|
1464
|
-
const pre = c.prefactor === null ? '' : `, ĉ = ${c.prefactor.toPrecision(5)} (SI)`;
|
|
1515
|
+
const pre = c.prefactor === null ? '' : `, ĉ = ${c.prefactor.toPrecision(5)}${pm(c.prefactorStderr)} (SI)`;
|
|
1465
1516
|
L.push(` candidate ${c.id}: ${c.label}${pre}`);
|
|
1466
1517
|
if (c.correction) {
|
|
1467
|
-
|
|
1518
|
+
const term = (t, j) => {
|
|
1519
|
+
const against = t.z !== undefined && t.reference !== undefined
|
|
1520
|
+
? ` (z = ${t.z >= 0 ? '+' : ''}${t.z.toFixed(1)} against the declared ${Number(t.reference.toPrecision(4))})`
|
|
1521
|
+
: '';
|
|
1522
|
+
return `c${sub(j + 1)} = ${t.coefficient.toPrecision(4)}${pm(t.stderr)}${against}`;
|
|
1523
|
+
};
|
|
1524
|
+
L.push(` ${c.correction.terms.map(term).join(', ')} (fit on exploratory rows)`);
|
|
1468
1525
|
}
|
|
1469
1526
|
L.push(` ${setLine('exploratory', c.exploratory)}`);
|
|
1470
1527
|
L.push(` ${c.credible ? 'credible' : 'not credible'}: ${c.credibility}`);
|
|
@@ -1479,7 +1536,7 @@ export function formatProbeStudy(r) {
|
|
|
1479
1536
|
L.push('');
|
|
1480
1537
|
L.push(' baselines (declared by the file; same rows, same criterion):');
|
|
1481
1538
|
for (const b of r.baselines) {
|
|
1482
|
-
const how = b.fittedParameters === 0 ? 'fixed, no fitted parameter' : `prefactor fit on exploratory rows = ${b.prefactor?.toPrecision(5)}`;
|
|
1539
|
+
const how = b.fittedParameters === 0 ? 'fixed, no fitted parameter' : `prefactor fit on exploratory rows = ${b.prefactor?.toPrecision(5)}${pm(b.prefactorStderr)}`;
|
|
1483
1540
|
L.push(` ${b.label} [${how}]`);
|
|
1484
1541
|
if (b.error) {
|
|
1485
1542
|
L.push(` not evaluable: ${b.error}`);
|