universal-physics-tensor 0.7.3 → 0.15.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 (297) 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/diff/bridge-gradient.d.ts +51 -8
  203. package/dist/diff/bridge-gradient.d.ts.map +1 -1
  204. package/dist/diff/bridge-gradient.js +75 -8
  205. package/dist/diff/bridge-gradient.js.map +1 -1
  206. package/dist/dimensional/buckingham.d.ts +103 -0
  207. package/dist/dimensional/buckingham.d.ts.map +1 -0
  208. package/dist/dimensional/buckingham.js +284 -0
  209. package/dist/dimensional/buckingham.js.map +1 -0
  210. package/dist/dimensional/dimension-spec.d.ts +24 -0
  211. package/dist/dimensional/dimension-spec.d.ts.map +1 -0
  212. package/dist/dimensional/dimension-spec.js +110 -0
  213. package/dist/dimensional/dimension-spec.js.map +1 -0
  214. package/dist/dimensional/field-equation-helpers.d.ts +1 -1
  215. package/dist/dimensional/field-equation-helpers.js +1 -1
  216. package/dist/dimensional/friedmann-equation.d.ts +1 -1
  217. package/dist/dimensional/friedmann-equation.js +1 -1
  218. package/dist/dimensional/gauge-field.d.ts +1 -1
  219. package/dist/dimensional/gauge-field.js +1 -1
  220. package/dist/dimensional/klein-gordon-equation.d.ts +8 -5
  221. package/dist/dimensional/klein-gordon-equation.d.ts.map +1 -1
  222. package/dist/dimensional/klein-gordon-equation.js +8 -5
  223. package/dist/dimensional/klein-gordon-equation.js.map +1 -1
  224. package/dist/dimensional/tensor-trace.d.ts +1 -1
  225. package/dist/dimensional/tensor-trace.js +1 -1
  226. package/dist/dimensional/validator.d.ts +13 -3
  227. package/dist/dimensional/validator.d.ts.map +1 -1
  228. package/dist/dimensional/validator.js +129 -42
  229. package/dist/dimensional/validator.js.map +1 -1
  230. package/dist/index.d.ts +34 -4
  231. package/dist/index.d.ts.map +1 -1
  232. package/dist/index.js +64 -3
  233. package/dist/index.js.map +1 -1
  234. package/dist/numerical/be37-covariant-eikonal.d.ts.map +1 -1
  235. package/dist/numerical/be37-covariant-eikonal.js +15 -18
  236. package/dist/numerical/be37-covariant-eikonal.js.map +1 -1
  237. package/dist/numerical/curvature-lowering-helpers.d.ts +7 -13
  238. package/dist/numerical/curvature-lowering-helpers.d.ts.map +1 -1
  239. package/dist/numerical/curvature-lowering-helpers.js +1 -1
  240. package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
  241. package/dist/numerical/derivative-lowering.d.ts +2 -1
  242. package/dist/numerical/derivative-lowering.d.ts.map +1 -1
  243. package/dist/numerical/formula-dimension.d.ts +40 -0
  244. package/dist/numerical/formula-dimension.d.ts.map +1 -0
  245. package/dist/numerical/formula-dimension.js +199 -0
  246. package/dist/numerical/formula-dimension.js.map +1 -0
  247. package/dist/numerical/formula-mathts.d.ts +27 -0
  248. package/dist/numerical/formula-mathts.d.ts.map +1 -0
  249. package/dist/numerical/formula-mathts.js +98 -0
  250. package/dist/numerical/formula-mathts.js.map +1 -0
  251. package/dist/numerical/formula-registry.d.ts +30 -0
  252. package/dist/numerical/formula-registry.d.ts.map +1 -0
  253. package/dist/numerical/formula-registry.js +88 -0
  254. package/dist/numerical/formula-registry.js.map +1 -0
  255. package/dist/numerical/formula.d.ts +75 -0
  256. package/dist/numerical/formula.d.ts.map +1 -0
  257. package/dist/numerical/formula.js +275 -0
  258. package/dist/numerical/formula.js.map +1 -0
  259. package/dist/numerical/geometrized.d.ts +51 -0
  260. package/dist/numerical/geometrized.d.ts.map +1 -0
  261. package/dist/numerical/geometrized.js +66 -0
  262. package/dist/numerical/geometrized.js.map +1 -0
  263. package/dist/numerical/gl4-integrator.d.ts +8 -6
  264. package/dist/numerical/gl4-integrator.d.ts.map +1 -1
  265. package/dist/numerical/gl4-integrator.js +6 -6
  266. package/dist/numerical/gl4-integrator.js.map +1 -1
  267. package/dist/numerical/klein-gordon.d.ts +145 -0
  268. package/dist/numerical/klein-gordon.d.ts.map +1 -0
  269. package/dist/numerical/klein-gordon.js +145 -0
  270. package/dist/numerical/klein-gordon.js.map +1 -0
  271. package/dist/numerical/kretschmann.d.ts +43 -12
  272. package/dist/numerical/kretschmann.d.ts.map +1 -1
  273. package/dist/numerical/kretschmann.js +116 -29
  274. package/dist/numerical/kretschmann.js.map +1 -1
  275. package/dist/numerical/lowering.d.ts +18 -0
  276. package/dist/numerical/lowering.d.ts.map +1 -1
  277. package/dist/numerical/lowering.js +54 -42
  278. package/dist/numerical/lowering.js.map +1 -1
  279. package/dist/numerical/null-ic.d.ts +1 -1
  280. package/dist/numerical/null-ic.d.ts.map +1 -1
  281. package/dist/numerical/null-ic.js +3 -2
  282. package/dist/numerical/null-ic.js.map +1 -1
  283. package/dist/numerical/painleve-gullstrand-metric.d.ts +18 -6
  284. package/dist/numerical/painleve-gullstrand-metric.d.ts.map +1 -1
  285. package/dist/numerical/painleve-gullstrand-metric.js +31 -16
  286. package/dist/numerical/painleve-gullstrand-metric.js.map +1 -1
  287. package/dist/numerical/perihelion-finder.d.ts +4 -3
  288. package/dist/numerical/perihelion-finder.d.ts.map +1 -1
  289. package/dist/numerical/perihelion-finder.js +5 -4
  290. package/dist/numerical/perihelion-finder.js.map +1 -1
  291. package/dist/numerical/types.d.ts +6 -3
  292. package/dist/numerical/types.d.ts.map +1 -1
  293. package/dist/numerical/weyl-lowering.d.ts +4 -4
  294. package/dist/numerical/weyl-lowering.d.ts.map +1 -1
  295. package/dist/numerical/weyl-lowering.js +14 -1
  296. package/dist/numerical/weyl-lowering.js.map +1 -1
  297. package/package.json +19 -8
@@ -114,6 +114,56 @@ export class RankPreservationError extends UPTError {
114
114
  Object.setPrototypeOf(this, RankPreservationError.prototype);
115
115
  }
116
116
  }
117
+ /**
118
+ * Thrown by the `LabeledTensor` constructor when an explicit `axisOrder` is
119
+ * not a valid permutation of the label keys (wrong length, a key that is not a
120
+ * label, or a duplicate). Distinct from `LabeledTensorConstructionError` (which
121
+ * means label-count ≠ tensor-rank) so a consumer never reads a rank-mismatch
122
+ * field on an order error.
123
+ *
124
+ * @public
125
+ */
126
+ export class AxisOrderError extends UPTError {
127
+ axisOrder;
128
+ labelKeys;
129
+ constructor(axisOrder, labelKeys) {
130
+ super(`LabeledTensor: axisOrder [${axisOrder.join(', ')}] is not a permutation ` +
131
+ `of the label keys [${labelKeys.join(', ')}] (it must list every label ` +
132
+ `key exactly once, in engine-axis order).`);
133
+ this.name = 'AxisOrderError';
134
+ this.axisOrder = axisOrder;
135
+ this.labelKeys = labelKeys;
136
+ Object.setPrototypeOf(this, AxisOrderError.prototype);
137
+ }
138
+ }
139
+ /**
140
+ * Thrown by `mergeAxes` when the request is malformed: fewer than two keys, an
141
+ * unknown key, keys that are not a contiguous run of engine-axis positions, or a
142
+ * merged key/id that collides with a surviving axis.
143
+ *
144
+ * @public
145
+ */
146
+ export class AxisMergeError extends UPTError {
147
+ constructor(message) {
148
+ super(`LabeledTensor.mergeAxes: ${message}`);
149
+ this.name = 'AxisMergeError';
150
+ Object.setPrototypeOf(this, AxisMergeError.prototype);
151
+ }
152
+ }
153
+ /**
154
+ * Thrown by `splitAxis` when the request is malformed: an unknown key, fewer
155
+ * than two parts, a non-positive/non-integer part size, a size product that
156
+ * does not match the original axis size, or a part key/id that collides.
157
+ *
158
+ * @public
159
+ */
160
+ export class AxisSplitError extends UPTError {
161
+ constructor(message) {
162
+ super(`LabeledTensor.splitAxis: ${message}`);
163
+ this.name = 'AxisSplitError';
164
+ Object.setPrototypeOf(this, AxisSplitError.prototype);
165
+ }
166
+ }
117
167
  // ---------------------------------------------------------------------------
118
168
  // canonicalLabelOrder — Risk 2 mitigation
119
169
  // ---------------------------------------------------------------------------
@@ -129,6 +179,24 @@ export class RankPreservationError extends UPTError {
129
179
  export function canonicalLabelOrder(labels) {
130
180
  return Object.keys(labels).sort();
131
181
  }
182
+ /**
183
+ * True iff `order` lists exactly the members of `keys`, each once (same length,
184
+ * no duplicates, no foreign entries). Used to validate an explicit `axisOrder`.
185
+ *
186
+ * @internal
187
+ */
188
+ function isPermutationOf(order, keys) {
189
+ if (order.length !== keys.length)
190
+ return false;
191
+ const seen = new Set();
192
+ const keySet = new Set(keys);
193
+ for (const k of order) {
194
+ if (!keySet.has(k) || seen.has(k))
195
+ return false;
196
+ seen.add(k);
197
+ }
198
+ return true;
199
+ }
132
200
  // ---------------------------------------------------------------------------
133
201
  // LabeledTensor (wrapper class)
134
202
  // ---------------------------------------------------------------------------
@@ -146,14 +214,42 @@ export class LabeledTensor {
146
214
  tensor;
147
215
  engine;
148
216
  labels;
149
- constructor(tensor, engine, labels) {
150
- const labelCount = Object.keys(labels).length;
151
- if (labelCount !== tensor.shape.length) {
152
- throw new LabeledTensorConstructionError(labelCount, tensor.shape.length);
217
+ /**
218
+ * The label keys in ENGINE-AXIS order: `axisOrder[i]` is the key of engine
219
+ * axis `i`. This is the AUTHORITATIVE label↔axis mapping — consumers must use
220
+ * it (or {@link axisOf}) rather than re-deriving position by sorting keys,
221
+ * because `transpose` / `contract` can leave the engine axes in a non-sorted
222
+ * order. Defaults to `canonicalLabelOrder(labels)` (sorted) when not supplied.
223
+ */
224
+ axisOrder;
225
+ constructor(tensor, engine, labels, axisOrder) {
226
+ const labelKeys = Object.keys(labels);
227
+ if (labelKeys.length !== tensor.shape.length) {
228
+ throw new LabeledTensorConstructionError(labelKeys.length, tensor.shape.length);
229
+ }
230
+ const order = axisOrder ?? canonicalLabelOrder(labels);
231
+ // Validate `order` is a permutation of the label keys: same length, every
232
+ // entry is a label key, no duplicates.
233
+ if (order.length !== labelKeys.length || !isPermutationOf(order, labelKeys)) {
234
+ throw new AxisOrderError(order, labelKeys);
153
235
  }
154
236
  this.tensor = tensor;
155
237
  this.engine = engine;
156
238
  this.labels = labels;
239
+ this.axisOrder = order;
240
+ }
241
+ /**
242
+ * Engine-axis position of a label key (the inverse of {@link axisOrder}).
243
+ * Throws if the key is not a label.
244
+ *
245
+ * @public
246
+ */
247
+ axisOf(key) {
248
+ const axis = this.axisOrder.indexOf(key);
249
+ if (axis === -1) {
250
+ throw new UPTError(`LabeledTensor.axisOf: '${key}' is not a label key.`);
251
+ }
252
+ return axis;
157
253
  }
158
254
  /**
159
255
  * Identity-aware contraction (Decision #3): match labels by
@@ -174,8 +270,11 @@ export class LabeledTensor {
174
270
  throw new UPTError(`LabeledTensor.contract: engine mismatch (${this.engine.name} vs ` +
175
271
  `${other.engine.name}). Both operands must share an engine.`);
176
272
  }
177
- const leftOrder = canonicalLabelOrder(this.labels);
178
- const rightOrder = canonicalLabelOrder(other.labels);
273
+ // Map labels → ENGINE axis positions via each operand's authoritative
274
+ // axisOrder (NOT sorted key order — an operand may carry a non-sorted order
275
+ // from a prior transpose/contract).
276
+ const leftOrder = this.axisOrder;
277
+ const rightOrder = other.axisOrder;
179
278
  // Build id → (operand, axis-position) sites.
180
279
  const sites = new Map();
181
280
  leftOrder.forEach((key, axis) => {
@@ -194,18 +293,33 @@ export class LabeledTensor {
194
293
  const contractions = [];
195
294
  const free = [];
196
295
  const resultLabels = {};
296
+ // The result's engine-axis order: the result key of each free axis, pushed
297
+ // in the SAME order the free axes enter `spec.free` (which is the order the
298
+ // engine emits result axes). Kept exactly parallel to `free` so it is always
299
+ // a valid permutation of `Object.keys(resultLabels)`.
300
+ const resultAxisOrder = [];
197
301
  for (const [id, occurrences] of sites) {
198
302
  if (occurrences.length === 1) {
199
303
  // Free axis on exactly one operand. Carry through.
200
304
  const o = occurrences[0];
201
305
  free.push({ operand: o.operand, axis: o.axis });
202
- // Preserve the original label key if no collision; otherwise
203
- // suffix with operand index (rare only when both operands
204
- // use the same string key for *different* ids).
205
- const key = resultLabels[o.key] ? `${o.key}_${o.operand}` : o.key;
306
+ // Preserve the original label key; on collision (both operands use the
307
+ // same string key for *different* ids) suffix until a FREE key is found
308
+ // (`x` `x_0`/`x_1` `x_0_0`…), so result keys stay UNIQUE and
309
+ // resultAxisOrder remains a valid permutation (Eve Y1: guarding only the
310
+ // unsuffixed key could overwrite an existing suffixed key).
311
+ let key = o.key;
312
+ if (resultLabels[key] !== undefined) {
313
+ let n = 0;
314
+ do {
315
+ key = `${o.key}_${o.operand}${n === 0 ? '' : `_${n}`}`;
316
+ n++;
317
+ } while (resultLabels[key] !== undefined);
318
+ }
206
319
  resultLabels[key] = o.operand === 0
207
320
  ? this.labels[o.key]
208
321
  : other.labels[o.key];
322
+ resultAxisOrder.push(key);
209
323
  }
210
324
  else if (occurrences.length === 2) {
211
325
  const [a, b] = occurrences;
@@ -227,7 +341,7 @@ export class LabeledTensor {
227
341
  }
228
342
  const spec = { contractions, free };
229
343
  const resultTensor = this.engine.einsum(spec, this.tensor, other.tensor);
230
- return new LabeledTensor(resultTensor, this.engine, resultLabels);
344
+ return new LabeledTensor(resultTensor, this.engine, resultLabels, resultAxisOrder);
231
345
  }
232
346
  /**
233
347
  * Reorder axes per the given permutation of label keys. The new
@@ -237,12 +351,14 @@ export class LabeledTensor {
237
351
  * @public
238
352
  */
239
353
  transpose(newKeyOrder) {
240
- const currentOrder = canonicalLabelOrder(this.labels);
241
- if (newKeyOrder.length !== currentOrder.length) {
354
+ // Permutation is computed against the CURRENT engine-axis order
355
+ // (`this.axisOrder`), NOT the sorted key order — `this.axisOrder` may
356
+ // already be non-sorted (e.g. a contract result, or a prior transpose).
357
+ if (newKeyOrder.length !== this.axisOrder.length) {
242
358
  throw new UPTError(`LabeledTensor.transpose: new key order has ${newKeyOrder.length} ` +
243
- `entries but tensor has ${currentOrder.length} axes.`);
359
+ `entries but tensor has ${this.axisOrder.length} axes.`);
244
360
  }
245
- const currentIndex = new Map(currentOrder.map((k, i) => [k, i]));
361
+ const currentIndex = new Map(this.axisOrder.map((k, i) => [k, i]));
246
362
  const perm = [];
247
363
  for (const key of newKeyOrder) {
248
364
  const pos = currentIndex.get(key);
@@ -252,7 +368,9 @@ export class LabeledTensor {
252
368
  perm.push(pos);
253
369
  }
254
370
  const transposedTensor = this.engine.transpose(this.tensor, perm);
255
- return new LabeledTensor(transposedTensor, this.engine, this.labels);
371
+ // The result's engine axis i is the old axis perm[i] = newKeyOrder[i], so
372
+ // the new axisOrder IS newKeyOrder.
373
+ return new LabeledTensor(transposedTensor, this.engine, this.labels, [...newKeyOrder]);
256
374
  }
257
375
  /**
258
376
  * Per-axis size change. Rank must be preserved (Decision #5);
@@ -269,7 +387,135 @@ export class LabeledTensor {
269
387
  throw new RankPreservationError(this.tensor.shape.length, shape.length);
270
388
  }
271
389
  const reshapedTensor = this.engine.reshape(this.tensor, shape);
272
- return new LabeledTensor(reshapedTensor, this.engine, this.labels);
390
+ // Rank-preserving size change never reorders axes — carry axisOrder through.
391
+ return new LabeledTensor(reshapedTensor, this.engine, this.labels, this.axisOrder);
392
+ }
393
+ /**
394
+ * Fuse a CONTIGUOUS run of engine axes (named by `keys`) into ONE axis
395
+ * carrying the caller-supplied `merged` label. Rank R → R − (keys.length − 1).
396
+ *
397
+ * The keys must occupy a gapless consecutive run of engine-axis positions
398
+ * (`engine.reshape` fuses STORAGE-adjacent axes only) — `transpose` them
399
+ * adjacent first otherwise. The fused axis spans the merged axes in ENGINE
400
+ * order; the order `keys` are listed does not matter (the merged axis is
401
+ * opaque). The caller owns the merged axis's identity — no composite-id is
402
+ * synthesized.
403
+ *
404
+ * @public
405
+ */
406
+ mergeAxes(keys, merged) {
407
+ if (keys.length < 2) {
408
+ throw new AxisMergeError(`need at least 2 keys to merge, got ${keys.length}.`);
409
+ }
410
+ if (new Set(keys).size !== keys.length) {
411
+ throw new AxisMergeError(`keys ${JSON.stringify(keys)} contain a duplicate.`);
412
+ }
413
+ const positions = [];
414
+ for (const k of keys) {
415
+ const p = this.axisOrder.indexOf(k);
416
+ if (p === -1)
417
+ throw new AxisMergeError(`'${k}' is not a label key.`);
418
+ positions.push(p);
419
+ }
420
+ const sorted = [...positions].sort((a, b) => a - b);
421
+ const lo = sorted[0];
422
+ const hi = sorted[sorted.length - 1];
423
+ if (new Set(sorted).size !== sorted.length || hi - lo !== sorted.length - 1) {
424
+ throw new AxisMergeError(`keys ${JSON.stringify(keys)} are not a contiguous run of engine axes ` +
425
+ `(positions ${JSON.stringify(positions)}); transpose them adjacent first.`);
426
+ }
427
+ // Surviving keys = axes outside the merged run. (A merged key may safely
428
+ // REUSE one of the consumed keys' names — those are not surviving.)
429
+ const survivingKeys = this.axisOrder.filter((_, i) => i < lo || i > hi);
430
+ if (survivingKeys.includes(merged.key)) {
431
+ throw new AxisMergeError(`merged key '${merged.key}' collides with a surviving label key.`);
432
+ }
433
+ for (const k of survivingKeys) {
434
+ if (this.labels[k].id === merged.index.id) {
435
+ throw new AxisMergeError(`merged id '${merged.index.id}' collides with surviving axis '${k}'.`);
436
+ }
437
+ }
438
+ const shape = this.tensor.shape;
439
+ let mergedSize = 1;
440
+ for (let i = lo; i <= hi; i++)
441
+ mergedSize *= shape[i];
442
+ const newShape = [...shape.slice(0, lo), mergedSize, ...shape.slice(hi + 1)];
443
+ const newLabels = {};
444
+ for (const k of survivingKeys)
445
+ newLabels[k] = this.labels[k];
446
+ newLabels[merged.key] = merged.index;
447
+ const newAxisOrder = [
448
+ ...this.axisOrder.slice(0, lo),
449
+ merged.key,
450
+ ...this.axisOrder.slice(hi + 1),
451
+ ];
452
+ const reshaped = this.engine.reshape(this.tensor, newShape);
453
+ return new LabeledTensor(reshaped, this.engine, newLabels, newAxisOrder);
454
+ }
455
+ /**
456
+ * Split ONE engine axis (named `key`) into several, each carrying a
457
+ * caller-supplied sub-label whose sizes multiply to the original axis size.
458
+ * Rank R → R + (parts.length − 1). The parts occupy the split axis's position
459
+ * in `parts` order. Inverse of {@link mergeAxes}.
460
+ *
461
+ * @public
462
+ */
463
+ splitAxis(key, parts) {
464
+ const p = this.axisOrder.indexOf(key);
465
+ if (p === -1)
466
+ throw new AxisSplitError(`'${key}' is not a label key.`);
467
+ if (parts.length < 2) {
468
+ throw new AxisSplitError(`need at least 2 parts to split into, got ${parts.length}.`);
469
+ }
470
+ let product = 1;
471
+ for (const part of parts) {
472
+ if (!Number.isInteger(part.size) || part.size <= 0) {
473
+ throw new AxisSplitError(`part '${part.key}' size must be a positive integer, got ${part.size}.`);
474
+ }
475
+ product *= part.size;
476
+ }
477
+ const axisSize = this.tensor.shape[p];
478
+ if (product !== axisSize) {
479
+ throw new AxisSplitError(`part sizes multiply to ${product} but axis '${key}' has size ${axisSize}.`);
480
+ }
481
+ const survivingKeys = this.axisOrder.filter((k) => k !== key);
482
+ const seen = new Set();
483
+ const seenIds = new Set();
484
+ for (const part of parts) {
485
+ if (survivingKeys.includes(part.key)) {
486
+ throw new AxisSplitError(`part key '${part.key}' collides with a surviving label key.`);
487
+ }
488
+ if (seen.has(part.key))
489
+ throw new AxisSplitError(`duplicate part key '${part.key}'.`);
490
+ seen.add(part.key);
491
+ // Both parts SURVIVE, so two parts sharing one id would build a tensor
492
+ // that `contract` later rejects as IdentityConflictError — fail here at
493
+ // the malformed call instead (Eve Y1). (mergeAxes has no analogue: its
494
+ // merged id replaces consumed axes, so reusing a consumed id is legal.)
495
+ if (seenIds.has(part.index.id)) {
496
+ throw new AxisSplitError(`two parts share id '${part.index.id}'.`);
497
+ }
498
+ seenIds.add(part.index.id);
499
+ for (const k of survivingKeys) {
500
+ if (this.labels[k].id === part.index.id) {
501
+ throw new AxisSplitError(`part id '${part.index.id}' collides with surviving axis '${k}'.`);
502
+ }
503
+ }
504
+ }
505
+ const shape = this.tensor.shape;
506
+ const newShape = [...shape.slice(0, p), ...parts.map((pt) => pt.size), ...shape.slice(p + 1)];
507
+ const newLabels = {};
508
+ for (const k of survivingKeys)
509
+ newLabels[k] = this.labels[k];
510
+ for (const part of parts)
511
+ newLabels[part.key] = part.index;
512
+ const newAxisOrder = [
513
+ ...this.axisOrder.slice(0, p),
514
+ ...parts.map((pt) => pt.key),
515
+ ...this.axisOrder.slice(p + 1),
516
+ ];
517
+ const reshaped = this.engine.reshape(this.tensor, newShape);
518
+ return new LabeledTensor(reshaped, this.engine, newLabels, newAxisOrder);
273
519
  }
274
520
  }
275
521
  //# sourceMappingURL=labeled-tensor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"labeled-tensor.js","sourceRoot":"","sources":["../../src/core/labeled-tensor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"labeled-tensor.js","sourceRoot":"","sources":["../../src/core/labeled-tensor.ts"],"names":[],"mappings":"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"}
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * Design: `docs/planning/v0.7-Proposal-1-Design.md` Decisions #2,
17
17
  * #4, #10. Empirical census at
18
- * `docs/architecture/v0.7-p1-baseline.md`.
18
+ * `docs/architecture/archive/v0.7-p1-baseline.md`.
19
19
  *
20
20
  * Per Eve verification (proposals doc has ZERO `prime` / `arrow`
21
21
  * mentions), v0.7.0 ships only the §2.2 sketch fields:
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * Design: `docs/planning/v0.7-Proposal-1-Design.md` Decisions #2,
17
17
  * #4, #10. Empirical census at
18
- * `docs/architecture/v0.7-p1-baseline.md`.
18
+ * `docs/architecture/archive/v0.7-p1-baseline.md`.
19
19
  *
20
20
  * Per Eve verification (proposals doc has ZERO `prime` / `arrow`
21
21
  * mentions), v0.7.0 ships only the §2.2 sketch fields:
@@ -10,15 +10,25 @@
10
10
  *
11
11
  * Per P8 Decision #1, this lives in `src/diff/` (NOT in
12
12
  * `src/bridges/`), keeping bridge evaluators untouched. The AD
13
- * dependency `mathts-autograd` is in `optionalDependencies`; this
14
- * module throws `EngineCapabilityError` via the existing
15
- * `MathTSEngine.reverseGrad` call-site pattern (degrades gracefully
16
- * when the peer is absent).
13
+ * dependency `mathts-autograd` is in `optionalDependencies`. Note this
14
+ * gives `bridgeGradient` TWO failure modes, not graceful success: when
15
+ * the peer is ABSENT it throws `EngineCapabilityError`; when the peer is
16
+ * PRESENT it still throws (see the AD limitation below) — installing the
17
+ * peer does not make AD of the plain-JS bridges work.
17
18
  *
18
- * Per P8 Adam-H1 + Eve verification: the autograd peer may not be
19
- * installed in CI (npm install --include=optional required). Tests
20
- * use `hasAutogradSupport(engine)` to skip the real-AD assertions
21
- * when the peer isn't present.
19
+ * IMPORTANT AD limitation (verified empirically): `bridgeGradient`
20
+ * does NOT actually differentiate the catalog evaluators. Because P8
21
+ * Decision #1 keeps those evaluators as plain-JS scalar functions
22
+ * (`Math.*` / raw arithmetic on numbers), neither reverse-mode (tape)
23
+ * nor forward-mode (dual) AD can trace them — the tape/dual instrument
24
+ * only sees ops routed through engine-traced tensors. With
25
+ * `Float64ReferenceEngine` the AD path throws; with `MathTSEngine` it
26
+ * also throws (the autograd `TapedTensor` does not survive
27
+ * `engine.toNested`). `bridgeGradient` therefore only works for
28
+ * functions written in engine ops — not the plain-JS bridges.
29
+ *
30
+ * The SUPPORTED way to differentiate a plain-JS bridge evaluator is
31
+ * {@link bridgeGradientNumerical} (central finite differences, no engine).
22
32
  *
23
33
  * @module diff/bridge-gradient
24
34
  */
@@ -91,4 +101,37 @@ export declare function bridgeGradient<Input>(spec: BridgeDiffSpec<Input>, engin
91
101
  * @public
92
102
  */
93
103
  export declare function gradientToNamed<Input>(spec: BridgeDiffSpec<Input>, gradient: EngineTensor, engine: TensorEngine): Record<string, number>;
104
+ /**
105
+ * Result of {@link bridgeGradientNumerical}: the bridge's scalar `value`
106
+ * at the supplied point, plus the `gradient` of partial derivatives keyed
107
+ * by `paramName` (insertion follows `spec.paramNames` order).
108
+ *
109
+ * @public
110
+ */
111
+ export interface BridgeNumericalGradientResult {
112
+ readonly value: number;
113
+ readonly gradient: Readonly<Record<string, number>>;
114
+ }
115
+ /**
116
+ * Gradient of a bridge evaluator by **central finite differences** — the
117
+ * supported way to differentiate the catalog's plain-JS evaluators.
118
+ *
119
+ * Reverse-/forward-mode AD ({@link bridgeGradient}) cannot trace these
120
+ * evaluators: per P8 Decision #1 they are plain-JS scalar functions
121
+ * (`Math.*` / raw arithmetic on numbers), so a tape/dual engine observes no
122
+ * traced ops. `bridgeGradientNumerical` perturbs the inputs instead, so it
123
+ * needs no engine and is synchronous.
124
+ *
125
+ * For each differentiable param with value `x` it uses a relative step
126
+ * `h = max(|x|, 1)·cbrt(eps)` and the ACTUAL representable denominator
127
+ * `dx = (x + h) − (x − h)` — so the perturbation survives floating-point
128
+ * rounding even at astrophysical scales (e.g. `M ≈ 2e30 kg`). The supplied
129
+ * `params` must contain every key in `spec.paramNames`; non-differentiable
130
+ * fields come from `spec.defaults`.
131
+ *
132
+ * @public
133
+ */
134
+ export declare function bridgeGradientNumerical<Input>(spec: BridgeDiffSpec<Input>, params: Record<string, number>, opts?: {
135
+ readonly relStep?: number;
136
+ }): BridgeNumericalGradientResult;
94
137
  //# sourceMappingURL=bridge-gradient.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-gradient.d.ts","sourceRoot":"","sources":["../../src/diff/bridge-gradient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAIhF;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,cAAc,CAAC,KAAK;IACnC,iEAAiE;IACjE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,iDAAiD;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC;IACzD;;;;;;;OAOG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAClC,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC;CAC7C;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;CACjC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAAC,KAAK,EACxC,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,EAC3B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAmC/B;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EACnC,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,EAC3B,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,YAAY,GACnB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOxB"}
1
+ {"version":3,"file":"bridge-gradient.d.ts","sourceRoot":"","sources":["../../src/diff/bridge-gradient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAIhF;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,cAAc,CAAC,KAAK;IACnC,iEAAiE;IACjE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,iDAAiD;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC;IACzD;;;;;;;OAOG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAClC,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC;CAC7C;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;CACjC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAAC,KAAK,EACxC,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,EAC3B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAmC/B;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EACnC,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,EAC3B,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,YAAY,GACnB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOxB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrD;AAUD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAC3C,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,EAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACnC,6BAA6B,CAmC/B"}
@@ -10,15 +10,25 @@
10
10
  *
11
11
  * Per P8 Decision #1, this lives in `src/diff/` (NOT in
12
12
  * `src/bridges/`), keeping bridge evaluators untouched. The AD
13
- * dependency `mathts-autograd` is in `optionalDependencies`; this
14
- * module throws `EngineCapabilityError` via the existing
15
- * `MathTSEngine.reverseGrad` call-site pattern (degrades gracefully
16
- * when the peer is absent).
13
+ * dependency `mathts-autograd` is in `optionalDependencies`. Note this
14
+ * gives `bridgeGradient` TWO failure modes, not graceful success: when
15
+ * the peer is ABSENT it throws `EngineCapabilityError`; when the peer is
16
+ * PRESENT it still throws (see the AD limitation below) — installing the
17
+ * peer does not make AD of the plain-JS bridges work.
17
18
  *
18
- * Per P8 Adam-H1 + Eve verification: the autograd peer may not be
19
- * installed in CI (npm install --include=optional required). Tests
20
- * use `hasAutogradSupport(engine)` to skip the real-AD assertions
21
- * when the peer isn't present.
19
+ * IMPORTANT AD limitation (verified empirically): `bridgeGradient`
20
+ * does NOT actually differentiate the catalog evaluators. Because P8
21
+ * Decision #1 keeps those evaluators as plain-JS scalar functions
22
+ * (`Math.*` / raw arithmetic on numbers), neither reverse-mode (tape)
23
+ * nor forward-mode (dual) AD can trace them — the tape/dual instrument
24
+ * only sees ops routed through engine-traced tensors. With
25
+ * `Float64ReferenceEngine` the AD path throws; with `MathTSEngine` it
26
+ * also throws (the autograd `TapedTensor` does not survive
27
+ * `engine.toNested`). `bridgeGradient` therefore only works for
28
+ * functions written in engine ops — not the plain-JS bridges.
29
+ *
30
+ * The SUPPORTED way to differentiate a plain-JS bridge evaluator is
31
+ * {@link bridgeGradientNumerical} (central finite differences, no engine).
22
32
  *
23
33
  * @module diff/bridge-gradient
24
34
  */
@@ -80,4 +90,61 @@ export function gradientToNamed(spec, gradient, engine) {
80
90
  });
81
91
  return out;
82
92
  }
93
+ /**
94
+ * Relative step for central differences: `cbrt(eps)` balances the `O(h²)`
95
+ * truncation error against the `O(eps/h)` round-off error (the central-diff
96
+ * optimum). `sqrt(eps)` — the FORWARD-diff optimum — would leave precision on
97
+ * the table for central differences.
98
+ */
99
+ const CENTRAL_DIFF_REL_STEP = Math.cbrt(Number.EPSILON); // ≈ 6.06e-6
100
+ /**
101
+ * Gradient of a bridge evaluator by **central finite differences** — the
102
+ * supported way to differentiate the catalog's plain-JS evaluators.
103
+ *
104
+ * Reverse-/forward-mode AD ({@link bridgeGradient}) cannot trace these
105
+ * evaluators: per P8 Decision #1 they are plain-JS scalar functions
106
+ * (`Math.*` / raw arithmetic on numbers), so a tape/dual engine observes no
107
+ * traced ops. `bridgeGradientNumerical` perturbs the inputs instead, so it
108
+ * needs no engine and is synchronous.
109
+ *
110
+ * For each differentiable param with value `x` it uses a relative step
111
+ * `h = max(|x|, 1)·cbrt(eps)` and the ACTUAL representable denominator
112
+ * `dx = (x + h) − (x − h)` — so the perturbation survives floating-point
113
+ * rounding even at astrophysical scales (e.g. `M ≈ 2e30 kg`). The supplied
114
+ * `params` must contain every key in `spec.paramNames`; non-differentiable
115
+ * fields come from `spec.defaults`.
116
+ *
117
+ * @public
118
+ */
119
+ export function bridgeGradientNumerical(spec, params, opts) {
120
+ const relStep = opts?.relStep ?? CENTRAL_DIFF_REL_STEP;
121
+ // Same contract as bridgeGradient: every paramName must be a number.
122
+ for (const k of spec.paramNames) {
123
+ if (typeof params[k] !== 'number') {
124
+ throw new TypeError(`bridgeGradientNumerical: ${spec.bridgeId}: missing or non-numeric param '${k}' ` +
125
+ `(got ${typeof params[k]}). All paramNames must be numbers in the params object.`);
126
+ }
127
+ }
128
+ // Build the full Input struct (defaults + differentiable params), with an
129
+ // optional single-param override for the perturbed evaluations.
130
+ const buildInput = (override) => {
131
+ const input = { ...spec.defaults };
132
+ for (const k of spec.paramNames)
133
+ input[k] = params[k];
134
+ if (override)
135
+ input[override.key] = override.val;
136
+ return input;
137
+ };
138
+ const value = spec.evaluate(buildInput());
139
+ const gradient = {};
140
+ for (const k of spec.paramNames) {
141
+ const x = params[k];
142
+ const h = Math.max(Math.abs(x), 1) * relStep;
143
+ const dx = x + h - (x - h); // actual representable step (huge-x safe)
144
+ const fp = spec.evaluate(buildInput({ key: k, val: x + h }));
145
+ const fm = spec.evaluate(buildInput({ key: k, val: x - h }));
146
+ gradient[k] = (fp - fm) / dx;
147
+ }
148
+ return { value, gradient };
149
+ }
83
150
  //# sourceMappingURL=bridge-gradient.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-gradient.js","sourceRoot":"","sources":["../../src/diff/bridge-gradient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAqD/D;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAA2B,EAC3B,MAAoB,EACpB,MAA8B;IAE9B,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,qBAAqB,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC9D,CAAC;IAED,0DAA0D;IAC1D,MAAM,MAAM,GAAa,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACjD,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,SAAS,CACjB,mBAAmB,IAAI,CAAC,QAAQ,mCAAmC,CAAC,IAAI;gBACxE,QAAQ,OAAO,CAAC,yDAAyD,CAC1E,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAE/D,yDAAyD;IACzD,4DAA4D;IAC5D,8DAA8D;IAC9D,mBAAmB;IACnB,MAAM,EAAE,GAAG,CAAC,CAAe,EAAgB,EAAE;QAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAa,CAAC;QAChD,MAAM,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAsB,CAAC;QACvD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC9B,KAAiC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACpC,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,WAAY,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IACvE,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAW,CAAC;IACrD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AAC1C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,IAA2B,EAC3B,QAAsB,EACtB,MAAoB;IAEpB,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAa,CAAC;IAClD,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC/B,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"bridge-gradient.js","sourceRoot":"","sources":["../../src/diff/bridge-gradient.ts"],"names":[],"mappings":"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"}