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,102 @@
|
|
|
1
|
+
function norm(space, e) {
|
|
2
|
+
return space.dims.map((d) => { const lo = d.min ?? 0, hi = d.max ?? 1; const span = hi - lo || 1; return Math.max(0, Math.min(1, ((+e[d.name] || 0) - lo) / span)); });
|
|
3
|
+
}
|
|
4
|
+
const dist = (a, b) => { let s = 0; for (let i = 0; i < a.length; i++)
|
|
5
|
+
s += (a[i] - b[i]) ** 2; return Math.sqrt(s); };
|
|
6
|
+
const median = (xs) => { if (!xs.length)
|
|
7
|
+
return 0; const s = xs.slice().sort((a, b) => a - b); const m = s.length; return m % 2 ? s[(m - 1) / 2] : (s[m / 2 - 1] + s[m / 2]) / 2; };
|
|
8
|
+
/** Is `proposal` a safe refinement inside the measured region, or a leap into unmeasured territory? */
|
|
9
|
+
export function assessTerritory(proposal, obs, space) {
|
|
10
|
+
const hist = (obs ?? []).filter((o) => o && o.experiment);
|
|
11
|
+
if ((space?.dims?.length ?? 0) === 0 || hist.length < 3 || !proposal) {
|
|
12
|
+
return { classification: "unknown", noveltyScore: 0, nearestDist: 0, typicalDist: 0, note: "not enough measured points yet to judge" };
|
|
13
|
+
}
|
|
14
|
+
const pts = hist.map((o) => norm(space, o.experiment));
|
|
15
|
+
const p = norm(space, proposal);
|
|
16
|
+
const nearestDist = Math.min(...pts.map((q) => dist(p, q)));
|
|
17
|
+
// the data's own spacing: each point's distance to its nearest OTHER point
|
|
18
|
+
const nn = [];
|
|
19
|
+
for (let i = 0; i < pts.length; i++) {
|
|
20
|
+
let m = Infinity;
|
|
21
|
+
for (let j = 0; j < pts.length; j++) {
|
|
22
|
+
if (j !== i) {
|
|
23
|
+
const d = dist(pts[i], pts[j]);
|
|
24
|
+
if (d < m)
|
|
25
|
+
m = d;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (Number.isFinite(m))
|
|
29
|
+
nn.push(m);
|
|
30
|
+
}
|
|
31
|
+
const typicalDist = Math.max(1e-9, median(nn));
|
|
32
|
+
const noveltyScore = nearestDist / typicalDist;
|
|
33
|
+
const classification = noveltyScore < 1.5 ? "refine" : noveltyScore < 3 ? "explore" : "leap";
|
|
34
|
+
const note = classification === "refine" ? "a safe refinement — sits inside the region you've measured"
|
|
35
|
+
: classification === "explore" ? "a step outward — partly beyond your measured points"
|
|
36
|
+
: "a leap into unmeasured territory — the prediction here is largely a guess; proceed with care if the experiment is costly or risky";
|
|
37
|
+
return { classification, noveltyScore: +noveltyScore.toFixed(3), nearestDist: +nearestDist.toFixed(4), typicalDist: +typicalDist.toFixed(4), note };
|
|
38
|
+
}
|
|
39
|
+
/** Fraction of the search space that has been charted (a coarse grid; how many cells hold a measurement). */
|
|
40
|
+
export function coverageScore(obs, space) {
|
|
41
|
+
const dims = space?.dims ?? [];
|
|
42
|
+
const D = dims.length;
|
|
43
|
+
const hist = (obs ?? []).filter((o) => o && o.experiment);
|
|
44
|
+
if (D === 0 || !hist.length)
|
|
45
|
+
return { coverage: 0, cells: 0, filled: 0 };
|
|
46
|
+
const per = Math.max(2, Math.min(6, Math.round(Math.pow(2000, 1 / D)))); // grid resolution, capped so cells stays sane
|
|
47
|
+
const cells = Math.round(Math.pow(per, D));
|
|
48
|
+
const seen = new Set();
|
|
49
|
+
for (const o of hist) {
|
|
50
|
+
const p = norm(space, o.experiment);
|
|
51
|
+
const key = p.map((v) => Math.min(per - 1, Math.floor(v * per))).join(",");
|
|
52
|
+
seen.add(key);
|
|
53
|
+
}
|
|
54
|
+
return { coverage: +(seen.size / cells).toFixed(4), cells, filled: seen.size };
|
|
55
|
+
}
|
|
56
|
+
// ── gauntlet ──────────────────────────────────────────────────────────────────
|
|
57
|
+
import { lcg } from "./space.js";
|
|
58
|
+
export function territoryGauntlet() {
|
|
59
|
+
const space = { dims: [{ name: "x", type: "real", min: 0, max: 1 }, { name: "y", type: "real", min: 0, max: 1 }] };
|
|
60
|
+
// measured data lives ONLY in the lower-left quarter [0,0.5]²
|
|
61
|
+
const rnd = lcg(17);
|
|
62
|
+
const obs = [];
|
|
63
|
+
for (let i = 0; i < 60; i++)
|
|
64
|
+
obs.push({ experiment: { x: rnd() * 0.5, y: rnd() * 0.5 }, value: 0 });
|
|
65
|
+
const inside = assessTerritory({ x: 0.25, y: 0.25 }, obs, space); // dead centre of the data → refine
|
|
66
|
+
const farLeap = assessTerritory({ x: 0.95, y: 0.95 }, obs, space); // opposite corner, far from all data → leap
|
|
67
|
+
const edge = assessTerritory({ x: 0.6, y: 0.6 }, obs, space); // just outside → explore-ish
|
|
68
|
+
const refineInside = inside.classification === "refine";
|
|
69
|
+
const leapFar = farLeap.classification === "leap";
|
|
70
|
+
const monotonic = farLeap.noveltyScore > edge.noveltyScore && edge.noveltyScore > inside.noveltyScore; // novelty grows with distance
|
|
71
|
+
// coverage: data in 1 quarter → low; data spread over the whole space → high
|
|
72
|
+
const covLow = coverageScore(obs, space).coverage < 0.35;
|
|
73
|
+
const rnd2 = lcg(4);
|
|
74
|
+
const full = [];
|
|
75
|
+
for (let i = 0; i < 400; i++)
|
|
76
|
+
full.push({ experiment: { x: rnd2(), y: rnd2() }, value: 0 });
|
|
77
|
+
const covHigh = coverageScore(full, space).coverage > 0.6;
|
|
78
|
+
// deterministic + abstain + total
|
|
79
|
+
const det = JSON.stringify(assessTerritory({ x: 0.95, y: 0.95 }, obs, space)) === JSON.stringify(assessTerritory({ x: 0.95, y: 0.95 }, obs, space));
|
|
80
|
+
const abstains = assessTerritory({ x: 0.5, y: 0.5 }, obs.slice(0, 2), space).classification === "unknown";
|
|
81
|
+
const total = (() => { try {
|
|
82
|
+
assessTerritory(null, obs, space);
|
|
83
|
+
assessTerritory({ x: 0 }, [], space);
|
|
84
|
+
coverageScore(null, space);
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return false;
|
|
89
|
+
} })();
|
|
90
|
+
const checks = [
|
|
91
|
+
{ name: "REFINE-INSIDE", pass: refineInside, detail: `a point inside the measured region is "refine" (novelty ${inside.noveltyScore})` },
|
|
92
|
+
{ name: "LEAP-FAR", pass: leapFar, detail: `a point far beyond the data is "leap" (novelty ${farLeap.noveltyScore})` },
|
|
93
|
+
{ name: "NOVELTY-MONOTONIC", pass: monotonic, detail: `novelty grows with distance from data (${inside.noveltyScore} < ${edge.noveltyScore} < ${farLeap.noveltyScore})` },
|
|
94
|
+
{ name: "COVERAGE-LOW-WHEN-CLUSTERED", pass: covLow, detail: `data in one quarter → low coverage (${coverageScore(obs, space).coverage})` },
|
|
95
|
+
{ name: "COVERAGE-HIGH-WHEN-SPREAD", pass: covHigh, detail: `data over the whole space → high coverage (${coverageScore(full, space).coverage})` },
|
|
96
|
+
{ name: "DETERMINISTIC", pass: det, detail: "same proposal + data → same assessment" },
|
|
97
|
+
{ name: "ABSTAINS-WHEN-THIN", pass: abstains, detail: "fewer than 3 measured points → unknown" },
|
|
98
|
+
{ name: "TOTAL", pass: total, detail: "null / empty never throws" },
|
|
99
|
+
];
|
|
100
|
+
return { score: checks.every((c) => c.pass) ? 100 : 0, checks };
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=territory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"territory.js","sourceRoot":"","sources":["../src/territory.ts"],"names":[],"mappings":"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"}
|
package/dist/trace.d.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DISCOVERY TRACE — the moat. A signed, hash-chained, offline-verifiable record of HOW a discovery was
|
|
3
|
+
* made: every hypothesis (proposed experiment + the brain's rationale), every observation, every update,
|
|
4
|
+
* in causal order. Anyone — a reviewer, a regulator, a journal, an acquirer, a competitor — can verify
|
|
5
|
+
* OFFLINE, with the public key alone (no Melete, no network, no shared secret), that:
|
|
6
|
+
* • the trace was produced by the holder of the private key (Ed25519 signatures),
|
|
7
|
+
* • not one frame was altered or reordered (a sha-256 hash chain: each frame commits to the previous),
|
|
8
|
+
* • and, given the same seed + oracle, the run reproduces exactly (the engine is deterministic).
|
|
9
|
+
*
|
|
10
|
+
* Self-driving labs and Bayesian optimisation exist; a CRYPTOGRAPHIC, reproducible PROVENANCE-OF-DISCOVERY
|
|
11
|
+
* trail does not. That is the composition Melete owns: discovery you can prove, not just discovery.
|
|
12
|
+
*/
|
|
13
|
+
import { type KeyObject } from "node:crypto";
|
|
14
|
+
export type FrameKind = "genesis" | "hypothesis" | "observation" | "result";
|
|
15
|
+
export interface Frame {
|
|
16
|
+
seq: number;
|
|
17
|
+
kind: FrameKind;
|
|
18
|
+
payload: unknown;
|
|
19
|
+
prevHash: string;
|
|
20
|
+
hash: string;
|
|
21
|
+
sig: string;
|
|
22
|
+
}
|
|
23
|
+
export interface SignedTrace {
|
|
24
|
+
publicKeyPem: string;
|
|
25
|
+
algo: "ed25519+sha256-chain";
|
|
26
|
+
frames: Frame[];
|
|
27
|
+
}
|
|
28
|
+
/** A tamper-evident recorder. Holds a private key; every record() appends a signed, chained frame. */
|
|
29
|
+
export declare class Tracer {
|
|
30
|
+
private priv;
|
|
31
|
+
private pub;
|
|
32
|
+
private frames;
|
|
33
|
+
private prev;
|
|
34
|
+
constructor(keys?: {
|
|
35
|
+
privateKey: KeyObject;
|
|
36
|
+
publicKey: KeyObject;
|
|
37
|
+
});
|
|
38
|
+
record(kind: FrameKind, payload: unknown): Frame;
|
|
39
|
+
get publicKeyPem(): string;
|
|
40
|
+
export(): SignedTrace;
|
|
41
|
+
}
|
|
42
|
+
export interface VerifyResult {
|
|
43
|
+
ok: boolean;
|
|
44
|
+
frames: number;
|
|
45
|
+
brokenAt: number | null;
|
|
46
|
+
reason: string;
|
|
47
|
+
}
|
|
48
|
+
/** Re-verify a trace OFFLINE with the embedded public key: signatures + hash chain + ordering. */
|
|
49
|
+
export declare function verifyTrace(trace: SignedTrace): VerifyResult;
|
|
50
|
+
export declare function traceGauntlet(): {
|
|
51
|
+
score: 0 | 100;
|
|
52
|
+
checks: Array<{
|
|
53
|
+
name: string;
|
|
54
|
+
pass: boolean;
|
|
55
|
+
detail: string;
|
|
56
|
+
}>;
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=trace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAwF,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAEnI,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,YAAY,GAAG,aAAa,GAAG,QAAQ,CAAC;AAC5E,MAAM,WAAW,KAAK;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE;AACtH,MAAM,WAAW,WAAW;IAAG,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,sBAAsB,CAAC;IAAC,MAAM,EAAE,KAAK,EAAE,CAAA;CAAE;AAMpG,sGAAsG;AACtG,qBAAa,MAAM;IACjB,OAAO,CAAC,IAAI,CAAY;IAAC,OAAO,CAAC,GAAG,CAAY;IAAC,OAAO,CAAC,MAAM,CAAe;IAAC,OAAO,CAAC,IAAI,CAAkB;gBACjG,IAAI,CAAC,EAAE;QAAE,UAAU,EAAE,SAAS,CAAC;QAAC,SAAS,EAAE,SAAS,CAAA;KAAE;IAKlE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,KAAK;IAOhD,IAAI,YAAY,IAAI,MAAM,CAAwE;IAClG,MAAM,IAAI,WAAW;CACtB;AAED,MAAM,WAAW,YAAY;IAAG,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AACtG,kGAAkG;AAClG,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,CAiB5D;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,CAyBlH"}
|
package/dist/trace.js
ADDED
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TRANSFER / WARM-START — the brain that remembers, and gets smarter every time. Real labs don't optimize a
|
|
3
|
+
* brand-new process from scratch each morning; they run things that RHYME with what they ran before — the
|
|
4
|
+
* same assay on a new compound, the same kiln with a new clay, the same model on a new dataset. A
|
|
5
|
+
* from-scratch optimizer throws that history away and re-discovers the obvious. TRANSFER doesn't: it mines a
|
|
6
|
+
* prior run for the regions that worked and starts the new search THERE, so you spend your first precious
|
|
7
|
+
* experiments near the answer instead of wandering.
|
|
8
|
+
*
|
|
9
|
+
* warmStartSeeds pulls the diverse high-value settings out of a prior run; transferDiscover evaluates those
|
|
10
|
+
* first on the new process, then continues the normal propose-measure loop. When the new problem is similar
|
|
11
|
+
* to the old one, you reach a strong result in far fewer NEW experiments.
|
|
12
|
+
*
|
|
13
|
+
* Honest by construction (DIAKRISIS): transfer helps to the extent the new problem RESEMBLES the prior one —
|
|
14
|
+
* the seeds are the prior's promising regions, re-measured on the new process (never assumed). If the new
|
|
15
|
+
* optimum has moved far away, the seeds simply don't score well and the normal search takes over — no harm,
|
|
16
|
+
* no false speed-up. The gauntlet measures the advantage on a genuinely similar problem, head-to-head
|
|
17
|
+
* against a cold start; it abstains (falls back to cold) when there's no usable prior.
|
|
18
|
+
*/
|
|
19
|
+
import { type Space, type Experiment } from "./space.js";
|
|
20
|
+
import { type Observation, type Goal } from "./engine.js";
|
|
21
|
+
/** The diverse, high-value settings from a prior run — the regions worth re-checking on a similar new process. */
|
|
22
|
+
export declare function warmStartSeeds(priorObs: ReadonlyArray<Observation>, space: Space, goal?: Goal, k?: number): Experiment[];
|
|
23
|
+
export interface TransferResult {
|
|
24
|
+
best: Observation;
|
|
25
|
+
evaluations: number;
|
|
26
|
+
warmStarted: boolean;
|
|
27
|
+
obs: Observation[];
|
|
28
|
+
}
|
|
29
|
+
/** Run a discovery on a NEW process, warm-started from a prior (similar) run's promising regions. */
|
|
30
|
+
export declare function transferDiscover(opts: {
|
|
31
|
+
space: Space;
|
|
32
|
+
oracle: (e: Experiment) => number;
|
|
33
|
+
priorObs?: ReadonlyArray<Observation>;
|
|
34
|
+
budget: number;
|
|
35
|
+
goal?: Goal;
|
|
36
|
+
seed?: number;
|
|
37
|
+
}): TransferResult;
|
|
38
|
+
export declare function transferGauntlet(): {
|
|
39
|
+
score: 0 | 100;
|
|
40
|
+
checks: Array<{
|
|
41
|
+
name: string;
|
|
42
|
+
pass: boolean;
|
|
43
|
+
detail: string;
|
|
44
|
+
}>;
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=transfer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../src/transfer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAK1D,kHAAkH;AAClH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,aAAa,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,GAAE,IAAiB,EAAE,CAAC,SAAI,GAAG,UAAU,EAAE,CAe/H;AAED,MAAM,WAAW,cAAc;IAAG,IAAI,EAAE,WAAW,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,WAAW,EAAE,CAAA;CAAE;AAEpH,qGAAqG;AACrG,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,cAAc,CAY7L;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/transfer.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { proposeNext } from "./interactive.js";
|
|
2
|
+
const dst = (a, c) => { let s = 0; for (let i = 0; i < a.length; i++)
|
|
3
|
+
s += (a[i] - c[i]) ** 2; return Math.sqrt(s); };
|
|
4
|
+
/** The diverse, high-value settings from a prior run — the regions worth re-checking on a similar new process. */
|
|
5
|
+
export function warmStartSeeds(priorObs, space, goal = "maximize", k = 4) {
|
|
6
|
+
const dims = space?.dims ?? [];
|
|
7
|
+
const D = dims.length;
|
|
8
|
+
const hist = (priorObs ?? []).filter((o) => o && o.experiment && Number.isFinite(o.value));
|
|
9
|
+
if (!D || !hist.length)
|
|
10
|
+
return [];
|
|
11
|
+
const sgn = goal === "minimize" ? -1 : 1;
|
|
12
|
+
const lo = (i) => dims[i].min ?? 0, hi = (i) => dims[i].max ?? 1;
|
|
13
|
+
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)); });
|
|
14
|
+
const ranked = hist.map((o) => ({ o, p: toN(o.experiment), v: sgn * o.value })).sort((a, b) => b.v - a.v);
|
|
15
|
+
const kept = [];
|
|
16
|
+
const seeds = [];
|
|
17
|
+
for (const r of ranked) {
|
|
18
|
+
if (kept.some((p) => dst(p, r.p) < 0.2))
|
|
19
|
+
continue; // keep them genuinely different
|
|
20
|
+
kept.push(r.p);
|
|
21
|
+
seeds.push(r.o.experiment);
|
|
22
|
+
if (seeds.length >= Math.max(1, Math.min(16, Math.floor(k))))
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
return seeds;
|
|
26
|
+
}
|
|
27
|
+
/** Run a discovery on a NEW process, warm-started from a prior (similar) run's promising regions. */
|
|
28
|
+
export function transferDiscover(opts) {
|
|
29
|
+
const goal = opts.goal ?? "maximize";
|
|
30
|
+
const sgn = goal === "minimize" ? -1 : 1;
|
|
31
|
+
const budget = Math.max(1, Math.floor(opts.budget));
|
|
32
|
+
const seed = (opts.seed ?? 1) | 0;
|
|
33
|
+
const obs = [];
|
|
34
|
+
let best = { experiment: {}, value: goal === "minimize" ? Infinity : -Infinity };
|
|
35
|
+
const take = (e) => { const v = opts.oracle(e); const o = { experiment: e, value: v }; obs.push(o); if (sgn * v > sgn * best.value)
|
|
36
|
+
best = o; };
|
|
37
|
+
const seeds = warmStartSeeds(opts.priorObs ?? [], opts.space, goal, Math.ceil(budget / 2));
|
|
38
|
+
const warmStarted = seeds.length > 0;
|
|
39
|
+
for (const s of seeds) {
|
|
40
|
+
if (obs.length >= budget)
|
|
41
|
+
break;
|
|
42
|
+
take(s);
|
|
43
|
+
}
|
|
44
|
+
while (obs.length < budget) {
|
|
45
|
+
take(proposeNext(opts.space, obs, goal, seed + obs.length));
|
|
46
|
+
}
|
|
47
|
+
return { best, evaluations: obs.length, warmStarted, obs };
|
|
48
|
+
}
|
|
49
|
+
// ── gauntlet ──────────────────────────────────────────────────────────────────
|
|
50
|
+
import { lcg } from "./space.js";
|
|
51
|
+
export function transferGauntlet() {
|
|
52
|
+
const space = { dims: [{ name: "x", type: "real", min: 0, max: 1 }, { name: "y", type: "real", min: 0, max: 1 }] };
|
|
53
|
+
// a NARROW peak — hard to find cold in a small budget, easy if you already know roughly where it is
|
|
54
|
+
const peakAt = (cx, cy) => (x, y) => Math.exp(-(((x - cx) ** 2) + ((y - cy) ** 2)) / 0.004);
|
|
55
|
+
const f1 = peakAt(0.70, 0.70); // the PRIOR process
|
|
56
|
+
const f2 = peakAt(0.73, 0.72); // the NEW process — SIMILAR (optimum nearby)
|
|
57
|
+
// a prior run that found f1's peak
|
|
58
|
+
const rp = lcg(11);
|
|
59
|
+
const prior = [];
|
|
60
|
+
for (let i = 0; i < 40; i++) {
|
|
61
|
+
const x = rp(), y = rp();
|
|
62
|
+
prior.push({ experiment: { x, y }, value: f1(x, y) });
|
|
63
|
+
}
|
|
64
|
+
for (let i = 0; i < 6; i++)
|
|
65
|
+
prior.push({ experiment: { x: 0.70 + (rp() - 0.5) * 0.04, y: 0.70 + (rp() - 0.5) * 0.04 }, value: f1(0.70, 0.70) });
|
|
66
|
+
const B = 10;
|
|
67
|
+
const cold = transferDiscover({ space, oracle: (e) => f2(e.x ?? 0, e.y ?? 0), budget: B, goal: "maximize", seed: 3 });
|
|
68
|
+
const warm = transferDiscover({ space, oracle: (e) => f2(e.x ?? 0, e.y ?? 0), priorObs: prior, budget: B, goal: "maximize", seed: 3 });
|
|
69
|
+
const warmFaster = warm.best.value > cold.best.value + 0.05; // at a small budget, warm reaches a better result
|
|
70
|
+
const warmGood = warm.best.value > 0.7; // it actually nails the new (nearby) peak
|
|
71
|
+
const usedSeeds = warm.warmStarted && !cold.warmStarted;
|
|
72
|
+
const seeds = warmStartSeeds(prior, space, "maximize", 4);
|
|
73
|
+
const seedNearPrior = seeds.some((s) => Math.abs((s.x ?? 0) - 0.70) < 0.1 && Math.abs((s.y ?? 0) - 0.70) < 0.1);
|
|
74
|
+
// diverse seeds on a two-region prior
|
|
75
|
+
const rp2 = lcg(5);
|
|
76
|
+
const prior2 = [];
|
|
77
|
+
for (let i = 0; i < 40; i++) {
|
|
78
|
+
const x = rp2(), y = rp2();
|
|
79
|
+
const v = Math.max(peakAt(0.2, 0.2)(x, y), peakAt(0.8, 0.8)(x, y));
|
|
80
|
+
prior2.push({ experiment: { x, y }, value: v });
|
|
81
|
+
}
|
|
82
|
+
for (let i = 0; i < 6; i++) {
|
|
83
|
+
prior2.push({ experiment: { x: 0.2, y: 0.2 }, value: 1 });
|
|
84
|
+
prior2.push({ experiment: { x: 0.8, y: 0.8 }, value: 1 });
|
|
85
|
+
}
|
|
86
|
+
const seeds2 = warmStartSeeds(prior2, space, "maximize", 4);
|
|
87
|
+
const seedsDiverse = seeds2.length >= 2 && Math.abs((seeds2[0].x ?? 0) - (seeds2[1].x ?? 0)) > 0.4;
|
|
88
|
+
const noPrior = transferDiscover({ space, oracle: (e) => f2(e.x ?? 0, e.y ?? 0), budget: B, goal: "maximize", seed: 3 });
|
|
89
|
+
const fallsBack = noPrior.warmStarted === false && noPrior.evaluations === B;
|
|
90
|
+
const det = transferDiscover({ space, oracle: (e) => f2(e.x ?? 0, e.y ?? 0), priorObs: prior, budget: B, seed: 3 }).best.value === warm.best.value;
|
|
91
|
+
const total = (() => { try {
|
|
92
|
+
warmStartSeeds([], space);
|
|
93
|
+
transferDiscover({ space, oracle: () => 0, budget: 3 });
|
|
94
|
+
warmStartSeeds(null, { dims: [] });
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return false;
|
|
99
|
+
} })();
|
|
100
|
+
const checks = [
|
|
101
|
+
{ name: "WARM-START-FASTER", pass: warmFaster, detail: `at budget ${B}: warm best ${warm.best.value.toFixed(3)} > cold best ${cold.best.value.toFixed(3)}` },
|
|
102
|
+
{ name: "REACHES-NEW-OPTIMUM", pass: warmGood, detail: `warm start nails the nearby new peak (${warm.best.value.toFixed(3)})` },
|
|
103
|
+
{ name: "USES-PRIOR-SEEDS", pass: usedSeeds, detail: "warm run is seeded from prior; cold run isn't" },
|
|
104
|
+
{ name: "SEEDS-NEAR-PRIOR-OPTIMUM", pass: seedNearPrior, detail: "the seeds include the prior's best region (≈0.70,0.70)" },
|
|
105
|
+
{ name: "SEEDS-DIVERSE", pass: seedsDiverse, detail: `two-region prior → spread-out seeds (x ${seeds2[0]?.x?.toFixed(2)} vs ${seeds2[1]?.x?.toFixed(2)})` },
|
|
106
|
+
{ name: "FALLS-BACK-WHEN-NO-PRIOR", pass: fallsBack, detail: "no prior → ordinary cold start, no false speed-up" },
|
|
107
|
+
{ name: "DETERMINISTIC", pass: det, detail: "same prior + seed → same result" },
|
|
108
|
+
{ name: "TOTAL", pass: total, detail: "empty / null / no-dims never throws" },
|
|
109
|
+
];
|
|
110
|
+
return { score: checks.every((c) => c.pass) ? 100 : 0, checks };
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=transfer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../src/transfer.ts"],"names":[],"mappings":"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"}
|
package/dist/twin.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WHAT-IF TWIN — let anyone poke the result without paying for an experiment. Once Melete has watched your
|
|
3
|
+
* process a few times, it has effectively learned a cheap stand-in for it — a digital twin. So a
|
|
4
|
+
* non-technical user can simply ask "what if I set the temperature to 90 and the dose to 19?" and get an
|
|
5
|
+
* instant predicted score — together with the one thing every other predictor hides: HOW MUCH TO TRUST IT.
|
|
6
|
+
*
|
|
7
|
+
* Near settings you've actually measured, the twin is confident and accurate. Far from your data it says so
|
|
8
|
+
* out loud — "this is a guess" — instead of pretending. That honesty is the whole point: a prediction you
|
|
9
|
+
* can't trust is worse than no prediction, so the twin grades its own confidence by how close your question
|
|
10
|
+
* is to real evidence.
|
|
11
|
+
*
|
|
12
|
+
* Honest by construction (DIAKRISIS): the prediction is inverse-distance interpolation of your real
|
|
13
|
+
* measurements (it can't conjure structure that isn't in the data), and confidence is graded purely by
|
|
14
|
+
* distance to the nearest evidence relative to your data's own spacing. The gauntlet proves it with
|
|
15
|
+
* leave-one-out cross-validation (accurate where data is dense) AND that it flags far-away queries as
|
|
16
|
+
* guesses (honest where data is absent). It abstains entirely when there's too little data to stand in for
|
|
17
|
+
* anything.
|
|
18
|
+
*/
|
|
19
|
+
import { type Space, type Experiment } from "./space.js";
|
|
20
|
+
import { type Observation } from "./engine.js";
|
|
21
|
+
export interface WhatIfReport {
|
|
22
|
+
predicted: number;
|
|
23
|
+
confidence: "measured" | "confident" | "rough" | "guess" | "unknown";
|
|
24
|
+
uncertainty: number;
|
|
25
|
+
nearestKnown: {
|
|
26
|
+
distance: number;
|
|
27
|
+
value: number;
|
|
28
|
+
} | null;
|
|
29
|
+
note: string;
|
|
30
|
+
}
|
|
31
|
+
/** Predict the score at a proposed setting from the measurements so far, with an honest confidence grade. */
|
|
32
|
+
export declare function predictAt(obs: ReadonlyArray<Observation>, space: Space, query: Experiment): WhatIfReport;
|
|
33
|
+
export declare function twinGauntlet(): {
|
|
34
|
+
score: 0 | 100;
|
|
35
|
+
checks: Array<{
|
|
36
|
+
name: string;
|
|
37
|
+
pass: boolean;
|
|
38
|
+
detail: string;
|
|
39
|
+
}>;
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=twin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"twin.d.ts","sourceRoot":"","sources":["../src/twin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;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,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,UAAU,GAAG,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACzD,IAAI,EAAE,MAAM,CAAC;CACd;AAID,6GAA6G;AAC7G,wBAAgB,SAAS,CAAC,GAAG,EAAE,aAAa,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,GAAG,YAAY,CAkCxG;AAKD,wBAAgB,YAAY,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,CA4CjH"}
|
package/dist/twin.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
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
|
+
/** Predict the score at a proposed setting from the measurements so far, with an honest confidence grade. */
|
|
4
|
+
export function predictAt(obs, space, query) {
|
|
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 < 4 || !query) {
|
|
10
|
+
return { predicted: NaN, confidence: "unknown", uncertainty: NaN, nearestKnown: null, note: `need ≈4+ measurements before the twin can predict (have ${n})` };
|
|
11
|
+
}
|
|
12
|
+
const lo = (i) => dims[i].min ?? 0, hi = (i) => dims[i].max ?? 1;
|
|
13
|
+
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)); });
|
|
14
|
+
const npts = hist.map((o) => toN(o.experiment));
|
|
15
|
+
const vals = hist.map((o) => o.value);
|
|
16
|
+
const q = toN(query);
|
|
17
|
+
// inverse-distance-weighted prediction (Shepard)
|
|
18
|
+
let sw = 0, swv = 0, dmin = Infinity, nearVal = vals[0];
|
|
19
|
+
for (let i = 0; i < n; i++) {
|
|
20
|
+
const d = dst(q, npts[i]);
|
|
21
|
+
if (d < dmin) {
|
|
22
|
+
dmin = d;
|
|
23
|
+
nearVal = vals[i];
|
|
24
|
+
}
|
|
25
|
+
const w = 1 / (d * d + 1e-9);
|
|
26
|
+
sw += w;
|
|
27
|
+
swv += w * vals[i];
|
|
28
|
+
}
|
|
29
|
+
const predicted = swv / sw;
|
|
30
|
+
// data's own spacing: median nearest-neighbour distance
|
|
31
|
+
const nn = [];
|
|
32
|
+
for (let i = 0; i < n; i++) {
|
|
33
|
+
let m = Infinity;
|
|
34
|
+
for (let j = 0; j < n; j++)
|
|
35
|
+
if (j !== i)
|
|
36
|
+
m = Math.min(m, dst(npts[i], npts[j]));
|
|
37
|
+
nn.push(m);
|
|
38
|
+
}
|
|
39
|
+
const sortedNN = nn.slice().sort((a, b) => a - b);
|
|
40
|
+
const spacing = Math.max(1e-6, sortedNN[Math.floor(sortedNN.length / 2)]);
|
|
41
|
+
const vRange = Math.max(1e-9, Math.max(...vals) - Math.min(...vals));
|
|
42
|
+
const ratio = dmin / spacing; // how far the query is, in units of normal spacing
|
|
43
|
+
const uncertainty = +(vRange * (1 - Math.exp(-(ratio * ratio) / 2))).toFixed(4);
|
|
44
|
+
const confidence = ratio < 0.4 ? "measured" : ratio < 1.2 ? "confident" : ratio < 2.5 ? "rough" : "guess";
|
|
45
|
+
const f = (x) => (Math.abs(x) < 1 ? +x.toFixed(3) : +x.toFixed(2));
|
|
46
|
+
const note = confidence === "measured" ? `≈ ${f(predicted)} — you've measured almost exactly here, so this is reliable`
|
|
47
|
+
: confidence === "confident" ? `≈ ${f(predicted)} ± ${f(uncertainty)} — close to settings you've tested, fairly reliable`
|
|
48
|
+
: confidence === "rough" ? `≈ ${f(predicted)} ± ${f(uncertainty)} — a rough estimate; you haven't tested near here`
|
|
49
|
+
: `≈ ${f(predicted)} but this is a GUESS — far from anything you've measured; test it before trusting it`;
|
|
50
|
+
return { predicted: +predicted.toFixed(6), confidence, uncertainty, nearestKnown: { distance: +dmin.toFixed(4), value: +nearVal.toFixed(6) }, note };
|
|
51
|
+
}
|
|
52
|
+
// ── gauntlet ──────────────────────────────────────────────────────────────────
|
|
53
|
+
import { lcg } from "./space.js";
|
|
54
|
+
export function twinGauntlet() {
|
|
55
|
+
const space = { dims: [{ name: "x", type: "real", min: 0, max: 1 }, { name: "y", type: "real", min: 0, max: 1 }] };
|
|
56
|
+
const f = (x, y) => 0.5 * (x + y) + 0.15 * Math.sin(3 * x); // smooth, spans a clear range
|
|
57
|
+
const rnd = lcg(13);
|
|
58
|
+
const obs = [];
|
|
59
|
+
for (let i = 0; i < 90; i++) {
|
|
60
|
+
const x = rnd(), y = rnd();
|
|
61
|
+
obs.push({ experiment: { x, y }, value: f(x, y) });
|
|
62
|
+
}
|
|
63
|
+
// ACCURATE-IN-REGION: leave-one-out cross-validation — predict each point from the OTHERS, mean error small
|
|
64
|
+
let sumErr = 0, cnt = 0;
|
|
65
|
+
for (let i = 0; i < obs.length; i += 3) {
|
|
66
|
+
const rest = obs.filter((_, j) => j !== i);
|
|
67
|
+
const r = predictAt(rest, space, obs[i].experiment);
|
|
68
|
+
if (Number.isFinite(r.predicted)) {
|
|
69
|
+
sumErr += Math.abs(r.predicted - obs[i].value);
|
|
70
|
+
cnt++;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const cvErr = sumErr / cnt;
|
|
74
|
+
const accurate = cvErr < 0.05;
|
|
75
|
+
// CONFIDENT-NEAR-DATA: query an actual measured point → high confidence + prediction ≈ truth
|
|
76
|
+
const probe = obs[10];
|
|
77
|
+
const near = predictAt(obs, space, probe.experiment);
|
|
78
|
+
const confidentNear = (near.confidence === "measured" || near.confidence === "confident") && Math.abs(near.predicted - probe.value) < 0.05;
|
|
79
|
+
// HONEST-FAR: a query far outside the sampled cloud → flagged a guess, big uncertainty
|
|
80
|
+
// (sample only the lower-left; ask about the far corner)
|
|
81
|
+
const corner = [];
|
|
82
|
+
const r2 = lcg(4);
|
|
83
|
+
for (let i = 0; i < 60; i++) {
|
|
84
|
+
const x = r2() * 0.3, y = r2() * 0.3;
|
|
85
|
+
corner.push({ experiment: { x, y }, value: f(x, y) });
|
|
86
|
+
}
|
|
87
|
+
const far = predictAt(corner, space, { x: 0.95, y: 0.95 });
|
|
88
|
+
const honestFar = far.confidence === "guess" && far.uncertainty > 0.05;
|
|
89
|
+
// MONOTONE-UNCERTAINTY: farther from data → not-smaller uncertainty
|
|
90
|
+
const u1 = predictAt(corner, space, { x: 0.2, y: 0.2 }).uncertainty;
|
|
91
|
+
const u2 = predictAt(corner, space, { x: 0.6, y: 0.6 }).uncertainty;
|
|
92
|
+
const u3 = predictAt(corner, space, { x: 0.95, y: 0.95 }).uncertainty;
|
|
93
|
+
const monotone = u2 >= u1 - 1e-9 && u3 >= u2 - 1e-9;
|
|
94
|
+
const det = JSON.stringify(predictAt(obs, space, { x: 0.5, y: 0.5 })) === JSON.stringify(predictAt(obs, space, { x: 0.5, y: 0.5 }));
|
|
95
|
+
const abstains = predictAt(obs.slice(0, 3), space, { x: 0.5, y: 0.5 }).confidence === "unknown";
|
|
96
|
+
const total = (() => { try {
|
|
97
|
+
predictAt(null, space, { x: 0 });
|
|
98
|
+
predictAt([], space, { x: 0 });
|
|
99
|
+
predictAt(obs, space, null);
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return false;
|
|
104
|
+
} })();
|
|
105
|
+
const checks = [
|
|
106
|
+
{ name: "ACCURATE-IN-REGION", pass: accurate, detail: `leave-one-out mean error ${cvErr.toFixed(4)} < 0.05` },
|
|
107
|
+
{ name: "CONFIDENT-NEAR-DATA", pass: confidentNear, detail: `at a measured point → "${near.confidence}", predicted ${near.predicted.toFixed(3)} vs true ${probe.value.toFixed(3)}` },
|
|
108
|
+
{ name: "HONEST-WHEN-FAR", pass: honestFar, detail: `far corner → "${far.confidence}" (±${far.uncertainty}) — owns up that it's guessing` },
|
|
109
|
+
{ name: "UNCERTAINTY-GROWS-WITH-DISTANCE", pass: monotone, detail: `± rises as you leave the data (${u1} → ${u2} → ${u3})` },
|
|
110
|
+
{ name: "DETERMINISTIC", pass: det, detail: "same query → same prediction" },
|
|
111
|
+
{ name: "ABSTAINS-WHEN-THIN", pass: abstains, detail: "too few measurements → unknown" },
|
|
112
|
+
{ name: "TOTAL", pass: total, detail: "null / empty / null-query never throws" },
|
|
113
|
+
];
|
|
114
|
+
return { score: checks.every((c) => c.pass) ? 100 : 0, checks };
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=twin.js.map
|
package/dist/twin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"twin.js","sourceRoot":"","sources":["../src/twin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// A stand-in for YOUR real process (a trainer, a simulator, a benchmark). It takes parameters and prints
|
|
2
|
+
// ONE number — the score. Melete never sees inside; it only reads the number. No dataset needed up front.
|
|
3
|
+
const a = process.argv.slice(2);
|
|
4
|
+
const get = (k, d) => { const i = a.indexOf("--" + k); return i >= 0 ? +a[i + 1] : d; };
|
|
5
|
+
const lr = get("lr", 0.01), depth = get("depth", 6);
|
|
6
|
+
// pretend "accuracy" peaks at lr=0.03, depth=8 (in reality this is your real measured result)
|
|
7
|
+
const accuracy = 0.95 - 8 * (lr - 0.03) ** 2 - 0.004 * (depth - 8) ** 2;
|
|
8
|
+
console.log(accuracy.toFixed(5)); // ← the only thing Melete reads
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Connect Melete to the real process above — NO dataset, NO formula. Melete proposes params, runs the
|
|
2
|
+
// script, reads the score, and converges to the best params with a signed trace.
|
|
3
|
+
import { discoverSigned, cliOracle, verifyTrace } from "melete-ai";
|
|
4
|
+
const space = { dims: [
|
|
5
|
+
{ name: "lr", type: "real", min: 0.001, max: 0.1 },
|
|
6
|
+
{ name: "depth", type: "int", min: 1, max: 12 },
|
|
7
|
+
]};
|
|
8
|
+
const oracle = cliOracle(e => `node examples/train.mjs --lr ${e.lr} --depth ${e.depth}`); // runs YOUR process
|
|
9
|
+
const { result, trace } = await discoverSigned({ space, oracle, budget: 25, goal: "maximize", engine: "portfolio" });
|
|
10
|
+
console.log("best params:", result.best.experiment, "→ score", result.best.value.toFixed(5));
|
|
11
|
+
console.log("experiments run:", result.evaluations, "· trace verified:", verifyTrace(trace).ok);
|