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
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SOVEREIGN — the ecosystem spine. Melete is "The Sovereign Verifiable AI Analyst & Optimizer": you bring a
|
|
3
|
+
* system you can MEASURE (an ML pipeline, an infra/DB/network config, a process, a simulation), and in ONE
|
|
4
|
+
* call Melete plays four roles end-to-end and hands back a single, signed, offline-verifiable verdict:
|
|
5
|
+
*
|
|
6
|
+
* ① DISCOVER — find the best setting in the fewest experiments
|
|
7
|
+
* ② DECIDE — the Φ brain's safety-first verdict + AEGIS's ROBUST (survives-the-real-world) answer
|
|
8
|
+
* ③ DIAGNOSE — the analyst's plain-language read: which knobs matter, where the cliffs are, the shape,
|
|
9
|
+
* the achievable ceiling, the family of equally-good recipes
|
|
10
|
+
* ④ CERTIFY — an Ed25519-signed PROVENANCE certificate: a tamper-evident record of WHAT was tested and
|
|
11
|
+
* the result reached, verifiable offline with the embedded public key, no Melete needed
|
|
12
|
+
*
|
|
13
|
+
* This is the product face (one call, one verdict — usable) AND the moat (sovereign + a signed, vendor-
|
|
14
|
+
* neutral verdict FORMAT others must speak to audit it). It runs entirely on the caller's machine.
|
|
15
|
+
*
|
|
16
|
+
* Honest by construction (DIAKRISIS): "verifiable" means PROVENANCE + REPRODUCIBILITY — the certificate
|
|
17
|
+
* proves, offline, exactly what was measured and the result found, and that the signed payload wasn't
|
|
18
|
+
* altered. It is NOT a proof that the customer's code is bug-free or exploit-free (that is undecidable in
|
|
19
|
+
* general and we refuse to fake it). Every facet of the verdict comes from an independently-tested engine.
|
|
20
|
+
*/
|
|
21
|
+
import { createHash, generateKeyPairSync, sign as edSign, verify as edVerify, createPublicKey } from "node:crypto";
|
|
22
|
+
import { meletePrime } from "./prime.js";
|
|
23
|
+
import { analyzeShape } from "./shape.js";
|
|
24
|
+
import { analyzeCliffs } from "./cliff.js";
|
|
25
|
+
import { analyzeSloppiness } from "./sloppiness.js";
|
|
26
|
+
import { assessAchievability } from "./achievability.js";
|
|
27
|
+
import { analyzeRashomon } from "./rashomon.js";
|
|
28
|
+
/** Stable JSON (sorted keys) so the signed payload hashes identically on every machine. */
|
|
29
|
+
function canonical(o) {
|
|
30
|
+
if (o === null || typeof o !== "object")
|
|
31
|
+
return JSON.stringify(o);
|
|
32
|
+
if (Array.isArray(o))
|
|
33
|
+
return "[" + o.map(canonical).join(",") + "]";
|
|
34
|
+
const keys = Object.keys(o).sort();
|
|
35
|
+
return "{" + keys.map((k) => JSON.stringify(k) + ":" + canonical(o[k])).join(",") + "}";
|
|
36
|
+
}
|
|
37
|
+
/** Run the full Sovereign analysis on a finished (or in-progress) run and sign the verdict. */
|
|
38
|
+
export function sovereignAnalyze(obs, space, goal = "maximize", opts = {}) {
|
|
39
|
+
const hist = (obs ?? []).filter((o) => o && o.experiment && Number.isFinite(o.value));
|
|
40
|
+
const sgn = goal === "minimize" ? -1 : 1;
|
|
41
|
+
const best = hist.length ? hist.reduce((a, b) => (sgn * b.value > sgn * a.value ? b : a)) : null;
|
|
42
|
+
const prime = safe(() => meletePrime(hist, space, goal));
|
|
43
|
+
const diagnose = {
|
|
44
|
+
shape: safe(() => analyzeShape(hist, space, goal)),
|
|
45
|
+
cliffs: safe(() => analyzeCliffs(hist, space, goal)),
|
|
46
|
+
sloppiness: safe(() => analyzeSloppiness(hist, space, goal)),
|
|
47
|
+
achievability: typeof opts.target === "number" ? safe(() => assessAchievability(hist, space, opts.target, goal)) : null,
|
|
48
|
+
options: safe(() => analyzeRashomon(hist, space, goal)),
|
|
49
|
+
};
|
|
50
|
+
const decide = prime
|
|
51
|
+
? { processIQ: prime.processIQ ?? NaN, grade: prime.grade ?? "unknown", decision: prime.decisive?.kind ?? "unknown", briefing: prime.briefing ?? "" }
|
|
52
|
+
: { processIQ: NaN, grade: "unknown", decision: "unknown", briefing: "" };
|
|
53
|
+
const payload = {
|
|
54
|
+
product: "Melete — The Sovereign Verifiable AI Analyst & Optimizer",
|
|
55
|
+
discover: { best, evaluations: hist.length, goal },
|
|
56
|
+
decide,
|
|
57
|
+
diagnose,
|
|
58
|
+
verdict: prime?.briefing ? String(prime.briefing).split(". ")[0] : (best ? `best ${(+best.value).toPrecision(4)} in ${hist.length} experiments` : "no measurements yet"),
|
|
59
|
+
};
|
|
60
|
+
// CERTIFY — sign the canonical payload (provenance + reproducibility), verifiable offline
|
|
61
|
+
const kp = opts.keys ?? generateKeyPairSync("ed25519");
|
|
62
|
+
const payloadHash = createHash("sha256").update(canonical(payload)).digest("hex");
|
|
63
|
+
const signature = edSign(null, Buffer.from(payloadHash, "hex"), kp.privateKey).toString("base64");
|
|
64
|
+
const publicKeyPem = kp.publicKey.export({ type: "spki", format: "pem" }).toString();
|
|
65
|
+
const certify = { standard: "melete-sovereign-verdict/v1", payloadHash, signature, publicKeyPem, algo: "ed25519+sha256", issuedAtMs: Math.max(0, Math.floor(opts.issuedAtMs ?? 0)) };
|
|
66
|
+
return { ...payload, certify };
|
|
67
|
+
}
|
|
68
|
+
/** Re-verify a Sovereign Verdict OFFLINE: recompute the payload hash + check the Ed25519 signature. */
|
|
69
|
+
export function verifySovereign(v) {
|
|
70
|
+
try {
|
|
71
|
+
if (!v || !v.certify || v.certify.standard !== "melete-sovereign-verdict/v1")
|
|
72
|
+
return { ok: false, reason: "not a melete-sovereign-verdict/v1 certificate" };
|
|
73
|
+
const { certify, ...payload } = v;
|
|
74
|
+
const hash = createHash("sha256").update(canonical(payload)).digest("hex");
|
|
75
|
+
if (hash !== certify.payloadHash)
|
|
76
|
+
return { ok: false, reason: "payload hash mismatch — the verdict was altered after signing" };
|
|
77
|
+
const pub = createPublicKey(certify.publicKeyPem);
|
|
78
|
+
const ok = edVerify(null, Buffer.from(hash, "hex"), pub, Buffer.from(certify.signature, "base64"));
|
|
79
|
+
return ok ? { ok: true, reason: "signature valid — provenance verified offline" } : { ok: false, reason: "signature does not match the public key" };
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
return { ok: false, reason: "verify error: " + e.message.slice(0, 100) };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function safe(f) { try {
|
|
86
|
+
return f();
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return null;
|
|
90
|
+
} }
|
|
91
|
+
// ── gauntlet ──────────────────────────────────────────────────────────────────
|
|
92
|
+
import { lcg } from "./space.js";
|
|
93
|
+
export function sovereignGauntlet() {
|
|
94
|
+
const space = { dims: [{ name: "x", type: "real", min: 0, max: 1 }, { name: "y", type: "real", min: 0, max: 1 }] };
|
|
95
|
+
const f = (x, y) => Math.exp(-(((x - 0.4) ** 2) + ((y - 0.6) ** 2)) / 0.2);
|
|
96
|
+
const rnd = lcg(7);
|
|
97
|
+
const obs = [];
|
|
98
|
+
for (let i = 0; i < 50; i++) {
|
|
99
|
+
const x = rnd(), y = rnd();
|
|
100
|
+
obs.push({ experiment: { x, y }, value: f(x, y) });
|
|
101
|
+
}
|
|
102
|
+
const kp = generateKeyPairSync("ed25519");
|
|
103
|
+
const v = sovereignAnalyze(obs, space, "maximize", { keys: kp, issuedAtMs: 1000 });
|
|
104
|
+
const composesLayers = !!v.discover && !!v.decide && !!v.diagnose && !!v.certify && !!v.discover.best
|
|
105
|
+
&& !!v.diagnose.shape && !!v.diagnose.cliffs && !!v.diagnose.sloppiness && !!v.diagnose.options;
|
|
106
|
+
const signedVerifies = verifySovereign(v).ok === true;
|
|
107
|
+
// TAMPER: alter the discovered best value → verify must fail
|
|
108
|
+
const tampered = JSON.parse(JSON.stringify(v));
|
|
109
|
+
if (tampered.discover.best)
|
|
110
|
+
tampered.discover.best.value = 999;
|
|
111
|
+
const tamperCaught = verifySovereign(tampered).ok === false;
|
|
112
|
+
// TAMPER the signature itself
|
|
113
|
+
const tampered2 = JSON.parse(JSON.stringify(v));
|
|
114
|
+
tampered2.certify.signature = Buffer.from("nope").toString("base64");
|
|
115
|
+
const sigTamperCaught = verifySovereign(tampered2).ok === false;
|
|
116
|
+
// a DIFFERENT key cannot validate
|
|
117
|
+
const v2 = sovereignAnalyze(obs, space, "maximize", { keys: generateKeyPairSync("ed25519"), issuedAtMs: 1000 });
|
|
118
|
+
const forgedKey = (() => { const swap = JSON.parse(JSON.stringify(v)); swap.certify.publicKeyPem = v2.certify.publicKeyPem; return verifySovereign(swap).ok === false; })();
|
|
119
|
+
// DETERMINISTIC payload (same keys + time → identical signed verdict)
|
|
120
|
+
const v3 = sovereignAnalyze(obs, space, "maximize", { keys: kp, issuedAtMs: 1000 });
|
|
121
|
+
const deterministic = canonical(v) === canonical(v3);
|
|
122
|
+
const usesPrime = v.decide.decision !== "unknown" && Number.isFinite(v.decide.processIQ);
|
|
123
|
+
const total = (() => { try {
|
|
124
|
+
const z = sovereignAnalyze([], space, "maximize");
|
|
125
|
+
verifySovereign(z);
|
|
126
|
+
sovereignAnalyze(null, space);
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return false;
|
|
131
|
+
} })();
|
|
132
|
+
const checks = [
|
|
133
|
+
{ name: "COMPOSES-ALL-4-LAYERS", pass: composesLayers, detail: "discover + decide + diagnose + certify all populated in one verdict" },
|
|
134
|
+
{ name: "SIGNED-VERIFIES-OFFLINE", pass: signedVerifies, detail: "the Ed25519 provenance certificate re-verifies with the embedded public key" },
|
|
135
|
+
{ name: "TAMPER-CAUGHT", pass: tamperCaught, detail: "altering the result after signing breaks verification" },
|
|
136
|
+
{ name: "FORGED-SIGNATURE-CAUGHT", pass: sigTamperCaught, detail: "a fake signature is rejected" },
|
|
137
|
+
{ name: "WRONG-KEY-CANNOT-VALIDATE", pass: forgedKey, detail: "swapping in another key fails verification" },
|
|
138
|
+
{ name: "DECISION-FROM-PRIME-BRAIN", pass: usesPrime, detail: `verdict carries the Φ brain's decision (IQ ${v.decide.processIQ}, "${v.decide.decision}")` },
|
|
139
|
+
{ name: "DETERMINISTIC", pass: deterministic, detail: "same data + keys → byte-identical signed verdict" },
|
|
140
|
+
{ name: "TOTAL", pass: total, detail: "empty / null never throws" },
|
|
141
|
+
];
|
|
142
|
+
return { score: checks.every((c) => c.pass) ? 100 : 0, checks };
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=sovereign.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sovereign.js","sourceRoot":"","sources":["../src/sovereign.ts"],"names":[],"mappings":"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"}
|
package/dist/space.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SEARCH SPACE — the set of experiments the brain may propose.
|
|
3
|
+
*
|
|
4
|
+
* A space is a list of dimensions, each real (continuous) or int (discrete-integer), with bounds. An
|
|
5
|
+
* "experiment" is one point in that space (a Record<dim, number>). The brain proposes experiments; the
|
|
6
|
+
* oracle returns a result per experiment. Deterministic: candidate generation is seeded, so a discovery
|
|
7
|
+
* run is reproducible (which is what makes the signed trace meaningful).
|
|
8
|
+
*/
|
|
9
|
+
export interface Dim {
|
|
10
|
+
name: string;
|
|
11
|
+
type: "real" | "int";
|
|
12
|
+
min: number;
|
|
13
|
+
max: number;
|
|
14
|
+
}
|
|
15
|
+
export interface Space {
|
|
16
|
+
dims: Dim[];
|
|
17
|
+
}
|
|
18
|
+
export type Experiment = Record<string, number>;
|
|
19
|
+
/** Deterministic LCG — reproducible across runs (no Math.random). */
|
|
20
|
+
export declare function lcg(seed: number): () => number;
|
|
21
|
+
export declare function clampExperiment(space: Space, e: Experiment): Experiment;
|
|
22
|
+
/** A coarse grid of `perDim` points per dimension (bounded cartesian) — the cold-start design of experiments. */
|
|
23
|
+
export declare function gridCandidates(space: Space, perDim?: number, cap?: number): Experiment[];
|
|
24
|
+
/** `n` deterministic random candidates (seeded) — the dense candidate pool the acquisition maximises over. */
|
|
25
|
+
export declare function randomCandidates(space: Space, n: number, rnd: () => number): Experiment[];
|
|
26
|
+
/** `n` candidates sampled in a shrinking Gaussian ball around a center — the local refinement that zooms
|
|
27
|
+
* into an optimum (global random candidates alone can't hit a tight target precisely). radius ∈ (0,1] is a
|
|
28
|
+
* fraction of each dimension's span. */
|
|
29
|
+
export declare function localCandidates(space: Space, center: Experiment, n: number, radius: number, rnd: () => number): Experiment[];
|
|
30
|
+
export declare function dist2(space: Space, a: Experiment, b: Experiment): number;
|
|
31
|
+
export declare function spaceGauntlet(): {
|
|
32
|
+
score: 0 | 100;
|
|
33
|
+
checks: Array<{
|
|
34
|
+
name: string;
|
|
35
|
+
pass: boolean;
|
|
36
|
+
}>;
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=space.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"space.d.ts","sourceRoot":"","sources":["../src/space.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,GAAG;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE;AACrF,MAAM,WAAW,KAAK;IAAG,IAAI,EAAE,GAAG,EAAE,CAAA;CAAE;AACtC,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhD,qEAAqE;AACrE,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,MAAM,CAG9C;AAMD,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,GAAG,UAAU,CAIvE;AAED,iHAAiH;AACjH,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,SAAI,EAAE,GAAG,SAAO,GAAG,UAAU,EAAE,CAYjF;AAED,8GAA8G;AAC9G,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,MAAM,GAAG,UAAU,EAAE,CAIzF;AAED;;wCAEwC;AACxC,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,MAAM,GAAG,UAAU,EAAE,CAa5H;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,MAAM,CAExE;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,CAAA;KAAE,CAAC,CAAA;CAAE,CAgBlG"}
|
package/dist/space.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/** Deterministic LCG — reproducible across runs (no Math.random). */
|
|
2
|
+
export function lcg(seed) {
|
|
3
|
+
let s = (seed >>> 0) || 1;
|
|
4
|
+
return () => { s = (Math.imul(s, 1103515245) + 12345) >>> 0; return s / 0xffffffff; };
|
|
5
|
+
}
|
|
6
|
+
const clampDim = (d, v) => {
|
|
7
|
+
const c = Math.max(d.min, Math.min(d.max, v));
|
|
8
|
+
return d.type === "int" ? Math.round(c) : c;
|
|
9
|
+
};
|
|
10
|
+
export function clampExperiment(space, e) {
|
|
11
|
+
const out = {};
|
|
12
|
+
for (const d of space?.dims ?? [])
|
|
13
|
+
out[d.name] = clampDim(d, Number(e?.[d.name]) || d.min);
|
|
14
|
+
return out;
|
|
15
|
+
}
|
|
16
|
+
/** A coarse grid of `perDim` points per dimension (bounded cartesian) — the cold-start design of experiments. */
|
|
17
|
+
export function gridCandidates(space, perDim = 4, cap = 8000) {
|
|
18
|
+
const dims = space?.dims ?? [];
|
|
19
|
+
if (!dims.length)
|
|
20
|
+
return [{}];
|
|
21
|
+
let rows = [{}];
|
|
22
|
+
for (const d of dims) {
|
|
23
|
+
const steps = [];
|
|
24
|
+
const n = Math.max(2, perDim);
|
|
25
|
+
for (let i = 0; i < n; i++)
|
|
26
|
+
steps.push(clampDim(d, d.min + (d.max - d.min) * (i / (n - 1))));
|
|
27
|
+
const next = [];
|
|
28
|
+
for (const r of rows) {
|
|
29
|
+
for (const v of steps) {
|
|
30
|
+
next.push({ ...r, [d.name]: v });
|
|
31
|
+
if (next.length >= cap)
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
if (next.length >= cap)
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
rows = next;
|
|
38
|
+
}
|
|
39
|
+
return rows;
|
|
40
|
+
}
|
|
41
|
+
/** `n` deterministic random candidates (seeded) — the dense candidate pool the acquisition maximises over. */
|
|
42
|
+
export function randomCandidates(space, n, rnd) {
|
|
43
|
+
const dims = space?.dims ?? [];
|
|
44
|
+
const out = [];
|
|
45
|
+
for (let i = 0; i < n; i++) {
|
|
46
|
+
const e = {};
|
|
47
|
+
for (const d of dims)
|
|
48
|
+
e[d.name] = clampDim(d, d.min + (d.max - d.min) * rnd());
|
|
49
|
+
out.push(e);
|
|
50
|
+
}
|
|
51
|
+
return out;
|
|
52
|
+
}
|
|
53
|
+
/** `n` candidates sampled in a shrinking Gaussian ball around a center — the local refinement that zooms
|
|
54
|
+
* into an optimum (global random candidates alone can't hit a tight target precisely). radius ∈ (0,1] is a
|
|
55
|
+
* fraction of each dimension's span. */
|
|
56
|
+
export function localCandidates(space, center, n, radius, rnd) {
|
|
57
|
+
const dims = space?.dims ?? [];
|
|
58
|
+
const out = [];
|
|
59
|
+
for (let i = 0; i < n; i++) {
|
|
60
|
+
const e = {};
|
|
61
|
+
for (const d of dims) {
|
|
62
|
+
const span = d.max - d.min;
|
|
63
|
+
// box-muller-ish via two uniforms → roughly normal jitter, scaled by radius·span
|
|
64
|
+
const g = (rnd() + rnd() + rnd() + rnd() - 2) / 2; // ~N(0, ~0.29), bounded
|
|
65
|
+
e[d.name] = clampDim(d, (Number(center?.[d.name]) || d.min) + g * radius * span);
|
|
66
|
+
}
|
|
67
|
+
out.push(e);
|
|
68
|
+
}
|
|
69
|
+
return out;
|
|
70
|
+
}
|
|
71
|
+
export function dist2(space, a, b) {
|
|
72
|
+
let s = 0;
|
|
73
|
+
for (const d of space?.dims ?? []) {
|
|
74
|
+
const span = (d.max - d.min) || 1;
|
|
75
|
+
const dv = ((Number(a?.[d.name]) || 0) - (Number(b?.[d.name]) || 0)) / span;
|
|
76
|
+
s += dv * dv;
|
|
77
|
+
}
|
|
78
|
+
return s; // normalised squared distance
|
|
79
|
+
}
|
|
80
|
+
// ── gauntlet ──────────────────────────────────────────────────────────────────
|
|
81
|
+
export function spaceGauntlet() {
|
|
82
|
+
const space = { dims: [{ name: "x", type: "real", min: 0, max: 10 }, { name: "k", type: "int", min: 1, max: 5 }] };
|
|
83
|
+
const rnd = lcg(42);
|
|
84
|
+
const grid = gridCandidates(space, 4);
|
|
85
|
+
const gridOK = grid.length === 16 && grid.every((e) => e.x >= 0 && e.x <= 10 && Number.isInteger(e.k) && e.k >= 1 && e.k <= 5);
|
|
86
|
+
const rc = randomCandidates(space, 50, rnd);
|
|
87
|
+
const randOK = rc.length === 50 && rc.every((e) => Number.isInteger(e.k));
|
|
88
|
+
const determinism = JSON.stringify(randomCandidates(space, 5, lcg(7))) === JSON.stringify(randomCandidates(space, 5, lcg(7)));
|
|
89
|
+
const clampOK = clampExperiment(space, { x: 999, k: 99 }).x === 10 && clampExperiment(space, { x: -5, k: 0 }).k === 1;
|
|
90
|
+
const distOK = dist2(space, { x: 0, k: 1 }, { x: 0, k: 1 }) === 0 && dist2(space, { x: 0, k: 1 }, { x: 10, k: 1 }) === 1;
|
|
91
|
+
const total = (() => { try {
|
|
92
|
+
gridCandidates(null);
|
|
93
|
+
randomCandidates(null, 3, rnd);
|
|
94
|
+
clampExperiment(null, {});
|
|
95
|
+
dist2(null, {}, {});
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return false;
|
|
100
|
+
} })();
|
|
101
|
+
const checks = [
|
|
102
|
+
{ name: "GRID", pass: gridOK }, { name: "RANDOM", pass: randOK }, { name: "DETERMINISM", pass: determinism },
|
|
103
|
+
{ name: "CLAMP", pass: clampOK }, { name: "DISTANCE", pass: distOK }, { name: "TOTAL", pass: total },
|
|
104
|
+
];
|
|
105
|
+
return { score: checks.every((c) => c.pass) ? 100 : 0, checks };
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=space.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"space.js","sourceRoot":"","sources":["../src/space.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BREAKTHROUGH RADAR (SURPRISE) — the result the model never saw coming. Optimization quietly assumes the
|
|
3
|
+
* response is well-behaved, so it can miss the most important thing that can happen in a real lab: a setting
|
|
4
|
+
* that performs FAR better (or worse) than everything around it predicts. A surprising high is a possible
|
|
5
|
+
* breakthrough — a sweet spot, a synergy, a regime nobody expected — and it deserves to be chased, not
|
|
6
|
+
* averaged away. A surprising low is a warning — a likely measurement error, or a hidden penalty worth
|
|
7
|
+
* re-checking before you trust it.
|
|
8
|
+
*
|
|
9
|
+
* SURPRISE predicts each measurement from all the OTHERS (a leave-one-out stand-in for your process) and
|
|
10
|
+
* flags the ones whose actual result departs far more than the typical prediction error. It separates them
|
|
11
|
+
* by direction: a big positive surprise is tagged a potential breakthrough to verify and explore around; a
|
|
12
|
+
* big negative one is tagged an anomaly to re-check.
|
|
13
|
+
*
|
|
14
|
+
* Honest by construction (DIAKRISIS): a surprise is a residual outlier against your own data's smooth trend
|
|
15
|
+
* — strong EVIDENCE that a point is special, not proof it's a breakthrough (it could still be a lucky
|
|
16
|
+
* misread; that's exactly why the advice is "verify it"). Distinct from the noise lens (near-neighbour
|
|
17
|
+
* disagreement / meter reliability); this is departure from the global trend. Abstains on thin data.
|
|
18
|
+
*/
|
|
19
|
+
import { type Space } from "./space.js";
|
|
20
|
+
import { type Observation, type Goal } from "./engine.js";
|
|
21
|
+
export interface SurpriseItem {
|
|
22
|
+
at: Record<string, number>;
|
|
23
|
+
value: number;
|
|
24
|
+
expected: number;
|
|
25
|
+
sigma: number;
|
|
26
|
+
direction: "high" | "low";
|
|
27
|
+
}
|
|
28
|
+
export interface SurpriseReport {
|
|
29
|
+
surprises: SurpriseItem[];
|
|
30
|
+
breakthrough: SurpriseItem | null;
|
|
31
|
+
note: string;
|
|
32
|
+
}
|
|
33
|
+
/** Flag measurements that depart far more than usual from what the rest of the data predicts. */
|
|
34
|
+
export declare function analyzeSurprise(obs: ReadonlyArray<Observation>, space: Space, goal?: Goal): SurpriseReport;
|
|
35
|
+
export declare function surpriseGauntlet(): {
|
|
36
|
+
score: 0 | 100;
|
|
37
|
+
checks: Array<{
|
|
38
|
+
name: string;
|
|
39
|
+
pass: boolean;
|
|
40
|
+
detail: string;
|
|
41
|
+
}>;
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=surprise.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surprise.d.ts","sourceRoot":"","sources":["../src/surprise.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,KAAK,KAAK,EAAmB,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,WAAW,YAAY;IAAG,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAA;CAAE;AACvI,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;CACd;AAID,iGAAiG;AACjG,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,GAAE,IAAiB,GAAG,cAAc,CAkDtH;AAKD,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,CA6CrH"}
|
package/dist/surprise.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
const dst = (a, c) => { let s = 0; for (let i = 0; i < a.length; i++)
|
|
2
|
+
s += (a[i] - c[i]) ** 2; return Math.sqrt(s); };
|
|
3
|
+
/** Flag measurements that depart far more than usual from what the rest of the data predicts. */
|
|
4
|
+
export function analyzeSurprise(obs, space, goal = "maximize") {
|
|
5
|
+
const dims = space?.dims ?? [];
|
|
6
|
+
const D = dims.length;
|
|
7
|
+
const hist = (obs ?? []).filter((o) => o && o.experiment && Number.isFinite(o.value));
|
|
8
|
+
const n = hist.length;
|
|
9
|
+
if (D === 0 || n < 8)
|
|
10
|
+
return { surprises: [], breakthrough: null, note: `need ≈8+ measurements to spot surprises (have ${n})` };
|
|
11
|
+
const lo = (i) => dims[i].min ?? 0, hi = (i) => dims[i].max ?? 1;
|
|
12
|
+
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)); });
|
|
13
|
+
const P = hist.map((o) => toN(o.experiment));
|
|
14
|
+
const V = hist.map((o) => o.value);
|
|
15
|
+
const vRange = Math.max(1e-9, Math.max(...V) - Math.min(...V));
|
|
16
|
+
// leave-one-out LOCAL prediction (k nearest neighbours, IDW) → residual for each point.
|
|
17
|
+
// k-nearest (not all points) keeps the prediction on the LOCAL trend, so a point on a smooth slope is
|
|
18
|
+
// predicted well by its neighbours and only a genuine departure stands out — no boundary-bias false alarms.
|
|
19
|
+
const K = Math.min(6, n - 1);
|
|
20
|
+
const resid = [];
|
|
21
|
+
for (let i = 0; i < n; i++) {
|
|
22
|
+
const near = [];
|
|
23
|
+
for (let j = 0; j < n; j++) {
|
|
24
|
+
if (j === i)
|
|
25
|
+
continue;
|
|
26
|
+
near.push({ d: dst(P[i], P[j]), v: V[j] });
|
|
27
|
+
}
|
|
28
|
+
near.sort((a, b) => a.d - b.d);
|
|
29
|
+
// MEDIAN of the k nearest values — robust to a single extreme neighbour, so one outlier doesn't
|
|
30
|
+
// contaminate its neighbours' predictions (which would manufacture phantom surprises).
|
|
31
|
+
const kv = near.slice(0, K).map((x) => x.v).sort((a, b) => a - b);
|
|
32
|
+
const pred = kv.length ? kv[Math.floor(kv.length / 2)] : V[i];
|
|
33
|
+
resid.push(V[i] - pred);
|
|
34
|
+
}
|
|
35
|
+
// robust scale = median absolute residual
|
|
36
|
+
const absR = resid.map((r) => Math.abs(r)).sort((a, b) => a - b);
|
|
37
|
+
const scale = Math.max(1e-9, absR[Math.floor(n / 2)]);
|
|
38
|
+
const items = [];
|
|
39
|
+
for (let i = 0; i < n; i++) {
|
|
40
|
+
const sigma = resid[i] / scale;
|
|
41
|
+
if (Math.abs(sigma) > 4 && Math.abs(resid[i]) > 0.25 * vRange) {
|
|
42
|
+
const at = {};
|
|
43
|
+
dims.forEach((d, k) => { const real = lo(k) + P[i][k] * (hi(k) - lo(k)); at[d.name] = +(d.type === "int" ? Math.round(real) : +real.toFixed(4)); });
|
|
44
|
+
let pred = V[i] - resid[i];
|
|
45
|
+
items.push({ at, value: +V[i].toFixed(6), expected: +pred.toFixed(4), sigma: +Math.abs(sigma).toFixed(1), direction: resid[i] > 0 ? "high" : "low", score: Math.abs(sigma), i });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
items.sort((a, b) => b.score - a.score);
|
|
49
|
+
const surprises = items.slice(0, 5).map(({ at, value, expected, sigma, direction }) => ({ at, value, expected, sigma, direction }));
|
|
50
|
+
// a breakthrough = the strongest surprising HIGH in the goal's favoured direction
|
|
51
|
+
const favHigh = goal !== "minimize";
|
|
52
|
+
const breakthrough = surprises.find((s) => (favHigh ? s.direction === "high" : s.direction === "low")) ?? null;
|
|
53
|
+
const fmt = (x) => (Math.abs(x) < 1 ? +x.toFixed(3) : +x.toFixed(2));
|
|
54
|
+
const note = surprises.length === 0
|
|
55
|
+
? "no surprises — every result is in line with the smooth trend of your data"
|
|
56
|
+
: breakthrough
|
|
57
|
+
? `⭐ possible breakthrough: a result of ${fmt(breakthrough.value)} where the trend predicted ~${fmt(breakthrough.expected)} (${breakthrough.sigma}× the usual surprise). Verify it and explore around it.`
|
|
58
|
+
: `${surprises.length} surprising result${surprises.length > 1 ? "s" : ""} — likely measurement issues; re-check before trusting.`;
|
|
59
|
+
return { surprises, breakthrough, note };
|
|
60
|
+
}
|
|
61
|
+
// ── gauntlet ──────────────────────────────────────────────────────────────────
|
|
62
|
+
import { lcg } from "./space.js";
|
|
63
|
+
export function surpriseGauntlet() {
|
|
64
|
+
const space = { dims: [{ name: "x", type: "real", min: 0, max: 1 }, { name: "y", type: "real", min: 0, max: 1 }] };
|
|
65
|
+
const smooth = (x, y) => 0.5 * (x + y);
|
|
66
|
+
// SMOOTH + one injected BREAKTHROUGH spike far above the trend
|
|
67
|
+
const r1 = lcg(15);
|
|
68
|
+
const o1 = [];
|
|
69
|
+
for (let i = 0; i < 70; i++) {
|
|
70
|
+
const x = r1(), y = r1();
|
|
71
|
+
o1.push({ experiment: { x, y }, value: smooth(x, y) });
|
|
72
|
+
}
|
|
73
|
+
o1.push({ experiment: { x: 0.3, y: 0.3 }, value: smooth(0.3, 0.3) + 0.7 }); // a surprising HIGH at (0.3,0.3)
|
|
74
|
+
const s1 = analyzeSurprise(o1, space, "maximize");
|
|
75
|
+
const detectsHigh = !!s1.breakthrough && s1.breakthrough.direction === "high";
|
|
76
|
+
const locatedRight = !!s1.breakthrough && Math.abs(s1.breakthrough.at.x - 0.3) < 0.08 && Math.abs(s1.breakthrough.at.y - 0.3) < 0.08;
|
|
77
|
+
// PURE SMOOTH → no surprises
|
|
78
|
+
const r2 = lcg(6);
|
|
79
|
+
const o2 = [];
|
|
80
|
+
for (let i = 0; i < 80; i++) {
|
|
81
|
+
const x = r2(), y = r2();
|
|
82
|
+
o2.push({ experiment: { x, y }, value: smooth(x, y) });
|
|
83
|
+
}
|
|
84
|
+
const s2 = analyzeSurprise(o2, space, "maximize");
|
|
85
|
+
const smoothClean = s2.surprises.length === 0 && s2.breakthrough === null;
|
|
86
|
+
// a surprising LOW (anomaly / error), not a breakthrough
|
|
87
|
+
const r3 = lcg(9);
|
|
88
|
+
const o3 = [];
|
|
89
|
+
for (let i = 0; i < 70; i++) {
|
|
90
|
+
const x = r3(), y = r3();
|
|
91
|
+
o3.push({ experiment: { x, y }, value: smooth(x, y) });
|
|
92
|
+
}
|
|
93
|
+
o3.push({ experiment: { x: 0.6, y: 0.6 }, value: smooth(0.6, 0.6) - 0.7 });
|
|
94
|
+
const s3 = analyzeSurprise(o3, space, "maximize");
|
|
95
|
+
const lowIsAnomaly = s3.surprises.length >= 1 && s3.surprises[0].direction === "low" && s3.breakthrough === null;
|
|
96
|
+
// bigger spike → bigger sigma
|
|
97
|
+
const o4 = o1.slice(0, 70).concat([{ experiment: { x: 0.3, y: 0.3 }, value: smooth(0.3, 0.3) + 1.4 }]);
|
|
98
|
+
const s4 = analyzeSurprise(o4, space, "maximize");
|
|
99
|
+
const monotone = !!s4.breakthrough && !!s1.breakthrough && s4.breakthrough.sigma >= s1.breakthrough.sigma - 0.1;
|
|
100
|
+
const det = JSON.stringify(analyzeSurprise(o1, space, "maximize")) === JSON.stringify(analyzeSurprise(o1, space, "maximize"));
|
|
101
|
+
const abstains = analyzeSurprise(o1.slice(0, 5), space, "maximize").note.indexOf("need") >= 0;
|
|
102
|
+
const total = (() => { try {
|
|
103
|
+
analyzeSurprise([], space);
|
|
104
|
+
analyzeSurprise(null, space);
|
|
105
|
+
analyzeSurprise(o1, { dims: [] });
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return false;
|
|
110
|
+
} })();
|
|
111
|
+
const checks = [
|
|
112
|
+
{ name: "DETECTS-BREAKTHROUGH", pass: detectsHigh, detail: `a +0.7 spike on a smooth trend → flagged as a surprising HIGH (${s1.breakthrough?.sigma}×)` },
|
|
113
|
+
{ name: "LOCATES-IT", pass: locatedRight, detail: `breakthrough at (${s1.breakthrough?.at.x}, ${s1.breakthrough?.at.y}) ≈ (0.3, 0.3)` },
|
|
114
|
+
{ name: "SMOOTH-NO-FALSE-SURPRISE", pass: smoothClean, detail: `smooth data → ${s2.surprises.length} surprises (no false alarm)` },
|
|
115
|
+
{ name: "LOW-IS-ANOMALY-NOT-BREAKTHROUGH", pass: lowIsAnomaly, detail: `a surprising LOW → anomaly to re-check, not a breakthrough` },
|
|
116
|
+
{ name: "BIGGER-SPIKE-BIGGER-SIGMA", pass: monotone, detail: `+1.4 spike ≥ +0.7 spike in surprise (${s1.breakthrough?.sigma}→${s4.breakthrough?.sigma})` },
|
|
117
|
+
{ name: "DETERMINISTIC", pass: det, detail: "same data → same surprises" },
|
|
118
|
+
{ name: "ABSTAINS-WHEN-THIN", pass: abstains, detail: "too few measurements → no claim" },
|
|
119
|
+
{ name: "TOTAL", pass: total, detail: "empty / null / no-dims never throws" },
|
|
120
|
+
];
|
|
121
|
+
return { score: checks.every((c) => c.pass) ? 100 : 0, checks };
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=surprise.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surprise.js","sourceRoot":"","sources":["../src/surprise.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TERRITORY — the leap-into-the-unknown detector. Virgin ground no optimizer maps: when the engine hands you
|
|
3
|
+
* the next experiment, is it a SAFE REFINEMENT (sitting inside the region you've already measured, so the
|
|
4
|
+
* prediction is supported by data) or a BOLD LEAP (out beyond everything you've tried, where the score is
|
|
5
|
+
* essentially a guess)?
|
|
6
|
+
*
|
|
7
|
+
* For an expensive or dangerous experiment this is the difference between a routine tweak and a shot in the
|
|
8
|
+
* dark that could waste a batch or stress a machine. Bayesian optimisers deliberately explore into the
|
|
9
|
+
* unknown — but they never TELL the operator "heads up, this one is a leap". TERRITORY does: it measures how
|
|
10
|
+
* far a proposal sits from your data relative to the data's own spacing, classifies it refine / explore /
|
|
11
|
+
* leap, and reports how much of the space you've actually charted (the unexplored gaps).
|
|
12
|
+
*
|
|
13
|
+
* Honest by construction (DIAKRISIS): novelty is relative to YOUR sampling density (a leap means "much
|
|
14
|
+
* farther than your points usually sit from each other", not an absolute safety claim); it abstains with too
|
|
15
|
+
* little data. Decision support for where you're stepping — not a guarantee the leap is bad (leaps are often
|
|
16
|
+
* how you find the big win) or that a refinement is correct.
|
|
17
|
+
*/
|
|
18
|
+
import { type Space, type Experiment } from "./space.js";
|
|
19
|
+
import { type Observation } from "./engine.js";
|
|
20
|
+
export interface TerritoryAssessment {
|
|
21
|
+
classification: "refine" | "explore" | "leap" | "unknown";
|
|
22
|
+
noveltyScore: number;
|
|
23
|
+
nearestDist: number;
|
|
24
|
+
typicalDist: number;
|
|
25
|
+
note: string;
|
|
26
|
+
}
|
|
27
|
+
/** Is `proposal` a safe refinement inside the measured region, or a leap into unmeasured territory? */
|
|
28
|
+
export declare function assessTerritory(proposal: Experiment, obs: ReadonlyArray<Observation>, space: Space): TerritoryAssessment;
|
|
29
|
+
/** Fraction of the search space that has been charted (a coarse grid; how many cells hold a measurement). */
|
|
30
|
+
export declare function coverageScore(obs: ReadonlyArray<Observation>, space: Space): {
|
|
31
|
+
coverage: number;
|
|
32
|
+
cells: number;
|
|
33
|
+
filled: number;
|
|
34
|
+
};
|
|
35
|
+
export declare function territoryGauntlet(): {
|
|
36
|
+
score: 0 | 100;
|
|
37
|
+
checks: Array<{
|
|
38
|
+
name: string;
|
|
39
|
+
pass: boolean;
|
|
40
|
+
detail: string;
|
|
41
|
+
}>;
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=territory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"territory.d.ts","sourceRoot":"","sources":["../src/territory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IAC1D,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAQD,uGAAuG;AACvG,wBAAgB,eAAe,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,mBAAmB,CAkBxH;AAED,6GAA6G;AAC7G,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAShI;AAKD,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,CAiCtH"}
|