melete-ai 0.88.2

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 (211) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +72 -0
  3. package/bin/melete-server.mjs +345 -0
  4. package/bin/melete.mjs +165 -0
  5. package/dist/achievability.d.ts +38 -0
  6. package/dist/achievability.d.ts.map +1 -0
  7. package/dist/achievability.js +135 -0
  8. package/dist/achievability.js.map +1 -0
  9. package/dist/aegis.d.ts +52 -0
  10. package/dist/aegis.d.ts.map +1 -0
  11. package/dist/aegis.js +191 -0
  12. package/dist/aegis.js.map +1 -0
  13. package/dist/arms.d.ts +70 -0
  14. package/dist/arms.d.ts.map +1 -0
  15. package/dist/arms.js +399 -0
  16. package/dist/arms.js.map +1 -0
  17. package/dist/batch.d.ts +30 -0
  18. package/dist/batch.d.ts.map +1 -0
  19. package/dist/batch.js +151 -0
  20. package/dist/batch.js.map +1 -0
  21. package/dist/bench.d.ts +49 -0
  22. package/dist/bench.d.ts.map +1 -0
  23. package/dist/bench.js +124 -0
  24. package/dist/bench.js.map +1 -0
  25. package/dist/certify.d.ts +48 -0
  26. package/dist/certify.d.ts.map +1 -0
  27. package/dist/certify.js +125 -0
  28. package/dist/certify.js.map +1 -0
  29. package/dist/cliff.d.ts +41 -0
  30. package/dist/cliff.d.ts.map +1 -0
  31. package/dist/cliff.js +132 -0
  32. package/dist/cliff.js.map +1 -0
  33. package/dist/confidence.d.ts +38 -0
  34. package/dist/confidence.d.ts.map +1 -0
  35. package/dist/confidence.js +98 -0
  36. package/dist/confidence.js.map +1 -0
  37. package/dist/constrained.d.ts +59 -0
  38. package/dist/constrained.d.ts.map +1 -0
  39. package/dist/constrained.js +191 -0
  40. package/dist/constrained.js.map +1 -0
  41. package/dist/cortex.d.ts +56 -0
  42. package/dist/cortex.d.ts.map +1 -0
  43. package/dist/cortex.js +81 -0
  44. package/dist/cortex.js.map +1 -0
  45. package/dist/costaware.d.ts +49 -0
  46. package/dist/costaware.d.ts.map +1 -0
  47. package/dist/costaware.js +185 -0
  48. package/dist/costaware.js.map +1 -0
  49. package/dist/drift.d.ts +36 -0
  50. package/dist/drift.d.ts.map +1 -0
  51. package/dist/drift.js +157 -0
  52. package/dist/drift.js.map +1 -0
  53. package/dist/efficiency.d.ts +49 -0
  54. package/dist/efficiency.d.ts.map +1 -0
  55. package/dist/efficiency.js +143 -0
  56. package/dist/efficiency.js.map +1 -0
  57. package/dist/engine.d.ts +64 -0
  58. package/dist/engine.d.ts.map +1 -0
  59. package/dist/engine.js +130 -0
  60. package/dist/engine.js.map +1 -0
  61. package/dist/federated.d.ts +38 -0
  62. package/dist/federated.d.ts.map +1 -0
  63. package/dist/federated.js +121 -0
  64. package/dist/federated.js.map +1 -0
  65. package/dist/frontier.d.ts +51 -0
  66. package/dist/frontier.d.ts.map +1 -0
  67. package/dist/frontier.js +117 -0
  68. package/dist/frontier.js.map +1 -0
  69. package/dist/guardian.d.ts +46 -0
  70. package/dist/guardian.d.ts.map +1 -0
  71. package/dist/guardian.js +101 -0
  72. package/dist/guardian.js.map +1 -0
  73. package/dist/index.d.ts +90 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +189 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/interaction.d.ts +44 -0
  78. package/dist/interaction.d.ts.map +1 -0
  79. package/dist/interaction.js +167 -0
  80. package/dist/interaction.js.map +1 -0
  81. package/dist/interactive.d.ts +25 -0
  82. package/dist/interactive.d.ts.map +1 -0
  83. package/dist/interactive.js +75 -0
  84. package/dist/interactive.js.map +1 -0
  85. package/dist/inverse.d.ts +44 -0
  86. package/dist/inverse.d.ts.map +1 -0
  87. package/dist/inverse.js +141 -0
  88. package/dist/inverse.js.map +1 -0
  89. package/dist/ipshield.d.ts +62 -0
  90. package/dist/ipshield.d.ts.map +1 -0
  91. package/dist/ipshield.js +104 -0
  92. package/dist/ipshield.js.map +1 -0
  93. package/dist/journalist.d.ts +56 -0
  94. package/dist/journalist.d.ts.map +1 -0
  95. package/dist/journalist.js +132 -0
  96. package/dist/journalist.js.map +1 -0
  97. package/dist/lineage.d.ts +43 -0
  98. package/dist/lineage.d.ts.map +1 -0
  99. package/dist/lineage.js +112 -0
  100. package/dist/lineage.js.map +1 -0
  101. package/dist/metabrain.d.ts +59 -0
  102. package/dist/metabrain.d.ts.map +1 -0
  103. package/dist/metabrain.js +215 -0
  104. package/dist/metabrain.js.map +1 -0
  105. package/dist/mixedspace.d.ts +61 -0
  106. package/dist/mixedspace.d.ts.map +1 -0
  107. package/dist/mixedspace.js +267 -0
  108. package/dist/mixedspace.js.map +1 -0
  109. package/dist/multiobjective.d.ts +42 -0
  110. package/dist/multiobjective.d.ts.map +1 -0
  111. package/dist/multiobjective.js +123 -0
  112. package/dist/multiobjective.js.map +1 -0
  113. package/dist/noise.d.ts +45 -0
  114. package/dist/noise.d.ts.map +1 -0
  115. package/dist/noise.js +148 -0
  116. package/dist/noise.js.map +1 -0
  117. package/dist/noiserobust.d.ts +71 -0
  118. package/dist/noiserobust.d.ts.map +1 -0
  119. package/dist/noiserobust.js +215 -0
  120. package/dist/noiserobust.js.map +1 -0
  121. package/dist/oracle.d.ts +63 -0
  122. package/dist/oracle.d.ts.map +1 -0
  123. package/dist/oracle.js +106 -0
  124. package/dist/oracle.js.map +1 -0
  125. package/dist/poopt.d.ts +79 -0
  126. package/dist/poopt.d.ts.map +1 -0
  127. package/dist/poopt.js +148 -0
  128. package/dist/poopt.js.map +1 -0
  129. package/dist/portfolio.d.ts +51 -0
  130. package/dist/portfolio.d.ts.map +1 -0
  131. package/dist/portfolio.js +132 -0
  132. package/dist/portfolio.js.map +1 -0
  133. package/dist/prescription.d.ts +57 -0
  134. package/dist/prescription.d.ts.map +1 -0
  135. package/dist/prescription.js +131 -0
  136. package/dist/prescription.js.map +1 -0
  137. package/dist/prime.d.ts +85 -0
  138. package/dist/prime.d.ts.map +1 -0
  139. package/dist/prime.js +157 -0
  140. package/dist/prime.js.map +1 -0
  141. package/dist/provenance.d.ts +77 -0
  142. package/dist/provenance.d.ts.map +1 -0
  143. package/dist/provenance.js +155 -0
  144. package/dist/provenance.js.map +1 -0
  145. package/dist/rashomon.d.ts +40 -0
  146. package/dist/rashomon.d.ts.map +1 -0
  147. package/dist/rashomon.js +93 -0
  148. package/dist/rashomon.js.map +1 -0
  149. package/dist/reliability.d.ts +79 -0
  150. package/dist/reliability.d.ts.map +1 -0
  151. package/dist/reliability.js +197 -0
  152. package/dist/reliability.js.map +1 -0
  153. package/dist/replay.d.ts +62 -0
  154. package/dist/replay.d.ts.map +1 -0
  155. package/dist/replay.js +146 -0
  156. package/dist/replay.js.map +1 -0
  157. package/dist/replicate.d.ts +72 -0
  158. package/dist/replicate.d.ts.map +1 -0
  159. package/dist/replicate.js +103 -0
  160. package/dist/replicate.js.map +1 -0
  161. package/dist/resonance.d.ts +32 -0
  162. package/dist/resonance.d.ts.map +1 -0
  163. package/dist/resonance.js +190 -0
  164. package/dist/resonance.js.map +1 -0
  165. package/dist/sensitivity.d.ts +44 -0
  166. package/dist/sensitivity.d.ts.map +1 -0
  167. package/dist/sensitivity.js +109 -0
  168. package/dist/sensitivity.js.map +1 -0
  169. package/dist/server.d.ts +26 -0
  170. package/dist/server.d.ts.map +1 -0
  171. package/dist/server.js +1410 -0
  172. package/dist/server.js.map +1 -0
  173. package/dist/shape.d.ts +37 -0
  174. package/dist/shape.d.ts.map +1 -0
  175. package/dist/shape.js +170 -0
  176. package/dist/shape.js.map +1 -0
  177. package/dist/sloppiness.d.ts +44 -0
  178. package/dist/sloppiness.d.ts.map +1 -0
  179. package/dist/sloppiness.js +194 -0
  180. package/dist/sloppiness.js.map +1 -0
  181. package/dist/sovereign.d.ts +77 -0
  182. package/dist/sovereign.d.ts.map +1 -0
  183. package/dist/sovereign.js +144 -0
  184. package/dist/sovereign.js.map +1 -0
  185. package/dist/space.d.ts +38 -0
  186. package/dist/space.d.ts.map +1 -0
  187. package/dist/space.js +107 -0
  188. package/dist/space.js.map +1 -0
  189. package/dist/surprise.d.ts +43 -0
  190. package/dist/surprise.d.ts.map +1 -0
  191. package/dist/surprise.js +123 -0
  192. package/dist/surprise.js.map +1 -0
  193. package/dist/territory.d.ts +43 -0
  194. package/dist/territory.d.ts.map +1 -0
  195. package/dist/territory.js +102 -0
  196. package/dist/territory.js.map +1 -0
  197. package/dist/trace.d.ts +58 -0
  198. package/dist/trace.d.ts.map +1 -0
  199. package/dist/trace.js +0 -0
  200. package/dist/trace.js.map +1 -0
  201. package/dist/transfer.d.ts +46 -0
  202. package/dist/transfer.d.ts.map +1 -0
  203. package/dist/transfer.js +112 -0
  204. package/dist/transfer.js.map +1 -0
  205. package/dist/twin.d.ts +41 -0
  206. package/dist/twin.d.ts.map +1 -0
  207. package/dist/twin.js +116 -0
  208. package/dist/twin.js.map +1 -0
  209. package/examples/train.mjs +8 -0
  210. package/examples/tune.mjs +11 -0
  211. package/package.json +56 -0
@@ -0,0 +1,143 @@
1
+ import { assessAchievability } from "./achievability.js";
2
+ import { analyzeDrift } from "./drift.js";
3
+ const ROB_K = 0.45; // robustness sensitivity to the local drop-rate (calibrated by the gauntlet)
4
+ const dst = (a, c) => { let s = 0; for (let i = 0; i < a.length; i++)
5
+ s += (a[i] - c[i]) ** 2; return Math.sqrt(s); };
6
+ /**
7
+ * Robustness of the optimum from the LOCAL drop-rate: leaving the best point, how fast does the value fall?
8
+ * A broad plateau loses little per step (robust → ~1); a sharp spike collapses immediately (fragile → ~0).
9
+ * Measured directly from the neighbours of the best point — no global model that a sparsely-sampled spike
10
+ * could fool into looking flat.
11
+ */
12
+ function localDropRate(npts, signed, bestIdx, vRange) {
13
+ const x0 = npts[bestIdx], v0 = signed[bestIdx];
14
+ const rates = [];
15
+ for (let i = 0; i < npts.length; i++) {
16
+ if (i === bestIdx)
17
+ continue;
18
+ const d = dst(x0, npts[i]);
19
+ if (d < 1e-6)
20
+ continue;
21
+ rates.push({ d, rate: Math.max(0, (v0 - signed[i]) / (d * vRange)) });
22
+ }
23
+ if (!rates.length)
24
+ return 0;
25
+ // keep the nearest ~40% of neighbours — robustness is a LOCAL property of the peak
26
+ rates.sort((a, b) => a.d - b.d);
27
+ const keep = Math.max(3, Math.round(rates.length * 0.4));
28
+ const near = rates.slice(0, keep).map((r) => r.rate).sort((a, b) => a - b);
29
+ return near[Math.floor(near.length / 2)]; // median drop-rate among near neighbours
30
+ }
31
+ /** Compute the Discovery Efficiency η of a finished (or in-progress) run. */
32
+ export function discoveryEfficiency(obs, space, goal = "maximize") {
33
+ const dims = space?.dims ?? [];
34
+ const D = dims.length;
35
+ const hist = (obs ?? []).filter((o) => o && o.experiment && Number.isFinite(o.value));
36
+ const n = hist.length;
37
+ if (D === 0 || n < 8) {
38
+ return { eta: NaN, gain: NaN, robustness: NaN, trust: NaN, evaluations: n, grade: "unknown", weakestLink: null, note: `need ≈8+ measurements to compute η (have ${n})` };
39
+ }
40
+ const sgn = goal === "minimize" ? -1 : 1;
41
+ const lo = (i) => dims[i].min ?? 0, hi = (i) => dims[i].max ?? 1;
42
+ const toN = (e) => dims.map((d, i) => { const sp = hi(i) - lo(i) || 1; return Math.max(0, Math.min(1, ((+e[d.name] || 0) - lo(i)) / sp)); });
43
+ const npts = hist.map((o) => toN(o.experiment));
44
+ const signed = hist.map((o) => sgn * o.value);
45
+ const best = Math.max(...signed);
46
+ const bestIdx = signed.indexOf(best);
47
+ const blind = signed.reduce((a, b) => a + b, 0) / n; // blind baseline: mean of measurements
48
+ const vRange = Math.max(1e-9, Math.max(...signed) - Math.min(...signed));
49
+ // G — gain captured vs the achievable headroom (ceiling from ACHIEVABILITY, in signed space)
50
+ const ceilRep = assessAchievability(hist, space, sgn * (best + 1e6), goal); // huge target → report just gives ceiling
51
+ const ceilingSigned = Number.isFinite(ceilRep.ceiling) ? sgn * ceilRep.ceiling : best;
52
+ const headroom = Math.max(1e-9, ceilingSigned - blind);
53
+ const gain = Math.max(0, Math.min(1, (best - blind) / headroom));
54
+ // R — robustness of the optimum (flat plateau → 1, sharp spike → 0)
55
+ const drop = localDropRate(npts, signed, bestIdx, vRange);
56
+ const robustness = Math.max(0, Math.min(1, 1 / (1 + ROB_K * drop)));
57
+ // T — trust: not confounded with experiment order
58
+ const dr = analyzeDrift(hist, space, goal);
59
+ const trust = Math.max(0, Math.min(1, 1 - (Number.isFinite(dr.driftFraction) ? dr.driftFraction : 0)));
60
+ const eta = Math.cbrt(Math.max(0, gain) * Math.max(0, robustness) * Math.max(0, trust));
61
+ const links = [["gain", gain], ["robustness", robustness], ["trust", trust]];
62
+ links.sort((a, b) => a[1] - b[1]);
63
+ const weakestLink = links[0][1] < 0.999 ? links[0][0] : null;
64
+ const grade = eta >= 0.75 ? "exceptional" : eta >= 0.55 ? "strong" : eta >= 0.35 ? "fair" : "weak";
65
+ const r3 = (x) => +x.toFixed(3);
66
+ const wl = weakestLink ? `; weakest link: ${weakestLink} (${links[0][1].toFixed(2)})` : "";
67
+ const note = `η = ∛(G·R·T) = ∛(${gain.toFixed(2)}·${robustness.toFixed(2)}·${trust.toFixed(2)}) = ${eta.toFixed(2)} — ${grade}${wl}`;
68
+ return { eta: r3(eta), gain: r3(gain), robustness: r3(robustness), trust: r3(trust), evaluations: n, grade, weakestLink, note };
69
+ }
70
+ // ── gauntlet ──────────────────────────────────────────────────────────────────
71
+ import { lcg } from "./space.js";
72
+ export function efficiencyGauntlet() {
73
+ const space = { dims: [{ name: "x", type: "real", min: 0, max: 1 }, { name: "y", type: "real", min: 0, max: 1 }] };
74
+ const broad = (x, y) => Math.exp(-(((x - 0.5) ** 2) + ((y - 0.5) ** 2)) / 0.5); // wide, robust peak
75
+ const sharp = (x, y) => Math.exp(-(((x - 0.5) ** 2) + ((y - 0.5) ** 2)) / 0.01); // narrow, fragile spike
76
+ // a GOOD run: samples concentrated toward the broad optimum (real gain), no drift
77
+ const good = [];
78
+ const rg = lcg(3);
79
+ for (let i = 0; i < 70; i++) {
80
+ const t = i / 70;
81
+ const x = 0.5 + (rg() - 0.5) * (1 - 0.6 * t), y = 0.5 + (rg() - 0.5) * (1 - 0.6 * t);
82
+ good.push({ experiment: { x, y }, value: broad(x, y) });
83
+ }
84
+ const eGood = discoveryEfficiency(good, space, "maximize");
85
+ // a FRAGILE run: same gain story but a sharp spike → robustness should crater → lower η
86
+ const frag = [];
87
+ const rf = lcg(3);
88
+ for (let i = 0; i < 70; i++) {
89
+ const t = i / 70;
90
+ const x = 0.5 + (rf() - 0.5) * (1 - 0.6 * t), y = 0.5 + (rf() - 0.5) * (1 - 0.6 * t);
91
+ frag.push({ experiment: { x, y }, value: sharp(x, y) });
92
+ }
93
+ const eFrag = discoveryEfficiency(frag, space, "maximize");
94
+ // a CONFOUNDED run: broad peak but a strong time-drift added → trust should crater → lower η
95
+ const conf = [];
96
+ const rc = lcg(3);
97
+ for (let i = 0; i < 70; i++) {
98
+ const t = i / 70;
99
+ const x = 0.5 + (rc() - 0.5) * (1 - 0.6 * t), y = 0.5 + (rc() - 0.5) * (1 - 0.6 * t);
100
+ conf.push({ experiment: { x, y }, value: broad(x, y) + 0.9 * (i / 70) });
101
+ }
102
+ const eConf = discoveryEfficiency(conf, space, "maximize");
103
+ // a NO-PROGRESS run: random scatter, best barely beats the mean → gain low → η low
104
+ const flat = [];
105
+ const rfl = lcg(7);
106
+ for (let i = 0; i < 70; i++) {
107
+ const x = rfl(), y = rfl();
108
+ flat.push({ experiment: { x, y }, value: 0.5 + 0.01 * (rfl() - 0.5) });
109
+ }
110
+ const eFlat = discoveryEfficiency(flat, space, "maximize");
111
+ const goodHigh = eGood.eta >= 0.55 && eGood.grade !== "weak";
112
+ const fragileDrop = eFrag.eta < eGood.eta - 0.1 && eFrag.weakestLink === "robustness";
113
+ const confoundDrop = eConf.eta < eGood.eta - 0.1 && eConf.trust < eGood.trust - 0.2; // drift specifically damages the TRUST factor
114
+ const noProgressLow = eFlat.eta < 0.35 && eFlat.weakestLink === "gain";
115
+ // CONJUNCTIVE (the black-sheep property): a run great on two axes but ~0 on one has η near 0,
116
+ // and BELOW what a weighted average (G+R+T)/3 would have reported — proving the geometric mean bites.
117
+ const wsumFrag = (eFrag.gain + eFrag.robustness + eFrag.trust) / 3;
118
+ const conjunctive = eFrag.eta < wsumFrag - 0.05;
119
+ const bounded = [eGood, eFrag, eConf, eFlat].every((e) => e.eta >= 0 && e.eta <= 1);
120
+ const det = JSON.stringify(discoveryEfficiency(good, space, "maximize")) === JSON.stringify(discoveryEfficiency(good, space, "maximize"));
121
+ const abstains = discoveryEfficiency(good.slice(0, 4), space, "maximize").grade === "unknown";
122
+ const total = (() => { try {
123
+ discoveryEfficiency(null, space);
124
+ discoveryEfficiency([], space, "minimize");
125
+ return true;
126
+ }
127
+ catch {
128
+ return false;
129
+ } })();
130
+ const checks = [
131
+ { name: "GOOD-RUN-HIGH", pass: goodHigh, detail: `genuine robust run → η ${eGood.eta} (${eGood.grade})` },
132
+ { name: "FRAGILE-OPTIMUM-DROPS", pass: fragileDrop, detail: `sharp spike → η ${eFrag.eta} (R ${eFrag.robustness}), weakest=${eFrag.weakestLink}` },
133
+ { name: "CONFOUNDED-DROPS-TRUST", pass: confoundDrop, detail: `time-drift → η ${eConf.eta}, trust ${eConf.trust} vs clean ${eGood.trust}` },
134
+ { name: "NO-PROGRESS-LOW", pass: noProgressLow, detail: `best≈mean → η ${eFlat.eta} (G ${eFlat.gain}), weakest=${eFlat.weakestLink}` },
135
+ { name: "CONJUNCTIVE-GEOMEAN", pass: conjunctive, detail: `η ${eFrag.eta} < weighted-avg ${wsumFrag.toFixed(2)} — a weak link can't hide` },
136
+ { name: "BOUNDED-0-1", pass: bounded, detail: "η always in [0,1]" },
137
+ { name: "DETERMINISTIC", pass: det, detail: "same run → same η" },
138
+ { name: "ABSTAINS-WHEN-THIN", pass: abstains, detail: "too few measurements → unknown" },
139
+ { name: "TOTAL", pass: total, detail: "null / empty never throws" },
140
+ ];
141
+ return { score: checks.every((c) => c.pass) ? 100 : 0, checks };
142
+ }
143
+ //# sourceMappingURL=efficiency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"efficiency.js","sourceRoot":"","sources":["../src/efficiency.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * THE BRAIN — the closed-loop active-experiment-design engine.
3
+ *
4
+ * propose → the most promising UNtried experiment (Bayesian-optimization-lite: a Gaussian-kernel
5
+ * surrogate predicts the outcome of any candidate; an UCB acquisition trades off exploiting
6
+ * the best-known region against exploring the uncertain one; exploration DECAYS over the
7
+ * budget so it explores early and exploits late)
8
+ * observe → the oracle measures the proposed experiment
9
+ * update → the observation joins the evidence; the surrogate sharpens
10
+ * converge → repeat until the budget is spent or the goal is reached
11
+ *
12
+ * It learns the shape of an unknown response surface from as FEW experiments as possible — because in the
13
+ * real world each experiment costs reagents / robot-time / money. Deterministic (seeded), so a run is
14
+ * reproducible and its signed trace is meaningful.
15
+ *
16
+ * ★HONEST: this is a lightweight, dependency-free surrogate (kernel-weighted mean + nearest-point
17
+ * uncertainty), not a full Gaussian-process with learned hyperparameters. It reliably beats random/grid
18
+ * on smooth-ish response surfaces (proven in bench.ts); pathological/high-dimensional/very noisy surfaces
19
+ * need a heavier surrogate — a slot the architecture leaves open.
20
+ */
21
+ import { type Space, type Experiment } from "./space.js";
22
+ export type Goal = "maximize" | "minimize";
23
+ export interface Observation {
24
+ experiment: Experiment;
25
+ value: number;
26
+ }
27
+ export interface Step {
28
+ n: number;
29
+ experiment: Experiment;
30
+ value: number;
31
+ acquisition: number;
32
+ kappa: number;
33
+ rationale: string;
34
+ }
35
+ export interface DiscoveryResult {
36
+ best: Observation;
37
+ history: Step[];
38
+ evaluations: number;
39
+ converged: boolean;
40
+ goal: Goal;
41
+ }
42
+ export interface DiscoverOpts {
43
+ space: Space;
44
+ oracle: (e: Experiment) => number | Promise<number>;
45
+ budget: number;
46
+ goal?: Goal;
47
+ seed?: number;
48
+ target?: number;
49
+ candidatePool?: number;
50
+ kappa0?: number;
51
+ bandwidth?: number;
52
+ onStep?: (s: Step) => void | Promise<void>;
53
+ }
54
+ /** Run the closed discovery loop. Returns the best experiment found + the full reproducible history. */
55
+ export declare function discover(opts: DiscoverOpts): Promise<DiscoveryResult>;
56
+ export declare function engineGauntlet(): Promise<{
57
+ score: 0 | 100;
58
+ checks: Array<{
59
+ name: string;
60
+ pass: boolean;
61
+ detail: string;
62
+ }>;
63
+ }>;
64
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAiE,MAAM,YAAY,CAAC;AAExH,MAAM,MAAM,IAAI,GAAG,UAAU,GAAG,UAAU,CAAC;AAC3C,MAAM,WAAW,WAAW;IAAG,UAAU,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AACtE,MAAM,WAAW,IAAI;IAAG,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AACjI,MAAM,WAAW,eAAe;IAAG,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,IAAI,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE;AAE5H,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAClF,IAAI,CAAC,EAAE,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IACzG,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAID,wGAAwG;AACxG,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAkD3E;AAGD,wBAAsB,cAAc,IAAI,OAAO,CAAC;IAAE,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAyBlI"}
package/dist/engine.js ADDED
@@ -0,0 +1,130 @@
1
+ /**
2
+ * THE BRAIN — the closed-loop active-experiment-design engine.
3
+ *
4
+ * propose → the most promising UNtried experiment (Bayesian-optimization-lite: a Gaussian-kernel
5
+ * surrogate predicts the outcome of any candidate; an UCB acquisition trades off exploiting
6
+ * the best-known region against exploring the uncertain one; exploration DECAYS over the
7
+ * budget so it explores early and exploits late)
8
+ * observe → the oracle measures the proposed experiment
9
+ * update → the observation joins the evidence; the surrogate sharpens
10
+ * converge → repeat until the budget is spent or the goal is reached
11
+ *
12
+ * It learns the shape of an unknown response surface from as FEW experiments as possible — because in the
13
+ * real world each experiment costs reagents / robot-time / money. Deterministic (seeded), so a run is
14
+ * reproducible and its signed trace is meaningful.
15
+ *
16
+ * ★HONEST: this is a lightweight, dependency-free surrogate (kernel-weighted mean + nearest-point
17
+ * uncertainty), not a full Gaussian-process with learned hyperparameters. It reliably beats random/grid
18
+ * on smooth-ish response surfaces (proven in bench.ts); pathological/high-dimensional/very noisy surfaces
19
+ * need a heavier surrogate — a slot the architecture leaves open.
20
+ */
21
+ import { lcg, gridCandidates, randomCandidates, localCandidates, dist2 } from "./space.js";
22
+ const key = (e) => JSON.stringify(e);
23
+ /** Run the closed discovery loop. Returns the best experiment found + the full reproducible history. */
24
+ export async function discover(opts) {
25
+ const space = opts.space;
26
+ const goal = opts.goal ?? "maximize";
27
+ const budget = Math.max(1, opts.budget | 0);
28
+ const seed = opts.seed ?? 1;
29
+ const rnd = lcg(seed);
30
+ const pool = Math.max(64, opts.candidatePool ?? 2500);
31
+ const kappa0 = opts.kappa0 ?? 1.0;
32
+ const bw = opts.bandwidth ?? 0.025;
33
+ const better = (a, b) => goal === "maximize" ? a > b : a < b;
34
+ const sign = goal === "maximize" ? 1 : -1; // acquisition always "wants" larger; flip for minimize
35
+ const obs = [];
36
+ const seen = new Set();
37
+ const history = [];
38
+ const evalExp = async (e) => { const v = Number(await opts.oracle(e)); return Number.isFinite(v) ? v : (goal === "maximize" ? -1e18 : 1e18); };
39
+ const record = async (e, acq, kappa, rationale) => {
40
+ const v = await evalExp(e);
41
+ obs.push({ experiment: e, value: v });
42
+ seen.add(key(e));
43
+ const best = obs.reduce((a, b) => better(b.value, a.value) ? b : a);
44
+ const step = { n: obs.length, experiment: e, value: v, acquisition: acq, kappa, rationale };
45
+ history.push(step);
46
+ if (opts.onStep)
47
+ await opts.onStep(step);
48
+ return best;
49
+ };
50
+ // cold start: a coarse grid design of experiments (global coverage before any modelling)
51
+ const perDim = space.dims.length <= 2 ? 3 : 2;
52
+ for (const e of gridCandidates(space, perDim).slice(0, Math.max(1, Math.min(budget, space.dims.length <= 2 ? 9 : 8)))) {
53
+ if (obs.length >= budget)
54
+ break;
55
+ if (seen.has(key(e)))
56
+ continue;
57
+ await record(e, 0, kappa0, "seed: design-of-experiments grid point");
58
+ }
59
+ let best = obs.length ? obs.reduce((a, b) => better(b.value, a.value) ? b : a) : { experiment: {}, value: goal === "maximize" ? -Infinity : Infinity };
60
+ // active loop
61
+ for (let t = obs.length; t < budget; t++) {
62
+ if (opts.target != null && better(best.value, opts.target))
63
+ break;
64
+ const progress = (t - obs.length + 1) / Math.max(1, budget - obs.length); // 0 → 1 across the active budget
65
+ const kappa = kappa0 * Math.exp(-progress * 3.5); // explore early, exploit late
66
+ const radius = 0.25 * Math.exp(-progress * 2.5); // local ball tightens → sub-grid refinement
67
+ // candidate evaluation is FREE (only ORACLE calls cost) → use a dense GRID (guarantees coverage of the
68
+ // true optimum, the way the proven prototype did) + a local cloud around the best for sub-grid refinement.
69
+ const perDim = Math.max(4, Math.min(60, Math.round(Math.pow(pool, 1 / Math.max(1, space.dims.length)))));
70
+ const candidates = [...gridCandidates(space, perDim, pool * 2), ...localCandidates(space, best.experiment, Math.ceil(pool / 3), Math.max(0.02, radius), rnd), ...randomCandidates(space, Math.ceil(pool / 4), rnd)];
71
+ let pick = null, pa = -Infinity;
72
+ for (const c of candidates) {
73
+ if (seen.has(key(c)))
74
+ continue;
75
+ let wsum = 0, vsum = 0, nearest = Infinity;
76
+ for (const o of obs) {
77
+ const d2 = dist2(space, c, o.experiment);
78
+ const w = Math.exp(-d2 / bw);
79
+ wsum += w;
80
+ vsum += w * (sign * o.value);
81
+ nearest = Math.min(nearest, Math.sqrt(d2));
82
+ }
83
+ const mean = wsum > 1e-12 ? vsum / wsum : 0; // surrogate prediction (in "maximize" orientation)
84
+ const acq = mean + kappa * nearest; // UCB: exploit + explore
85
+ if (acq > pa) {
86
+ pa = acq;
87
+ pick = c;
88
+ }
89
+ }
90
+ if (!pick)
91
+ break;
92
+ best = await record(pick, pa, kappa, `acquisition=${pa.toFixed(3)} (surrogate mean + ${kappa.toFixed(2)}·uncertainty)`);
93
+ }
94
+ const converged = opts.target != null ? better(best.value, opts.target) || Math.abs(best.value - opts.target) < 1e-9 : true;
95
+ return { best, history, evaluations: obs.length, converged, goal };
96
+ }
97
+ // ── gauntlet ──────────────────────────────────────────────────────────────────
98
+ export async function engineGauntlet() {
99
+ const space = { dims: [{ name: "x", type: "real", min: 0, max: 10 }, { name: "y", type: "real", min: 0, max: 10 }] };
100
+ const peak = (e) => Math.exp(-(((e.x ?? 0) - 7.2) ** 2 + ((e.y ?? 0) - 3.4) ** 2) / 3); // optimum ≈1 at (7.2,3.4)
101
+ const r = await discover({ space, oracle: (e) => peak(e), budget: 60, seed: 7, goal: "maximize" });
102
+ const foundPeak = r.best.value > 0.9;
103
+ const respectsBudget = r.evaluations <= 60;
104
+ // determinism: same seed → same best
105
+ const r2 = await discover({ space, oracle: (e) => peak(e), budget: 60, seed: 7, goal: "maximize" });
106
+ const deterministic = JSON.stringify(r.best) === JSON.stringify(r2.best);
107
+ // minimize works too
108
+ const rm = await discover({ space, oracle: (e) => -peak(e), budget: 60, seed: 7, goal: "minimize" });
109
+ const minimizes = rm.best.value < -0.9;
110
+ // target early-stop
111
+ const rt = await discover({ space, oracle: (e) => peak(e), budget: 200, seed: 7, goal: "maximize", target: 0.8 });
112
+ const earlyStop = rt.best.value >= 0.8 && rt.evaluations < 200;
113
+ let total = true;
114
+ try {
115
+ await discover({ space, oracle: () => NaN, budget: 5, seed: 1 });
116
+ }
117
+ catch {
118
+ total = false;
119
+ }
120
+ const checks = [
121
+ { name: "FINDS-OPTIMUM", pass: foundPeak, detail: "reaches >0.9 of a hidden 2D peak within 60 experiments" },
122
+ { name: "RESPECTS-BUDGET", pass: respectsBudget, detail: "never exceeds the experiment budget" },
123
+ { name: "DETERMINISTIC", pass: deterministic, detail: "same seed → identical discovery (reproducible)" },
124
+ { name: "MINIMIZE", pass: minimizes, detail: "minimize goal works symmetrically" },
125
+ { name: "TARGET-EARLY-STOP", pass: earlyStop, detail: "stops as soon as the target is reached (saves experiments)" },
126
+ { name: "TOTAL", pass: total, detail: "a NaN/garbage oracle never throws (treated as worst value)" },
127
+ ];
128
+ return { score: checks.every((c) => c.pass) ? 100 : 0, checks };
129
+ }
130
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type Space, type Experiment } from "./space.js";
2
+ import { type Goal } from "./engine.js";
3
+ export interface FedRecord {
4
+ party: string;
5
+ experiment: Experiment;
6
+ value: number;
7
+ ts: number;
8
+ hash: string;
9
+ }
10
+ /** A party signs (content-hashes) one observation before contributing it to the shared pool. */
11
+ export declare function contribute(party: string, experiment: Experiment, value: number, ts?: number): FedRecord;
12
+ /** Is this record intact (its content still hashes to its claimed hash)? */
13
+ export declare function recordIntact(r: FedRecord): boolean;
14
+ /**
15
+ * CRDT-merge any number of pools: union by content hash, drop tampered/forged records, deterministic order.
16
+ * Commutative + idempotent — every party that merges the same set converges to the same pool.
17
+ */
18
+ export declare function mergePool(...pools: ReadonlyArray<ReadonlyArray<FedRecord>>): FedRecord[];
19
+ export interface PoolVerify {
20
+ ok: boolean;
21
+ total: number;
22
+ valid: number;
23
+ tampered: number;
24
+ parties: string[];
25
+ }
26
+ /** Verify the whole pool offline: every record must hash to its content. */
27
+ export declare function verifyPool(pool: ReadonlyArray<FedRecord>): PoolVerify;
28
+ /** Propose the next experiment for the whole swarm from the VERIFIED union of all parties' results. */
29
+ export declare function proposeFromPool(space: Space, pool: ReadonlyArray<FedRecord>, goal?: Goal, seed?: number): Experiment;
30
+ export declare function federatedGauntlet(): {
31
+ score: 0 | 100;
32
+ checks: Array<{
33
+ name: string;
34
+ pass: boolean;
35
+ detail: string;
36
+ }>;
37
+ };
38
+ //# sourceMappingURL=federated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federated.d.ts","sourceRoot":"","sources":["../src/federated.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAoB,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAG1D,MAAM,WAAW,SAAS;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAW7G,gGAAgG;AAChG,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,SAAI,GAAG,SAAS,CAElG;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,CAAC,EAAE,SAAS,GAAG,OAAO,CAElD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,GAAG,SAAS,EAAE,CAOxF;AAED,MAAM,WAAW,UAAU;IAAG,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE;AAC9G,4EAA4E;AAC5E,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,UAAU,CAIrE;AAED,uGAAuG;AACvG,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,EAAE,IAAI,GAAE,IAAiB,EAAE,IAAI,SAAI,GAAG,UAAU,CAG3H;AAGD,wBAAgB,iBAAiB,IAAI;IAAE,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAsCtH"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * FEDERATED — many labs optimise the SAME problem together, with a tamper-evident, attributed, conflict-free
3
+ * shared pool of results.
4
+ *
5
+ * Lab A and Lab B both want the best formulation. Alone, each can only afford a handful of expensive
6
+ * experiments. Pooled, the swarm converges far faster — IF you can trust the pool. FEDERATED makes each
7
+ * contribution a content-hashed record (party + experiment + value), merges pools as a CRDT (union by hash,
8
+ * commutative + idempotent, forged/edited records dropped), and proposes the next experiment for everyone
9
+ * from the verified union. The pool's integrity is checkable offline.
10
+ *
11
+ * Honest by construction (DIAKRISIS): this gives tamper-evidence + attribution + conflict-free merge — the
12
+ * real, buildable core of collaborative optimisation. It is NOT zero-knowledge: to jointly optimise, the
13
+ * experiment points are shared in the pool. The optional `blindNames` only pseudonymises the dimension
14
+ * LABELS (a shared-order codebook), not the values — so a party can withhold what a coordinate MEANS, not
15
+ * the coordinate itself. Anyone claiming "optimise without sharing any data" is selling fiction.
16
+ */
17
+ import { createHash } from "node:crypto";
18
+ import { proposeNext } from "./interactive.js";
19
+ function canon(party, experiment, value, ts) {
20
+ const keys = Object.keys(experiment || {}).sort();
21
+ const e = keys.map((k) => [k, Math.round((+experiment[k] || 0) * 1e9) / 1e9]);
22
+ return JSON.stringify([String(party), e, Math.round(value * 1e9) / 1e9, Math.floor(ts || 0)]);
23
+ }
24
+ function hashOf(party, experiment, value, ts) {
25
+ return createHash("sha256").update(canon(party, experiment, value, ts)).digest("hex");
26
+ }
27
+ /** A party signs (content-hashes) one observation before contributing it to the shared pool. */
28
+ export function contribute(party, experiment, value, ts = 0) {
29
+ return { party: String(party), experiment, value, ts: Math.floor(ts || 0), hash: hashOf(String(party), experiment, value, Math.floor(ts || 0)) };
30
+ }
31
+ /** Is this record intact (its content still hashes to its claimed hash)? */
32
+ export function recordIntact(r) {
33
+ return !!r && typeof r.hash === "string" && r.hash === hashOf(r.party, r.experiment, r.value, r.ts);
34
+ }
35
+ /**
36
+ * CRDT-merge any number of pools: union by content hash, drop tampered/forged records, deterministic order.
37
+ * Commutative + idempotent — every party that merges the same set converges to the same pool.
38
+ */
39
+ export function mergePool(...pools) {
40
+ const byHash = new Map();
41
+ for (const pool of pools)
42
+ for (const r of pool ?? []) {
43
+ if (!recordIntact(r))
44
+ continue; // forged or edited → rejected
45
+ if (!byHash.has(r.hash))
46
+ byHash.set(r.hash, r); // dedup
47
+ }
48
+ return [...byHash.values()].sort((a, b) => (a.ts - b.ts) || (a.hash < b.hash ? -1 : a.hash > b.hash ? 1 : 0));
49
+ }
50
+ /** Verify the whole pool offline: every record must hash to its content. */
51
+ export function verifyPool(pool) {
52
+ const recs = pool ?? [];
53
+ let valid = 0;
54
+ const parties = new Set();
55
+ for (const r of recs) {
56
+ if (recordIntact(r)) {
57
+ valid++;
58
+ parties.add(r.party);
59
+ }
60
+ }
61
+ return { ok: valid === recs.length, total: recs.length, valid, tampered: recs.length - valid, parties: [...parties].sort() };
62
+ }
63
+ /** Propose the next experiment for the whole swarm from the VERIFIED union of all parties' results. */
64
+ export function proposeFromPool(space, pool, goal = "maximize", seed = 1) {
65
+ const obs = mergePool(pool).map((r) => ({ experiment: r.experiment, value: r.value }));
66
+ return proposeNext(space, obs, goal, seed);
67
+ }
68
+ // ── gauntlet ──────────────────────────────────────────────────────────────────
69
+ export function federatedGauntlet() {
70
+ const truth = (e) => Math.exp(-(((e.x ?? 0) - 7) ** 2 + ((e.y ?? 0) - 3) ** 2) / 2); // optimum ≈1 at (7,3)
71
+ const space = { dims: [{ name: "x", type: "real", min: 0, max: 10 }, { name: "y", type: "real", min: 0, max: 10 }] };
72
+ // two labs each contribute a few signed observations
73
+ const labA = [contribute("labA", { x: 6, y: 4 }, truth({ x: 6, y: 4 }), 1), contribute("labA", { x: 7, y: 3 }, truth({ x: 7, y: 3 }), 2)];
74
+ const labB = [contribute("labB", { x: 2, y: 8 }, truth({ x: 2, y: 8 }), 3), contribute("labB", { x: 5, y: 5 }, truth({ x: 5, y: 5 }), 4)];
75
+ const pool = mergePool(labA, labB);
76
+ const merges = pool.length === 4 && verifyPool(pool).ok && verifyPool(pool).parties.length === 2;
77
+ // CRDT: merge is commutative + idempotent
78
+ const commutative = JSON.stringify(mergePool(labA, labB)) === JSON.stringify(mergePool(labB, labA));
79
+ const idempotent = JSON.stringify(mergePool(pool, pool)) === JSON.stringify(pool);
80
+ // tamper: edit a value after signing → dropped on merge + flagged by verify
81
+ const forged = JSON.parse(JSON.stringify(labA));
82
+ forged[0].value = 999;
83
+ const tamperDropped = mergePool(forged, labB).length === 3 && verifyPool(forged).ok === false && verifyPool(forged).tampered === 1;
84
+ // dedup: contributing the same record twice yields one
85
+ const dup = mergePool(labA, labA).length === 2;
86
+ // the swarm proposes a valid in-bounds next experiment from the union
87
+ const next = proposeFromPool(space, pool, "maximize", 5);
88
+ const proposeOK = typeof next.x === "number" && next.x >= 0 && next.x <= 10 && typeof next.y === "number";
89
+ // pooled data helps: a guided loop seeded with BOTH labs reaches the optimum
90
+ const obs = mergePool(labA, labB).map((r) => ({ experiment: r.experiment, value: r.value }));
91
+ let best = Math.max(...obs.map((o) => o.value));
92
+ for (let i = 0; i < 40; i++) {
93
+ const e = proposeNext(space, obs, "maximize", 9);
94
+ const v = truth(e);
95
+ obs.push({ experiment: e, value: v });
96
+ if (v > best)
97
+ best = v;
98
+ }
99
+ const converges = best > 0.9;
100
+ const total = (() => { try {
101
+ mergePool(null);
102
+ verifyPool(null);
103
+ proposeFromPool(space, null);
104
+ return true;
105
+ }
106
+ catch {
107
+ return false;
108
+ } })();
109
+ const checks = [
110
+ { name: "MERGE+ATTRIBUTE", pass: merges, detail: "two labs' signed observations merge into one verified pool, both parties attributed" },
111
+ { name: "CRDT-COMMUTATIVE", pass: commutative, detail: "merge(A,B) == merge(B,A) — order-independent" },
112
+ { name: "CRDT-IDEMPOTENT", pass: idempotent, detail: "merging the pool with itself changes nothing" },
113
+ { name: "TAMPER-DROPPED", pass: tamperDropped, detail: "a record edited after signing fails its hash, is dropped on merge + flagged" },
114
+ { name: "DEDUP", pass: dup, detail: "the same contribution twice yields one record" },
115
+ { name: "SWARM-PROPOSE", pass: proposeOK, detail: "the pool proposes a valid in-bounds next experiment for everyone" },
116
+ { name: "POOLED-CONVERGES", pass: converges, detail: `a guided loop seeded with both labs reaches the optimum (best=${best.toFixed(3)})` },
117
+ { name: "TOTAL", pass: total, detail: "null / empty pools never throw" },
118
+ ];
119
+ return { score: checks.every((c) => c.pass) ? 100 : 0, checks };
120
+ }
121
+ //# sourceMappingURL=federated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federated.js","sourceRoot":"","sources":["../src/federated.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * FRONTIER — the economics of the NEXT experiment ("should I run another, or stop?").
3
+ *
4
+ * Every other optimizer answers "what should I try next?". For an EXPENSIVE physical experiment
5
+ * (an assay, a wafer run, a GPU sweep) the question that actually decides the budget is the opposite:
6
+ * "is the next try WORTH it, or have I already found the practical best?" Spending one more experiment
7
+ * that gains nothing is real money burned; stopping one too early leaves value on the table.
8
+ *
9
+ * FRONTIER turns the discovery trajectory into a STOP / CONTINUE decision support signal — grounded only
10
+ * in the observed diminishing-returns of THIS run, not a promise about the future. It estimates the
11
+ * expected improvement of one more experiment from how the best-so-far has been improving (improvements
12
+ * get rarer + smaller as you converge), compares it to the run's own noise floor, and — if you tell it
13
+ * the cost of one experiment — frames that gain against the money. Deterministic + total, so the advice
14
+ * is reproducible and signable alongside the discovery trace.
15
+ *
16
+ * Honest by construction: this is decision SUPPORT, not a guarantee. It says "based on your own curve,
17
+ * the next experiment looks worth it / not worth it", and abstains to UNKNOWN when there isn't enough
18
+ * history to tell. It never fabricates a dollar figure — money only appears if you supply a real cost.
19
+ */
20
+ import { type Observation, type Goal } from "./engine.js";
21
+ export interface StoppingAdvice {
22
+ n: number;
23
+ best: number;
24
+ recentGain: number;
25
+ expectedGainNext: number;
26
+ noiseFloor: number;
27
+ plateau: boolean;
28
+ recommendation: "CONTINUE" | "STOP" | "UNKNOWN";
29
+ confidence: number;
30
+ rationale: string;
31
+ costPerExperiment: number | null;
32
+ spentSoFar: number | null;
33
+ reasonCode: "too-few" | "still-improving" | "plateaued";
34
+ }
35
+ /**
36
+ * Decide whether the next experiment is worth running.
37
+ * @param obs the (experiment, value) history so far, in run order
38
+ * @param goal "maximize" | "minimize"
39
+ * @param costPerExperiment optional real cost of ONE experiment (money/time) — only then is $ math shown
40
+ * @param window how many recent experiments define "recent" gain (default 5)
41
+ */
42
+ export declare function stoppingAdvice(obs: ReadonlyArray<Observation>, goal?: Goal, costPerExperiment?: number | null, window?: number): StoppingAdvice;
43
+ export declare function frontierGauntlet(): {
44
+ score: 0 | 100;
45
+ checks: Array<{
46
+ name: string;
47
+ pass: boolean;
48
+ detail: string;
49
+ }>;
50
+ };
51
+ //# sourceMappingURL=frontier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontier.d.ts","sourceRoot":"","sources":["../src/frontier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,SAAS,GAAG,iBAAiB,GAAG,WAAW,CAAC;CACzD;AAUD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,aAAa,CAAC,WAAW,CAAC,EAC/B,IAAI,GAAE,IAAiB,EACvB,iBAAiB,GAAE,MAAM,GAAG,IAAW,EACvC,MAAM,SAAI,GACT,cAAc,CAkDhB;AAGD,wBAAgB,gBAAgB,IAAI;IAAE,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAsCrH"}