universal-physics-tensor 0.7.2 → 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.
Files changed (293) hide show
  1. package/README.md +147 -109
  2. package/bin/upt.mjs +508 -0
  3. package/dist/bridges/be23-planckian-confrontation.d.ts +162 -0
  4. package/dist/bridges/be23-planckian-confrontation.d.ts.map +1 -0
  5. package/dist/bridges/be23-planckian-confrontation.js +196 -0
  6. package/dist/bridges/be23-planckian-confrontation.js.map +1 -0
  7. package/dist/bridges/be36-gw170817-confrontation.d.ts +111 -0
  8. package/dist/bridges/be36-gw170817-confrontation.d.ts.map +1 -0
  9. package/dist/bridges/be36-gw170817-confrontation.js +100 -0
  10. package/dist/bridges/be36-gw170817-confrontation.js.map +1 -0
  11. package/dist/bridges/bridge-equations.d.ts +129 -0
  12. package/dist/bridges/bridge-equations.d.ts.map +1 -0
  13. package/dist/bridges/bridge-equations.js +130 -0
  14. package/dist/bridges/bridge-equations.js.map +1 -0
  15. package/dist/bridges/catalog-adapter.d.ts +1 -1
  16. package/dist/bridges/catalog-adapter.js +1 -1
  17. package/dist/bridges/confrontation-coverage.d.ts +67 -0
  18. package/dist/bridges/confrontation-coverage.d.ts.map +1 -0
  19. package/dist/bridges/confrontation-coverage.js +83 -0
  20. package/dist/bridges/confrontation-coverage.js.map +1 -0
  21. package/dist/bridges/equations/_be-helpers.d.ts +2 -1
  22. package/dist/bridges/equations/_be-helpers.d.ts.map +1 -1
  23. package/dist/bridges/equations/be-12-coherence-length.d.ts +1 -1
  24. package/dist/bridges/equations/be-13-einstein-trace.d.ts +2 -2
  25. package/dist/bridges/equations/be-13-einstein-trace.js +1 -1
  26. package/dist/bridges/equations/be-14-ryu-takayanagi.d.ts +2 -2
  27. package/dist/bridges/equations/be-15-emergence.d.ts +19 -5
  28. package/dist/bridges/equations/be-15-emergence.d.ts.map +1 -1
  29. package/dist/bridges/equations/be-15-emergence.js +18 -4
  30. package/dist/bridges/equations/be-15-emergence.js.map +1 -1
  31. package/dist/bridges/equations/be-16-landauer.d.ts +1 -1
  32. package/dist/bridges/equations/be-17-einstein-cartan.d.ts +1 -1
  33. package/dist/bridges/equations/be-18-higgs-mass.d.ts +1 -1
  34. package/dist/bridges/equations/be-19-quantum-bounce.d.ts +1 -1
  35. package/dist/bridges/equations/be-20-vacuum-energy.d.ts +4 -4
  36. package/dist/bridges/equations/be-20-vacuum-energy.d.ts.map +1 -1
  37. package/dist/bridges/equations/be-20-vacuum-energy.js +4 -2
  38. package/dist/bridges/equations/be-20-vacuum-energy.js.map +1 -1
  39. package/dist/bridges/equations/be-22-topological-entanglement.d.ts +1 -1
  40. package/dist/bridges/equations/be-23-syk-planckian.d.ts +1 -1
  41. package/dist/bridges/equations/be-24-foerster-fret.d.ts +1 -1
  42. package/dist/bridges/equations/be-25-iit-phi.d.ts +1 -1
  43. package/dist/bridges/equations/be-25-orch-or.d.ts +13 -1
  44. package/dist/bridges/equations/be-25-orch-or.d.ts.map +1 -1
  45. package/dist/bridges/equations/be-25-orch-or.js +12 -0
  46. package/dist/bridges/equations/be-25-orch-or.js.map +1 -1
  47. package/dist/bridges/equations/be-26-dna-tunneling.d.ts +2 -2
  48. package/dist/bridges/equations/be-26-dna-tunneling.js +1 -1
  49. package/dist/bridges/equations/be-27-effective-temperature.d.ts +1 -1
  50. package/dist/bridges/equations/be-28-onsager-entropy-production.d.ts +1 -1
  51. package/dist/bridges/equations/be-29-jarzynski.d.ts +1 -1
  52. package/dist/bridges/equations/be-30-flm-first-law.d.ts +2 -2
  53. package/dist/bridges/equations/be-31-causal-set-bd.d.ts +1 -1
  54. package/dist/bridges/equations/be-32-quantum-reference-frame.d.ts +1 -1
  55. package/dist/bridges/equations/be-33-hertz-millis.d.ts +1 -1
  56. package/dist/bridges/equations/be-34-kibble-zurek.d.ts +1 -1
  57. package/dist/bridges/equations/be-35-conformal-bootstrap.d.ts +1 -1
  58. package/dist/bridges/equations/be-36-gw-speed-bound.d.ts +12 -5
  59. package/dist/bridges/equations/be-36-gw-speed-bound.d.ts.map +1 -1
  60. package/dist/bridges/equations/be-36-gw-speed-bound.js +11 -4
  61. package/dist/bridges/equations/be-36-gw-speed-bound.js.map +1 -1
  62. package/dist/bridges/equations/be-38-mond.d.ts +1 -1
  63. package/dist/bridges/equations/be-39-asymptotic-safety.d.ts +2 -2
  64. package/dist/bridges/equations/be-40-composite-higgs.d.ts +1 -1
  65. package/dist/bridges/equations/be-41-swampland.d.ts +1 -1
  66. package/dist/bridges/equations/be-43-er-epr.d.ts +1 -1
  67. package/dist/bridges/equations/be-44-soft-hair.d.ts +1 -1
  68. package/dist/bridges/equations/be-45-tcc.d.ts +1 -1
  69. package/dist/bridges/equations/be-46-multiverse-measure.d.ts +1 -1
  70. package/dist/bridges/equations/be-47-bbn-dark-sector.d.ts +1 -1
  71. package/dist/bridges/equations/be-48-grw-localization.d.ts +1 -1
  72. package/dist/bridges/equations/be-49-quantum-darwinism.d.ts +1 -1
  73. package/dist/bridges/equations/be-50-wheeler-feynman.d.ts +1 -1
  74. package/dist/bridges/index.d.ts +10 -7
  75. package/dist/bridges/index.d.ts.map +1 -1
  76. package/dist/bridges/index.js +47 -34
  77. package/dist/bridges/index.js.map +1 -1
  78. package/dist/bridges/membership.d.ts +44 -0
  79. package/dist/bridges/membership.d.ts.map +1 -0
  80. package/dist/bridges/membership.js +59 -0
  81. package/dist/bridges/membership.js.map +1 -0
  82. package/dist/bridges/rejected.d.ts +40 -0
  83. package/dist/bridges/rejected.d.ts.map +1 -0
  84. package/dist/bridges/rejected.js +81 -0
  85. package/dist/bridges/rejected.js.map +1 -0
  86. package/dist/composition/bridge-analysis.d.ts +189 -0
  87. package/dist/composition/bridge-analysis.d.ts.map +1 -0
  88. package/dist/composition/bridge-analysis.js +445 -0
  89. package/dist/composition/bridge-analysis.js.map +1 -0
  90. package/dist/composition/bridge-prediction.d.ts +95 -0
  91. package/dist/composition/bridge-prediction.d.ts.map +1 -0
  92. package/dist/composition/bridge-prediction.js +0 -0
  93. package/dist/composition/bridge-prediction.js.map +1 -0
  94. package/dist/composition/catalog-graph.d.ts +20 -0
  95. package/dist/composition/catalog-graph.d.ts.map +1 -0
  96. package/dist/composition/catalog-graph.js +39 -0
  97. package/dist/composition/catalog-graph.js.map +1 -0
  98. package/dist/composition/compose-surface.d.ts +12 -0
  99. package/dist/composition/compose-surface.d.ts.map +1 -0
  100. package/dist/composition/compose-surface.js +10 -0
  101. package/dist/composition/compose-surface.js.map +1 -0
  102. package/dist/composition/compose-symbolic.d.ts +75 -0
  103. package/dist/composition/compose-symbolic.d.ts.map +1 -0
  104. package/dist/composition/compose-symbolic.js +157 -0
  105. package/dist/composition/compose-symbolic.js.map +1 -0
  106. package/dist/composition/compose.d.ts +110 -0
  107. package/dist/composition/compose.d.ts.map +1 -0
  108. package/dist/composition/compose.js +231 -0
  109. package/dist/composition/compose.js.map +1 -0
  110. package/dist/composition/consistency.d.ts +24 -0
  111. package/dist/composition/consistency.d.ts.map +1 -0
  112. package/dist/composition/consistency.js +26 -0
  113. package/dist/composition/consistency.js.map +1 -0
  114. package/dist/composition/discovery.d.ts +104 -0
  115. package/dist/composition/discovery.d.ts.map +1 -0
  116. package/dist/composition/discovery.js +165 -0
  117. package/dist/composition/discovery.js.map +1 -0
  118. package/dist/composition/edge.d.ts +139 -0
  119. package/dist/composition/edge.d.ts.map +1 -0
  120. package/dist/composition/edge.js +72 -0
  121. package/dist/composition/edge.js.map +1 -0
  122. package/dist/composition/edges/calibration.d.ts +107 -0
  123. package/dist/composition/edges/calibration.d.ts.map +1 -0
  124. package/dist/composition/edges/calibration.js +373 -0
  125. package/dist/composition/edges/calibration.js.map +1 -0
  126. package/dist/composition/edges/catalog-full.d.ts +299 -0
  127. package/dist/composition/edges/catalog-full.d.ts.map +1 -0
  128. package/dist/composition/edges/catalog-full.js +989 -0
  129. package/dist/composition/edges/catalog-full.js.map +1 -0
  130. package/dist/composition/edges/catalog-tranche.d.ts +112 -0
  131. package/dist/composition/edges/catalog-tranche.d.ts.map +1 -0
  132. package/dist/composition/edges/catalog-tranche.js +241 -0
  133. package/dist/composition/edges/catalog-tranche.js.map +1 -0
  134. package/dist/composition/enumerate.d.ts +67 -0
  135. package/dist/composition/enumerate.d.ts.map +1 -0
  136. package/dist/composition/enumerate.js +78 -0
  137. package/dist/composition/enumerate.js.map +1 -0
  138. package/dist/composition/explain.d.ts +102 -0
  139. package/dist/composition/explain.d.ts.map +1 -0
  140. package/dist/composition/explain.js +244 -0
  141. package/dist/composition/explain.js.map +1 -0
  142. package/dist/composition/expr-eval.d.ts +33 -0
  143. package/dist/composition/expr-eval.d.ts.map +1 -0
  144. package/dist/composition/expr-eval.js +95 -0
  145. package/dist/composition/expr-eval.js.map +1 -0
  146. package/dist/composition/expr-simplify.d.ts +60 -0
  147. package/dist/composition/expr-simplify.d.ts.map +1 -0
  148. package/dist/composition/expr-simplify.js +330 -0
  149. package/dist/composition/expr-simplify.js.map +1 -0
  150. package/dist/composition/expr-subst.d.ts +29 -0
  151. package/dist/composition/expr-subst.d.ts.map +1 -0
  152. package/dist/composition/expr-subst.js +60 -0
  153. package/dist/composition/expr-subst.js.map +1 -0
  154. package/dist/composition/identifiability.d.ts +103 -0
  155. package/dist/composition/identifiability.d.ts.map +1 -0
  156. package/dist/composition/identifiability.js +148 -0
  157. package/dist/composition/identifiability.js.map +1 -0
  158. package/dist/composition/index.d.ts +37 -0
  159. package/dist/composition/index.d.ts.map +1 -0
  160. package/dist/composition/index.js +27 -0
  161. package/dist/composition/index.js.map +1 -0
  162. package/dist/composition/quantities.d.ts +297 -0
  163. package/dist/composition/quantities.d.ts.map +1 -0
  164. package/dist/composition/quantities.js +1017 -0
  165. package/dist/composition/quantities.js.map +1 -0
  166. package/dist/composition/quantity.d.ts +59 -0
  167. package/dist/composition/quantity.d.ts.map +1 -0
  168. package/dist/composition/quantity.js +36 -0
  169. package/dist/composition/quantity.js.map +1 -0
  170. package/dist/composition/retrodiction.d.ts +94 -0
  171. package/dist/composition/retrodiction.d.ts.map +1 -0
  172. package/dist/composition/retrodiction.js +171 -0
  173. package/dist/composition/retrodiction.js.map +1 -0
  174. package/dist/composition/symbolic-constants.d.ts +33 -0
  175. package/dist/composition/symbolic-constants.d.ts.map +1 -0
  176. package/dist/composition/symbolic-constants.js +50 -0
  177. package/dist/composition/symbolic-constants.js.map +1 -0
  178. package/dist/composition/uncertainty.d.ts +45 -0
  179. package/dist/composition/uncertainty.d.ts.map +1 -0
  180. package/dist/composition/uncertainty.js +59 -0
  181. package/dist/composition/uncertainty.js.map +1 -0
  182. package/dist/core/axes-registry.d.ts +1 -1
  183. package/dist/core/axes-registry.js +1 -1
  184. package/dist/core/cell.d.ts +0 -8
  185. package/dist/core/cell.d.ts.map +1 -1
  186. package/dist/core/cell.js +1 -1
  187. package/dist/core/cell.js.map +1 -1
  188. package/dist/core/constants.d.ts +15 -1
  189. package/dist/core/constants.d.ts.map +1 -1
  190. package/dist/core/constants.js +15 -1
  191. package/dist/core/constants.js.map +1 -1
  192. package/dist/core/flux-rules.d.ts +10 -13
  193. package/dist/core/flux-rules.d.ts.map +1 -1
  194. package/dist/core/flux-rules.js +19 -10
  195. package/dist/core/flux-rules.js.map +1 -1
  196. package/dist/core/labeled-tensor.d.ts +80 -1
  197. package/dist/core/labeled-tensor.d.ts.map +1 -1
  198. package/dist/core/labeled-tensor.js +263 -17
  199. package/dist/core/labeled-tensor.js.map +1 -1
  200. package/dist/core/universal-index.d.ts +1 -1
  201. package/dist/core/universal-index.js +1 -1
  202. package/dist/dimensional/buckingham.d.ts +103 -0
  203. package/dist/dimensional/buckingham.d.ts.map +1 -0
  204. package/dist/dimensional/buckingham.js +284 -0
  205. package/dist/dimensional/buckingham.js.map +1 -0
  206. package/dist/dimensional/dimension-spec.d.ts +24 -0
  207. package/dist/dimensional/dimension-spec.d.ts.map +1 -0
  208. package/dist/dimensional/dimension-spec.js +110 -0
  209. package/dist/dimensional/dimension-spec.js.map +1 -0
  210. package/dist/dimensional/field-equation-helpers.d.ts +1 -1
  211. package/dist/dimensional/field-equation-helpers.js +1 -1
  212. package/dist/dimensional/friedmann-equation.d.ts +1 -1
  213. package/dist/dimensional/friedmann-equation.js +1 -1
  214. package/dist/dimensional/gauge-field.d.ts +1 -1
  215. package/dist/dimensional/gauge-field.js +1 -1
  216. package/dist/dimensional/klein-gordon-equation.d.ts +8 -5
  217. package/dist/dimensional/klein-gordon-equation.d.ts.map +1 -1
  218. package/dist/dimensional/klein-gordon-equation.js +8 -5
  219. package/dist/dimensional/klein-gordon-equation.js.map +1 -1
  220. package/dist/dimensional/tensor-trace.d.ts +1 -1
  221. package/dist/dimensional/tensor-trace.js +1 -1
  222. package/dist/dimensional/validator.d.ts +13 -3
  223. package/dist/dimensional/validator.d.ts.map +1 -1
  224. package/dist/dimensional/validator.js +129 -42
  225. package/dist/dimensional/validator.js.map +1 -1
  226. package/dist/index.d.ts +32 -2
  227. package/dist/index.d.ts.map +1 -1
  228. package/dist/index.js +63 -2
  229. package/dist/index.js.map +1 -1
  230. package/dist/numerical/be37-covariant-eikonal.d.ts.map +1 -1
  231. package/dist/numerical/be37-covariant-eikonal.js +15 -18
  232. package/dist/numerical/be37-covariant-eikonal.js.map +1 -1
  233. package/dist/numerical/curvature-lowering-helpers.d.ts +7 -13
  234. package/dist/numerical/curvature-lowering-helpers.d.ts.map +1 -1
  235. package/dist/numerical/curvature-lowering-helpers.js +1 -1
  236. package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
  237. package/dist/numerical/derivative-lowering.d.ts +2 -1
  238. package/dist/numerical/derivative-lowering.d.ts.map +1 -1
  239. package/dist/numerical/formula-dimension.d.ts +40 -0
  240. package/dist/numerical/formula-dimension.d.ts.map +1 -0
  241. package/dist/numerical/formula-dimension.js +199 -0
  242. package/dist/numerical/formula-dimension.js.map +1 -0
  243. package/dist/numerical/formula-mathts.d.ts +27 -0
  244. package/dist/numerical/formula-mathts.d.ts.map +1 -0
  245. package/dist/numerical/formula-mathts.js +98 -0
  246. package/dist/numerical/formula-mathts.js.map +1 -0
  247. package/dist/numerical/formula-registry.d.ts +30 -0
  248. package/dist/numerical/formula-registry.d.ts.map +1 -0
  249. package/dist/numerical/formula-registry.js +88 -0
  250. package/dist/numerical/formula-registry.js.map +1 -0
  251. package/dist/numerical/formula.d.ts +75 -0
  252. package/dist/numerical/formula.d.ts.map +1 -0
  253. package/dist/numerical/formula.js +275 -0
  254. package/dist/numerical/formula.js.map +1 -0
  255. package/dist/numerical/geometrized.d.ts +51 -0
  256. package/dist/numerical/geometrized.d.ts.map +1 -0
  257. package/dist/numerical/geometrized.js +66 -0
  258. package/dist/numerical/geometrized.js.map +1 -0
  259. package/dist/numerical/gl4-integrator.d.ts +8 -6
  260. package/dist/numerical/gl4-integrator.d.ts.map +1 -1
  261. package/dist/numerical/gl4-integrator.js +6 -6
  262. package/dist/numerical/gl4-integrator.js.map +1 -1
  263. package/dist/numerical/klein-gordon.d.ts +145 -0
  264. package/dist/numerical/klein-gordon.d.ts.map +1 -0
  265. package/dist/numerical/klein-gordon.js +145 -0
  266. package/dist/numerical/klein-gordon.js.map +1 -0
  267. package/dist/numerical/kretschmann.d.ts +43 -12
  268. package/dist/numerical/kretschmann.d.ts.map +1 -1
  269. package/dist/numerical/kretschmann.js +116 -29
  270. package/dist/numerical/kretschmann.js.map +1 -1
  271. package/dist/numerical/lowering.d.ts +18 -0
  272. package/dist/numerical/lowering.d.ts.map +1 -1
  273. package/dist/numerical/lowering.js +54 -42
  274. package/dist/numerical/lowering.js.map +1 -1
  275. package/dist/numerical/null-ic.d.ts +1 -1
  276. package/dist/numerical/null-ic.d.ts.map +1 -1
  277. package/dist/numerical/null-ic.js +3 -2
  278. package/dist/numerical/null-ic.js.map +1 -1
  279. package/dist/numerical/painleve-gullstrand-metric.d.ts +18 -6
  280. package/dist/numerical/painleve-gullstrand-metric.d.ts.map +1 -1
  281. package/dist/numerical/painleve-gullstrand-metric.js +31 -16
  282. package/dist/numerical/painleve-gullstrand-metric.js.map +1 -1
  283. package/dist/numerical/perihelion-finder.d.ts +4 -3
  284. package/dist/numerical/perihelion-finder.d.ts.map +1 -1
  285. package/dist/numerical/perihelion-finder.js +5 -4
  286. package/dist/numerical/perihelion-finder.js.map +1 -1
  287. package/dist/numerical/types.d.ts +6 -3
  288. package/dist/numerical/types.d.ts.map +1 -1
  289. package/dist/numerical/weyl-lowering.d.ts +4 -4
  290. package/dist/numerical/weyl-lowering.d.ts.map +1 -1
  291. package/dist/numerical/weyl-lowering.js +14 -1
  292. package/dist/numerical/weyl-lowering.js.map +1 -1
  293. package/package.json +21 -4
@@ -0,0 +1,102 @@
1
+ /**
2
+ * "Explain this quantity" — the unified entry point over the three
3
+ * bridge-inference primitives (docs/planning/Bridge-Inference-Epistemics-
4
+ * Note.md). Given a target quantity and a set of knowns (names, or
5
+ * name→value), it composes:
6
+ *
7
+ * 1. the identifiability classifier — CAN the graph compute the target
8
+ * from the knowns, and via how many independent derivations?
9
+ * 2. the retrodiction harness — when values are supplied, RECOVER the
10
+ * value via each derivation and (for over-determined targets) check
11
+ * they agree;
12
+ * 3. the Buckingham-π enumerator — is the known set even DIMENSIONALLY
13
+ * sufficient to fix the target up to a constant, independent of the
14
+ * graph's encoded edges?
15
+ *
16
+ * The three answer complementary questions, so the explanation is richer
17
+ * than any one alone: the graph may compute a target whose dimensional
18
+ * closure relies on constants baked into the evaluator (e.g. r_s = 2GM/c²
19
+ * — mass alone is not dimensionally sufficient), and the classifier +
20
+ * Buckingham layer make that explicit together.
21
+ *
22
+ * @module composition/explain
23
+ */
24
+ import type { BridgeEdge } from './edge.js';
25
+ import type { QuantityIdentification } from './compose.js';
26
+ import type { IdentifiabilityResult } from './identifiability.js';
27
+ import type { RetrodictionResult } from './retrodiction.js';
28
+ import type { Dimension } from '../dimensional/types.js';
29
+ import type { DimensionalDeterminationResult } from '../dimensional/buckingham.js';
30
+ /** One structural derivation of the target, with the recovered value when
31
+ * ground-truth values were supplied. @public */
32
+ export interface DerivationExplanation {
33
+ readonly edge: string;
34
+ readonly label: string;
35
+ /** The edge's immediate (last-hop) source quantities. */
36
+ readonly sources: readonly string[];
37
+ /**
38
+ * The LEAF inputs this derivation ultimately depends on — its immediate
39
+ * sources traced back through every intermediate to the known set. The
40
+ * full-chain (leaf-to-target) view, vs `sources` (last-hop). A subset of
41
+ * the known set.
42
+ */
43
+ readonly leafInputs: readonly string[];
44
+ /**
45
+ * The target as a dimensionless-constant-times-monomial in the LEAF
46
+ * inputs, when those leaves dimensionally fix it (Buckingham-π over the
47
+ * full chain). Absent when the leaves rely on dimensionful constants
48
+ * baked into the evaluators (the common case for the bridge graph).
49
+ */
50
+ readonly dimensionalForm?: {
51
+ readonly monomial: Readonly<Record<string, number>>;
52
+ /** e.g. `period ∝ length^1·gravity^-1` (up to a dimensionless constant). */
53
+ readonly formula: string;
54
+ };
55
+ /** Value recovered via this derivation (only when values were given). */
56
+ readonly value?: number;
57
+ }
58
+ /** Options for {@link explainQuantity}. @public */
59
+ export interface ExplainOptions {
60
+ readonly identifications?: readonly QuantityIdentification[];
61
+ /** Consistency tolerance forwarded to the retrodiction harness. */
62
+ readonly tolerance?: number;
63
+ /**
64
+ * Dimensions for known names that are not graph quantities (e.g. raw
65
+ * constants `G`, `c`, `hbar`) — lets the Buckingham layer test a known
66
+ * set richer than the graph's nodes.
67
+ */
68
+ readonly extraDimensions?: Readonly<Record<string, Dimension>>;
69
+ }
70
+ /** The unified explanation of one quantity. @public */
71
+ export interface QuantityExplanation {
72
+ readonly target: string;
73
+ readonly known: readonly string[];
74
+ /** Structural verdict (under/exactly/over-determined or given). */
75
+ readonly identifiability: IdentifiabilityResult;
76
+ /** One entry per independent derivation the classifier found. */
77
+ readonly derivations: readonly DerivationExplanation[];
78
+ /** Retrodiction result, present when ≥2 derivations fired on values. */
79
+ readonly consistency?: RetrodictionResult;
80
+ /** Agreed recovered value (consistent or single), when values supplied. */
81
+ readonly recoveredValue?: number;
82
+ /** Whether the KNOWN set dimensionally fixes the target (Buckingham-π);
83
+ * absent when the target has no resolvable dimension. */
84
+ readonly dimensional?: DimensionalDeterminationResult;
85
+ /** Upstream gaps for an under-determined target (from the classifier). */
86
+ readonly blockingFrontier: readonly string[];
87
+ /** Plain-language synthesis of the above. */
88
+ readonly summary: string;
89
+ }
90
+ /**
91
+ * Explain a quantity: synthesize the identifiability verdict, the
92
+ * recovered value + consistency (when values are supplied), and the
93
+ * dimensional sufficiency of the known set into one report.
94
+ *
95
+ * `known` may be a list of names (structural + dimensional analysis only)
96
+ * or a `name → value` map (adds value recovery and the over-determined
97
+ * consistency check).
98
+ *
99
+ * @public
100
+ */
101
+ export declare function explainQuantity(edges: readonly BridgeEdge[], target: string, known: readonly string[] | Readonly<Record<string, number>>, opts?: ExplainOptions): QuantityExplanation;
102
+ //# sourceMappingURL=explain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain.d.ts","sourceRoot":"","sources":["../../src/composition/explain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAElE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAGnF;iDACiD;AACjD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,yDAAyD;IACzD,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE;QACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACpD,4EAA4E;QAC5E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,yEAAyE;IACzE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,mDAAmD;AACnD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC7D,mEAAmE;IACnE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;CAChE;AAED,uDAAuD;AACvD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,mEAAmE;IACnE,QAAQ,CAAC,eAAe,EAAE,qBAAqB,CAAC;IAChD,iEAAiE;IACjE,QAAQ,CAAC,WAAW,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACvD,wEAAwE;IACxE,QAAQ,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IAC1C,2EAA2E;IAC3E,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC;8DAC0D;IAC1D,QAAQ,CAAC,WAAW,CAAC,EAAE,8BAA8B,CAAC;IACtD,0EAA0E;IAC1E,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAmID;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC3D,IAAI,GAAE,cAAmB,GACxB,mBAAmB,CAoHrB"}
@@ -0,0 +1,244 @@
1
+ /**
2
+ * "Explain this quantity" — the unified entry point over the three
3
+ * bridge-inference primitives (docs/planning/Bridge-Inference-Epistemics-
4
+ * Note.md). Given a target quantity and a set of knowns (names, or
5
+ * name→value), it composes:
6
+ *
7
+ * 1. the identifiability classifier — CAN the graph compute the target
8
+ * from the knowns, and via how many independent derivations?
9
+ * 2. the retrodiction harness — when values are supplied, RECOVER the
10
+ * value via each derivation and (for over-determined targets) check
11
+ * they agree;
12
+ * 3. the Buckingham-π enumerator — is the known set even DIMENSIONALLY
13
+ * sufficient to fix the target up to a constant, independent of the
14
+ * graph's encoded edges?
15
+ *
16
+ * The three answer complementary questions, so the explanation is richer
17
+ * than any one alone: the graph may compute a target whose dimensional
18
+ * closure relies on constants baked into the evaluator (e.g. r_s = 2GM/c²
19
+ * — mass alone is not dimensionally sufficient), and the classifier +
20
+ * Buckingham layer make that explicit together.
21
+ *
22
+ * @module composition/explain
23
+ */
24
+ import { QUANTITY_IDENTIFICATIONS } from './compose.js';
25
+ import { classifyIdentifiability, forwardClosure } from './identifiability.js';
26
+ import { retrodictNode } from './retrodiction.js';
27
+ import { dimensionallyDetermines } from '../dimensional/buckingham.js';
28
+ function buildDimMap(edges, extra) {
29
+ const m = new Map();
30
+ for (const e of edges) {
31
+ for (const s of e.sources)
32
+ if (!m.has(s.name))
33
+ m.set(s.name, s.dim);
34
+ if (!m.has(e.target.name))
35
+ m.set(e.target.name, e.target.dim);
36
+ }
37
+ if (extra)
38
+ for (const [k, v] of Object.entries(extra))
39
+ m.set(k, v);
40
+ return m;
41
+ }
42
+ /**
43
+ * Trace `startSources` back through every intermediate to the leaf inputs
44
+ * — names in `known`, or terminals that no determinable edge produces.
45
+ * Never expands the target (a self-loop would be circular). The union over
46
+ * alternative sub-derivations of an over-determined intermediate.
47
+ */
48
+ function traceLeaves(edges, known, determinable, startSources, idents, target) {
49
+ const leaves = new Set();
50
+ const visited = new Set([target]); // never expand the target itself
51
+ const stack = [...startSources];
52
+ while (stack.length) {
53
+ const q = stack.pop();
54
+ if (known.has(q)) {
55
+ leaves.add(q);
56
+ continue;
57
+ }
58
+ if (visited.has(q))
59
+ continue;
60
+ visited.add(q);
61
+ let expanded = false;
62
+ for (const e of edges) {
63
+ if (e.target.name !== q)
64
+ continue;
65
+ if (!e.sources.every((s) => determinable.has(s.name)))
66
+ continue;
67
+ for (const s of e.sources)
68
+ stack.push(s.name);
69
+ expanded = true;
70
+ }
71
+ if (!expanded) {
72
+ for (const id of idents) {
73
+ if (id.to === q && determinable.has(id.from)) {
74
+ stack.push(id.from);
75
+ expanded = true;
76
+ }
77
+ }
78
+ }
79
+ if (!expanded)
80
+ leaves.add(q); // a terminal we cannot expand
81
+ }
82
+ return [...leaves].sort();
83
+ }
84
+ function formatMonomial(m) {
85
+ const parts = Object.entries(m)
86
+ .filter(([, e]) => e !== 0)
87
+ .map(([n, e]) => (e === 1 ? n : `${n}^${e}`));
88
+ return parts.join('·') || '1';
89
+ }
90
+ function buildSummary(target, id, derivations, consistency, recoveredValue, dimensional, knownNames) {
91
+ const known = knownNames.length
92
+ ? `{${knownNames.join(', ')}}`
93
+ : '{} (no inputs)';
94
+ const ids = derivations.map((d) => d.edge).join(', ');
95
+ let s;
96
+ switch (id.verdict) {
97
+ case 'given':
98
+ s = `'${target}' is a supplied input.`;
99
+ if (derivations.length) {
100
+ s += ` ${derivations.length} graph derivation(s) (${ids}) can cross-check it`;
101
+ s += consistency
102
+ ? consistency.outcome === 'consistent'
103
+ ? `, and they are consistent (relative spread ${consistency.relativeSpread.toExponential(1)}).`
104
+ : ` — and they are INCONSISTENT (relative spread ${consistency.relativeSpread.toExponential(1)}).`
105
+ : '.';
106
+ }
107
+ break;
108
+ case 'under-determined':
109
+ s = `'${target}' cannot be determined from ${known}: the graph has no derivation path.`;
110
+ if (id.blockingFrontier.length) {
111
+ s += ` Knowing one of {${id.blockingFrontier.join(', ')}} would unblock it.`;
112
+ }
113
+ break;
114
+ case 'exactly-determined':
115
+ s = `'${target}' is determined from ${known} via ${derivations[0]?.edge} (${derivations[0]?.label}).`;
116
+ if (recoveredValue !== undefined) {
117
+ s += ` Recovered value: ${recoveredValue.toExponential(4)}.`;
118
+ }
119
+ break;
120
+ case 'over-determined':
121
+ default:
122
+ s = `'${target}' is over-determined from ${known}: ${derivations.length} independent derivations (${ids}).`;
123
+ if (consistency) {
124
+ s +=
125
+ consistency.outcome === 'consistent'
126
+ ? ` They agree (relative spread ${consistency.relativeSpread.toExponential(1)}) — a passing consistency check.`
127
+ : ` They DISAGREE (relative spread ${consistency.relativeSpread.toExponential(1)}) — a falsification.`;
128
+ }
129
+ else {
130
+ s += ` The ${id.surplusConstraints} surplus derivation(s) are falsifiable consistency constraints (supply values to check them).`;
131
+ }
132
+ if (recoveredValue !== undefined) {
133
+ s += ` Recovered value: ${recoveredValue.toExponential(4)}.`;
134
+ }
135
+ break;
136
+ }
137
+ if (dimensional?.determined && dimensional.monomial) {
138
+ s += ` Dimensionally, ${known} fix it up to a dimensionless constant: ${target} ∝ ${formatMonomial(dimensional.monomial)}.`;
139
+ }
140
+ else if (dimensional && !dimensional.determined && knownNames.length) {
141
+ s += ` Dimensionally, those inputs alone do not fix it — the encoded formula carries dimensionful constants.`;
142
+ }
143
+ return s;
144
+ }
145
+ /**
146
+ * Explain a quantity: synthesize the identifiability verdict, the
147
+ * recovered value + consistency (when values are supplied), and the
148
+ * dimensional sufficiency of the known set into one report.
149
+ *
150
+ * `known` may be a list of names (structural + dimensional analysis only)
151
+ * or a `name → value` map (adds value recovery and the over-determined
152
+ * consistency check).
153
+ *
154
+ * @public
155
+ */
156
+ export function explainQuantity(edges, target, known, opts = {}) {
157
+ const identifications = opts.identifications ?? QUANTITY_IDENTIFICATIONS;
158
+ const hasValues = !Array.isArray(known);
159
+ const values = hasValues ? known : null;
160
+ const knownNames = hasValues
161
+ ? Object.keys(values)
162
+ : [...new Set(known)];
163
+ const identifiability = classifyIdentifiability(edges, knownNames, target, {
164
+ identifications,
165
+ });
166
+ const byId = new Map(edges.map((e) => [e.id, e]));
167
+ let consistency;
168
+ let recoveredValue;
169
+ const valueByEdge = new Map();
170
+ if (values) {
171
+ const references = target in values ? { [target]: values[target] } : undefined;
172
+ const retro = retrodictNode(edges, values, target, {
173
+ identifications,
174
+ tolerance: opts.tolerance,
175
+ references,
176
+ });
177
+ for (const p of retro.predictions)
178
+ valueByEdge.set(p.edge, p.value);
179
+ if (retro.predictions.length >= 2)
180
+ consistency = retro;
181
+ if ((retro.outcome === 'consistent' || retro.outcome === 'single') &&
182
+ retro.predictions.length > 0) {
183
+ recoveredValue =
184
+ retro.predictions.reduce((a, p) => a + p.value, 0) /
185
+ retro.predictions.length;
186
+ }
187
+ }
188
+ const dimMap = buildDimMap(edges, opts.extraDimensions);
189
+ const knownSet = new Set(knownNames);
190
+ const determinable = forwardClosure(edges, knownNames, identifications);
191
+ const derivations = identifiability.derivations.map((eid) => {
192
+ const e = byId.get(eid);
193
+ const sources = e ? e.sources.map((s) => s.name) : [];
194
+ // Full-chain: trace the immediate sources back to the leaf inputs.
195
+ const leafInputs = e
196
+ ? traceLeaves(edges, knownSet, determinable, sources, identifications, target)
197
+ : [];
198
+ // Dimensional form in terms of those leaves, when they fix the target.
199
+ let dimensionalForm;
200
+ const targetDimForChain = dimMap.get(target);
201
+ if (targetDimForChain && leafInputs.length) {
202
+ const governing = leafInputs
203
+ .filter((n) => n !== target && dimMap.has(n))
204
+ .map((n) => ({ name: n, dim: dimMap.get(n) }));
205
+ const det = dimensionallyDetermines({ name: target, dim: targetDimForChain }, governing);
206
+ if (det.determined && det.monomial) {
207
+ dimensionalForm = {
208
+ monomial: det.monomial,
209
+ formula: `${target} ∝ ${formatMonomial(det.monomial)}`,
210
+ };
211
+ }
212
+ }
213
+ return {
214
+ edge: eid,
215
+ label: e?.label ?? eid,
216
+ sources,
217
+ leafInputs,
218
+ ...(dimensionalForm ? { dimensionalForm } : {}),
219
+ ...(valueByEdge.has(eid) ? { value: valueByEdge.get(eid) } : {}),
220
+ };
221
+ });
222
+ // Dimensional sufficiency of the KNOWN set, independent of the graph.
223
+ let dimensional;
224
+ const targetDim = dimMap.get(target);
225
+ if (targetDim) {
226
+ const governing = knownNames
227
+ .filter((n) => n !== target && dimMap.has(n))
228
+ .map((n) => ({ name: n, dim: dimMap.get(n) }));
229
+ dimensional = dimensionallyDetermines({ name: target, dim: targetDim }, governing);
230
+ }
231
+ const summary = buildSummary(target, identifiability, derivations, consistency, recoveredValue, dimensional, knownNames);
232
+ return {
233
+ target,
234
+ known: knownNames,
235
+ identifiability,
236
+ derivations,
237
+ ...(consistency ? { consistency } : {}),
238
+ ...(recoveredValue !== undefined ? { recoveredValue } : {}),
239
+ ...(dimensional ? { dimensional } : {}),
240
+ blockingFrontier: identifiability.blockingFrontier,
241
+ summary,
242
+ };
243
+ }
244
+ //# sourceMappingURL=explain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain.js","sourceRoot":"","sources":["../../src/composition/explain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Scalar `ExprNode` value evaluator (v0.12 symbolic composition).
3
+ *
4
+ * Numerically evaluates a SCALAR `ExprNode` (the `symbol` / `op` / `integral`
5
+ * / `derivative` arms) given leaf values. The dimensional validator infers
6
+ * dimensions but never computes values, and the formula parser evaluates a
7
+ * DIFFERENT AST — so this is the missing primitive that makes a bridge's
8
+ * `symbolic` form executable.
9
+ *
10
+ * Leaf resolution order (Adam A-1, A-5): caller `values` win, then the
11
+ * `CONSTANTS` registry, then a base-10 numeric-literal symbol (`'2'`, `'3'`);
12
+ * an unresolved or non-finite leaf throws. `^` reads its exponent from the
13
+ * second arg's `name` via `Number(...)` (matching validator.ts) and uses
14
+ * `Math.pow`. Tensor / integral / derivative arms are out of scope and throw.
15
+ *
16
+ * INTERNAL — not on the public surface.
17
+ *
18
+ * @module composition/expr-eval
19
+ */
20
+ import type { ExprNode } from '../dimensional/validator.js';
21
+ /** A scalar `ExprNode` could not be evaluated (unsupported arm / unresolved
22
+ * leaf / non-finite result). @public */
23
+ export declare class SymbolicEvalError extends Error {
24
+ constructor(message: string);
25
+ }
26
+ /**
27
+ * Evaluate a scalar `ExprNode` to a number. See module docs for the leaf
28
+ * resolution order and scope.
29
+ *
30
+ * @internal
31
+ */
32
+ export declare function evalExpr(node: ExprNode, values?: Readonly<Record<string, number>>): number;
33
+ //# sourceMappingURL=expr-eval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expr-eval.d.ts","sourceRoot":"","sources":["../../src/composition/expr-eval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAG5D;yCACyC;AACzC,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAI5B;AAeD;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,QAAQ,EACd,MAAM,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,GAC5C,MAAM,CAyCR"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Scalar `ExprNode` value evaluator (v0.12 symbolic composition).
3
+ *
4
+ * Numerically evaluates a SCALAR `ExprNode` (the `symbol` / `op` / `integral`
5
+ * / `derivative` arms) given leaf values. The dimensional validator infers
6
+ * dimensions but never computes values, and the formula parser evaluates a
7
+ * DIFFERENT AST — so this is the missing primitive that makes a bridge's
8
+ * `symbolic` form executable.
9
+ *
10
+ * Leaf resolution order (Adam A-1, A-5): caller `values` win, then the
11
+ * `CONSTANTS` registry, then a base-10 numeric-literal symbol (`'2'`, `'3'`);
12
+ * an unresolved or non-finite leaf throws. `^` reads its exponent from the
13
+ * second arg's `name` via `Number(...)` (matching validator.ts) and uses
14
+ * `Math.pow`. Tensor / integral / derivative arms are out of scope and throw.
15
+ *
16
+ * INTERNAL — not on the public surface.
17
+ *
18
+ * @module composition/expr-eval
19
+ */
20
+ import { CONSTANTS } from './symbolic-constants.js';
21
+ /** A scalar `ExprNode` could not be evaluated (unsupported arm / unresolved
22
+ * leaf / non-finite result). @public */
23
+ export class SymbolicEvalError extends Error {
24
+ constructor(message) {
25
+ super(message);
26
+ this.name = 'SymbolicEvalError';
27
+ }
28
+ }
29
+ /** Resolve a leaf symbol's numeric value: values → CONSTANTS → literal. */
30
+ function resolveLeaf(name, values) {
31
+ if (Object.prototype.hasOwnProperty.call(values, name))
32
+ return values[name];
33
+ const constant = CONSTANTS[name];
34
+ if (constant !== undefined)
35
+ return constant.value;
36
+ const literal = Number(name);
37
+ if (Number.isFinite(literal))
38
+ return literal;
39
+ throw new SymbolicEvalError(`evalExpr: leaf symbol '${name}' has no value (not in inputs, not a ` +
40
+ `registered constant, not a numeric literal).`);
41
+ }
42
+ /**
43
+ * Evaluate a scalar `ExprNode` to a number. See module docs for the leaf
44
+ * resolution order and scope.
45
+ *
46
+ * @internal
47
+ */
48
+ export function evalExpr(node, values = {}) {
49
+ switch (node.kind) {
50
+ case 'symbol':
51
+ return resolveLeaf(node.name, values);
52
+ case 'op': {
53
+ if (node.op === '^') {
54
+ if (node.args.length !== 2) {
55
+ throw new SymbolicEvalError(`evalExpr: '^' needs exactly 2 args, got ${node.args.length}.`);
56
+ }
57
+ // The exponent may be a numeric-literal symbol (resolveLeaf returns its
58
+ // value) OR a general input-dependent expression (v0.13 — e.g. −1/z).
59
+ // `finite()` still catches a non-finite result (NaN/Inf).
60
+ const base = evalExpr(node.args[0], values);
61
+ const exp = evalExpr(node.args[1], values);
62
+ return finite(Math.pow(base, exp), node);
63
+ }
64
+ if (node.args.length === 0) {
65
+ // Mirrors the validator's empty-op convention: * / → 1, + - → 0.
66
+ return node.op === '*' || node.op === '/' ? 1 : 0;
67
+ }
68
+ let acc = evalExpr(node.args[0], values);
69
+ for (let i = 1; i < node.args.length; i++) {
70
+ const v = evalExpr(node.args[i], values);
71
+ if (node.op === '+')
72
+ acc += v;
73
+ else if (node.op === '-')
74
+ acc -= v;
75
+ else if (node.op === '*')
76
+ acc *= v;
77
+ else
78
+ acc /= v;
79
+ }
80
+ return finite(acc, node);
81
+ }
82
+ default:
83
+ throw new SymbolicEvalError(`evalExpr: node kind '${node.kind}' is out of scope (scalar ` +
84
+ `symbol/op only; integral/derivative/tensor nodes are not ` +
85
+ `numerically evaluable here).`);
86
+ }
87
+ }
88
+ function finite(value, node) {
89
+ if (!Number.isFinite(value)) {
90
+ throw new SymbolicEvalError(`evalExpr: '${node.op ?? node.kind}' produced a ` +
91
+ `non-finite value (${value}).`);
92
+ }
93
+ return value;
94
+ }
95
+ //# sourceMappingURL=expr-eval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expr-eval.js","sourceRoot":"","sources":["../../src/composition/expr-eval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Symbolic simplification of a scalar `ExprNode` via MathTS (v0.12 — optional
3
+ * supplement to symbolic composition).
4
+ *
5
+ * Composing two bridges' symbolic forms leaves an UNSIMPLIFIED AST — CT-1 is
6
+ * `k_B·(ℏc³/8πG·mass·k_B)·ln2`, with `k_B` uncancelled. This folds it to the
7
+ * canonical `ℏc³·ln2/(8πG·mass)` using `@danielsimonjr/mathts-functions`'
8
+ * `simplify` (the same OPTIONAL peer the Path-A formula parser loads).
9
+ *
10
+ * Pipeline (Adam+Eve-vetted — docs/planning/v0.12.0-Symbolic-Simplification-
11
+ * Design.md): GENSYM every non-exponent leaf to a mathjs-safe identifier
12
+ * (shared by name, so repeated leaves cancel), render FULLY-PARENTHESIZED
13
+ * (EVE-A — no precedence ambiguity), `parse`+`simplify`, walk the result back
14
+ * (un-gensym, INTEGER-exponent-strict — EVE/Adam HIGH-1). Three guards make a
15
+ * black-box CAS safe to trust:
16
+ * 1. dimensional — `validate(simplified)` dim `equals` the original's;
17
+ * 2. structural — non-numeric symbols of the result ⊆ those of the original
18
+ * (no leaf invented — Adam HIGH-2 / EVE-B);
19
+ * 3. numeric — `evalExpr` agrees over ≥2 finite synthesized probes at
20
+ * rel tol 1e-9 (Adam CRITICAL-2 / EVE-C).
21
+ * A representable result that DISAGREES dimensionally/numerically THROWS (a
22
+ * bug to surface); anything we cannot represent / verify / load degrades to a
23
+ * graceful no-op (return the original, `simplified:false`).
24
+ *
25
+ * INTERNAL — surfaced via `upt symbolic --simplify`.
26
+ *
27
+ * @module composition/expr-simplify
28
+ */
29
+ import type { ExprNode } from '../dimensional/validator.js';
30
+ import type { Observable } from './compose-symbolic.js';
31
+ /** A simplification completed but produced a dimensionally/numerically wrong
32
+ * result (a real bug — not a graceful no-op). @internal */
33
+ export declare class SimplificationError extends Error {
34
+ constructor(message: string);
35
+ }
36
+ /** The result of attempting to simplify an expression. */
37
+ export interface SimplifyResult {
38
+ readonly expr: ExprNode;
39
+ /** True iff MathTS was present AND produced a guard-passing, distinct form. */
40
+ readonly simplified: boolean;
41
+ }
42
+ /**
43
+ * Simplify a scalar `ExprNode` via MathTS, guarded. Returns the original
44
+ * unchanged (`simplified:false`) when the peer is absent or the result cannot
45
+ * be represented/verified; THROWS {@link SimplificationError} only when a
46
+ * representable result disagrees dimensionally/numerically. See module docs.
47
+ *
48
+ * @internal
49
+ */
50
+ export declare function simplifyExpr(expr: ExprNode): Promise<SimplifyResult>;
51
+ /**
52
+ * Simplify a composed {@link Observable}: returns a freshly-RECONSTRUCTED
53
+ * Observable (new strict `evaluate` closure over the simplified `expr` +
54
+ * recomputed `leaves`) when simplification succeeds, else the original
55
+ * unchanged. See module docs.
56
+ *
57
+ * @internal
58
+ */
59
+ export declare function simplifyObservable(obs: Observable): Promise<Observable>;
60
+ //# sourceMappingURL=expr-simplify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expr-simplify.d.ts","sourceRoot":"","sources":["../../src/composition/expr-simplify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAO5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD;4DAC4D;AAC5D,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAoQD,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,CAmD1E;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAI7E"}