universal-physics-tensor 0.7.3 → 0.14.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 +147 -109
- package/bin/upt.mjs +508 -0
- package/dist/bridges/be23-planckian-confrontation.d.ts +162 -0
- package/dist/bridges/be23-planckian-confrontation.d.ts.map +1 -0
- package/dist/bridges/be23-planckian-confrontation.js +196 -0
- package/dist/bridges/be23-planckian-confrontation.js.map +1 -0
- package/dist/bridges/be36-gw170817-confrontation.d.ts +111 -0
- package/dist/bridges/be36-gw170817-confrontation.d.ts.map +1 -0
- package/dist/bridges/be36-gw170817-confrontation.js +100 -0
- package/dist/bridges/be36-gw170817-confrontation.js.map +1 -0
- package/dist/bridges/bridge-equations.d.ts +129 -0
- package/dist/bridges/bridge-equations.d.ts.map +1 -0
- package/dist/bridges/bridge-equations.js +130 -0
- package/dist/bridges/bridge-equations.js.map +1 -0
- package/dist/bridges/catalog-adapter.d.ts +1 -1
- package/dist/bridges/catalog-adapter.js +1 -1
- package/dist/bridges/confrontation-coverage.d.ts +67 -0
- package/dist/bridges/confrontation-coverage.d.ts.map +1 -0
- package/dist/bridges/confrontation-coverage.js +83 -0
- package/dist/bridges/confrontation-coverage.js.map +1 -0
- package/dist/bridges/equations/_be-helpers.d.ts +2 -1
- package/dist/bridges/equations/_be-helpers.d.ts.map +1 -1
- package/dist/bridges/equations/be-12-coherence-length.d.ts +1 -1
- package/dist/bridges/equations/be-13-einstein-trace.d.ts +2 -2
- package/dist/bridges/equations/be-13-einstein-trace.js +1 -1
- package/dist/bridges/equations/be-14-ryu-takayanagi.d.ts +2 -2
- package/dist/bridges/equations/be-15-emergence.d.ts +19 -5
- package/dist/bridges/equations/be-15-emergence.d.ts.map +1 -1
- package/dist/bridges/equations/be-15-emergence.js +18 -4
- package/dist/bridges/equations/be-15-emergence.js.map +1 -1
- package/dist/bridges/equations/be-16-landauer.d.ts +1 -1
- package/dist/bridges/equations/be-17-einstein-cartan.d.ts +1 -1
- package/dist/bridges/equations/be-18-higgs-mass.d.ts +1 -1
- package/dist/bridges/equations/be-19-quantum-bounce.d.ts +1 -1
- package/dist/bridges/equations/be-20-vacuum-energy.d.ts +4 -4
- package/dist/bridges/equations/be-20-vacuum-energy.d.ts.map +1 -1
- package/dist/bridges/equations/be-20-vacuum-energy.js +4 -2
- package/dist/bridges/equations/be-20-vacuum-energy.js.map +1 -1
- package/dist/bridges/equations/be-22-topological-entanglement.d.ts +1 -1
- package/dist/bridges/equations/be-23-syk-planckian.d.ts +1 -1
- package/dist/bridges/equations/be-24-foerster-fret.d.ts +1 -1
- package/dist/bridges/equations/be-25-iit-phi.d.ts +1 -1
- package/dist/bridges/equations/be-25-orch-or.d.ts +13 -1
- package/dist/bridges/equations/be-25-orch-or.d.ts.map +1 -1
- package/dist/bridges/equations/be-25-orch-or.js +12 -0
- package/dist/bridges/equations/be-25-orch-or.js.map +1 -1
- package/dist/bridges/equations/be-26-dna-tunneling.d.ts +2 -2
- package/dist/bridges/equations/be-26-dna-tunneling.js +1 -1
- package/dist/bridges/equations/be-27-effective-temperature.d.ts +1 -1
- package/dist/bridges/equations/be-28-onsager-entropy-production.d.ts +1 -1
- package/dist/bridges/equations/be-29-jarzynski.d.ts +1 -1
- package/dist/bridges/equations/be-30-flm-first-law.d.ts +2 -2
- package/dist/bridges/equations/be-31-causal-set-bd.d.ts +1 -1
- package/dist/bridges/equations/be-32-quantum-reference-frame.d.ts +1 -1
- package/dist/bridges/equations/be-33-hertz-millis.d.ts +1 -1
- package/dist/bridges/equations/be-34-kibble-zurek.d.ts +1 -1
- package/dist/bridges/equations/be-35-conformal-bootstrap.d.ts +1 -1
- package/dist/bridges/equations/be-36-gw-speed-bound.d.ts +12 -5
- package/dist/bridges/equations/be-36-gw-speed-bound.d.ts.map +1 -1
- package/dist/bridges/equations/be-36-gw-speed-bound.js +11 -4
- package/dist/bridges/equations/be-36-gw-speed-bound.js.map +1 -1
- package/dist/bridges/equations/be-38-mond.d.ts +1 -1
- package/dist/bridges/equations/be-39-asymptotic-safety.d.ts +2 -2
- package/dist/bridges/equations/be-40-composite-higgs.d.ts +1 -1
- package/dist/bridges/equations/be-41-swampland.d.ts +1 -1
- package/dist/bridges/equations/be-43-er-epr.d.ts +1 -1
- package/dist/bridges/equations/be-44-soft-hair.d.ts +1 -1
- package/dist/bridges/equations/be-45-tcc.d.ts +1 -1
- package/dist/bridges/equations/be-46-multiverse-measure.d.ts +1 -1
- package/dist/bridges/equations/be-47-bbn-dark-sector.d.ts +1 -1
- package/dist/bridges/equations/be-48-grw-localization.d.ts +1 -1
- package/dist/bridges/equations/be-49-quantum-darwinism.d.ts +1 -1
- package/dist/bridges/equations/be-50-wheeler-feynman.d.ts +1 -1
- package/dist/bridges/index.d.ts +10 -7
- package/dist/bridges/index.d.ts.map +1 -1
- package/dist/bridges/index.js +47 -34
- package/dist/bridges/index.js.map +1 -1
- package/dist/bridges/membership.d.ts +44 -0
- package/dist/bridges/membership.d.ts.map +1 -0
- package/dist/bridges/membership.js +59 -0
- package/dist/bridges/membership.js.map +1 -0
- package/dist/bridges/rejected.d.ts +40 -0
- package/dist/bridges/rejected.d.ts.map +1 -0
- package/dist/bridges/rejected.js +81 -0
- package/dist/bridges/rejected.js.map +1 -0
- package/dist/composition/bridge-analysis.d.ts +189 -0
- package/dist/composition/bridge-analysis.d.ts.map +1 -0
- package/dist/composition/bridge-analysis.js +445 -0
- package/dist/composition/bridge-analysis.js.map +1 -0
- package/dist/composition/bridge-prediction.d.ts +95 -0
- package/dist/composition/bridge-prediction.d.ts.map +1 -0
- package/dist/composition/bridge-prediction.js +0 -0
- package/dist/composition/bridge-prediction.js.map +1 -0
- package/dist/composition/catalog-graph.d.ts +20 -0
- package/dist/composition/catalog-graph.d.ts.map +1 -0
- package/dist/composition/catalog-graph.js +39 -0
- package/dist/composition/catalog-graph.js.map +1 -0
- package/dist/composition/compose-surface.d.ts +12 -0
- package/dist/composition/compose-surface.d.ts.map +1 -0
- package/dist/composition/compose-surface.js +10 -0
- package/dist/composition/compose-surface.js.map +1 -0
- package/dist/composition/compose-symbolic.d.ts +75 -0
- package/dist/composition/compose-symbolic.d.ts.map +1 -0
- package/dist/composition/compose-symbolic.js +157 -0
- package/dist/composition/compose-symbolic.js.map +1 -0
- package/dist/composition/compose.d.ts +110 -0
- package/dist/composition/compose.d.ts.map +1 -0
- package/dist/composition/compose.js +231 -0
- package/dist/composition/compose.js.map +1 -0
- package/dist/composition/consistency.d.ts +24 -0
- package/dist/composition/consistency.d.ts.map +1 -0
- package/dist/composition/consistency.js +26 -0
- package/dist/composition/consistency.js.map +1 -0
- package/dist/composition/discovery.d.ts +104 -0
- package/dist/composition/discovery.d.ts.map +1 -0
- package/dist/composition/discovery.js +165 -0
- package/dist/composition/discovery.js.map +1 -0
- package/dist/composition/edge.d.ts +139 -0
- package/dist/composition/edge.d.ts.map +1 -0
- package/dist/composition/edge.js +72 -0
- package/dist/composition/edge.js.map +1 -0
- package/dist/composition/edges/calibration.d.ts +107 -0
- package/dist/composition/edges/calibration.d.ts.map +1 -0
- package/dist/composition/edges/calibration.js +373 -0
- package/dist/composition/edges/calibration.js.map +1 -0
- package/dist/composition/edges/catalog-full.d.ts +299 -0
- package/dist/composition/edges/catalog-full.d.ts.map +1 -0
- package/dist/composition/edges/catalog-full.js +989 -0
- package/dist/composition/edges/catalog-full.js.map +1 -0
- package/dist/composition/edges/catalog-tranche.d.ts +112 -0
- package/dist/composition/edges/catalog-tranche.d.ts.map +1 -0
- package/dist/composition/edges/catalog-tranche.js +241 -0
- package/dist/composition/edges/catalog-tranche.js.map +1 -0
- package/dist/composition/enumerate.d.ts +67 -0
- package/dist/composition/enumerate.d.ts.map +1 -0
- package/dist/composition/enumerate.js +78 -0
- package/dist/composition/enumerate.js.map +1 -0
- package/dist/composition/explain.d.ts +102 -0
- package/dist/composition/explain.d.ts.map +1 -0
- package/dist/composition/explain.js +244 -0
- package/dist/composition/explain.js.map +1 -0
- package/dist/composition/expr-eval.d.ts +33 -0
- package/dist/composition/expr-eval.d.ts.map +1 -0
- package/dist/composition/expr-eval.js +95 -0
- package/dist/composition/expr-eval.js.map +1 -0
- package/dist/composition/expr-simplify.d.ts +60 -0
- package/dist/composition/expr-simplify.d.ts.map +1 -0
- package/dist/composition/expr-simplify.js +330 -0
- package/dist/composition/expr-simplify.js.map +1 -0
- package/dist/composition/expr-subst.d.ts +29 -0
- package/dist/composition/expr-subst.d.ts.map +1 -0
- package/dist/composition/expr-subst.js +60 -0
- package/dist/composition/expr-subst.js.map +1 -0
- package/dist/composition/identifiability.d.ts +103 -0
- package/dist/composition/identifiability.d.ts.map +1 -0
- package/dist/composition/identifiability.js +148 -0
- package/dist/composition/identifiability.js.map +1 -0
- package/dist/composition/index.d.ts +37 -0
- package/dist/composition/index.d.ts.map +1 -0
- package/dist/composition/index.js +27 -0
- package/dist/composition/index.js.map +1 -0
- package/dist/composition/quantities.d.ts +297 -0
- package/dist/composition/quantities.d.ts.map +1 -0
- package/dist/composition/quantities.js +1017 -0
- package/dist/composition/quantities.js.map +1 -0
- package/dist/composition/quantity.d.ts +59 -0
- package/dist/composition/quantity.d.ts.map +1 -0
- package/dist/composition/quantity.js +36 -0
- package/dist/composition/quantity.js.map +1 -0
- package/dist/composition/retrodiction.d.ts +94 -0
- package/dist/composition/retrodiction.d.ts.map +1 -0
- package/dist/composition/retrodiction.js +171 -0
- package/dist/composition/retrodiction.js.map +1 -0
- package/dist/composition/symbolic-constants.d.ts +33 -0
- package/dist/composition/symbolic-constants.d.ts.map +1 -0
- package/dist/composition/symbolic-constants.js +50 -0
- package/dist/composition/symbolic-constants.js.map +1 -0
- package/dist/composition/uncertainty.d.ts +45 -0
- package/dist/composition/uncertainty.d.ts.map +1 -0
- package/dist/composition/uncertainty.js +59 -0
- package/dist/composition/uncertainty.js.map +1 -0
- package/dist/core/axes-registry.d.ts +1 -1
- package/dist/core/axes-registry.js +1 -1
- package/dist/core/cell.d.ts +0 -8
- package/dist/core/cell.d.ts.map +1 -1
- package/dist/core/cell.js +1 -1
- package/dist/core/cell.js.map +1 -1
- package/dist/core/constants.d.ts +15 -1
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +15 -1
- package/dist/core/constants.js.map +1 -1
- package/dist/core/flux-rules.d.ts +10 -13
- package/dist/core/flux-rules.d.ts.map +1 -1
- package/dist/core/flux-rules.js +19 -10
- package/dist/core/flux-rules.js.map +1 -1
- package/dist/core/labeled-tensor.d.ts +80 -1
- package/dist/core/labeled-tensor.d.ts.map +1 -1
- package/dist/core/labeled-tensor.js +263 -17
- package/dist/core/labeled-tensor.js.map +1 -1
- package/dist/core/universal-index.d.ts +1 -1
- package/dist/core/universal-index.js +1 -1
- package/dist/dimensional/buckingham.d.ts +103 -0
- package/dist/dimensional/buckingham.d.ts.map +1 -0
- package/dist/dimensional/buckingham.js +284 -0
- package/dist/dimensional/buckingham.js.map +1 -0
- package/dist/dimensional/dimension-spec.d.ts +24 -0
- package/dist/dimensional/dimension-spec.d.ts.map +1 -0
- package/dist/dimensional/dimension-spec.js +110 -0
- package/dist/dimensional/dimension-spec.js.map +1 -0
- package/dist/dimensional/field-equation-helpers.d.ts +1 -1
- package/dist/dimensional/field-equation-helpers.js +1 -1
- package/dist/dimensional/friedmann-equation.d.ts +1 -1
- package/dist/dimensional/friedmann-equation.js +1 -1
- package/dist/dimensional/gauge-field.d.ts +1 -1
- package/dist/dimensional/gauge-field.js +1 -1
- package/dist/dimensional/klein-gordon-equation.d.ts +8 -5
- package/dist/dimensional/klein-gordon-equation.d.ts.map +1 -1
- package/dist/dimensional/klein-gordon-equation.js +8 -5
- package/dist/dimensional/klein-gordon-equation.js.map +1 -1
- package/dist/dimensional/tensor-trace.d.ts +1 -1
- package/dist/dimensional/tensor-trace.js +1 -1
- package/dist/dimensional/validator.d.ts +13 -3
- package/dist/dimensional/validator.d.ts.map +1 -1
- package/dist/dimensional/validator.js +129 -42
- package/dist/dimensional/validator.js.map +1 -1
- package/dist/index.d.ts +32 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +63 -2
- package/dist/index.js.map +1 -1
- package/dist/numerical/be37-covariant-eikonal.d.ts.map +1 -1
- package/dist/numerical/be37-covariant-eikonal.js +15 -18
- package/dist/numerical/be37-covariant-eikonal.js.map +1 -1
- package/dist/numerical/curvature-lowering-helpers.d.ts +7 -13
- package/dist/numerical/curvature-lowering-helpers.d.ts.map +1 -1
- package/dist/numerical/curvature-lowering-helpers.js +1 -1
- package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
- package/dist/numerical/derivative-lowering.d.ts +2 -1
- package/dist/numerical/derivative-lowering.d.ts.map +1 -1
- package/dist/numerical/formula-dimension.d.ts +40 -0
- package/dist/numerical/formula-dimension.d.ts.map +1 -0
- package/dist/numerical/formula-dimension.js +199 -0
- package/dist/numerical/formula-dimension.js.map +1 -0
- package/dist/numerical/formula-mathts.d.ts +27 -0
- package/dist/numerical/formula-mathts.d.ts.map +1 -0
- package/dist/numerical/formula-mathts.js +98 -0
- package/dist/numerical/formula-mathts.js.map +1 -0
- package/dist/numerical/formula-registry.d.ts +30 -0
- package/dist/numerical/formula-registry.d.ts.map +1 -0
- package/dist/numerical/formula-registry.js +88 -0
- package/dist/numerical/formula-registry.js.map +1 -0
- package/dist/numerical/formula.d.ts +75 -0
- package/dist/numerical/formula.d.ts.map +1 -0
- package/dist/numerical/formula.js +275 -0
- package/dist/numerical/formula.js.map +1 -0
- package/dist/numerical/geometrized.d.ts +51 -0
- package/dist/numerical/geometrized.d.ts.map +1 -0
- package/dist/numerical/geometrized.js +66 -0
- package/dist/numerical/geometrized.js.map +1 -0
- package/dist/numerical/gl4-integrator.d.ts +8 -6
- package/dist/numerical/gl4-integrator.d.ts.map +1 -1
- package/dist/numerical/gl4-integrator.js +6 -6
- package/dist/numerical/gl4-integrator.js.map +1 -1
- package/dist/numerical/klein-gordon.d.ts +145 -0
- package/dist/numerical/klein-gordon.d.ts.map +1 -0
- package/dist/numerical/klein-gordon.js +145 -0
- package/dist/numerical/klein-gordon.js.map +1 -0
- package/dist/numerical/kretschmann.d.ts +43 -12
- package/dist/numerical/kretschmann.d.ts.map +1 -1
- package/dist/numerical/kretschmann.js +116 -29
- package/dist/numerical/kretschmann.js.map +1 -1
- package/dist/numerical/lowering.d.ts +18 -0
- package/dist/numerical/lowering.d.ts.map +1 -1
- package/dist/numerical/lowering.js +54 -42
- package/dist/numerical/lowering.js.map +1 -1
- package/dist/numerical/null-ic.d.ts +1 -1
- package/dist/numerical/null-ic.d.ts.map +1 -1
- package/dist/numerical/null-ic.js +3 -2
- package/dist/numerical/null-ic.js.map +1 -1
- package/dist/numerical/painleve-gullstrand-metric.d.ts +18 -6
- package/dist/numerical/painleve-gullstrand-metric.d.ts.map +1 -1
- package/dist/numerical/painleve-gullstrand-metric.js +31 -16
- package/dist/numerical/painleve-gullstrand-metric.js.map +1 -1
- package/dist/numerical/perihelion-finder.d.ts +4 -3
- package/dist/numerical/perihelion-finder.d.ts.map +1 -1
- package/dist/numerical/perihelion-finder.js +5 -4
- package/dist/numerical/perihelion-finder.js.map +1 -1
- package/dist/numerical/types.d.ts +6 -3
- package/dist/numerical/types.d.ts.map +1 -1
- package/dist/numerical/weyl-lowering.d.ts +4 -4
- package/dist/numerical/weyl-lowering.d.ts.map +1 -1
- package/dist/numerical/weyl-lowering.js +14 -1
- package/dist/numerical/weyl-lowering.js.map +1 -1
- package/package.json +19 -8
package/bin/upt.mjs
ADDED
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* upt — a small CLI over the Universal Physics Tensor bridge-inference
|
|
4
|
+
* suite, for people who don't read TypeScript.
|
|
5
|
+
*
|
|
6
|
+
* upt explain <quantity> [name=value | name] ...
|
|
7
|
+
* upt priority
|
|
8
|
+
* upt audit
|
|
9
|
+
* upt help
|
|
10
|
+
*
|
|
11
|
+
* Run from a built checkout (`npm run build`) via `npm run upt -- <cmd>`,
|
|
12
|
+
* or as an installed command (`npx universal-physics-tensor <cmd>`).
|
|
13
|
+
*/
|
|
14
|
+
import { fileURLToPath } from 'node:url';
|
|
15
|
+
import { dirname, join } from 'node:path';
|
|
16
|
+
|
|
17
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
18
|
+
const dist = (...p) => join(here, '..', 'dist', ...p);
|
|
19
|
+
|
|
20
|
+
let api, analysis, formulaReg, dimSpecMod, prediction, discovery, coverage, simplifyMod;
|
|
21
|
+
try {
|
|
22
|
+
api = await import(dist('index.js'));
|
|
23
|
+
analysis = await import(dist('composition', 'bridge-analysis.js'));
|
|
24
|
+
formulaReg = await import(dist('numerical', 'formula-registry.js'));
|
|
25
|
+
dimSpecMod = await import(dist('dimensional', 'dimension-spec.js'));
|
|
26
|
+
prediction = await import(dist('composition', 'bridge-prediction.js'));
|
|
27
|
+
discovery = await import(dist('composition', 'discovery.js'));
|
|
28
|
+
coverage = await import(dist('bridges', 'confrontation-coverage.js'));
|
|
29
|
+
simplifyMod = await import(dist('composition', 'expr-simplify.js'));
|
|
30
|
+
} catch (err) {
|
|
31
|
+
console.error('Could not load the built package. Run `npm run build` first.');
|
|
32
|
+
console.error(String(err.message || err));
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const { explainQuantity, CATALOG_GRAPH, M_SUN_KG, composeSymbolic,
|
|
37
|
+
be42Edge, be16Edge, lawSchwarzschildRadius, be42ViaRsEdge, format } = api;
|
|
38
|
+
const { bridgePriority, attemptDerivation, dimensionalFreedom, dimensionallyDetermines, buckinghamPi, linkageMap, proposeLinkCandidates, proposeOrphanConnectors } = { ...analysis, ...api };
|
|
39
|
+
const { getFormulaParser, getFormulaParserKind, getFormulaDimensionChecker } = formulaReg;
|
|
40
|
+
const { parseDimensionSpec } = dimSpecMod;
|
|
41
|
+
const { predictMissingBridges } = prediction;
|
|
42
|
+
const { rankDiscoveries } = discovery;
|
|
43
|
+
const { auditCoverage } = coverage;
|
|
44
|
+
const { simplifyObservable } = simplifyMod;
|
|
45
|
+
|
|
46
|
+
const GRAPH = CATALOG_GRAPH;
|
|
47
|
+
|
|
48
|
+
// ── help ────────────────────────────────────────────────────────────────
|
|
49
|
+
function help() {
|
|
50
|
+
console.log(`upt — Universal Physics Tensor bridge-inference CLI
|
|
51
|
+
|
|
52
|
+
Usage:
|
|
53
|
+
upt explain <quantity> [name=value | name] ...
|
|
54
|
+
Explain how the graph determines a quantity: the identifiability
|
|
55
|
+
verdict, recovered value, derivation chains, and whether the inputs
|
|
56
|
+
are dimensionally sufficient.
|
|
57
|
+
e.g. upt explain hawking-temperature mass=1.989e30
|
|
58
|
+
|
|
59
|
+
upt priority
|
|
60
|
+
Triage the speculative bridges by structural DECIDABILITY against
|
|
61
|
+
established physics (Tiers 1-3). NOT a credibility ranking.
|
|
62
|
+
|
|
63
|
+
upt audit
|
|
64
|
+
Try to derive every built-in bridge equation by dimensions: which
|
|
65
|
+
re-derive as a recognized monomial (with the prefactor recovered),
|
|
66
|
+
which are decoys, which are dimensionally open.
|
|
67
|
+
|
|
68
|
+
upt map
|
|
69
|
+
Map how the equations LINK: connected components (clusters) of the
|
|
70
|
+
catalog graph by shared quantities, the anchored core, the link
|
|
71
|
+
hubs, and the isolated tail.
|
|
72
|
+
|
|
73
|
+
upt candidates
|
|
74
|
+
Propose candidate cross-cluster links (quantities of the same
|
|
75
|
+
dimension in different clusters) for PHYSICIST REVIEW — a
|
|
76
|
+
coincidence-heavy surface, not discovered bridges.
|
|
77
|
+
|
|
78
|
+
upt predict
|
|
79
|
+
Project the catalog onto the (scale × force) regime plane and rank
|
|
80
|
+
the EMPTY regime cells as undiscovered-connection hypotheses
|
|
81
|
+
(triadic closure). Makes the namesake tensor operational. Review
|
|
82
|
+
surface, not discovered bridges.
|
|
83
|
+
|
|
84
|
+
upt discover
|
|
85
|
+
VET the link candidates through the inference suite: hypothesise
|
|
86
|
+
each identification a≡b and test whether it merges disconnected
|
|
87
|
+
physics, unlocks quantities, and stays numerically consistent.
|
|
88
|
+
Ranks promising / inert / contradictory.
|
|
89
|
+
|
|
90
|
+
upt connectors
|
|
91
|
+
Of the 20 ISOLATED bridges, which could connect to the anchored
|
|
92
|
+
core via a same-dimension identification? The structural frontier —
|
|
93
|
+
same-kind connectors are the motivated set for physicist review.
|
|
94
|
+
|
|
95
|
+
upt coverage
|
|
96
|
+
Audit the catalog's empirical grounding — which bridges are
|
|
97
|
+
data-confronted vs graph-computable vs encoded-only vs thin — to
|
|
98
|
+
target the physicist review. Fabricates nothing.
|
|
99
|
+
|
|
100
|
+
upt symbolic [--simplify]
|
|
101
|
+
Compose bridges' SYMBOLIC (AST) forms, not just their numeric
|
|
102
|
+
evaluators (the Observable contract). Shows the CT-1 / CT-1b chains
|
|
103
|
+
composed by substitution, dimensionally validated and evaluable.
|
|
104
|
+
With --simplify, folds the composed AST via MathTS (k_B cancels),
|
|
105
|
+
re-validated dimensionally + numerically.
|
|
106
|
+
|
|
107
|
+
upt eval "<formula>" name=value ...
|
|
108
|
+
Evaluate YOUR OWN scalar formula (safe — arithmetic only). Knows
|
|
109
|
+
pi/tau and sqrt/exp/ln/sin/...; any other name must be supplied.
|
|
110
|
+
e.g. upt eval "hbar*c^3/(8*pi*G*M*k_B)" hbar=1.054571817e-34 \\
|
|
111
|
+
c=299792458 G=6.6743e-11 M=1.989e30 k_B=1.380649e-23
|
|
112
|
+
|
|
113
|
+
upt derive <target:dim> <var:dim> ... [--formula "<expr>"]
|
|
114
|
+
Derive YOUR OWN equation's dimensional form. <dim> is a named
|
|
115
|
+
dimension (length, time, mass, velocity, ...), a constant (hbar, c,
|
|
116
|
+
G, k_B, e), or explicit (L^3.M^-1.T^-2). With --formula, also verify
|
|
117
|
+
it and recover the dimensionless prefactor.
|
|
118
|
+
e.g. upt derive period:time length:length gravity:acceleration \\
|
|
119
|
+
--formula "2*pi*sqrt(length/gravity)"
|
|
120
|
+
|
|
121
|
+
upt help Show this message.
|
|
122
|
+
|
|
123
|
+
Run with no arguments for a short demo.`);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// ── explain ─────────────────────────────────────────────────────────────
|
|
127
|
+
function parseKnown(args) {
|
|
128
|
+
const values = {};
|
|
129
|
+
const names = [];
|
|
130
|
+
let hasValue = false;
|
|
131
|
+
for (const a of args) {
|
|
132
|
+
const eq = a.indexOf('=');
|
|
133
|
+
if (eq === -1) { names.push(a); continue; }
|
|
134
|
+
const num = Number(a.slice(eq + 1));
|
|
135
|
+
if (Number.isNaN(num)) { names.push(a.slice(0, eq)); }
|
|
136
|
+
else { values[a.slice(0, eq)] = num; hasValue = true; }
|
|
137
|
+
}
|
|
138
|
+
return hasValue ? values : names;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function explain(target, rest) {
|
|
142
|
+
if (!target) { console.error('upt explain needs a quantity name. See `upt help`.'); process.exit(2); }
|
|
143
|
+
const x = explainQuantity(GRAPH, target, parseKnown(rest));
|
|
144
|
+
console.log(`\n● ${target}`);
|
|
145
|
+
console.log(` ${x.summary}`);
|
|
146
|
+
if (x.derivations.length) {
|
|
147
|
+
console.log(' derivations:');
|
|
148
|
+
for (const d of x.derivations) {
|
|
149
|
+
const val = d.value !== undefined ? ` = ${d.value.toExponential(4)}` : '';
|
|
150
|
+
const chain = d.leafInputs.join(',') !== d.sources.join(',')
|
|
151
|
+
? ` [from leaves: ${d.leafInputs.join(', ')}]` : '';
|
|
152
|
+
console.log(` - ${d.edge} (${d.label})${val}${chain}`);
|
|
153
|
+
if (d.dimensionalForm) console.log(` ${d.dimensionalForm.formula}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (x.blockingFrontier.length) {
|
|
157
|
+
console.log(` to determine it, also supply: ${x.blockingFrontier.join(', ')}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// ── priority ────────────────────────────────────────────────────────────
|
|
162
|
+
function priority() {
|
|
163
|
+
const board = bridgePriority(GRAPH);
|
|
164
|
+
const a = (d) => (d === Infinity ? '∞' : String(d));
|
|
165
|
+
console.log('\nBridge triage — structural decidability against established physics');
|
|
166
|
+
console.log('(review/confrontation priority — NOT a credibility ranking)\n');
|
|
167
|
+
console.log(' tier anchor grounding cplx data bridge status');
|
|
168
|
+
console.log(' ' + '─'.repeat(73));
|
|
169
|
+
let last = 0;
|
|
170
|
+
for (const e of board) {
|
|
171
|
+
if (e.tier !== last) {
|
|
172
|
+
const label = e.tier === 1 ? 'anchored + grounded/tractable — confront first'
|
|
173
|
+
: e.tier === 2 ? 'anchored OR grounded — second pass'
|
|
174
|
+
: 'isolated + multi-parameter — needs literature review, not structure';
|
|
175
|
+
console.log(`\n ── Tier ${e.tier}: ${label}`);
|
|
176
|
+
last = e.tier;
|
|
177
|
+
}
|
|
178
|
+
console.log(' T' + e.tier, a(e.anchoring).padStart(5), ' ' + e.grounding.padEnd(10),
|
|
179
|
+
String(e.complexity).padStart(3), e.hasDataConfrontation ? ' DATA' : ' ',
|
|
180
|
+
' ' + e.id.padEnd(20), e.status);
|
|
181
|
+
}
|
|
182
|
+
const tiers = board.reduce((m, e) => ((m[e.tier] = (m[e.tier] || 0) + 1), m), {});
|
|
183
|
+
console.log(`\n Tiers: ${JSON.stringify(tiers)} (of ${board.length} non-established bridges)`);
|
|
184
|
+
console.log(' Reminder: tier ranks decidability/anchoring, not truth.');
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// ── audit ───────────────────────────────────────────────────────────────
|
|
188
|
+
function audit() {
|
|
189
|
+
const derived = [], decoy = [], open = [];
|
|
190
|
+
for (const e of GRAPH) {
|
|
191
|
+
const d = attemptDerivation(e);
|
|
192
|
+
const c = dimensionalFreedom(e);
|
|
193
|
+
if (d.status === 'derived') derived.push({ e, d, c });
|
|
194
|
+
else if (d.status === 'decoy') decoy.push({ e, c });
|
|
195
|
+
else open.push({ e, c });
|
|
196
|
+
}
|
|
197
|
+
console.log('\nDeriving the bridge equations by dimensions');
|
|
198
|
+
console.log('(form by dimensions; the constant is recovered by matching the evaluator)\n');
|
|
199
|
+
console.log(` DERIVED (${derived.length}) — recognized monomial, prefactor recovered:`);
|
|
200
|
+
for (const { e, d } of derived) {
|
|
201
|
+
const tag = d.cleanPrefactor ? '' : ' (empirical/tuned constant)';
|
|
202
|
+
console.log(` ${e.id.padEnd(22)} +[${(d.subset || []).join(',')}] ×${d.prefactor.toExponential(3)}${tag}`);
|
|
203
|
+
}
|
|
204
|
+
console.log(`\n DECOY (${decoy.length}) — dimensionally valid but wrong form:`);
|
|
205
|
+
console.log(' ' + decoy.map((x) => x.e.id).join(', '));
|
|
206
|
+
console.log(`\n OPEN (${open.length}) — irreducible free dimensionless group(s); by complexity:`);
|
|
207
|
+
for (const { e, c } of open.sort((a, b) => a.c - b.c)) {
|
|
208
|
+
console.log(` cplx=${c} ${e.id}`);
|
|
209
|
+
}
|
|
210
|
+
console.log('\n (derivability is ORTHOGONAL to credibility — see the priority command)');
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// ── eval (your own formula) ───────────────────────────────────────────────
|
|
214
|
+
async function evalCmd(rawArgs) {
|
|
215
|
+
const debug = rawArgs.includes('--debug');
|
|
216
|
+
const args = rawArgs.filter((a) => a !== '--debug');
|
|
217
|
+
const expr = args[0];
|
|
218
|
+
if (!expr) { console.error('upt eval needs a formula, e.g. upt eval "a*b^2" a=2 b=3'); process.exit(2); }
|
|
219
|
+
const parser = await getFormulaParser();
|
|
220
|
+
if (debug) console.error(`[parser: ${await getFormulaParserKind()}]`);
|
|
221
|
+
let cf;
|
|
222
|
+
try { cf = parser.parse(expr); } catch (e) { console.error('parse error: ' + e.message); process.exit(2); }
|
|
223
|
+
const scope = {};
|
|
224
|
+
for (const a of args.slice(1)) {
|
|
225
|
+
const i = a.indexOf('=');
|
|
226
|
+
if (i > 0) scope[a.slice(0, i)] = Number(a.slice(i + 1));
|
|
227
|
+
}
|
|
228
|
+
const missing = cf.variables.filter((v) => !(v in scope));
|
|
229
|
+
if (missing.length) {
|
|
230
|
+
console.error(`missing values for: ${missing.join(', ')} (free variables: ${cf.variables.join(', ') || 'none'})`);
|
|
231
|
+
process.exit(2);
|
|
232
|
+
}
|
|
233
|
+
try { console.log(cf.evaluate(scope)); } catch (e) { console.error(e.message); process.exit(2); }
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// ── derive (your own equation) ─────────────────────────────────────────────
|
|
237
|
+
const fmtMono = (m) => Object.entries(m).filter(([, e]) => Math.abs(e) > 1e-9)
|
|
238
|
+
.map(([n, e]) => (e === 1 ? n : `${n}^${e}`)).join('·') || '(dimensionless)';
|
|
239
|
+
|
|
240
|
+
const BASES = ['L', 'M', 'T', 'I', 'Theta', 'N', 'J'];
|
|
241
|
+
const dimsEqualTol = (a, b) => BASES.every((k) => Math.abs((a[k] || 0) - (b[k] || 0)) < 1e-9);
|
|
242
|
+
|
|
243
|
+
async function derive(args) {
|
|
244
|
+
let formula = null;
|
|
245
|
+
let debug = false;
|
|
246
|
+
const rest = [];
|
|
247
|
+
for (let i = 0; i < args.length; i++) {
|
|
248
|
+
if (args[i] === '--formula') formula = args[++i];
|
|
249
|
+
else if (args[i] === '--debug') debug = true;
|
|
250
|
+
else rest.push(args[i]);
|
|
251
|
+
}
|
|
252
|
+
if (rest.length < 1) { console.error('upt derive needs a target spec, e.g. upt derive period:time length:length gravity:acceleration'); process.exit(2); }
|
|
253
|
+
let specs;
|
|
254
|
+
try {
|
|
255
|
+
specs = rest.map((a) => {
|
|
256
|
+
const c = a.indexOf(':');
|
|
257
|
+
if (c < 1) throw new Error(`'${a}' must be name:dimension (e.g. period:time)`);
|
|
258
|
+
return { name: a.slice(0, c), dim: parseDimensionSpec(a.slice(c + 1)) };
|
|
259
|
+
});
|
|
260
|
+
} catch (e) { console.error(' ' + e.message); process.exit(2); }
|
|
261
|
+
const target = specs[0];
|
|
262
|
+
const governing = specs.slice(1);
|
|
263
|
+
const det = dimensionallyDetermines(target, governing);
|
|
264
|
+
console.log(`\n● ${target.name} from {${governing.map((g) => g.name).join(', ')}}`);
|
|
265
|
+
if (det.determined) {
|
|
266
|
+
console.log(` dimensionally determined up to a constant: ${target.name} ∝ ${fmtMono(det.monomial)}`);
|
|
267
|
+
} else {
|
|
268
|
+
const full = buckinghamPi([target, ...governing]);
|
|
269
|
+
console.log(` NOT a unique monomial — ${full.piGroupCount} free dimensionless group(s) (${full.verdict}):`);
|
|
270
|
+
for (const g of full.piGroups) console.log(` ${g.formula}`);
|
|
271
|
+
console.log(` (${det.reason})`);
|
|
272
|
+
}
|
|
273
|
+
if (formula) {
|
|
274
|
+
const parser = await getFormulaParser();
|
|
275
|
+
if (debug) console.error(` [parser: ${await getFormulaParserKind()}]`);
|
|
276
|
+
|
|
277
|
+
// Dimensional check (Phase 2) — homogeneity + dimension of the user's
|
|
278
|
+
// formula, independent of whether a unique monomial exists. Always
|
|
279
|
+
// available (MathTS AST when present, else the built-in parser's AST).
|
|
280
|
+
const checker = await getFormulaDimensionChecker();
|
|
281
|
+
const dims = Object.fromEntries(governing.map((g) => [g.name, g.dim]));
|
|
282
|
+
const r = checker.check(formula, dims);
|
|
283
|
+
if (!r.ok) {
|
|
284
|
+
console.log(` formula dimensional check: ✗ ${r.error}`);
|
|
285
|
+
} else {
|
|
286
|
+
const matches = dimsEqualTol(r.dim, target.dim);
|
|
287
|
+
console.log(` formula dimension: ${api.format(r.dim)}` +
|
|
288
|
+
(matches ? ` ✓ homogeneous, matches target` : ` ⚠ homogeneous but ≠ target ${api.format(target.dim)}`));
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
let cf;
|
|
292
|
+
try { cf = parser.parse(formula); } catch (e) { console.error(' formula parse error: ' + e.message); process.exit(2); }
|
|
293
|
+
if (!det.determined) { console.log(' formula given, but with no unique monomial there is no single prefactor to recover.'); return; }
|
|
294
|
+
const ratios = [];
|
|
295
|
+
for (let j = 0; j < 3; j++) {
|
|
296
|
+
const scope = {};
|
|
297
|
+
governing.forEach((g, i) => { scope[g.name] = Math.pow(1.7 + i, 1 + 0.3 * j); });
|
|
298
|
+
let cand = 1;
|
|
299
|
+
for (const g of governing) cand *= Math.pow(scope[g.name], det.monomial[g.name] || 0);
|
|
300
|
+
try { ratios.push(cf.evaluate(scope) / cand); }
|
|
301
|
+
catch (e) { console.error(' formula uses an undeclared variable: ' + e.message); process.exit(2); }
|
|
302
|
+
}
|
|
303
|
+
const mean = ratios.reduce((a, b) => a + b, 0) / ratios.length;
|
|
304
|
+
const cv = Math.sqrt(ratios.reduce((a, b) => a + (b - mean) ** 2, 0) / ratios.length) / Math.abs(mean);
|
|
305
|
+
console.log(cv < 1e-9
|
|
306
|
+
? ` formula MATCHES the dimensional form — recovered prefactor ≈ ${mean.toExponential(4)}`
|
|
307
|
+
: ` formula does NOT match the dimensional monomial (different input-dependence — a decoy or different physics).`);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// ── map (how the equations link) ──────────────────────────────────────────
|
|
312
|
+
function mapCmd() {
|
|
313
|
+
const m = linkageMap(GRAPH);
|
|
314
|
+
const mix = (s) => Object.entries(s).map(([k, v]) => `${v} ${k}`).join(', ');
|
|
315
|
+
console.log('\nCatalog linkage map — how the equations connect via shared quantities');
|
|
316
|
+
console.log(`(${m.componentCount} components over ${GRAPH.length} edges; ${m.compositions} compose into chains)\n`);
|
|
317
|
+
for (const c of m.clusters.filter((x) => x.size > 1)) {
|
|
318
|
+
console.log(` ● cluster of ${c.size}${c.anchored ? ' [ANCHORED to known physics]' : ''}`);
|
|
319
|
+
console.log(` edges: ${c.edges.join(', ')}`);
|
|
320
|
+
console.log(` status: ${mix(c.statusMix)}`);
|
|
321
|
+
console.log(` link hubs: ${c.hubs.join(', ')}\n`);
|
|
322
|
+
}
|
|
323
|
+
console.log(` ○ isolated (${m.isolated.length}) — share no quantity with any other edge:`);
|
|
324
|
+
console.log(` ${m.isolated.join(', ')}`);
|
|
325
|
+
console.log('\n (a structural map — shared-quantity connectivity, NOT a credibility signal)');
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// ── candidates (map-proposed links for review) ────────────────────────────
|
|
329
|
+
function candidatesCmd() {
|
|
330
|
+
const cands = proposeLinkCandidates(GRAPH);
|
|
331
|
+
const core = cands.filter((c) => c.touchesCore);
|
|
332
|
+
const ck = cands.filter((c) => c.touchesCore && c.sameKind);
|
|
333
|
+
console.log('\nLink candidates — cross-cluster quantities sharing a dimension');
|
|
334
|
+
console.log('⚠ a coincidence-heavy REVIEW SURFACE, NOT discovered bridges. Same dimension is a');
|
|
335
|
+
console.log(' weak signal; each needs a physicist to accept or (far more often) reject.\n');
|
|
336
|
+
console.log(` funnel: ${cands.length} total → ${core.length} touch the anchored core → ${ck.length} also same-kind\n`);
|
|
337
|
+
console.log(' same-kind + core-touching (the least-implausible set):');
|
|
338
|
+
for (const c of ck) console.log(` ${(c.a + ' ≟ ' + c.b).padEnd(56)} [${c.sharedToken}]`);
|
|
339
|
+
console.log('\n Most are still coincidences (decoherence-rate ≟ hubble-rate) or pairs the catalog');
|
|
340
|
+
console.log(' deliberately keeps distinct (effective-mass ≠ mass). The genuinely motivated few —');
|
|
341
|
+
console.log(' e.g. coarsening-length ≟ quantum-correlation-length (links the isolated Model-A');
|
|
342
|
+
console.log(' coarsening bridge to the Kibble-Zurek criticality cluster) — are written up in');
|
|
343
|
+
console.log(' docs/research/Linkage-Candidate-Proposals.md.');
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// ── predict (empty regime cells as bridge hypotheses) ─────────────────────
|
|
347
|
+
function predictCmd() {
|
|
348
|
+
const r = predictMissingBridges(GRAPH);
|
|
349
|
+
const short = (k) => k.replace(/scale=/g, '').replace(/force=/g, '').replace('|', '/');
|
|
350
|
+
console.log('\nBridge prediction — empty (scale×force) regime cells as undiscovered-link HYPOTHESES');
|
|
351
|
+
console.log('⚠ STRUCTURAL hypotheses for physicist review, NOT discovered bridges. "Two regimes');
|
|
352
|
+
console.log(' share bridge-neighbours but are not directly linked" (triadic closure) is a weak prior.\n');
|
|
353
|
+
console.log(` projected ${r.placedEdges}/${r.totalEdges} edges onto ${r.occupiedRegimes.length} regimes; ` +
|
|
354
|
+
`${r.linkedPairCount} regime-pairs already bridged.\n`);
|
|
355
|
+
if (!r.predictions.length) {
|
|
356
|
+
console.log(' no empty regime-pair has a shared-neighbour basis — nothing to predict.');
|
|
357
|
+
} else {
|
|
358
|
+
console.log(' predicted missing bridges (by shared-neighbour count):');
|
|
359
|
+
for (const p of r.predictions) {
|
|
360
|
+
console.log(` ${(short(p.regimeA) + ' ⟷ ' + short(p.regimeB)).padEnd(46)} ` +
|
|
361
|
+
`score ${p.sharedNeighbors} via {${p.via.map(short).join(', ')}}`);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
if (r.unexploredRegimes.length) {
|
|
365
|
+
console.log(`\n unexplored regimes adjacent to known ones (the tensor's empty neighbourhoods):`);
|
|
366
|
+
console.log(` ${r.unexploredRegimes.map(short).join(', ')}`);
|
|
367
|
+
}
|
|
368
|
+
console.log('\n (regime coords come from quantity attributes; only regime-tagged edges are placed.)');
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// ── discover (vet link candidates through the inference suite) ─────────────
|
|
372
|
+
function discoverCmd() {
|
|
373
|
+
const ranked = rankDiscoveries(GRAPH);
|
|
374
|
+
const by = (v) => ranked.filter((r) => r.verdict === v);
|
|
375
|
+
const promising = by('promising'), inert = by('inert'), contra = by('contradictory');
|
|
376
|
+
console.log('\nDiscovery — link candidates VETTED through the inference suite');
|
|
377
|
+
console.log('⚠ a REVIEW SURFACE: `promising` means "worth a physicist\'s minute", not "true".');
|
|
378
|
+
console.log(' Each candidate hypothesises an identification a≡b and tests its consequences.\n');
|
|
379
|
+
console.log(` funnel: ${ranked.length} candidates → ${promising.length} promising ` +
|
|
380
|
+
`· ${inert.length} inert · ${contra.length} contradictory (falsified)\n`);
|
|
381
|
+
if (promising.length) {
|
|
382
|
+
console.log(' PROMISING (merges disconnected physics, unlocks quantities, stays consistent):');
|
|
383
|
+
for (const r of promising) {
|
|
384
|
+
console.log(` ${(r.a + ' ≟ ' + r.b).padEnd(52)} [${r.dim}] score ${r.score}`);
|
|
385
|
+
console.log(` unlocks: ${r.unlocksFromAnchor.join(', ') || '—'}`);
|
|
386
|
+
}
|
|
387
|
+
} else {
|
|
388
|
+
console.log(' no candidate is `promising` from the default {mass} anchor.');
|
|
389
|
+
}
|
|
390
|
+
if (contra.length) {
|
|
391
|
+
console.log(`\n CONTRADICTORY (the identification falsifies itself numerically):`);
|
|
392
|
+
for (const r of contra) {
|
|
393
|
+
console.log(` ${(r.a + ' ≟ ' + r.b).padEnd(52)} disagreeing node(s): ${r.inconsistentNodes.join(', ')}`);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
console.log('\n (numeric check only exercises the anchor-reachable subgraph; weak priors on dimension.)');
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
// ── coverage (empirical-spine audit) ──────────────────────────────────────
|
|
400
|
+
function coverageCmd() {
|
|
401
|
+
const r = auditCoverage();
|
|
402
|
+
console.log('\nEmpirical-spine coverage — where the catalog\'s grounding is thin');
|
|
403
|
+
console.log('(reads the catalog/graph/confrontation modules; fabricates nothing)\n');
|
|
404
|
+
console.log(` ${r.total} bridges by grounding tier:`);
|
|
405
|
+
console.log(` data-confronted : ${r.byTier['data-confronted']} (real-data confrontation)`);
|
|
406
|
+
console.log(` graph-computable : ${r.byTier['graph-computable']} (graph edge + dimensional signature)`);
|
|
407
|
+
console.log(` encoded-only : ${r.byTier['encoded-only']} (dimensional signature, no graph edge)`);
|
|
408
|
+
console.log(` thin : ${r.byTier['thin']} (no dimensional signature)`);
|
|
409
|
+
console.log(`\n gaps: ${r.withoutDataConfrontation} without a data confrontation · ` +
|
|
410
|
+
`${r.withoutCitation} without any citation`);
|
|
411
|
+
if (r.thinBridges.length) {
|
|
412
|
+
console.log(` thinnest (no dimensional signature): BE-${r.thinBridges.join(', BE-')}`);
|
|
413
|
+
}
|
|
414
|
+
console.log('\n (a targeting tool for the CONTRIBUTING.md physicist review, not a quality score.)');
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
// ── symbolic (symbolic bridge composition — the Observable contract) ──────
|
|
418
|
+
function exprToString(n) {
|
|
419
|
+
if (n.kind === 'symbol') return n.name;
|
|
420
|
+
if (n.kind === 'op') {
|
|
421
|
+
if (n.op === '^') return `${exprToString(n.args[0])}^${exprToString(n.args[1])}`;
|
|
422
|
+
const sep = n.op === '*' ? '·' : ` ${n.op} `;
|
|
423
|
+
const inner = n.args.map((a) => {
|
|
424
|
+
const s = exprToString(a);
|
|
425
|
+
return a.kind === 'op' && (a.op === '+' || a.op === '-' || a.op === '/') ? `(${s})` : s;
|
|
426
|
+
}).join(sep);
|
|
427
|
+
return inner;
|
|
428
|
+
}
|
|
429
|
+
return `⟨${n.kind}⟩`;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
async function symbolicCmd(rest) {
|
|
433
|
+
const doSimplify = rest.includes('--simplify');
|
|
434
|
+
const chains = [
|
|
435
|
+
{ first: be42Edge, second: be16Edge, label: 'CT-1 (be-42 ∘ be-16, via hawking-temperature ≡ temperature)' },
|
|
436
|
+
{ first: lawSchwarzschildRadius, second: be42ViaRsEdge, label: 'CT-1b (law-r_s ∘ be-42-via-rs, name-match junction)' },
|
|
437
|
+
];
|
|
438
|
+
console.log('\nSymbolic bridge composition — composing the SYMBOLIC forms, not just numbers');
|
|
439
|
+
console.log('(the Observable contract: composed AST, dimensionally validated + numerically evaluable)\n');
|
|
440
|
+
for (const { first, second, label } of chains) {
|
|
441
|
+
const obs = composeSymbolic(first, second);
|
|
442
|
+
const num = obs.evaluate({ mass: M_SUN_KG });
|
|
443
|
+
console.log(` ● ${label}`);
|
|
444
|
+
console.log(` composed: ${obs.name}(${obs.leaves.join(',')}) = ${exprToString(obs.expr)}`);
|
|
445
|
+
if (doSimplify) {
|
|
446
|
+
const s = await simplifyObservable(obs);
|
|
447
|
+
const sNum = s.evaluate({ mass: M_SUN_KG });
|
|
448
|
+
const tag = s.expr === obs.expr ? ' (unchanged — minimal, MathTS absent, or not reducible here)' : '';
|
|
449
|
+
console.log(` simplified: ${s.name}(${s.leaves.join(',')}) = ${exprToString(s.expr)}${tag}`);
|
|
450
|
+
console.log(` value @ mass = M_sun: ${sNum.toExponential(4)} (= composed, ${format(s.dim)})`);
|
|
451
|
+
} else {
|
|
452
|
+
console.log(` dimension: ${format(obs.dim)} (validated on the composed AST)`);
|
|
453
|
+
console.log(` value @ mass = M_sun: ${num.toExponential(4)}`);
|
|
454
|
+
}
|
|
455
|
+
console.log('');
|
|
456
|
+
}
|
|
457
|
+
console.log(' Both compose by AST substitution at the junction and match the numeric composeEdges');
|
|
458
|
+
console.log(' pipeline to float precision.' + (doSimplify
|
|
459
|
+
? ' --simplify folds the composed AST via MathTS (k_B cancels), guarded by re-validation.'
|
|
460
|
+
: ' Pass --simplify to fold the composed AST via MathTS.'));
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
// ── connectors (pull isolated bridges into the core) ──────────────────────
|
|
464
|
+
function connectorsCmd() {
|
|
465
|
+
const r = proposeOrphanConnectors(GRAPH);
|
|
466
|
+
console.log('\nOrphan connectors — same-dimension identifications that would pull an ISOLATED');
|
|
467
|
+
console.log('bridge into the anchored core (the catalog\'s structural frontier).');
|
|
468
|
+
console.log('⚠ A REVIEW SURFACE: same dimension is a WEAK prior; most are decoys (a Förster');
|
|
469
|
+
console.log(' radius is not a Schwarzschild radius). Same-kind (shared name token) = stronger.\n');
|
|
470
|
+
console.log(` ${r.connectedOrphans.length} of the isolated bridges have a same-kind connector; ` +
|
|
471
|
+
`${r.unconnectedOrphans.length} are truly unconnected.\n`);
|
|
472
|
+
console.log(' SAME-KIND connectors (the motivated set — orphan ≟ core via shared token):');
|
|
473
|
+
let lastOrphan = '';
|
|
474
|
+
for (const c of r.connectors.filter((x) => x.sameKind)) {
|
|
475
|
+
if (c.orphanEdge !== lastOrphan) { console.log(` ── ${c.orphanEdge} (isolated):`); lastOrphan = c.orphanEdge; }
|
|
476
|
+
console.log(` ${(c.orphanQuantity + ' ≟ ' + c.coreQuantity).padEnd(54)} [${c.dim}] → ${c.coreEdge}`);
|
|
477
|
+
}
|
|
478
|
+
console.log(`\n truly unconnected (no same-dimension bridge into them): ${r.unconnectedOrphans.join(', ')}`);
|
|
479
|
+
console.log('\n Physicist-reasoned ranking + the genuinely-motivated few (e.g. coarsening-length ≟');
|
|
480
|
+
console.log(' quantum-correlation-length; tunneling-mass ≟ effective-mass) are written up in');
|
|
481
|
+
console.log(' docs/research/Orphan-Connector-Analysis.md and proposed in spec Part-IX §9.');
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
// ── dispatch ──────────────────────────────────────────────────────────────
|
|
485
|
+
const [cmd, ...rest] = process.argv.slice(2);
|
|
486
|
+
switch (cmd) {
|
|
487
|
+
case 'explain': explain(rest[0], rest.slice(1)); break;
|
|
488
|
+
case 'priority': case 'prioritize': case 'triage': priority(); break;
|
|
489
|
+
case 'audit': audit(); break;
|
|
490
|
+
case 'map': case 'linkage': mapCmd(); break;
|
|
491
|
+
case 'candidates': case 'propose': candidatesCmd(); break;
|
|
492
|
+
case 'predict': case 'predictions': predictCmd(); break;
|
|
493
|
+
case 'discover': case 'discovery': discoverCmd(); break;
|
|
494
|
+
case 'connectors': case 'orphans': connectorsCmd(); break;
|
|
495
|
+
case 'coverage': case 'grounding': coverageCmd(); break;
|
|
496
|
+
case 'symbolic': case 'compose-symbolic': await symbolicCmd(rest); break;
|
|
497
|
+
case 'eval': case 'calc': await evalCmd(rest); break;
|
|
498
|
+
case 'derive': case 'dim': await derive(rest); break;
|
|
499
|
+
case 'help': case '--help': case '-h': help(); break;
|
|
500
|
+
case undefined:
|
|
501
|
+
console.log('upt — bridge-inference CLI. Demo (run `upt help` for usage):');
|
|
502
|
+
explain('hawking-temperature', ['mass=1.989e30']);
|
|
503
|
+
priority();
|
|
504
|
+
break;
|
|
505
|
+
default:
|
|
506
|
+
console.error(`Unknown command '${cmd}'. See \`upt help\`.`);
|
|
507
|
+
process.exit(2);
|
|
508
|
+
}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BE-23 × overdoped-cuprate Planckian dissipation — the second
|
|
3
|
+
* real-data confrontation (follows the GW170817 pattern of
|
|
4
|
+
* `be36-gw170817-confrontation.ts`: observation record with citations,
|
|
5
|
+
* a `confront` function that recomputes the published comparison, and
|
|
6
|
+
* honest-finding fields).
|
|
7
|
+
*
|
|
8
|
+
* Published dataset: Legros et al. 2019 *Nature Physics* 15:142,
|
|
9
|
+
* "Universal T-linear resistivity and Planckian dissipation in
|
|
10
|
+
* overdoped cuprates" (arXiv:1805.02512). The paper measures the
|
|
11
|
+
* T-linear resistivity slope across overdoped cuprates (Bi2212,
|
|
12
|
+
* Bi2201, LSCO, Nd-LSCO) and converts it, via the Drude relation
|
|
13
|
+
* ρ = m* / (n e² τ), into a Planckian scattering coefficient α defined by
|
|
14
|
+
*
|
|
15
|
+
* ℏ/τ = α · k_B T, finding α ≈ 1 within a factor ~2 (O(1)).
|
|
16
|
+
*
|
|
17
|
+
* ── DATA-ENCODING HONESTY LEVEL: AGGREGATE, NOT PER-MATERIAL ──
|
|
18
|
+
* The per-material α table from Legros et al. was NOT reproduced here:
|
|
19
|
+
* it could not be re-verified against the paper at encoding time
|
|
20
|
+
* (network access to arXiv/Nature unavailable), and reproducing table
|
|
21
|
+
* rows from memory risks fabricating numbers. Per the repo's
|
|
22
|
+
* no-fabricated-literals rule, this module encodes ONLY the paper's
|
|
23
|
+
* abstract-level aggregate claim, conservatively stated as
|
|
24
|
+
* α = 1.0 ± 0.4 (i.e., α is O(1), within roughly a factor of 2 of the
|
|
25
|
+
* Planckian value α = 1, across the materials studied). Anyone with
|
|
26
|
+
* the paper in hand can upgrade `PLANCKIAN_CUPRATES` to per-material
|
|
27
|
+
* rows; the `perMaterialAlphas: null` field is the explicit marker
|
|
28
|
+
* that this upgrade has not happened.
|
|
29
|
+
*
|
|
30
|
+
* ── WHAT IS ACTUALLY CONFRONTED ──
|
|
31
|
+
* BE-23's evaluator (`evaluateSYKResistivity`) computes
|
|
32
|
+
*
|
|
33
|
+
* ρ(T) = ρ_0 + (m* · k_B T)/(n_e · e² · ℏ) · α_SYK,
|
|
34
|
+
*
|
|
35
|
+
* which is exactly the Drude resistivity with the Planckian rate
|
|
36
|
+
* 1/τ = α_SYK · k_B T / ℏ substituted. So the encoding's α_SYK is the
|
|
37
|
+
* SAME dimensionless α the paper reports, and the supportable test is:
|
|
38
|
+
* 1. Is the published α band consistent with the O(1) assumption the
|
|
39
|
+
* BE-23 docstring makes for α_SYK? (Operationalized here as the
|
|
40
|
+
* factor-2 band [0.5, 2] — OUR reading of "O(1)", not a number
|
|
41
|
+
* from the paper.)
|
|
42
|
+
* 2. Is the evaluator's thermal term algebraically identical to
|
|
43
|
+
* (m* / (n_e e²)) · (α k_B T/ℏ), i.e., Drude × Planckian-rate?
|
|
44
|
+
* (`encodedFormConsistent`, checked numerically at an arbitrary
|
|
45
|
+
* positive parameter point — the parameters cancel structurally,
|
|
46
|
+
* so no material data is needed or fabricated for this check.)
|
|
47
|
+
* NOT claimed: that UPT/SYK *predicts* α (BE-23 bundles α_SYK as a
|
|
48
|
+
* free O(1) coefficient — status: speculative), nor that agreement
|
|
49
|
+
* here validates the strange-metal/black-hole bridge framing.
|
|
50
|
+
*
|
|
51
|
+
* @module bridges/be23-planckian-confrontation
|
|
52
|
+
*/
|
|
53
|
+
/**
|
|
54
|
+
* A Planckian-dissipation observation record (aggregate-level).
|
|
55
|
+
*
|
|
56
|
+
* @public
|
|
57
|
+
*/
|
|
58
|
+
export interface PlanckianObservation {
|
|
59
|
+
/** Materials covered by the study (names only — see `perMaterialAlphas`). */
|
|
60
|
+
readonly materials: readonly string[];
|
|
61
|
+
/** Aggregate Planckian coefficient α (dimensionless, ℏ/τ = α·k_B T). */
|
|
62
|
+
readonly alpha_aggregate: number;
|
|
63
|
+
/** Conservative spread on the aggregate α (dimensionless). */
|
|
64
|
+
readonly alpha_aggregate_err: number;
|
|
65
|
+
/**
|
|
66
|
+
* Per-material {material, alpha, alpha_err} rows. `null` = the
|
|
67
|
+
* paper's table was NOT reproduced (honesty marker — see module doc).
|
|
68
|
+
*/
|
|
69
|
+
readonly perMaterialAlphas: readonly {
|
|
70
|
+
material: string;
|
|
71
|
+
alpha: number;
|
|
72
|
+
alpha_err: number;
|
|
73
|
+
}[] | null;
|
|
74
|
+
/** 'aggregate' until the per-material table is faithfully transcribed. */
|
|
75
|
+
readonly encodingHonestyLevel: 'aggregate' | 'per-material';
|
|
76
|
+
readonly citation: string;
|
|
77
|
+
readonly honestyNote: string;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Legros et al. 2019 overdoped-cuprate Planckian-dissipation record,
|
|
81
|
+
* encoded at AGGREGATE honesty level (see module doc for why).
|
|
82
|
+
*
|
|
83
|
+
* @public
|
|
84
|
+
*/
|
|
85
|
+
export declare const PLANCKIAN_CUPRATES: PlanckianObservation;
|
|
86
|
+
/**
|
|
87
|
+
* The factor-2 band [0.5, 2] used to operationalize the "α_SYK is
|
|
88
|
+
* O(1)" assumption in BE-23's docstring. This band is UPT's reading of
|
|
89
|
+
* "O(1)" — it is not a number published by Legros et al.
|
|
90
|
+
*
|
|
91
|
+
* @public
|
|
92
|
+
*/
|
|
93
|
+
export declare const PLANCKIAN_O1_BAND: readonly [number, number];
|
|
94
|
+
/**
|
|
95
|
+
* Result of confronting BE-23 with a Planckian-dissipation observation.
|
|
96
|
+
*
|
|
97
|
+
* @public
|
|
98
|
+
*/
|
|
99
|
+
export interface BE23ConfrontationResult {
|
|
100
|
+
/** Central aggregate α from the observation record. */
|
|
101
|
+
readonly alphaAggregate: number;
|
|
102
|
+
/** Spread on the aggregate α (echoed; propagated by the *WithUncertainty sibling). */
|
|
103
|
+
readonly alphaAggregateErr: number;
|
|
104
|
+
/** `null` here — per-material rows were not encoded (honesty marker). */
|
|
105
|
+
readonly perMaterialAlphas: PlanckianObservation['perMaterialAlphas'];
|
|
106
|
+
/** The O(1) band [0.5, 2] the verdict is taken against. */
|
|
107
|
+
readonly planckianBand: readonly [number, number];
|
|
108
|
+
/**
|
|
109
|
+
* Whether all encoded α values (here: the single aggregate central
|
|
110
|
+
* value) lie within the O(1) band [0.5, 2] that BE-23's α_SYK
|
|
111
|
+
* presumes. ±1σ band coverage is the *WithUncertainty sibling's job.
|
|
112
|
+
*/
|
|
113
|
+
readonly withinPlanckianBand: boolean;
|
|
114
|
+
/** Planckian scattering rate 1/τ = α·k_B·T/ℏ at temperature T (s⁻¹). */
|
|
115
|
+
readonly planckianRateAt: (T_K: number) => number;
|
|
116
|
+
/**
|
|
117
|
+
* Whether `evaluateSYKResistivity`'s thermal term numerically equals
|
|
118
|
+
* the Drude form (m* / (n_e e²)) · planckianRateAt(T) — i.e., the
|
|
119
|
+
* encoded linear-in-T resistivity IS the Planckian-rate Drude
|
|
120
|
+
* resistivity. Checked at an arbitrary positive parameter point
|
|
121
|
+
* (structural identity; no material data involved).
|
|
122
|
+
*/
|
|
123
|
+
readonly encodedFormConsistent: boolean;
|
|
124
|
+
/** Relative error of the consistency check above. */
|
|
125
|
+
readonly encodedFormRelErr: number;
|
|
126
|
+
readonly note: string;
|
|
127
|
+
readonly observation: PlanckianObservation;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Confront BE-23's Planckian-dissipation encoding with the published
|
|
131
|
+
* overdoped-cuprate α band (the framework's second real-data
|
|
132
|
+
* confrontation, after BE-36 × GW170817).
|
|
133
|
+
*
|
|
134
|
+
* @public
|
|
135
|
+
*/
|
|
136
|
+
export declare function confrontBE23(obs?: PlanckianObservation): BE23ConfrontationResult;
|
|
137
|
+
/**
|
|
138
|
+
* Confrontation result with first-order uncertainty (mirrors
|
|
139
|
+
* `confrontBE36WithUncertainty`).
|
|
140
|
+
*
|
|
141
|
+
* Propagates σ(α) = alpha_aggregate_err only: the Planckian rate is
|
|
142
|
+
* linear in α (∂rate/∂α = k_B T/ℏ), so σ_rate(T) = σ_α·k_B T/ℏ.
|
|
143
|
+
* `withinPlanckianBandAtOneSigma` requires the whole ±1σ interval
|
|
144
|
+
* [α−σ, α+σ] to sit inside [0.5, 2] — the stricter verdict.
|
|
145
|
+
*
|
|
146
|
+
* @public
|
|
147
|
+
*/
|
|
148
|
+
export interface BE23ConfrontationWithUncertainty extends BE23ConfrontationResult {
|
|
149
|
+
/** 1σ on α (echo of alpha_aggregate_err, validated). */
|
|
150
|
+
readonly alphaSigma: number;
|
|
151
|
+
/** 1σ on the Planckian rate at temperature T (s⁻¹): σ_α·k_B·T/ℏ. */
|
|
152
|
+
readonly planckianRateSigmaAt: (T_K: number) => number;
|
|
153
|
+
/** Whether [α−σ, α+σ] ⊆ [0.5, 2] (stricter than the central verdict). */
|
|
154
|
+
readonly withinPlanckianBandAtOneSigma: boolean;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* `confrontBE23` + first-order propagation of the α uncertainty.
|
|
158
|
+
*
|
|
159
|
+
* @public
|
|
160
|
+
*/
|
|
161
|
+
export declare function confrontBE23WithUncertainty(obs?: PlanckianObservation): BE23ConfrontationWithUncertainty;
|
|
162
|
+
//# sourceMappingURL=be23-planckian-confrontation.d.ts.map
|