@mneme-ai/core 0.25.0 → 0.27.0
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/dist/audit/baseline.d.ts +92 -0
- package/dist/audit/baseline.d.ts.map +1 -0
- package/dist/audit/baseline.js +276 -0
- package/dist/audit/baseline.js.map +1 -0
- package/dist/audit/baseline.test.d.ts +2 -0
- package/dist/audit/baseline.test.d.ts.map +1 -0
- package/dist/audit/baseline.test.js +180 -0
- package/dist/audit/baseline.test.js.map +1 -0
- package/dist/audit/certify.d.ts +139 -0
- package/dist/audit/certify.d.ts.map +1 -0
- package/dist/audit/certify.js +295 -0
- package/dist/audit/certify.js.map +1 -0
- package/dist/audit/certify.test.d.ts +2 -0
- package/dist/audit/certify.test.d.ts.map +1 -0
- package/dist/audit/certify.test.js +324 -0
- package/dist/audit/certify.test.js.map +1 -0
- package/dist/audit/index.d.ts +14 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +14 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/trace.d.ts +88 -0
- package/dist/audit/trace.d.ts.map +1 -0
- package/dist/audit/trace.js +173 -0
- package/dist/audit/trace.js.map +1 -0
- package/dist/audit/trace.test.d.ts +2 -0
- package/dist/audit/trace.test.d.ts.map +1 -0
- package/dist/audit/trace.test.js +198 -0
- package/dist/audit/trace.test.js.map +1 -0
- package/dist/audit/verify.d.ts +61 -0
- package/dist/audit/verify.d.ts.map +1 -0
- package/dist/audit/verify.js +278 -0
- package/dist/audit/verify.js.map +1 -0
- package/dist/audit/verify.test.d.ts +2 -0
- package/dist/audit/verify.test.d.ts.map +1 -0
- package/dist/audit/verify.test.js +129 -0
- package/dist/audit/verify.test.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/pipeline/index.d.ts +34 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +51 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/mpe.d.ts +83 -0
- package/dist/pipeline/mpe.d.ts.map +1 -0
- package/dist/pipeline/mpe.js +259 -0
- package/dist/pipeline/mpe.js.map +1 -0
- package/dist/pipeline/mpe.test.d.ts +2 -0
- package/dist/pipeline/mpe.test.d.ts.map +1 -0
- package/dist/pipeline/mpe.test.js +196 -0
- package/dist/pipeline/mpe.test.js.map +1 -0
- package/dist/pipeline/pipeline.integration.test.d.ts +2 -0
- package/dist/pipeline/pipeline.integration.test.d.ts.map +1 -0
- package/dist/pipeline/pipeline.integration.test.js +99 -0
- package/dist/pipeline/pipeline.integration.test.js.map +1 -0
- package/dist/pipeline/super-pipeline.d.ts +38 -0
- package/dist/pipeline/super-pipeline.d.ts.map +1 -0
- package/dist/pipeline/super-pipeline.js +247 -0
- package/dist/pipeline/super-pipeline.js.map +1 -0
- package/dist/pipeline/super-pipeline.test.d.ts +2 -0
- package/dist/pipeline/super-pipeline.test.d.ts.map +1 -0
- package/dist/pipeline/super-pipeline.test.js +130 -0
- package/dist/pipeline/super-pipeline.test.js.map +1 -0
- package/dist/pipeline/superscalar.d.ts +36 -0
- package/dist/pipeline/superscalar.d.ts.map +1 -0
- package/dist/pipeline/superscalar.js +130 -0
- package/dist/pipeline/superscalar.js.map +1 -0
- package/dist/pipeline/superscalar.test.d.ts +2 -0
- package/dist/pipeline/superscalar.test.d.ts.map +1 -0
- package/dist/pipeline/superscalar.test.js +130 -0
- package/dist/pipeline/superscalar.test.js.map +1 -0
- package/dist/pipeline/types.d.ts +104 -0
- package/dist/pipeline/types.d.ts.map +1 -0
- package/dist/pipeline/types.js +15 -0
- package/dist/pipeline/types.js.map +1 -0
- package/dist/retrieve/intent.d.ts.map +1 -1
- package/dist/retrieve/intent.js +16 -0
- package/dist/retrieve/intent.js.map +1 -1
- package/dist/retrieve/intent.test.js +23 -0
- package/dist/retrieve/intent.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { mkdtempSync, rmSync, existsSync, readFileSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { emptyMpeState, updateMpe, powerIterate, recommendFromMpe, serializeMpeState, deserializeMpeState, readMpeState, writeMpeState, } from "./mpe.js";
|
|
6
|
+
describe("MPE — formula basics", () => {
|
|
7
|
+
it("emptyMpeState seeds decay and empty maps", () => {
|
|
8
|
+
const s = emptyMpeState(0.9);
|
|
9
|
+
expect(s.decay).toBe(0.9);
|
|
10
|
+
expect(s.trust.size).toBe(0);
|
|
11
|
+
expect(s.callCount.size).toBe(0);
|
|
12
|
+
});
|
|
13
|
+
it("a single successful observation moves trust above prior", () => {
|
|
14
|
+
const s = updateMpe(emptyMpeState(0.85), [
|
|
15
|
+
{ stage: "embed", ok: true, latencyMs: 10, targetMs: 100 },
|
|
16
|
+
]);
|
|
17
|
+
// Single stage → prior = 1, trust normalized to 1.
|
|
18
|
+
expect(s.trust.get("embed")).toBeCloseTo(1.0, 6);
|
|
19
|
+
expect(s.successCount.get("embed")).toBe(1);
|
|
20
|
+
expect(s.failureCount.get("embed")).toBe(0);
|
|
21
|
+
});
|
|
22
|
+
it("a single failure leaves only the (1-α)×prior contribution", () => {
|
|
23
|
+
const s = updateMpe(emptyMpeState(0.85), [
|
|
24
|
+
{ stage: "embed", ok: false, latencyMs: 10, targetMs: 100 },
|
|
25
|
+
]);
|
|
26
|
+
expect(s.trust.get("embed")).toBeCloseTo(1.0, 6); // normalized
|
|
27
|
+
// After normalization a single stage is always 1, so check raw counters.
|
|
28
|
+
expect(s.failureCount.get("embed")).toBe(1);
|
|
29
|
+
});
|
|
30
|
+
it("trust eigenvector sums to 1 (proper probability distribution)", () => {
|
|
31
|
+
const results = [
|
|
32
|
+
{ stage: "a", ok: true, latencyMs: 10, targetMs: 100 },
|
|
33
|
+
{ stage: "b", ok: true, latencyMs: 50, targetMs: 100 },
|
|
34
|
+
{ stage: "c", ok: false, latencyMs: 200, targetMs: 100 },
|
|
35
|
+
];
|
|
36
|
+
const s = updateMpe(emptyMpeState(0.85), results);
|
|
37
|
+
const total = [...s.trust.values()].reduce((a, b) => a + b, 0);
|
|
38
|
+
expect(total).toBeCloseTo(1.0, 6);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe("MPE — latency weighting", () => {
|
|
42
|
+
it("fast successes outrank slow successes", () => {
|
|
43
|
+
const results = [
|
|
44
|
+
{ stage: "fast", ok: true, latencyMs: 5, targetMs: 100 },
|
|
45
|
+
{ stage: "slow", ok: true, latencyMs: 500, targetMs: 100 },
|
|
46
|
+
];
|
|
47
|
+
// Power-iterate to converge.
|
|
48
|
+
const s = powerIterate(emptyMpeState(0.85), results, { maxIter: 30 });
|
|
49
|
+
expect(s.trust.get("fast")).toBeGreaterThan(s.trust.get("slow"));
|
|
50
|
+
});
|
|
51
|
+
it("successes outrank failures even at the same latency", () => {
|
|
52
|
+
const results = [
|
|
53
|
+
{ stage: "ok", ok: true, latencyMs: 50, targetMs: 100 },
|
|
54
|
+
{ stage: "bad", ok: false, latencyMs: 50, targetMs: 100 },
|
|
55
|
+
];
|
|
56
|
+
const s = powerIterate(emptyMpeState(0.85), results, { maxIter: 30 });
|
|
57
|
+
expect(s.trust.get("ok")).toBeGreaterThan(s.trust.get("bad"));
|
|
58
|
+
});
|
|
59
|
+
it("targetMs from earlier observation is reused if not provided", () => {
|
|
60
|
+
let s = updateMpe(emptyMpeState(0.85), [
|
|
61
|
+
{ stage: "x", ok: true, latencyMs: 5, targetMs: 50 },
|
|
62
|
+
]);
|
|
63
|
+
s = updateMpe(s, [{ stage: "x", ok: true, latencyMs: 5 }]);
|
|
64
|
+
expect(s.targetMs.get("x")).toBe(50);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe("MPE — eigentrust convergence", () => {
|
|
68
|
+
it("power iteration converges (L1 distance shrinks below tol)", () => {
|
|
69
|
+
const results = [
|
|
70
|
+
{ stage: "p", ok: true, latencyMs: 10, targetMs: 100 },
|
|
71
|
+
{ stage: "q", ok: true, latencyMs: 20, targetMs: 100 },
|
|
72
|
+
{ stage: "r", ok: false, latencyMs: 100, targetMs: 100 },
|
|
73
|
+
];
|
|
74
|
+
const a = powerIterate(emptyMpeState(0.85), results, { maxIter: 100, tol: 1e-9 });
|
|
75
|
+
const b = updateMpe(a, results);
|
|
76
|
+
let l1 = 0;
|
|
77
|
+
for (const k of a.trust.keys())
|
|
78
|
+
l1 += Math.abs((a.trust.get(k) ?? 0) - (b.trust.get(k) ?? 0));
|
|
79
|
+
expect(l1).toBeLessThan(1e-6);
|
|
80
|
+
});
|
|
81
|
+
it("decay closer to 1 makes the ranking sharper", () => {
|
|
82
|
+
const results = [
|
|
83
|
+
{ stage: "fast", ok: true, latencyMs: 1, targetMs: 100 },
|
|
84
|
+
{ stage: "slow", ok: true, latencyMs: 200, targetMs: 100 },
|
|
85
|
+
];
|
|
86
|
+
const sharp = powerIterate(emptyMpeState(0.99), results, { maxIter: 100 });
|
|
87
|
+
const soft = powerIterate(emptyMpeState(0.5), results, { maxIter: 100 });
|
|
88
|
+
const sharpGap = (sharp.trust.get("fast") ?? 0) - (sharp.trust.get("slow") ?? 0);
|
|
89
|
+
const softGap = (soft.trust.get("fast") ?? 0) - (soft.trust.get("slow") ?? 0);
|
|
90
|
+
expect(sharpGap).toBeGreaterThan(softGap);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe("MPE — recommendation engine", () => {
|
|
94
|
+
it("ranking is sorted top-down by trust", () => {
|
|
95
|
+
const results = [
|
|
96
|
+
{ stage: "a", ok: true, latencyMs: 5, targetMs: 100 },
|
|
97
|
+
{ stage: "b", ok: true, latencyMs: 50, targetMs: 100 },
|
|
98
|
+
{ stage: "c", ok: false, latencyMs: 200, targetMs: 100 },
|
|
99
|
+
];
|
|
100
|
+
const s = powerIterate(emptyMpeState(0.85), results, { maxIter: 50 });
|
|
101
|
+
const rec = recommendFromMpe(s);
|
|
102
|
+
for (let i = 1; i < rec.ranking.length; i++) {
|
|
103
|
+
expect(rec.ranking[i].trust).toBeLessThanOrEqual(rec.ranking[i - 1].trust);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
it("scaleUp picks high-trust stages whose avg latency exceeds target", () => {
|
|
107
|
+
// Fabricate state directly so we control averages.
|
|
108
|
+
const s = emptyMpeState(0.85);
|
|
109
|
+
s.trust.set("hot", 0.6);
|
|
110
|
+
s.trust.set("cold", 0.4);
|
|
111
|
+
s.callCount.set("hot", 5);
|
|
112
|
+
s.callCount.set("cold", 5);
|
|
113
|
+
s.totalLatencyMs.set("hot", 1000); // avg 200ms
|
|
114
|
+
s.totalLatencyMs.set("cold", 50); // avg 10ms
|
|
115
|
+
s.targetMs.set("hot", 100);
|
|
116
|
+
s.targetMs.set("cold", 100);
|
|
117
|
+
s.failureCount.set("hot", 0);
|
|
118
|
+
s.failureCount.set("cold", 0);
|
|
119
|
+
const rec = recommendFromMpe(s);
|
|
120
|
+
expect(rec.scaleUp).toContain("hot");
|
|
121
|
+
expect(rec.scaleUp).not.toContain("cold");
|
|
122
|
+
});
|
|
123
|
+
it("scaleDown flags low-trust + high-failure stages", () => {
|
|
124
|
+
const s = emptyMpeState(0.85);
|
|
125
|
+
s.trust.set("good", 0.7);
|
|
126
|
+
s.trust.set("flaky", 0.1);
|
|
127
|
+
s.callCount.set("good", 10);
|
|
128
|
+
s.callCount.set("flaky", 10);
|
|
129
|
+
s.failureCount.set("good", 0);
|
|
130
|
+
s.failureCount.set("flaky", 6); // 60% failure
|
|
131
|
+
s.totalLatencyMs.set("good", 100);
|
|
132
|
+
s.totalLatencyMs.set("flaky", 100);
|
|
133
|
+
const rec = recommendFromMpe(s);
|
|
134
|
+
expect(rec.scaleDown).toContain("flaky");
|
|
135
|
+
});
|
|
136
|
+
it("noSpeculate flags stages below the speculate threshold", () => {
|
|
137
|
+
const s = emptyMpeState(0.85);
|
|
138
|
+
s.trust.set("a", 0.95);
|
|
139
|
+
s.trust.set("b", 0.04);
|
|
140
|
+
s.trust.set("c", 0.01);
|
|
141
|
+
const rec = recommendFromMpe(s, { speculateThreshold: 0.3 });
|
|
142
|
+
// prior = 1/3 ≈ 0.333; cutoff = 0.3 * prior ≈ 0.1
|
|
143
|
+
expect(rec.noSpeculate).toContain("c");
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
describe("MPE — persistence", () => {
|
|
147
|
+
let dir;
|
|
148
|
+
beforeEach(() => {
|
|
149
|
+
dir = mkdtempSync(join(tmpdir(), "mneme-mpe-"));
|
|
150
|
+
});
|
|
151
|
+
afterEach(() => {
|
|
152
|
+
rmSync(dir, { recursive: true, force: true });
|
|
153
|
+
});
|
|
154
|
+
it("serialize → deserialize is round-trip stable", () => {
|
|
155
|
+
const s = updateMpe(emptyMpeState(0.85), [
|
|
156
|
+
{ stage: "x", ok: true, latencyMs: 10, targetMs: 50 },
|
|
157
|
+
{ stage: "y", ok: false, latencyMs: 200, targetMs: 50 },
|
|
158
|
+
]);
|
|
159
|
+
const out = deserializeMpeState(serializeMpeState(s));
|
|
160
|
+
expect(out.trust.get("x")).toBeCloseTo(s.trust.get("x"), 9);
|
|
161
|
+
expect(out.trust.get("y")).toBeCloseTo(s.trust.get("y"), 9);
|
|
162
|
+
expect(out.decay).toBe(0.85);
|
|
163
|
+
});
|
|
164
|
+
it("readMpeState returns empty when file does not exist", () => {
|
|
165
|
+
const s = readMpeState(dir);
|
|
166
|
+
expect(s.trust.size).toBe(0);
|
|
167
|
+
expect(s.decay).toBe(0.85);
|
|
168
|
+
});
|
|
169
|
+
it("writeMpeState then readMpeState preserves the state", () => {
|
|
170
|
+
const s = updateMpe(emptyMpeState(0.7), [
|
|
171
|
+
{ stage: "z", ok: true, latencyMs: 5, targetMs: 100 },
|
|
172
|
+
]);
|
|
173
|
+
writeMpeState(dir, s);
|
|
174
|
+
expect(existsSync(join(dir, ".mneme", "mpe.json"))).toBe(true);
|
|
175
|
+
const back = readMpeState(dir);
|
|
176
|
+
expect(back.decay).toBe(0.7);
|
|
177
|
+
expect(back.trust.get("z")).toBeCloseTo(s.trust.get("z"), 9);
|
|
178
|
+
});
|
|
179
|
+
it("readMpeState handles corrupt JSON gracefully", () => {
|
|
180
|
+
writeMpeState(dir, emptyMpeState());
|
|
181
|
+
const f = join(dir, ".mneme", "mpe.json");
|
|
182
|
+
// Stomp the file with garbage.
|
|
183
|
+
require("node:fs").writeFileSync(f, "{not json", "utf8");
|
|
184
|
+
const back = readMpeState(dir);
|
|
185
|
+
expect(back.trust.size).toBe(0);
|
|
186
|
+
});
|
|
187
|
+
it("written file is valid JSON", () => {
|
|
188
|
+
const s = updateMpe(emptyMpeState(), [
|
|
189
|
+
{ stage: "a", ok: true, latencyMs: 1, targetMs: 10 },
|
|
190
|
+
]);
|
|
191
|
+
writeMpeState(dir, s);
|
|
192
|
+
const text = readFileSync(join(dir, ".mneme", "mpe.json"), "utf8");
|
|
193
|
+
expect(() => JSON.parse(text)).not.toThrow();
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
//# sourceMappingURL=mpe.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mpe.test.js","sourceRoot":"","sources":["../../src/pipeline/mpe.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.integration.test.d.ts","sourceRoot":"","sources":["../../src/pipeline/pipeline.integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { runDeepPipeline, defineStage } from "./index.js";
|
|
3
|
+
import { runPipeline } from "./super-pipeline.js";
|
|
4
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
5
|
+
async function collect(it) {
|
|
6
|
+
const out = [];
|
|
7
|
+
for await (const v of it)
|
|
8
|
+
out.push(v);
|
|
9
|
+
return out;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Simulated 4-stage pipeline modeled after Mneme's real flow:
|
|
13
|
+
* parse → embed → score → render
|
|
14
|
+
*
|
|
15
|
+
* Each stage has a controlled mock latency so we can compare a sequential
|
|
16
|
+
* baseline against a deeply-pipelined-with-superscalar run and verify the
|
|
17
|
+
* speedup ratio.
|
|
18
|
+
*/
|
|
19
|
+
function buildStages(latencies) {
|
|
20
|
+
const parse = defineStage("parse", "tokenize input", async (s) => {
|
|
21
|
+
await sleep(latencies.parse);
|
|
22
|
+
return { tokens: s.split(/\s+/) };
|
|
23
|
+
}, { targetMs: 10 });
|
|
24
|
+
const embed = defineStage("embed", "vectorize tokens", async (x) => {
|
|
25
|
+
await sleep(latencies.embed);
|
|
26
|
+
return { vec: x.tokens.map((t) => t.length) };
|
|
27
|
+
}, { targetMs: 30 });
|
|
28
|
+
const score = defineStage("score", "compute score", async (x) => {
|
|
29
|
+
await sleep(latencies.score);
|
|
30
|
+
return { ...x, score: x.vec.reduce((a, b) => a + b, 0) };
|
|
31
|
+
}, { targetMs: 5 });
|
|
32
|
+
const render = defineStage("render", "format output", async (x) => {
|
|
33
|
+
await sleep(latencies.render);
|
|
34
|
+
return `score=${x.score}`;
|
|
35
|
+
}, { targetMs: 5 });
|
|
36
|
+
return [parse, embed, score, render];
|
|
37
|
+
}
|
|
38
|
+
describe("integration — 4-stage parse → embed → score → render", () => {
|
|
39
|
+
it("produces correct outputs in input order", async () => {
|
|
40
|
+
const stages = buildStages({ parse: 1, embed: 1, score: 1, render: 1 });
|
|
41
|
+
const inputs = ["a b c", "x y", "p q r s"];
|
|
42
|
+
const out = await runDeepPipeline({ stages }, inputs);
|
|
43
|
+
expect(out).toEqual(["score=3", "score=2", "score=4"]);
|
|
44
|
+
});
|
|
45
|
+
it("deeply-pipelined-with-width-2 outperforms a sequential baseline", async () => {
|
|
46
|
+
const latencies = { parse: 12, embed: 12, score: 12, render: 12 };
|
|
47
|
+
const inputs = Array.from({ length: 8 }, (_, i) => "token ".repeat(i + 1).trim());
|
|
48
|
+
// Sequential baseline: width=1, bufferSize=1 (one item moves through at a time).
|
|
49
|
+
const stages = buildStages(latencies);
|
|
50
|
+
const t0 = Date.now();
|
|
51
|
+
await runDeepPipeline({ stages, width: 1, bufferSize: 1 }, inputs);
|
|
52
|
+
const seq = Date.now() - t0;
|
|
53
|
+
// Deeply-pipelined + superscalar (width=2 per stage).
|
|
54
|
+
const t1 = Date.now();
|
|
55
|
+
await runDeepPipeline({ stages, width: 2, bufferSize: 4 }, inputs);
|
|
56
|
+
const par = Date.now() - t1;
|
|
57
|
+
// Speedup: parallel should be substantially faster. With 4 stages × 12ms
|
|
58
|
+
// each and width=2 we expect close to a 2× speedup in the steady state.
|
|
59
|
+
// Use a loose lower bound (par < seq * 0.85) to keep the test stable.
|
|
60
|
+
expect(par).toBeLessThan(seq * 0.85);
|
|
61
|
+
// Print the speedup for the report.
|
|
62
|
+
// eslint-disable-next-line no-console
|
|
63
|
+
console.log(`[pipeline.integration] sequential=${seq}ms pipelined+width2=${par}ms speedup=${(seq / par).toFixed(2)}×`);
|
|
64
|
+
});
|
|
65
|
+
it("emits stage-start / stage-done for every stage on every item", async () => {
|
|
66
|
+
const stages = buildStages({ parse: 1, embed: 1, score: 1, render: 1 });
|
|
67
|
+
const events = [];
|
|
68
|
+
const cfg = {
|
|
69
|
+
stages,
|
|
70
|
+
width: 2,
|
|
71
|
+
onEvent: (e) => events.push(e),
|
|
72
|
+
};
|
|
73
|
+
await runDeepPipeline(cfg, ["a b", "c d", "e f"]);
|
|
74
|
+
// 4 stages × 3 items = 12 stage-done events expected.
|
|
75
|
+
expect(events.filter((e) => e.kind === "stage-done")).toHaveLength(12);
|
|
76
|
+
});
|
|
77
|
+
it("MPE state captures every stage's call/success counts", async () => {
|
|
78
|
+
const stages = buildStages({ parse: 1, embed: 1, score: 1, render: 1 });
|
|
79
|
+
// Run via raw runPipeline so we can inspect the state side-effect.
|
|
80
|
+
// We approximate by counting stage-done events (state is in-memory only
|
|
81
|
+
// when persist=false; the public surface for state inspection across
|
|
82
|
+
// runs is .mneme/mpe.json).
|
|
83
|
+
const events = [];
|
|
84
|
+
for await (const _ of runPipeline({ stages, onEvent: (e) => events.push(e) }, ["a b", "c d"])) {
|
|
85
|
+
// drain
|
|
86
|
+
}
|
|
87
|
+
const dones = events.filter((e) => e.kind === "stage-done");
|
|
88
|
+
const byStage = new Map();
|
|
89
|
+
for (const d of dones) {
|
|
90
|
+
if (d.kind === "stage-done")
|
|
91
|
+
byStage.set(d.stage, (byStage.get(d.stage) ?? 0) + 1);
|
|
92
|
+
}
|
|
93
|
+
expect(byStage.get("parse")).toBe(2);
|
|
94
|
+
expect(byStage.get("embed")).toBe(2);
|
|
95
|
+
expect(byStage.get("score")).toBe(2);
|
|
96
|
+
expect(byStage.get("render")).toBe(2);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
//# sourceMappingURL=pipeline.integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.integration.test.js","sourceRoot":"","sources":["../../src/pipeline/pipeline.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Super Pipeline runtime.
|
|
3
|
+
*
|
|
4
|
+
* Combines deep pipelining (many short stages running concurrently) with
|
|
5
|
+
* superscalar widths (multiple workers per stage). Tasks flow through a
|
|
6
|
+
* chain of bounded async queues — when a downstream queue fills, upstream
|
|
7
|
+
* workers block on push (backpressure).
|
|
8
|
+
*
|
|
9
|
+
* MPE training: the runtime emits StageResult observations and applies
|
|
10
|
+
* updateMpe at the end of the run so the next run starts with smarter trust.
|
|
11
|
+
*/
|
|
12
|
+
import type { PipelineConfig, SeqItem } from "./types.js";
|
|
13
|
+
import { recommendFromMpe, type MpeState } from "./mpe.js";
|
|
14
|
+
/**
|
|
15
|
+
* Run a deeply-pipelined superscalar engine.
|
|
16
|
+
*
|
|
17
|
+
* Each stage owns:
|
|
18
|
+
* - a bounded input queue (default 16)
|
|
19
|
+
* - a worker pool of `width[i]` parallel processors
|
|
20
|
+
*
|
|
21
|
+
* Workers pull from their input queue, run stage.process, and push to the
|
|
22
|
+
* NEXT stage's input queue. Backpressure is automatic: a slow downstream
|
|
23
|
+
* fills its queue, which blocks upstream pushes.
|
|
24
|
+
*
|
|
25
|
+
* Outputs are yielded in COMPLETION order (out-of-order possible). Use the
|
|
26
|
+
* sequence id on the yielded SeqItem to re-sort if input order matters; the
|
|
27
|
+
* convenience helper runDeepPipeline in ./index.ts does this for you.
|
|
28
|
+
*/
|
|
29
|
+
export declare function runPipeline<I, O>(cfg: PipelineConfig, inputs: AsyncIterable<I> | Iterable<I>): AsyncIterable<SeqItem<O>>;
|
|
30
|
+
/**
|
|
31
|
+
* Convenience: run the pipeline and capture the final MPE recommendation
|
|
32
|
+
* without yielding outputs. Useful for orchestration / tuning.
|
|
33
|
+
*/
|
|
34
|
+
export declare function trainMpeOnly(cfg: PipelineConfig, inputs: AsyncIterable<unknown> | Iterable<unknown>): Promise<{
|
|
35
|
+
state: MpeState;
|
|
36
|
+
recommendation: ReturnType<typeof recommendFromMpe>;
|
|
37
|
+
}>;
|
|
38
|
+
//# sourceMappingURL=super-pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"super-pipeline.d.ts","sourceRoot":"","sources":["../../src/pipeline/super-pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAEV,cAAc,EAGd,OAAO,EAER,MAAM,YAAY,CAAC;AACpB,OAAO,EAGL,gBAAgB,EAGhB,KAAK,QAAQ,EAEd,MAAM,UAAU,CAAC;AAkFlB;;;;;;;;;;;;;;GAcG;AACH,wBAAuB,WAAW,CAAC,CAAC,EAAE,CAAC,EACrC,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GACrC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAgI3B;AAYD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,GACjD,OAAO,CAAC;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,cAAc,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAA;CAAE,CAAC,CAWnF"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { emptyMpeState, readMpeState, recommendFromMpe, updateMpe, writeMpeState, } from "./mpe.js";
|
|
2
|
+
/* ─────────────────────── Bounded queue ─────────────────────── */
|
|
3
|
+
/**
|
|
4
|
+
* Asynchronous bounded FIFO queue. push() resolves when a slot is free
|
|
5
|
+
* (backpressure). next() resolves with the next item, or { done: true }
|
|
6
|
+
* when the queue is closed and empty.
|
|
7
|
+
*/
|
|
8
|
+
class BoundedQueue {
|
|
9
|
+
capacity;
|
|
10
|
+
buffer = [];
|
|
11
|
+
closed = false;
|
|
12
|
+
waitingPushers = [];
|
|
13
|
+
waitingPullers = [];
|
|
14
|
+
constructor(capacity) {
|
|
15
|
+
this.capacity = capacity;
|
|
16
|
+
}
|
|
17
|
+
async push(item) {
|
|
18
|
+
if (this.closed)
|
|
19
|
+
throw new Error("BoundedQueue: push to closed queue");
|
|
20
|
+
while (this.buffer.length >= this.capacity) {
|
|
21
|
+
await new Promise((resolve) => this.waitingPushers.push(resolve));
|
|
22
|
+
if (this.closed)
|
|
23
|
+
throw new Error("BoundedQueue: closed during push");
|
|
24
|
+
}
|
|
25
|
+
this.buffer.push(item);
|
|
26
|
+
const puller = this.waitingPullers.shift();
|
|
27
|
+
if (puller)
|
|
28
|
+
puller({ value: this.buffer.shift(), done: false });
|
|
29
|
+
}
|
|
30
|
+
async next() {
|
|
31
|
+
if (this.buffer.length > 0) {
|
|
32
|
+
const value = this.buffer.shift();
|
|
33
|
+
const pusher = this.waitingPushers.shift();
|
|
34
|
+
if (pusher)
|
|
35
|
+
pusher();
|
|
36
|
+
return { value, done: false };
|
|
37
|
+
}
|
|
38
|
+
if (this.closed) {
|
|
39
|
+
return { value: undefined, done: true };
|
|
40
|
+
}
|
|
41
|
+
return new Promise((resolve) => {
|
|
42
|
+
this.waitingPullers.push(resolve);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
close() {
|
|
46
|
+
if (this.closed)
|
|
47
|
+
return;
|
|
48
|
+
this.closed = true;
|
|
49
|
+
// Wake every waiting puller with done; wake every waiting pusher so
|
|
50
|
+
// they error out on the closed check.
|
|
51
|
+
while (this.waitingPullers.length > 0) {
|
|
52
|
+
const p = this.waitingPullers.shift();
|
|
53
|
+
p({ value: undefined, done: true });
|
|
54
|
+
}
|
|
55
|
+
while (this.waitingPushers.length > 0) {
|
|
56
|
+
const p = this.waitingPushers.shift();
|
|
57
|
+
p();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
size() {
|
|
61
|
+
return this.buffer.length;
|
|
62
|
+
}
|
|
63
|
+
[Symbol.asyncIterator]() {
|
|
64
|
+
return {
|
|
65
|
+
next: () => this.next(),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/* ─────────────────────── width helper ─────────────────────── */
|
|
70
|
+
function resolveWidth(width, n) {
|
|
71
|
+
if (width === undefined)
|
|
72
|
+
return Array.from({ length: n }, () => 1);
|
|
73
|
+
if (typeof width === "number")
|
|
74
|
+
return Array.from({ length: n }, () => Math.max(1, width));
|
|
75
|
+
// Array form — pad / truncate to n.
|
|
76
|
+
const out = [];
|
|
77
|
+
for (let i = 0; i < n; i++)
|
|
78
|
+
out.push(Math.max(1, width[i] ?? 1));
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
81
|
+
/* ─────────────────────── runPipeline ─────────────────────── */
|
|
82
|
+
/**
|
|
83
|
+
* Run a deeply-pipelined superscalar engine.
|
|
84
|
+
*
|
|
85
|
+
* Each stage owns:
|
|
86
|
+
* - a bounded input queue (default 16)
|
|
87
|
+
* - a worker pool of `width[i]` parallel processors
|
|
88
|
+
*
|
|
89
|
+
* Workers pull from their input queue, run stage.process, and push to the
|
|
90
|
+
* NEXT stage's input queue. Backpressure is automatic: a slow downstream
|
|
91
|
+
* fills its queue, which blocks upstream pushes.
|
|
92
|
+
*
|
|
93
|
+
* Outputs are yielded in COMPLETION order (out-of-order possible). Use the
|
|
94
|
+
* sequence id on the yielded SeqItem to re-sort if input order matters; the
|
|
95
|
+
* convenience helper runDeepPipeline in ./index.ts does this for you.
|
|
96
|
+
*/
|
|
97
|
+
export async function* runPipeline(cfg, inputs) {
|
|
98
|
+
const stages = cfg.stages;
|
|
99
|
+
if (stages.length === 0) {
|
|
100
|
+
throw new Error("runPipeline: at least one stage required");
|
|
101
|
+
}
|
|
102
|
+
const widths = resolveWidth(cfg.width, stages.length);
|
|
103
|
+
const bufferSize = Math.max(1, cfg.bufferSize ?? 16);
|
|
104
|
+
// MPE state — load if persistent, otherwise empty in-memory.
|
|
105
|
+
const mpeCfg = cfg.mpe ?? {};
|
|
106
|
+
let mpeState = mpeCfg.persist && mpeCfg.repoRoot
|
|
107
|
+
? readMpeState(mpeCfg.repoRoot)
|
|
108
|
+
: emptyMpeState(mpeCfg.decay ?? 0.85);
|
|
109
|
+
// Seed targetMs map from stage definitions so latency weighting works.
|
|
110
|
+
for (const s of stages) {
|
|
111
|
+
if (s.targetMs !== undefined && !mpeState.targetMs.has(s.id)) {
|
|
112
|
+
mpeState.targetMs.set(s.id, s.targetMs);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Build queues: queue[i] is the INPUT to stage i. queue[stages.length] is
|
|
116
|
+
// the final output queue.
|
|
117
|
+
const queues = [];
|
|
118
|
+
for (let i = 0; i <= stages.length; i++) {
|
|
119
|
+
queues.push(new BoundedQueue(bufferSize));
|
|
120
|
+
}
|
|
121
|
+
const onEvent = cfg.onEvent;
|
|
122
|
+
const emit = (e) => onEvent?.(e);
|
|
123
|
+
const observations = [];
|
|
124
|
+
// Spawn workers for each stage.
|
|
125
|
+
const workerPromises = [];
|
|
126
|
+
for (let i = 0; i < stages.length; i++) {
|
|
127
|
+
const stage = stages[i];
|
|
128
|
+
const inQ = queues[i];
|
|
129
|
+
const outQ = queues[i + 1];
|
|
130
|
+
const width = widths[i];
|
|
131
|
+
let liveWorkers = width;
|
|
132
|
+
for (let w = 0; w < width; w++) {
|
|
133
|
+
const workerId = w;
|
|
134
|
+
const ctx = {
|
|
135
|
+
trust: mpeState.trust.get(stage.id) ?? 1 / Math.max(stages.length, 1),
|
|
136
|
+
workerId,
|
|
137
|
+
emit,
|
|
138
|
+
};
|
|
139
|
+
const p = (async () => {
|
|
140
|
+
while (true) {
|
|
141
|
+
const next = await inQ.next();
|
|
142
|
+
if (next.done)
|
|
143
|
+
break;
|
|
144
|
+
const { seq, value } = next.value;
|
|
145
|
+
const t0 = Date.now();
|
|
146
|
+
emit({ kind: "stage-start", stage: stage.id, workerId });
|
|
147
|
+
try {
|
|
148
|
+
const out = await stage.process(value, ctx);
|
|
149
|
+
const dt = Date.now() - t0;
|
|
150
|
+
emit({ kind: "stage-done", stage: stage.id, workerId, latencyMs: dt });
|
|
151
|
+
observations.push({
|
|
152
|
+
stage: stage.id,
|
|
153
|
+
ok: true,
|
|
154
|
+
latencyMs: dt,
|
|
155
|
+
targetMs: stage.targetMs,
|
|
156
|
+
});
|
|
157
|
+
await outQ.push({ seq, value: out });
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
const dt = Date.now() - t0;
|
|
161
|
+
emit({
|
|
162
|
+
kind: "stage-fail",
|
|
163
|
+
stage: stage.id,
|
|
164
|
+
workerId,
|
|
165
|
+
error: err.message ?? String(err),
|
|
166
|
+
});
|
|
167
|
+
observations.push({
|
|
168
|
+
stage: stage.id,
|
|
169
|
+
ok: false,
|
|
170
|
+
latencyMs: dt,
|
|
171
|
+
targetMs: stage.targetMs,
|
|
172
|
+
});
|
|
173
|
+
// Failure isolation: drop the failing item, keep the pipeline alive.
|
|
174
|
+
// The seq is consumed; downstream consumer should treat missing
|
|
175
|
+
// seqs as "skipped" (reorderBySeq tolerates this on close).
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
})().finally(() => {
|
|
179
|
+
liveWorkers -= 1;
|
|
180
|
+
if (liveWorkers === 0)
|
|
181
|
+
outQ.close();
|
|
182
|
+
});
|
|
183
|
+
workerPromises.push(p);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Producer: feed inputs into the head queue with sequence ids.
|
|
187
|
+
const producer = (async () => {
|
|
188
|
+
let seq = 0;
|
|
189
|
+
for await (const v of toAsyncIterable(inputs)) {
|
|
190
|
+
await queues[0].push({ seq, value: v });
|
|
191
|
+
seq += 1;
|
|
192
|
+
}
|
|
193
|
+
queues[0].close();
|
|
194
|
+
})();
|
|
195
|
+
// Drain the final queue and yield outputs as they appear.
|
|
196
|
+
try {
|
|
197
|
+
const finalQ = queues[stages.length];
|
|
198
|
+
while (true) {
|
|
199
|
+
const next = await finalQ.next();
|
|
200
|
+
if (next.done)
|
|
201
|
+
break;
|
|
202
|
+
yield next.value;
|
|
203
|
+
}
|
|
204
|
+
await producer;
|
|
205
|
+
await Promise.all(workerPromises);
|
|
206
|
+
}
|
|
207
|
+
finally {
|
|
208
|
+
// Apply MPE update + persist.
|
|
209
|
+
if (observations.length > 0) {
|
|
210
|
+
mpeState = updateMpe(mpeState, observations);
|
|
211
|
+
if (mpeCfg.persist && mpeCfg.repoRoot) {
|
|
212
|
+
try {
|
|
213
|
+
writeMpeState(mpeCfg.repoRoot, mpeState);
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
// best-effort; never let persistence kill the pipeline
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
async function* toAsyncIterable(src) {
|
|
223
|
+
if (Symbol.asyncIterator in src) {
|
|
224
|
+
for await (const v of src)
|
|
225
|
+
yield v;
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
for (const v of src)
|
|
229
|
+
yield v;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Convenience: run the pipeline and capture the final MPE recommendation
|
|
233
|
+
* without yielding outputs. Useful for orchestration / tuning.
|
|
234
|
+
*/
|
|
235
|
+
export async function trainMpeOnly(cfg, inputs) {
|
|
236
|
+
const out = [];
|
|
237
|
+
for await (const item of runPipeline(cfg, inputs))
|
|
238
|
+
out.push(item);
|
|
239
|
+
// Re-read state from disk if persisted, else build from observations live.
|
|
240
|
+
// We expose recommend() based on the last persisted state; tests typically
|
|
241
|
+
// pass persist=false and read state directly via the public API instead.
|
|
242
|
+
const state = cfg.mpe?.persist && cfg.mpe?.repoRoot
|
|
243
|
+
? readMpeState(cfg.mpe.repoRoot)
|
|
244
|
+
: emptyMpeState(cfg.mpe?.decay ?? 0.85);
|
|
245
|
+
return { state, recommendation: recommendFromMpe(state) };
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=super-pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"super-pipeline.js","sourceRoot":"","sources":["../../src/pipeline/super-pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"super-pipeline.test.d.ts","sourceRoot":"","sources":["../../src/pipeline/super-pipeline.test.ts"],"names":[],"mappings":""}
|