agentic-flow 3.2.0 → 3.3.1
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/.agents/skills/agentic-flow-ecosystem/SKILL.md +6 -5
- package/.claude/skills/agentic-flow-ecosystem/skill.md +6 -5
- package/CHANGELOG.md +45 -0
- package/README.md +2 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/config/claudeFlow.d.ts +1 -1
- package/dist/integrations/index.d.ts +2 -2
- package/dist/integrations/index.d.ts.map +1 -1
- package/dist/integrations/index.js +1 -1
- package/dist/integrations/index.js.map +1 -1
- package/dist/integrations/optional.d.ts +3 -15
- package/dist/integrations/optional.d.ts.map +1 -1
- package/dist/integrations/optional.js +4 -28
- package/dist/integrations/optional.js.map +1 -1
- package/dist/integrations/sublinear.d.ts +56 -28
- package/dist/integrations/sublinear.d.ts.map +1 -1
- package/dist/integrations/sublinear.js +165 -89
- package/dist/integrations/sublinear.js.map +1 -1
- package/dist/intelligence/RuVectorIntelligence.d.ts +4 -2
- package/dist/intelligence/RuVectorIntelligence.d.ts.map +1 -1
- package/dist/intelligence/RuVectorIntelligence.js +39 -13
- package/dist/intelligence/RuVectorIntelligence.js.map +1 -1
- package/dist/mcp/standalone-stdio.js +1 -1
- package/dist/mcp/standalone-stdio.js.map +1 -1
- package/dist/mcp/tools/ecosystem-tools.d.ts +4 -4
- package/dist/mcp/tools/ecosystem-tools.d.ts.map +1 -1
- package/dist/mcp/tools/ecosystem-tools.js +30 -8
- package/dist/mcp/tools/ecosystem-tools.js.map +1 -1
- package/dist/optimizations/configuration-tuning.d.ts +1 -1
- package/dist/services/sona-loader.d.ts +15 -1
- package/dist/services/sona-loader.d.ts.map +1 -1
- package/dist/services/sona-loader.js +54 -2
- package/dist/services/sona-loader.js.map +1 -1
- package/package.json +5 -5
|
@@ -1,22 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Linear solves and PageRank through
|
|
2
|
+
* Linear solves and PageRank through `@ruvnet/sublinear-core`, verified.
|
|
3
3
|
*
|
|
4
|
-
* sublinear-
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* -
|
|
10
|
-
*
|
|
11
|
-
* built-in Gauss-Seidel solve replaces it when the check fails;
|
|
12
|
-
* - the import, construction and solve run with console output sent to stderr
|
|
13
|
-
* (the MCP stdio server owns stdout).
|
|
4
|
+
* @ruvnet/sublinear-core (optionalDependency, zero dependencies, ~220 kB) is
|
|
5
|
+
* the embeddable core of sublinear-time-solver: sparse iterative solvers
|
|
6
|
+
* (Gauss-Seidel, conjugate gradient, Jacobi, Neumann), PageRank, personalized
|
|
7
|
+
* PageRank and local forward push. It reports the residual of the x it
|
|
8
|
+
* returns, but every answer is still checked here against ||Mx - b||_inf, and
|
|
9
|
+
* a built-in Gauss-Seidel solve replaces it when the check fails or the
|
|
10
|
+
* package is not installed.
|
|
14
11
|
*
|
|
15
12
|
* The 5 bundled `sublinear/*` agents name sublinear-time-solver tools; the
|
|
16
13
|
* `sublinear_solve` / `sublinear_pagerank` MCP tools in this package give them
|
|
17
14
|
* a working in-process path without a separate MCP server.
|
|
18
15
|
*/
|
|
19
|
-
import { importOptional
|
|
16
|
+
import { importOptional } from './optional.js';
|
|
17
|
+
export const SUBLINEAR_CORE = '@ruvnet/sublinear-core';
|
|
20
18
|
function toCsr(m) {
|
|
21
19
|
if (Array.isArray(m)) {
|
|
22
20
|
const n = m.length;
|
|
@@ -86,42 +84,32 @@ function gaussSeidel(a, b, tol, maxIterations) {
|
|
|
86
84
|
}
|
|
87
85
|
return { x, iterations: it };
|
|
88
86
|
}
|
|
89
|
-
|
|
90
|
-
async function
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
await new Promise((r) => setTimeout(r, 0));
|
|
104
|
-
if (solverCache.size > 8)
|
|
105
|
-
solverCache.clear();
|
|
106
|
-
solverCache.set(key, solver);
|
|
87
|
+
/** The core module, or null when it is not installed. */
|
|
88
|
+
export async function loadSublinearCore() {
|
|
89
|
+
const mod = await importOptional(SUBLINEAR_CORE);
|
|
90
|
+
return typeof mod?.solve === 'function' && typeof mod?.pageRank === 'function' ? mod : null;
|
|
91
|
+
}
|
|
92
|
+
function coreSolve(core, a, b, tol, maxIterations, method) {
|
|
93
|
+
const rowIndices = [];
|
|
94
|
+
const colIndices = [];
|
|
95
|
+
const values = [];
|
|
96
|
+
a.rows.forEach((row, i) => {
|
|
97
|
+
for (const [j, v] of row) {
|
|
98
|
+
rowIndices.push(i);
|
|
99
|
+
colIndices.push(j);
|
|
100
|
+
values.push(v);
|
|
107
101
|
}
|
|
108
|
-
const values = [];
|
|
109
|
-
const rowIndices = [];
|
|
110
|
-
const colIndices = [];
|
|
111
|
-
a.rows.forEach((row, i) => {
|
|
112
|
-
for (const [j, v] of row) {
|
|
113
|
-
values.push(v);
|
|
114
|
-
rowIndices.push(i);
|
|
115
|
-
colIndices.push(j);
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
const res = await solver.solve({ rows: a.n, cols: a.n, values, rowIndices, colIndices, format: 'coo' }, b);
|
|
119
|
-
return Array.isArray(res?.solution) ? res.solution.map(Number) : null;
|
|
120
102
|
});
|
|
103
|
+
const A = core.csrFromCoo({ rows: a.n, cols: a.n, rowIndices, colIndices, values });
|
|
104
|
+
// Core stops on the relative L2 residual ||b - Ax||_2 / ||b||_2. The local
|
|
105
|
+
// gate is an absolute inf-norm bound, and ||r||_inf <= ||r||_2, so asking
|
|
106
|
+
// core for tol / sqrt(n) keeps every converged core answer inside it.
|
|
107
|
+
return core.solve(A, b, { method, tolerance: tol / Math.sqrt(a.n), maxIterations });
|
|
121
108
|
}
|
|
122
109
|
/**
|
|
123
|
-
* Solve Mx = b. Intended for (row) diagonally dominant
|
|
124
|
-
* attempted with Gauss-Seidel and reported with
|
|
110
|
+
* Solve Mx = b. Intended for (row) diagonally dominant or symmetric positive
|
|
111
|
+
* definite M; other matrices are attempted with Gauss-Seidel and reported with
|
|
112
|
+
* `converged: false` if it fails.
|
|
125
113
|
*/
|
|
126
114
|
export async function solveLinearSystem(matrix, b, options = {}) {
|
|
127
115
|
const a = toCsr(matrix);
|
|
@@ -131,24 +119,28 @@ export async function solveLinearSystem(matrix, b, options = {}) {
|
|
|
131
119
|
throw new Error('vector entries must be finite');
|
|
132
120
|
const tol = options.tolerance ?? 1e-8;
|
|
133
121
|
const maxIterations = Math.min(options.maxIterations ?? 10000, 1_000_000);
|
|
134
|
-
//
|
|
122
|
+
// Absolute inf-norm acceptance scaled to the problem: tol on ||b||_inf ~ 1.
|
|
135
123
|
const scale = Math.max(1, ...b.map(Math.abs));
|
|
136
124
|
const accept = tol * scale * 10;
|
|
137
125
|
const diagonallyDominant = isDiagonallyDominant(a);
|
|
138
126
|
let libraryRejected;
|
|
139
127
|
if (options.engine !== 'builtin') {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
const r =
|
|
144
|
-
|
|
145
|
-
|
|
128
|
+
const core = await loadSublinearCore();
|
|
129
|
+
if (core) {
|
|
130
|
+
try {
|
|
131
|
+
const r = coreSolve(core, a, b, tol, maxIterations, options.method ?? 'auto');
|
|
132
|
+
const x = Array.from(r.x);
|
|
133
|
+
const residual = residualInf(a, x, b);
|
|
134
|
+
if (r.converged && x.every(Number.isFinite) && residual <= accept) {
|
|
135
|
+
return { solution: x, residual, converged: true, iterations: r.iterations, diagonallyDominant, engine: 'sublinear-core', method: r.method };
|
|
146
136
|
}
|
|
147
|
-
libraryRejected =
|
|
137
|
+
libraryRejected = r.converged
|
|
138
|
+
? `residual ${residual.toExponential(2)} above ${accept.toExponential(2)}`
|
|
139
|
+
: `${r.method} did not converge in ${r.iterations} iterations (relative residual ${Number(r.residual).toExponential(2)})`;
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
libraryRejected = err?.message ?? String(err);
|
|
148
143
|
}
|
|
149
|
-
}
|
|
150
|
-
catch (err) {
|
|
151
|
-
libraryRejected = err?.message ?? String(err);
|
|
152
144
|
}
|
|
153
145
|
}
|
|
154
146
|
const { x, iterations } = gaussSeidel(a, b, accept, maxIterations);
|
|
@@ -160,50 +152,74 @@ export async function solveLinearSystem(matrix, b, options = {}) {
|
|
|
160
152
|
iterations,
|
|
161
153
|
diagonallyDominant,
|
|
162
154
|
engine: 'builtin',
|
|
155
|
+
method: 'gauss-seidel',
|
|
163
156
|
...(libraryRejected ? { libraryRejected } : {}),
|
|
164
157
|
};
|
|
165
158
|
}
|
|
166
|
-
|
|
167
|
-
* PageRank over a directed graph as a linear system:
|
|
168
|
-
* (I - d·Pᵀ) y = 1, then scores = y / Σy. With dangling rows left at zero this
|
|
169
|
-
* equals PageRank with uniform teleport from dangling nodes.
|
|
170
|
-
*/
|
|
171
|
-
export async function pageRank(edges, options = {}) {
|
|
172
|
-
const d = options.damping ?? 0.85;
|
|
173
|
-
if (!(d > 0 && d < 1))
|
|
174
|
-
throw new Error('damping must be in (0, 1)');
|
|
159
|
+
function indexGraph(edges, options) {
|
|
175
160
|
const ids = new Map();
|
|
176
161
|
const names = [];
|
|
177
162
|
const add = (s) => {
|
|
178
|
-
|
|
179
|
-
|
|
163
|
+
let i = ids.get(s);
|
|
164
|
+
if (i === undefined) {
|
|
165
|
+
i = names.length;
|
|
166
|
+
ids.set(s, i);
|
|
180
167
|
names.push(s);
|
|
181
168
|
}
|
|
182
|
-
return
|
|
169
|
+
return i;
|
|
183
170
|
};
|
|
184
171
|
for (const n of options.nodes ?? [])
|
|
185
172
|
add(String(n));
|
|
186
|
-
const
|
|
173
|
+
const indexed = [];
|
|
187
174
|
for (const e of edges) {
|
|
188
175
|
const w = e.weight ?? 1;
|
|
189
176
|
if (!Number.isFinite(w) || w < 0)
|
|
190
177
|
throw new Error(`invalid edge weight ${w}`);
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
178
|
+
indexed.push([add(String(e.from)), add(String(e.to)), w]);
|
|
179
|
+
}
|
|
180
|
+
const out = Array.from({ length: names.length }, () => new Map());
|
|
181
|
+
for (const [a, b, w] of indexed)
|
|
195
182
|
out[a].set(b, (out[a].get(b) ?? 0) + w);
|
|
183
|
+
let teleport = null;
|
|
184
|
+
if (options.seeds !== undefined) {
|
|
185
|
+
const weights = Array.isArray(options.seeds)
|
|
186
|
+
? options.seeds.map((s) => [String(s), 1])
|
|
187
|
+
: Object.entries(options.seeds);
|
|
188
|
+
if (weights.length === 0)
|
|
189
|
+
throw new Error('seeds must name at least one node');
|
|
190
|
+
teleport = new Array(names.length).fill(0);
|
|
191
|
+
for (const [name, w] of weights) {
|
|
192
|
+
const i = ids.get(name);
|
|
193
|
+
if (i === undefined)
|
|
194
|
+
throw new Error(`unknown seed node ${name}`);
|
|
195
|
+
if (!Number.isFinite(w) || w < 0)
|
|
196
|
+
throw new Error(`invalid seed weight ${w} for ${name}`);
|
|
197
|
+
teleport[i] += w;
|
|
198
|
+
}
|
|
199
|
+
const total = teleport.reduce((s, v) => s + v, 0);
|
|
200
|
+
if (!(total > 0))
|
|
201
|
+
throw new Error('seed weights must not all be zero');
|
|
202
|
+
teleport = teleport.map((v) => v / total);
|
|
196
203
|
}
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
204
|
+
return { names, edges: indexed, out, teleport };
|
|
205
|
+
}
|
|
206
|
+
function rank(names, scores, top) {
|
|
207
|
+
const entries = scores instanceof Map ? [...scores] : scores.map((s, i) => [i, s]);
|
|
208
|
+
entries.sort((x, y) => y[1] - x[1] || x[0] - y[0]);
|
|
209
|
+
return (top ? entries.slice(0, top) : entries).map(([i, score]) => ({ node: names[i], score }));
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Built-in PageRank as a linear system: (I - d·Pᵀ) y = v, scores = y / Σy,
|
|
213
|
+
* with v uniform or the seed distribution. With dangling rows left at zero
|
|
214
|
+
* this equals PageRank whose dangling mass follows the teleport vector, which
|
|
215
|
+
* is also what the core computes.
|
|
216
|
+
*/
|
|
217
|
+
async function builtinPageRank(g, d) {
|
|
218
|
+
const n = g.names.length;
|
|
203
219
|
const entries = [];
|
|
204
220
|
for (let i = 0; i < n; i++)
|
|
205
221
|
entries.push({ row: i, col: i, value: 1 });
|
|
206
|
-
out.forEach((links, src) => {
|
|
222
|
+
g.out.forEach((links, src) => {
|
|
207
223
|
let total = 0;
|
|
208
224
|
for (const w of links.values())
|
|
209
225
|
total += w;
|
|
@@ -212,16 +228,76 @@ export async function pageRank(edges, options = {}) {
|
|
|
212
228
|
for (const [dst, w] of links)
|
|
213
229
|
entries.push({ row: dst, col: src, value: -d * (w / total) });
|
|
214
230
|
});
|
|
215
|
-
const
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
}
|
|
219
|
-
|
|
231
|
+
const v = g.teleport ?? new Array(n).fill(1);
|
|
232
|
+
const res = await solveLinearSystem({ size: n, entries }, v, { tolerance: 1e-10, engine: 'builtin' });
|
|
233
|
+
const sum = res.solution.reduce((s, x) => s + x, 0) || 1;
|
|
234
|
+
return { scores: res.solution.map((x) => x / sum), residual: res.residual };
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* PageRank over a directed graph, or personalized PageRank from `seeds`.
|
|
238
|
+
* Scores sum to 1 (approximate runs: to 1 - residualMass).
|
|
239
|
+
*/
|
|
240
|
+
export async function pageRank(edges, options = {}) {
|
|
241
|
+
const d = options.damping ?? 0.85;
|
|
242
|
+
if (!(d > 0 && d < 1))
|
|
243
|
+
throw new Error('damping must be in (0, 1)');
|
|
244
|
+
if (options.approximate && options.seeds === undefined) {
|
|
245
|
+
throw new Error('approximate (forward push) needs seeds: it estimates personalized PageRank around them');
|
|
246
|
+
}
|
|
247
|
+
const g = indexGraph(edges, options);
|
|
248
|
+
const n = g.names.length;
|
|
249
|
+
const personalized = g.teleport !== null;
|
|
250
|
+
if (n === 0)
|
|
251
|
+
return { scores: {}, ranking: [], engine: 'builtin', method: 'gauss-seidel', personalized, residual: 0 };
|
|
252
|
+
let libraryRejected;
|
|
253
|
+
const core = options.engine === 'builtin' ? null : await loadSublinearCore();
|
|
254
|
+
if (core) {
|
|
255
|
+
try {
|
|
256
|
+
const graph = core.graphFromEdges(g.edges, { n });
|
|
257
|
+
const seeds = g.teleport ? new Map(g.teleport.flatMap((w, i) => (w > 0 ? [[i, w]] : []))) : null;
|
|
258
|
+
if (options.approximate && seeds) {
|
|
259
|
+
const r = core.forwardPush(graph, seeds, { damping: d, epsilon: options.epsilon ?? 1e-6 });
|
|
260
|
+
let mass = 0;
|
|
261
|
+
for (const s of r.scores.values())
|
|
262
|
+
mass += s;
|
|
263
|
+
// Forward push keeps p + r = 1 exactly; check that the books balance.
|
|
264
|
+
if (r.converged && Math.abs(mass + r.residualMass - 1) <= 1e-6) {
|
|
265
|
+
const ranking = rank(g.names, r.scores, options.top);
|
|
266
|
+
const scores = {};
|
|
267
|
+
for (const { node, score } of ranking)
|
|
268
|
+
scores[node] = score;
|
|
269
|
+
return { scores, ranking, engine: 'sublinear-core', method: 'forward-push', personalized, residual: r.residualMass, residualMass: r.residualMass };
|
|
270
|
+
}
|
|
271
|
+
libraryRejected = r.converged ? `forward push mass ${mass + r.residualMass} != 1` : `forward push stopped after ${r.pushes} pushes`;
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
const opts = { damping: d, tolerance: 1e-12, maxIterations: 10000 };
|
|
275
|
+
const r = seeds ? core.personalizedPageRank(graph, seeds, opts) : core.pageRank(graph, opts);
|
|
276
|
+
const x = Array.from(r.scores);
|
|
277
|
+
const total = x.reduce((s, v) => s + v, 0);
|
|
278
|
+
if (r.converged && x.every((v) => Number.isFinite(v) && v >= 0) && Math.abs(total - 1) <= 1e-8) {
|
|
279
|
+
const scores = {};
|
|
280
|
+
g.names.forEach((name, i) => (scores[name] = x[i]));
|
|
281
|
+
return { scores, ranking: rank(g.names, x, options.top), engine: 'sublinear-core', method: 'power-iteration', personalized, residual: r.delta };
|
|
282
|
+
}
|
|
283
|
+
libraryRejected = r.converged ? `scores sum to ${total}, not 1` : `power iteration did not converge (delta ${r.delta})`;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
catch (err) {
|
|
287
|
+
libraryRejected = err?.message ?? String(err);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
const { scores: x, residual } = await builtinPageRank(g, d);
|
|
220
291
|
const scores = {};
|
|
221
|
-
names.forEach((name, i) => (scores[name] =
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
.
|
|
225
|
-
|
|
292
|
+
g.names.forEach((name, i) => (scores[name] = x[i]));
|
|
293
|
+
return {
|
|
294
|
+
scores,
|
|
295
|
+
ranking: rank(g.names, x, options.top),
|
|
296
|
+
engine: 'builtin',
|
|
297
|
+
method: 'gauss-seidel',
|
|
298
|
+
personalized,
|
|
299
|
+
residual,
|
|
300
|
+
...(libraryRejected ? { libraryRejected } : {}),
|
|
301
|
+
};
|
|
226
302
|
}
|
|
227
303
|
//# sourceMappingURL=sublinear.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sublinear.js","sourceRoot":"","sources":["../../src/integrations/sublinear.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AA4BnE,SAAS,KAAK,CAAC,CAAc;IAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;QACnB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,QAAQ,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;YACnH,MAAM,GAAG,GAA4B,EAAE,CAAC;YACxC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACnB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBAC7E,IAAI,CAAC,KAAK,CAAC;oBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;YACH,OAAO,GAAG,CAAC;QACb,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IACjB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACtF,MAAM,GAAG,GAA+B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACnF,KAAK,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACnG,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,KAAK,GAAG,iBAAiB,CAAC,CAAC;QACrF,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;AAC7D,CAAC;AAED,SAAS,WAAW,CAAC,CAAM,EAAE,CAAW,EAAE,CAAW;IACnD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,oBAAoB,CAAC,CAAM;IAClC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QAC7B,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG;YAAE,IAAI,CAAC,KAAK,CAAC;gBAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,CAAM,EAAE,CAAW,EAAE,GAAW,EAAE,aAAqB;IAC1E,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,OAAO,EAAE,GAAG,aAAa,EAAE,EAAE,EAAE,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,yCAAyC,CAAC,CAAC;YACzG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACb,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBAAE,IAAI,CAAC,KAAK,CAAC;oBAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;QACD,IAAI,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG;YAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;IACpE,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,WAAW,GAAG,IAAI,GAAG,EAAe,CAAC;AAE3C,KAAK,UAAU,YAAY,CAAC,CAAM,EAAE,CAAW,EAAE,GAAW,EAAE,aAAqB;IACjF,OAAO,kBAAkB,CAAC,KAAK,IAAI,EAAE;QACnC,MAAM,GAAG,GAAG,MAAM,cAAc,CAAM,4BAA4B,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3F,MAAM,MAAM,GAAG,GAAG,EAAE,eAAe,CAAC;QACpC,IAAI,OAAO,MAAM,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC;QAC9C,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,aAAa,EAAE,CAAC;QACtC,IAAI,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC;YAC7E,sEAAsE;YACtE,sEAAsE;YACtE,MAAM,MAAM,CAAC,cAAc,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACvD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,WAAW,CAAC,IAAI,GAAG,CAAC;gBAAE,WAAW,CAAC,KAAK,EAAE,CAAC;YAC9C,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACxB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACf,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACnB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3G,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAmB,EACnB,CAAW,EACX,UAAuF,EAAE;IAEzF,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACxB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,EAAE,MAAM,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/G,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAChF,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IACtC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,KAAK,EAAE,SAAS,CAAC,CAAC;IAC1E,2EAA2E;IAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,GAAG,GAAG,KAAK,GAAG,EAAE,CAAC;IAChC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAEnD,IAAI,eAAmC,CAAC;IACxC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;YACvD,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtD,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC/B,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC;oBAChB,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,kBAAkB,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;gBAC3H,CAAC;gBACD,eAAe,GAAG,YAAY,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;YACtF,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,eAAe,GAAG,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,OAAO;QACL,QAAQ,EAAE,CAAC;QACX,QAAQ;QACR,SAAS,EAAE,QAAQ,IAAI,MAAM;QAC7B,UAAU;QACV,kBAAkB;QAClB,MAAM,EAAE,SAAS;QACjB,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAC;AACJ,CAAC;AASD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,KAA2D,EAC3D,UAA+E,EAAE;IAEjF,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;IAClC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACpE,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE;QACxB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC;QACD,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;IACrB,CAAC,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,EAAE;QAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,GAAG,GAA+B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,OAAO,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QACtD,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;QAAE,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACtD,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IAEhF,+CAA+C;IAC/C,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACvE,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACzB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE;YAAE,KAAK,IAAI,CAAC,CAAC;QAC3C,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO;QACxB,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,KAAK;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;QAC9E,SAAS,EAAE,KAAK;QAChB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACzD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,KAAK;SAClB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAC9C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;AACzE,CAAC","sourcesContent":["/**\n * Linear solves and PageRank through `sublinear-time-solver`, verified.\n *\n * sublinear-time-solver (optionalDependency, ~120 MB installed with its own\n * deps) solves diagonally dominant systems with push / random-walk methods.\n * Measured against 1.7.2: `forward-push` is accurate, but the default\n * `neumann` method returned a wrong answer with `converged: false` and\n * `random-walk` threw, and the package logs banners with `console.log`. So:\n * - only `forward-push` is used;\n * - every answer is checked against the residual ||Mx - b||_inf here, and a\n * built-in Gauss-Seidel solve replaces it when the check fails;\n * - the import, construction and solve run with console output sent to stderr\n * (the MCP stdio server owns stdout).\n *\n * The 5 bundled `sublinear/*` agents name sublinear-time-solver tools; the\n * `sublinear_solve` / `sublinear_pagerank` MCP tools in this package give them\n * a working in-process path without a separate MCP server.\n */\n\nimport { importOptional, withStdoutToStderr } from './optional.js';\n\nexport interface SparseEntry {\n row: number;\n col: number;\n value: number;\n}\n\nexport type MatrixInput = number[][] | { size: number; entries: SparseEntry[] };\n\nexport interface LinearSolveResult {\n solution: number[];\n /** max_i |(Mx - b)_i| */\n residual: number;\n converged: boolean;\n iterations: number;\n diagonallyDominant: boolean;\n engine: 'sublinear-time-solver' | 'builtin';\n /** Set when the library answered but failed verification. */\n libraryRejected?: string;\n}\n\ninterface Csr {\n n: number;\n rows: Array<Array<[number, number]>>; // per row: [col, value]\n diag: number[];\n}\n\nfunction toCsr(m: MatrixInput): Csr {\n if (Array.isArray(m)) {\n const n = m.length;\n const rows = m.map((row, i) => {\n if (!Array.isArray(row) || row.length !== n) throw new Error(`matrix must be square; row ${i} has ${row?.length}`);\n const out: Array<[number, number]> = [];\n row.forEach((v, j) => {\n if (!Number.isFinite(v)) throw new Error(`matrix[${i}][${j}] is not finite`);\n if (v !== 0) out.push([j, v]);\n });\n return out;\n });\n return { n, rows, diag: m.map((row, i) => row[i]) };\n }\n const n = m.size;\n if (!Number.isInteger(n) || n < 1) throw new Error('size must be a positive integer');\n const acc: Array<Map<number, number>> = Array.from({ length: n }, () => new Map());\n for (const { row, col, value } of m.entries) {\n if (!Number.isInteger(row) || !Number.isInteger(col) || row < 0 || col < 0 || row >= n || col >= n) {\n throw new Error(`entry (${row}, ${col}) is outside a ${n}x${n} matrix`);\n }\n if (!Number.isFinite(value)) throw new Error(`entry (${row}, ${col}) is not finite`);\n acc[row].set(col, (acc[row].get(col) ?? 0) + value);\n }\n const rows = acc.map((r) => [...r.entries()].filter(([, v]) => v !== 0));\n return { n, rows, diag: acc.map((r, i) => r.get(i) ?? 0) };\n}\n\nfunction residualInf(a: Csr, x: number[], b: number[]): number {\n let worst = 0;\n for (let i = 0; i < a.n; i++) {\n let s = 0;\n for (const [j, v] of a.rows[i]) s += v * x[j];\n worst = Math.max(worst, Math.abs(s - b[i]));\n }\n return worst;\n}\n\nfunction isDiagonallyDominant(a: Csr): boolean {\n return a.rows.every((row, i) => {\n let off = 0;\n for (const [j, v] of row) if (j !== i) off += Math.abs(v);\n return Math.abs(a.diag[i]) >= off && a.diag[i] !== 0;\n });\n}\n\nfunction gaussSeidel(a: Csr, b: number[], tol: number, maxIterations: number) {\n const x = new Array(a.n).fill(0);\n let it = 0;\n for (; it < maxIterations; it++) {\n for (let i = 0; i < a.n; i++) {\n if (a.diag[i] === 0) throw new Error(`zero diagonal at row ${i}: Gauss-Seidel needs a nonzero diagonal`);\n let s = b[i];\n for (const [j, v] of a.rows[i]) if (j !== i) s -= v * x[j];\n x[i] = s / a.diag[i];\n }\n if (residualInf(a, x, b) <= tol) return { x, iterations: it + 1 };\n }\n return { x, iterations: it };\n}\n\nconst solverCache = new Map<string, any>();\n\nasync function librarySolve(a: Csr, b: number[], tol: number, maxIterations: number): Promise<number[] | null> {\n return withStdoutToStderr(async () => {\n const mod = await importOptional<any>('sublinear-time-solver/core', { quietStdout: true });\n const Solver = mod?.SublinearSolver;\n if (typeof Solver !== 'function') return null;\n const key = `${tol}|${maxIterations}`;\n let solver = solverCache.get(key);\n if (!solver) {\n solver = new Solver({ method: 'forward-push', epsilon: tol, maxIterations });\n // The constructor starts WASM probing asynchronously and logs when it\n // finishes; let that settle while console output is still redirected.\n await solver.initializeWasm?.().catch(() => undefined);\n await new Promise((r) => setTimeout(r, 0));\n if (solverCache.size > 8) solverCache.clear();\n solverCache.set(key, solver);\n }\n const values: number[] = [];\n const rowIndices: number[] = [];\n const colIndices: number[] = [];\n a.rows.forEach((row, i) => {\n for (const [j, v] of row) {\n values.push(v);\n rowIndices.push(i);\n colIndices.push(j);\n }\n });\n const res = await solver.solve({ rows: a.n, cols: a.n, values, rowIndices, colIndices, format: 'coo' }, b);\n return Array.isArray(res?.solution) ? res.solution.map(Number) : null;\n });\n}\n\n/**\n * Solve Mx = b. Intended for (row) diagonally dominant M; other matrices are\n * attempted with Gauss-Seidel and reported with `converged: false` if it fails.\n */\nexport async function solveLinearSystem(\n matrix: MatrixInput,\n b: number[],\n options: { tolerance?: number; maxIterations?: number; engine?: 'auto' | 'builtin' } = {},\n): Promise<LinearSolveResult> {\n const a = toCsr(matrix);\n if (!Array.isArray(b) || b.length !== a.n) throw new Error(`vector length ${b?.length} != matrix size ${a.n}`);\n if (!b.every(Number.isFinite)) throw new Error('vector entries must be finite');\n const tol = options.tolerance ?? 1e-8;\n const maxIterations = Math.min(options.maxIterations ?? 10000, 1_000_000);\n // Residual tolerance scaled to the problem: absolute tol on ||b||_inf ~ 1.\n const scale = Math.max(1, ...b.map(Math.abs));\n const accept = tol * scale * 10;\n const diagonallyDominant = isDiagonallyDominant(a);\n\n let libraryRejected: string | undefined;\n if (options.engine !== 'builtin') {\n try {\n const x = await librarySolve(a, b, tol, maxIterations);\n if (x && x.length === a.n && x.every(Number.isFinite)) {\n const r = residualInf(a, x, b);\n if (r <= accept) {\n return { solution: x, residual: r, converged: true, iterations: 0, diagonallyDominant, engine: 'sublinear-time-solver' };\n }\n libraryRejected = `residual ${r.toExponential(2)} above ${accept.toExponential(2)}`;\n }\n } catch (err: any) {\n libraryRejected = err?.message ?? String(err);\n }\n }\n\n const { x, iterations } = gaussSeidel(a, b, accept, maxIterations);\n const residual = residualInf(a, x, b);\n return {\n solution: x,\n residual,\n converged: residual <= accept,\n iterations,\n diagonallyDominant,\n engine: 'builtin',\n ...(libraryRejected ? { libraryRejected } : {}),\n };\n}\n\nexport interface PageRankResult {\n scores: Record<string, number>;\n ranking: Array<{ node: string; score: number }>;\n engine: LinearSolveResult['engine'];\n residual: number;\n}\n\n/**\n * PageRank over a directed graph as a linear system:\n * (I - d·Pᵀ) y = 1, then scores = y / Σy. With dangling rows left at zero this\n * equals PageRank with uniform teleport from dangling nodes.\n */\nexport async function pageRank(\n edges: Array<{ from: string; to: string; weight?: number }>,\n options: { damping?: number; nodes?: string[]; engine?: 'auto' | 'builtin' } = {},\n): Promise<PageRankResult> {\n const d = options.damping ?? 0.85;\n if (!(d > 0 && d < 1)) throw new Error('damping must be in (0, 1)');\n const ids = new Map<string, number>();\n const names: string[] = [];\n const add = (s: string) => {\n if (!ids.has(s)) {\n ids.set(s, names.length);\n names.push(s);\n }\n return ids.get(s)!;\n };\n for (const n of options.nodes ?? []) add(String(n));\n const out: Array<Map<number, number>> = [];\n for (const e of edges) {\n const w = e.weight ?? 1;\n if (!Number.isFinite(w) || w < 0) throw new Error(`invalid edge weight ${w}`);\n const a = add(String(e.from));\n const b = add(String(e.to));\n while (out.length < names.length) out.push(new Map());\n out[a].set(b, (out[a].get(b) ?? 0) + w);\n }\n while (out.length < names.length) out.push(new Map());\n const n = names.length;\n if (n === 0) return { scores: {}, ranking: [], engine: 'builtin', residual: 0 };\n\n // M = I - d * P^T, P row-normalised out-links.\n const entries: SparseEntry[] = [];\n for (let i = 0; i < n; i++) entries.push({ row: i, col: i, value: 1 });\n out.forEach((links, src) => {\n let total = 0;\n for (const w of links.values()) total += w;\n if (total === 0) return;\n for (const [dst, w] of links) entries.push({ row: dst, col: src, value: -d * (w / total) });\n });\n const res = await solveLinearSystem({ size: n, entries }, new Array(n).fill(1), {\n tolerance: 1e-10,\n engine: options.engine,\n });\n const sum = res.solution.reduce((s, v) => s + v, 0) || 1;\n const scores: Record<string, number> = {};\n names.forEach((name, i) => (scores[name] = res.solution[i] / sum));\n const ranking = names\n .map((node) => ({ node, score: scores[node] }))\n .sort((x, y) => y.score - x.score);\n return { scores, ranking, engine: res.engine, residual: res.residual };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sublinear.js","sourceRoot":"","sources":["../../src/integrations/sublinear.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Linear solves and PageRank through `@ruvnet/sublinear-core`, verified.\n *\n * @ruvnet/sublinear-core (optionalDependency, zero dependencies, ~220 kB) is\n * the embeddable core of sublinear-time-solver: sparse iterative solvers\n * (Gauss-Seidel, conjugate gradient, Jacobi, Neumann), PageRank, personalized\n * PageRank and local forward push. It reports the residual of the x it\n * returns, but every answer is still checked here against ||Mx - b||_inf, and\n * a built-in Gauss-Seidel solve replaces it when the check fails or the\n * package is not installed.\n *\n * The 5 bundled `sublinear/*` agents name sublinear-time-solver tools; the\n * `sublinear_solve` / `sublinear_pagerank` MCP tools in this package give them\n * a working in-process path without a separate MCP server.\n */\n\nimport { importOptional } from './optional.js';\n\nexport const SUBLINEAR_CORE = '@ruvnet/sublinear-core';\n\nexport interface SparseEntry {\n row: number;\n col: number;\n value: number;\n}\n\nexport type MatrixInput = number[][] | { size: number; entries: SparseEntry[] };\n\nexport type SolveMethod = 'auto' | 'gauss-seidel' | 'conjugate-gradient' | 'jacobi' | 'neumann';\n\nexport type SublinearEngine = 'sublinear-core' | 'builtin';\n\nexport interface LinearSolveResult {\n solution: number[];\n /** max_i |(Mx - b)_i|, recomputed here from the returned solution. */\n residual: number;\n converged: boolean;\n iterations: number;\n diagonallyDominant: boolean;\n engine: SublinearEngine;\n /** Method that produced the solution. */\n method: Exclude<SolveMethod, 'auto'>;\n /** Set when the library answered but failed verification. */\n libraryRejected?: string;\n}\n\ninterface Csr {\n n: number;\n rows: Array<Array<[number, number]>>; // per row: [col, value]\n diag: number[];\n}\n\nfunction toCsr(m: MatrixInput): Csr {\n if (Array.isArray(m)) {\n const n = m.length;\n const rows = m.map((row, i) => {\n if (!Array.isArray(row) || row.length !== n) throw new Error(`matrix must be square; row ${i} has ${row?.length}`);\n const out: Array<[number, number]> = [];\n row.forEach((v, j) => {\n if (!Number.isFinite(v)) throw new Error(`matrix[${i}][${j}] is not finite`);\n if (v !== 0) out.push([j, v]);\n });\n return out;\n });\n return { n, rows, diag: m.map((row, i) => row[i]) };\n }\n const n = m.size;\n if (!Number.isInteger(n) || n < 1) throw new Error('size must be a positive integer');\n const acc: Array<Map<number, number>> = Array.from({ length: n }, () => new Map());\n for (const { row, col, value } of m.entries) {\n if (!Number.isInteger(row) || !Number.isInteger(col) || row < 0 || col < 0 || row >= n || col >= n) {\n throw new Error(`entry (${row}, ${col}) is outside a ${n}x${n} matrix`);\n }\n if (!Number.isFinite(value)) throw new Error(`entry (${row}, ${col}) is not finite`);\n acc[row].set(col, (acc[row].get(col) ?? 0) + value);\n }\n const rows = acc.map((r) => [...r.entries()].filter(([, v]) => v !== 0));\n return { n, rows, diag: acc.map((r, i) => r.get(i) ?? 0) };\n}\n\nfunction residualInf(a: Csr, x: ArrayLike<number>, b: number[]): number {\n let worst = 0;\n for (let i = 0; i < a.n; i++) {\n let s = 0;\n for (const [j, v] of a.rows[i]) s += v * x[j];\n worst = Math.max(worst, Math.abs(s - b[i]));\n }\n return worst;\n}\n\nfunction isDiagonallyDominant(a: Csr): boolean {\n return a.rows.every((row, i) => {\n let off = 0;\n for (const [j, v] of row) if (j !== i) off += Math.abs(v);\n return Math.abs(a.diag[i]) >= off && a.diag[i] !== 0;\n });\n}\n\nfunction gaussSeidel(a: Csr, b: number[], tol: number, maxIterations: number) {\n const x = new Array(a.n).fill(0);\n let it = 0;\n for (; it < maxIterations; it++) {\n for (let i = 0; i < a.n; i++) {\n if (a.diag[i] === 0) throw new Error(`zero diagonal at row ${i}: Gauss-Seidel needs a nonzero diagonal`);\n let s = b[i];\n for (const [j, v] of a.rows[i]) if (j !== i) s -= v * x[j];\n x[i] = s / a.diag[i];\n }\n if (residualInf(a, x, b) <= tol) return { x, iterations: it + 1 };\n }\n return { x, iterations: it };\n}\n\n/** The core module, or null when it is not installed. */\nexport async function loadSublinearCore(): Promise<any | null> {\n const mod = await importOptional<any>(SUBLINEAR_CORE);\n return typeof mod?.solve === 'function' && typeof mod?.pageRank === 'function' ? mod : null;\n}\n\nfunction coreSolve(core: any, a: Csr, b: number[], tol: number, maxIterations: number, method: SolveMethod) {\n const rowIndices: number[] = [];\n const colIndices: number[] = [];\n const values: number[] = [];\n a.rows.forEach((row, i) => {\n for (const [j, v] of row) {\n rowIndices.push(i);\n colIndices.push(j);\n values.push(v);\n }\n });\n const A = core.csrFromCoo({ rows: a.n, cols: a.n, rowIndices, colIndices, values });\n // Core stops on the relative L2 residual ||b - Ax||_2 / ||b||_2. The local\n // gate is an absolute inf-norm bound, and ||r||_inf <= ||r||_2, so asking\n // core for tol / sqrt(n) keeps every converged core answer inside it.\n return core.solve(A, b, { method, tolerance: tol / Math.sqrt(a.n), maxIterations });\n}\n\n/**\n * Solve Mx = b. Intended for (row) diagonally dominant or symmetric positive\n * definite M; other matrices are attempted with Gauss-Seidel and reported with\n * `converged: false` if it fails.\n */\nexport async function solveLinearSystem(\n matrix: MatrixInput,\n b: number[],\n options: { tolerance?: number; maxIterations?: number; method?: SolveMethod; engine?: 'auto' | 'builtin' } = {},\n): Promise<LinearSolveResult> {\n const a = toCsr(matrix);\n if (!Array.isArray(b) || b.length !== a.n) throw new Error(`vector length ${b?.length} != matrix size ${a.n}`);\n if (!b.every(Number.isFinite)) throw new Error('vector entries must be finite');\n const tol = options.tolerance ?? 1e-8;\n const maxIterations = Math.min(options.maxIterations ?? 10000, 1_000_000);\n // Absolute inf-norm acceptance scaled to the problem: tol on ||b||_inf ~ 1.\n const scale = Math.max(1, ...b.map(Math.abs));\n const accept = tol * scale * 10;\n const diagonallyDominant = isDiagonallyDominant(a);\n\n let libraryRejected: string | undefined;\n if (options.engine !== 'builtin') {\n const core = await loadSublinearCore();\n if (core) {\n try {\n const r = coreSolve(core, a, b, tol, maxIterations, options.method ?? 'auto');\n const x: number[] = Array.from(r.x as Float64Array);\n const residual = residualInf(a, x, b);\n if (r.converged && x.every(Number.isFinite) && residual <= accept) {\n return { solution: x, residual, converged: true, iterations: r.iterations, diagonallyDominant, engine: 'sublinear-core', method: r.method };\n }\n libraryRejected = r.converged\n ? `residual ${residual.toExponential(2)} above ${accept.toExponential(2)}`\n : `${r.method} did not converge in ${r.iterations} iterations (relative residual ${Number(r.residual).toExponential(2)})`;\n } catch (err: any) {\n libraryRejected = err?.message ?? String(err);\n }\n }\n }\n\n const { x, iterations } = gaussSeidel(a, b, accept, maxIterations);\n const residual = residualInf(a, x, b);\n return {\n solution: x,\n residual,\n converged: residual <= accept,\n iterations,\n diagonallyDominant,\n engine: 'builtin',\n method: 'gauss-seidel',\n ...(libraryRejected ? { libraryRejected } : {}),\n };\n}\n\nexport interface PageRankEdge {\n from: string;\n to: string;\n weight?: number;\n}\n\nexport interface PageRankOptions {\n /** Probability of following an out-edge (1 - restart probability). Default 0.85. */\n damping?: number;\n /** Extra nodes with no edges. */\n nodes?: string[];\n /** Personalized PageRank: restart at these nodes (equal weight) or by weight. */\n seeds?: string[] | Record<string, number>;\n /**\n * With `seeds`: estimate by local forward push instead of power iteration.\n * Work depends on `epsilon`, not on the graph size; scores of nodes far from\n * the seeds are left at 0 and `residualMass` bounds the total L1 error.\n */\n approximate?: boolean;\n /** Forward-push residual threshold. Default 1e-6. */\n epsilon?: number;\n /** Return only the top N in `ranking` (and `scores`, for approximate runs). */\n top?: number;\n engine?: 'auto' | 'builtin';\n}\n\nexport interface PageRankResult {\n scores: Record<string, number>;\n ranking: Array<{ node: string; score: number }>;\n engine: SublinearEngine;\n method: 'power-iteration' | 'forward-push' | 'gauss-seidel';\n personalized: boolean;\n /** Linear-system residual (gauss-seidel) or last L1 change (power iteration). */\n residual: number;\n /** forward-push only: unpushed mass, an upper bound on the total L1 error. */\n residualMass?: number;\n /** Set when the library answered but failed verification. */\n libraryRejected?: string;\n}\n\ninterface IndexedGraph {\n names: string[];\n edges: Array<[number, number, number]>;\n out: Array<Map<number, number>>;\n teleport: number[] | null; // normalized seed distribution, null = uniform\n}\n\nfunction indexGraph(edges: PageRankEdge[], options: PageRankOptions): IndexedGraph {\n const ids = new Map<string, number>();\n const names: string[] = [];\n const add = (s: string) => {\n let i = ids.get(s);\n if (i === undefined) {\n i = names.length;\n ids.set(s, i);\n names.push(s);\n }\n return i;\n };\n for (const n of options.nodes ?? []) add(String(n));\n const indexed: Array<[number, number, number]> = [];\n for (const e of edges) {\n const w = e.weight ?? 1;\n if (!Number.isFinite(w) || w < 0) throw new Error(`invalid edge weight ${w}`);\n indexed.push([add(String(e.from)), add(String(e.to)), w]);\n }\n const out: Array<Map<number, number>> = Array.from({ length: names.length }, () => new Map());\n for (const [a, b, w] of indexed) out[a].set(b, (out[a].get(b) ?? 0) + w);\n\n let teleport: number[] | null = null;\n if (options.seeds !== undefined) {\n const weights: Array<[string, number]> = Array.isArray(options.seeds)\n ? options.seeds.map((s) => [String(s), 1])\n : Object.entries(options.seeds);\n if (weights.length === 0) throw new Error('seeds must name at least one node');\n teleport = new Array(names.length).fill(0);\n for (const [name, w] of weights) {\n const i = ids.get(name);\n if (i === undefined) throw new Error(`unknown seed node ${name}`);\n if (!Number.isFinite(w) || w < 0) throw new Error(`invalid seed weight ${w} for ${name}`);\n teleport[i] += w;\n }\n const total = teleport.reduce((s, v) => s + v, 0);\n if (!(total > 0)) throw new Error('seed weights must not all be zero');\n teleport = teleport.map((v) => v / total);\n }\n return { names, edges: indexed, out, teleport };\n}\n\nfunction rank(names: string[], scores: Map<number, number> | number[], top?: number) {\n const entries: Array<[number, number]> = scores instanceof Map ? [...scores] : scores.map((s, i) => [i, s]);\n entries.sort((x, y) => y[1] - x[1] || x[0] - y[0]);\n return (top ? entries.slice(0, top) : entries).map(([i, score]) => ({ node: names[i], score }));\n}\n\n/**\n * Built-in PageRank as a linear system: (I - d·Pᵀ) y = v, scores = y / Σy,\n * with v uniform or the seed distribution. With dangling rows left at zero\n * this equals PageRank whose dangling mass follows the teleport vector, which\n * is also what the core computes.\n */\nasync function builtinPageRank(g: IndexedGraph, d: number) {\n const n = g.names.length;\n const entries: SparseEntry[] = [];\n for (let i = 0; i < n; i++) entries.push({ row: i, col: i, value: 1 });\n g.out.forEach((links, src) => {\n let total = 0;\n for (const w of links.values()) total += w;\n if (total === 0) return;\n for (const [dst, w] of links) entries.push({ row: dst, col: src, value: -d * (w / total) });\n });\n const v = g.teleport ?? new Array(n).fill(1);\n const res = await solveLinearSystem({ size: n, entries }, v, { tolerance: 1e-10, engine: 'builtin' });\n const sum = res.solution.reduce((s, x) => s + x, 0) || 1;\n return { scores: res.solution.map((x) => x / sum), residual: res.residual };\n}\n\n/**\n * PageRank over a directed graph, or personalized PageRank from `seeds`.\n * Scores sum to 1 (approximate runs: to 1 - residualMass).\n */\nexport async function pageRank(edges: PageRankEdge[], options: PageRankOptions = {}): Promise<PageRankResult> {\n const d = options.damping ?? 0.85;\n if (!(d > 0 && d < 1)) throw new Error('damping must be in (0, 1)');\n if (options.approximate && options.seeds === undefined) {\n throw new Error('approximate (forward push) needs seeds: it estimates personalized PageRank around them');\n }\n const g = indexGraph(edges, options);\n const n = g.names.length;\n const personalized = g.teleport !== null;\n if (n === 0) return { scores: {}, ranking: [], engine: 'builtin', method: 'gauss-seidel', personalized, residual: 0 };\n\n let libraryRejected: string | undefined;\n const core = options.engine === 'builtin' ? null : await loadSublinearCore();\n if (core) {\n try {\n const graph = core.graphFromEdges(g.edges, { n });\n const seeds = g.teleport ? new Map(g.teleport.flatMap((w, i) => (w > 0 ? [[i, w] as [number, number]] : []))) : null;\n\n if (options.approximate && seeds) {\n const r = core.forwardPush(graph, seeds, { damping: d, epsilon: options.epsilon ?? 1e-6 });\n let mass = 0;\n for (const s of r.scores.values()) mass += s;\n // Forward push keeps p + r = 1 exactly; check that the books balance.\n if (r.converged && Math.abs(mass + r.residualMass - 1) <= 1e-6) {\n const ranking = rank(g.names, r.scores, options.top);\n const scores: Record<string, number> = {};\n for (const { node, score } of ranking) scores[node] = score;\n return { scores, ranking, engine: 'sublinear-core', method: 'forward-push', personalized, residual: r.residualMass, residualMass: r.residualMass };\n }\n libraryRejected = r.converged ? `forward push mass ${mass + r.residualMass} != 1` : `forward push stopped after ${r.pushes} pushes`;\n } else {\n const opts = { damping: d, tolerance: 1e-12, maxIterations: 10000 };\n const r = seeds ? core.personalizedPageRank(graph, seeds, opts) : core.pageRank(graph, opts);\n const x: number[] = Array.from(r.scores as Float64Array);\n const total = x.reduce((s, v) => s + v, 0);\n if (r.converged && x.every((v) => Number.isFinite(v) && v >= 0) && Math.abs(total - 1) <= 1e-8) {\n const scores: Record<string, number> = {};\n g.names.forEach((name, i) => (scores[name] = x[i]));\n return { scores, ranking: rank(g.names, x, options.top), engine: 'sublinear-core', method: 'power-iteration', personalized, residual: r.delta };\n }\n libraryRejected = r.converged ? `scores sum to ${total}, not 1` : `power iteration did not converge (delta ${r.delta})`;\n }\n } catch (err: any) {\n libraryRejected = err?.message ?? String(err);\n }\n }\n\n const { scores: x, residual } = await builtinPageRank(g, d);\n const scores: Record<string, number> = {};\n g.names.forEach((name, i) => (scores[name] = x[i]));\n return {\n scores,\n ranking: rank(g.names, x, options.top),\n engine: 'builtin',\n method: 'gauss-seidel',\n personalized,\n residual,\n ...(libraryRejected ? { libraryRejected } : {}),\n };\n}\n"]}
|
|
@@ -301,9 +301,11 @@ export declare class RuVectorIntelligence {
|
|
|
301
301
|
*/
|
|
302
302
|
private getPatternsCount;
|
|
303
303
|
/**
|
|
304
|
-
* Compute attention asynchronously
|
|
304
|
+
* Compute attention asynchronously on a native worker thread
|
|
305
305
|
*
|
|
306
|
-
* Useful for large batches or when non-blocking is required
|
|
306
|
+
* Useful for large batches or when non-blocking is required. 'standard' (the
|
|
307
|
+
* default) is native scaled dot-product attention. The native functions take
|
|
308
|
+
* the embedding dimension (and flash block size) explicitly.
|
|
307
309
|
*/
|
|
308
310
|
computeAttentionAsync(query: Float32Array, keys: Float32Array[], values: Float32Array[], type?: 'flash' | 'hyperbolic' | 'standard'): Promise<Float32Array>;
|
|
309
311
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuVectorIntelligence.d.ts","sourceRoot":"","sources":["../../src/intelligence/RuVectorIntelligence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAIH,QAAA,IAAI,aAAa,SAAQ,CAAC;AAe1B,QAAA,IAAI,kBAAkB,SAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"RuVectorIntelligence.d.ts","sourceRoot":"","sources":["../../src/intelligence/RuVectorIntelligence.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,10 +47,19 @@ let poincareDistance = null;
|
|
|
47
47
|
let projectToPoincareBall = null;
|
|
48
48
|
let AttentionType = null;
|
|
49
49
|
let attentionAvailable = false;
|
|
50
|
-
|
|
50
|
+
/**
|
|
51
|
+
* Tile size for native flash attention. @ruvector/attention 2.x requires it
|
|
52
|
+
* explicitly in both the FlashAttention constructor and
|
|
53
|
+
* computeFlashAttentionAsync (omitting it throws, which used to push every
|
|
54
|
+
* 'flash' route onto the JS fallback).
|
|
55
|
+
*/
|
|
56
|
+
const FLASH_ATTENTION_BLOCK_SIZE = 64;
|
|
57
|
+
/** Max graph position for GraphRoPeAttention's rotary table. */
|
|
58
|
+
const GRAPH_ROPE_MAX_POSITION = 10000;
|
|
59
|
+
// Try to load @ruvector/sona (through the loader, whose engines validate
|
|
60
|
+
// LoRA input lengths instead of letting a native panic abort the process)
|
|
51
61
|
try {
|
|
52
|
-
|
|
53
|
-
SonaEngine = sonaModule.SonaEngine;
|
|
62
|
+
SonaEngine = requireSonaEngine();
|
|
54
63
|
sonaAvailable = true;
|
|
55
64
|
}
|
|
56
65
|
catch {
|
|
@@ -81,6 +90,7 @@ catch {
|
|
|
81
90
|
console.warn('[RuVectorIntelligence] @ruvector/attention not available - attention features disabled');
|
|
82
91
|
}
|
|
83
92
|
// Import from ruvector core (for HNSW)
|
|
93
|
+
import { requireSonaEngine } from '../services/sona-loader.js';
|
|
84
94
|
import ruvector from 'ruvector';
|
|
85
95
|
// Export availability flags
|
|
86
96
|
export { sonaAvailable, attentionAvailable };
|
|
@@ -197,7 +207,7 @@ export class RuVectorIntelligence {
|
|
|
197
207
|
this.multiHeadAttention = new MultiHeadAttention(dim, this.config.numHeads ?? 8);
|
|
198
208
|
break;
|
|
199
209
|
case 'flash':
|
|
200
|
-
this.flashAttention = new FlashAttention(dim);
|
|
210
|
+
this.flashAttention = new FlashAttention(dim, FLASH_ATTENTION_BLOCK_SIZE);
|
|
201
211
|
break;
|
|
202
212
|
case 'hyperbolic':
|
|
203
213
|
this.hyperbolicAttention = new HyperbolicAttention(dim, this.config.curvature ?? 1.0);
|
|
@@ -211,12 +221,17 @@ export class RuVectorIntelligence {
|
|
|
211
221
|
this.moeAttention = new MoEAttention(moeConfig);
|
|
212
222
|
break;
|
|
213
223
|
case 'graph':
|
|
214
|
-
|
|
224
|
+
// 2.x takes a RoPEConfig object; positional args throw "Missing field `dim`"
|
|
225
|
+
this.graphAttention = new GraphRoPeAttention({ dim, maxPosition: GRAPH_ROPE_MAX_POSITION });
|
|
215
226
|
break;
|
|
216
227
|
case 'dual':
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
228
|
+
// 2.x takes a DualSpaceConfig object; positional args throw "Missing field `dim`"
|
|
229
|
+
this.dualSpaceAttention = new DualSpaceAttention({
|
|
230
|
+
dim,
|
|
231
|
+
curvature: this.config.curvature ?? 1.0,
|
|
232
|
+
euclideanWeight: 0.5,
|
|
233
|
+
hyperbolicWeight: 0.5,
|
|
234
|
+
});
|
|
220
235
|
break;
|
|
221
236
|
}
|
|
222
237
|
}
|
|
@@ -467,6 +482,14 @@ export class RuVectorIntelligence {
|
|
|
467
482
|
attentionOutput = this.computeFallbackAttention(transformedQuery, keys, values);
|
|
468
483
|
}
|
|
469
484
|
break;
|
|
485
|
+
case 'graph':
|
|
486
|
+
if (this.graphAttention) {
|
|
487
|
+
attentionOutput = this.graphAttention.compute(transformedQuery, keys, values);
|
|
488
|
+
}
|
|
489
|
+
else {
|
|
490
|
+
attentionOutput = this.computeFallbackAttention(transformedQuery, keys, values);
|
|
491
|
+
}
|
|
492
|
+
break;
|
|
470
493
|
case 'dual':
|
|
471
494
|
if (this.dualSpaceAttention) {
|
|
472
495
|
attentionOutput = this.dualSpaceAttention.compute(transformedQuery, keys, values);
|
|
@@ -754,18 +777,21 @@ export class RuVectorIntelligence {
|
|
|
754
777
|
// Async Attention (for large batches)
|
|
755
778
|
// ==========================================================================
|
|
756
779
|
/**
|
|
757
|
-
* Compute attention asynchronously
|
|
780
|
+
* Compute attention asynchronously on a native worker thread
|
|
758
781
|
*
|
|
759
|
-
* Useful for large batches or when non-blocking is required
|
|
782
|
+
* Useful for large batches or when non-blocking is required. 'standard' (the
|
|
783
|
+
* default) is native scaled dot-product attention. The native functions take
|
|
784
|
+
* the embedding dimension (and flash block size) explicitly.
|
|
760
785
|
*/
|
|
761
786
|
async computeAttentionAsync(query, keys, values, type) {
|
|
787
|
+
const dim = query.length;
|
|
762
788
|
switch (type) {
|
|
763
789
|
case 'flash':
|
|
764
|
-
return computeFlashAttentionAsync(query, keys, values);
|
|
790
|
+
return computeFlashAttentionAsync(query, keys, values, dim, FLASH_ATTENTION_BLOCK_SIZE);
|
|
765
791
|
case 'hyperbolic':
|
|
766
|
-
return computeHyperbolicAttentionAsync(query, keys, values, this.config.curvature);
|
|
792
|
+
return computeHyperbolicAttentionAsync(query, keys, values, dim, this.config.curvature ?? 1.0);
|
|
767
793
|
default:
|
|
768
|
-
return computeAttentionAsync(query, keys, values,
|
|
794
|
+
return computeAttentionAsync(query, keys, values, dim);
|
|
769
795
|
}
|
|
770
796
|
}
|
|
771
797
|
// ==========================================================================
|