@claude-flow/cli 3.0.0-alpha.101 → 3.0.0-alpha.103
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/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.js +454 -83
- package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
- package/dist/src/memory/ewc-consolidation.d.ts +271 -0
- package/dist/src/memory/ewc-consolidation.d.ts.map +1 -0
- package/dist/src/memory/ewc-consolidation.js +542 -0
- package/dist/src/memory/ewc-consolidation.js.map +1 -0
- package/dist/src/memory/sona-optimizer.d.ts +227 -0
- package/dist/src/memory/sona-optimizer.d.ts.map +1 -0
- package/dist/src/memory/sona-optimizer.js +633 -0
- package/dist/src/memory/sona-optimizer.js.map +1 -0
- package/dist/src/ruvector/flash-attention.d.ts +162 -0
- package/dist/src/ruvector/flash-attention.d.ts.map +1 -0
- package/dist/src/ruvector/flash-attention.js +426 -0
- package/dist/src/ruvector/flash-attention.js.map +1 -0
- package/dist/src/ruvector/index.d.ts +5 -0
- package/dist/src/ruvector/index.d.ts.map +1 -1
- package/dist/src/ruvector/index.js +5 -0
- package/dist/src/ruvector/index.js.map +1 -1
- package/dist/src/ruvector/lora-adapter.d.ts +218 -0
- package/dist/src/ruvector/lora-adapter.d.ts.map +1 -0
- package/dist/src/ruvector/lora-adapter.js +455 -0
- package/dist/src/ruvector/lora-adapter.js.map +1 -0
- package/dist/src/ruvector/moe-router.d.ts +206 -0
- package/dist/src/ruvector/moe-router.d.ts.map +1 -0
- package/dist/src/ruvector/moe-router.js +626 -0
- package/dist/src/ruvector/moe-router.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,626 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mixture of Experts (MoE) Router for Dynamic Agent Routing
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - 8 expert slots for specialized agent types
|
|
6
|
+
* - Gating network for soft expert selection (top-k)
|
|
7
|
+
* - Online weight updates via reward signals
|
|
8
|
+
* - Load balancing with auxiliary loss
|
|
9
|
+
* - Weight persistence to .swarm/moe-weights.json
|
|
10
|
+
*
|
|
11
|
+
* Architecture:
|
|
12
|
+
* - Input: 384-dim task embedding (from ONNX)
|
|
13
|
+
* - Hidden: 128-dim layer with ReLU
|
|
14
|
+
* - Output: 8-dim softmax weights
|
|
15
|
+
*
|
|
16
|
+
* @module moe-router
|
|
17
|
+
*/
|
|
18
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
19
|
+
import { dirname } from 'path';
|
|
20
|
+
/**
|
|
21
|
+
* Expert names in order (index corresponds to expert slot)
|
|
22
|
+
*/
|
|
23
|
+
export const EXPERT_NAMES = [
|
|
24
|
+
'coder',
|
|
25
|
+
'tester',
|
|
26
|
+
'reviewer',
|
|
27
|
+
'architect',
|
|
28
|
+
'security',
|
|
29
|
+
'performance',
|
|
30
|
+
'researcher',
|
|
31
|
+
'coordinator',
|
|
32
|
+
];
|
|
33
|
+
/**
|
|
34
|
+
* Number of experts (fixed at 8)
|
|
35
|
+
*/
|
|
36
|
+
export const NUM_EXPERTS = 8;
|
|
37
|
+
/**
|
|
38
|
+
* Input dimension (384 from ONNX MiniLM-L6-v2)
|
|
39
|
+
*/
|
|
40
|
+
export const INPUT_DIM = 384;
|
|
41
|
+
/**
|
|
42
|
+
* Hidden layer dimension
|
|
43
|
+
*/
|
|
44
|
+
export const HIDDEN_DIM = 128;
|
|
45
|
+
/**
|
|
46
|
+
* Default configuration
|
|
47
|
+
*/
|
|
48
|
+
const DEFAULT_CONFIG = {
|
|
49
|
+
topK: 2,
|
|
50
|
+
learningRate: 0.01,
|
|
51
|
+
temperature: 1.0,
|
|
52
|
+
loadBalanceCoef: 0.01,
|
|
53
|
+
weightsPath: '.swarm/moe-weights.json',
|
|
54
|
+
autoSaveInterval: 50,
|
|
55
|
+
enableNoise: true,
|
|
56
|
+
noiseStd: 0.1,
|
|
57
|
+
};
|
|
58
|
+
// ============================================================================
|
|
59
|
+
// Matrix Operations
|
|
60
|
+
// ============================================================================
|
|
61
|
+
/**
|
|
62
|
+
* Initialize weights using Xavier/Glorot initialization
|
|
63
|
+
*/
|
|
64
|
+
function xavierInit(fanIn, fanOut) {
|
|
65
|
+
const std = Math.sqrt(2.0 / (fanIn + fanOut));
|
|
66
|
+
const weights = new Float32Array(fanIn * fanOut);
|
|
67
|
+
for (let i = 0; i < weights.length; i++) {
|
|
68
|
+
// Box-Muller transform for normal distribution
|
|
69
|
+
const u1 = Math.random();
|
|
70
|
+
const u2 = Math.random();
|
|
71
|
+
const z = Math.sqrt(-2 * Math.log(u1 + 1e-8)) * Math.cos(2 * Math.PI * u2);
|
|
72
|
+
weights[i] = z * std;
|
|
73
|
+
}
|
|
74
|
+
return weights;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Matrix-vector multiplication: y = Wx
|
|
78
|
+
* W is stored row-major: [rows * cols]
|
|
79
|
+
*/
|
|
80
|
+
function matmul(W, x, rows, cols, out) {
|
|
81
|
+
for (let i = 0; i < rows; i++) {
|
|
82
|
+
let sum = 0;
|
|
83
|
+
const rowOffset = i * cols;
|
|
84
|
+
// 4x loop unrolling for SIMD-friendly access
|
|
85
|
+
let j = 0;
|
|
86
|
+
for (; j + 3 < cols; j += 4) {
|
|
87
|
+
sum +=
|
|
88
|
+
W[rowOffset + j] * x[j] +
|
|
89
|
+
W[rowOffset + j + 1] * x[j + 1] +
|
|
90
|
+
W[rowOffset + j + 2] * x[j + 2] +
|
|
91
|
+
W[rowOffset + j + 3] * x[j + 3];
|
|
92
|
+
}
|
|
93
|
+
// Handle remainder
|
|
94
|
+
for (; j < cols; j++) {
|
|
95
|
+
sum += W[rowOffset + j] * x[j];
|
|
96
|
+
}
|
|
97
|
+
out[i] = sum;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Vector addition: y = x + b
|
|
102
|
+
*/
|
|
103
|
+
function addBias(x, b, out) {
|
|
104
|
+
for (let i = 0; i < x.length; i++) {
|
|
105
|
+
out[i] = x[i] + b[i];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* ReLU activation: y = max(0, x)
|
|
110
|
+
*/
|
|
111
|
+
function relu(x, out) {
|
|
112
|
+
for (let i = 0; i < x.length; i++) {
|
|
113
|
+
out[i] = x[i] > 0 ? x[i] : 0;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Softmax with temperature: y_i = exp(x_i/T) / sum(exp(x_j/T))
|
|
118
|
+
*/
|
|
119
|
+
function softmax(x, temperature, out) {
|
|
120
|
+
// Find max for numerical stability
|
|
121
|
+
let maxVal = x[0];
|
|
122
|
+
for (let i = 1; i < x.length; i++) {
|
|
123
|
+
if (x[i] > maxVal)
|
|
124
|
+
maxVal = x[i];
|
|
125
|
+
}
|
|
126
|
+
// Compute exp and sum
|
|
127
|
+
let sum = 0;
|
|
128
|
+
for (let i = 0; i < x.length; i++) {
|
|
129
|
+
out[i] = Math.exp((x[i] - maxVal) / temperature);
|
|
130
|
+
sum += out[i];
|
|
131
|
+
}
|
|
132
|
+
// Normalize
|
|
133
|
+
const invSum = 1.0 / (sum + 1e-8);
|
|
134
|
+
for (let i = 0; i < x.length; i++) {
|
|
135
|
+
out[i] *= invSum;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Compute entropy of distribution: H = -sum(p * log(p))
|
|
140
|
+
*/
|
|
141
|
+
function entropy(p) {
|
|
142
|
+
let h = 0;
|
|
143
|
+
for (let i = 0; i < p.length; i++) {
|
|
144
|
+
if (p[i] > 1e-8) {
|
|
145
|
+
h -= p[i] * Math.log(p[i]);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return h;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Add Gaussian noise for exploration
|
|
152
|
+
*/
|
|
153
|
+
function addNoise(x, std, out) {
|
|
154
|
+
for (let i = 0; i < x.length; i++) {
|
|
155
|
+
const u1 = Math.random();
|
|
156
|
+
const u2 = Math.random();
|
|
157
|
+
const z = Math.sqrt(-2 * Math.log(u1 + 1e-8)) * Math.cos(2 * Math.PI * u2);
|
|
158
|
+
out[i] = x[i] + z * std;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// ============================================================================
|
|
162
|
+
// MoE Router Implementation
|
|
163
|
+
// ============================================================================
|
|
164
|
+
/**
|
|
165
|
+
* Mixture of Experts Router
|
|
166
|
+
*
|
|
167
|
+
* Implements a two-layer gating network:
|
|
168
|
+
* - Layer 1: Linear(384, 128) + ReLU
|
|
169
|
+
* - Layer 2: Linear(128, 8) + Softmax
|
|
170
|
+
*
|
|
171
|
+
* Uses top-k expert selection with load balancing.
|
|
172
|
+
*/
|
|
173
|
+
export class MoERouter {
|
|
174
|
+
config;
|
|
175
|
+
// Network weights (pre-allocated Float32Arrays)
|
|
176
|
+
W1; // [HIDDEN_DIM x INPUT_DIM]
|
|
177
|
+
b1; // [HIDDEN_DIM]
|
|
178
|
+
W2; // [NUM_EXPERTS x HIDDEN_DIM]
|
|
179
|
+
b2; // [NUM_EXPERTS]
|
|
180
|
+
// Intermediate buffers (pre-allocated, no GC pressure)
|
|
181
|
+
hidden; // [HIDDEN_DIM]
|
|
182
|
+
hiddenWithBias; // [HIDDEN_DIM]
|
|
183
|
+
hiddenActivated; // [HIDDEN_DIM]
|
|
184
|
+
logits; // [NUM_EXPERTS]
|
|
185
|
+
logitsWithBias; // [NUM_EXPERTS]
|
|
186
|
+
noisyLogits; // [NUM_EXPERTS]
|
|
187
|
+
probs; // [NUM_EXPERTS]
|
|
188
|
+
// Gradient buffers for online learning
|
|
189
|
+
gradW2; // [NUM_EXPERTS x HIDDEN_DIM]
|
|
190
|
+
gradb2; // [NUM_EXPERTS]
|
|
191
|
+
gradW1; // [HIDDEN_DIM x INPUT_DIM]
|
|
192
|
+
gradb1; // [HIDDEN_DIM]
|
|
193
|
+
gradHidden; // [HIDDEN_DIM]
|
|
194
|
+
// Statistics
|
|
195
|
+
routingCounts; // [NUM_EXPERTS]
|
|
196
|
+
totalRoutings = 0;
|
|
197
|
+
updateCount = 0;
|
|
198
|
+
avgReward = 0;
|
|
199
|
+
// Cache for last input (for gradient computation)
|
|
200
|
+
lastInput = null;
|
|
201
|
+
lastHiddenActivated = null;
|
|
202
|
+
lastProbs = null;
|
|
203
|
+
lastSelectedExperts = [];
|
|
204
|
+
constructor(config = {}) {
|
|
205
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
206
|
+
// Initialize weights
|
|
207
|
+
this.W1 = xavierInit(INPUT_DIM, HIDDEN_DIM);
|
|
208
|
+
this.b1 = new Float32Array(HIDDEN_DIM);
|
|
209
|
+
this.W2 = xavierInit(HIDDEN_DIM, NUM_EXPERTS);
|
|
210
|
+
this.b2 = new Float32Array(NUM_EXPERTS);
|
|
211
|
+
// Pre-allocate intermediate buffers
|
|
212
|
+
this.hidden = new Float32Array(HIDDEN_DIM);
|
|
213
|
+
this.hiddenWithBias = new Float32Array(HIDDEN_DIM);
|
|
214
|
+
this.hiddenActivated = new Float32Array(HIDDEN_DIM);
|
|
215
|
+
this.logits = new Float32Array(NUM_EXPERTS);
|
|
216
|
+
this.logitsWithBias = new Float32Array(NUM_EXPERTS);
|
|
217
|
+
this.noisyLogits = new Float32Array(NUM_EXPERTS);
|
|
218
|
+
this.probs = new Float32Array(NUM_EXPERTS);
|
|
219
|
+
// Pre-allocate gradient buffers
|
|
220
|
+
this.gradW2 = new Float32Array(NUM_EXPERTS * HIDDEN_DIM);
|
|
221
|
+
this.gradb2 = new Float32Array(NUM_EXPERTS);
|
|
222
|
+
this.gradW1 = new Float32Array(HIDDEN_DIM * INPUT_DIM);
|
|
223
|
+
this.gradb1 = new Float32Array(HIDDEN_DIM);
|
|
224
|
+
this.gradHidden = new Float32Array(HIDDEN_DIM);
|
|
225
|
+
// Statistics
|
|
226
|
+
this.routingCounts = new Float32Array(NUM_EXPERTS);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Initialize router, loading persisted weights if available
|
|
230
|
+
*/
|
|
231
|
+
async initialize() {
|
|
232
|
+
await this.loadWeights();
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Route task to top-k experts based on embedding
|
|
236
|
+
*
|
|
237
|
+
* @param taskEmbedding - 384-dim task embedding from ONNX
|
|
238
|
+
* @returns Routing result with selected experts and weights
|
|
239
|
+
*/
|
|
240
|
+
route(taskEmbedding) {
|
|
241
|
+
// Convert to Float32Array if needed
|
|
242
|
+
const input = taskEmbedding instanceof Float32Array
|
|
243
|
+
? taskEmbedding
|
|
244
|
+
: new Float32Array(taskEmbedding);
|
|
245
|
+
// Validate input dimension
|
|
246
|
+
if (input.length !== INPUT_DIM) {
|
|
247
|
+
throw new Error(`Expected embedding dimension ${INPUT_DIM}, got ${input.length}`);
|
|
248
|
+
}
|
|
249
|
+
// Forward pass through gating network
|
|
250
|
+
// Layer 1: Linear + ReLU
|
|
251
|
+
matmul(this.W1, input, HIDDEN_DIM, INPUT_DIM, this.hidden);
|
|
252
|
+
addBias(this.hidden, this.b1, this.hiddenWithBias);
|
|
253
|
+
relu(this.hiddenWithBias, this.hiddenActivated);
|
|
254
|
+
// Layer 2: Linear
|
|
255
|
+
matmul(this.W2, this.hiddenActivated, NUM_EXPERTS, HIDDEN_DIM, this.logits);
|
|
256
|
+
addBias(this.logits, this.b2, this.logitsWithBias);
|
|
257
|
+
// Add noise for exploration if enabled
|
|
258
|
+
if (this.config.enableNoise) {
|
|
259
|
+
addNoise(this.logitsWithBias, this.config.noiseStd, this.noisyLogits);
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
this.noisyLogits.set(this.logitsWithBias);
|
|
263
|
+
}
|
|
264
|
+
// Softmax to get probabilities
|
|
265
|
+
softmax(this.noisyLogits, this.config.temperature, this.probs);
|
|
266
|
+
// Select top-k experts
|
|
267
|
+
const expertIndices = this.selectTopK(this.probs, this.config.topK);
|
|
268
|
+
// Compute load balance loss
|
|
269
|
+
const loadBalanceLoss = this.computeLoadBalanceLoss();
|
|
270
|
+
// Compute entropy
|
|
271
|
+
const routingEntropy = entropy(this.probs);
|
|
272
|
+
// Update statistics
|
|
273
|
+
for (const idx of expertIndices) {
|
|
274
|
+
this.routingCounts[idx]++;
|
|
275
|
+
}
|
|
276
|
+
this.totalRoutings++;
|
|
277
|
+
// Cache for gradient computation
|
|
278
|
+
this.lastInput = new Float32Array(input);
|
|
279
|
+
this.lastHiddenActivated = new Float32Array(this.hiddenActivated);
|
|
280
|
+
this.lastProbs = new Float32Array(this.probs);
|
|
281
|
+
this.lastSelectedExperts = expertIndices;
|
|
282
|
+
// Build result
|
|
283
|
+
const totalWeight = expertIndices.reduce((sum, idx) => sum + this.probs[idx], 0);
|
|
284
|
+
const experts = expertIndices.map((idx) => ({
|
|
285
|
+
name: EXPERT_NAMES[idx],
|
|
286
|
+
index: idx,
|
|
287
|
+
weight: this.probs[idx] / (totalWeight + 1e-8), // Normalize weights
|
|
288
|
+
score: this.probs[idx],
|
|
289
|
+
}));
|
|
290
|
+
return {
|
|
291
|
+
experts,
|
|
292
|
+
allScores: Array.from(this.probs),
|
|
293
|
+
loadBalanceLoss,
|
|
294
|
+
entropy: routingEntropy,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Update expert weights based on reward signal
|
|
299
|
+
*
|
|
300
|
+
* Uses REINFORCE-style gradient update:
|
|
301
|
+
* gradient = reward * d_log_prob / d_weights
|
|
302
|
+
*
|
|
303
|
+
* @param expert - Expert that received the reward
|
|
304
|
+
* @param reward - Reward signal (-1 to 1, positive = good)
|
|
305
|
+
*/
|
|
306
|
+
updateExpertWeights(expert, reward) {
|
|
307
|
+
const expertIdx = typeof expert === 'number' ? expert : EXPERT_NAMES.indexOf(expert);
|
|
308
|
+
if (expertIdx < 0 || expertIdx >= NUM_EXPERTS) {
|
|
309
|
+
console.warn(`[MoE] Invalid expert: ${expert}`);
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
if (!this.lastInput || !this.lastHiddenActivated || !this.lastProbs) {
|
|
313
|
+
console.warn('[MoE] No cached forward pass for gradient computation');
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
// Clamp reward to [-1, 1]
|
|
317
|
+
const clampedReward = Math.max(-1, Math.min(1, reward));
|
|
318
|
+
// Compute gradients using REINFORCE
|
|
319
|
+
// For softmax: d_log_p_i / d_logit_j = delta_ij - p_j
|
|
320
|
+
// gradient = reward * (1 - p_expert) for selected expert
|
|
321
|
+
// gradient = reward * (-p_j) for other experts
|
|
322
|
+
// Clear gradient buffers
|
|
323
|
+
this.gradW2.fill(0);
|
|
324
|
+
this.gradb2.fill(0);
|
|
325
|
+
this.gradW1.fill(0);
|
|
326
|
+
this.gradb1.fill(0);
|
|
327
|
+
this.gradHidden.fill(0);
|
|
328
|
+
// Gradient w.r.t. logits (before softmax)
|
|
329
|
+
for (let i = 0; i < NUM_EXPERTS; i++) {
|
|
330
|
+
if (i === expertIdx) {
|
|
331
|
+
this.gradb2[i] = clampedReward * (1 - this.lastProbs[i]);
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
this.gradb2[i] = clampedReward * (-this.lastProbs[i]);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
// Gradient w.r.t. W2: outer product of gradb2 and hiddenActivated
|
|
338
|
+
for (let i = 0; i < NUM_EXPERTS; i++) {
|
|
339
|
+
const rowOffset = i * HIDDEN_DIM;
|
|
340
|
+
for (let j = 0; j < HIDDEN_DIM; j++) {
|
|
341
|
+
this.gradW2[rowOffset + j] = this.gradb2[i] * this.lastHiddenActivated[j];
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
// Backprop through W2 to get gradient w.r.t. hidden
|
|
345
|
+
for (let j = 0; j < HIDDEN_DIM; j++) {
|
|
346
|
+
let sum = 0;
|
|
347
|
+
for (let i = 0; i < NUM_EXPERTS; i++) {
|
|
348
|
+
sum += this.gradb2[i] * this.W2[i * HIDDEN_DIM + j];
|
|
349
|
+
}
|
|
350
|
+
this.gradHidden[j] = sum;
|
|
351
|
+
}
|
|
352
|
+
// Backprop through ReLU: gradient is 0 where activation was 0
|
|
353
|
+
for (let j = 0; j < HIDDEN_DIM; j++) {
|
|
354
|
+
if (this.lastHiddenActivated[j] <= 0) {
|
|
355
|
+
this.gradHidden[j] = 0;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
// Gradient w.r.t. b1
|
|
359
|
+
this.gradb1.set(this.gradHidden);
|
|
360
|
+
// Gradient w.r.t. W1: outer product of gradHidden and input
|
|
361
|
+
for (let i = 0; i < HIDDEN_DIM; i++) {
|
|
362
|
+
const rowOffset = i * INPUT_DIM;
|
|
363
|
+
for (let j = 0; j < INPUT_DIM; j++) {
|
|
364
|
+
this.gradW1[rowOffset + j] = this.gradHidden[i] * this.lastInput[j];
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
// Apply gradients with learning rate
|
|
368
|
+
const lr = this.config.learningRate;
|
|
369
|
+
for (let i = 0; i < this.W2.length; i++) {
|
|
370
|
+
this.W2[i] += lr * this.gradW2[i];
|
|
371
|
+
}
|
|
372
|
+
for (let i = 0; i < this.b2.length; i++) {
|
|
373
|
+
this.b2[i] += lr * this.gradb2[i];
|
|
374
|
+
}
|
|
375
|
+
for (let i = 0; i < this.W1.length; i++) {
|
|
376
|
+
this.W1[i] += lr * this.gradW1[i];
|
|
377
|
+
}
|
|
378
|
+
for (let i = 0; i < this.b1.length; i++) {
|
|
379
|
+
this.b1[i] += lr * this.gradb1[i];
|
|
380
|
+
}
|
|
381
|
+
// Update statistics
|
|
382
|
+
this.updateCount++;
|
|
383
|
+
this.avgReward = (this.avgReward * (this.updateCount - 1) + clampedReward) / this.updateCount;
|
|
384
|
+
// Auto-save
|
|
385
|
+
if (this.config.autoSaveInterval > 0 &&
|
|
386
|
+
this.updateCount % this.config.autoSaveInterval === 0) {
|
|
387
|
+
this.saveWeights().catch(() => { }); // Fire and forget
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Get load balance statistics across all experts
|
|
392
|
+
*/
|
|
393
|
+
getLoadBalance() {
|
|
394
|
+
const counts = {};
|
|
395
|
+
const utilization = {};
|
|
396
|
+
const total = this.totalRoutings || 1;
|
|
397
|
+
const idealUtilization = 1 / NUM_EXPERTS;
|
|
398
|
+
for (let i = 0; i < NUM_EXPERTS; i++) {
|
|
399
|
+
const name = EXPERT_NAMES[i];
|
|
400
|
+
counts[name] = this.routingCounts[i];
|
|
401
|
+
utilization[name] = this.routingCounts[i] / total;
|
|
402
|
+
}
|
|
403
|
+
// Compute Gini coefficient
|
|
404
|
+
const gini = this.computeGiniCoefficient();
|
|
405
|
+
// Compute coefficient of variation
|
|
406
|
+
const mean = total / NUM_EXPERTS;
|
|
407
|
+
let variance = 0;
|
|
408
|
+
for (let i = 0; i < NUM_EXPERTS; i++) {
|
|
409
|
+
variance += Math.pow(this.routingCounts[i] - mean, 2);
|
|
410
|
+
}
|
|
411
|
+
variance /= NUM_EXPERTS;
|
|
412
|
+
const cv = Math.sqrt(variance) / (mean + 1e-8);
|
|
413
|
+
return {
|
|
414
|
+
utilization,
|
|
415
|
+
totalRoutings: this.totalRoutings,
|
|
416
|
+
routingCounts: counts,
|
|
417
|
+
giniCoefficient: gini,
|
|
418
|
+
coefficientOfVariation: cv,
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Get router statistics
|
|
423
|
+
*/
|
|
424
|
+
getStats() {
|
|
425
|
+
return {
|
|
426
|
+
totalRoutings: this.totalRoutings,
|
|
427
|
+
updateCount: this.updateCount,
|
|
428
|
+
avgReward: this.avgReward,
|
|
429
|
+
topK: this.config.topK,
|
|
430
|
+
temperature: this.config.temperature,
|
|
431
|
+
learningRate: this.config.learningRate,
|
|
432
|
+
giniCoefficient: this.computeGiniCoefficient(),
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Reset all statistics and routing counts
|
|
437
|
+
*/
|
|
438
|
+
resetStats() {
|
|
439
|
+
this.routingCounts.fill(0);
|
|
440
|
+
this.totalRoutings = 0;
|
|
441
|
+
this.updateCount = 0;
|
|
442
|
+
this.avgReward = 0;
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Load weights from persistence file
|
|
446
|
+
*/
|
|
447
|
+
async loadWeights(path) {
|
|
448
|
+
const weightsPath = path || this.config.weightsPath;
|
|
449
|
+
try {
|
|
450
|
+
if (!existsSync(weightsPath)) {
|
|
451
|
+
return false;
|
|
452
|
+
}
|
|
453
|
+
const data = readFileSync(weightsPath, 'utf-8');
|
|
454
|
+
const model = JSON.parse(data);
|
|
455
|
+
// Validate version
|
|
456
|
+
if (!model.version || !model.version.startsWith('1.')) {
|
|
457
|
+
console.warn(`[MoE] Incompatible model version: ${model.version}`);
|
|
458
|
+
return false;
|
|
459
|
+
}
|
|
460
|
+
// Load weights
|
|
461
|
+
this.W1 = new Float32Array(model.weights.W1.flat());
|
|
462
|
+
this.b1 = new Float32Array(model.weights.b1);
|
|
463
|
+
this.W2 = new Float32Array(model.weights.W2.flat());
|
|
464
|
+
this.b2 = new Float32Array(model.weights.b2);
|
|
465
|
+
// Load stats
|
|
466
|
+
this.updateCount = model.stats.updateCount || 0;
|
|
467
|
+
this.avgReward = model.stats.avgReward || 0;
|
|
468
|
+
this.routingCounts = new Float32Array(model.stats.routingCounts || new Array(NUM_EXPERTS).fill(0));
|
|
469
|
+
this.totalRoutings = this.routingCounts.reduce((a, b) => a + b, 0);
|
|
470
|
+
return true;
|
|
471
|
+
}
|
|
472
|
+
catch (err) {
|
|
473
|
+
console.warn(`[MoE] Failed to load weights: ${err}`);
|
|
474
|
+
return false;
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Save weights to persistence file
|
|
479
|
+
*/
|
|
480
|
+
async saveWeights(path) {
|
|
481
|
+
const weightsPath = path || this.config.weightsPath;
|
|
482
|
+
try {
|
|
483
|
+
// Ensure directory exists
|
|
484
|
+
const dir = dirname(weightsPath);
|
|
485
|
+
if (!existsSync(dir)) {
|
|
486
|
+
mkdirSync(dir, { recursive: true });
|
|
487
|
+
}
|
|
488
|
+
// Convert Float32Arrays to nested arrays for JSON
|
|
489
|
+
const W1_2d = [];
|
|
490
|
+
for (let i = 0; i < HIDDEN_DIM; i++) {
|
|
491
|
+
W1_2d.push(Array.from(this.W1.slice(i * INPUT_DIM, (i + 1) * INPUT_DIM)));
|
|
492
|
+
}
|
|
493
|
+
const W2_2d = [];
|
|
494
|
+
for (let i = 0; i < NUM_EXPERTS; i++) {
|
|
495
|
+
W2_2d.push(Array.from(this.W2.slice(i * HIDDEN_DIM, (i + 1) * HIDDEN_DIM)));
|
|
496
|
+
}
|
|
497
|
+
const model = {
|
|
498
|
+
version: '1.0.0',
|
|
499
|
+
config: {
|
|
500
|
+
topK: this.config.topK,
|
|
501
|
+
temperature: this.config.temperature,
|
|
502
|
+
learningRate: this.config.learningRate,
|
|
503
|
+
loadBalanceCoef: this.config.loadBalanceCoef,
|
|
504
|
+
},
|
|
505
|
+
weights: {
|
|
506
|
+
W1: W1_2d,
|
|
507
|
+
b1: Array.from(this.b1),
|
|
508
|
+
W2: W2_2d,
|
|
509
|
+
b2: Array.from(this.b2),
|
|
510
|
+
},
|
|
511
|
+
stats: {
|
|
512
|
+
updateCount: this.updateCount,
|
|
513
|
+
routingCounts: Array.from(this.routingCounts),
|
|
514
|
+
avgReward: this.avgReward,
|
|
515
|
+
},
|
|
516
|
+
metadata: {
|
|
517
|
+
savedAt: new Date().toISOString(),
|
|
518
|
+
expertNames: [...EXPERT_NAMES],
|
|
519
|
+
},
|
|
520
|
+
};
|
|
521
|
+
writeFileSync(weightsPath, JSON.stringify(model, null, 2));
|
|
522
|
+
return true;
|
|
523
|
+
}
|
|
524
|
+
catch (err) {
|
|
525
|
+
console.warn(`[MoE] Failed to save weights: ${err}`);
|
|
526
|
+
return false;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* Reset weights to random initialization
|
|
531
|
+
*/
|
|
532
|
+
resetWeights() {
|
|
533
|
+
this.W1 = xavierInit(INPUT_DIM, HIDDEN_DIM);
|
|
534
|
+
this.b1.fill(0);
|
|
535
|
+
this.W2 = xavierInit(HIDDEN_DIM, NUM_EXPERTS);
|
|
536
|
+
this.b2.fill(0);
|
|
537
|
+
this.resetStats();
|
|
538
|
+
}
|
|
539
|
+
// ============================================================================
|
|
540
|
+
// Private Methods
|
|
541
|
+
// ============================================================================
|
|
542
|
+
/**
|
|
543
|
+
* Select top-k indices from probabilities
|
|
544
|
+
*/
|
|
545
|
+
selectTopK(probs, k) {
|
|
546
|
+
// Create index-value pairs and sort by value descending
|
|
547
|
+
const pairs = [];
|
|
548
|
+
for (let i = 0; i < probs.length; i++) {
|
|
549
|
+
pairs.push([i, probs[i]]);
|
|
550
|
+
}
|
|
551
|
+
pairs.sort((a, b) => b[1] - a[1]);
|
|
552
|
+
// Return top-k indices
|
|
553
|
+
return pairs.slice(0, k).map((p) => p[0]);
|
|
554
|
+
}
|
|
555
|
+
/**
|
|
556
|
+
* Compute load balance loss for regularization
|
|
557
|
+
*
|
|
558
|
+
* Uses auxiliary loss from Switch Transformer:
|
|
559
|
+
* L_balance = N * sum(f_i * P_i)
|
|
560
|
+
* where f_i = fraction of tokens routed to expert i
|
|
561
|
+
* P_i = average routing probability to expert i
|
|
562
|
+
*/
|
|
563
|
+
computeLoadBalanceLoss() {
|
|
564
|
+
if (this.totalRoutings === 0)
|
|
565
|
+
return 0;
|
|
566
|
+
let loss = 0;
|
|
567
|
+
for (let i = 0; i < NUM_EXPERTS; i++) {
|
|
568
|
+
const fraction = this.routingCounts[i] / this.totalRoutings;
|
|
569
|
+
const avgProb = this.probs[i]; // Current routing prob
|
|
570
|
+
loss += fraction * avgProb;
|
|
571
|
+
}
|
|
572
|
+
return NUM_EXPERTS * loss * this.config.loadBalanceCoef;
|
|
573
|
+
}
|
|
574
|
+
/**
|
|
575
|
+
* Compute Gini coefficient for load distribution
|
|
576
|
+
*/
|
|
577
|
+
computeGiniCoefficient() {
|
|
578
|
+
if (this.totalRoutings === 0)
|
|
579
|
+
return 0;
|
|
580
|
+
// Sort counts
|
|
581
|
+
const sorted = Array.from(this.routingCounts).sort((a, b) => a - b);
|
|
582
|
+
const n = sorted.length;
|
|
583
|
+
const mean = this.totalRoutings / n;
|
|
584
|
+
// Compute Gini using the formula: G = (2 * sum(i * x_i) - (n+1) * sum(x_i)) / (n * sum(x_i))
|
|
585
|
+
let weightedSum = 0;
|
|
586
|
+
for (let i = 0; i < n; i++) {
|
|
587
|
+
weightedSum += (i + 1) * sorted[i];
|
|
588
|
+
}
|
|
589
|
+
const gini = (2 * weightedSum - (n + 1) * this.totalRoutings) /
|
|
590
|
+
(n * this.totalRoutings + 1e-8);
|
|
591
|
+
return Math.max(0, gini);
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
// ============================================================================
|
|
595
|
+
// Singleton Instance
|
|
596
|
+
// ============================================================================
|
|
597
|
+
let moeRouterInstance = null;
|
|
598
|
+
/**
|
|
599
|
+
* Get singleton MoE router instance
|
|
600
|
+
*
|
|
601
|
+
* @param config - Optional configuration (only used on first call)
|
|
602
|
+
* @returns MoE router instance
|
|
603
|
+
*/
|
|
604
|
+
export function getMoERouter(config) {
|
|
605
|
+
if (!moeRouterInstance) {
|
|
606
|
+
moeRouterInstance = new MoERouter(config);
|
|
607
|
+
// Initialize in background (load weights)
|
|
608
|
+
moeRouterInstance.initialize().catch((err) => {
|
|
609
|
+
console.warn('[MoE] Failed to initialize router:', err);
|
|
610
|
+
});
|
|
611
|
+
}
|
|
612
|
+
return moeRouterInstance;
|
|
613
|
+
}
|
|
614
|
+
/**
|
|
615
|
+
* Reset singleton instance (for testing)
|
|
616
|
+
*/
|
|
617
|
+
export function resetMoERouter() {
|
|
618
|
+
moeRouterInstance = null;
|
|
619
|
+
}
|
|
620
|
+
/**
|
|
621
|
+
* Factory function to create new router
|
|
622
|
+
*/
|
|
623
|
+
export function createMoERouter(config) {
|
|
624
|
+
return new MoERouter(config);
|
|
625
|
+
}
|
|
626
|
+
//# sourceMappingURL=moe-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moe-router.js","sourceRoot":"","sources":["../../../src/ruvector/moe-router.ts"],"names":[],"mappings":"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"}
|