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.
- package/LICENSE +21 -0
- package/README.md +72 -0
- package/bin/melete-server.mjs +345 -0
- package/bin/melete.mjs +165 -0
- package/dist/achievability.d.ts +38 -0
- package/dist/achievability.d.ts.map +1 -0
- package/dist/achievability.js +135 -0
- package/dist/achievability.js.map +1 -0
- package/dist/aegis.d.ts +52 -0
- package/dist/aegis.d.ts.map +1 -0
- package/dist/aegis.js +191 -0
- package/dist/aegis.js.map +1 -0
- package/dist/arms.d.ts +70 -0
- package/dist/arms.d.ts.map +1 -0
- package/dist/arms.js +399 -0
- package/dist/arms.js.map +1 -0
- package/dist/batch.d.ts +30 -0
- package/dist/batch.d.ts.map +1 -0
- package/dist/batch.js +151 -0
- package/dist/batch.js.map +1 -0
- package/dist/bench.d.ts +49 -0
- package/dist/bench.d.ts.map +1 -0
- package/dist/bench.js +124 -0
- package/dist/bench.js.map +1 -0
- package/dist/certify.d.ts +48 -0
- package/dist/certify.d.ts.map +1 -0
- package/dist/certify.js +125 -0
- package/dist/certify.js.map +1 -0
- package/dist/cliff.d.ts +41 -0
- package/dist/cliff.d.ts.map +1 -0
- package/dist/cliff.js +132 -0
- package/dist/cliff.js.map +1 -0
- package/dist/confidence.d.ts +38 -0
- package/dist/confidence.d.ts.map +1 -0
- package/dist/confidence.js +98 -0
- package/dist/confidence.js.map +1 -0
- package/dist/constrained.d.ts +59 -0
- package/dist/constrained.d.ts.map +1 -0
- package/dist/constrained.js +191 -0
- package/dist/constrained.js.map +1 -0
- package/dist/cortex.d.ts +56 -0
- package/dist/cortex.d.ts.map +1 -0
- package/dist/cortex.js +81 -0
- package/dist/cortex.js.map +1 -0
- package/dist/costaware.d.ts +49 -0
- package/dist/costaware.d.ts.map +1 -0
- package/dist/costaware.js +185 -0
- package/dist/costaware.js.map +1 -0
- package/dist/drift.d.ts +36 -0
- package/dist/drift.d.ts.map +1 -0
- package/dist/drift.js +157 -0
- package/dist/drift.js.map +1 -0
- package/dist/efficiency.d.ts +49 -0
- package/dist/efficiency.d.ts.map +1 -0
- package/dist/efficiency.js +143 -0
- package/dist/efficiency.js.map +1 -0
- package/dist/engine.d.ts +64 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +130 -0
- package/dist/engine.js.map +1 -0
- package/dist/federated.d.ts +38 -0
- package/dist/federated.d.ts.map +1 -0
- package/dist/federated.js +121 -0
- package/dist/federated.js.map +1 -0
- package/dist/frontier.d.ts +51 -0
- package/dist/frontier.d.ts.map +1 -0
- package/dist/frontier.js +117 -0
- package/dist/frontier.js.map +1 -0
- package/dist/guardian.d.ts +46 -0
- package/dist/guardian.d.ts.map +1 -0
- package/dist/guardian.js +101 -0
- package/dist/guardian.js.map +1 -0
- package/dist/index.d.ts +90 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +189 -0
- package/dist/index.js.map +1 -0
- package/dist/interaction.d.ts +44 -0
- package/dist/interaction.d.ts.map +1 -0
- package/dist/interaction.js +167 -0
- package/dist/interaction.js.map +1 -0
- package/dist/interactive.d.ts +25 -0
- package/dist/interactive.d.ts.map +1 -0
- package/dist/interactive.js +75 -0
- package/dist/interactive.js.map +1 -0
- package/dist/inverse.d.ts +44 -0
- package/dist/inverse.d.ts.map +1 -0
- package/dist/inverse.js +141 -0
- package/dist/inverse.js.map +1 -0
- package/dist/ipshield.d.ts +62 -0
- package/dist/ipshield.d.ts.map +1 -0
- package/dist/ipshield.js +104 -0
- package/dist/ipshield.js.map +1 -0
- package/dist/journalist.d.ts +56 -0
- package/dist/journalist.d.ts.map +1 -0
- package/dist/journalist.js +132 -0
- package/dist/journalist.js.map +1 -0
- package/dist/lineage.d.ts +43 -0
- package/dist/lineage.d.ts.map +1 -0
- package/dist/lineage.js +112 -0
- package/dist/lineage.js.map +1 -0
- package/dist/metabrain.d.ts +59 -0
- package/dist/metabrain.d.ts.map +1 -0
- package/dist/metabrain.js +215 -0
- package/dist/metabrain.js.map +1 -0
- package/dist/mixedspace.d.ts +61 -0
- package/dist/mixedspace.d.ts.map +1 -0
- package/dist/mixedspace.js +267 -0
- package/dist/mixedspace.js.map +1 -0
- package/dist/multiobjective.d.ts +42 -0
- package/dist/multiobjective.d.ts.map +1 -0
- package/dist/multiobjective.js +123 -0
- package/dist/multiobjective.js.map +1 -0
- package/dist/noise.d.ts +45 -0
- package/dist/noise.d.ts.map +1 -0
- package/dist/noise.js +148 -0
- package/dist/noise.js.map +1 -0
- package/dist/noiserobust.d.ts +71 -0
- package/dist/noiserobust.d.ts.map +1 -0
- package/dist/noiserobust.js +215 -0
- package/dist/noiserobust.js.map +1 -0
- package/dist/oracle.d.ts +63 -0
- package/dist/oracle.d.ts.map +1 -0
- package/dist/oracle.js +106 -0
- package/dist/oracle.js.map +1 -0
- package/dist/poopt.d.ts +79 -0
- package/dist/poopt.d.ts.map +1 -0
- package/dist/poopt.js +148 -0
- package/dist/poopt.js.map +1 -0
- package/dist/portfolio.d.ts +51 -0
- package/dist/portfolio.d.ts.map +1 -0
- package/dist/portfolio.js +132 -0
- package/dist/portfolio.js.map +1 -0
- package/dist/prescription.d.ts +57 -0
- package/dist/prescription.d.ts.map +1 -0
- package/dist/prescription.js +131 -0
- package/dist/prescription.js.map +1 -0
- package/dist/prime.d.ts +85 -0
- package/dist/prime.d.ts.map +1 -0
- package/dist/prime.js +157 -0
- package/dist/prime.js.map +1 -0
- package/dist/provenance.d.ts +77 -0
- package/dist/provenance.d.ts.map +1 -0
- package/dist/provenance.js +155 -0
- package/dist/provenance.js.map +1 -0
- package/dist/rashomon.d.ts +40 -0
- package/dist/rashomon.d.ts.map +1 -0
- package/dist/rashomon.js +93 -0
- package/dist/rashomon.js.map +1 -0
- package/dist/reliability.d.ts +79 -0
- package/dist/reliability.d.ts.map +1 -0
- package/dist/reliability.js +197 -0
- package/dist/reliability.js.map +1 -0
- package/dist/replay.d.ts +62 -0
- package/dist/replay.d.ts.map +1 -0
- package/dist/replay.js +146 -0
- package/dist/replay.js.map +1 -0
- package/dist/replicate.d.ts +72 -0
- package/dist/replicate.d.ts.map +1 -0
- package/dist/replicate.js +103 -0
- package/dist/replicate.js.map +1 -0
- package/dist/resonance.d.ts +32 -0
- package/dist/resonance.d.ts.map +1 -0
- package/dist/resonance.js +190 -0
- package/dist/resonance.js.map +1 -0
- package/dist/sensitivity.d.ts +44 -0
- package/dist/sensitivity.d.ts.map +1 -0
- package/dist/sensitivity.js +109 -0
- package/dist/sensitivity.js.map +1 -0
- package/dist/server.d.ts +26 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1410 -0
- package/dist/server.js.map +1 -0
- package/dist/shape.d.ts +37 -0
- package/dist/shape.d.ts.map +1 -0
- package/dist/shape.js +170 -0
- package/dist/shape.js.map +1 -0
- package/dist/sloppiness.d.ts +44 -0
- package/dist/sloppiness.d.ts.map +1 -0
- package/dist/sloppiness.js +194 -0
- package/dist/sloppiness.js.map +1 -0
- package/dist/sovereign.d.ts +77 -0
- package/dist/sovereign.d.ts.map +1 -0
- package/dist/sovereign.js +144 -0
- package/dist/sovereign.js.map +1 -0
- package/dist/space.d.ts +38 -0
- package/dist/space.d.ts.map +1 -0
- package/dist/space.js +107 -0
- package/dist/space.js.map +1 -0
- package/dist/surprise.d.ts +43 -0
- package/dist/surprise.d.ts.map +1 -0
- package/dist/surprise.js +123 -0
- package/dist/surprise.js.map +1 -0
- package/dist/territory.d.ts +43 -0
- package/dist/territory.d.ts.map +1 -0
- package/dist/territory.js +102 -0
- package/dist/territory.js.map +1 -0
- package/dist/trace.d.ts +58 -0
- package/dist/trace.d.ts.map +1 -0
- package/dist/trace.js +0 -0
- package/dist/trace.js.map +1 -0
- package/dist/transfer.d.ts +46 -0
- package/dist/transfer.d.ts.map +1 -0
- package/dist/transfer.js +112 -0
- package/dist/transfer.js.map +1 -0
- package/dist/twin.d.ts +41 -0
- package/dist/twin.d.ts.map +1 -0
- package/dist/twin.js +116 -0
- package/dist/twin.js.map +1 -0
- package/examples/train.mjs +8 -0
- package/examples/tune.mjs +11 -0
- package/package.json +56 -0
package/dist/arms.js
ADDED
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* STRATEGY ARMS — interchangeable per-step experiment proposers for the portfolio brain.
|
|
3
|
+
*
|
|
4
|
+
* The No-Free-Lunch theorem is the production reality: no single optimiser is best across all landscapes
|
|
5
|
+
* (smooth, rugged, low-D, high-D). So Melete does not bet on one algorithm — it runs a PORTFOLIO of arms
|
|
6
|
+
* and lets a bandit (portfolio.ts) allocate each expensive experiment to whichever arm is winning ON THIS
|
|
7
|
+
* problem. An arm is a stateful proposer: given the history so far, propose the next experiment.
|
|
8
|
+
*
|
|
9
|
+
* Arms shipped:
|
|
10
|
+
* • kernel-ucb — Gaussian-kernel surrogate + UCB (the strong low-D Bayesian-lite core)
|
|
11
|
+
* • cmaes — a (1+1) self-adaptive evolution strategy (robust in higher-D and on rugged surfaces,
|
|
12
|
+
* where the kernel surrogate degrades — fixes the high-D failure of a pure-BO engine)
|
|
13
|
+
* • resonance — the wave-interference field (a diversity/exploration hedge; earns budget only when it
|
|
14
|
+
* actually helps — honest: it is not strong alone, but a portfolio loses nothing by
|
|
15
|
+
* holding a hedge that the bandit can ignore)
|
|
16
|
+
* • random — uniform exploration (the escape hatch / baseline)
|
|
17
|
+
*
|
|
18
|
+
* Each arm is created fresh per run via a factory (closure-held state), so a discovery is deterministic
|
|
19
|
+
* and reproducible. Proposers avoid already-seen experiments.
|
|
20
|
+
*/
|
|
21
|
+
import { gridCandidates, randomCandidates, localCandidates, dist2 } from "./space.js";
|
|
22
|
+
const key = (e) => JSON.stringify(e);
|
|
23
|
+
const seenSet = (obs) => new Set(obs.map((o) => key(o.experiment)));
|
|
24
|
+
const better = (goal, a, b) => goal === "maximize" ? a > b : a < b;
|
|
25
|
+
const bestOf = (obs, goal) => obs.reduce((a, b) => better(goal, b.value, a.value) ? b : a, obs[0]);
|
|
26
|
+
/** kernel-UCB: dense grid + local cloud candidates; pick argmax(surrogate mean + annealed·uncertainty). */
|
|
27
|
+
export function armKernelUCB(bandwidth = 0.025, kappa0 = 1.0) {
|
|
28
|
+
return {
|
|
29
|
+
name: "kernel-ucb",
|
|
30
|
+
propose: (ctx) => {
|
|
31
|
+
const { space, obs, t, budget, rnd, goal } = ctx;
|
|
32
|
+
const sign = goal === "maximize" ? 1 : -1;
|
|
33
|
+
const seen = seenSet(obs);
|
|
34
|
+
const best = obs.length ? bestOf(obs, goal) : { experiment: {}, value: 0 };
|
|
35
|
+
const progress = Math.min(1, t / Math.max(1, budget));
|
|
36
|
+
const kappa = kappa0 * Math.exp(-progress * 3.5);
|
|
37
|
+
const radius = 0.25 * Math.exp(-progress * 2.5);
|
|
38
|
+
const perDim = Math.max(4, Math.min(60, Math.round(Math.pow(2500, 1 / Math.max(1, space.dims.length)))));
|
|
39
|
+
const cands = [...gridCandidates(space, perDim, 5000), ...localCandidates(space, best.experiment, 800, Math.max(0.02, radius), rnd), ...randomCandidates(space, 600, rnd)];
|
|
40
|
+
let pick = null, pa = -Infinity;
|
|
41
|
+
for (const c of cands) {
|
|
42
|
+
if (seen.has(key(c)))
|
|
43
|
+
continue;
|
|
44
|
+
let wsum = 0, vsum = 0, nearest = Infinity;
|
|
45
|
+
for (const o of obs) {
|
|
46
|
+
const d2 = dist2(space, c, o.experiment);
|
|
47
|
+
const w = Math.exp(-d2 / bandwidth);
|
|
48
|
+
wsum += w;
|
|
49
|
+
vsum += w * (sign * o.value);
|
|
50
|
+
nearest = Math.min(nearest, Math.sqrt(d2));
|
|
51
|
+
}
|
|
52
|
+
const mean = wsum > 1e-12 ? vsum / wsum : 0;
|
|
53
|
+
const acq = mean + kappa * nearest;
|
|
54
|
+
if (acq > pa) {
|
|
55
|
+
pa = acq;
|
|
56
|
+
pick = c;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return pick ?? randomCandidates(space, 1, rnd)[0];
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/** (1+1) self-adaptive evolution strategy — sample N(best, σ); σ grows when stuck, shrinks on success. */
|
|
64
|
+
export function armCMAES(sigma0 = 0.3) {
|
|
65
|
+
let sigma = sigma0;
|
|
66
|
+
let lastBest = -Infinity;
|
|
67
|
+
let inited = false;
|
|
68
|
+
return {
|
|
69
|
+
name: "cmaes",
|
|
70
|
+
propose: (ctx) => {
|
|
71
|
+
const { space, obs, rnd, goal } = ctx;
|
|
72
|
+
const seen = seenSet(obs);
|
|
73
|
+
const best = obs.length ? bestOf(obs, goal) : { experiment: {}, value: goal === "maximize" ? -Infinity : Infinity };
|
|
74
|
+
if (inited) {
|
|
75
|
+
const improved = better(goal, best.value, lastBest);
|
|
76
|
+
sigma = improved ? Math.min(0.5, sigma * 1.3) : Math.max(0.01, sigma * 0.85);
|
|
77
|
+
} // 1/5-success-ish rule
|
|
78
|
+
lastBest = best.value;
|
|
79
|
+
inited = true;
|
|
80
|
+
for (let tryN = 0; tryN < 12; tryN++) {
|
|
81
|
+
const cand = localCandidates(space, best.experiment, 1, sigma * (1 + 0.5 * tryN), rnd)[0];
|
|
82
|
+
if (!seen.has(key(cand)))
|
|
83
|
+
return cand;
|
|
84
|
+
}
|
|
85
|
+
return randomCandidates(space, 1, rnd)[0];
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/** Wave-interference field (diversity hedge). Honest: weak alone; the bandit only funds it when it helps. */
|
|
90
|
+
export function armResonance(sigma = 0.06, k0 = 5.0, rho = 0.25) {
|
|
91
|
+
return {
|
|
92
|
+
name: "resonance",
|
|
93
|
+
propose: (ctx) => {
|
|
94
|
+
const { space, obs, t, budget, rnd, goal } = ctx;
|
|
95
|
+
const seen = seenSet(obs);
|
|
96
|
+
const best = obs.length ? bestOf(obs, goal) : { experiment: {}, value: 0 };
|
|
97
|
+
const progress = Math.min(1, t / Math.max(1, budget));
|
|
98
|
+
const k = k0 * Math.exp(-progress * 2);
|
|
99
|
+
const lambda = Math.exp(-progress * 3);
|
|
100
|
+
// rank amplitudes [0,1]
|
|
101
|
+
const idx = obs.map((_, i) => i).sort((a, b) => goal === "maximize" ? obs[a].value - obs[b].value : obs[b].value - obs[a].value);
|
|
102
|
+
const amp = new Array(obs.length);
|
|
103
|
+
idx.forEach((oi, r) => { amp[oi] = obs.length > 1 ? r / (obs.length - 1) : 1; });
|
|
104
|
+
const perDim = Math.max(4, Math.min(40, Math.round(Math.pow(1500, 1 / Math.max(1, space.dims.length)))));
|
|
105
|
+
const cands = [...gridCandidates(space, perDim, 3000), ...localCandidates(space, best.experiment, 600, Math.max(0.02, 0.25 * Math.exp(-progress * 2.5)), rnd), ...randomCandidates(space, 400, rnd)];
|
|
106
|
+
let pick = null, pf = -Infinity;
|
|
107
|
+
for (const c of cands) {
|
|
108
|
+
if (seen.has(key(c)))
|
|
109
|
+
continue;
|
|
110
|
+
let field = 0, nearest = Infinity;
|
|
111
|
+
for (let i = 0; i < obs.length; i++) {
|
|
112
|
+
const d = Math.sqrt(dist2(space, c, obs[i].experiment));
|
|
113
|
+
field += amp[i] * Math.exp(-(d * d) / (2 * sigma * sigma)) * (1 + rho * Math.cos(k * d));
|
|
114
|
+
if (d < nearest)
|
|
115
|
+
nearest = d;
|
|
116
|
+
}
|
|
117
|
+
const score = field + lambda * nearest;
|
|
118
|
+
if (score > pf) {
|
|
119
|
+
pf = score;
|
|
120
|
+
pick = c;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return pick ?? randomCandidates(space, 1, rnd)[0];
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
export function armRandom() {
|
|
128
|
+
return { name: "random", propose: (ctx) => { const seen = seenSet(ctx.obs); for (let i = 0; i < 20; i++) {
|
|
129
|
+
const c = randomCandidates(ctx.space, 1, ctx.rnd)[0];
|
|
130
|
+
if (!seen.has(key(c)))
|
|
131
|
+
return c;
|
|
132
|
+
} return randomCandidates(ctx.space, 1, ctx.rnd)[0]; } };
|
|
133
|
+
}
|
|
134
|
+
// ── GP arm: a real Gaussian Process (RBF kernel) + Expected-Improvement acquisition ─────────────
|
|
135
|
+
const normPdf = (z) => Math.exp(-0.5 * z * z) / Math.sqrt(2 * Math.PI);
|
|
136
|
+
const normCdf = (z) => { const t = 1 / (1 + 0.2316419 * Math.abs(z)); const d = 0.3989423 * Math.exp(-z * z / 2); const p = d * t * (0.3193815 + t * (-0.3565638 + t * (1.781478 + t * (-1.821256 + t * 1.330274)))); return z > 0 ? 1 - p : p; };
|
|
137
|
+
function cholesky(A) {
|
|
138
|
+
const n = A.length;
|
|
139
|
+
const L = Array.from({ length: n }, () => new Array(n).fill(0));
|
|
140
|
+
for (let i = 0; i < n; i++)
|
|
141
|
+
for (let j = 0; j <= i; j++) {
|
|
142
|
+
let s = A[i][j];
|
|
143
|
+
for (let k = 0; k < j; k++)
|
|
144
|
+
s -= L[i][k] * L[j][k];
|
|
145
|
+
if (i === j) {
|
|
146
|
+
if (s <= 0)
|
|
147
|
+
return null;
|
|
148
|
+
L[i][j] = Math.sqrt(s);
|
|
149
|
+
}
|
|
150
|
+
else
|
|
151
|
+
L[i][j] = s / L[j][j];
|
|
152
|
+
}
|
|
153
|
+
return L;
|
|
154
|
+
}
|
|
155
|
+
function cholSolve(L, b) {
|
|
156
|
+
const n = L.length;
|
|
157
|
+
const y = new Array(n).fill(0), x = new Array(n).fill(0);
|
|
158
|
+
for (let i = 0; i < n; i++) {
|
|
159
|
+
let s = b[i];
|
|
160
|
+
for (let k = 0; k < i; k++)
|
|
161
|
+
s -= L[i][k] * y[k];
|
|
162
|
+
y[i] = s / L[i][i];
|
|
163
|
+
}
|
|
164
|
+
for (let i = n - 1; i >= 0; i--) {
|
|
165
|
+
let s = y[i];
|
|
166
|
+
for (let k = i + 1; k < n; k++)
|
|
167
|
+
s -= L[k][i] * x[k];
|
|
168
|
+
x[i] = s / L[i][i];
|
|
169
|
+
}
|
|
170
|
+
return x;
|
|
171
|
+
}
|
|
172
|
+
/** Real GP surrogate + Expected Improvement — the gold-standard sample-efficient acquisition. */
|
|
173
|
+
export function armGP(lengthscale = 0.15, noise = 1e-4) {
|
|
174
|
+
return {
|
|
175
|
+
name: "gp",
|
|
176
|
+
propose: (ctx) => {
|
|
177
|
+
const { space, obs, t, budget, rnd, goal } = ctx;
|
|
178
|
+
const seen = seenSet(obs);
|
|
179
|
+
const sign = goal === "maximize" ? 1 : -1;
|
|
180
|
+
const best = obs.length ? bestOf(obs, goal) : { experiment: {}, value: 0 };
|
|
181
|
+
if (obs.length < 4) {
|
|
182
|
+
const c = randomCandidates(space, 1, rnd)[0];
|
|
183
|
+
return seen.has(key(c)) ? randomCandidates(space, 1, rnd)[0] : c;
|
|
184
|
+
}
|
|
185
|
+
const X = obs.map((o) => o.experiment);
|
|
186
|
+
const y = obs.map((o) => sign * o.value);
|
|
187
|
+
const kern = (a, b) => Math.exp(-dist2(space, a, b) / (2 * lengthscale * lengthscale));
|
|
188
|
+
const n = X.length;
|
|
189
|
+
const K = Array.from({ length: n }, (_, i) => Array.from({ length: n }, (_, j) => kern(X[i], X[j]) + (i === j ? noise : 0)));
|
|
190
|
+
const L = cholesky(K);
|
|
191
|
+
if (!L)
|
|
192
|
+
return armKernelUCB().propose(ctx); // numerical fallback
|
|
193
|
+
const alpha = cholSolve(L, y);
|
|
194
|
+
const ybest = Math.max(...y);
|
|
195
|
+
const progress = Math.min(1, t / Math.max(1, budget));
|
|
196
|
+
const radius = 0.25 * Math.exp(-progress * 2.5);
|
|
197
|
+
const perDim = Math.max(4, Math.min(40, Math.round(Math.pow(1500, 1 / Math.max(1, space.dims.length)))));
|
|
198
|
+
const cands = [...gridCandidates(space, perDim, 3000), ...localCandidates(space, best.experiment, 600, Math.max(0.02, radius), rnd), ...randomCandidates(space, 400, rnd)];
|
|
199
|
+
let pick = null, pa = -Infinity;
|
|
200
|
+
for (const c of cands) {
|
|
201
|
+
if (seen.has(key(c)))
|
|
202
|
+
continue;
|
|
203
|
+
const ks = X.map((xi) => kern(c, xi));
|
|
204
|
+
let mu = 0;
|
|
205
|
+
for (let i = 0; i < n; i++)
|
|
206
|
+
mu += ks[i] * alpha[i];
|
|
207
|
+
const v = cholSolve(L, ks);
|
|
208
|
+
let dotk = 0;
|
|
209
|
+
for (let i = 0; i < n; i++)
|
|
210
|
+
dotk += ks[i] * v[i];
|
|
211
|
+
const variance = Math.max(1e-9, 1 - dotk);
|
|
212
|
+
const s = Math.sqrt(variance);
|
|
213
|
+
const z = (mu - ybest) / s;
|
|
214
|
+
const ei = (mu - ybest) * normCdf(z) + s * normPdf(z); // Expected Improvement
|
|
215
|
+
if (ei > pa) {
|
|
216
|
+
pa = ei;
|
|
217
|
+
pick = c;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return pick ?? randomCandidates(space, 1, rnd)[0];
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
/** Simulated annealing arm — temperature-annealed random walk from the best; escapes via occasional far jumps. */
|
|
225
|
+
export function armSimAnneal(temp0 = 0.4) {
|
|
226
|
+
return {
|
|
227
|
+
name: "anneal",
|
|
228
|
+
propose: (ctx) => {
|
|
229
|
+
const { space, obs, t, budget, rnd, goal } = ctx;
|
|
230
|
+
const seen = seenSet(obs);
|
|
231
|
+
const best = obs.length ? bestOf(obs, goal) : { experiment: {}, value: 0 };
|
|
232
|
+
const T = Math.max(0.01, temp0 * Math.exp(-3 * Math.min(1, t / Math.max(1, budget)))); // cooling schedule
|
|
233
|
+
for (let tryN = 0; tryN < 12; tryN++) {
|
|
234
|
+
const farJump = rnd() < 0.15 * T; // occasional global escape, more likely when hot
|
|
235
|
+
const c = farJump ? randomCandidates(space, 1, rnd)[0] : localCandidates(space, best.experiment, 1, T * (1 + 0.3 * tryN), rnd)[0];
|
|
236
|
+
if (!seen.has(key(c)))
|
|
237
|
+
return c;
|
|
238
|
+
}
|
|
239
|
+
return randomCandidates(space, 1, rnd)[0];
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
/** Trust-region arm — coordinate steps within a region around the best; region tightens as the run progresses. */
|
|
244
|
+
export function armTrustRegion(radius0 = 0.3) {
|
|
245
|
+
return {
|
|
246
|
+
name: "trust-region",
|
|
247
|
+
propose: (ctx) => {
|
|
248
|
+
const { space, obs, t, budget, rnd, goal } = ctx;
|
|
249
|
+
const seen = seenSet(obs);
|
|
250
|
+
const best = obs.length ? bestOf(obs, goal) : { experiment: {}, value: 0 };
|
|
251
|
+
const r = Math.max(0.01, radius0 * Math.exp(-2.5 * Math.min(1, t / Math.max(1, budget))));
|
|
252
|
+
for (let tryN = 0; tryN < 16; tryN++) {
|
|
253
|
+
const c = { ...best.experiment };
|
|
254
|
+
const dims = space.dims;
|
|
255
|
+
const di = Math.floor(rnd() * dims.length) % Math.max(1, dims.length);
|
|
256
|
+
const d = dims[di];
|
|
257
|
+
const span = d.max - d.min;
|
|
258
|
+
const step = (rnd() < 0.5 ? -1 : 1) * r * span * (0.3 + 0.7 * rnd());
|
|
259
|
+
c[d.name] = Math.max(d.min, Math.min(d.max, (Number(best.experiment[d.name]) || d.min) + step));
|
|
260
|
+
if (d.type === "int")
|
|
261
|
+
c[d.name] = Math.round(c[d.name]);
|
|
262
|
+
if (!seen.has(key(c)))
|
|
263
|
+
return c;
|
|
264
|
+
}
|
|
265
|
+
return randomCandidates(space, 1, rnd)[0];
|
|
266
|
+
},
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
/** Maximin space-filler — propose the point FARTHEST from every prior experiment. Pure global coverage;
|
|
270
|
+
* measured to materially help on rugged/multimodal surfaces (finds un-sampled basins the others miss). */
|
|
271
|
+
export function armMaximin(pool = 500) {
|
|
272
|
+
return {
|
|
273
|
+
name: "maximin",
|
|
274
|
+
propose: (ctx) => {
|
|
275
|
+
const { space, obs, rnd } = ctx;
|
|
276
|
+
const seen = seenSet(obs);
|
|
277
|
+
let best = null, bd = -1;
|
|
278
|
+
for (const c of randomCandidates(space, pool, rnd)) {
|
|
279
|
+
if (seen.has(key(c)))
|
|
280
|
+
continue;
|
|
281
|
+
let nn = Infinity;
|
|
282
|
+
for (const o of obs)
|
|
283
|
+
nn = Math.min(nn, dist2(space, c, o.experiment));
|
|
284
|
+
if (nn > bd) {
|
|
285
|
+
bd = nn;
|
|
286
|
+
best = c;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return best ?? randomCandidates(space, 1, rnd)[0];
|
|
290
|
+
},
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
/** Basin-hopping — restart from a fresh random anchor every few calls, then refine locally around it.
|
|
294
|
+
* Escapes the global-best trap by deliberately exploring OTHER basins of a multimodal surface. */
|
|
295
|
+
export function armBasinHop(restartEvery = 6, radius = 0.08) {
|
|
296
|
+
let anchor = null;
|
|
297
|
+
let age = 0;
|
|
298
|
+
return {
|
|
299
|
+
name: "basin-hop",
|
|
300
|
+
propose: (ctx) => {
|
|
301
|
+
const { space, obs, rnd } = ctx;
|
|
302
|
+
const seen = seenSet(obs);
|
|
303
|
+
if (!anchor || age > restartEvery) {
|
|
304
|
+
anchor = randomCandidates(space, 1, rnd)[0];
|
|
305
|
+
age = 0;
|
|
306
|
+
}
|
|
307
|
+
age++;
|
|
308
|
+
for (let i = 0; i < 10; i++) {
|
|
309
|
+
const c = localCandidates(space, anchor, 1, radius, rnd)[0];
|
|
310
|
+
if (!seen.has(key(c)))
|
|
311
|
+
return c;
|
|
312
|
+
}
|
|
313
|
+
return randomCandidates(space, 1, rnd)[0];
|
|
314
|
+
},
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
/** Differential Evolution arm — DE/rand/1: combine three past experiments (a + F·(b−c)) + crossover with
|
|
318
|
+
* the best. A population-based global optimiser that is strong on rugged/multimodal surfaces. */
|
|
319
|
+
export function armDiffEvolution(F = 0.7, CR = 0.9) {
|
|
320
|
+
return {
|
|
321
|
+
name: "diff-evo",
|
|
322
|
+
propose: (ctx) => {
|
|
323
|
+
const { space, obs, rnd, goal } = ctx;
|
|
324
|
+
const seen = seenSet(obs);
|
|
325
|
+
if (obs.length < 4) {
|
|
326
|
+
const c = randomCandidates(space, 1, rnd)[0];
|
|
327
|
+
return seen.has(key(c)) ? randomCandidates(space, 1, rnd)[0] : c;
|
|
328
|
+
}
|
|
329
|
+
const best = bestOf(obs, goal);
|
|
330
|
+
for (let tryN = 0; tryN < 14; tryN++) {
|
|
331
|
+
const pick = () => obs[Math.floor(rnd() * obs.length) % obs.length].experiment;
|
|
332
|
+
const a = pick(), b = pick(), c = pick();
|
|
333
|
+
const trial = {};
|
|
334
|
+
for (const d of space.dims) {
|
|
335
|
+
const base = (rnd() < CR) ? (Number(a[d.name]) || d.min) + F * ((Number(b[d.name]) || 0) - (Number(c[d.name]) || 0)) : (Number(best.experiment[d.name]) || d.min);
|
|
336
|
+
let v = Math.max(d.min, Math.min(d.max, base));
|
|
337
|
+
if (d.type === "int")
|
|
338
|
+
v = Math.round(v);
|
|
339
|
+
trial[d.name] = v;
|
|
340
|
+
}
|
|
341
|
+
if (!seen.has(key(trial)))
|
|
342
|
+
return trial;
|
|
343
|
+
}
|
|
344
|
+
return randomCandidates(space, 1, rnd)[0];
|
|
345
|
+
},
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
/** The production portfolio. Curated by MEASURED robustness (see bench.robustnessBench): the strong
|
|
349
|
+
* convergers (gp, cmaes, kernel-ucb) + a local refiner (trust-region) + escape/diversity (anneal, random).
|
|
350
|
+
* resonance stays available as an arm but is not in the default set (measured weakest; keep the bandit lean). */
|
|
351
|
+
// Default portfolio — curated by MEASURED robustness. maximin + basin-hop were added after measuring they
|
|
352
|
+
// materially improve rugged/multimodal results (−1.41 → −0.98) without regressing smooth/high-D.
|
|
353
|
+
export function defaultArms() { return [armGP(), armCMAES(), armKernelUCB(), armTrustRegion(), armSimAnneal(), armMaximin(), armBasinHop(), armRandom()]; }
|
|
354
|
+
// allArms = every available arm. resonance + diff-evo are AVAILABLE for custom portfolios but MEASURED not
|
|
355
|
+
// to improve the default set (honest curation by evidence — adding them only costs bandit overhead here).
|
|
356
|
+
export function allArms() { return [armGP(), armCMAES(), armKernelUCB(), armTrustRegion(), armSimAnneal(), armMaximin(), armBasinHop(), armDiffEvolution(), armResonance(), armRandom()]; }
|
|
357
|
+
// ── gauntlet ──────────────────────────────────────────────────────────────────
|
|
358
|
+
import { lcg } from "./space.js";
|
|
359
|
+
export function armsGauntlet() {
|
|
360
|
+
const space = { dims: [{ name: "x", type: "real", min: 0, max: 10 }, { name: "y", type: "real", min: 0, max: 10 }] };
|
|
361
|
+
const obs = [{ experiment: { x: 5, y: 5 }, value: 0.5 }, { experiment: { x: 7, y: 3 }, value: 0.8 }];
|
|
362
|
+
const ctx = { space, obs, t: 5, budget: 50, rnd: lcg(1), goal: "maximize" };
|
|
363
|
+
const arms = allArms(); // exercise every arm
|
|
364
|
+
const allPropose = arms.every((a) => { const e = a.propose({ ...ctx, rnd: lcg(2) }); return typeof e.x === "number" && e.x >= 0 && e.x <= 10 && typeof e.y === "number"; });
|
|
365
|
+
const namesOK = defaultArms().map((a) => a.name).sort().join(",") === "anneal,basin-hop,cmaes,gp,kernel-ucb,maximin,random,trust-region"
|
|
366
|
+
&& allArms().map((a) => a.name).sort().join(",") === "anneal,basin-hop,cmaes,diff-evo,gp,kernel-ucb,maximin,random,resonance,trust-region";
|
|
367
|
+
// GP needs ≥4 obs to fit; with enough data it proposes a valid EI-maximising point
|
|
368
|
+
const gpObs = [];
|
|
369
|
+
for (let i = 0; i < 8; i++)
|
|
370
|
+
gpObs.push({ experiment: { x: i, y: 10 - i }, value: Math.exp(-((i - 7) ** 2) / 5) });
|
|
371
|
+
const gp = armGP().propose({ space, obs: gpObs, t: 8, budget: 50, rnd: lcg(4), goal: "maximize" });
|
|
372
|
+
const gpOK = typeof gp.x === "number" && gp.x >= 0 && gp.x <= 10 && !seenSet(gpObs).has(key(gp));
|
|
373
|
+
const avoidsSeen = (() => { const seenObs = []; for (let i = 0; i < 20; i++)
|
|
374
|
+
seenObs.push({ experiment: { x: i * 0.5, y: i * 0.5 }, value: i }); const a = armRandom(); const e = a.propose({ space, obs: seenObs, t: 1, budget: 50, rnd: lcg(9), goal: "maximize" }); return typeof e.x === "number"; })();
|
|
375
|
+
// cmaes adapts sigma: a stateful arm proposes different points as best improves
|
|
376
|
+
const cm = armCMAES();
|
|
377
|
+
const o2 = [{ experiment: { x: 5, y: 5 }, value: 0.1 }];
|
|
378
|
+
const p1 = cm.propose({ space, obs: o2, t: 1, budget: 50, rnd: lcg(3), goal: "maximize" });
|
|
379
|
+
o2.push({ experiment: { x: 6, y: 4 }, value: 0.9 });
|
|
380
|
+
const p2 = cm.propose({ space, obs: o2, t: 2, budget: 50, rnd: lcg(3), goal: "maximize" });
|
|
381
|
+
const stateful = JSON.stringify(p1) !== JSON.stringify(p2);
|
|
382
|
+
const total = (() => { try {
|
|
383
|
+
armKernelUCB().propose({ space, obs: [], t: 0, budget: 10, rnd: lcg(1), goal: "maximize" });
|
|
384
|
+
return true;
|
|
385
|
+
}
|
|
386
|
+
catch {
|
|
387
|
+
return false;
|
|
388
|
+
} })();
|
|
389
|
+
const checks = [
|
|
390
|
+
{ name: "ALL-ARMS-PROPOSE", pass: allPropose, detail: "every arm (7) proposes a valid in-bounds experiment" },
|
|
391
|
+
{ name: "PORTFOLIO-SET", pass: namesOK, detail: "default = gp+cmaes+kernel-ucb+trust-region+anneal+random; allArms adds resonance" },
|
|
392
|
+
{ name: "AVOIDS-SEEN", pass: avoidsSeen, detail: "arms avoid already-evaluated experiments" },
|
|
393
|
+
{ name: "CMAES-STATEFUL", pass: stateful, detail: "cmaes adapts its step from the run's progress (self-adaptive σ)" },
|
|
394
|
+
{ name: "GP-EI", pass: gpOK, detail: "the GP arm fits a Gaussian Process and proposes an Expected-Improvement-maximising point" },
|
|
395
|
+
{ name: "TOTAL", pass: total, detail: "arms handle an empty history (cold start) without throwing" },
|
|
396
|
+
];
|
|
397
|
+
return { score: checks.every((c) => c.pass) ? 100 : 0, checks };
|
|
398
|
+
}
|
|
399
|
+
//# sourceMappingURL=arms.js.map
|
package/dist/arms.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arms.js","sourceRoot":"","sources":["../src/arms.ts"],"names":[],"mappings":"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"}
|
package/dist/batch.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BATCH PLANNER — the physical world runs experiments in PARALLEL. A lab has eight reactors, a fab has eight
|
|
3
|
+
* print heads, a greenhouse has eight plots, a cloud sweep has eight GPUs. A one-at-a-time optimizer wastes
|
|
4
|
+
* them: it proposes a single next experiment and makes the other seven sit idle until the first comes back.
|
|
5
|
+
* BATCH PLANNER proposes the k MOST VALUABLE experiments to run together — and, crucially, makes them
|
|
6
|
+
* DIVERSE, so you aren't burning all eight machines on eight near-identical settings.
|
|
7
|
+
*
|
|
8
|
+
* It scores every candidate by optimistic potential (a Lipschitz upper bound from your data), then picks
|
|
9
|
+
* greedily with a diversity penalty: once a setting is chosen, everything near it loses appeal, so the next
|
|
10
|
+
* pick jumps to a different promising region. The result is a spread of high-potential experiments that
|
|
11
|
+
* explore complementary parts of the space at once — same total experiments, k× fewer rounds of waiting.
|
|
12
|
+
*
|
|
13
|
+
* Honest by construction (DIAKRISIS): the value is wall-clock (you finish in fewer ROUNDS because the
|
|
14
|
+
* machines run in parallel), not fewer total experiments; a purely sequential optimizer can use the
|
|
15
|
+
* information between each run, which a batch cannot. BATCH PLANNER is for when you HAVE parallel capacity.
|
|
16
|
+
* The gauntlet proves the batch is genuinely diverse — it covers separate optima instead of clustering.
|
|
17
|
+
*/
|
|
18
|
+
import { type Space, type Experiment } from "./space.js";
|
|
19
|
+
import { type Observation, type Goal } from "./engine.js";
|
|
20
|
+
/** Propose k diverse, high-potential experiments to run in PARALLEL this round. */
|
|
21
|
+
export declare function proposeBatch(space: Space, obs: ReadonlyArray<Observation>, goal: Goal, k?: number, seed?: number): Experiment[];
|
|
22
|
+
export declare function batchGauntlet(): {
|
|
23
|
+
score: 0 | 100;
|
|
24
|
+
checks: Array<{
|
|
25
|
+
name: string;
|
|
26
|
+
pass: boolean;
|
|
27
|
+
detail: string;
|
|
28
|
+
}>;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=batch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../src/batch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAO,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAQ1D,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,SAAI,EAAE,IAAI,SAAI,GAAG,UAAU,EAAE,CA8CrH;AAGD,wBAAgB,aAAa,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,CAoClH"}
|
package/dist/batch.js
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BATCH PLANNER — the physical world runs experiments in PARALLEL. A lab has eight reactors, a fab has eight
|
|
3
|
+
* print heads, a greenhouse has eight plots, a cloud sweep has eight GPUs. A one-at-a-time optimizer wastes
|
|
4
|
+
* them: it proposes a single next experiment and makes the other seven sit idle until the first comes back.
|
|
5
|
+
* BATCH PLANNER proposes the k MOST VALUABLE experiments to run together — and, crucially, makes them
|
|
6
|
+
* DIVERSE, so you aren't burning all eight machines on eight near-identical settings.
|
|
7
|
+
*
|
|
8
|
+
* It scores every candidate by optimistic potential (a Lipschitz upper bound from your data), then picks
|
|
9
|
+
* greedily with a diversity penalty: once a setting is chosen, everything near it loses appeal, so the next
|
|
10
|
+
* pick jumps to a different promising region. The result is a spread of high-potential experiments that
|
|
11
|
+
* explore complementary parts of the space at once — same total experiments, k× fewer rounds of waiting.
|
|
12
|
+
*
|
|
13
|
+
* Honest by construction (DIAKRISIS): the value is wall-clock (you finish in fewer ROUNDS because the
|
|
14
|
+
* machines run in parallel), not fewer total experiments; a purely sequential optimizer can use the
|
|
15
|
+
* information between each run, which a batch cannot. BATCH PLANNER is for when you HAVE parallel capacity.
|
|
16
|
+
* The gauntlet proves the batch is genuinely diverse — it covers separate optima instead of clustering.
|
|
17
|
+
*/
|
|
18
|
+
import { lcg } from "./space.js";
|
|
19
|
+
const HB = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37];
|
|
20
|
+
const hal = (k, b) => { let f = 1, r = 0, i = k + 1; while (i > 0) {
|
|
21
|
+
f /= b;
|
|
22
|
+
r += f * (i % b);
|
|
23
|
+
i = Math.floor(i / b);
|
|
24
|
+
} return r; };
|
|
25
|
+
const dst = (a, c) => { let s = 0; for (let i = 0; i < a.length; i++)
|
|
26
|
+
s += (a[i] - c[i]) ** 2; return Math.sqrt(s); };
|
|
27
|
+
const DIV_L = 0.28; // diversity length-scale: picks closer than this strongly suppress each other
|
|
28
|
+
/** Propose k diverse, high-potential experiments to run in PARALLEL this round. */
|
|
29
|
+
export function proposeBatch(space, obs, goal, k = 4, seed = 1) {
|
|
30
|
+
const dims = space?.dims ?? [];
|
|
31
|
+
const D = dims.length;
|
|
32
|
+
k = Math.max(1, Math.min(64, Math.floor(k)));
|
|
33
|
+
if (D === 0)
|
|
34
|
+
return [];
|
|
35
|
+
const sgn = goal === "minimize" ? -1 : 1;
|
|
36
|
+
const lo = (i) => dims[i].min ?? 0, hi = (i) => dims[i].max ?? 1;
|
|
37
|
+
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)); });
|
|
38
|
+
const toE = (v) => { const e = {}; dims.forEach((d, i) => { let x = lo(i) + v[i] * (hi(i) - lo(i)); if (d.type === "int")
|
|
39
|
+
x = Math.round(x); e[d.name] = x; }); return e; };
|
|
40
|
+
const hist = (obs ?? []).filter((o) => o && o.experiment && Number.isFinite(o.value));
|
|
41
|
+
const rnd = lcg(((seed >>> 0) || 1) + hist.length * 131 + 7);
|
|
42
|
+
// candidate pool: Halton space-filling + a cloud around the current best
|
|
43
|
+
const cands = [];
|
|
44
|
+
for (let c = 0; c < 1200; c++) {
|
|
45
|
+
const p = [];
|
|
46
|
+
for (let d = 0; d < D; d++)
|
|
47
|
+
p.push(hal(c * 3 + (seed % 7) + 1, HB[d % HB.length]));
|
|
48
|
+
cands.push(p);
|
|
49
|
+
}
|
|
50
|
+
if (hist.length) {
|
|
51
|
+
const best = hist.reduce((a, b) => (sgn * b.value > sgn * a.value ? b : a));
|
|
52
|
+
const bn = toN(best.experiment);
|
|
53
|
+
for (let c = 0; c < 200; c++)
|
|
54
|
+
cands.push(bn.map((x) => Math.max(0, Math.min(1, x + (rnd() - 0.5) * 0.25))));
|
|
55
|
+
}
|
|
56
|
+
// optimistic value of each candidate: Lipschitz upper bound min_i(v_i + L·dist), normalised to [0,1]
|
|
57
|
+
const npts = hist.map((o) => toN(o.experiment));
|
|
58
|
+
const vals = hist.map((o) => sgn * o.value);
|
|
59
|
+
let ub;
|
|
60
|
+
if (npts.length >= 2) {
|
|
61
|
+
let L = 0;
|
|
62
|
+
for (let i = 0; i < npts.length; i++)
|
|
63
|
+
for (let j = i + 1; j < npts.length; j++) {
|
|
64
|
+
const dx = dst(npts[i], npts[j]);
|
|
65
|
+
if (dx > 1e-9)
|
|
66
|
+
L = Math.max(L, Math.abs(vals[i] - vals[j]) / dx);
|
|
67
|
+
}
|
|
68
|
+
L = (L > 0 ? L : 1e-6) * 1.2;
|
|
69
|
+
ub = cands.map((c) => { let b = Infinity; for (let i = 0; i < npts.length; i++) {
|
|
70
|
+
const v = vals[i] + L * dst(c, npts[i]);
|
|
71
|
+
if (v < b)
|
|
72
|
+
b = v;
|
|
73
|
+
} return b; });
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
ub = cands.map((c) => { let nd = Infinity; for (const p of npts)
|
|
77
|
+
nd = Math.min(nd, dst(c, p)); return npts.length ? nd : 0; }); // cold start: spread out
|
|
78
|
+
}
|
|
79
|
+
const umin = Math.min(...ub), umax = Math.max(...ub), urange = Math.max(1e-9, umax - umin);
|
|
80
|
+
const ubN = ub.map((u) => (u - umin) / urange);
|
|
81
|
+
// greedy pick with diversity penalty: score = value − strongest proximity to an already-picked point
|
|
82
|
+
const picked = [];
|
|
83
|
+
for (let step = 0; step < k; step++) {
|
|
84
|
+
let bestC = -1, bestScore = -Infinity;
|
|
85
|
+
for (let c = 0; c < cands.length; c++) {
|
|
86
|
+
let pen = 0;
|
|
87
|
+
for (const s of picked) {
|
|
88
|
+
const p = Math.exp(-(dst(cands[c], s) ** 2) / (2 * DIV_L * DIV_L));
|
|
89
|
+
if (p > pen)
|
|
90
|
+
pen = p;
|
|
91
|
+
}
|
|
92
|
+
const score = ubN[c] - pen;
|
|
93
|
+
if (score > bestScore) {
|
|
94
|
+
bestScore = score;
|
|
95
|
+
bestC = c;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (bestC < 0)
|
|
99
|
+
break;
|
|
100
|
+
picked.push(cands[bestC]);
|
|
101
|
+
}
|
|
102
|
+
return picked.map(toE);
|
|
103
|
+
}
|
|
104
|
+
// ── gauntlet ──────────────────────────────────────────────────────────────────
|
|
105
|
+
export function batchGauntlet() {
|
|
106
|
+
const space = { dims: [{ name: "x", type: "real", min: 0, max: 1 }, { name: "y", type: "real", min: 0, max: 1 }] };
|
|
107
|
+
const toN = (e) => [e.x ?? 0, e.y ?? 0];
|
|
108
|
+
const pair = (b) => { let m = Infinity; for (let i = 0; i < b.length; i++)
|
|
109
|
+
for (let j = i + 1; j < b.length; j++)
|
|
110
|
+
m = Math.min(m, dst(toN(b[i]), toN(b[j]))); return m; };
|
|
111
|
+
// a TWO-peak landscape: peaks at (0.2,0.2) and (0.8,0.8) — a good batch must cover BOTH, not pile on one
|
|
112
|
+
const pA = [0.2, 0.2], pB = [0.8, 0.8];
|
|
113
|
+
const f = (x, y) => Math.max(Math.exp(-(((x - 0.2) ** 2) + ((y - 0.2) ** 2)) / 0.04), 0.95 * Math.exp(-(((x - 0.8) ** 2) + ((y - 0.8) ** 2)) / 0.04));
|
|
114
|
+
const rnd = lcg(19);
|
|
115
|
+
const obs = [];
|
|
116
|
+
for (let i = 0; i < 40; i++) {
|
|
117
|
+
const x = rnd(), y = rnd();
|
|
118
|
+
obs.push({ experiment: { x, y }, value: f(x, y) });
|
|
119
|
+
}
|
|
120
|
+
const batch = proposeBatch(space, obs, "maximize", 4, 1);
|
|
121
|
+
const returnsK = batch.length === 4;
|
|
122
|
+
const distinct = pair(batch) > 0.1;
|
|
123
|
+
const wellSpread = pair(batch) > 0.25;
|
|
124
|
+
const nearA = batch.some((e) => dst(toN(e), pA) < 0.28);
|
|
125
|
+
const nearB = batch.some((e) => dst(toN(e), pB) < 0.28);
|
|
126
|
+
const coversBoth = nearA && nearB;
|
|
127
|
+
// SINGLE-IS-GREEDY: k=1 returns exactly the first point of the batch (the top-value pick)
|
|
128
|
+
const single = proposeBatch(space, obs, "maximize", 1, 1);
|
|
129
|
+
const singleGreedy = single.length === 1 && dst(toN(single[0]), toN(batch[0])) < 1e-9;
|
|
130
|
+
const det = JSON.stringify(proposeBatch(space, obs, "maximize", 4, 1)) === JSON.stringify(proposeBatch(space, obs, "maximize", 4, 1));
|
|
131
|
+
const total = (() => { try {
|
|
132
|
+
proposeBatch(space, [], "maximize", 5);
|
|
133
|
+
proposeBatch({ dims: [] }, obs, "maximize", 3);
|
|
134
|
+
proposeBatch(space, obs, "maximize", 0);
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return false;
|
|
139
|
+
} })();
|
|
140
|
+
const checks = [
|
|
141
|
+
{ name: "RETURNS-K", pass: returnsK, detail: `asked 4 → got ${batch.length}` },
|
|
142
|
+
{ name: "ALL-DISTINCT", pass: distinct, detail: `min pairwise distance ${pair(batch).toFixed(2)} > 0.1` },
|
|
143
|
+
{ name: "WELL-SPREAD", pass: wellSpread, detail: `not clustered — min pairwise ${pair(batch).toFixed(2)} > 0.25` },
|
|
144
|
+
{ name: "COVERS-BOTH-PEAKS", pass: coversBoth, detail: `batch hits peak A (${nearA}) AND peak B (${nearB}) — diverse, not piled on one` },
|
|
145
|
+
{ name: "SINGLE-IS-GREEDY", pass: singleGreedy, detail: `k=1 == the batch's top pick` },
|
|
146
|
+
{ name: "DETERMINISTIC", pass: det, detail: "same inputs → same batch" },
|
|
147
|
+
{ name: "TOTAL", pass: total, detail: "empty obs / no dims / k=0 never throws" },
|
|
148
|
+
];
|
|
149
|
+
return { score: checks.every((c) => c.pass) ? 100 : 0, checks };
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=batch.js.map
|