universal-physics-tensor 10.0.0 → 11.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/bin/upt.mjs +13 -1
- package/data/atlas/atlas.json +25 -25
- package/data/atlas/atlas.jsonld +1 -1
- package/data/atlas/diffusion.json +6 -6
- package/data/atlas/oscillators.json +7 -7
- package/data/atlas/waves.json +14 -14
- package/data/atlas/witness-results.json +11 -11
- package/data/bridge-catalog.json +371 -228
- package/data/bridge-catalog.schema.json +45 -7
- package/dist/atlas/applicability.d.ts.map +1 -1
- package/dist/atlas/applicability.js +21 -15
- package/dist/atlas/applicability.js.map +1 -1
- package/dist/atlas/benchmark/hybrid-retrieval.d.ts +9 -1
- package/dist/atlas/benchmark/hybrid-retrieval.d.ts.map +1 -1
- package/dist/atlas/benchmark/hybrid-retrieval.js +15 -13
- package/dist/atlas/benchmark/hybrid-retrieval.js.map +1 -1
- package/dist/atlas/benchmark/loader.js +2 -2
- package/dist/atlas/benchmark/loader.js.map +1 -1
- package/dist/atlas/benchmark/stats.d.ts +2 -2
- package/dist/atlas/benchmark/stats.d.ts.map +1 -1
- package/dist/atlas/benchmark/stats.js +15 -7
- package/dist/atlas/benchmark/stats.js.map +1 -1
- package/dist/atlas/catalog-formal-ref.d.ts +26 -3
- package/dist/atlas/catalog-formal-ref.d.ts.map +1 -1
- package/dist/atlas/catalog-formal-ref.js +52 -5
- package/dist/atlas/catalog-formal-ref.js.map +1 -1
- package/dist/atlas/chain-pipeline.d.ts.map +1 -1
- package/dist/atlas/chain-pipeline.js +7 -8
- package/dist/atlas/chain-pipeline.js.map +1 -1
- package/dist/atlas/diffusion/bridges-closure.d.ts +0 -4
- package/dist/atlas/diffusion/bridges-closure.d.ts.map +1 -1
- package/dist/atlas/diffusion/bridges-closure.js +8 -12
- package/dist/atlas/diffusion/bridges-closure.js.map +1 -1
- package/dist/atlas/diffusion/bridges.d.ts.map +1 -1
- package/dist/atlas/diffusion/bridges.js +27 -39
- package/dist/atlas/diffusion/bridges.js.map +1 -1
- package/dist/atlas/diffusion/dimensions.d.ts +6 -14
- package/dist/atlas/diffusion/dimensions.d.ts.map +1 -1
- package/dist/atlas/diffusion/dimensions.js +8 -16
- package/dist/atlas/diffusion/dimensions.js.map +1 -1
- package/dist/atlas/diffusion/models.d.ts +3 -3
- package/dist/atlas/diffusion/models.d.ts.map +1 -1
- package/dist/atlas/diffusion/models.js +5 -10
- package/dist/atlas/diffusion/models.js.map +1 -1
- package/dist/atlas/diffusion/numerics.d.ts +16 -4
- package/dist/atlas/diffusion/numerics.d.ts.map +1 -1
- package/dist/atlas/diffusion/numerics.js +38 -24
- package/dist/atlas/diffusion/numerics.js.map +1 -1
- package/dist/atlas/link-prediction.d.ts +106 -3
- package/dist/atlas/link-prediction.d.ts.map +1 -1
- package/dist/atlas/link-prediction.js +212 -66
- package/dist/atlas/link-prediction.js.map +1 -1
- package/dist/atlas/oscillators/bridges-coarse.d.ts.map +1 -1
- package/dist/atlas/oscillators/bridges-coarse.js +7 -11
- package/dist/atlas/oscillators/bridges-coarse.js.map +1 -1
- package/dist/atlas/oscillators/bridges-exact.d.ts.map +1 -1
- package/dist/atlas/oscillators/bridges-exact.js +6 -7
- package/dist/atlas/oscillators/bridges-exact.js.map +1 -1
- package/dist/atlas/oscillators/bridges-limits.d.ts +3 -16
- package/dist/atlas/oscillators/bridges-limits.d.ts.map +1 -1
- package/dist/atlas/oscillators/bridges-limits.js +23 -34
- package/dist/atlas/oscillators/bridges-limits.js.map +1 -1
- package/dist/atlas/oscillators/dimensions.d.ts +9 -21
- package/dist/atlas/oscillators/dimensions.d.ts.map +1 -1
- package/dist/atlas/oscillators/dimensions.js +9 -21
- package/dist/atlas/oscillators/dimensions.js.map +1 -1
- package/dist/atlas/oscillators/limit-witnesses.d.ts +2 -2
- package/dist/atlas/oscillators/limit-witnesses.d.ts.map +1 -1
- package/dist/atlas/oscillators/limit-witnesses.js +17 -15
- package/dist/atlas/oscillators/limit-witnesses.js.map +1 -1
- package/dist/atlas/oscillators/models.d.ts.map +1 -1
- package/dist/atlas/oscillators/models.js +2 -6
- package/dist/atlas/oscillators/models.js.map +1 -1
- package/dist/atlas/oscillators/pendulum-motion.d.ts +29 -6
- package/dist/atlas/oscillators/pendulum-motion.d.ts.map +1 -1
- package/dist/atlas/oscillators/pendulum-motion.js +60 -40
- package/dist/atlas/oscillators/pendulum-motion.js.map +1 -1
- package/dist/atlas/oscillators/phase-translation.d.ts +0 -11
- package/dist/atlas/oscillators/phase-translation.d.ts.map +1 -1
- package/dist/atlas/oscillators/phase-translation.js +3 -4
- package/dist/atlas/oscillators/phase-translation.js.map +1 -1
- package/dist/atlas/oscillators/position-translation.d.ts +68 -7
- package/dist/atlas/oscillators/position-translation.d.ts.map +1 -1
- package/dist/atlas/oscillators/position-translation.js +123 -12
- package/dist/atlas/oscillators/position-translation.js.map +1 -1
- package/dist/atlas/oscillators/rejections.d.ts +0 -2
- package/dist/atlas/oscillators/rejections.d.ts.map +1 -1
- package/dist/atlas/oscillators/rejections.js +0 -7
- package/dist/atlas/oscillators/rejections.js.map +1 -1
- package/dist/atlas/physjs-entries.generated.d.ts +25 -24
- package/dist/atlas/physjs-entries.generated.d.ts.map +1 -1
- package/dist/atlas/physjs-entries.generated.js +25 -24
- package/dist/atlas/physjs-entries.generated.js.map +1 -1
- package/dist/atlas/physjs-ref.d.ts +34 -31
- package/dist/atlas/physjs-ref.d.ts.map +1 -1
- package/dist/atlas/physjs-ref.js +55 -53
- package/dist/atlas/physjs-ref.js.map +1 -1
- package/dist/atlas/physjs-reviewed.d.ts +1 -1
- package/dist/atlas/physjs-reviewed.js +15 -15
- package/dist/atlas/physjs-reviewed.js.map +1 -1
- package/dist/atlas/poster/statements.d.ts +0 -19
- package/dist/atlas/poster/statements.d.ts.map +1 -1
- package/dist/atlas/poster/statements.js +1 -1
- package/dist/atlas/poster/statements.js.map +1 -1
- package/dist/atlas/proof-target.d.ts +1 -1
- package/dist/atlas/proof-target.js +1 -1
- package/dist/atlas/proof-target.js.map +1 -1
- package/dist/atlas/regime.d.ts +1 -1
- package/dist/atlas/regime.d.ts.map +1 -1
- package/dist/atlas/regime.js +1 -1
- package/dist/atlas/regime.js.map +1 -1
- package/dist/atlas/text-overlap.d.ts +23 -0
- package/dist/atlas/text-overlap.d.ts.map +1 -0
- package/dist/atlas/text-overlap.js +41 -0
- package/dist/atlas/text-overlap.js.map +1 -0
- package/dist/atlas/waves/bridges-closure.d.ts.map +1 -1
- package/dist/atlas/waves/bridges-closure.js +2 -6
- package/dist/atlas/waves/bridges-closure.js.map +1 -1
- package/dist/atlas/waves/bridges.d.ts.map +1 -1
- package/dist/atlas/waves/bridges.js +32 -48
- package/dist/atlas/waves/bridges.js.map +1 -1
- package/dist/atlas/waves/models.d.ts +5 -6
- package/dist/atlas/waves/models.d.ts.map +1 -1
- package/dist/atlas/waves/models.js +7 -13
- package/dist/atlas/waves/models.js.map +1 -1
- package/dist/atlas/waves/numerics.d.ts.map +1 -1
- package/dist/atlas/waves/numerics.js +10 -3
- package/dist/atlas/waves/numerics.js.map +1 -1
- package/dist/atlas/witness-numeric.d.ts +30 -0
- package/dist/atlas/witness-numeric.d.ts.map +1 -1
- package/dist/atlas/witness-numeric.js +53 -0
- package/dist/atlas/witness-numeric.js.map +1 -1
- package/dist/atlas/witness-specs.d.ts.map +1 -1
- package/dist/atlas/witness-specs.js +19 -0
- package/dist/atlas/witness-specs.js.map +1 -1
- package/dist/atlas/witness-symbolic.d.ts +75 -3
- package/dist/atlas/witness-symbolic.d.ts.map +1 -1
- package/dist/atlas/witness-symbolic.js +116 -10
- package/dist/atlas/witness-symbolic.js.map +1 -1
- package/dist/bridges/catalog-load.d.ts.map +1 -1
- package/dist/bridges/catalog-load.js +13 -8
- package/dist/bridges/catalog-load.js.map +1 -1
- package/dist/bridges/catalog-types.d.ts +26 -2
- package/dist/bridges/catalog-types.d.ts.map +1 -1
- package/dist/bridges/catalog-types.js +11 -1
- package/dist/bridges/catalog-types.js.map +1 -1
- package/dist/bridges/evaluation-errors.d.ts +31 -1
- package/dist/bridges/evaluation-errors.d.ts.map +1 -1
- package/dist/bridges/evaluation-errors.js +20 -2
- package/dist/bridges/evaluation-errors.js.map +1 -1
- package/dist/bridges/evaluator-inputs.d.ts.map +1 -1
- package/dist/bridges/evaluator-inputs.js +7 -5
- package/dist/bridges/evaluator-inputs.js.map +1 -1
- package/dist/bridges/evaluators.d.ts.map +1 -1
- package/dist/bridges/evaluators.js +27 -12
- package/dist/bridges/evaluators.js.map +1 -1
- package/dist/bridges/expr-parse.d.ts +11 -0
- package/dist/bridges/expr-parse.d.ts.map +1 -1
- package/dist/bridges/expr-parse.js +14 -5
- package/dist/bridges/expr-parse.js.map +1 -1
- package/dist/bridges/holds.d.ts +35 -3
- package/dist/bridges/holds.d.ts.map +1 -1
- package/dist/bridges/holds.js +117 -23
- package/dist/bridges/holds.js.map +1 -1
- package/dist/bridges/notices.d.ts.map +1 -1
- package/dist/bridges/notices.js +5 -5
- package/dist/bridges/notices.js.map +1 -1
- package/dist/bridges/relation-eval.d.ts +4 -4
- package/dist/bridges/relation-eval.d.ts.map +1 -1
- package/dist/bridges/relation-eval.js +15 -16
- package/dist/bridges/relation-eval.js.map +1 -1
- package/dist/bridges/sensitivity.d.ts.map +1 -1
- package/dist/bridges/sensitivity.js +3 -3
- package/dist/bridges/sensitivity.js.map +1 -1
- package/dist/bridges/validity.d.ts +33 -0
- package/dist/bridges/validity.d.ts.map +1 -0
- package/dist/bridges/validity.js +67 -0
- package/dist/bridges/validity.js.map +1 -0
- package/dist/canonical/entries/atomic.js +1 -3
- package/dist/canonical/entries/atomic.js.map +1 -1
- package/dist/canonical/entries/condensed-matter.d.ts.map +1 -1
- package/dist/canonical/entries/condensed-matter.js +4 -5
- package/dist/canonical/entries/condensed-matter.js.map +1 -1
- package/dist/canonical/entries/dimensional-classics.d.ts.map +1 -1
- package/dist/canonical/entries/dimensional-classics.js +3 -4
- package/dist/canonical/entries/dimensional-classics.js.map +1 -1
- package/dist/canonical/entries/electromagnetism.d.ts.map +1 -1
- package/dist/canonical/entries/electromagnetism.js +4 -10
- package/dist/canonical/entries/electromagnetism.js.map +1 -1
- package/dist/canonical/entries/fluids-waves.d.ts.map +1 -1
- package/dist/canonical/entries/fluids-waves.js +3 -7
- package/dist/canonical/entries/fluids-waves.js.map +1 -1
- package/dist/canonical/entries/mechanics.d.ts.map +1 -1
- package/dist/canonical/entries/mechanics.js +4 -6
- package/dist/canonical/entries/mechanics.js.map +1 -1
- package/dist/canonical/entries/nonmonomial.d.ts.map +1 -1
- package/dist/canonical/entries/nonmonomial.js +9 -17
- package/dist/canonical/entries/nonmonomial.js.map +1 -1
- package/dist/canonical/entries/relativity.d.ts.map +1 -1
- package/dist/canonical/entries/relativity.js +6 -6
- package/dist/canonical/entries/relativity.js.map +1 -1
- package/dist/canonical/entries/thermo-nuclear-cosmo.d.ts.map +1 -1
- package/dist/canonical/entries/thermo-nuclear-cosmo.js +6 -10
- package/dist/canonical/entries/thermo-nuclear-cosmo.js.map +1 -1
- package/dist/canonical/fixed-points.d.ts +94 -0
- package/dist/canonical/fixed-points.d.ts.map +1 -0
- package/dist/canonical/fixed-points.js +81 -0
- package/dist/canonical/fixed-points.js.map +1 -0
- package/dist/canonical/linkage.d.ts.map +1 -1
- package/dist/canonical/linkage.js +25 -44
- package/dist/canonical/linkage.js.map +1 -1
- package/dist/canonical/normal-form.d.ts.map +1 -1
- package/dist/canonical/normal-form.js +5 -11
- package/dist/canonical/normal-form.js.map +1 -1
- package/dist/canonical/structural.d.ts +21 -21
- package/dist/canonical/structural.d.ts.map +1 -1
- package/dist/canonical/structural.js +40 -19
- package/dist/canonical/structural.js.map +1 -1
- package/dist/cases/brownian-sphere.d.ts +3 -3
- package/dist/cases/brownian-sphere.d.ts.map +1 -1
- package/dist/cases/brownian-sphere.js +6 -5
- package/dist/cases/brownian-sphere.js.map +1 -1
- package/dist/cases/damped-resonator.d.ts.map +1 -1
- package/dist/cases/damped-resonator.js +6 -9
- package/dist/cases/damped-resonator.js.map +1 -1
- package/dist/cases/kepler-rv.d.ts +1 -1
- package/dist/cases/kepler-rv.d.ts.map +1 -1
- package/dist/cases/kepler-rv.js +3 -2
- package/dist/cases/kepler-rv.js.map +1 -1
- package/dist/cases/lumped-cooling.d.ts +8 -3
- package/dist/cases/lumped-cooling.d.ts.map +1 -1
- package/dist/cases/lumped-cooling.js +21 -23
- package/dist/cases/lumped-cooling.js.map +1 -1
- package/dist/cases/quadrature.d.ts +7 -9
- package/dist/cases/quadrature.d.ts.map +1 -1
- package/dist/cases/quadrature.js +28 -32
- package/dist/cases/quadrature.js.map +1 -1
- package/dist/cases/resistor-noise.js +4 -4
- package/dist/cases/resistor-noise.js.map +1 -1
- package/dist/cases/skin-depth.d.ts +0 -4
- package/dist/cases/skin-depth.d.ts.map +1 -1
- package/dist/cases/skin-depth.js +3 -7
- package/dist/cases/skin-depth.js.map +1 -1
- package/dist/cli/args.d.ts +23 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +30 -8
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/bindings.d.ts.map +1 -1
- package/dist/cli/bindings.js +5 -4
- package/dist/cli/bindings.js.map +1 -1
- package/dist/cli/command.d.ts +8 -1
- package/dist/cli/command.d.ts.map +1 -1
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/commands/_atlas-map.d.ts +0 -9
- package/dist/cli/commands/_atlas-map.d.ts.map +1 -1
- package/dist/cli/commands/_atlas-map.js +8 -18
- package/dist/cli/commands/_atlas-map.js.map +1 -1
- package/dist/cli/commands/_atlas-route.d.ts.map +1 -1
- package/dist/cli/commands/_atlas-route.js +6 -2
- package/dist/cli/commands/_atlas-route.js.map +1 -1
- package/dist/cli/commands/_discovery-opts.d.ts.map +1 -1
- package/dist/cli/commands/_discovery-opts.js +8 -9
- package/dist/cli/commands/_discovery-opts.js.map +1 -1
- package/dist/cli/commands/atlas.d.ts.map +1 -1
- package/dist/cli/commands/atlas.js +8 -5
- package/dist/cli/commands/atlas.js.map +1 -1
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/audit.js +8 -1
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/cli/commands/axes.d.ts.map +1 -1
- package/dist/cli/commands/axes.js +20 -1
- package/dist/cli/commands/axes.js.map +1 -1
- package/dist/cli/commands/confront.d.ts.map +1 -1
- package/dist/cli/commands/confront.js +8 -14
- package/dist/cli/commands/confront.js.map +1 -1
- package/dist/cli/commands/derive.d.ts.map +1 -1
- package/dist/cli/commands/derive.js +22 -22
- package/dist/cli/commands/derive.js.map +1 -1
- package/dist/cli/commands/discover.d.ts.map +1 -1
- package/dist/cli/commands/discover.js +6 -2
- package/dist/cli/commands/discover.js.map +1 -1
- package/dist/cli/commands/eval.d.ts.map +1 -1
- package/dist/cli/commands/eval.js +1 -0
- package/dist/cli/commands/eval.js.map +1 -1
- package/dist/cli/commands/evaluate.d.ts.map +1 -1
- package/dist/cli/commands/evaluate.js +65 -37
- package/dist/cli/commands/evaluate.js.map +1 -1
- package/dist/cli/commands/explain.d.ts.map +1 -1
- package/dist/cli/commands/explain.js +2 -1
- package/dist/cli/commands/explain.js.map +1 -1
- package/dist/cli/commands/ground.d.ts.map +1 -1
- package/dist/cli/commands/ground.js +1 -0
- package/dist/cli/commands/ground.js.map +1 -1
- package/dist/cli/commands/map.d.ts.map +1 -1
- package/dist/cli/commands/map.js +75 -5
- package/dist/cli/commands/map.js.map +1 -1
- package/dist/cli/commands/metric.d.ts.map +1 -1
- package/dist/cli/commands/metric.js +12 -9
- package/dist/cli/commands/metric.js.map +1 -1
- package/dist/cli/commands/path.d.ts +10 -0
- package/dist/cli/commands/path.d.ts.map +1 -1
- package/dist/cli/commands/path.js +25 -3
- package/dist/cli/commands/path.js.map +1 -1
- package/dist/cli/commands/probe.d.ts.map +1 -1
- package/dist/cli/commands/probe.js +59 -16
- package/dist/cli/commands/probe.js.map +1 -1
- package/dist/cli/commands/regime.d.ts.map +1 -1
- package/dist/cli/commands/regime.js +1 -0
- package/dist/cli/commands/regime.js.map +1 -1
- package/dist/cli/commands/retrieve.d.ts.map +1 -1
- package/dist/cli/commands/retrieve.js +1 -0
- package/dist/cli/commands/retrieve.js.map +1 -1
- package/dist/cli/commands/search.d.ts.map +1 -1
- package/dist/cli/commands/search.js +1 -0
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/symbolic.d.ts.map +1 -1
- package/dist/cli/commands/symbolic.js +19 -28
- package/dist/cli/commands/symbolic.js.map +1 -1
- package/dist/cli/commands/testplan.d.ts.map +1 -1
- package/dist/cli/commands/testplan.js +4 -2
- package/dist/cli/commands/testplan.js.map +1 -1
- package/dist/cli/expr-print.d.ts +0 -2
- package/dist/cli/expr-print.d.ts.map +1 -1
- package/dist/cli/expr-print.js +7 -31
- package/dist/cli/expr-print.js.map +1 -1
- package/dist/cli/main.d.ts +7 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +18 -3
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/numeric-flag.d.ts +12 -0
- package/dist/cli/numeric-flag.d.ts.map +1 -0
- package/dist/cli/numeric-flag.js +44 -0
- package/dist/cli/numeric-flag.js.map +1 -0
- package/dist/cli/output.d.ts +20 -0
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +15 -0
- package/dist/cli/output.js.map +1 -1
- package/dist/cli/record-reach.js +2 -2
- package/dist/cli/record-reach.js.map +1 -1
- package/dist/cli/record-tables.d.ts.map +1 -1
- package/dist/cli/record-tables.js +6 -5
- package/dist/cli/record-tables.js.map +1 -1
- package/dist/cli/record.d.ts +1 -5
- package/dist/cli/record.d.ts.map +1 -1
- package/dist/cli/record.js +9 -8
- package/dist/cli/record.js.map +1 -1
- package/dist/cli/search-index.d.ts.map +1 -1
- package/dist/cli/search-index.js +7 -6
- package/dist/cli/search-index.js.map +1 -1
- package/dist/cli/statuses.d.ts +0 -2
- package/dist/cli/statuses.d.ts.map +1 -1
- package/dist/cli/statuses.js +0 -7
- package/dist/cli/statuses.js.map +1 -1
- package/dist/cli/stored-results.d.ts +7 -0
- package/dist/cli/stored-results.d.ts.map +1 -0
- package/dist/cli/stored-results.js +23 -0
- package/dist/cli/stored-results.js.map +1 -0
- package/dist/cli/version.d.ts.map +1 -1
- package/dist/cli/version.js +7 -5
- package/dist/cli/version.js.map +1 -1
- package/dist/cli-api.d.ts +34 -5
- package/dist/cli-api.d.ts.map +1 -1
- package/dist/cli-api.js +28 -4
- package/dist/cli-api.js.map +1 -1
- package/dist/composition/algebraic-equivalence.d.ts +43 -0
- package/dist/composition/algebraic-equivalence.d.ts.map +1 -0
- package/dist/composition/algebraic-equivalence.js +115 -0
- package/dist/composition/algebraic-equivalence.js.map +1 -0
- package/dist/composition/axes.d.ts +0 -6
- package/dist/composition/axes.d.ts.map +1 -1
- package/dist/composition/axes.js +6 -6
- package/dist/composition/axes.js.map +1 -1
- package/dist/composition/axis-audit.d.ts +47 -20
- package/dist/composition/axis-audit.d.ts.map +1 -1
- package/dist/composition/axis-audit.js +82 -9
- package/dist/composition/axis-audit.js.map +1 -1
- package/dist/composition/bridge-analysis.d.ts +17 -0
- package/dist/composition/bridge-analysis.d.ts.map +1 -1
- package/dist/composition/bridge-analysis.js +102 -55
- package/dist/composition/bridge-analysis.js.map +1 -1
- package/dist/composition/canonical-compare.d.ts +40 -0
- package/dist/composition/canonical-compare.d.ts.map +1 -1
- package/dist/composition/canonical-compare.js +122 -24
- package/dist/composition/canonical-compare.js.map +1 -1
- package/dist/composition/canonical-graph.d.ts +1 -1
- package/dist/composition/canonical-graph.d.ts.map +1 -1
- package/dist/composition/canonical-graph.js +9 -36
- package/dist/composition/canonical-graph.js.map +1 -1
- package/dist/composition/canonical-json.js +2 -2
- package/dist/composition/canonical-json.js.map +1 -1
- package/dist/composition/catalog-graph.d.ts.map +1 -1
- package/dist/composition/catalog-graph.js +2 -5
- package/dist/composition/catalog-graph.js.map +1 -1
- package/dist/composition/chain-candidate.d.ts +8 -0
- package/dist/composition/chain-candidate.d.ts.map +1 -1
- package/dist/composition/chain-candidate.js +9 -2
- package/dist/composition/chain-candidate.js.map +1 -1
- package/dist/composition/chain-match.d.ts +6 -3
- package/dist/composition/chain-match.d.ts.map +1 -1
- package/dist/composition/chain-match.js +4 -1
- package/dist/composition/chain-match.js.map +1 -1
- package/dist/composition/chain-result.d.ts.map +1 -1
- package/dist/composition/chain-result.js +2 -14
- package/dist/composition/chain-result.js.map +1 -1
- package/dist/composition/compose-symbolic.d.ts.map +1 -1
- package/dist/composition/compose-symbolic.js +3 -2
- package/dist/composition/compose-symbolic.js.map +1 -1
- package/dist/composition/compose.d.ts.map +1 -1
- package/dist/composition/compose.js +13 -5
- package/dist/composition/compose.js.map +1 -1
- package/dist/composition/composition-recovery.d.ts.map +1 -1
- package/dist/composition/composition-recovery.js +4 -7
- package/dist/composition/composition-recovery.js.map +1 -1
- package/dist/composition/discovery.d.ts +56 -0
- package/dist/composition/discovery.d.ts.map +1 -1
- package/dist/composition/discovery.js +114 -60
- package/dist/composition/discovery.js.map +1 -1
- package/dist/composition/edge.d.ts +21 -2
- package/dist/composition/edge.d.ts.map +1 -1
- package/dist/composition/edge.js +23 -1
- package/dist/composition/edge.js.map +1 -1
- package/dist/composition/enumerate.d.ts.map +1 -1
- package/dist/composition/enumerate.js +18 -3
- package/dist/composition/enumerate.js.map +1 -1
- package/dist/composition/evaluate-relation.d.ts +35 -11
- package/dist/composition/evaluate-relation.d.ts.map +1 -1
- package/dist/composition/evaluate-relation.js +60 -39
- package/dist/composition/evaluate-relation.js.map +1 -1
- package/dist/composition/explain.d.ts +3 -12
- package/dist/composition/explain.d.ts.map +1 -1
- package/dist/composition/explain.js +7 -20
- package/dist/composition/explain.js.map +1 -1
- package/dist/composition/expr-eval.d.ts.map +1 -1
- package/dist/composition/expr-eval.js +2 -11
- package/dist/composition/expr-eval.js.map +1 -1
- package/dist/composition/expr-simplify.d.ts +16 -0
- package/dist/composition/expr-simplify.d.ts.map +1 -1
- package/dist/composition/expr-simplify.js +15 -20
- package/dist/composition/expr-simplify.js.map +1 -1
- package/dist/composition/formula-shape.d.ts +23 -4
- package/dist/composition/formula-shape.d.ts.map +1 -1
- package/dist/composition/formula-shape.js +57 -17
- package/dist/composition/formula-shape.js.map +1 -1
- package/dist/composition/graph-structure.d.ts +98 -0
- package/dist/composition/graph-structure.d.ts.map +1 -0
- package/dist/composition/graph-structure.js +167 -0
- package/dist/composition/graph-structure.js.map +1 -0
- package/dist/composition/graph-viz-svg.d.ts.map +1 -1
- package/dist/composition/graph-viz-svg.js +1 -1
- package/dist/composition/graph-viz-svg.js.map +1 -1
- package/dist/composition/graph-viz.d.ts.map +1 -1
- package/dist/composition/graph-viz.js +8 -37
- package/dist/composition/graph-viz.js.map +1 -1
- package/dist/composition/identifiability.d.ts +91 -4
- package/dist/composition/identifiability.d.ts.map +1 -1
- package/dist/composition/identifiability.js +363 -6
- package/dist/composition/identifiability.js.map +1 -1
- package/dist/composition/index.d.ts +8 -4
- package/dist/composition/index.d.ts.map +1 -1
- package/dist/composition/index.js +3 -2
- package/dist/composition/index.js.map +1 -1
- package/dist/composition/mathts-quiet.d.ts +4 -3
- package/dist/composition/mathts-quiet.d.ts.map +1 -1
- package/dist/composition/mathts-quiet.js +4 -3
- package/dist/composition/mathts-quiet.js.map +1 -1
- package/dist/composition/mathts-scalar-symbols.d.ts.map +1 -1
- package/dist/composition/mathts-scalar-symbols.js +2 -1
- package/dist/composition/mathts-scalar-symbols.js.map +1 -1
- package/dist/composition/probe/corpus.d.ts +4 -2
- package/dist/composition/probe/corpus.d.ts.map +1 -1
- package/dist/composition/probe/corpus.js +20 -9
- package/dist/composition/probe/corpus.js.map +1 -1
- package/dist/composition/probe/dataset.d.ts +17 -0
- package/dist/composition/probe/dataset.d.ts.map +1 -1
- package/dist/composition/probe/dataset.js +95 -50
- package/dist/composition/probe/dataset.js.map +1 -1
- package/dist/composition/probe/experiment-design.d.ts +5 -1
- package/dist/composition/probe/experiment-design.d.ts.map +1 -1
- package/dist/composition/probe/experiment-design.js +44 -24
- package/dist/composition/probe/experiment-design.js.map +1 -1
- package/dist/composition/probe/falsify.d.ts.map +1 -1
- package/dist/composition/probe/falsify.js +2 -0
- package/dist/composition/probe/falsify.js.map +1 -1
- package/dist/composition/probe/fit.d.ts +6 -0
- package/dist/composition/probe/fit.d.ts.map +1 -1
- package/dist/composition/probe/fit.js +46 -22
- package/dist/composition/probe/fit.js.map +1 -1
- package/dist/composition/probe/frontier.d.ts.map +1 -1
- package/dist/composition/probe/frontier.js +33 -15
- package/dist/composition/probe/frontier.js.map +1 -1
- package/dist/composition/probe/generator.d.ts +27 -1
- package/dist/composition/probe/generator.d.ts.map +1 -1
- package/dist/composition/probe/generator.js +53 -30
- package/dist/composition/probe/generator.js.map +1 -1
- package/dist/composition/probe/index.d.ts +14 -0
- package/dist/composition/probe/index.d.ts.map +1 -1
- package/dist/composition/probe/index.js +6 -0
- package/dist/composition/probe/index.js.map +1 -1
- package/dist/composition/probe/limits.d.ts +24 -1
- package/dist/composition/probe/limits.d.ts.map +1 -1
- package/dist/composition/probe/limits.js +53 -11
- package/dist/composition/probe/limits.js.map +1 -1
- package/dist/composition/probe/pipeline.d.ts.map +1 -1
- package/dist/composition/probe/pipeline.js +10 -4
- package/dist/composition/probe/pipeline.js.map +1 -1
- package/dist/composition/probe/power-law.d.ts +121 -0
- package/dist/composition/probe/power-law.d.ts.map +1 -0
- package/dist/composition/probe/power-law.js +255 -0
- package/dist/composition/probe/power-law.js.map +1 -0
- package/dist/composition/probe/problem.d.ts +7 -4
- package/dist/composition/probe/problem.d.ts.map +1 -1
- package/dist/composition/probe/problem.js +177 -49
- package/dist/composition/probe/problem.js.map +1 -1
- package/dist/composition/probe/report.js +1 -1
- package/dist/composition/probe/report.js.map +1 -1
- package/dist/composition/probe/residual.d.ts +6 -1
- package/dist/composition/probe/residual.d.ts.map +1 -1
- package/dist/composition/probe/residual.js +9 -7
- package/dist/composition/probe/residual.js.map +1 -1
- package/dist/composition/probe/structure.d.ts +82 -17
- package/dist/composition/probe/structure.d.ts.map +1 -1
- package/dist/composition/probe/structure.js +129 -55
- package/dist/composition/probe/structure.js.map +1 -1
- package/dist/composition/probe/study.d.ts +31 -9
- package/dist/composition/probe/study.d.ts.map +1 -1
- package/dist/composition/probe/study.js +236 -181
- package/dist/composition/probe/study.js.map +1 -1
- package/dist/composition/probe/t-tail.d.ts +17 -0
- package/dist/composition/probe/t-tail.d.ts.map +1 -0
- package/dist/composition/probe/t-tail.js +32 -0
- package/dist/composition/probe/t-tail.js.map +1 -0
- package/dist/composition/probe/types.d.ts +3 -0
- package/dist/composition/probe/types.d.ts.map +1 -1
- package/dist/composition/probe/types.js.map +1 -1
- package/dist/composition/proposed-bridges.d.ts +41 -10
- package/dist/composition/proposed-bridges.d.ts.map +1 -1
- package/dist/composition/proposed-bridges.js +100 -55
- package/dist/composition/proposed-bridges.js.map +1 -1
- package/dist/composition/quantity-clusters.d.ts +48 -0
- package/dist/composition/quantity-clusters.d.ts.map +1 -0
- package/dist/composition/quantity-clusters.js +98 -0
- package/dist/composition/quantity-clusters.js.map +1 -0
- package/dist/composition/rational-exponent.d.ts +40 -0
- package/dist/composition/rational-exponent.d.ts.map +1 -0
- package/dist/composition/rational-exponent.js +65 -0
- package/dist/composition/rational-exponent.js.map +1 -0
- package/dist/composition/representative-values.d.ts +22 -0
- package/dist/composition/representative-values.d.ts.map +1 -1
- package/dist/composition/representative-values.js +23 -0
- package/dist/composition/representative-values.js.map +1 -1
- package/dist/composition/retrodiction.d.ts.map +1 -1
- package/dist/composition/retrodiction.js +2 -1
- package/dist/composition/retrodiction.js.map +1 -1
- package/dist/composition/user-equation.d.ts.map +1 -1
- package/dist/composition/user-equation.js +2 -2
- package/dist/composition/user-equation.js.map +1 -1
- package/dist/core/assignment.d.ts +19 -0
- package/dist/core/assignment.d.ts.map +1 -0
- package/dist/core/assignment.js +19 -0
- package/dist/core/assignment.js.map +1 -0
- package/dist/core/compare.d.ts +32 -0
- package/dist/core/compare.d.ts.map +1 -0
- package/dist/core/compare.js +46 -0
- package/dist/core/compare.js.map +1 -0
- package/dist/core/constants.d.ts +30 -30
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +47 -30
- package/dist/core/constants.js.map +1 -1
- package/dist/core/data-file.d.ts +7 -0
- package/dist/core/data-file.d.ts.map +1 -1
- package/dist/core/data-file.js +17 -0
- package/dist/core/data-file.js.map +1 -1
- package/dist/core/format.d.ts +36 -0
- package/dist/core/format.d.ts.map +1 -0
- package/dist/core/format.js +39 -0
- package/dist/core/format.js.map +1 -0
- package/dist/core/hash.d.ts +14 -0
- package/dist/core/hash.d.ts.map +1 -0
- package/dist/core/hash.js +17 -0
- package/dist/core/hash.js.map +1 -0
- package/dist/core/json-schema.d.ts +2 -0
- package/dist/core/json-schema.d.ts.map +1 -1
- package/dist/core/json-schema.js +14 -13
- package/dist/core/json-schema.js.map +1 -1
- package/dist/core/labeled-tensor.d.ts.map +1 -1
- package/dist/core/labeled-tensor.js +0 -8
- package/dist/core/labeled-tensor.js.map +1 -1
- package/dist/core/mathts-read.d.ts +25 -0
- package/dist/core/mathts-read.d.ts.map +1 -0
- package/dist/core/mathts-read.js +51 -0
- package/dist/core/mathts-read.js.map +1 -0
- package/dist/core/tensor.d.ts.map +1 -1
- package/dist/core/tensor.js +24 -0
- package/dist/core/tensor.js.map +1 -1
- package/dist/core/types.d.ts +5 -5
- package/dist/diff/bridge-gradient.d.ts +19 -6
- package/dist/diff/bridge-gradient.d.ts.map +1 -1
- package/dist/diff/bridge-gradient.js +19 -11
- package/dist/diff/bridge-gradient.js.map +1 -1
- package/dist/diff/bridge-specs.d.ts.map +1 -1
- package/dist/diff/bridge-specs.js +3 -0
- package/dist/diff/bridge-specs.js.map +1 -1
- package/dist/dimensional/algebra.d.ts +18 -0
- package/dist/dimensional/algebra.d.ts.map +1 -1
- package/dist/dimensional/algebra.js +41 -1
- package/dist/dimensional/algebra.js.map +1 -1
- package/dist/dimensional/ast-builders.d.ts +7 -0
- package/dist/dimensional/ast-builders.d.ts.map +1 -1
- package/dist/dimensional/ast-builders.js +11 -0
- package/dist/dimensional/ast-builders.js.map +1 -1
- package/dist/dimensional/ast-leaves.d.ts +81 -0
- package/dist/dimensional/ast-leaves.d.ts.map +1 -0
- package/dist/dimensional/ast-leaves.js +146 -0
- package/dist/dimensional/ast-leaves.js.map +1 -0
- package/dist/dimensional/buckingham.d.ts.map +1 -1
- package/dist/dimensional/buckingham.js +15 -27
- package/dist/dimensional/buckingham.js.map +1 -1
- package/dist/dimensional/constant-rows.js +9 -9
- package/dist/dimensional/constant-rows.js.map +1 -1
- package/dist/dimensional/dimension-inference.d.ts.map +1 -1
- package/dist/dimensional/dimension-inference.js +1 -2
- package/dist/dimensional/dimension-inference.js.map +1 -1
- package/dist/dimensional/errors.d.ts +1 -1
- package/dist/dimensional/errors.d.ts.map +1 -1
- package/dist/dimensional/errors.js +1 -15
- package/dist/dimensional/errors.js.map +1 -1
- package/dist/dimensional/exact-scale.d.ts +0 -17
- package/dist/dimensional/exact-scale.d.ts.map +1 -1
- package/dist/dimensional/exact-scale.js +8 -8
- package/dist/dimensional/exact-scale.js.map +1 -1
- package/dist/dimensional/gauge-field.d.ts.map +1 -1
- package/dist/dimensional/gauge-field.js +2 -2
- package/dist/dimensional/gauge-field.js.map +1 -1
- package/dist/dimensional/hyphen-names.d.ts +12 -2
- package/dist/dimensional/hyphen-names.d.ts.map +1 -1
- package/dist/dimensional/hyphen-names.js +44 -19
- package/dist/dimensional/hyphen-names.js.map +1 -1
- package/dist/dimensional/metric.d.ts.map +1 -1
- package/dist/dimensional/metric.js +0 -1
- package/dist/dimensional/metric.js.map +1 -1
- package/dist/dimensional/symbolic-constants.d.ts +9 -0
- package/dist/dimensional/symbolic-constants.d.ts.map +1 -1
- package/dist/dimensional/symbolic-constants.js +13 -1
- package/dist/dimensional/symbolic-constants.js.map +1 -1
- package/dist/dimensional/types.d.ts +36 -0
- package/dist/dimensional/types.d.ts.map +1 -1
- package/dist/dimensional/types.js +45 -7
- package/dist/dimensional/types.js.map +1 -1
- package/dist/dimensional/unit-data.js +2 -2
- package/dist/dimensional/unit-data.js.map +1 -1
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -4
- package/dist/index.js.map +1 -1
- package/dist/numerical/christoffel-flat.d.ts.map +1 -1
- package/dist/numerical/christoffel-flat.js +3 -2
- package/dist/numerical/christoffel-flat.js.map +1 -1
- package/dist/numerical/covariant-eikonal.d.ts.map +1 -1
- package/dist/numerical/covariant-eikonal.js +34 -11
- package/dist/numerical/covariant-eikonal.js.map +1 -1
- package/dist/numerical/curvature-lowering-helpers.js +3 -2
- package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
- package/dist/numerical/errors.d.ts.map +1 -1
- package/dist/numerical/errors.js +0 -3
- package/dist/numerical/errors.js.map +1 -1
- package/dist/numerical/finite-difference.d.ts +22 -0
- package/dist/numerical/finite-difference.d.ts.map +1 -0
- package/dist/numerical/finite-difference.js +27 -0
- package/dist/numerical/finite-difference.js.map +1 -0
- package/dist/numerical/geodesic-integrator.d.ts.map +1 -1
- package/dist/numerical/geodesic-integrator.js +22 -14
- package/dist/numerical/geodesic-integrator.js.map +1 -1
- package/dist/numerical/geometrized.d.ts.map +1 -1
- package/dist/numerical/geometrized.js +0 -1
- package/dist/numerical/geometrized.js.map +1 -1
- package/dist/numerical/mathts-engine.d.ts.map +1 -1
- package/dist/numerical/mathts-engine.js +10 -24
- package/dist/numerical/mathts-engine.js.map +1 -1
- package/dist/numerical/metric-inverse.d.ts.map +1 -1
- package/dist/numerical/metric-inverse.js +83 -46
- package/dist/numerical/metric-inverse.js.map +1 -1
- package/dist/numerical/null-ray-integrator.d.ts +2 -1
- package/dist/numerical/null-ray-integrator.d.ts.map +1 -1
- package/dist/numerical/null-ray-integrator.js +12 -12
- package/dist/numerical/null-ray-integrator.js.map +1 -1
- package/dist/numerical/painleve-gullstrand-metric.js +2 -2
- package/dist/numerical/painleve-gullstrand-metric.js.map +1 -1
- package/dist/numerical/perihelion-finder.d.ts +0 -36
- package/dist/numerical/perihelion-finder.d.ts.map +1 -1
- package/dist/numerical/perihelion-finder.js +41 -87
- package/dist/numerical/perihelion-finder.js.map +1 -1
- package/dist/numerical/quadrature.d.ts.map +1 -1
- package/dist/numerical/quadrature.js +8 -10
- package/dist/numerical/quadrature.js.map +1 -1
- package/dist/numerical/rk4-trajectory.d.ts +10 -0
- package/dist/numerical/rk4-trajectory.d.ts.map +1 -0
- package/dist/numerical/rk4-trajectory.js +37 -0
- package/dist/numerical/rk4-trajectory.js.map +1 -0
- package/dist/numerical/schwarzschild.d.ts +14 -0
- package/dist/numerical/schwarzschild.d.ts.map +1 -0
- package/dist/numerical/schwarzschild.js +17 -0
- package/dist/numerical/schwarzschild.js.map +1 -0
- package/dist/numerical/spacetime-metrics.d.ts +12 -0
- package/dist/numerical/spacetime-metrics.d.ts.map +1 -1
- package/dist/numerical/spacetime-metrics.js +72 -56
- package/dist/numerical/spacetime-metrics.js.map +1 -1
- package/dist/numerical/statistics.d.ts +24 -0
- package/dist/numerical/statistics.d.ts.map +1 -0
- package/dist/numerical/statistics.js +52 -0
- package/dist/numerical/statistics.js.map +1 -0
- package/dist/numerical/tensor-engine.d.ts +21 -0
- package/dist/numerical/tensor-engine.d.ts.map +1 -1
- package/dist/numerical/tensor-engine.js +12 -0
- package/dist/numerical/tensor-engine.js.map +1 -1
- package/dist/relations/regime.d.ts +10 -0
- package/dist/relations/regime.d.ts.map +1 -1
- package/dist/relations/regime.js +18 -1
- package/dist/relations/regime.js.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tensor-engine.js","sourceRoot":"","sources":["../../src/numerical/tensor-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH;;;;GAIG;AACH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"tensor-engine.js","sourceRoot":"","sources":["../../src/numerical/tensor-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH;;;;GAIG;AACH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AA4BpD,iIAAiI;AACjI,MAAM,UAAU,UAAU,CAAC,CAAe;IACxC,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACrC,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAClC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,cAAc,CAAC,CAAe;IAC5C,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AAChC,CAAC;AAkGD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,OAAO,OAAO,MAAM,CAAC,WAAW,KAAK,UAAU;WACxC,OAAO,MAAM,CAAC,WAAW,KAAK,UAAU,CAAC;AAClD,CAAC;AAED;;;;gBAIgB;AAChB,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAG,CAA+C,CAAC;IAC1D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3E,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QACtD,MAAM,IAAI,GAAI,CAAwB,CAAC,IAAI,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC5D,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC9D,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;QACjF,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QACtD,MAAM,EAAE,GAAG,CAA0C,CAAC;QACtD,IAAI,OAAO,EAAE,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;IAClF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["/**\n * The TensorEngine contract. `MathTSEngine` implements it. See docs/planning/\n * v0.3.5-Design.md §3, §5.\n *\n * `EngineTensor` is an opaque handle; consumers operate on it only through\n * a TensorEngine. The lowering pass (lowering.ts) builds an `EinsumSpec`\n * from `computeContraction()`'s `contractionPairs` and hands it to\n * `engine.einsum()`.\n *\n * @module numerical/tensor-engine\n */\n\nimport type { NestedArray } from './types.js';\n/**\n * Thrown when an engine does not implement a requested capability.\n *\n * @public\n */\nexport { EngineCapabilityError } from './errors.js';\n\n/** Opaque rank-N tensor handle. Each engine backs it with its own storage\n * (Float64Array, a MathTS Tensor, a future WASM offset); consumers see\n * only the shape.\n * @public */\nexport interface EngineTensor {\n readonly shape: ReadonlyArray<number>;\n}\n\n/**\n * An `EngineTensor` that `@danielsimonjr/mathts-autograd` has wrapped for\n * tracing: a `DualTensor` (forward mode, carries `tangent`) or a\n * `TapedTensor` (reverse mode, carries `tape`). Both implement the traced\n * arithmetic over another wrapped tensor, which is what the engine dispatches\n * to inside an AD call. The autograd package is loaded at that call, so its\n * classes are not named here; this is the shape the package keeps.\n * @internal\n */\nexport interface TracedEngineTensor extends EngineTensor {\n readonly tangent?: unknown;\n readonly tape?: unknown;\n add(other: EngineTensor): EngineTensor;\n sub(other: EngineTensor): EngineTensor;\n mul(other: EngineTensor): EngineTensor;\n scale(k: number): EngineTensor;\n}\n\n/** The AD mode a wrapped tensor carries: `forward` (a `tangent`), `reverse` (a `tape`), or null for a plain tensor. @internal */\nexport function tracedMode(t: EngineTensor): 'forward' | 'reverse' | null {\n if ('tangent' in t) return 'forward';\n if ('tape' in t) return 'reverse';\n return null;\n}\n\n/** Whether `t` is an autograd-wrapped tensor (it carries a `tangent` or a `tape`). @internal */\nexport function isTracedTensor(t: EngineTensor): t is TracedEngineTensor {\n return tracedMode(t) !== null;\n}\n\n/** One contracted index: the two (operand, axis) coordinates that the\n * Einstein summation pairs and sums over. Named by the public\n * {@link EinsumSpec}, so it is public too.\n * @public */\nexport interface EinsumContraction {\n readonly pair: readonly [readonly [number, number], readonly [number, number]];\n}\n\n/** One surviving (free) index in the einsum output, in output-axis order:\n * the operand and the axis of that operand it comes from. Exported because\n * the public {@link EinsumSpec} names it (the surface is closed under type\n * references).\n * @public */\nexport interface EinsumFreeAxis {\n readonly operand: number;\n readonly axis: number;\n}\n\n/** The engine-agnostic einsum plan produced by lowering.ts.\n * @public */\nexport interface EinsumSpec {\n readonly contractions: ReadonlyArray<EinsumContraction>;\n readonly free: ReadonlyArray<EinsumFreeAxis>;\n}\n\n/**\n * Result of a forward-mode automatic differentiation pass.\n * `value` is f(x); `jacobian` is the Jacobian of f at x (Jvp with tangent 1).\n * @public\n */\nexport interface ForwardGradResult {\n readonly value: EngineTensor;\n readonly jacobian: EngineTensor;\n}\n\n/**\n * Result of a reverse-mode automatic differentiation pass.\n * `value` is f(x); `gradient` is ∂L/∂x for cotangent dL/df (ones-like by default).\n * @public\n */\nexport interface ReverseGradResult {\n readonly value: EngineTensor;\n readonly gradient: EngineTensor;\n}\n\n/** The compute contract. MathTSEngine implements it.\n * @public */\nexport interface TensorEngine {\n readonly name: string;\n\n fromNested(data: NestedArray, shape: ReadonlyArray<number>): EngineTensor;\n toNested(t: EngineTensor): NestedArray;\n\n einsum(spec: EinsumSpec, ...operands: EngineTensor[]): EngineTensor;\n matMul(a: EngineTensor, b: EngineTensor): EngineTensor;\n transpose(t: EngineTensor, perm?: ReadonlyArray<number>): EngineTensor;\n reshape(t: EngineTensor, shape: ReadonlyArray<number>): EngineTensor;\n\n add(a: EngineTensor, b: EngineTensor): EngineTensor;\n sub(a: EngineTensor, b: EngineTensor): EngineTensor;\n mul(a: EngineTensor, b: EngineTensor): EngineTensor;\n scale(t: EngineTensor, k: number): EngineTensor;\n\n identity(n: number): EngineTensor;\n normInf(t: EngineTensor): number;\n\n /** Optional — no-op for pure-JS engines; a future native engine implements\n * real disposal. evaluateNumerical() never relies on it. */\n dispose?(t: EngineTensor): void;\n\n /**\n * Forward-mode AD (Jacobian-vector product). Always Promise-returning for\n * uniform consumer semantics (S6 reconciliation fix — no T | Promise<T> union).\n * Engines without AD support omit this method; call `hasAutogradSupport(engine)`\n * before invoking.\n * @public\n */\n forwardGrad?(\n fn: (x: EngineTensor) => EngineTensor,\n x: EngineTensor,\n ): Promise<ForwardGradResult>;\n\n /**\n * Reverse-mode AD (vector-Jacobian product). `cotangent` defaults to\n * ones-like(value) when omitted. Always Promise-returning (S6).\n * Engines without AD support omit this method; call `hasAutogradSupport(engine)`\n * before invoking.\n * @public\n */\n reverseGrad?(\n fn: (x: EngineTensor) => EngineTensor,\n x: EngineTensor,\n cotangent?: EngineTensor,\n ): Promise<ReverseGradResult>;\n}\n\n/**\n * Returns `true` iff the engine implements both `forwardGrad` and `reverseGrad`.\n * Use this before invoking AD methods so callers get a clear capability signal\n * rather than a runtime TypeError.\n *\n * @example\n * ```typescript\n * if (!hasAutogradSupport(engine)) {\n * throw new EngineCapabilityError(engine.name, 'forwardGrad');\n * }\n * const { value, jacobian } = await engine.forwardGrad!(fn, x);\n * ```\n * @public\n */\nexport function hasAutogradSupport(engine: TensorEngine): boolean {\n return typeof engine.forwardGrad === 'function'\n && typeof engine.reverseGrad === 'function';\n}\n\n/** Runtime guard for EinsumSpec — validates structure before passing to\n * engine.einsum(). Not called internally by the lowering pass (which builds\n * specs via buildEinsumSpec and trusts the upstream AST validation). Available\n * for consumers who construct EinsumSpec objects directly.\n * @internal */\nexport function isEinsumSpec(x: unknown): x is EinsumSpec {\n if (typeof x !== 'object' || x === null) return false;\n const s = x as { contractions?: unknown; free?: unknown };\n if (!Array.isArray(s.contractions) || !Array.isArray(s.free)) return false;\n for (const c of s.contractions) {\n if (typeof c !== 'object' || c === null) return false;\n const pair = (c as { pair?: unknown }).pair;\n if (!Array.isArray(pair) || pair.length !== 2) return false;\n for (const coord of pair) {\n if (!Array.isArray(coord) || coord.length !== 2) return false;\n if (typeof coord[0] !== 'number' || typeof coord[1] !== 'number') return false;\n }\n }\n for (const f of s.free) {\n if (typeof f !== 'object' || f === null) return false;\n const fa = f as { operand?: unknown; axis?: unknown };\n if (typeof fa.operand !== 'number' || typeof fa.axis !== 'number') return false;\n }\n return true;\n}\n"]}
|
|
@@ -166,4 +166,14 @@ export interface RegimeBearing {
|
|
|
166
166
|
* @internal
|
|
167
167
|
*/
|
|
168
168
|
export declare function uncoveredRegions(family: string, models: readonly RegimeBearing[], samples: Readonly<Record<string, readonly number[]>>): readonly RegionSample[];
|
|
169
|
+
/**
|
|
170
|
+
* Build a regime from its family, its dimensioned parameters, its dimensionless
|
|
171
|
+
* inputs and its inequalities: the one owner of the literal
|
|
172
|
+
* `{ family, inequalities, groupDefinitions: deriveRegimeGroups(…) }` every
|
|
173
|
+
* atlas model and bridge used to spell out. The groups are derived here, so an
|
|
174
|
+
* inequality names a `PiGroup.formula` of the same dimension matrix.
|
|
175
|
+
*
|
|
176
|
+
* @internal
|
|
177
|
+
*/
|
|
178
|
+
export declare function makeRegime(family: string, parameters: readonly DimensionalVariable[], dimensionlessInputs: readonly string[], inequalities: readonly RegimeInequality[]): Regime;
|
|
169
179
|
//# sourceMappingURL=regime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regime.d.ts","sourceRoot":"","sources":["../../src/relations/regime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"regime.d.ts","sourceRoot":"","sources":["../../src/relations/regime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAEjF,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE3D;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,SAAS,mBAAmB,EAAE,EAC1C,mBAAmB,EAAE,SAAS,MAAM,EAAE,GACrC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBzB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC/C,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAChD;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAeD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAC5C,WAAW,CAeb;AAID;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAsB7D;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,SAAS;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,EAAE,CAqB7E;AA8FD,4DAA4D;AAC5D,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE9D;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,aAAa,CAWjE;AAED,qFAAqF;AACrF,MAAM,WAAW,YAAY;IAC3B,kEAAkE;IAClE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAClD;AAED,sFAAsF;AACtF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,GACnD,SAAS,YAAY,EAAE,CAgBzB;AAiBD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,SAAS,mBAAmB,EAAE,EAC1C,mBAAmB,EAAE,SAAS,MAAM,EAAE,EACtC,YAAY,EAAE,SAAS,gBAAgB,EAAE,GACxC,MAAM,CAMR"}
|
package/dist/relations/regime.js
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
*
|
|
13
13
|
* @module relations/regime
|
|
14
14
|
*/
|
|
15
|
+
import { compareCodepoint } from '../core/compare.js';
|
|
15
16
|
import { buckinghamPi } from '../dimensional/buckingham.js';
|
|
16
17
|
import { DIMENSIONLESS } from '../dimensional/types.js';
|
|
17
18
|
/**
|
|
@@ -160,7 +161,7 @@ export function collidingRegimeGroups(regimes) {
|
|
|
160
161
|
function exponentSignature(group) {
|
|
161
162
|
return Object.entries(group.exponents)
|
|
162
163
|
.filter(([, exp]) => exp !== 0)
|
|
163
|
-
.sort(([a], [b]) => (a
|
|
164
|
+
.sort(([a], [b]) => compareCodepoint(a, b))
|
|
164
165
|
.map(([name, exp]) => `${name}:${exp}`)
|
|
165
166
|
.join(',');
|
|
166
167
|
}
|
|
@@ -313,4 +314,20 @@ function gridPoints(samples) {
|
|
|
313
314
|
}
|
|
314
315
|
return points;
|
|
315
316
|
}
|
|
317
|
+
/**
|
|
318
|
+
* Build a regime from its family, its dimensioned parameters, its dimensionless
|
|
319
|
+
* inputs and its inequalities: the one owner of the literal
|
|
320
|
+
* `{ family, inequalities, groupDefinitions: deriveRegimeGroups(…) }` every
|
|
321
|
+
* atlas model and bridge used to spell out. The groups are derived here, so an
|
|
322
|
+
* inequality names a `PiGroup.formula` of the same dimension matrix.
|
|
323
|
+
*
|
|
324
|
+
* @internal
|
|
325
|
+
*/
|
|
326
|
+
export function makeRegime(family, parameters, dimensionlessInputs, inequalities) {
|
|
327
|
+
return {
|
|
328
|
+
family,
|
|
329
|
+
inequalities,
|
|
330
|
+
groupDefinitions: deriveRegimeGroups(family, parameters, dimensionlessInputs),
|
|
331
|
+
};
|
|
332
|
+
}
|
|
316
333
|
//# sourceMappingURL=regime.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regime.js","sourceRoot":"","sources":["../../src/relations/regime.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Regime derivation — π-groups as the coordinates a regime is written in.\n *\n * Dimensionless inputs are passed INTO `buckinghamPi` as zero-dimension\n * variables and come back as their own trivial groups, keyed by their own\n * names in `PiGroup.formula`. Nothing is synthesized here. (Measured in\n * design note §10 Q1 by executing `buckinghamPi`; the implementation plan's\n * \"plus one trivial group per dimensionless input\" would double-add.)\n *\n * `admitApproximation` stays in `src/atlas/regime.ts`: it is generic over\n * `AtlasBridge`, and moving it would drag that record into this vocabulary.\n *\n * @module relations/regime\n */\n\nimport { buckinghamPi } from '../dimensional/buckingham.js';\nimport type { DimensionalVariable, PiGroup } from '../dimensional/buckingham.js';\nimport { DIMENSIONLESS } from '../dimensional/types.js';\nimport type { Regime, RegimeInequality } from './types.js';\n\n/**\n * Derive the regime coordinates of a family, keyed by `PiGroup.formula`.\n *\n * A dimensionally-independent set has no groups and yields an empty record.\n *\n * @internal\n */\nexport function deriveRegimeGroups(\n family: string,\n parameters: readonly DimensionalVariable[],\n dimensionlessInputs: readonly string[],\n): Record<string, PiGroup> {\n const variables: DimensionalVariable[] = [\n ...parameters,\n ...dimensionlessInputs.map((name) => ({ name, dim: DIMENSIONLESS })),\n ];\n if (variables.length === 0) {\n throw new Error(`deriveRegimeGroups(${family}) requires at least one variable`);\n }\n // buckinghamPi rejects duplicate names itself; the message is clearer here.\n const names = variables.map((v) => v.name);\n if (new Set(names).size !== names.length) {\n throw new Error(\n `deriveRegimeGroups(${family}) requires unique names across parameters and ` +\n `dimensionless inputs; got [${names.join(', ')}]`,\n );\n }\n const groups: Record<string, PiGroup> = {};\n for (const group of buckinghamPi(variables).piGroups) groups[group.formula] = group;\n return groups;\n}\n\n/**\n * Result of {@link regimeHolds} — TRI-STATE, not a boolean.\n *\n * Design note §1, Adam A2 RED #2. The first draft of this rule returned a\n * boolean and folded \"could not check\" into one of the two answers. Both\n * foldings are wrong in a way that is invisible at the call site:\n *\n * - Folding absence into `true` is a SILENT PASS. A caller who supplies\n * `{ Ma: 0.1 }` and never computes `Re` gets a confident \"the regime\n * holds\" while `Re = 50` grossly violates it. The omission of the very\n * data that would reveal the violation is what produces the pass.\n * - Folding absence into `false` reports a VIOLATION that was never\n * observed, which is a different false claim and destroys the caller's\n * ability to tell \"I measured this and it failed\" from \"I never measured\n * this\". Only the first licenses saying the regime is violated.\n *\n * So `ok` carries three answers and the two failure sets are kept apart.\n *\n * @public\n */\nexport interface RegimeCheck {\n /**\n * `true` — every inequality was CHECKED and satisfied.\n * `false` — at least one was checked and VIOLATED.\n * `'unknown'` — nothing was violated, but at least one could NOT be checked.\n *\n * `'unknown'` is a failure to confirm validity, NEVER validity. A caller\n * asking \"may I use this model here?\" must test `=== true`; `!== false` is\n * the silent pass this type exists to prevent.\n */\n readonly ok: boolean | 'unknown';\n /** CHECKED and violated — carried whole so the caller can name them. */\n readonly violated: readonly RegimeInequality[];\n /** NOT checked: the π-group value was absent or non-finite. */\n readonly unchecked: readonly RegimeInequality[];\n /**\n * How many inequalities a finite value reached. `ok: true` with\n * `checked: 0` is a VACUOUS pass: the regime states no inequality (the\n * plasma, piezoelectricity and Tolman registrations), so nothing was\n * checked and nothing held. That is a different fact from a pass over a\n * non-empty list, and a coverage count must not add it (AGENTS law 4).\n */\n readonly checked: number;\n}\n\nfunction satisfies(value: number, ineq: RegimeInequality): boolean {\n switch (ineq.op) {\n case '<':\n return value < ineq.bound;\n case '<=':\n return value <= ineq.bound;\n case '>':\n return value > ineq.bound;\n case '>=':\n return value >= ineq.bound;\n }\n}\n\n/**\n * Check a regime against measured group values.\n *\n * A group with no supplied value, or a non-finite one, is UNCHECKED — not\n * violated and not satisfied. See {@link RegimeCheck} for why the distinction\n * is load-bearing. A regime with no inequalities returns `true` with\n * `checked: 0`: there was nothing to check and nothing went unchecked, so the\n * claim \"every inequality was checked and satisfied\" is vacuously true rather\n * than unknown, and `checked` says that nothing was checked. A caller that\n * counts coverage reads `checked`, never `ok` alone.\n *\n * A violation outranks an absence: once one inequality is CHECKED and fails,\n * the regime does not hold, whatever the unmeasured coordinates would say.\n *\n * @public\n */\nexport function regimeHolds(\n regime: Regime,\n groupValues: Readonly<Record<string, number>>,\n): RegimeCheck {\n const violated: RegimeInequality[] = [];\n const unchecked: RegimeInequality[] = [];\n let checked = 0;\n for (const ineq of regime.inequalities) {\n const value = groupValues[ineq.group];\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n unchecked.push(ineq);\n continue;\n }\n checked += 1;\n if (!satisfies(value, ineq)) violated.push(ineq);\n }\n const ok = violated.length > 0 ? false : unchecked.length > 0 ? 'unknown' : true;\n return { ok, violated, unchecked, checked };\n}\n\n// ── Sprint 2: regime algebra and admission ──────────────────────────────────\n\n/**\n * Merge two regimes into the regime that holds where BOTH hold.\n *\n * The conjunction is the whole operation: an inequality from either side is an\n * inequality of the intersection, so the list is concatenated rather than\n * reduced. No attempt is made to simplify `x < 1` and `x < 2` into one\n * inequality — the redundant one is still true, and a simplifier that dropped\n * the wrong one would be a silent change of claim.\n *\n * `groupDefinitions` are merged and CHECKED, not overwritten. Two regimes that\n * key the same `PiGroup.formula` to different exponent vectors are not\n * traceable to one dimension matrix, and quietly keeping one would hand the\n * caller a regime whose group definitions no longer describe its inequalities.\n *\n * @throws Error if the families differ, or if a shared group name carries\n * conflicting definitions.\n * @internal\n */\nexport function intersectRegimes(a: Regime, b: Regime): Regime {\n if (a.family !== b.family) {\n throw new Error(\n `intersectRegimes: families differ ('${a.family}' vs '${b.family}'); ` +\n 'a regime is stated in the groups of its own family',\n );\n }\n const groupDefinitions: Record<string, PiGroup> = { ...a.groupDefinitions };\n for (const [name, group] of Object.entries(b.groupDefinitions)) {\n const existing = groupDefinitions[name];\n if (existing !== undefined && !samePiGroup(existing, group)) {\n throw new Error(\n `intersectRegimes: group '${name}' is defined differently in the two regimes`,\n );\n }\n groupDefinitions[name] = group;\n }\n return {\n family: a.family,\n inequalities: [...a.inequalities, ...b.inequalities],\n groupDefinitions,\n };\n}\n\n/**\n * Group names whose π-groups differ across `regimes`. The path command leaves\n * those names unchecked on every step that defines them. It does not call\n * {@link intersectRegimes}: that function still throws when the families differ.\n *\n * The same key with the same exponent vector is not a collision. A zero\n * exponent is ignored, matching `--at` derivation.\n *\n * @internal\n */\nexport function collidingRegimeGroups(\n regimes: readonly Regime[],\n): readonly { readonly group: string; readonly families: readonly string[] }[] {\n const seen = new Map<string, { sig: string; families: string[] }>();\n const collisions = new Map<string, string[]>();\n for (const regime of regimes) {\n for (const [name, group] of Object.entries(regime.groupDefinitions)) {\n const sig = exponentSignature(group);\n const prev = seen.get(name);\n if (prev === undefined) {\n seen.set(name, { sig, families: [regime.family] });\n continue;\n }\n if (prev.sig === sig) {\n if (!prev.families.includes(regime.family)) prev.families.push(regime.family);\n continue;\n }\n const families = collisions.get(name) ?? [...prev.families];\n if (!families.includes(regime.family)) families.push(regime.family);\n collisions.set(name, families);\n }\n }\n return [...collisions.entries()].map(([group, families]) => ({ group, families }));\n}\n\nfunction exponentSignature(group: PiGroup): string {\n return Object.entries(group.exponents)\n .filter(([, exp]) => exp !== 0)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([name, exp]) => `${name}:${exp}`)\n .join(',');\n}\n\nfunction samePiGroup(x: PiGroup, y: PiGroup): boolean {\n const names = new Set([...Object.keys(x.exponents), ...Object.keys(y.exponents)]);\n for (const name of names) {\n if ((x.exponents[name] ?? 0) !== (y.exponents[name] ?? 0)) return false;\n }\n return true;\n}\n\n/** A closed-or-open interval on one π-group. Unbounded ends are ±Infinity. */\ninterface GroupInterval {\n lo: number;\n loOpen: boolean;\n hi: number;\n hiOpen: boolean;\n}\n\nfunction fullInterval(): GroupInterval {\n return { lo: -Infinity, loOpen: true, hi: Infinity, hiOpen: true };\n}\n\n/** Narrow `iv` in place by one inequality. */\nfunction narrow(iv: GroupInterval, ineq: RegimeInequality): void {\n switch (ineq.op) {\n case '<':\n case '<=': {\n const open = ineq.op === '<';\n if (ineq.bound < iv.hi || (ineq.bound === iv.hi && open)) {\n iv.hi = ineq.bound;\n iv.hiOpen = open;\n }\n return;\n }\n case '>':\n case '>=': {\n const open = ineq.op === '>';\n if (ineq.bound > iv.lo || (ineq.bound === iv.lo && open)) {\n iv.lo = ineq.bound;\n iv.loOpen = open;\n }\n return;\n }\n }\n}\n\n/** The per-group intervals the inequalities of a regime carve out. */\nfunction intervalsOf(regime: Regime): Map<string, GroupInterval> {\n const out = new Map<string, GroupInterval>();\n for (const ineq of regime.inequalities) {\n let iv = out.get(ineq.group);\n if (iv === undefined) {\n iv = fullInterval();\n out.set(ineq.group, iv);\n }\n narrow(iv, ineq);\n }\n return out;\n}\n\nfunction isEmpty(iv: GroupInterval): boolean {\n if (iv.lo > iv.hi) return true;\n return iv.lo === iv.hi && (iv.loOpen || iv.hiOpen);\n}\n\nfunction intersectIntervals(x: GroupInterval, y: GroupInterval): GroupInterval {\n const lo = Math.max(x.lo, y.lo);\n const hi = Math.min(x.hi, y.hi);\n return {\n lo,\n loOpen: (x.lo === lo && x.loOpen) || (y.lo === lo && y.loOpen),\n hi,\n hiOpen: (x.hi === hi && x.hiOpen) || (y.hi === hi && y.hiOpen),\n };\n}\n\n/** Is every point of `inner` a point of `outer`? */\nfunction contains(outer: GroupInterval, inner: GroupInterval): boolean {\n if (isEmpty(inner)) return true;\n const loOk =\n outer.lo < inner.lo || (outer.lo === inner.lo && (!outer.loOpen || inner.loOpen));\n const hiOk =\n outer.hi > inner.hi || (outer.hi === inner.hi && (!outer.hiOpen || inner.hiOpen));\n return loOk && hiOk;\n}\n\n/** How two regimes sit relative to each other. @internal */\nexport type RegimeOverlap = 'disjoint' | 'overlap' | 'nested';\n\n/**\n * Classify two regimes on the group names they SHARE.\n *\n * Shared names only, and that restriction is the whole subtlety. A group one\n * regime constrains and the other says nothing about cannot separate them:\n * silence is not a constraint, so treating the unconstrained side as empty\n * would report `'disjoint'` for two regimes that genuinely overlap. The answer\n * is therefore about the shared coordinates, and says nothing about the\n * private ones.\n *\n * - `'disjoint'` — some shared group has intervals that cannot both hold.\n * - `'nested'` — the shared box of one regime contains the other (equal boxes,\n * and the no-shared-group case, are nested: each contains the other).\n * - `'overlap'` — they meet, and neither contains the other.\n *\n * @internal\n */\nexport function regimeOverlap(a: Regime, b: Regime): RegimeOverlap {\n const ia = intervalsOf(a);\n const ib = intervalsOf(b);\n const shared = [...ia.keys()].filter((name) => ib.has(name));\n\n for (const name of shared) {\n if (isEmpty(intersectIntervals(ia.get(name)!, ib.get(name)!))) return 'disjoint';\n }\n const aInB = shared.every((name) => contains(ib.get(name)!, ia.get(name)!));\n const bInA = shared.every((name) => contains(ia.get(name)!, ib.get(name)!));\n return aInB || bInA ? 'nested' : 'overlap';\n}\n\n/** One grid cell of a sampled group box, and the regimes that cover it. @internal */\nexport interface RegionSample {\n /** The π-group value at this cell, keyed by `PiGroup.formula`. */\n readonly point: Readonly<Record<string, number>>;\n}\n\n/** A record carrying a regime — `AtlasModel` and `AtlasBridge` both fit. @internal */\nexport interface RegimeBearing {\n readonly id: string;\n readonly regime: Regime;\n}\n\n/**\n * Grid-sample a group box and list the cells no regime covers.\n *\n * `samples` IS the box: one explicit axis of values per π-group name. The box\n * is not derived from the bounds the regimes themselves carry, and that is\n * deliberate — a synthesized box would report coverage against an extent this\n * library invented, so \"uncovered\" would measure the guess rather than the\n * atlas. The caller states where it wants to know about.\n *\n * COVERED means some regime returned `true` with at least one inequality\n * checked. An `'unknown'` is NOT coverage, by the same rule that makes\n * {@link regimeHolds} tri-state: a regime whose groups the sample axes never\n * mention has not been shown to apply anywhere. Neither is a vacuous pass: a\n * regime that states no inequality has checked nothing at the point.\n *\n * Records of another family are skipped, so a mixed list is safe to pass.\n *\n * @internal\n */\nexport function uncoveredRegions(\n family: string,\n models: readonly RegimeBearing[],\n samples: Readonly<Record<string, readonly number[]>>,\n): readonly RegionSample[] {\n const inFamily = models.filter((m) => m.regime.family === family);\n const uncovered: RegionSample[] = [];\n for (const point of gridPoints(samples)) {\n // `checked > 0`: a regime with no inequality passes vacuously and has shown\n // nothing about this point, so it covers nothing (the rule in `regimeHolds`'s\n // doc comment: coverage reads `checked`, never `ok` alone).\n const covered = inFamily.some((m) => {\n const check = regimeHolds(m.regime, point);\n return check.ok === true && check.checked > 0;\n });\n // An uncovered cell is covered by nothing, by definition; the sample\n // carries the point and no list that could only ever be empty.\n if (!covered) uncovered.push({ point });\n }\n return uncovered;\n}\n\n/** Cartesian product of the named axes. An axis with no values yields nothing. */\nfunction gridPoints(\n samples: Readonly<Record<string, readonly number[]>>,\n): readonly Record<string, number>[] {\n let points: Record<string, number>[] = [{}];\n for (const [group, axis] of Object.entries(samples)) {\n const next: Record<string, number>[] = [];\n for (const base of points) {\n for (const value of axis) next.push({ ...base, [group]: value });\n }\n points = next;\n }\n return points;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"regime.js","sourceRoot":"","sources":["../../src/relations/regime.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Regime derivation — π-groups as the coordinates a regime is written in.\n *\n * Dimensionless inputs are passed INTO `buckinghamPi` as zero-dimension\n * variables and come back as their own trivial groups, keyed by their own\n * names in `PiGroup.formula`. Nothing is synthesized here. (Measured in\n * design note §10 Q1 by executing `buckinghamPi`; the implementation plan's\n * \"plus one trivial group per dimensionless input\" would double-add.)\n *\n * `admitApproximation` stays in `src/atlas/regime.ts`: it is generic over\n * `AtlasBridge`, and moving it would drag that record into this vocabulary.\n *\n * @module relations/regime\n */\n\nimport { compareCodepoint } from '../core/compare.js';\nimport { buckinghamPi } from '../dimensional/buckingham.js';\nimport type { DimensionalVariable, PiGroup } from '../dimensional/buckingham.js';\nimport { DIMENSIONLESS } from '../dimensional/types.js';\nimport type { Regime, RegimeInequality } from './types.js';\n\n/**\n * Derive the regime coordinates of a family, keyed by `PiGroup.formula`.\n *\n * A dimensionally-independent set has no groups and yields an empty record.\n *\n * @internal\n */\nexport function deriveRegimeGroups(\n family: string,\n parameters: readonly DimensionalVariable[],\n dimensionlessInputs: readonly string[],\n): Record<string, PiGroup> {\n const variables: DimensionalVariable[] = [\n ...parameters,\n ...dimensionlessInputs.map((name) => ({ name, dim: DIMENSIONLESS })),\n ];\n if (variables.length === 0) {\n throw new Error(`deriveRegimeGroups(${family}) requires at least one variable`);\n }\n // buckinghamPi rejects duplicate names itself; the message is clearer here.\n const names = variables.map((v) => v.name);\n if (new Set(names).size !== names.length) {\n throw new Error(\n `deriveRegimeGroups(${family}) requires unique names across parameters and ` +\n `dimensionless inputs; got [${names.join(', ')}]`,\n );\n }\n const groups: Record<string, PiGroup> = {};\n for (const group of buckinghamPi(variables).piGroups) groups[group.formula] = group;\n return groups;\n}\n\n/**\n * Result of {@link regimeHolds} — TRI-STATE, not a boolean.\n *\n * Design note §1, Adam A2 RED #2. The first draft of this rule returned a\n * boolean and folded \"could not check\" into one of the two answers. Both\n * foldings are wrong in a way that is invisible at the call site:\n *\n * - Folding absence into `true` is a SILENT PASS. A caller who supplies\n * `{ Ma: 0.1 }` and never computes `Re` gets a confident \"the regime\n * holds\" while `Re = 50` grossly violates it. The omission of the very\n * data that would reveal the violation is what produces the pass.\n * - Folding absence into `false` reports a VIOLATION that was never\n * observed, which is a different false claim and destroys the caller's\n * ability to tell \"I measured this and it failed\" from \"I never measured\n * this\". Only the first licenses saying the regime is violated.\n *\n * So `ok` carries three answers and the two failure sets are kept apart.\n *\n * @public\n */\nexport interface RegimeCheck {\n /**\n * `true` — every inequality was CHECKED and satisfied.\n * `false` — at least one was checked and VIOLATED.\n * `'unknown'` — nothing was violated, but at least one could NOT be checked.\n *\n * `'unknown'` is a failure to confirm validity, NEVER validity. A caller\n * asking \"may I use this model here?\" must test `=== true`; `!== false` is\n * the silent pass this type exists to prevent.\n */\n readonly ok: boolean | 'unknown';\n /** CHECKED and violated — carried whole so the caller can name them. */\n readonly violated: readonly RegimeInequality[];\n /** NOT checked: the π-group value was absent or non-finite. */\n readonly unchecked: readonly RegimeInequality[];\n /**\n * How many inequalities a finite value reached. `ok: true` with\n * `checked: 0` is a VACUOUS pass: the regime states no inequality (the\n * plasma, piezoelectricity and Tolman registrations), so nothing was\n * checked and nothing held. That is a different fact from a pass over a\n * non-empty list, and a coverage count must not add it (AGENTS law 4).\n */\n readonly checked: number;\n}\n\nfunction satisfies(value: number, ineq: RegimeInequality): boolean {\n switch (ineq.op) {\n case '<':\n return value < ineq.bound;\n case '<=':\n return value <= ineq.bound;\n case '>':\n return value > ineq.bound;\n case '>=':\n return value >= ineq.bound;\n }\n}\n\n/**\n * Check a regime against measured group values.\n *\n * A group with no supplied value, or a non-finite one, is UNCHECKED — not\n * violated and not satisfied. See {@link RegimeCheck} for why the distinction\n * is load-bearing. A regime with no inequalities returns `true` with\n * `checked: 0`: there was nothing to check and nothing went unchecked, so the\n * claim \"every inequality was checked and satisfied\" is vacuously true rather\n * than unknown, and `checked` says that nothing was checked. A caller that\n * counts coverage reads `checked`, never `ok` alone.\n *\n * A violation outranks an absence: once one inequality is CHECKED and fails,\n * the regime does not hold, whatever the unmeasured coordinates would say.\n *\n * @public\n */\nexport function regimeHolds(\n regime: Regime,\n groupValues: Readonly<Record<string, number>>,\n): RegimeCheck {\n const violated: RegimeInequality[] = [];\n const unchecked: RegimeInequality[] = [];\n let checked = 0;\n for (const ineq of regime.inequalities) {\n const value = groupValues[ineq.group];\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n unchecked.push(ineq);\n continue;\n }\n checked += 1;\n if (!satisfies(value, ineq)) violated.push(ineq);\n }\n const ok = violated.length > 0 ? false : unchecked.length > 0 ? 'unknown' : true;\n return { ok, violated, unchecked, checked };\n}\n\n// ── Sprint 2: regime algebra and admission ──────────────────────────────────\n\n/**\n * Merge two regimes into the regime that holds where BOTH hold.\n *\n * The conjunction is the whole operation: an inequality from either side is an\n * inequality of the intersection, so the list is concatenated rather than\n * reduced. No attempt is made to simplify `x < 1` and `x < 2` into one\n * inequality — the redundant one is still true, and a simplifier that dropped\n * the wrong one would be a silent change of claim.\n *\n * `groupDefinitions` are merged and CHECKED, not overwritten. Two regimes that\n * key the same `PiGroup.formula` to different exponent vectors are not\n * traceable to one dimension matrix, and quietly keeping one would hand the\n * caller a regime whose group definitions no longer describe its inequalities.\n *\n * @throws Error if the families differ, or if a shared group name carries\n * conflicting definitions.\n * @internal\n */\nexport function intersectRegimes(a: Regime, b: Regime): Regime {\n if (a.family !== b.family) {\n throw new Error(\n `intersectRegimes: families differ ('${a.family}' vs '${b.family}'); ` +\n 'a regime is stated in the groups of its own family',\n );\n }\n const groupDefinitions: Record<string, PiGroup> = { ...a.groupDefinitions };\n for (const [name, group] of Object.entries(b.groupDefinitions)) {\n const existing = groupDefinitions[name];\n if (existing !== undefined && !samePiGroup(existing, group)) {\n throw new Error(\n `intersectRegimes: group '${name}' is defined differently in the two regimes`,\n );\n }\n groupDefinitions[name] = group;\n }\n return {\n family: a.family,\n inequalities: [...a.inequalities, ...b.inequalities],\n groupDefinitions,\n };\n}\n\n/**\n * Group names whose π-groups differ across `regimes`. The path command leaves\n * those names unchecked on every step that defines them. It does not call\n * {@link intersectRegimes}: that function still throws when the families differ.\n *\n * The same key with the same exponent vector is not a collision. A zero\n * exponent is ignored, matching `--at` derivation.\n *\n * @internal\n */\nexport function collidingRegimeGroups(\n regimes: readonly Regime[],\n): readonly { readonly group: string; readonly families: readonly string[] }[] {\n const seen = new Map<string, { sig: string; families: string[] }>();\n const collisions = new Map<string, string[]>();\n for (const regime of regimes) {\n for (const [name, group] of Object.entries(regime.groupDefinitions)) {\n const sig = exponentSignature(group);\n const prev = seen.get(name);\n if (prev === undefined) {\n seen.set(name, { sig, families: [regime.family] });\n continue;\n }\n if (prev.sig === sig) {\n if (!prev.families.includes(regime.family)) prev.families.push(regime.family);\n continue;\n }\n const families = collisions.get(name) ?? [...prev.families];\n if (!families.includes(regime.family)) families.push(regime.family);\n collisions.set(name, families);\n }\n }\n return [...collisions.entries()].map(([group, families]) => ({ group, families }));\n}\n\nfunction exponentSignature(group: PiGroup): string {\n return Object.entries(group.exponents)\n .filter(([, exp]) => exp !== 0)\n .sort(([a], [b]) => compareCodepoint(a, b))\n .map(([name, exp]) => `${name}:${exp}`)\n .join(',');\n}\n\nfunction samePiGroup(x: PiGroup, y: PiGroup): boolean {\n const names = new Set([...Object.keys(x.exponents), ...Object.keys(y.exponents)]);\n for (const name of names) {\n if ((x.exponents[name] ?? 0) !== (y.exponents[name] ?? 0)) return false;\n }\n return true;\n}\n\n/** A closed-or-open interval on one π-group. Unbounded ends are ±Infinity. */\ninterface GroupInterval {\n lo: number;\n loOpen: boolean;\n hi: number;\n hiOpen: boolean;\n}\n\nfunction fullInterval(): GroupInterval {\n return { lo: -Infinity, loOpen: true, hi: Infinity, hiOpen: true };\n}\n\n/** Narrow `iv` in place by one inequality. */\nfunction narrow(iv: GroupInterval, ineq: RegimeInequality): void {\n switch (ineq.op) {\n case '<':\n case '<=': {\n const open = ineq.op === '<';\n if (ineq.bound < iv.hi || (ineq.bound === iv.hi && open)) {\n iv.hi = ineq.bound;\n iv.hiOpen = open;\n }\n return;\n }\n case '>':\n case '>=': {\n const open = ineq.op === '>';\n if (ineq.bound > iv.lo || (ineq.bound === iv.lo && open)) {\n iv.lo = ineq.bound;\n iv.loOpen = open;\n }\n return;\n }\n }\n}\n\n/** The per-group intervals the inequalities of a regime carve out. */\nfunction intervalsOf(regime: Regime): Map<string, GroupInterval> {\n const out = new Map<string, GroupInterval>();\n for (const ineq of regime.inequalities) {\n let iv = out.get(ineq.group);\n if (iv === undefined) {\n iv = fullInterval();\n out.set(ineq.group, iv);\n }\n narrow(iv, ineq);\n }\n return out;\n}\n\nfunction isEmpty(iv: GroupInterval): boolean {\n if (iv.lo > iv.hi) return true;\n return iv.lo === iv.hi && (iv.loOpen || iv.hiOpen);\n}\n\nfunction intersectIntervals(x: GroupInterval, y: GroupInterval): GroupInterval {\n const lo = Math.max(x.lo, y.lo);\n const hi = Math.min(x.hi, y.hi);\n return {\n lo,\n loOpen: (x.lo === lo && x.loOpen) || (y.lo === lo && y.loOpen),\n hi,\n hiOpen: (x.hi === hi && x.hiOpen) || (y.hi === hi && y.hiOpen),\n };\n}\n\n/** Is every point of `inner` a point of `outer`? */\nfunction contains(outer: GroupInterval, inner: GroupInterval): boolean {\n if (isEmpty(inner)) return true;\n const loOk =\n outer.lo < inner.lo || (outer.lo === inner.lo && (!outer.loOpen || inner.loOpen));\n const hiOk =\n outer.hi > inner.hi || (outer.hi === inner.hi && (!outer.hiOpen || inner.hiOpen));\n return loOk && hiOk;\n}\n\n/** How two regimes sit relative to each other. @internal */\nexport type RegimeOverlap = 'disjoint' | 'overlap' | 'nested';\n\n/**\n * Classify two regimes on the group names they SHARE.\n *\n * Shared names only, and that restriction is the whole subtlety. A group one\n * regime constrains and the other says nothing about cannot separate them:\n * silence is not a constraint, so treating the unconstrained side as empty\n * would report `'disjoint'` for two regimes that genuinely overlap. The answer\n * is therefore about the shared coordinates, and says nothing about the\n * private ones.\n *\n * - `'disjoint'` — some shared group has intervals that cannot both hold.\n * - `'nested'` — the shared box of one regime contains the other (equal boxes,\n * and the no-shared-group case, are nested: each contains the other).\n * - `'overlap'` — they meet, and neither contains the other.\n *\n * @internal\n */\nexport function regimeOverlap(a: Regime, b: Regime): RegimeOverlap {\n const ia = intervalsOf(a);\n const ib = intervalsOf(b);\n const shared = [...ia.keys()].filter((name) => ib.has(name));\n\n for (const name of shared) {\n if (isEmpty(intersectIntervals(ia.get(name)!, ib.get(name)!))) return 'disjoint';\n }\n const aInB = shared.every((name) => contains(ib.get(name)!, ia.get(name)!));\n const bInA = shared.every((name) => contains(ia.get(name)!, ib.get(name)!));\n return aInB || bInA ? 'nested' : 'overlap';\n}\n\n/** One grid cell of a sampled group box, and the regimes that cover it. @internal */\nexport interface RegionSample {\n /** The π-group value at this cell, keyed by `PiGroup.formula`. */\n readonly point: Readonly<Record<string, number>>;\n}\n\n/** A record carrying a regime — `AtlasModel` and `AtlasBridge` both fit. @internal */\nexport interface RegimeBearing {\n readonly id: string;\n readonly regime: Regime;\n}\n\n/**\n * Grid-sample a group box and list the cells no regime covers.\n *\n * `samples` IS the box: one explicit axis of values per π-group name. The box\n * is not derived from the bounds the regimes themselves carry, and that is\n * deliberate — a synthesized box would report coverage against an extent this\n * library invented, so \"uncovered\" would measure the guess rather than the\n * atlas. The caller states where it wants to know about.\n *\n * COVERED means some regime returned `true` with at least one inequality\n * checked. An `'unknown'` is NOT coverage, by the same rule that makes\n * {@link regimeHolds} tri-state: a regime whose groups the sample axes never\n * mention has not been shown to apply anywhere. Neither is a vacuous pass: a\n * regime that states no inequality has checked nothing at the point.\n *\n * Records of another family are skipped, so a mixed list is safe to pass.\n *\n * @internal\n */\nexport function uncoveredRegions(\n family: string,\n models: readonly RegimeBearing[],\n samples: Readonly<Record<string, readonly number[]>>,\n): readonly RegionSample[] {\n const inFamily = models.filter((m) => m.regime.family === family);\n const uncovered: RegionSample[] = [];\n for (const point of gridPoints(samples)) {\n // `checked > 0`: a regime with no inequality passes vacuously and has shown\n // nothing about this point, so it covers nothing (the rule in `regimeHolds`'s\n // doc comment: coverage reads `checked`, never `ok` alone).\n const covered = inFamily.some((m) => {\n const check = regimeHolds(m.regime, point);\n return check.ok === true && check.checked > 0;\n });\n // An uncovered cell is covered by nothing, by definition; the sample\n // carries the point and no list that could only ever be empty.\n if (!covered) uncovered.push({ point });\n }\n return uncovered;\n}\n\n/** Cartesian product of the named axes. An axis with no values yields nothing. */\nfunction gridPoints(\n samples: Readonly<Record<string, readonly number[]>>,\n): readonly Record<string, number>[] {\n let points: Record<string, number>[] = [{}];\n for (const [group, axis] of Object.entries(samples)) {\n const next: Record<string, number>[] = [];\n for (const base of points) {\n for (const value of axis) next.push({ ...base, [group]: value });\n }\n points = next;\n }\n return points;\n}\n\n/**\n * Build a regime from its family, its dimensioned parameters, its dimensionless\n * inputs and its inequalities: the one owner of the literal\n * `{ family, inequalities, groupDefinitions: deriveRegimeGroups(…) }` every\n * atlas model and bridge used to spell out. The groups are derived here, so an\n * inequality names a `PiGroup.formula` of the same dimension matrix.\n *\n * @internal\n */\nexport function makeRegime(\n family: string,\n parameters: readonly DimensionalVariable[],\n dimensionlessInputs: readonly string[],\n inequalities: readonly RegimeInequality[],\n): Regime {\n return {\n family,\n inequalities,\n groupDefinitions: deriveRegimeGroups(family, parameters, dimensionlessInputs),\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "universal-physics-tensor",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "11.0.0",
|
|
4
4
|
"description": "Computational framework for exploring unified physics through tensor formalism",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -98,13 +98,13 @@
|
|
|
98
98
|
},
|
|
99
99
|
"homepage": "https://github.com/danielsimonjr/Universal-Physics-Tensor#readme",
|
|
100
100
|
"dependencies": {
|
|
101
|
-
"@danielsimonjr/mathts-autograd": "^0.3.
|
|
102
|
-
"@danielsimonjr/mathts-core": "^0.
|
|
103
|
-
"@danielsimonjr/mathts-expression": "^0.10.
|
|
104
|
-
"@danielsimonjr/mathts-functions": "^0.68.
|
|
105
|
-
"@danielsimonjr/mathts-matrix": "^0.7.
|
|
101
|
+
"@danielsimonjr/mathts-autograd": "^0.3.18",
|
|
102
|
+
"@danielsimonjr/mathts-core": "^0.18.1",
|
|
103
|
+
"@danielsimonjr/mathts-expression": "^0.10.2",
|
|
104
|
+
"@danielsimonjr/mathts-functions": "^0.68.5",
|
|
105
|
+
"@danielsimonjr/mathts-matrix": "^0.7.8",
|
|
106
106
|
"@danielsimonjr/mathts-parallel": "^0.6.8",
|
|
107
|
-
"@danielsimonjr/mathts-tensor": "^0.2.
|
|
107
|
+
"@danielsimonjr/mathts-tensor": "^0.2.24",
|
|
108
108
|
"@danielsimonjr/mathts-wasm": "^0.3.0",
|
|
109
109
|
"@danielsimonjr/mathts-workerpool": "^0.2.6"
|
|
110
110
|
},
|