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,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* COST-AWARE — optimize per BAHT, not per experiment. Every other optimizer minimises the NUMBER of
|
|
3
|
+
* experiments. But experiments don't cost the same: a high-temperature run burns more energy, a long assay
|
|
4
|
+
* ties up the lab longer, a big-batch GPU sweep costs more compute. If you have a fixed BUDGET (money,
|
|
5
|
+
* energy, machine-hours), the right goal is the best result per unit cost — and that can mean deliberately
|
|
6
|
+
* avoiding an expensive region even when it looks slightly better.
|
|
7
|
+
*
|
|
8
|
+
* COST-AWARE proposes the next experiment by bang-per-buck: it weighs each candidate's optimistic potential
|
|
9
|
+
* gain (a Lipschitz upper bound from your data) AGAINST its cost, and picks the best gain-per-cost. Within a
|
|
10
|
+
* cost budget it reaches a strong result for far less spend than a cost-blind optimizer that wanders into
|
|
11
|
+
* expensive corners.
|
|
12
|
+
*
|
|
13
|
+
* Honest by construction (DIAKRISIS): you supply the cost function; the gain is an optimistic estimate (it
|
|
14
|
+
* over-weights unexplored regions, which is what you want for exploration); the win is measured, not claimed
|
|
15
|
+
* — the gauntlet runs cost-aware vs cost-blind on the SAME cost budget and shows cost-aware reaches a higher
|
|
16
|
+
* best. It is not guaranteed to find the global optimum if that optimum only lives in an unaffordably
|
|
17
|
+
* expensive region — by design it won't bankrupt you chasing it.
|
|
18
|
+
*/
|
|
19
|
+
import { type Space, type Experiment } from "./space.js";
|
|
20
|
+
import { type Observation, type Goal } from "./engine.js";
|
|
21
|
+
type CostFn = (e: Experiment) => number;
|
|
22
|
+
/** Propose the next experiment by best optimistic-gain ÷ cost (bang-per-buck). */
|
|
23
|
+
export declare function proposeNextCostAware(space: Space, obs: ReadonlyArray<Observation>, goal: Goal, costFn: CostFn, seed?: number): Experiment;
|
|
24
|
+
export interface CostAwareResult {
|
|
25
|
+
best: Observation;
|
|
26
|
+
totalCost: number;
|
|
27
|
+
evaluations: number;
|
|
28
|
+
goal: Goal;
|
|
29
|
+
}
|
|
30
|
+
/** Run a cost-budgeted discovery: keep proposing the best bang-per-buck experiment until the cost budget runs out. */
|
|
31
|
+
export declare function costAwareDiscover(opts: {
|
|
32
|
+
space: Space;
|
|
33
|
+
oracle: (e: Experiment) => number;
|
|
34
|
+
costFn: CostFn;
|
|
35
|
+
costBudget: number;
|
|
36
|
+
goal?: Goal;
|
|
37
|
+
seed?: number;
|
|
38
|
+
maxEvals?: number;
|
|
39
|
+
}): CostAwareResult;
|
|
40
|
+
export declare function costAwareGauntlet(): {
|
|
41
|
+
score: 0 | 100;
|
|
42
|
+
checks: Array<{
|
|
43
|
+
name: string;
|
|
44
|
+
pass: boolean;
|
|
45
|
+
detail: string;
|
|
46
|
+
}>;
|
|
47
|
+
};
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=costaware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"costaware.d.ts","sourceRoot":"","sources":["../src/costaware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAO,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAO1D,KAAK,MAAM,GAAG,CAAC,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC;AAExC,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,SAAI,GAAG,UAAU,CA4CpI;AAED,MAAM,WAAW,eAAe;IAAG,IAAI,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE;AAE1G,sHAAsH;AACtH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,eAAe,CAa/L;AAGD,wBAAgB,iBAAiB,IAAI;IAAE,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAoCtH"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* COST-AWARE — optimize per BAHT, not per experiment. Every other optimizer minimises the NUMBER of
|
|
3
|
+
* experiments. But experiments don't cost the same: a high-temperature run burns more energy, a long assay
|
|
4
|
+
* ties up the lab longer, a big-batch GPU sweep costs more compute. If you have a fixed BUDGET (money,
|
|
5
|
+
* energy, machine-hours), the right goal is the best result per unit cost — and that can mean deliberately
|
|
6
|
+
* avoiding an expensive region even when it looks slightly better.
|
|
7
|
+
*
|
|
8
|
+
* COST-AWARE proposes the next experiment by bang-per-buck: it weighs each candidate's optimistic potential
|
|
9
|
+
* gain (a Lipschitz upper bound from your data) AGAINST its cost, and picks the best gain-per-cost. Within a
|
|
10
|
+
* cost budget it reaches a strong result for far less spend than a cost-blind optimizer that wanders into
|
|
11
|
+
* expensive corners.
|
|
12
|
+
*
|
|
13
|
+
* Honest by construction (DIAKRISIS): you supply the cost function; the gain is an optimistic estimate (it
|
|
14
|
+
* over-weights unexplored regions, which is what you want for exploration); the win is measured, not claimed
|
|
15
|
+
* — the gauntlet runs cost-aware vs cost-blind on the SAME cost budget and shows cost-aware reaches a higher
|
|
16
|
+
* best. It is not guaranteed to find the global optimum if that optimum only lives in an unaffordably
|
|
17
|
+
* expensive region — by design it won't bankrupt you chasing it.
|
|
18
|
+
*/
|
|
19
|
+
import { lcg } from "./space.js";
|
|
20
|
+
import { proposeNext } from "./interactive.js";
|
|
21
|
+
const HB = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37];
|
|
22
|
+
const hal = (k, b) => { let f = 1, r = 0, i = k + 1; while (i > 0) {
|
|
23
|
+
f /= b;
|
|
24
|
+
r += f * (i % b);
|
|
25
|
+
i = Math.floor(i / b);
|
|
26
|
+
} return r; };
|
|
27
|
+
const dst = (a, c) => { let s = 0; for (let i = 0; i < a.length; i++)
|
|
28
|
+
s += (a[i] - c[i]) ** 2; return Math.sqrt(s); };
|
|
29
|
+
/** Propose the next experiment by best optimistic-gain ÷ cost (bang-per-buck). */
|
|
30
|
+
export function proposeNextCostAware(space, obs, goal, costFn, seed = 1) {
|
|
31
|
+
const dims = space.dims, D = dims.length;
|
|
32
|
+
const sgn = goal === "minimize" ? -1 : 1;
|
|
33
|
+
const lo = (i) => dims[i].min ?? 0, hi = (i) => dims[i].max ?? 1;
|
|
34
|
+
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)); });
|
|
35
|
+
const toE = (v) => { const e = {}; dims.forEach((d, i) => { let x = lo(i) + v[i] * (hi(i) - lo(i)); if (d.type === "int")
|
|
36
|
+
x = Math.round(x); e[d.name] = x; }); return e; };
|
|
37
|
+
const hist = (obs ?? []).filter((o) => o && o.experiment && Number.isFinite(o.value));
|
|
38
|
+
const rnd = lcg(((seed >>> 0) || 1) + hist.length * 97 + 3);
|
|
39
|
+
// build a candidate set: Halton space-filling + cloud around the current best
|
|
40
|
+
const cands = [];
|
|
41
|
+
for (let k = 0; k < 800; k++) {
|
|
42
|
+
const c = [];
|
|
43
|
+
for (let d = 0; d < D; d++)
|
|
44
|
+
c.push(hal(k * 7 + (seed % 5) + 1, HB[d % HB.length]));
|
|
45
|
+
cands.push(c);
|
|
46
|
+
}
|
|
47
|
+
if (hist.length) {
|
|
48
|
+
const best = hist.reduce((a, b) => (sgn * b.value > sgn * a.value ? b : a));
|
|
49
|
+
const bn = toN(best.experiment);
|
|
50
|
+
for (let k = 0; k < 120; k++) {
|
|
51
|
+
const c = bn.map((x) => Math.max(0, Math.min(1, x + (rnd() - 0.5) * 0.2)));
|
|
52
|
+
cands.push(c);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// cold start: cheapest candidate that also spreads out
|
|
56
|
+
if (hist.length < 2) {
|
|
57
|
+
let bestC = null, bestScore = -Infinity;
|
|
58
|
+
for (const c of cands) {
|
|
59
|
+
const cost = Math.max(1e-9, costFn(toE(c)));
|
|
60
|
+
const score = 1 / cost + 0.001 * rnd();
|
|
61
|
+
if (score > bestScore) {
|
|
62
|
+
bestScore = score;
|
|
63
|
+
bestC = c;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return toE(bestC ?? cands[0]);
|
|
67
|
+
}
|
|
68
|
+
const npts = hist.map((o) => toN(o.experiment));
|
|
69
|
+
const vals = hist.map((o) => sgn * o.value);
|
|
70
|
+
let L = 0;
|
|
71
|
+
for (let i = 0; i < npts.length; i++)
|
|
72
|
+
for (let j = i + 1; j < npts.length; j++) {
|
|
73
|
+
const dx = dst(npts[i], npts[j]);
|
|
74
|
+
if (dx > 1e-9)
|
|
75
|
+
L = Math.max(L, Math.abs(vals[i] - vals[j]) / dx);
|
|
76
|
+
}
|
|
77
|
+
L = (L > 0 ? L : 1e-6) * 1.2;
|
|
78
|
+
const bestNorm = Math.max(...vals);
|
|
79
|
+
let pick = null, pickScore = -Infinity;
|
|
80
|
+
for (const c of cands) {
|
|
81
|
+
let ub = Infinity;
|
|
82
|
+
for (let i = 0; i < npts.length; i++) {
|
|
83
|
+
const b = vals[i] + L * dst(c, npts[i]);
|
|
84
|
+
if (b < ub)
|
|
85
|
+
ub = b;
|
|
86
|
+
}
|
|
87
|
+
const gain = Math.max(0, ub - bestNorm);
|
|
88
|
+
const cost = Math.max(1e-9, costFn(toE(c)));
|
|
89
|
+
const score = gain / cost;
|
|
90
|
+
if (score > pickScore || (score === pickScore && cost < 1e9)) {
|
|
91
|
+
pickScore = score;
|
|
92
|
+
pick = c;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// if nothing looks improving (all gain 0), fall back to the cheapest under-explored point
|
|
96
|
+
if (pickScore <= 0) {
|
|
97
|
+
let bc = null, bs = -Infinity;
|
|
98
|
+
for (const c of cands) {
|
|
99
|
+
let nd = Infinity;
|
|
100
|
+
for (const p of npts)
|
|
101
|
+
nd = Math.min(nd, dst(c, p));
|
|
102
|
+
const cost = Math.max(1e-9, costFn(toE(c)));
|
|
103
|
+
const score = nd / cost;
|
|
104
|
+
if (score > bs) {
|
|
105
|
+
bs = score;
|
|
106
|
+
bc = c;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
pick = bc ?? pick;
|
|
110
|
+
}
|
|
111
|
+
return toE(pick ?? cands[0]);
|
|
112
|
+
}
|
|
113
|
+
/** Run a cost-budgeted discovery: keep proposing the best bang-per-buck experiment until the cost budget runs out. */
|
|
114
|
+
export function costAwareDiscover(opts) {
|
|
115
|
+
const goal = opts.goal ?? "maximize";
|
|
116
|
+
const sgn = goal === "minimize" ? -1 : 1;
|
|
117
|
+
const obs = [];
|
|
118
|
+
let totalCost = 0;
|
|
119
|
+
const maxEvals = opts.maxEvals ?? 300;
|
|
120
|
+
let best = { experiment: {}, value: goal === "minimize" ? Infinity : -Infinity };
|
|
121
|
+
while (obs.length < maxEvals) {
|
|
122
|
+
const e = proposeNextCostAware(opts.space, obs, goal, opts.costFn, (opts.seed ?? 1) + obs.length);
|
|
123
|
+
const c = Math.max(0, opts.costFn(e));
|
|
124
|
+
if (obs.length > 0 && totalCost + c > opts.costBudget)
|
|
125
|
+
break; // don't blow the budget
|
|
126
|
+
const v = opts.oracle(e);
|
|
127
|
+
obs.push({ experiment: e, value: v });
|
|
128
|
+
totalCost += c;
|
|
129
|
+
if (sgn * v > sgn * best.value)
|
|
130
|
+
best = { experiment: e, value: v };
|
|
131
|
+
if (obs.length === 1 && c > opts.costBudget)
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
return { best, totalCost: +totalCost.toFixed(4), evaluations: obs.length, goal };
|
|
135
|
+
}
|
|
136
|
+
// ── gauntlet ──────────────────────────────────────────────────────────────────
|
|
137
|
+
export function costAwareGauntlet() {
|
|
138
|
+
const space = { dims: [{ name: "x", type: "real", min: 0, max: 1 }, { name: "y", type: "real", min: 0, max: 1 }] };
|
|
139
|
+
// the optimum (≈1.0 at (0.3,0.3)) lives in the CHEAP region; the EXPENSIVE region (x>0.6) only tempts an
|
|
140
|
+
// explorer with uncertainty, not real value.
|
|
141
|
+
const f = (e) => Math.exp(-(((e.x ?? 0) - 0.3) ** 2 + ((e.y ?? 0) - 0.3) ** 2) / 0.05);
|
|
142
|
+
const costFn = (e) => ((e.x ?? 0) > 0.6 ? 50 : 1);
|
|
143
|
+
const BUDGET = 40;
|
|
144
|
+
const ca = costAwareDiscover({ space, oracle: f, costFn, costBudget: BUDGET, goal: "maximize", seed: 7 });
|
|
145
|
+
// cost-blind baseline: ordinary proposeNext, spending the same cost budget
|
|
146
|
+
const obs = [];
|
|
147
|
+
let blindCost = 0;
|
|
148
|
+
let blindBest = -Infinity;
|
|
149
|
+
while (obs.length < 300) {
|
|
150
|
+
const e = proposeNext(space, obs, "maximize", 7 + obs.length);
|
|
151
|
+
const c = costFn(e);
|
|
152
|
+
if (obs.length > 0 && blindCost + c > BUDGET)
|
|
153
|
+
break;
|
|
154
|
+
const v = f(e);
|
|
155
|
+
obs.push({ experiment: e, value: v });
|
|
156
|
+
blindCost += c;
|
|
157
|
+
if (v > blindBest)
|
|
158
|
+
blindBest = v;
|
|
159
|
+
}
|
|
160
|
+
const wins = ca.best.value > blindBest + 1e-6; // cost-aware reaches a higher best for the same spend
|
|
161
|
+
const budgetRespected = ca.totalCost <= BUDGET + 50; // never overshoots (allow one final item)
|
|
162
|
+
const moreExperiments = ca.evaluations > obs.length; // by avoiding expensive runs it affords more useful experiments
|
|
163
|
+
const reachesGood = ca.best.value > 0.8; // actually finds the cheap optimum
|
|
164
|
+
// deterministic
|
|
165
|
+
const ca2 = costAwareDiscover({ space, oracle: f, costFn, costBudget: BUDGET, goal: "maximize", seed: 7 });
|
|
166
|
+
const det = ca.best.value === ca2.best.value && ca.totalCost === ca2.totalCost;
|
|
167
|
+
const total = (() => { try {
|
|
168
|
+
proposeNextCostAware(space, [], "maximize", () => 1);
|
|
169
|
+
costAwareDiscover({ space, oracle: f, costFn: () => 1, costBudget: 5 });
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return false;
|
|
174
|
+
} })();
|
|
175
|
+
const checks = [
|
|
176
|
+
{ name: "COST-AWARE-WINS", pass: wins, detail: `same ${BUDGET}-cost budget → cost-aware best ${ca.best.value.toFixed(3)} > cost-blind best ${blindBest.toFixed(3)}` },
|
|
177
|
+
{ name: "REACHES-GOOD", pass: reachesGood, detail: `cost-aware finds the cheap optimum (best ${ca.best.value.toFixed(3)} > 0.8)` },
|
|
178
|
+
{ name: "MORE-EXPERIMENTS-PER-BUDGET", pass: moreExperiments, detail: `avoiding expensive runs buys more experiments (${ca.evaluations} vs ${obs.length}) on the same budget` },
|
|
179
|
+
{ name: "BUDGET-RESPECTED", pass: budgetRespected, detail: `spent ${ca.totalCost} within the ${BUDGET} budget` },
|
|
180
|
+
{ name: "DETERMINISTIC", pass: det, detail: "same setup → same result" },
|
|
181
|
+
{ name: "TOTAL", pass: total, detail: "empty obs / tiny budget never throws" },
|
|
182
|
+
];
|
|
183
|
+
return { score: checks.every((c) => c.pass) ? 100 : 0, checks };
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=costaware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"costaware.js","sourceRoot":"","sources":["../src/costaware.ts"],"names":[],"mappings":"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"}
|
package/dist/drift.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRIFT — the temporal-confound detector. The scientific-validity check no optimizer runs: are your results
|
|
3
|
+
* improving because of the variables you changed, or because something you AREN'T controlling drifted over
|
|
4
|
+
* the run — the room warmed up through the day, a reagent batch changed, a sensor aged, the operator got
|
|
5
|
+
* tired? If the part of each score that your variables CAN'T explain trends with the ORDER you measured in,
|
|
6
|
+
* your conclusions may be confounded with time, not caused by your knobs.
|
|
7
|
+
*
|
|
8
|
+
* DRIFT fits a response model to your variables, takes the leftover (residual) of each measurement, and
|
|
9
|
+
* tests whether those residuals correlate with experiment order. A strong correlation flags a likely
|
|
10
|
+
* time-confound — a warning that a "winning" setting might just be the setting you happened to try late, on
|
|
11
|
+
* a good day. It's the difference between a result that replicates and one that doesn't.
|
|
12
|
+
*
|
|
13
|
+
* Honest by construction (DIAKRISIS): correlation of residuals with order is EVIDENCE of a time-confound, not
|
|
14
|
+
* proof of causation (you could have sampled a variable monotonically with time — then it's aliased); it
|
|
15
|
+
* needs enough points and abstains otherwise. It tells you to LOOK, with a measured strength.
|
|
16
|
+
*/
|
|
17
|
+
import { type Space } from "./space.js";
|
|
18
|
+
import { type Observation, type Goal } from "./engine.js";
|
|
19
|
+
export interface DriftReport {
|
|
20
|
+
n: number;
|
|
21
|
+
residualOrderCorr: number;
|
|
22
|
+
driftFraction: number;
|
|
23
|
+
detected: boolean;
|
|
24
|
+
note: string;
|
|
25
|
+
}
|
|
26
|
+
/** Detect whether the part of each score your variables can't explain trends with experiment order. */
|
|
27
|
+
export declare function analyzeDrift(obs: ReadonlyArray<Observation>, space: Space, _goal?: Goal): DriftReport;
|
|
28
|
+
export declare function driftGauntlet(): {
|
|
29
|
+
score: 0 | 100;
|
|
30
|
+
checks: Array<{
|
|
31
|
+
name: string;
|
|
32
|
+
pass: boolean;
|
|
33
|
+
detail: string;
|
|
34
|
+
}>;
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=drift.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../src/drift.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,KAAK,KAAK,EAAmB,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAyBD,uGAAuG;AACvG,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAE,IAAiB,GAAG,WAAW,CA8BjH;AAKD,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,CAmClH"}
|
package/dist/drift.js
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
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
|
+
/** Solve A x = b (n×n) by Gaussian elimination with partial pivoting. */
|
|
5
|
+
function solve(A, b) {
|
|
6
|
+
const n = b.length;
|
|
7
|
+
const M = A.map((r, i) => r.concat([b[i]]));
|
|
8
|
+
for (let col = 0; col < n; col++) {
|
|
9
|
+
let piv = col;
|
|
10
|
+
for (let r = col + 1; r < n; r++)
|
|
11
|
+
if (Math.abs(M[r][col]) > Math.abs(M[piv][col]))
|
|
12
|
+
piv = r;
|
|
13
|
+
const t = M[col];
|
|
14
|
+
M[col] = M[piv];
|
|
15
|
+
M[piv] = t;
|
|
16
|
+
const d = M[col][col];
|
|
17
|
+
if (Math.abs(d) < 1e-12)
|
|
18
|
+
continue;
|
|
19
|
+
for (let r = 0; r < n; r++) {
|
|
20
|
+
if (r === col)
|
|
21
|
+
continue;
|
|
22
|
+
const f = M[r][col] / d;
|
|
23
|
+
if (f === 0)
|
|
24
|
+
continue;
|
|
25
|
+
for (let c = col; c <= n; c++)
|
|
26
|
+
M[r][c] -= f * M[col][c];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const x = new Array(n).fill(0);
|
|
30
|
+
for (let i = 0; i < n; i++) {
|
|
31
|
+
const d = M[i][i];
|
|
32
|
+
x[i] = Math.abs(d) > 1e-12 ? M[i][n] / d : 0;
|
|
33
|
+
}
|
|
34
|
+
return x;
|
|
35
|
+
}
|
|
36
|
+
function pearson(a, b) {
|
|
37
|
+
const n = a.length;
|
|
38
|
+
if (n < 2)
|
|
39
|
+
return 0;
|
|
40
|
+
let ma = 0, mb = 0;
|
|
41
|
+
for (let i = 0; i < n; i++) {
|
|
42
|
+
ma += a[i];
|
|
43
|
+
mb += b[i];
|
|
44
|
+
}
|
|
45
|
+
ma /= n;
|
|
46
|
+
mb /= n;
|
|
47
|
+
let sab = 0, saa = 0, sbb = 0;
|
|
48
|
+
for (let i = 0; i < n; i++) {
|
|
49
|
+
const da = a[i] - ma, db = b[i] - mb;
|
|
50
|
+
sab += da * db;
|
|
51
|
+
saa += da * da;
|
|
52
|
+
sbb += db * db;
|
|
53
|
+
}
|
|
54
|
+
const den = Math.sqrt(saa * sbb);
|
|
55
|
+
return den > 1e-12 ? sab / den : 0;
|
|
56
|
+
}
|
|
57
|
+
/** Detect whether the part of each score your variables can't explain trends with experiment order. */
|
|
58
|
+
export function analyzeDrift(obs, space, _goal = "maximize") {
|
|
59
|
+
const dims = space?.dims ?? [];
|
|
60
|
+
const D = dims.length;
|
|
61
|
+
const hist = (obs ?? []).filter((o) => o && o.experiment && Number.isFinite(o.value));
|
|
62
|
+
const n = hist.length;
|
|
63
|
+
const nFeat = 1 + 2 * D;
|
|
64
|
+
if (D === 0 || n < nFeat + 5) {
|
|
65
|
+
return { n, residualOrderCorr: 0, driftFraction: 0, detected: false, note: `need ≈${nFeat + 5} measurements to test for drift (have ${n})` };
|
|
66
|
+
}
|
|
67
|
+
// response model: value ~ 1 + Σ x_k + Σ x_k² (captures the variables' own effect, NOT order)
|
|
68
|
+
const feats = hist.map((o) => { const x = norm(space, o.experiment); const f = [1]; for (let k = 0; k < D; k++)
|
|
69
|
+
f.push(x[k]); for (let k = 0; k < D; k++)
|
|
70
|
+
f.push(x[k] * x[k]); return f; });
|
|
71
|
+
const y = hist.map((o) => o.value);
|
|
72
|
+
const XtX = Array.from({ length: nFeat }, () => new Array(nFeat).fill(0));
|
|
73
|
+
const Xty = new Array(nFeat).fill(0);
|
|
74
|
+
for (let r = 0; r < n; r++) {
|
|
75
|
+
const f = feats[r];
|
|
76
|
+
for (let a = 0; a < nFeat; a++) {
|
|
77
|
+
Xty[a] += f[a] * y[r];
|
|
78
|
+
for (let b = 0; b < nFeat; b++)
|
|
79
|
+
XtX[a][b] += f[a] * f[b];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
for (let a = 0; a < nFeat; a++)
|
|
83
|
+
XtX[a][a] += 1e-6;
|
|
84
|
+
const coef = solve(XtX, Xty);
|
|
85
|
+
const resid = hist.map((o, r) => { let pred = 0; for (let a = 0; a < nFeat; a++)
|
|
86
|
+
pred += coef[a] * feats[r][a]; return y[r] - pred; });
|
|
87
|
+
const order = hist.map((_, i) => i);
|
|
88
|
+
const residualOrderCorr = pearson(resid, order);
|
|
89
|
+
// how much of the score spread the time-trend accounts for: slope of residual-vs-order × span ÷ value range
|
|
90
|
+
const mo = (n - 1) / 2;
|
|
91
|
+
let so = 0, sro = 0;
|
|
92
|
+
for (let i = 0; i < n; i++) {
|
|
93
|
+
so += (order[i] - mo) ** 2;
|
|
94
|
+
sro += (order[i] - mo) * resid[i];
|
|
95
|
+
}
|
|
96
|
+
const slope = so > 1e-12 ? sro / so : 0;
|
|
97
|
+
const vRange = Math.max(1e-12, Math.max(...y) - Math.min(...y));
|
|
98
|
+
const driftFraction = Math.min(1, Math.abs(slope * (n - 1)) / vRange);
|
|
99
|
+
const detected = Math.abs(residualOrderCorr) > 0.4 && driftFraction > 0.1;
|
|
100
|
+
const note = detected
|
|
101
|
+
? `your results trend with WHEN you measured (residual–order corr ${residualOrderCorr.toFixed(2)}, ~${(driftFraction * 100).toFixed(0)}% of the spread) — a possible time-confound; re-test the winner fresh`
|
|
102
|
+
: "no time-trend in the unexplained part — your results are not obviously confounded with order";
|
|
103
|
+
return { n, residualOrderCorr: +residualOrderCorr.toFixed(3), driftFraction: +driftFraction.toFixed(3), detected, note };
|
|
104
|
+
}
|
|
105
|
+
// ── gauntlet ──────────────────────────────────────────────────────────────────
|
|
106
|
+
import { lcg } from "./space.js";
|
|
107
|
+
export function driftGauntlet() {
|
|
108
|
+
const space = { dims: [{ name: "x", type: "real", min: 0, max: 1 }, { name: "y", type: "real", min: 0, max: 1 }] };
|
|
109
|
+
const base = (x, y) => -((x - 0.5) ** 2) - ((y - 0.5) ** 2); // the real (variable-driven) response
|
|
110
|
+
// WITH DRIFT: a hidden factor ramps over the run (order-dependent), independent of x,y
|
|
111
|
+
const rnd = lcg(31);
|
|
112
|
+
const drift = [];
|
|
113
|
+
for (let i = 0; i < 60; i++) {
|
|
114
|
+
const x = rnd(), y = rnd();
|
|
115
|
+
drift.push({ experiment: { x, y }, value: base(x, y) + 0.8 * (i / 60) + 0.02 * (rnd() - 0.5) });
|
|
116
|
+
}
|
|
117
|
+
const rD = analyzeDrift(drift, space, "maximize");
|
|
118
|
+
const detectsDrift = rD.detected && Math.abs(rD.residualOrderCorr) > 0.5;
|
|
119
|
+
// NO DRIFT: same response, no order term, just small noise
|
|
120
|
+
const rnd2 = lcg(8);
|
|
121
|
+
const clean = [];
|
|
122
|
+
for (let i = 0; i < 60; i++) {
|
|
123
|
+
const x = rnd2(), y = rnd2();
|
|
124
|
+
clean.push({ experiment: { x, y }, value: base(x, y) + 0.02 * (rnd2() - 0.5) });
|
|
125
|
+
}
|
|
126
|
+
const rC = analyzeDrift(clean, space, "maximize");
|
|
127
|
+
const noFalseAlarm = !rC.detected && Math.abs(rC.residualOrderCorr) < 0.4;
|
|
128
|
+
// STRONGER drift → higher correlation
|
|
129
|
+
const rnd3 = lcg(31);
|
|
130
|
+
const drift2 = [];
|
|
131
|
+
for (let i = 0; i < 60; i++) {
|
|
132
|
+
const x = rnd3(), y = rnd3();
|
|
133
|
+
drift2.push({ experiment: { x, y }, value: base(x, y) + 2.0 * (i / 60) + 0.02 * (rnd3() - 0.5) });
|
|
134
|
+
}
|
|
135
|
+
const rD2 = analyzeDrift(drift2, space, "maximize");
|
|
136
|
+
const monotone = Math.abs(rD2.residualOrderCorr) >= Math.abs(rD.residualOrderCorr) - 0.05;
|
|
137
|
+
const det = JSON.stringify(analyzeDrift(drift, space, "maximize")) === JSON.stringify(analyzeDrift(drift, space, "maximize"));
|
|
138
|
+
const abstains = analyzeDrift(drift.slice(0, 5), space, "maximize").note.indexOf("need") >= 0;
|
|
139
|
+
const total = (() => { try {
|
|
140
|
+
analyzeDrift(null, space);
|
|
141
|
+
analyzeDrift([], space);
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return false;
|
|
146
|
+
} })();
|
|
147
|
+
const checks = [
|
|
148
|
+
{ name: "DETECTS-DRIFT", pass: detectsDrift, detail: `an order-ramp confound is flagged (corr ${rD.residualOrderCorr})` },
|
|
149
|
+
{ name: "NO-FALSE-ALARM", pass: noFalseAlarm, detail: `clean data with no time-trend is NOT flagged (corr ${rC.residualOrderCorr})` },
|
|
150
|
+
{ name: "STRONGER-DRIFT-HIGHER-CORR", pass: monotone, detail: `a bigger drift gives a stronger signal (${rD.residualOrderCorr} → ${rD2.residualOrderCorr})` },
|
|
151
|
+
{ name: "DETERMINISTIC", pass: det, detail: "same data → same verdict" },
|
|
152
|
+
{ name: "ABSTAINS-WHEN-THIN", pass: abstains, detail: "too few measurements → no claim" },
|
|
153
|
+
{ name: "TOTAL", pass: total, detail: "null / empty never throws" },
|
|
154
|
+
];
|
|
155
|
+
return { score: checks.every((c) => c.pass) ? 100 : 0, checks };
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=drift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.js","sourceRoot":"","sources":["../src/drift.ts"],"names":[],"mappings":"AA2BA,SAAS,IAAI,CAAC,KAAY,EAAE,CAAa;IACvC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzK,CAAC;AAED,yEAAyE;AACzE,SAAS,KAAK,CAAC,CAAa,EAAE,CAAW;IACvC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;QACjC,IAAI,GAAG,GAAG,GAAG,CAAC;QAAC,KAAK,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBAAE,GAAG,GAAG,CAAC,CAAC;QAC1G,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK;YAAE,SAAS;QACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAAC,IAAI,CAAC,KAAK,GAAG;gBAAE,SAAS;YAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,SAAS;YAAC,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;gBAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;IACnK,CAAC;IACD,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAAC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,OAAO,CAAC,CAAC;AAC5I,CAAC;AAED,SAAS,OAAO,CAAC,CAAW,EAAE,CAAW;IACvC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACxC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAAC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,EAAE,IAAI,CAAC,CAAC;IAAC,EAAE,IAAI,CAAC,CAAC;IAC7F,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;IAAC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QAAC,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;QAAC,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;QAAC,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;IAAC,CAAC;IACpJ,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IAAC,OAAO,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,YAAY,CAAC,GAA+B,EAAE,KAAY,EAAE,QAAc,UAAU;IAClG,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC;IAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACtF,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,KAAK,GAAG,CAAC,yCAAyC,CAAC,GAAG,EAAE,CAAC;IAC/I,CAAC;IACD,8FAA8F;IAC9F,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5L,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,GAAG,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,MAAM,GAAG,GAAa,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAAC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAAC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAAC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;gBAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;IAAC,CAAC;IACxK,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAClD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;QAAE,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvI,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,iBAAiB,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAEhD,4GAA4G;IAC5G,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;IAAC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IAC3I,MAAM,KAAK,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;IACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,GAAG,IAAI,aAAa,GAAG,GAAG,CAAC;IAC1E,MAAM,IAAI,GAAG,QAAQ;QACnB,CAAC,CAAC,kEAAkE,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,uEAAuE;QAC7M,CAAC,CAAC,8FAA8F,CAAC;IACnG,OAAO,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC3H,CAAC;AAED,iFAAiF;AACjF,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEjC,MAAM,UAAU,aAAa;IAC3B,MAAM,KAAK,GAAU,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1H,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAG,sCAAsC;IAErH,uFAAuF;IACvF,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IAAC,MAAM,KAAK,GAAkB,EAAE,CAAC;IACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAAC,MAAM,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC;QAAC,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;IAC7J,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,iBAAiB,CAAC,GAAG,GAAG,CAAC;IAEzE,2DAA2D;IAC3D,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IAAC,MAAM,KAAK,GAAkB,EAAE,CAAC;IACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAAC,MAAM,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC;QAAC,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;IAC/I,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,CAAC,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,iBAAiB,CAAC,GAAG,GAAG,CAAC;IAE1E,sCAAsC;IACtC,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IAAC,MAAM,MAAM,GAAkB,EAAE,CAAC;IACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAAC,MAAM,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;IACjK,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;IAE1F,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IAC9H,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9F,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAAC,YAAY,CAAC,IAAa,EAAE,KAAK,CAAC,CAAC;QAAC,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEtI,MAAM,MAAM,GAAG;QACb,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,2CAA2C,EAAE,CAAC,iBAAiB,GAAG,EAAE;QACzH,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,sDAAsD,EAAE,CAAC,iBAAiB,GAAG,EAAE;QACrI,EAAE,IAAI,EAAE,4BAA4B,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,2CAA2C,EAAE,CAAC,iBAAiB,MAAM,GAAG,CAAC,iBAAiB,GAAG,EAAE;QAC7J,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,0BAA0B,EAAE;QACxE,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,iCAAiC,EAAE;QACzF,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,EAAE;KACpE,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DISCOVERY EFFICIENCY η — a new equation. Every optimizer reports ONE number: the best value found. But
|
|
3
|
+
* "best" lies. A run can post a dazzling peak that (a) is barely better than blind guessing, (b) sits on a
|
|
4
|
+
* knife-edge that collapses the moment reality wobbles, or (c) is an artefact of a drift the variables never
|
|
5
|
+
* caused. A single high number hides all three. η refuses to.
|
|
6
|
+
*
|
|
7
|
+
* η = ∛( G · R · T )
|
|
8
|
+
*
|
|
9
|
+
* G — GAIN captured: how much of the *achievable* headroom you actually took,
|
|
10
|
+
* G = (best − blind) / (ceiling − blind), blind = mean of your measurements, ceiling = Lipschitz max.
|
|
11
|
+
* R — ROBUSTNESS of the optimum: flat plateau → 1, sharp fragile spike → 0, R = 1 / (1 + κ),
|
|
12
|
+
* κ = the response curvature at the peak (per unit, normalised).
|
|
13
|
+
* T — TRUST: results not confounded with time, T = 1 − driftFraction.
|
|
14
|
+
*
|
|
15
|
+
* The black-sheep choice is the GEOMETRIC mean, not the weighted sum everyone else uses. A sum lets a
|
|
16
|
+
* brilliant score on one axis paper over a zero on another — exactly the lie we're trying to kill. The
|
|
17
|
+
* geometric mean is CONJUNCTIVE: if any one of gain, robustness, or trust collapses toward zero, η collapses
|
|
18
|
+
* with it. You cannot fake discovery efficiency by being good at one thing; you have to be good at all three
|
|
19
|
+
* at once. That single property is what makes η honest.
|
|
20
|
+
*
|
|
21
|
+
* Honest by construction (DIAKRISIS): η is a NEW composite we define, and each of G, R, T is independently
|
|
22
|
+
* measured from your own data (not assumed) — the gauntlet proves η rises only when a run is genuinely
|
|
23
|
+
* better AND robust AND trustworthy, and that a weak link in any one factor drags it down. Robust
|
|
24
|
+
* optimization is a known goal; the specific closed-form fusion and its falsifiable self-test are ours. It
|
|
25
|
+
* abstains on thin data rather than invent a score.
|
|
26
|
+
*/
|
|
27
|
+
import { type Space } from "./space.js";
|
|
28
|
+
import { type Observation, type Goal } from "./engine.js";
|
|
29
|
+
export interface EfficiencyReport {
|
|
30
|
+
eta: number;
|
|
31
|
+
gain: number;
|
|
32
|
+
robustness: number;
|
|
33
|
+
trust: number;
|
|
34
|
+
evaluations: number;
|
|
35
|
+
grade: "exceptional" | "strong" | "fair" | "weak" | "unknown";
|
|
36
|
+
weakestLink: "gain" | "robustness" | "trust" | null;
|
|
37
|
+
note: string;
|
|
38
|
+
}
|
|
39
|
+
/** Compute the Discovery Efficiency η of a finished (or in-progress) run. */
|
|
40
|
+
export declare function discoveryEfficiency(obs: ReadonlyArray<Observation>, space: Space, goal?: Goal): EfficiencyReport;
|
|
41
|
+
export declare function efficiencyGauntlet(): {
|
|
42
|
+
score: 0 | 100;
|
|
43
|
+
checks: Array<{
|
|
44
|
+
name: string;
|
|
45
|
+
pass: boolean;
|
|
46
|
+
detail: string;
|
|
47
|
+
}>;
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=efficiency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"efficiency.d.ts","sourceRoot":"","sources":["../src/efficiency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,EAAE,KAAK,KAAK,EAAmB,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAI1D,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC9D,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,OAAO,GAAG,IAAI,CAAC;IACpD,IAAI,EAAE,MAAM,CAAC;CACd;AA4BD,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,aAAa,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,GAAE,IAAiB,GAAG,gBAAgB,CAwC5H;AAKD,wBAAgB,kBAAkB,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,CAoDvH"}
|