@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.
Files changed (122) hide show
  1. package/README.md +260 -0
  2. package/__tests__/README.md +235 -0
  3. package/__tests__/algorithms.test.ts +582 -0
  4. package/__tests__/patterns.test.ts +549 -0
  5. package/__tests__/sona.test.ts +445 -0
  6. package/docs/SONA_INTEGRATION.md +460 -0
  7. package/docs/SONA_QUICKSTART.md +168 -0
  8. package/examples/sona-usage.ts +318 -0
  9. package/package.json +23 -0
  10. package/src/algorithms/a2c.d.ts +86 -0
  11. package/src/algorithms/a2c.d.ts.map +1 -0
  12. package/src/algorithms/a2c.js +361 -0
  13. package/src/algorithms/a2c.js.map +1 -0
  14. package/src/algorithms/a2c.ts +478 -0
  15. package/src/algorithms/curiosity.d.ts +82 -0
  16. package/src/algorithms/curiosity.d.ts.map +1 -0
  17. package/src/algorithms/curiosity.js +392 -0
  18. package/src/algorithms/curiosity.js.map +1 -0
  19. package/src/algorithms/curiosity.ts +509 -0
  20. package/src/algorithms/decision-transformer.d.ts +82 -0
  21. package/src/algorithms/decision-transformer.d.ts.map +1 -0
  22. package/src/algorithms/decision-transformer.js +415 -0
  23. package/src/algorithms/decision-transformer.js.map +1 -0
  24. package/src/algorithms/decision-transformer.ts +521 -0
  25. package/src/algorithms/dqn.d.ts +72 -0
  26. package/src/algorithms/dqn.d.ts.map +1 -0
  27. package/src/algorithms/dqn.js +303 -0
  28. package/src/algorithms/dqn.js.map +1 -0
  29. package/src/algorithms/dqn.ts +382 -0
  30. package/src/algorithms/index.d.ts +32 -0
  31. package/src/algorithms/index.d.ts.map +1 -0
  32. package/src/algorithms/index.js +74 -0
  33. package/src/algorithms/index.js.map +1 -0
  34. package/src/algorithms/index.ts +122 -0
  35. package/src/algorithms/ppo.d.ts +72 -0
  36. package/src/algorithms/ppo.d.ts.map +1 -0
  37. package/src/algorithms/ppo.js +331 -0
  38. package/src/algorithms/ppo.js.map +1 -0
  39. package/src/algorithms/ppo.ts +429 -0
  40. package/src/algorithms/q-learning.d.ts +77 -0
  41. package/src/algorithms/q-learning.d.ts.map +1 -0
  42. package/src/algorithms/q-learning.js +259 -0
  43. package/src/algorithms/q-learning.js.map +1 -0
  44. package/src/algorithms/q-learning.ts +333 -0
  45. package/src/algorithms/sarsa.d.ts +82 -0
  46. package/src/algorithms/sarsa.d.ts.map +1 -0
  47. package/src/algorithms/sarsa.js +297 -0
  48. package/src/algorithms/sarsa.js.map +1 -0
  49. package/src/algorithms/sarsa.ts +383 -0
  50. package/src/algorithms/tmp.json +0 -0
  51. package/src/application/index.ts +11 -0
  52. package/src/application/services/neural-application-service.ts +217 -0
  53. package/src/domain/entities/pattern.ts +169 -0
  54. package/src/domain/index.ts +18 -0
  55. package/src/domain/services/learning-service.ts +256 -0
  56. package/src/index.d.ts +118 -0
  57. package/src/index.d.ts.map +1 -0
  58. package/src/index.js +201 -0
  59. package/src/index.js.map +1 -0
  60. package/src/index.ts +363 -0
  61. package/src/modes/balanced.d.ts +60 -0
  62. package/src/modes/balanced.d.ts.map +1 -0
  63. package/src/modes/balanced.js +234 -0
  64. package/src/modes/balanced.js.map +1 -0
  65. package/src/modes/balanced.ts +299 -0
  66. package/src/modes/base.ts +163 -0
  67. package/src/modes/batch.d.ts +82 -0
  68. package/src/modes/batch.d.ts.map +1 -0
  69. package/src/modes/batch.js +316 -0
  70. package/src/modes/batch.js.map +1 -0
  71. package/src/modes/batch.ts +434 -0
  72. package/src/modes/edge.d.ts +85 -0
  73. package/src/modes/edge.d.ts.map +1 -0
  74. package/src/modes/edge.js +310 -0
  75. package/src/modes/edge.js.map +1 -0
  76. package/src/modes/edge.ts +409 -0
  77. package/src/modes/index.d.ts +55 -0
  78. package/src/modes/index.d.ts.map +1 -0
  79. package/src/modes/index.js +83 -0
  80. package/src/modes/index.js.map +1 -0
  81. package/src/modes/index.ts +16 -0
  82. package/src/modes/real-time.d.ts +58 -0
  83. package/src/modes/real-time.d.ts.map +1 -0
  84. package/src/modes/real-time.js +196 -0
  85. package/src/modes/real-time.js.map +1 -0
  86. package/src/modes/real-time.ts +257 -0
  87. package/src/modes/research.d.ts +79 -0
  88. package/src/modes/research.d.ts.map +1 -0
  89. package/src/modes/research.js +389 -0
  90. package/src/modes/research.js.map +1 -0
  91. package/src/modes/research.ts +486 -0
  92. package/src/modes/tmp.json +0 -0
  93. package/src/pattern-learner.d.ts +117 -0
  94. package/src/pattern-learner.d.ts.map +1 -0
  95. package/src/pattern-learner.js +603 -0
  96. package/src/pattern-learner.js.map +1 -0
  97. package/src/pattern-learner.ts +757 -0
  98. package/src/reasoning-bank.d.ts +259 -0
  99. package/src/reasoning-bank.d.ts.map +1 -0
  100. package/src/reasoning-bank.js +993 -0
  101. package/src/reasoning-bank.js.map +1 -0
  102. package/src/reasoning-bank.ts +1279 -0
  103. package/src/reasoningbank-adapter.ts +697 -0
  104. package/src/sona-integration.d.ts +168 -0
  105. package/src/sona-integration.d.ts.map +1 -0
  106. package/src/sona-integration.js +316 -0
  107. package/src/sona-integration.js.map +1 -0
  108. package/src/sona-integration.ts +432 -0
  109. package/src/sona-manager.d.ts +147 -0
  110. package/src/sona-manager.d.ts.map +1 -0
  111. package/src/sona-manager.js +695 -0
  112. package/src/sona-manager.js.map +1 -0
  113. package/src/sona-manager.ts +835 -0
  114. package/src/tmp.json +0 -0
  115. package/src/types.d.ts +431 -0
  116. package/src/types.d.ts.map +1 -0
  117. package/src/types.js +11 -0
  118. package/src/types.js.map +1 -0
  119. package/src/types.ts +590 -0
  120. package/tmp.json +0 -0
  121. package/tsconfig.json +9 -0
  122. package/vitest.config.ts +19 -0
@@ -0,0 +1,835 @@
1
+ /**
2
+ * SONA Manager - Self-Optimizing Neural Architecture
3
+ *
4
+ * Manages learning modes and provides adaptive optimization for agent tasks.
5
+ *
6
+ * Performance Targets:
7
+ * - Adaptation: <0.05ms
8
+ * - Pattern retrieval: <1ms
9
+ * - Learning step: <10ms
10
+ *
11
+ * Supported Modes:
12
+ * - real-time: Sub-millisecond adaptation (2200 ops/sec)
13
+ * - balanced: General purpose (+25% quality)
14
+ * - research: Deep exploration (+55% quality)
15
+ * - edge: Resource-constrained (<5MB)
16
+ * - batch: High-throughput processing
17
+ */
18
+
19
+ import type {
20
+ SONAMode,
21
+ SONAModeConfig,
22
+ ModeOptimizations,
23
+ Trajectory,
24
+ TrajectoryStep,
25
+ Pattern,
26
+ PatternMatch,
27
+ NeuralStats,
28
+ NeuralEvent,
29
+ NeuralEventListener,
30
+ LoRAConfig,
31
+ LoRAWeights,
32
+ EWCConfig,
33
+ EWCState,
34
+ RLAlgorithm,
35
+ } from './types.js';
36
+
37
+ import { RealTimeMode } from './modes/real-time.js';
38
+ import { BalancedMode } from './modes/balanced.js';
39
+ import { ResearchMode } from './modes/research.js';
40
+ import { EdgeMode } from './modes/edge.js';
41
+ import { BatchMode } from './modes/batch.js';
42
+ import type { ModeImplementation } from './modes/index.js';
43
+
44
+ /**
45
+ * Default mode configurations
46
+ */
47
+ const MODE_CONFIGS: Record<SONAMode, SONAModeConfig> = {
48
+ 'real-time': {
49
+ mode: 'real-time',
50
+ loraRank: 2,
51
+ learningRate: 0.001,
52
+ batchSize: 32,
53
+ trajectoryCapacity: 1000,
54
+ patternClusters: 25,
55
+ qualityThreshold: 0.7,
56
+ maxLatencyMs: 0.5,
57
+ memoryBudgetMb: 25,
58
+ ewcLambda: 2000,
59
+ },
60
+ 'balanced': {
61
+ mode: 'balanced',
62
+ loraRank: 4,
63
+ learningRate: 0.002,
64
+ batchSize: 32,
65
+ trajectoryCapacity: 3000,
66
+ patternClusters: 50,
67
+ qualityThreshold: 0.5,
68
+ maxLatencyMs: 18,
69
+ memoryBudgetMb: 50,
70
+ ewcLambda: 2000,
71
+ },
72
+ 'research': {
73
+ mode: 'research',
74
+ loraRank: 16,
75
+ learningRate: 0.002,
76
+ batchSize: 64,
77
+ trajectoryCapacity: 10000,
78
+ patternClusters: 100,
79
+ qualityThreshold: 0.2,
80
+ maxLatencyMs: 100,
81
+ memoryBudgetMb: 100,
82
+ ewcLambda: 2500,
83
+ },
84
+ 'edge': {
85
+ mode: 'edge',
86
+ loraRank: 1,
87
+ learningRate: 0.001,
88
+ batchSize: 16,
89
+ trajectoryCapacity: 200,
90
+ patternClusters: 15,
91
+ qualityThreshold: 0.8,
92
+ maxLatencyMs: 1,
93
+ memoryBudgetMb: 5,
94
+ ewcLambda: 1500,
95
+ },
96
+ 'batch': {
97
+ mode: 'batch',
98
+ loraRank: 8,
99
+ learningRate: 0.002,
100
+ batchSize: 128,
101
+ trajectoryCapacity: 5000,
102
+ patternClusters: 75,
103
+ qualityThreshold: 0.4,
104
+ maxLatencyMs: 50,
105
+ memoryBudgetMb: 75,
106
+ ewcLambda: 2000,
107
+ },
108
+ };
109
+
110
+ /**
111
+ * Mode-specific optimizations
112
+ */
113
+ const MODE_OPTIMIZATIONS: Record<SONAMode, ModeOptimizations> = {
114
+ 'real-time': {
115
+ enableSIMD: true,
116
+ useMicroLoRA: true,
117
+ gradientCheckpointing: false,
118
+ useHalfPrecision: true,
119
+ patternCaching: true,
120
+ asyncUpdates: true,
121
+ },
122
+ 'balanced': {
123
+ enableSIMD: true,
124
+ useMicroLoRA: false,
125
+ gradientCheckpointing: false,
126
+ useHalfPrecision: false,
127
+ patternCaching: true,
128
+ asyncUpdates: false,
129
+ },
130
+ 'research': {
131
+ enableSIMD: true,
132
+ useMicroLoRA: false,
133
+ gradientCheckpointing: true,
134
+ useHalfPrecision: false,
135
+ patternCaching: true,
136
+ asyncUpdates: false,
137
+ },
138
+ 'edge': {
139
+ enableSIMD: false,
140
+ useMicroLoRA: true,
141
+ gradientCheckpointing: false,
142
+ useHalfPrecision: true,
143
+ patternCaching: false,
144
+ asyncUpdates: true,
145
+ },
146
+ 'batch': {
147
+ enableSIMD: true,
148
+ useMicroLoRA: false,
149
+ gradientCheckpointing: true,
150
+ useHalfPrecision: true,
151
+ patternCaching: true,
152
+ asyncUpdates: true,
153
+ },
154
+ };
155
+
156
+ /**
157
+ * SONA Manager - Main orchestrator for neural learning
158
+ */
159
+ export class SONAManager {
160
+ private currentMode: SONAMode;
161
+ private config: SONAModeConfig;
162
+ private optimizations: ModeOptimizations;
163
+ private modeImpl: ModeImplementation;
164
+
165
+ private trajectories: Map<string, Trajectory> = new Map();
166
+ private patterns: Map<string, Pattern> = new Map();
167
+ private loraWeights: Map<string, LoRAWeights> = new Map();
168
+ private ewcState: EWCState | null = null;
169
+
170
+ private eventListeners: Set<NeuralEventListener> = new Set();
171
+ private stats: NeuralStats;
172
+ private isInitialized = false;
173
+
174
+ // Performance tracking
175
+ private operationCount = 0;
176
+ private totalLatencyMs = 0;
177
+ private learningCycles = 0;
178
+ private lastStatsUpdate = Date.now();
179
+
180
+ constructor(mode: SONAMode = 'balanced') {
181
+ this.currentMode = mode;
182
+ this.config = { ...MODE_CONFIGS[mode] };
183
+ this.optimizations = { ...MODE_OPTIMIZATIONS[mode] };
184
+ this.modeImpl = this.createModeImplementation(mode);
185
+ this.stats = this.createInitialStats();
186
+ }
187
+
188
+ /**
189
+ * Initialize the SONA manager
190
+ */
191
+ async initialize(): Promise<void> {
192
+ if (this.isInitialized) return;
193
+
194
+ // Initialize mode implementation
195
+ await this.modeImpl.initialize();
196
+
197
+ // Initialize EWC state for continual learning
198
+ this.ewcState = {
199
+ means: new Map(),
200
+ fisher: new Map(),
201
+ taskCount: 0,
202
+ lastConsolidation: Date.now(),
203
+ };
204
+
205
+ this.isInitialized = true;
206
+ }
207
+
208
+ /**
209
+ * Change the current learning mode
210
+ */
211
+ async setMode(mode: SONAMode): Promise<void> {
212
+ if (mode === this.currentMode) return;
213
+
214
+ const previousMode = this.currentMode;
215
+
216
+ // Cleanup current mode
217
+ await this.modeImpl.cleanup();
218
+
219
+ // Update configuration
220
+ this.currentMode = mode;
221
+ this.config = { ...MODE_CONFIGS[mode] };
222
+ this.optimizations = { ...MODE_OPTIMIZATIONS[mode] };
223
+
224
+ // Create new mode implementation
225
+ this.modeImpl = this.createModeImplementation(mode);
226
+ await this.modeImpl.initialize();
227
+
228
+ // Emit mode change event
229
+ this.emitEvent({
230
+ type: 'mode_changed',
231
+ fromMode: previousMode,
232
+ toMode: mode,
233
+ });
234
+ }
235
+
236
+ /**
237
+ * Get current mode and configuration
238
+ */
239
+ getConfig(): { mode: SONAMode; config: SONAModeConfig; optimizations: ModeOptimizations } {
240
+ return {
241
+ mode: this.currentMode,
242
+ config: { ...this.config },
243
+ optimizations: { ...this.optimizations },
244
+ };
245
+ }
246
+
247
+ // ==========================================================================
248
+ // Trajectory Management
249
+ // ==========================================================================
250
+
251
+ /**
252
+ * Begin a new trajectory for a task
253
+ */
254
+ beginTrajectory(context: string, domain: Trajectory['domain'] = 'general'): string {
255
+ const startTime = performance.now();
256
+
257
+ const trajectoryId = `traj_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
258
+
259
+ const trajectory: Trajectory = {
260
+ trajectoryId,
261
+ context,
262
+ domain,
263
+ steps: [],
264
+ qualityScore: 0,
265
+ isComplete: false,
266
+ startTime: Date.now(),
267
+ };
268
+
269
+ this.trajectories.set(trajectoryId, trajectory);
270
+
271
+ this.emitEvent({
272
+ type: 'trajectory_started',
273
+ trajectoryId,
274
+ context,
275
+ });
276
+
277
+ this.trackLatency(performance.now() - startTime);
278
+ return trajectoryId;
279
+ }
280
+
281
+ /**
282
+ * Record a step in a trajectory
283
+ */
284
+ recordStep(
285
+ trajectoryId: string,
286
+ action: string,
287
+ reward: number,
288
+ stateEmbedding: Float32Array,
289
+ metadata?: Record<string, unknown>
290
+ ): void {
291
+ const startTime = performance.now();
292
+
293
+ const trajectory = this.trajectories.get(trajectoryId);
294
+ if (!trajectory || trajectory.isComplete) return;
295
+
296
+ const step: TrajectoryStep = {
297
+ stepId: `step_${trajectory.steps.length}`,
298
+ timestamp: Date.now(),
299
+ action,
300
+ stateBefore: trajectory.steps.length > 0
301
+ ? trajectory.steps[trajectory.steps.length - 1].stateAfter
302
+ : stateEmbedding,
303
+ stateAfter: stateEmbedding,
304
+ reward,
305
+ metadata,
306
+ };
307
+
308
+ trajectory.steps.push(step);
309
+
310
+ // Update running quality score
311
+ trajectory.qualityScore = this.calculateQualityScore(trajectory);
312
+
313
+ this.trackLatency(performance.now() - startTime);
314
+ }
315
+
316
+ /**
317
+ * Complete a trajectory
318
+ */
319
+ completeTrajectory(trajectoryId: string, finalQuality?: number): Trajectory | null {
320
+ const startTime = performance.now();
321
+
322
+ const trajectory = this.trajectories.get(trajectoryId);
323
+ if (!trajectory || trajectory.isComplete) return null;
324
+
325
+ trajectory.isComplete = true;
326
+ trajectory.endTime = Date.now();
327
+
328
+ if (finalQuality !== undefined) {
329
+ trajectory.qualityScore = finalQuality;
330
+ } else {
331
+ trajectory.qualityScore = this.calculateQualityScore(trajectory);
332
+ }
333
+
334
+ this.emitEvent({
335
+ type: 'trajectory_completed',
336
+ trajectoryId,
337
+ qualityScore: trajectory.qualityScore,
338
+ });
339
+
340
+ // Check if we should trigger learning
341
+ this.checkLearningTrigger();
342
+
343
+ this.trackLatency(performance.now() - startTime);
344
+ return trajectory;
345
+ }
346
+
347
+ /**
348
+ * Get a trajectory by ID
349
+ */
350
+ getTrajectory(trajectoryId: string): Trajectory | undefined {
351
+ return this.trajectories.get(trajectoryId);
352
+ }
353
+
354
+ // ==========================================================================
355
+ // Pattern Matching
356
+ // ==========================================================================
357
+
358
+ /**
359
+ * Find similar patterns for a given context (k=3 optimal)
360
+ */
361
+ async findSimilarPatterns(
362
+ embedding: Float32Array,
363
+ k: number = 3
364
+ ): Promise<PatternMatch[]> {
365
+ const startTime = performance.now();
366
+
367
+ const matches = await this.modeImpl.findPatterns(embedding, k, Array.from(this.patterns.values()));
368
+
369
+ // Track pattern match events
370
+ for (const match of matches) {
371
+ this.emitEvent({
372
+ type: 'pattern_matched',
373
+ patternId: match.pattern.patternId,
374
+ similarity: match.similarity,
375
+ });
376
+ }
377
+
378
+ const latency = performance.now() - startTime;
379
+
380
+ // Add latency to matches
381
+ return matches.map(m => ({ ...m, latencyMs: latency }));
382
+ }
383
+
384
+ /**
385
+ * Store a new pattern
386
+ */
387
+ storePattern(pattern: Omit<Pattern, 'patternId' | 'createdAt' | 'updatedAt'>): Pattern {
388
+ const startTime = performance.now();
389
+
390
+ const fullPattern: Pattern = {
391
+ ...pattern,
392
+ patternId: `pat_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`,
393
+ createdAt: Date.now(),
394
+ updatedAt: Date.now(),
395
+ };
396
+
397
+ this.patterns.set(fullPattern.patternId, fullPattern);
398
+
399
+ this.trackLatency(performance.now() - startTime);
400
+ return fullPattern;
401
+ }
402
+
403
+ /**
404
+ * Update pattern based on usage
405
+ */
406
+ updatePatternUsage(patternId: string, quality: number): void {
407
+ const pattern = this.patterns.get(patternId);
408
+ if (!pattern) return;
409
+
410
+ pattern.usageCount++;
411
+ pattern.qualityHistory.push(quality);
412
+
413
+ // Keep only last 100 quality scores
414
+ if (pattern.qualityHistory.length > 100) {
415
+ pattern.qualityHistory = pattern.qualityHistory.slice(-100);
416
+ }
417
+
418
+ // Update success rate
419
+ pattern.successRate = pattern.qualityHistory.reduce((a, b) => a + b, 0) / pattern.qualityHistory.length;
420
+ pattern.updatedAt = Date.now();
421
+ }
422
+
423
+ // ==========================================================================
424
+ // Learning
425
+ // ==========================================================================
426
+
427
+ /**
428
+ * Trigger a learning cycle
429
+ */
430
+ async triggerLearning(reason: string = 'manual'): Promise<void> {
431
+ const startTime = performance.now();
432
+
433
+ const completedTrajectories = Array.from(this.trajectories.values())
434
+ .filter(t => t.isComplete && t.qualityScore >= this.config.qualityThreshold);
435
+
436
+ if (completedTrajectories.length === 0) return;
437
+
438
+ this.emitEvent({
439
+ type: 'learning_triggered',
440
+ reason,
441
+ trajectoryCount: completedTrajectories.length,
442
+ });
443
+
444
+ // Perform learning via mode implementation
445
+ const improvementDelta = await this.modeImpl.learn(
446
+ completedTrajectories,
447
+ this.config,
448
+ this.ewcState!
449
+ );
450
+
451
+ this.learningCycles++;
452
+
453
+ this.emitEvent({
454
+ type: 'learning_completed',
455
+ improvementDelta,
456
+ });
457
+
458
+ // Prune old trajectories if over capacity
459
+ this.pruneTrajectories();
460
+
461
+ this.trackLatency(performance.now() - startTime);
462
+ }
463
+
464
+ /**
465
+ * Apply learned adaptations to processing
466
+ */
467
+ async applyAdaptations(
468
+ input: Float32Array,
469
+ domain?: string
470
+ ): Promise<Float32Array> {
471
+ const startTime = performance.now();
472
+
473
+ // Get relevant LoRA weights
474
+ const weights = domain
475
+ ? this.loraWeights.get(domain)
476
+ : this.loraWeights.get('default');
477
+
478
+ // Apply adaptations via mode implementation
479
+ const output = await this.modeImpl.applyLoRA(input, weights);
480
+
481
+ const latency = performance.now() - startTime;
482
+
483
+ // Verify performance target
484
+ if (latency > 0.05 && this.currentMode !== 'research' && this.currentMode !== 'batch') {
485
+ console.warn(`SONA adaptation exceeded target: ${latency.toFixed(3)}ms > 0.05ms`);
486
+ }
487
+
488
+ return output;
489
+ }
490
+
491
+ // ==========================================================================
492
+ // LoRA Management
493
+ // ==========================================================================
494
+
495
+ /**
496
+ * Get LoRA configuration for current mode
497
+ */
498
+ getLoRAConfig(): LoRAConfig {
499
+ return {
500
+ rank: this.config.loraRank,
501
+ alpha: this.config.loraRank * 2,
502
+ dropout: 0.05,
503
+ targetModules: ['q_proj', 'v_proj', 'k_proj', 'o_proj'],
504
+ microLoRA: this.optimizations.useMicroLoRA,
505
+ };
506
+ }
507
+
508
+ /**
509
+ * Initialize LoRA weights for a domain
510
+ */
511
+ initializeLoRAWeights(domain: string = 'default'): LoRAWeights {
512
+ const config = this.getLoRAConfig();
513
+
514
+ const weights: LoRAWeights = {
515
+ adapterId: `lora_${domain}_${Date.now()}`,
516
+ A: new Map(),
517
+ B: new Map(),
518
+ createdAt: Date.now(),
519
+ updatedAt: Date.now(),
520
+ iterations: 0,
521
+ domain,
522
+ };
523
+
524
+ // Initialize A and B matrices for each target module
525
+ for (const module of config.targetModules) {
526
+ // A: (hidden_dim, rank) initialized with small random values
527
+ // B: (rank, hidden_dim) initialized to zero
528
+ const hiddenDim = 768; // Typical transformer hidden dim
529
+ const A = new Float32Array(hiddenDim * config.rank);
530
+ const B = new Float32Array(config.rank * hiddenDim);
531
+
532
+ // Initialize A with small random values
533
+ for (let i = 0; i < A.length; i++) {
534
+ A[i] = (Math.random() - 0.5) * 0.02;
535
+ }
536
+
537
+ weights.A.set(module, A);
538
+ weights.B.set(module, B);
539
+ }
540
+
541
+ this.loraWeights.set(domain, weights);
542
+ return weights;
543
+ }
544
+
545
+ // ==========================================================================
546
+ // EWC (Elastic Weight Consolidation)
547
+ // ==========================================================================
548
+
549
+ /**
550
+ * Get EWC configuration
551
+ */
552
+ getEWCConfig(): EWCConfig {
553
+ return {
554
+ lambda: this.config.ewcLambda,
555
+ decay: 0.9,
556
+ fisherSamples: 100,
557
+ minFisher: 1e-8,
558
+ online: true,
559
+ };
560
+ }
561
+
562
+ /**
563
+ * Consolidate EWC after learning a new task
564
+ */
565
+ consolidateEWC(): void {
566
+ if (!this.ewcState) return;
567
+
568
+ const config = this.getEWCConfig();
569
+
570
+ // Update Fisher information with decay
571
+ for (const [key, fisher] of this.ewcState.fisher) {
572
+ for (let i = 0; i < fisher.length; i++) {
573
+ fisher[i] *= config.decay;
574
+ }
575
+ }
576
+
577
+ this.ewcState.taskCount++;
578
+ this.ewcState.lastConsolidation = Date.now();
579
+ }
580
+
581
+ // ==========================================================================
582
+ // Statistics
583
+ // ==========================================================================
584
+
585
+ /**
586
+ * Get current neural system statistics
587
+ */
588
+ getStats(): NeuralStats {
589
+ this.updateStats();
590
+ return { ...this.stats };
591
+ }
592
+
593
+ // ==========================================================================
594
+ // Event System
595
+ // ==========================================================================
596
+
597
+ /**
598
+ * Add an event listener
599
+ */
600
+ addEventListener(listener: NeuralEventListener): void {
601
+ this.eventListeners.add(listener);
602
+ }
603
+
604
+ /**
605
+ * Remove an event listener
606
+ */
607
+ removeEventListener(listener: NeuralEventListener): void {
608
+ this.eventListeners.delete(listener);
609
+ }
610
+
611
+ // ==========================================================================
612
+ // Cleanup
613
+ // ==========================================================================
614
+
615
+ /**
616
+ * Cleanup resources
617
+ */
618
+ async cleanup(): Promise<void> {
619
+ await this.modeImpl.cleanup();
620
+ this.trajectories.clear();
621
+ this.patterns.clear();
622
+ this.loraWeights.clear();
623
+ this.eventListeners.clear();
624
+ this.isInitialized = false;
625
+ }
626
+
627
+ // ==========================================================================
628
+ // Private Methods
629
+ // ==========================================================================
630
+
631
+ private createModeImplementation(mode: SONAMode): ModeImplementation {
632
+ switch (mode) {
633
+ case 'real-time':
634
+ return new RealTimeMode(MODE_CONFIGS[mode], MODE_OPTIMIZATIONS[mode]);
635
+ case 'balanced':
636
+ return new BalancedMode(MODE_CONFIGS[mode], MODE_OPTIMIZATIONS[mode]);
637
+ case 'research':
638
+ return new ResearchMode(MODE_CONFIGS[mode], MODE_OPTIMIZATIONS[mode]);
639
+ case 'edge':
640
+ return new EdgeMode(MODE_CONFIGS[mode], MODE_OPTIMIZATIONS[mode]);
641
+ case 'batch':
642
+ return new BatchMode(MODE_CONFIGS[mode], MODE_OPTIMIZATIONS[mode]);
643
+ default:
644
+ return new BalancedMode(MODE_CONFIGS['balanced'], MODE_OPTIMIZATIONS['balanced']);
645
+ }
646
+ }
647
+
648
+ private calculateQualityScore(trajectory: Trajectory): number {
649
+ if (trajectory.steps.length === 0) return 0;
650
+
651
+ // Average reward across steps
652
+ const avgReward = trajectory.steps.reduce((sum, step) => sum + step.reward, 0) / trajectory.steps.length;
653
+
654
+ // Discount factor for trajectory length (longer trajectories may accumulate errors)
655
+ const lengthFactor = Math.min(1, 10 / trajectory.steps.length);
656
+
657
+ return avgReward * 0.8 + lengthFactor * 0.2;
658
+ }
659
+
660
+ private checkLearningTrigger(): void {
661
+ const completedCount = Array.from(this.trajectories.values())
662
+ .filter(t => t.isComplete).length;
663
+
664
+ const utilization = completedCount / this.config.trajectoryCapacity;
665
+
666
+ // Trigger learning at 80% utilization
667
+ if (utilization >= 0.8) {
668
+ this.triggerLearning('capacity_threshold');
669
+ }
670
+ }
671
+
672
+ private pruneTrajectories(): void {
673
+ const completed = Array.from(this.trajectories.entries())
674
+ .filter(([_, t]) => t.isComplete)
675
+ .sort((a, b) => a[1].qualityScore - b[1].qualityScore);
676
+
677
+ // Remove lowest quality trajectories if over capacity
678
+ const toRemove = completed.length - Math.floor(this.config.trajectoryCapacity * 0.5);
679
+
680
+ if (toRemove > 0) {
681
+ for (let i = 0; i < toRemove && i < completed.length; i++) {
682
+ this.trajectories.delete(completed[i][0]);
683
+ }
684
+ }
685
+ }
686
+
687
+ private trackLatency(latencyMs: number): void {
688
+ this.operationCount++;
689
+ this.totalLatencyMs += latencyMs;
690
+ }
691
+
692
+ private emitEvent(event: NeuralEvent): void {
693
+ for (const listener of this.eventListeners) {
694
+ try {
695
+ listener(event);
696
+ } catch (error) {
697
+ console.error('Error in neural event listener:', error);
698
+ }
699
+ }
700
+ }
701
+
702
+ private createInitialStats(): NeuralStats {
703
+ return {
704
+ trajectories: {
705
+ total: 0,
706
+ active: 0,
707
+ completed: 0,
708
+ utilization: 0,
709
+ },
710
+ performance: {
711
+ avgQualityScore: 0,
712
+ opsPerSecond: 0,
713
+ learningCycles: 0,
714
+ avgLatencyMs: 0,
715
+ },
716
+ patterns: {
717
+ totalPatterns: 0,
718
+ avgMatchTime: 0,
719
+ cacheHitRate: 0,
720
+ evolutionCount: 0,
721
+ },
722
+ memory: {
723
+ usedMb: 0,
724
+ budgetMb: this.config.memoryBudgetMb,
725
+ trajectoryBytes: 0,
726
+ patternBytes: 0,
727
+ },
728
+ config: {
729
+ mode: this.currentMode,
730
+ loraRank: this.config.loraRank,
731
+ learningRate: this.config.learningRate,
732
+ algorithm: 'ppo',
733
+ },
734
+ };
735
+ }
736
+
737
+ private updateStats(): void {
738
+ const now = Date.now();
739
+ const elapsed = (now - this.lastStatsUpdate) / 1000;
740
+
741
+ const trajectoryArray = Array.from(this.trajectories.values());
742
+ const completed = trajectoryArray.filter(t => t.isComplete);
743
+
744
+ this.stats = {
745
+ trajectories: {
746
+ total: trajectoryArray.length,
747
+ active: trajectoryArray.filter(t => !t.isComplete).length,
748
+ completed: completed.length,
749
+ utilization: trajectoryArray.length / this.config.trajectoryCapacity,
750
+ },
751
+ performance: {
752
+ avgQualityScore: completed.length > 0
753
+ ? completed.reduce((sum, t) => sum + t.qualityScore, 0) / completed.length
754
+ : 0,
755
+ opsPerSecond: elapsed > 0 ? this.operationCount / elapsed : 0,
756
+ learningCycles: this.learningCycles,
757
+ avgLatencyMs: this.operationCount > 0
758
+ ? this.totalLatencyMs / this.operationCount
759
+ : 0,
760
+ },
761
+ patterns: {
762
+ totalPatterns: this.patterns.size,
763
+ avgMatchTime: 0, // Updated by mode implementation
764
+ cacheHitRate: 0, // Updated by mode implementation
765
+ evolutionCount: Array.from(this.patterns.values())
766
+ .reduce((sum, p) => sum + p.evolutionHistory.length, 0),
767
+ },
768
+ memory: {
769
+ usedMb: this.estimateMemoryUsage(),
770
+ budgetMb: this.config.memoryBudgetMb,
771
+ trajectoryBytes: this.estimateTrajectoryBytes(),
772
+ patternBytes: this.estimatePatternBytes(),
773
+ },
774
+ config: {
775
+ mode: this.currentMode,
776
+ loraRank: this.config.loraRank,
777
+ learningRate: this.config.learningRate,
778
+ algorithm: 'ppo',
779
+ },
780
+ };
781
+
782
+ this.lastStatsUpdate = now;
783
+ this.operationCount = 0;
784
+ this.totalLatencyMs = 0;
785
+ }
786
+
787
+ private estimateMemoryUsage(): number {
788
+ // Rough estimation in MB
789
+ return (this.estimateTrajectoryBytes() + this.estimatePatternBytes()) / (1024 * 1024);
790
+ }
791
+
792
+ private estimateTrajectoryBytes(): number {
793
+ let bytes = 0;
794
+ for (const trajectory of this.trajectories.values()) {
795
+ bytes += 200; // Base trajectory overhead
796
+ bytes += trajectory.context.length * 2;
797
+ bytes += trajectory.steps.length * (64 + 4 * 768 * 4); // Step overhead + embeddings
798
+ }
799
+ return bytes;
800
+ }
801
+
802
+ private estimatePatternBytes(): number {
803
+ let bytes = 0;
804
+ for (const pattern of this.patterns.values()) {
805
+ bytes += 100; // Base pattern overhead
806
+ bytes += pattern.name.length * 2;
807
+ bytes += pattern.strategy.length * 2;
808
+ bytes += pattern.embedding.byteLength;
809
+ bytes += pattern.qualityHistory.length * 8;
810
+ bytes += pattern.evolutionHistory.length * 100;
811
+ }
812
+ return bytes;
813
+ }
814
+ }
815
+
816
+ /**
817
+ * Factory function for creating SONA manager
818
+ */
819
+ export function createSONAManager(mode: SONAMode = 'balanced'): SONAManager {
820
+ return new SONAManager(mode);
821
+ }
822
+
823
+ /**
824
+ * Get default configuration for a mode
825
+ */
826
+ export function getModeConfig(mode: SONAMode): SONAModeConfig {
827
+ return { ...MODE_CONFIGS[mode] };
828
+ }
829
+
830
+ /**
831
+ * Get optimizations for a mode
832
+ */
833
+ export function getModeOptimizations(mode: SONAMode): ModeOptimizations {
834
+ return { ...MODE_OPTIMIZATIONS[mode] };
835
+ }