@sparkleideas/neural 3.5.2-patch.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/README.md +260 -0
- package/__tests__/README.md +235 -0
- package/__tests__/algorithms.test.ts +582 -0
- package/__tests__/patterns.test.ts +549 -0
- package/__tests__/sona.test.ts +445 -0
- package/docs/SONA_INTEGRATION.md +460 -0
- package/docs/SONA_QUICKSTART.md +168 -0
- package/examples/sona-usage.ts +318 -0
- package/package.json +23 -0
- package/src/algorithms/a2c.d.ts +86 -0
- package/src/algorithms/a2c.d.ts.map +1 -0
- package/src/algorithms/a2c.js +361 -0
- package/src/algorithms/a2c.js.map +1 -0
- package/src/algorithms/a2c.ts +478 -0
- package/src/algorithms/curiosity.d.ts +82 -0
- package/src/algorithms/curiosity.d.ts.map +1 -0
- package/src/algorithms/curiosity.js +392 -0
- package/src/algorithms/curiosity.js.map +1 -0
- package/src/algorithms/curiosity.ts +509 -0
- package/src/algorithms/decision-transformer.d.ts +82 -0
- package/src/algorithms/decision-transformer.d.ts.map +1 -0
- package/src/algorithms/decision-transformer.js +415 -0
- package/src/algorithms/decision-transformer.js.map +1 -0
- package/src/algorithms/decision-transformer.ts +521 -0
- package/src/algorithms/dqn.d.ts +72 -0
- package/src/algorithms/dqn.d.ts.map +1 -0
- package/src/algorithms/dqn.js +303 -0
- package/src/algorithms/dqn.js.map +1 -0
- package/src/algorithms/dqn.ts +382 -0
- package/src/algorithms/index.d.ts +32 -0
- package/src/algorithms/index.d.ts.map +1 -0
- package/src/algorithms/index.js +74 -0
- package/src/algorithms/index.js.map +1 -0
- package/src/algorithms/index.ts +122 -0
- package/src/algorithms/ppo.d.ts +72 -0
- package/src/algorithms/ppo.d.ts.map +1 -0
- package/src/algorithms/ppo.js +331 -0
- package/src/algorithms/ppo.js.map +1 -0
- package/src/algorithms/ppo.ts +429 -0
- package/src/algorithms/q-learning.d.ts +77 -0
- package/src/algorithms/q-learning.d.ts.map +1 -0
- package/src/algorithms/q-learning.js +259 -0
- package/src/algorithms/q-learning.js.map +1 -0
- package/src/algorithms/q-learning.ts +333 -0
- package/src/algorithms/sarsa.d.ts +82 -0
- package/src/algorithms/sarsa.d.ts.map +1 -0
- package/src/algorithms/sarsa.js +297 -0
- package/src/algorithms/sarsa.js.map +1 -0
- package/src/algorithms/sarsa.ts +383 -0
- package/src/algorithms/tmp.json +0 -0
- package/src/application/index.ts +11 -0
- package/src/application/services/neural-application-service.ts +217 -0
- package/src/domain/entities/pattern.ts +169 -0
- package/src/domain/index.ts +18 -0
- package/src/domain/services/learning-service.ts +256 -0
- package/src/index.d.ts +118 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +201 -0
- package/src/index.js.map +1 -0
- package/src/index.ts +363 -0
- package/src/modes/balanced.d.ts +60 -0
- package/src/modes/balanced.d.ts.map +1 -0
- package/src/modes/balanced.js +234 -0
- package/src/modes/balanced.js.map +1 -0
- package/src/modes/balanced.ts +299 -0
- package/src/modes/base.ts +163 -0
- package/src/modes/batch.d.ts +82 -0
- package/src/modes/batch.d.ts.map +1 -0
- package/src/modes/batch.js +316 -0
- package/src/modes/batch.js.map +1 -0
- package/src/modes/batch.ts +434 -0
- package/src/modes/edge.d.ts +85 -0
- package/src/modes/edge.d.ts.map +1 -0
- package/src/modes/edge.js +310 -0
- package/src/modes/edge.js.map +1 -0
- package/src/modes/edge.ts +409 -0
- package/src/modes/index.d.ts +55 -0
- package/src/modes/index.d.ts.map +1 -0
- package/src/modes/index.js +83 -0
- package/src/modes/index.js.map +1 -0
- package/src/modes/index.ts +16 -0
- package/src/modes/real-time.d.ts +58 -0
- package/src/modes/real-time.d.ts.map +1 -0
- package/src/modes/real-time.js +196 -0
- package/src/modes/real-time.js.map +1 -0
- package/src/modes/real-time.ts +257 -0
- package/src/modes/research.d.ts +79 -0
- package/src/modes/research.d.ts.map +1 -0
- package/src/modes/research.js +389 -0
- package/src/modes/research.js.map +1 -0
- package/src/modes/research.ts +486 -0
- package/src/modes/tmp.json +0 -0
- package/src/pattern-learner.d.ts +117 -0
- package/src/pattern-learner.d.ts.map +1 -0
- package/src/pattern-learner.js +603 -0
- package/src/pattern-learner.js.map +1 -0
- package/src/pattern-learner.ts +757 -0
- package/src/reasoning-bank.d.ts +259 -0
- package/src/reasoning-bank.d.ts.map +1 -0
- package/src/reasoning-bank.js +993 -0
- package/src/reasoning-bank.js.map +1 -0
- package/src/reasoning-bank.ts +1279 -0
- package/src/reasoningbank-adapter.ts +697 -0
- package/src/sona-integration.d.ts +168 -0
- package/src/sona-integration.d.ts.map +1 -0
- package/src/sona-integration.js +316 -0
- package/src/sona-integration.js.map +1 -0
- package/src/sona-integration.ts +432 -0
- package/src/sona-manager.d.ts +147 -0
- package/src/sona-manager.d.ts.map +1 -0
- package/src/sona-manager.js +695 -0
- package/src/sona-manager.js.map +1 -0
- package/src/sona-manager.ts +835 -0
- package/src/tmp.json +0 -0
- package/src/types.d.ts +431 -0
- package/src/types.d.ts.map +1 -0
- package/src/types.js +11 -0
- package/src/types.js.map +1 -0
- package/src/types.ts +590 -0
- package/tmp.json +0 -0
- package/tsconfig.json +9 -0
- package/vitest.config.ts +19 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Balanced Mode Implementation
|
|
3
|
+
*
|
|
4
|
+
* General-purpose mode with:
|
|
5
|
+
* - +25% quality improvement
|
|
6
|
+
* - 18ms overhead
|
|
7
|
+
* - Rank-4 LoRA
|
|
8
|
+
* - Pattern caching
|
|
9
|
+
* - Standard learning pipeline
|
|
10
|
+
*/
|
|
11
|
+
import type { SONAModeConfig, Trajectory, Pattern, PatternMatch, LoRAWeights, EWCState } from '../types.js';
|
|
12
|
+
import { BaseModeImplementation } from './index.js';
|
|
13
|
+
/**
|
|
14
|
+
* Balanced mode for general-purpose learning
|
|
15
|
+
*/
|
|
16
|
+
export declare class BalancedMode extends BaseModeImplementation {
|
|
17
|
+
readonly mode = "balanced";
|
|
18
|
+
private patternCache;
|
|
19
|
+
private cacheHits;
|
|
20
|
+
private cacheMisses;
|
|
21
|
+
private gradientAccumulator;
|
|
22
|
+
private momentumBuffers;
|
|
23
|
+
private totalPatternMatches;
|
|
24
|
+
private totalPatternTime;
|
|
25
|
+
private totalLearnTime;
|
|
26
|
+
private learnIterations;
|
|
27
|
+
private qualityImprovements;
|
|
28
|
+
initialize(): Promise<void>;
|
|
29
|
+
cleanup(): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Find patterns using similarity search with caching
|
|
32
|
+
*/
|
|
33
|
+
findPatterns(embedding: Float32Array, k: number, patterns: Pattern[]): Promise<PatternMatch[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Learn from trajectories using standard gradient descent
|
|
36
|
+
*/
|
|
37
|
+
learn(trajectories: Trajectory[], config: SONAModeConfig, ewcState: EWCState): Promise<number>;
|
|
38
|
+
/**
|
|
39
|
+
* Apply LoRA adaptations with rank-4
|
|
40
|
+
*/
|
|
41
|
+
applyLoRA(input: Float32Array, weights?: LoRAWeights): Promise<Float32Array>;
|
|
42
|
+
getStats(): Record<string, number>;
|
|
43
|
+
/**
|
|
44
|
+
* Compute cache key from embedding
|
|
45
|
+
*/
|
|
46
|
+
private computeCacheKey;
|
|
47
|
+
/**
|
|
48
|
+
* Compute gradient from state and reward
|
|
49
|
+
*/
|
|
50
|
+
private computeGradient;
|
|
51
|
+
/**
|
|
52
|
+
* Accumulate gradient with momentum
|
|
53
|
+
*/
|
|
54
|
+
private accumulateGradient;
|
|
55
|
+
/**
|
|
56
|
+
* Compute EWC penalty for continual learning
|
|
57
|
+
*/
|
|
58
|
+
private computeEWCPenalty;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=balanced.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balanced.d.ts","sourceRoot":"","sources":["balanced.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,cAAc,EAEd,UAAU,EACV,OAAO,EACP,YAAY,EACZ,WAAW,EACX,QAAQ,EACT,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD;;GAEG;AACH,qBAAa,YAAa,SAAQ,sBAAsB;IACtD,QAAQ,CAAC,IAAI,cAAc;IAG3B,OAAO,CAAC,YAAY,CAA0C;IAC9D,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,WAAW,CAAK;IAGxB,OAAO,CAAC,mBAAmB,CAAwC;IACnE,OAAO,CAAC,eAAe,CAAwC;IAG/D,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,mBAAmB,CAAgB;IAErC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B;;OAEG;IACG,YAAY,CAChB,SAAS,EAAE,YAAY,EACvB,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,OAAO,EAAE,GAClB,OAAO,CAAC,YAAY,EAAE,CAAC;IA8C1B;;OAEG;IACG,KAAK,CACT,YAAY,EAAE,UAAU,EAAE,EAC1B,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,MAAM,CAAC;IAwDlB;;OAEG;IACG,SAAS,CACb,KAAK,EAAE,YAAY,EACnB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,YAAY,CAAC;IA2BxB,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAqBlC;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAyB1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAiB1B"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Balanced Mode Implementation
|
|
3
|
+
*
|
|
4
|
+
* General-purpose mode with:
|
|
5
|
+
* - +25% quality improvement
|
|
6
|
+
* - 18ms overhead
|
|
7
|
+
* - Rank-4 LoRA
|
|
8
|
+
* - Pattern caching
|
|
9
|
+
* - Standard learning pipeline
|
|
10
|
+
*/
|
|
11
|
+
import { BaseModeImplementation } from './index.js';
|
|
12
|
+
/**
|
|
13
|
+
* Balanced mode for general-purpose learning
|
|
14
|
+
*/
|
|
15
|
+
export class BalancedMode extends BaseModeImplementation {
|
|
16
|
+
mode = 'balanced';
|
|
17
|
+
// Pattern cache
|
|
18
|
+
patternCache = new Map();
|
|
19
|
+
cacheHits = 0;
|
|
20
|
+
cacheMisses = 0;
|
|
21
|
+
// Learning state
|
|
22
|
+
gradientAccumulator = new Map();
|
|
23
|
+
momentumBuffers = new Map();
|
|
24
|
+
// Stats
|
|
25
|
+
totalPatternMatches = 0;
|
|
26
|
+
totalPatternTime = 0;
|
|
27
|
+
totalLearnTime = 0;
|
|
28
|
+
learnIterations = 0;
|
|
29
|
+
qualityImprovements = [];
|
|
30
|
+
async initialize() {
|
|
31
|
+
await super.initialize();
|
|
32
|
+
this.patternCache.clear();
|
|
33
|
+
this.gradientAccumulator.clear();
|
|
34
|
+
this.momentumBuffers.clear();
|
|
35
|
+
}
|
|
36
|
+
async cleanup() {
|
|
37
|
+
this.patternCache.clear();
|
|
38
|
+
this.gradientAccumulator.clear();
|
|
39
|
+
this.momentumBuffers.clear();
|
|
40
|
+
await super.cleanup();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Find patterns using similarity search with caching
|
|
44
|
+
*/
|
|
45
|
+
async findPatterns(embedding, k, patterns) {
|
|
46
|
+
const startTime = performance.now();
|
|
47
|
+
// Check cache
|
|
48
|
+
const cacheKey = this.computeCacheKey(embedding);
|
|
49
|
+
const cached = this.patternCache.get(cacheKey);
|
|
50
|
+
if (cached && cached.length >= k) {
|
|
51
|
+
this.cacheHits++;
|
|
52
|
+
this.totalPatternTime += performance.now() - startTime;
|
|
53
|
+
this.totalPatternMatches++;
|
|
54
|
+
return cached.slice(0, k);
|
|
55
|
+
}
|
|
56
|
+
this.cacheMisses++;
|
|
57
|
+
// Compute similarities for all patterns
|
|
58
|
+
const matches = [];
|
|
59
|
+
for (const pattern of patterns) {
|
|
60
|
+
const similarity = this.cosineSimilarity(embedding, pattern.embedding);
|
|
61
|
+
matches.push({
|
|
62
|
+
pattern,
|
|
63
|
+
similarity,
|
|
64
|
+
confidence: similarity * pattern.successRate,
|
|
65
|
+
latencyMs: 0,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
// Sort by similarity descending
|
|
69
|
+
matches.sort((a, b) => b.similarity - a.similarity);
|
|
70
|
+
const topK = matches.slice(0, k);
|
|
71
|
+
// Cache result
|
|
72
|
+
if (this.patternCache.size > 500) {
|
|
73
|
+
const firstKey = this.patternCache.keys().next().value;
|
|
74
|
+
if (firstKey)
|
|
75
|
+
this.patternCache.delete(firstKey);
|
|
76
|
+
}
|
|
77
|
+
this.patternCache.set(cacheKey, topK);
|
|
78
|
+
this.totalPatternTime += performance.now() - startTime;
|
|
79
|
+
this.totalPatternMatches++;
|
|
80
|
+
return topK;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Learn from trajectories using standard gradient descent
|
|
84
|
+
*/
|
|
85
|
+
async learn(trajectories, config, ewcState) {
|
|
86
|
+
const startTime = performance.now();
|
|
87
|
+
if (trajectories.length === 0)
|
|
88
|
+
return 0;
|
|
89
|
+
const qualityThreshold = config.qualityThreshold;
|
|
90
|
+
const learningRate = config.learningRate;
|
|
91
|
+
// Separate positive and negative examples
|
|
92
|
+
const goodTrajectories = trajectories.filter(t => t.qualityScore >= qualityThreshold);
|
|
93
|
+
const badTrajectories = trajectories.filter(t => t.qualityScore < qualityThreshold);
|
|
94
|
+
if (goodTrajectories.length === 0)
|
|
95
|
+
return 0;
|
|
96
|
+
// Compute gradients from trajectory pairs
|
|
97
|
+
let totalGradientNorm = 0;
|
|
98
|
+
for (const good of goodTrajectories) {
|
|
99
|
+
// Use last step embedding as "goal state"
|
|
100
|
+
if (good.steps.length === 0)
|
|
101
|
+
continue;
|
|
102
|
+
const goalState = good.steps[good.steps.length - 1].stateAfter;
|
|
103
|
+
// Positive gradient: move toward good outcomes
|
|
104
|
+
const posGradient = this.computeGradient(goalState, good.qualityScore);
|
|
105
|
+
totalGradientNorm += this.accumulateGradient('positive', posGradient, learningRate);
|
|
106
|
+
// Negative gradient: move away from bad outcomes (contrastive)
|
|
107
|
+
for (const bad of badTrajectories.slice(0, 3)) {
|
|
108
|
+
if (bad.steps.length === 0)
|
|
109
|
+
continue;
|
|
110
|
+
const badState = bad.steps[bad.steps.length - 1].stateAfter;
|
|
111
|
+
const negGradient = this.computeGradient(badState, -bad.qualityScore);
|
|
112
|
+
totalGradientNorm += this.accumulateGradient('negative', negGradient, learningRate * 0.5);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Apply EWC regularization
|
|
116
|
+
const ewcPenalty = this.computeEWCPenalty(ewcState, config.ewcLambda);
|
|
117
|
+
totalGradientNorm += ewcPenalty;
|
|
118
|
+
// Compute improvement delta
|
|
119
|
+
const avgGoodQuality = goodTrajectories.reduce((s, t) => s + t.qualityScore, 0) / goodTrajectories.length;
|
|
120
|
+
const baselineQuality = 0.5;
|
|
121
|
+
const improvementDelta = avgGoodQuality - baselineQuality;
|
|
122
|
+
this.qualityImprovements.push(improvementDelta);
|
|
123
|
+
if (this.qualityImprovements.length > 100) {
|
|
124
|
+
this.qualityImprovements = this.qualityImprovements.slice(-100);
|
|
125
|
+
}
|
|
126
|
+
this.totalLearnTime += performance.now() - startTime;
|
|
127
|
+
this.learnIterations++;
|
|
128
|
+
return Math.max(0, improvementDelta);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Apply LoRA adaptations with rank-4
|
|
132
|
+
*/
|
|
133
|
+
async applyLoRA(input, weights) {
|
|
134
|
+
if (!weights) {
|
|
135
|
+
return input;
|
|
136
|
+
}
|
|
137
|
+
const output = new Float32Array(input.length);
|
|
138
|
+
output.set(input);
|
|
139
|
+
const rank = this.config.loraRank;
|
|
140
|
+
// Apply to all target modules
|
|
141
|
+
for (const module of ['q_proj', 'v_proj', 'k_proj', 'o_proj']) {
|
|
142
|
+
const A = weights.A.get(module);
|
|
143
|
+
const B = weights.B.get(module);
|
|
144
|
+
if (A && B) {
|
|
145
|
+
const adapted = this.applyLoRATransform(input, A, B, rank);
|
|
146
|
+
const alpha = 0.2; // Moderate blending
|
|
147
|
+
for (let i = 0; i < output.length; i++) {
|
|
148
|
+
output[i] = output[i] * (1 - alpha) + adapted[i] * alpha;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return output;
|
|
153
|
+
}
|
|
154
|
+
getStats() {
|
|
155
|
+
const avgImprovement = this.qualityImprovements.length > 0
|
|
156
|
+
? this.qualityImprovements.reduce((a, b) => a + b, 0) / this.qualityImprovements.length
|
|
157
|
+
: 0;
|
|
158
|
+
return {
|
|
159
|
+
cacheHitRate: this.cacheHits + this.cacheMisses > 0
|
|
160
|
+
? this.cacheHits / (this.cacheHits + this.cacheMisses)
|
|
161
|
+
: 0,
|
|
162
|
+
avgPatternMatchMs: this.totalPatternMatches > 0
|
|
163
|
+
? this.totalPatternTime / this.totalPatternMatches
|
|
164
|
+
: 0,
|
|
165
|
+
avgLearnMs: this.learnIterations > 0
|
|
166
|
+
? this.totalLearnTime / this.learnIterations
|
|
167
|
+
: 0,
|
|
168
|
+
avgImprovement,
|
|
169
|
+
patternCacheSize: this.patternCache.size,
|
|
170
|
+
learnIterations: this.learnIterations,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Compute cache key from embedding
|
|
175
|
+
*/
|
|
176
|
+
computeCacheKey(embedding) {
|
|
177
|
+
const keyParts = [];
|
|
178
|
+
for (let i = 0; i < Math.min(16, embedding.length); i++) {
|
|
179
|
+
keyParts.push(embedding[i].toFixed(2));
|
|
180
|
+
}
|
|
181
|
+
return keyParts.join(',');
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Compute gradient from state and reward
|
|
185
|
+
*/
|
|
186
|
+
computeGradient(state, reward) {
|
|
187
|
+
const gradient = new Float32Array(state.length);
|
|
188
|
+
for (let i = 0; i < state.length; i++) {
|
|
189
|
+
gradient[i] = state[i] * reward;
|
|
190
|
+
}
|
|
191
|
+
return gradient;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Accumulate gradient with momentum
|
|
195
|
+
*/
|
|
196
|
+
accumulateGradient(key, gradient, lr) {
|
|
197
|
+
let momentum = this.momentumBuffers.get(key);
|
|
198
|
+
if (!momentum) {
|
|
199
|
+
momentum = new Float32Array(gradient.length);
|
|
200
|
+
this.momentumBuffers.set(key, momentum);
|
|
201
|
+
}
|
|
202
|
+
let accumulator = this.gradientAccumulator.get(key);
|
|
203
|
+
if (!accumulator) {
|
|
204
|
+
accumulator = new Float32Array(gradient.length);
|
|
205
|
+
this.gradientAccumulator.set(key, accumulator);
|
|
206
|
+
}
|
|
207
|
+
const beta = 0.9; // Momentum coefficient
|
|
208
|
+
let norm = 0;
|
|
209
|
+
for (let i = 0; i < gradient.length; i++) {
|
|
210
|
+
momentum[i] = beta * momentum[i] + (1 - beta) * gradient[i];
|
|
211
|
+
accumulator[i] += lr * momentum[i];
|
|
212
|
+
norm += momentum[i] * momentum[i];
|
|
213
|
+
}
|
|
214
|
+
return Math.sqrt(norm);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Compute EWC penalty for continual learning
|
|
218
|
+
*/
|
|
219
|
+
computeEWCPenalty(ewcState, lambda) {
|
|
220
|
+
let penalty = 0;
|
|
221
|
+
for (const [key, fisher] of ewcState.fisher) {
|
|
222
|
+
const means = ewcState.means.get(key);
|
|
223
|
+
const current = this.gradientAccumulator.get(key);
|
|
224
|
+
if (means && current) {
|
|
225
|
+
for (let i = 0; i < Math.min(fisher.length, means.length, current.length); i++) {
|
|
226
|
+
const diff = current[i] - means[i];
|
|
227
|
+
penalty += fisher[i] * diff * diff;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return lambda * penalty * 0.5;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=balanced.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balanced.js","sourceRoot":"","sources":["balanced.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,sBAAsB;IAC7C,IAAI,GAAG,UAAU,CAAC;IAE3B,gBAAgB;IACR,YAAY,GAAgC,IAAI,GAAG,EAAE,CAAC;IACtD,SAAS,GAAG,CAAC,CAAC;IACd,WAAW,GAAG,CAAC,CAAC;IAExB,iBAAiB;IACT,mBAAmB,GAA8B,IAAI,GAAG,EAAE,CAAC;IAC3D,eAAe,GAA8B,IAAI,GAAG,EAAE,CAAC;IAE/D,QAAQ;IACA,mBAAmB,GAAG,CAAC,CAAC;IACxB,gBAAgB,GAAG,CAAC,CAAC;IACrB,cAAc,GAAG,CAAC,CAAC;IACnB,eAAe,GAAG,CAAC,CAAC;IACpB,mBAAmB,GAAa,EAAE,CAAC;IAE3C,KAAK,CAAC,UAAU;QACd,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;QACzB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAChB,SAAuB,EACvB,CAAS,EACT,QAAmB;QAEnB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEpC,cAAc;QACd,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE/C,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,IAAI,CAAC,gBAAgB,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACvD,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,wCAAwC;QACxC,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YACvE,OAAO,CAAC,IAAI,CAAC;gBACX,OAAO;gBACP,UAAU;gBACV,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW;gBAC5C,SAAS,EAAE,CAAC;aACb,CAAC,CAAC;QACL,CAAC;QAED,gCAAgC;QAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEjC,eAAe;QACf,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YACvD,IAAI,QAAQ;gBAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEtC,IAAI,CAAC,gBAAgB,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACvD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CACT,YAA0B,EAC1B,MAAsB,EACtB,QAAkB;QAElB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEpC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAExC,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACjD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QAEzC,0CAA0C;QAC1C,MAAM,gBAAgB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,gBAAgB,CAAC,CAAC;QACtF,MAAM,eAAe,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,gBAAgB,CAAC,CAAC;QAEpF,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAE5C,0CAA0C;QAC1C,IAAI,iBAAiB,GAAG,CAAC,CAAC;QAE1B,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;YACpC,0CAA0C;YAC1C,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAEtC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;YAE/D,+CAA+C;YAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YACvE,iBAAiB,IAAI,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;YAEpF,+DAA+D;YAC/D,KAAK,MAAM,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC9C,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBACrC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;gBAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBACtE,iBAAiB,IAAI,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,WAAW,EAAE,YAAY,GAAG,GAAG,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACtE,iBAAiB,IAAI,UAAU,CAAC;QAEhC,4BAA4B;QAC5B,MAAM,cAAc,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC;QAC1G,MAAM,eAAe,GAAG,GAAG,CAAC;QAC5B,MAAM,gBAAgB,GAAG,cAAc,GAAG,eAAe,CAAC;QAE1D,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAC1C,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,CAAC,cAAc,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACrD,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CACb,KAAmB,EACnB,OAAqB;QAErB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAElB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAElC,8BAA8B;QAC9B,KAAK,MAAM,MAAM,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC9D,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAChC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAEhC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC3D,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,oBAAoB;gBACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACvC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;gBAC3D,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,QAAQ;QACN,MAAM,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC;YACxD,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM;YACvF,CAAC,CAAC,CAAC,CAAC;QAEN,OAAO;YACL,YAAY,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC;gBACjD,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;gBACtD,CAAC,CAAC,CAAC;YACL,iBAAiB,EAAE,IAAI,CAAC,mBAAmB,GAAG,CAAC;gBAC7C,CAAC,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,mBAAmB;gBAClD,CAAC,CAAC,CAAC;YACL,UAAU,EAAE,IAAI,CAAC,eAAe,GAAG,CAAC;gBAClC,CAAC,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,eAAe;gBAC5C,CAAC,CAAC,CAAC;YACL,cAAc;YACd,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI;YACxC,eAAe,EAAE,IAAI,CAAC,eAAe;SACtC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,SAAuB;QAC7C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACxD,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,KAAmB,EAAE,MAAc;QACzD,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAClC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,GAAW,EAAE,QAAsB,EAAE,EAAU;QACxE,IAAI,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC7C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,WAAW,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAChD,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,uBAAuB;QACzC,IAAI,IAAI,GAAG,CAAC,CAAC;QAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5D,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,QAAkB,EAAE,MAAc;QAC1D,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAElD,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;gBACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC/E,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACnC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,MAAM,GAAG,OAAO,GAAG,GAAG,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Balanced Mode Implementation
|
|
3
|
+
*
|
|
4
|
+
* General-purpose mode with:
|
|
5
|
+
* - +25% quality improvement
|
|
6
|
+
* - 18ms overhead
|
|
7
|
+
* - Rank-4 LoRA
|
|
8
|
+
* - Pattern caching
|
|
9
|
+
* - Standard learning pipeline
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type {
|
|
13
|
+
SONAModeConfig,
|
|
14
|
+
ModeOptimizations,
|
|
15
|
+
Trajectory,
|
|
16
|
+
Pattern,
|
|
17
|
+
PatternMatch,
|
|
18
|
+
LoRAWeights,
|
|
19
|
+
EWCState,
|
|
20
|
+
} from '../types.js';
|
|
21
|
+
import { BaseModeImplementation } from './base.js';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Balanced mode for general-purpose learning
|
|
25
|
+
*/
|
|
26
|
+
export class BalancedMode extends BaseModeImplementation {
|
|
27
|
+
readonly mode = 'balanced';
|
|
28
|
+
|
|
29
|
+
// Pattern cache
|
|
30
|
+
private patternCache: Map<string, PatternMatch[]> = new Map();
|
|
31
|
+
private cacheHits = 0;
|
|
32
|
+
private cacheMisses = 0;
|
|
33
|
+
|
|
34
|
+
// Learning state
|
|
35
|
+
private gradientAccumulator: Map<string, Float32Array> = new Map();
|
|
36
|
+
private momentumBuffers: Map<string, Float32Array> = new Map();
|
|
37
|
+
|
|
38
|
+
// Stats
|
|
39
|
+
private totalPatternMatches = 0;
|
|
40
|
+
private totalPatternTime = 0;
|
|
41
|
+
private totalLearnTime = 0;
|
|
42
|
+
private learnIterations = 0;
|
|
43
|
+
private qualityImprovements: number[] = [];
|
|
44
|
+
|
|
45
|
+
async initialize(): Promise<void> {
|
|
46
|
+
await super.initialize();
|
|
47
|
+
this.patternCache.clear();
|
|
48
|
+
this.gradientAccumulator.clear();
|
|
49
|
+
this.momentumBuffers.clear();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async cleanup(): Promise<void> {
|
|
53
|
+
this.patternCache.clear();
|
|
54
|
+
this.gradientAccumulator.clear();
|
|
55
|
+
this.momentumBuffers.clear();
|
|
56
|
+
await super.cleanup();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Find patterns using similarity search with caching
|
|
61
|
+
*/
|
|
62
|
+
async findPatterns(
|
|
63
|
+
embedding: Float32Array,
|
|
64
|
+
k: number,
|
|
65
|
+
patterns: Pattern[]
|
|
66
|
+
): Promise<PatternMatch[]> {
|
|
67
|
+
const startTime = performance.now();
|
|
68
|
+
|
|
69
|
+
// Check cache
|
|
70
|
+
const cacheKey = this.computeCacheKey(embedding);
|
|
71
|
+
const cached = this.patternCache.get(cacheKey);
|
|
72
|
+
|
|
73
|
+
if (cached && cached.length >= k) {
|
|
74
|
+
this.cacheHits++;
|
|
75
|
+
this.totalPatternTime += performance.now() - startTime;
|
|
76
|
+
this.totalPatternMatches++;
|
|
77
|
+
return cached.slice(0, k);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
this.cacheMisses++;
|
|
81
|
+
|
|
82
|
+
// Compute similarities for all patterns
|
|
83
|
+
const matches: PatternMatch[] = [];
|
|
84
|
+
|
|
85
|
+
for (const pattern of patterns) {
|
|
86
|
+
const similarity = this.cosineSimilarity(embedding, pattern.embedding);
|
|
87
|
+
matches.push({
|
|
88
|
+
pattern,
|
|
89
|
+
similarity,
|
|
90
|
+
confidence: similarity * pattern.successRate,
|
|
91
|
+
latencyMs: 0,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Sort by similarity descending
|
|
96
|
+
matches.sort((a, b) => b.similarity - a.similarity);
|
|
97
|
+
const topK = matches.slice(0, k);
|
|
98
|
+
|
|
99
|
+
// Cache result
|
|
100
|
+
if (this.patternCache.size > 500) {
|
|
101
|
+
const firstKey = this.patternCache.keys().next().value;
|
|
102
|
+
if (firstKey) this.patternCache.delete(firstKey);
|
|
103
|
+
}
|
|
104
|
+
this.patternCache.set(cacheKey, topK);
|
|
105
|
+
|
|
106
|
+
this.totalPatternTime += performance.now() - startTime;
|
|
107
|
+
this.totalPatternMatches++;
|
|
108
|
+
|
|
109
|
+
return topK;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Learn from trajectories using standard gradient descent
|
|
114
|
+
*/
|
|
115
|
+
async learn(
|
|
116
|
+
trajectories: Trajectory[],
|
|
117
|
+
config: SONAModeConfig,
|
|
118
|
+
ewcState: EWCState
|
|
119
|
+
): Promise<number> {
|
|
120
|
+
const startTime = performance.now();
|
|
121
|
+
|
|
122
|
+
if (trajectories.length === 0) return 0;
|
|
123
|
+
|
|
124
|
+
const qualityThreshold = config.qualityThreshold;
|
|
125
|
+
const learningRate = config.learningRate;
|
|
126
|
+
|
|
127
|
+
// Separate positive and negative examples
|
|
128
|
+
const goodTrajectories = trajectories.filter(t => t.qualityScore >= qualityThreshold);
|
|
129
|
+
const badTrajectories = trajectories.filter(t => t.qualityScore < qualityThreshold);
|
|
130
|
+
|
|
131
|
+
if (goodTrajectories.length === 0) return 0;
|
|
132
|
+
|
|
133
|
+
// Compute gradients from trajectory pairs
|
|
134
|
+
let totalGradientNorm = 0;
|
|
135
|
+
|
|
136
|
+
for (const good of goodTrajectories) {
|
|
137
|
+
// Use last step embedding as "goal state"
|
|
138
|
+
if (good.steps.length === 0) continue;
|
|
139
|
+
|
|
140
|
+
const goalState = good.steps[good.steps.length - 1].stateAfter;
|
|
141
|
+
|
|
142
|
+
// Positive gradient: move toward good outcomes
|
|
143
|
+
const posGradient = this.computeGradient(goalState, good.qualityScore);
|
|
144
|
+
totalGradientNorm += this.accumulateGradient('positive', posGradient, learningRate);
|
|
145
|
+
|
|
146
|
+
// Negative gradient: move away from bad outcomes (contrastive)
|
|
147
|
+
for (const bad of badTrajectories.slice(0, 3)) {
|
|
148
|
+
if (bad.steps.length === 0) continue;
|
|
149
|
+
const badState = bad.steps[bad.steps.length - 1].stateAfter;
|
|
150
|
+
const negGradient = this.computeGradient(badState, -bad.qualityScore);
|
|
151
|
+
totalGradientNorm += this.accumulateGradient('negative', negGradient, learningRate * 0.5);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Apply EWC regularization
|
|
156
|
+
const ewcPenalty = this.computeEWCPenalty(ewcState, config.ewcLambda);
|
|
157
|
+
totalGradientNorm += ewcPenalty;
|
|
158
|
+
|
|
159
|
+
// Compute improvement delta
|
|
160
|
+
const avgGoodQuality = goodTrajectories.reduce((s, t) => s + t.qualityScore, 0) / goodTrajectories.length;
|
|
161
|
+
const baselineQuality = 0.5;
|
|
162
|
+
const improvementDelta = avgGoodQuality - baselineQuality;
|
|
163
|
+
|
|
164
|
+
this.qualityImprovements.push(improvementDelta);
|
|
165
|
+
if (this.qualityImprovements.length > 100) {
|
|
166
|
+
this.qualityImprovements = this.qualityImprovements.slice(-100);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
this.totalLearnTime += performance.now() - startTime;
|
|
170
|
+
this.learnIterations++;
|
|
171
|
+
|
|
172
|
+
return Math.max(0, improvementDelta);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Apply LoRA adaptations with rank-4
|
|
177
|
+
*/
|
|
178
|
+
async applyLoRA(
|
|
179
|
+
input: Float32Array,
|
|
180
|
+
weights?: LoRAWeights
|
|
181
|
+
): Promise<Float32Array> {
|
|
182
|
+
if (!weights) {
|
|
183
|
+
return input;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const output = new Float32Array(input.length);
|
|
187
|
+
output.set(input);
|
|
188
|
+
|
|
189
|
+
const rank = this.config.loraRank;
|
|
190
|
+
|
|
191
|
+
// Apply to all target modules
|
|
192
|
+
for (const module of ['q_proj', 'v_proj', 'k_proj', 'o_proj']) {
|
|
193
|
+
const A = weights.A.get(module);
|
|
194
|
+
const B = weights.B.get(module);
|
|
195
|
+
|
|
196
|
+
if (A && B) {
|
|
197
|
+
const adapted = this.applyLoRATransform(input, A, B, rank);
|
|
198
|
+
const alpha = 0.2; // Moderate blending
|
|
199
|
+
for (let i = 0; i < output.length; i++) {
|
|
200
|
+
output[i] = output[i] * (1 - alpha) + adapted[i] * alpha;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return output;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
getStats(): Record<string, number> {
|
|
209
|
+
const avgImprovement = this.qualityImprovements.length > 0
|
|
210
|
+
? this.qualityImprovements.reduce((a, b) => a + b, 0) / this.qualityImprovements.length
|
|
211
|
+
: 0;
|
|
212
|
+
|
|
213
|
+
return {
|
|
214
|
+
cacheHitRate: this.cacheHits + this.cacheMisses > 0
|
|
215
|
+
? this.cacheHits / (this.cacheHits + this.cacheMisses)
|
|
216
|
+
: 0,
|
|
217
|
+
avgPatternMatchMs: this.totalPatternMatches > 0
|
|
218
|
+
? this.totalPatternTime / this.totalPatternMatches
|
|
219
|
+
: 0,
|
|
220
|
+
avgLearnMs: this.learnIterations > 0
|
|
221
|
+
? this.totalLearnTime / this.learnIterations
|
|
222
|
+
: 0,
|
|
223
|
+
avgImprovement,
|
|
224
|
+
patternCacheSize: this.patternCache.size,
|
|
225
|
+
learnIterations: this.learnIterations,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Compute cache key from embedding
|
|
231
|
+
*/
|
|
232
|
+
private computeCacheKey(embedding: Float32Array): string {
|
|
233
|
+
const keyParts: string[] = [];
|
|
234
|
+
for (let i = 0; i < Math.min(16, embedding.length); i++) {
|
|
235
|
+
keyParts.push(embedding[i].toFixed(2));
|
|
236
|
+
}
|
|
237
|
+
return keyParts.join(',');
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Compute gradient from state and reward
|
|
242
|
+
*/
|
|
243
|
+
private computeGradient(state: Float32Array, reward: number): Float32Array {
|
|
244
|
+
const gradient = new Float32Array(state.length);
|
|
245
|
+
for (let i = 0; i < state.length; i++) {
|
|
246
|
+
gradient[i] = state[i] * reward;
|
|
247
|
+
}
|
|
248
|
+
return gradient;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Accumulate gradient with momentum
|
|
253
|
+
*/
|
|
254
|
+
private accumulateGradient(key: string, gradient: Float32Array, lr: number): number {
|
|
255
|
+
let momentum = this.momentumBuffers.get(key);
|
|
256
|
+
if (!momentum) {
|
|
257
|
+
momentum = new Float32Array(gradient.length);
|
|
258
|
+
this.momentumBuffers.set(key, momentum);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
let accumulator = this.gradientAccumulator.get(key);
|
|
262
|
+
if (!accumulator) {
|
|
263
|
+
accumulator = new Float32Array(gradient.length);
|
|
264
|
+
this.gradientAccumulator.set(key, accumulator);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
const beta = 0.9; // Momentum coefficient
|
|
268
|
+
let norm = 0;
|
|
269
|
+
|
|
270
|
+
for (let i = 0; i < gradient.length; i++) {
|
|
271
|
+
momentum[i] = beta * momentum[i] + (1 - beta) * gradient[i];
|
|
272
|
+
accumulator[i] += lr * momentum[i];
|
|
273
|
+
norm += momentum[i] * momentum[i];
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
return Math.sqrt(norm);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Compute EWC penalty for continual learning
|
|
281
|
+
*/
|
|
282
|
+
private computeEWCPenalty(ewcState: EWCState, lambda: number): number {
|
|
283
|
+
let penalty = 0;
|
|
284
|
+
|
|
285
|
+
for (const [key, fisher] of ewcState.fisher) {
|
|
286
|
+
const means = ewcState.means.get(key);
|
|
287
|
+
const current = this.gradientAccumulator.get(key);
|
|
288
|
+
|
|
289
|
+
if (means && current) {
|
|
290
|
+
for (let i = 0; i < Math.min(fisher.length, means.length, current.length); i++) {
|
|
291
|
+
const diff = current[i] - means[i];
|
|
292
|
+
penalty += fisher[i] * diff * diff;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
return lambda * penalty * 0.5;
|
|
298
|
+
}
|
|
299
|
+
}
|