@nahisaho/musubix-neural-search 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/EnhancedNeuralSearchManager.d.ts +215 -0
  2. package/dist/EnhancedNeuralSearchManager.d.ts.map +1 -0
  3. package/dist/EnhancedNeuralSearchManager.js +307 -0
  4. package/dist/EnhancedNeuralSearchManager.js.map +1 -0
  5. package/dist/cache/EmbeddingCache.d.ts +93 -0
  6. package/dist/cache/EmbeddingCache.d.ts.map +1 -0
  7. package/dist/cache/EmbeddingCache.js +208 -0
  8. package/dist/cache/EmbeddingCache.js.map +1 -0
  9. package/dist/cache/index.d.ts +7 -0
  10. package/dist/cache/index.d.ts.map +1 -0
  11. package/dist/cache/index.js +6 -0
  12. package/dist/cache/index.js.map +1 -0
  13. package/dist/fusion/ModalFusion.d.ts +111 -0
  14. package/dist/fusion/ModalFusion.d.ts.map +1 -0
  15. package/dist/fusion/ModalFusion.js +127 -0
  16. package/dist/fusion/ModalFusion.js.map +1 -0
  17. package/dist/fusion/index.d.ts +6 -0
  18. package/dist/fusion/index.d.ts.map +1 -0
  19. package/dist/fusion/index.js +6 -0
  20. package/dist/fusion/index.js.map +1 -0
  21. package/dist/index.d.ts +14 -4
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +12 -2
  24. package/dist/index.js.map +1 -1
  25. package/dist/learning/OnlineModelUpdater.d.ts +195 -0
  26. package/dist/learning/OnlineModelUpdater.d.ts.map +1 -0
  27. package/dist/learning/OnlineModelUpdater.js +231 -0
  28. package/dist/learning/OnlineModelUpdater.js.map +1 -0
  29. package/dist/learning/__tests__/OnlineModelUpdater.test.d.ts +9 -0
  30. package/dist/learning/__tests__/OnlineModelUpdater.test.d.ts.map +1 -0
  31. package/dist/learning/__tests__/OnlineModelUpdater.test.js +174 -0
  32. package/dist/learning/__tests__/OnlineModelUpdater.test.js.map +1 -0
  33. package/dist/learning/index.d.ts +2 -0
  34. package/dist/learning/index.d.ts.map +1 -1
  35. package/dist/learning/index.js +2 -0
  36. package/dist/learning/index.js.map +1 -1
  37. package/dist/logging/TrajectoryLogger.d.ts +115 -0
  38. package/dist/logging/TrajectoryLogger.d.ts.map +1 -0
  39. package/dist/logging/TrajectoryLogger.js +128 -0
  40. package/dist/logging/TrajectoryLogger.js.map +1 -0
  41. package/dist/logging/index.d.ts +9 -0
  42. package/dist/logging/index.d.ts.map +1 -0
  43. package/dist/logging/index.js +8 -0
  44. package/dist/logging/index.js.map +1 -0
  45. package/dist/pruning/LearnedPruningPolicy.d.ts +129 -0
  46. package/dist/pruning/LearnedPruningPolicy.d.ts.map +1 -0
  47. package/dist/pruning/LearnedPruningPolicy.js +332 -0
  48. package/dist/pruning/LearnedPruningPolicy.js.map +1 -0
  49. package/dist/pruning/index.d.ts +6 -0
  50. package/dist/pruning/index.d.ts.map +1 -0
  51. package/dist/pruning/index.js +6 -0
  52. package/dist/pruning/index.js.map +1 -0
  53. package/dist/scorer/ContextAwareScorer.d.ts +126 -0
  54. package/dist/scorer/ContextAwareScorer.d.ts.map +1 -0
  55. package/dist/scorer/ContextAwareScorer.js +281 -0
  56. package/dist/scorer/ContextAwareScorer.js.map +1 -0
  57. package/dist/scorer/index.d.ts +2 -0
  58. package/dist/scorer/index.d.ts.map +1 -1
  59. package/dist/scorer/index.js +2 -0
  60. package/dist/scorer/index.js.map +1 -1
  61. package/dist/search/AdaptiveBeamSearch.d.ts +98 -0
  62. package/dist/search/AdaptiveBeamSearch.d.ts.map +1 -0
  63. package/dist/search/AdaptiveBeamSearch.js +240 -0
  64. package/dist/search/AdaptiveBeamSearch.js.map +1 -0
  65. package/dist/search/index.d.ts +2 -0
  66. package/dist/search/index.d.ts.map +1 -1
  67. package/dist/search/index.js +2 -0
  68. package/dist/search/index.js.map +1 -1
  69. package/package.json +1 -1
@@ -0,0 +1,281 @@
1
+ /**
2
+ * ContextAwareScorer - Project Context-Aware Branch Scoring
3
+ * @module @nahisaho/musubix-neural-search
4
+ * @see TSK-NS-103
5
+ * @see DES-NS-103
6
+ * @see REQ-NS-103
7
+ *
8
+ * プロジェクトコンテキストを30%以上の重みで反映するスコアラー
9
+ * - プロジェクトパターンの検出
10
+ * - コードベース埋め込みとの類似度
11
+ * - 詳細なスコア内訳の提供
12
+ */
13
+ import { BranchScorer } from './BranchScorer.js';
14
+ // =============================================================================
15
+ // Implementation
16
+ // =============================================================================
17
+ /**
18
+ * Default ContextAwareScorer implementation
19
+ */
20
+ export class DefaultContextAwareScorer {
21
+ config;
22
+ baseScorer;
23
+ projectContext = null;
24
+ feedbackHistory = new Map();
25
+ // Statistics
26
+ totalScored = 0;
27
+ scoreSum = 0;
28
+ confidenceSum = 0;
29
+ contextContributionSum = 0;
30
+ // Cache for breakdowns
31
+ breakdownCache = new WeakMap();
32
+ constructor(config = {}) {
33
+ // Ensure context weight is at least 30%
34
+ const contextWeight = Math.max(config.contextWeight ?? 0.3, 0.3);
35
+ this.config = {
36
+ contextWeight,
37
+ enableProjectContext: config.enableProjectContext ?? true,
38
+ baseWeights: config.baseWeights ?? {},
39
+ patternMatchBonus: config.patternMatchBonus ?? 0.1,
40
+ };
41
+ this.baseScorer = new BranchScorer(undefined, this.config.baseWeights);
42
+ }
43
+ // =========================================================================
44
+ // IBranchScorer Implementation
45
+ // =========================================================================
46
+ async score(branch, context) {
47
+ // Get base score
48
+ const baseResult = await this.baseScorer.score(branch, context);
49
+ const baseScore = baseResult.score;
50
+ // Compute context score
51
+ const contextScore = this.computeContextScore(branch, context);
52
+ // Combine scores
53
+ const effectiveContextWeight = this.config.enableProjectContext
54
+ ? this.config.contextWeight
55
+ : 0;
56
+ const finalScore = baseScore * (1 - effectiveContextWeight) +
57
+ contextScore * effectiveContextWeight;
58
+ // Update statistics
59
+ this.updateStatistics(finalScore, baseResult.confidence, contextScore * effectiveContextWeight);
60
+ // Create result
61
+ const result = {
62
+ branch,
63
+ score: finalScore,
64
+ confidence: baseResult.confidence,
65
+ components: baseResult.components,
66
+ _contextScore: contextScore,
67
+ _baseScore: baseScore,
68
+ };
69
+ // Cache breakdown
70
+ this.breakdownCache.set(result, {
71
+ baseScore,
72
+ contextScore,
73
+ contextWeight: effectiveContextWeight,
74
+ finalScore,
75
+ patternMatches: this.findPatternMatches(branch),
76
+ });
77
+ return result;
78
+ }
79
+ async scoreBatch(branches, context) {
80
+ return Promise.all(branches.map((branch) => this.score(branch, context)));
81
+ }
82
+ update(feedback) {
83
+ const history = this.feedbackHistory.get(feedback.branchId) ?? [];
84
+ history.push(feedback);
85
+ this.feedbackHistory.set(feedback.branchId, history);
86
+ // Also update base scorer
87
+ this.baseScorer.update(feedback);
88
+ }
89
+ // =========================================================================
90
+ // Project Context
91
+ // =========================================================================
92
+ setProjectContext(context) {
93
+ this.projectContext = context;
94
+ }
95
+ // =========================================================================
96
+ // Score Breakdown
97
+ // =========================================================================
98
+ getScoreBreakdown(score) {
99
+ // Check cache
100
+ const cached = this.breakdownCache.get(score);
101
+ if (cached) {
102
+ return cached;
103
+ }
104
+ // Reconstruct breakdown if not cached
105
+ const extendedScore = score;
106
+ const baseScore = extendedScore._baseScore ?? score.score;
107
+ const contextScore = extendedScore._contextScore ?? 0;
108
+ const contextWeight = this.config.enableProjectContext
109
+ ? this.config.contextWeight
110
+ : 0;
111
+ return {
112
+ baseScore,
113
+ contextScore,
114
+ contextWeight,
115
+ finalScore: score.score,
116
+ };
117
+ }
118
+ // =========================================================================
119
+ // Statistics
120
+ // =========================================================================
121
+ getStatistics() {
122
+ return {
123
+ totalScored: this.totalScored,
124
+ averageScore: this.totalScored > 0 ? this.scoreSum / this.totalScored : 0,
125
+ averageConfidence: this.totalScored > 0 ? this.confidenceSum / this.totalScored : 0,
126
+ averageContextContribution: this.totalScored > 0
127
+ ? this.contextContributionSum / this.totalScored
128
+ : 0,
129
+ };
130
+ }
131
+ resetStatistics() {
132
+ this.totalScored = 0;
133
+ this.scoreSum = 0;
134
+ this.confidenceSum = 0;
135
+ this.contextContributionSum = 0;
136
+ }
137
+ // =========================================================================
138
+ // Serialization
139
+ // =========================================================================
140
+ toJSON() {
141
+ return JSON.stringify({
142
+ config: {
143
+ contextWeight: this.config.contextWeight,
144
+ enableProjectContext: this.config.enableProjectContext,
145
+ patternMatchBonus: this.config.patternMatchBonus,
146
+ },
147
+ statistics: this.getStatistics(),
148
+ projectContext: this.projectContext
149
+ ? {
150
+ projectName: this.projectContext.projectName,
151
+ language: this.projectContext.language,
152
+ patterns: this.projectContext.patterns,
153
+ }
154
+ : null,
155
+ });
156
+ }
157
+ fromJSON(json) {
158
+ const data = JSON.parse(json);
159
+ if (data.config) {
160
+ if (data.config.contextWeight !== undefined) {
161
+ this.config.contextWeight = Math.max(data.config.contextWeight, 0.3);
162
+ }
163
+ if (data.config.enableProjectContext !== undefined) {
164
+ this.config.enableProjectContext = data.config.enableProjectContext;
165
+ }
166
+ if (data.config.patternMatchBonus !== undefined) {
167
+ this.config.patternMatchBonus = data.config.patternMatchBonus;
168
+ }
169
+ }
170
+ if (data.statistics) {
171
+ this.totalScored = data.statistics.totalScored ?? 0;
172
+ this.scoreSum =
173
+ (data.statistics.averageScore ?? 0) * this.totalScored;
174
+ this.confidenceSum =
175
+ (data.statistics.averageConfidence ?? 0) * this.totalScored;
176
+ this.contextContributionSum =
177
+ (data.statistics.averageContextContribution ?? 0) * this.totalScored;
178
+ }
179
+ }
180
+ // =========================================================================
181
+ // Private Methods
182
+ // =========================================================================
183
+ computeContextScore(branch, context) {
184
+ if (!this.config.enableProjectContext || !this.projectContext) {
185
+ return 0.5; // Neutral score when no context
186
+ }
187
+ let score = 0.5; // Base
188
+ // Pattern matching bonus
189
+ const patternMatches = this.findPatternMatches(branch);
190
+ if (patternMatches.length > 0) {
191
+ score += this.config.patternMatchBonus * patternMatches.length;
192
+ }
193
+ // Codebase embedding similarity
194
+ if (this.projectContext.codebaseEmbedding) {
195
+ const similarity = this.cosineSimilarity(branch.features.codeEmbedding, this.projectContext.codebaseEmbedding);
196
+ score += similarity * 0.2;
197
+ }
198
+ // Language alignment
199
+ if (this.isLanguageAligned(branch, context)) {
200
+ score += 0.1;
201
+ }
202
+ // Domain keyword matching
203
+ if (this.projectContext.domainKeywords) {
204
+ const keywordScore = this.computeKeywordScore(branch, context);
205
+ score += keywordScore * 0.1;
206
+ }
207
+ // Clamp to [0, 1]
208
+ return Math.max(0, Math.min(1, score));
209
+ }
210
+ findPatternMatches(branch) {
211
+ if (!this.projectContext) {
212
+ return [];
213
+ }
214
+ const matches = [];
215
+ const action = branch.action.toLowerCase();
216
+ for (const pattern of this.projectContext.patterns) {
217
+ if (action.includes(pattern.toLowerCase()) ||
218
+ pattern.toLowerCase().includes(action)) {
219
+ matches.push(pattern);
220
+ }
221
+ }
222
+ return matches;
223
+ }
224
+ cosineSimilarity(a, b) {
225
+ if (a.length !== b.length || a.length === 0) {
226
+ return 0;
227
+ }
228
+ let dotProduct = 0;
229
+ let normA = 0;
230
+ let normB = 0;
231
+ for (let i = 0; i < a.length; i++) {
232
+ dotProduct += a[i] * b[i];
233
+ normA += a[i] * a[i];
234
+ normB += b[i] * b[i];
235
+ }
236
+ const denominator = Math.sqrt(normA) * Math.sqrt(normB);
237
+ if (denominator === 0) {
238
+ return 0;
239
+ }
240
+ return dotProduct / denominator;
241
+ }
242
+ isLanguageAligned(_branch, _context) {
243
+ if (!this.projectContext) {
244
+ return false;
245
+ }
246
+ // Simple heuristic: assume TypeScript/JavaScript projects
247
+ const lang = this.projectContext.language.toLowerCase();
248
+ return lang === 'typescript' || lang === 'javascript';
249
+ }
250
+ computeKeywordScore(branch, _context) {
251
+ if (!this.projectContext?.domainKeywords) {
252
+ return 0;
253
+ }
254
+ const code = branch.to.code.toLowerCase();
255
+ let matches = 0;
256
+ for (const keyword of this.projectContext.domainKeywords) {
257
+ if (code.includes(keyword.toLowerCase())) {
258
+ matches++;
259
+ }
260
+ }
261
+ return Math.min(1, matches / Math.max(1, this.projectContext.domainKeywords.length));
262
+ }
263
+ updateStatistics(score, confidence, contextContribution) {
264
+ this.totalScored++;
265
+ this.scoreSum += score;
266
+ this.confidenceSum += confidence;
267
+ this.contextContributionSum += contextContribution;
268
+ }
269
+ }
270
+ // =============================================================================
271
+ // Factory Function
272
+ // =============================================================================
273
+ /**
274
+ * Create a ContextAwareScorer instance
275
+ * @param config - Optional configuration
276
+ * @returns ContextAwareScorer instance
277
+ */
278
+ export function createContextAwareScorer(config = {}) {
279
+ return new DefaultContextAwareScorer(config);
280
+ }
281
+ //# sourceMappingURL=ContextAwareScorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextAwareScorer.js","sourceRoot":"","sources":["../../src/scorer/ContextAwareScorer.ts"],"names":[],"mappings":"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"}
@@ -6,4 +6,6 @@ export { EmbeddingModel } from './EmbeddingModel.js';
6
6
  export { BranchScorer } from './BranchScorer.js';
7
7
  export type { ScoreWeights } from './BranchScorer.js';
8
8
  export { ContextEncoder } from './ContextEncoder.js';
9
+ export { createContextAwareScorer, DefaultContextAwareScorer, } from './ContextAwareScorer.js';
10
+ export type { ContextAwareScorer, ContextAwareScorerConfig, ProjectContext, ScoreBreakdown, ScoringStatistics, } from './ContextAwareScorer.js';
9
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scorer/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scorer/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EACL,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,kBAAkB,EAClB,wBAAwB,EACxB,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,yBAAyB,CAAC"}
@@ -5,4 +5,6 @@
5
5
  export { EmbeddingModel } from './EmbeddingModel.js';
6
6
  export { BranchScorer } from './BranchScorer.js';
7
7
  export { ContextEncoder } from './ContextEncoder.js';
8
+ // v2.2.0 NEW!
9
+ export { createContextAwareScorer, DefaultContextAwareScorer, } from './ContextAwareScorer.js';
8
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scorer/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scorer/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,cAAc;AACd,OAAO,EACL,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * AdaptiveBeamSearch - Adaptive Beam Width Search
3
+ *
4
+ * Extends BeamSearch with dynamic beam width adjustment based on
5
+ * search progress. When stagnation is detected (no improvement for
6
+ * N iterations), beam width is increased up to a maximum.
7
+ *
8
+ * @module @nahisaho/musubix-neural-search
9
+ * @see TSK-NS-102
10
+ * @see DES-NS-102
11
+ * @see REQ-NS-102
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * import { AdaptiveBeamSearch } from './AdaptiveBeamSearch.js';
16
+ *
17
+ * const search = new AdaptiveBeamSearch({
18
+ * initialBeamWidth: 5,
19
+ * maxBeamWidth: 100,
20
+ * stagnationThreshold: 10,
21
+ * });
22
+ * const results = await search.search(initial, expand, scorer, context, config);
23
+ * ```
24
+ */
25
+ import type { Branch, IBranchScorer, IBeamSearch, SearchConfig, SearchContext, SearchResult, SearchState, SearchStatistics } from '../types.js';
26
+ /**
27
+ * Configuration for adaptive beam search
28
+ */
29
+ export interface AdaptiveBeamConfig {
30
+ /** Initial beam width (default: 5) */
31
+ initialBeamWidth: number;
32
+ /** Maximum beam width allowed (default: 100) */
33
+ maxBeamWidth: number;
34
+ /** Iterations without improvement before adaptation (default: 10) */
35
+ stagnationThreshold: number;
36
+ /** Fraction to increase beam width on stagnation (default: 0.5 = 50%) */
37
+ beamWidthIncrease: number;
38
+ /** Minimum score improvement to not count as stagnation */
39
+ improvementThreshold: number;
40
+ }
41
+ /**
42
+ * Adaptive search statistics
43
+ */
44
+ export interface AdaptiveStatistics {
45
+ /** Current beam width */
46
+ currentBeamWidth: number;
47
+ /** Number of beam width adjustments made */
48
+ beamWidthAdjustments: number;
49
+ /** Current stagnation counter */
50
+ stagnationCount: number;
51
+ /** Best score seen */
52
+ bestScore: number;
53
+ /** Iterations since last improvement */
54
+ iterationsSinceImprovement: number;
55
+ }
56
+ /**
57
+ * Adaptive Beam Search implementation with dynamic beam width adjustment
58
+ */
59
+ export declare class AdaptiveBeamSearch implements IBeamSearch {
60
+ private readonly adaptiveConfig;
61
+ private currentBeam;
62
+ private statistics;
63
+ private currentBeamWidth;
64
+ private beamWidthAdjustments;
65
+ private stagnationCount;
66
+ private bestScore;
67
+ private iterationsSinceImprovement;
68
+ constructor(config?: Partial<AdaptiveBeamConfig>);
69
+ /**
70
+ * Execute adaptive beam search
71
+ */
72
+ search(initial: SearchState, expand: (state: SearchState) => Promise<Branch[]>, scorer: IBranchScorer, context: SearchContext, config: SearchConfig): Promise<SearchResult[]>;
73
+ /**
74
+ * Get current beam
75
+ */
76
+ getCurrentBeam(): SearchState[];
77
+ /**
78
+ * Get search statistics
79
+ */
80
+ getStatistics(): SearchStatistics;
81
+ /**
82
+ * Get adaptive-specific statistics
83
+ */
84
+ getAdaptiveStatistics(): AdaptiveStatistics;
85
+ /**
86
+ * Reset adaptive state
87
+ */
88
+ reset(): void;
89
+ /**
90
+ * Adjust beam width when stagnation detected
91
+ */
92
+ private adjustBeamWidth;
93
+ /**
94
+ * Build path from state to root
95
+ */
96
+ private buildPath;
97
+ }
98
+ //# sourceMappingURL=AdaptiveBeamSearch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdaptiveBeamSearch.d.ts","sourceRoot":"","sources":["../../src/search/AdaptiveBeamSearch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EACV,MAAM,EACN,aAAa,EACb,WAAW,EACX,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAOrB;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,sCAAsC;IACtC,gBAAgB,EAAE,MAAM,CAAC;IACzB,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yEAAyE;IACzE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,2DAA2D;IAC3D,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,yBAAyB;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iCAAiC;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,0BAA0B,EAAE,MAAM,CAAC;CACpC;AAkBD;;GAEG;AACH,qBAAa,kBAAmB,YAAW,WAAW;IACpD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,UAAU,CAAmB;IAGrC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,oBAAoB,CAAa;IACzC,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,0BAA0B,CAAa;gBAEnC,MAAM,GAAE,OAAO,CAAC,kBAAkB,CAAM;IAapD;;OAEG;IACG,MAAM,CACV,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,EACjD,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,YAAY,EAAE,CAAC;IAkI1B;;OAEG;IACH,cAAc,IAAI,WAAW,EAAE;IAI/B;;OAEG;IACH,aAAa,IAAI,gBAAgB;IAIjC;;OAEG;IACH,qBAAqB,IAAI,kBAAkB;IAU3C;;OAEG;IACH,KAAK,IAAI,IAAI;IAoBb;;OAEG;IACH,OAAO,CAAC,eAAe;IAevB;;OAEG;IACH,OAAO,CAAC,SAAS;CAYlB"}
@@ -0,0 +1,240 @@
1
+ /**
2
+ * AdaptiveBeamSearch - Adaptive Beam Width Search
3
+ *
4
+ * Extends BeamSearch with dynamic beam width adjustment based on
5
+ * search progress. When stagnation is detected (no improvement for
6
+ * N iterations), beam width is increased up to a maximum.
7
+ *
8
+ * @module @nahisaho/musubix-neural-search
9
+ * @see TSK-NS-102
10
+ * @see DES-NS-102
11
+ * @see REQ-NS-102
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * import { AdaptiveBeamSearch } from './AdaptiveBeamSearch.js';
16
+ *
17
+ * const search = new AdaptiveBeamSearch({
18
+ * initialBeamWidth: 5,
19
+ * maxBeamWidth: 100,
20
+ * stagnationThreshold: 10,
21
+ * });
22
+ * const results = await search.search(initial, expand, scorer, context, config);
23
+ * ```
24
+ */
25
+ import { SearchTimeoutError } from '../errors.js';
26
+ // =============================================================================
27
+ // Default Configuration
28
+ // =============================================================================
29
+ const DEFAULT_CONFIG = {
30
+ initialBeamWidth: 5,
31
+ maxBeamWidth: 100,
32
+ stagnationThreshold: 10,
33
+ beamWidthIncrease: 0.5,
34
+ improvementThreshold: 0.001,
35
+ };
36
+ // =============================================================================
37
+ // Implementation
38
+ // =============================================================================
39
+ /**
40
+ * Adaptive Beam Search implementation with dynamic beam width adjustment
41
+ */
42
+ export class AdaptiveBeamSearch {
43
+ adaptiveConfig;
44
+ currentBeam;
45
+ statistics;
46
+ // Adaptive state
47
+ currentBeamWidth;
48
+ beamWidthAdjustments = 0;
49
+ stagnationCount = 0;
50
+ bestScore = -Infinity;
51
+ iterationsSinceImprovement = 0;
52
+ constructor(config = {}) {
53
+ this.adaptiveConfig = { ...DEFAULT_CONFIG, ...config };
54
+ this.currentBeamWidth = this.adaptiveConfig.initialBeamWidth;
55
+ this.currentBeam = [];
56
+ this.statistics = {
57
+ totalExpanded: 0,
58
+ totalPruned: 0,
59
+ maxDepthReached: 0,
60
+ averageScore: 0,
61
+ timeElapsed: 0,
62
+ };
63
+ }
64
+ /**
65
+ * Execute adaptive beam search
66
+ */
67
+ async search(initial, expand, scorer, context, config) {
68
+ const startTime = Date.now();
69
+ // Use config beam width or adaptive width
70
+ this.currentBeamWidth = config.beamWidth ?? this.adaptiveConfig.initialBeamWidth;
71
+ this.currentBeam = [initial];
72
+ const allResults = [];
73
+ let iteration = 0;
74
+ let totalPruned = 0;
75
+ let totalExpanded = 0;
76
+ let maxDepth = 0;
77
+ const scores = [];
78
+ // Reset adaptive state
79
+ this.bestScore = -Infinity;
80
+ this.iterationsSinceImprovement = 0;
81
+ while (iteration < config.maxIterations && this.currentBeam.length > 0) {
82
+ // Check timeout
83
+ if (Date.now() - startTime > config.timeout) {
84
+ throw new SearchTimeoutError(config.timeout);
85
+ }
86
+ // Check depth
87
+ const maxBeamDepth = Math.max(...this.currentBeam.map((s) => s.depth));
88
+ maxDepth = Math.max(maxDepth, maxBeamDepth);
89
+ if (maxBeamDepth >= config.maxDepth) {
90
+ break;
91
+ }
92
+ // Expand all states in beam
93
+ const candidates = [];
94
+ for (const state of this.currentBeam) {
95
+ const branches = await expand(state);
96
+ totalExpanded += branches.length;
97
+ // Score all branches
98
+ const scored = await scorer.scoreBatch(branches, context);
99
+ for (const branchScore of scored) {
100
+ // Apply pruning threshold
101
+ if (config.pruneThreshold !== undefined &&
102
+ branchScore.score < config.pruneThreshold) {
103
+ totalPruned++;
104
+ continue;
105
+ }
106
+ const path = this.buildPath(branchScore.branch.to, context.history);
107
+ candidates.push({
108
+ state: branchScore.branch.to,
109
+ score: branchScore.score,
110
+ path,
111
+ });
112
+ scores.push(branchScore.score);
113
+ }
114
+ }
115
+ // Sort by score and keep top beamWidth
116
+ candidates.sort((a, b) => b.score - a.score);
117
+ const nextBeam = candidates.slice(0, this.currentBeamWidth);
118
+ // Track best score and check for improvement
119
+ const iterationBestScore = nextBeam.length > 0 ? nextBeam[0].score : -Infinity;
120
+ const improved = iterationBestScore > this.bestScore + this.adaptiveConfig.improvementThreshold;
121
+ if (improved) {
122
+ this.bestScore = iterationBestScore;
123
+ this.iterationsSinceImprovement = 0;
124
+ }
125
+ else {
126
+ this.iterationsSinceImprovement++;
127
+ }
128
+ // Check for stagnation and adapt
129
+ if (this.iterationsSinceImprovement >= this.adaptiveConfig.stagnationThreshold) {
130
+ this.adjustBeamWidth();
131
+ this.iterationsSinceImprovement = 0;
132
+ this.stagnationCount++;
133
+ }
134
+ // Add to results
135
+ for (const candidate of nextBeam) {
136
+ allResults.push({
137
+ state: candidate.state,
138
+ score: candidate.score,
139
+ path: candidate.path,
140
+ iterations: iteration + 1,
141
+ pruned: totalPruned,
142
+ });
143
+ }
144
+ // Update beam
145
+ this.currentBeam = nextBeam.map((c) => c.state);
146
+ iteration++;
147
+ }
148
+ // Update statistics
149
+ this.statistics = {
150
+ totalExpanded,
151
+ totalPruned,
152
+ maxDepthReached: maxDepth,
153
+ averageScore: scores.length > 0
154
+ ? scores.reduce((a, b) => a + b, 0) / scores.length
155
+ : 0,
156
+ timeElapsed: Date.now() - startTime,
157
+ };
158
+ // Return best results (deduplicated)
159
+ const seen = new Set();
160
+ return allResults
161
+ .filter((r) => {
162
+ if (seen.has(r.state.id))
163
+ return false;
164
+ seen.add(r.state.id);
165
+ return true;
166
+ })
167
+ .sort((a, b) => b.score - a.score)
168
+ .slice(0, this.currentBeamWidth);
169
+ }
170
+ /**
171
+ * Get current beam
172
+ */
173
+ getCurrentBeam() {
174
+ return [...this.currentBeam];
175
+ }
176
+ /**
177
+ * Get search statistics
178
+ */
179
+ getStatistics() {
180
+ return { ...this.statistics };
181
+ }
182
+ /**
183
+ * Get adaptive-specific statistics
184
+ */
185
+ getAdaptiveStatistics() {
186
+ return {
187
+ currentBeamWidth: this.currentBeamWidth,
188
+ beamWidthAdjustments: this.beamWidthAdjustments,
189
+ stagnationCount: this.stagnationCount,
190
+ bestScore: this.bestScore,
191
+ iterationsSinceImprovement: this.iterationsSinceImprovement,
192
+ };
193
+ }
194
+ /**
195
+ * Reset adaptive state
196
+ */
197
+ reset() {
198
+ this.currentBeamWidth = this.adaptiveConfig.initialBeamWidth;
199
+ this.beamWidthAdjustments = 0;
200
+ this.stagnationCount = 0;
201
+ this.bestScore = -Infinity;
202
+ this.iterationsSinceImprovement = 0;
203
+ this.currentBeam = [];
204
+ this.statistics = {
205
+ totalExpanded: 0,
206
+ totalPruned: 0,
207
+ maxDepthReached: 0,
208
+ averageScore: 0,
209
+ timeElapsed: 0,
210
+ };
211
+ }
212
+ // ===========================================================================
213
+ // Private Methods
214
+ // ===========================================================================
215
+ /**
216
+ * Adjust beam width when stagnation detected
217
+ */
218
+ adjustBeamWidth() {
219
+ const increase = Math.ceil(this.currentBeamWidth * this.adaptiveConfig.beamWidthIncrease);
220
+ const newWidth = Math.min(this.currentBeamWidth + increase, this.adaptiveConfig.maxBeamWidth);
221
+ if (newWidth > this.currentBeamWidth) {
222
+ this.currentBeamWidth = newWidth;
223
+ this.beamWidthAdjustments++;
224
+ }
225
+ }
226
+ /**
227
+ * Build path from state to root
228
+ */
229
+ buildPath(state, history) {
230
+ const path = [state];
231
+ for (let i = history.length - 1; i >= 0; i--) {
232
+ if (history[i].id === state.parent) {
233
+ path.unshift(history[i]);
234
+ break;
235
+ }
236
+ }
237
+ return path;
238
+ }
239
+ }
240
+ //# sourceMappingURL=AdaptiveBeamSearch.js.map