@nahisaho/musubix-neural-search 2.0.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.
- package/README.md +55 -0
- package/dist/errors.d.ts +48 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +70 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/learning/ModelUpdater.d.ts +49 -0
- package/dist/learning/ModelUpdater.d.ts.map +1 -0
- package/dist/learning/ModelUpdater.js +98 -0
- package/dist/learning/ModelUpdater.js.map +1 -0
- package/dist/learning/OnlineLearner.d.ts +59 -0
- package/dist/learning/OnlineLearner.d.ts.map +1 -0
- package/dist/learning/OnlineLearner.js +155 -0
- package/dist/learning/OnlineLearner.js.map +1 -0
- package/dist/learning/TrajectoryLog.d.ts +52 -0
- package/dist/learning/TrajectoryLog.d.ts.map +1 -0
- package/dist/learning/TrajectoryLog.js +96 -0
- package/dist/learning/TrajectoryLog.js.map +1 -0
- package/dist/learning/index.d.ts +10 -0
- package/dist/learning/index.d.ts.map +1 -0
- package/dist/learning/index.js +8 -0
- package/dist/learning/index.js.map +1 -0
- package/dist/scorer/BranchScorer.d.ts +70 -0
- package/dist/scorer/BranchScorer.d.ts.map +1 -0
- package/dist/scorer/BranchScorer.js +161 -0
- package/dist/scorer/BranchScorer.js.map +1 -0
- package/dist/scorer/ContextEncoder.d.ts +59 -0
- package/dist/scorer/ContextEncoder.d.ts.map +1 -0
- package/dist/scorer/ContextEncoder.js +149 -0
- package/dist/scorer/ContextEncoder.js.map +1 -0
- package/dist/scorer/EmbeddingModel.d.ts +39 -0
- package/dist/scorer/EmbeddingModel.d.ts.map +1 -0
- package/dist/scorer/EmbeddingModel.js +104 -0
- package/dist/scorer/EmbeddingModel.js.map +1 -0
- package/dist/scorer/index.d.ts +9 -0
- package/dist/scorer/index.d.ts.map +1 -0
- package/dist/scorer/index.js +8 -0
- package/dist/scorer/index.js.map +1 -0
- package/dist/search/BeamSearch.d.ts +32 -0
- package/dist/search/BeamSearch.d.ts.map +1 -0
- package/dist/search/BeamSearch.js +139 -0
- package/dist/search/BeamSearch.js.map +1 -0
- package/dist/search/BestFirstSearch.d.ts +23 -0
- package/dist/search/BestFirstSearch.d.ts.map +1 -0
- package/dist/search/BestFirstSearch.js +110 -0
- package/dist/search/BestFirstSearch.js.map +1 -0
- package/dist/search/PriorityQueue.d.ts +54 -0
- package/dist/search/PriorityQueue.d.ts.map +1 -0
- package/dist/search/PriorityQueue.js +114 -0
- package/dist/search/PriorityQueue.js.map +1 -0
- package/dist/search/PruningManager.d.ts +62 -0
- package/dist/search/PruningManager.d.ts.map +1 -0
- package/dist/search/PruningManager.js +188 -0
- package/dist/search/PruningManager.js.map +1 -0
- package/dist/search/index.d.ts +10 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +9 -0
- package/dist/search/index.js.map +1 -0
- package/dist/types.d.ts +416 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pruning Manager
|
|
3
|
+
* @module @nahisaho/musubix-neural-search
|
|
4
|
+
* @description Learning-based pruning for search
|
|
5
|
+
* Traces to: REQ-NS-003 (学習ベースプルーニング)
|
|
6
|
+
*/
|
|
7
|
+
import type { IPruningManager, PruningDecision, PruningStatistics, SearchContext, SearchState } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Pruning configuration
|
|
10
|
+
*/
|
|
11
|
+
export interface PruningConfig {
|
|
12
|
+
scoreThreshold: number;
|
|
13
|
+
maxDepth: number;
|
|
14
|
+
enableLearning: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Pruning manager implementation
|
|
18
|
+
*/
|
|
19
|
+
export declare class PruningManager implements IPruningManager {
|
|
20
|
+
private readonly config;
|
|
21
|
+
private readonly seenStates;
|
|
22
|
+
private readonly learnedPatterns;
|
|
23
|
+
private stats;
|
|
24
|
+
constructor(config?: Partial<PruningConfig>);
|
|
25
|
+
/**
|
|
26
|
+
* Decide whether to prune a state
|
|
27
|
+
*/
|
|
28
|
+
shouldPrune(state: SearchState, context: SearchContext): PruningDecision;
|
|
29
|
+
/**
|
|
30
|
+
* Learn from pruning outcome
|
|
31
|
+
*/
|
|
32
|
+
learn(state: SearchState, outcome: 'correct' | 'incorrect'): void;
|
|
33
|
+
/**
|
|
34
|
+
* Get pruning statistics
|
|
35
|
+
*/
|
|
36
|
+
getStatistics(): PruningStatistics;
|
|
37
|
+
/**
|
|
38
|
+
* Get learned patterns count
|
|
39
|
+
*/
|
|
40
|
+
getLearnedPatternsCount(): number;
|
|
41
|
+
/**
|
|
42
|
+
* Reset state (for new search)
|
|
43
|
+
*/
|
|
44
|
+
reset(): void;
|
|
45
|
+
/**
|
|
46
|
+
* Hash a state for duplicate detection
|
|
47
|
+
*/
|
|
48
|
+
private hashState;
|
|
49
|
+
/**
|
|
50
|
+
* Extract pattern from state for learning
|
|
51
|
+
*/
|
|
52
|
+
private extractPattern;
|
|
53
|
+
/**
|
|
54
|
+
* Check if state matches learned patterns to prune
|
|
55
|
+
*/
|
|
56
|
+
private checkLearnedPatterns;
|
|
57
|
+
/**
|
|
58
|
+
* Check if state is a dead end
|
|
59
|
+
*/
|
|
60
|
+
private isDeadEnd;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=PruningManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PruningManager.d.ts","sourceRoot":"","sources":["../../src/search/PruningManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,WAAW,EACZ,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;CACzB;AA8BD;;GAEG;AACH,qBAAa,cAAe,YAAW,eAAe;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;IACzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA8B;IAC9D,OAAO,CAAC,KAAK,CAAoB;gBAErB,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM;IAY/C;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,eAAe;IAgDxE;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,GAAG,WAAW,GAAG,IAAI;IAkCjE;;OAEG;IACH,aAAa,IAAI,iBAAiB;IAIlC;;OAEG;IACH,uBAAuB,IAAI,MAAM;IAIjC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB;;OAEG;IACH,OAAO,CAAC,cAAc;IAWtB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;OAEG;IACH,OAAO,CAAC,SAAS;CAsBlB"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pruning Manager
|
|
3
|
+
* @module @nahisaho/musubix-neural-search
|
|
4
|
+
* @description Learning-based pruning for search
|
|
5
|
+
* Traces to: REQ-NS-003 (学習ベースプルーニング)
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Default configuration
|
|
9
|
+
*/
|
|
10
|
+
const DEFAULT_CONFIG = {
|
|
11
|
+
scoreThreshold: 0.2,
|
|
12
|
+
maxDepth: 15,
|
|
13
|
+
enableLearning: true,
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Pruning manager implementation
|
|
17
|
+
*/
|
|
18
|
+
export class PruningManager {
|
|
19
|
+
config;
|
|
20
|
+
seenStates;
|
|
21
|
+
learnedPatterns;
|
|
22
|
+
stats;
|
|
23
|
+
constructor(config = {}) {
|
|
24
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
25
|
+
this.seenStates = new Set();
|
|
26
|
+
this.learnedPatterns = new Map();
|
|
27
|
+
this.stats = {
|
|
28
|
+
totalDecisions: 0,
|
|
29
|
+
correctPrunes: 0,
|
|
30
|
+
incorrectPrunes: 0,
|
|
31
|
+
accuracy: 1.0,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Decide whether to prune a state
|
|
36
|
+
*/
|
|
37
|
+
shouldPrune(state, context) {
|
|
38
|
+
this.stats.totalDecisions++;
|
|
39
|
+
// Check for duplicate
|
|
40
|
+
const stateHash = this.hashState(state);
|
|
41
|
+
if (this.seenStates.has(stateHash)) {
|
|
42
|
+
return {
|
|
43
|
+
prune: true,
|
|
44
|
+
reason: 'duplicate',
|
|
45
|
+
confidence: 1.0,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
this.seenStates.add(stateHash);
|
|
49
|
+
// Check depth limit
|
|
50
|
+
if (state.depth > this.config.maxDepth) {
|
|
51
|
+
return {
|
|
52
|
+
prune: true,
|
|
53
|
+
reason: 'resource_limit',
|
|
54
|
+
confidence: 0.9,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
// Check learned patterns
|
|
58
|
+
if (this.config.enableLearning) {
|
|
59
|
+
const learnedDecision = this.checkLearnedPatterns(state);
|
|
60
|
+
if (learnedDecision) {
|
|
61
|
+
return learnedDecision;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Check for dead ends (empty code or obvious failures)
|
|
65
|
+
if (this.isDeadEnd(state, context)) {
|
|
66
|
+
return {
|
|
67
|
+
prune: true,
|
|
68
|
+
reason: 'dead_end',
|
|
69
|
+
confidence: 0.8,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// Default: don't prune
|
|
73
|
+
return {
|
|
74
|
+
prune: false,
|
|
75
|
+
reason: 'low_score', // Will only be used if prune is true
|
|
76
|
+
confidence: 0.5,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Learn from pruning outcome
|
|
81
|
+
*/
|
|
82
|
+
learn(state, outcome) {
|
|
83
|
+
if (!this.config.enableLearning)
|
|
84
|
+
return;
|
|
85
|
+
if (outcome === 'correct') {
|
|
86
|
+
this.stats.correctPrunes++;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
this.stats.incorrectPrunes++;
|
|
90
|
+
}
|
|
91
|
+
// Update accuracy
|
|
92
|
+
const total = this.stats.correctPrunes + this.stats.incorrectPrunes;
|
|
93
|
+
this.stats.accuracy = total > 0
|
|
94
|
+
? this.stats.correctPrunes / total
|
|
95
|
+
: 1.0;
|
|
96
|
+
// Learn pattern
|
|
97
|
+
const pattern = this.extractPattern(state);
|
|
98
|
+
const existing = this.learnedPatterns.get(pattern);
|
|
99
|
+
if (existing) {
|
|
100
|
+
existing.sampleCount++;
|
|
101
|
+
existing.pruneRate =
|
|
102
|
+
(existing.pruneRate * (existing.sampleCount - 1) +
|
|
103
|
+
(outcome === 'correct' ? 1 : 0)) /
|
|
104
|
+
existing.sampleCount;
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
this.learnedPatterns.set(pattern, {
|
|
108
|
+
pattern,
|
|
109
|
+
pruneRate: outcome === 'correct' ? 1 : 0,
|
|
110
|
+
sampleCount: 1,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get pruning statistics
|
|
116
|
+
*/
|
|
117
|
+
getStatistics() {
|
|
118
|
+
return { ...this.stats };
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get learned patterns count
|
|
122
|
+
*/
|
|
123
|
+
getLearnedPatternsCount() {
|
|
124
|
+
return this.learnedPatterns.size;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Reset state (for new search)
|
|
128
|
+
*/
|
|
129
|
+
reset() {
|
|
130
|
+
this.seenStates.clear();
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Hash a state for duplicate detection
|
|
134
|
+
*/
|
|
135
|
+
hashState(state) {
|
|
136
|
+
return `${state.code}:${state.depth}`;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Extract pattern from state for learning
|
|
140
|
+
*/
|
|
141
|
+
extractPattern(state) {
|
|
142
|
+
// Simple pattern: code structure signature
|
|
143
|
+
const codeSignature = state.code
|
|
144
|
+
.replace(/\s+/g, ' ')
|
|
145
|
+
.replace(/[a-z]+/g, 'x')
|
|
146
|
+
.replace(/[0-9]+/g, 'n')
|
|
147
|
+
.substring(0, 50);
|
|
148
|
+
return codeSignature;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Check if state matches learned patterns to prune
|
|
152
|
+
*/
|
|
153
|
+
checkLearnedPatterns(state) {
|
|
154
|
+
const pattern = this.extractPattern(state);
|
|
155
|
+
const learned = this.learnedPatterns.get(pattern);
|
|
156
|
+
if (learned && learned.sampleCount >= 3 && learned.pruneRate > 0.7) {
|
|
157
|
+
return {
|
|
158
|
+
prune: true,
|
|
159
|
+
reason: 'learned_pattern',
|
|
160
|
+
confidence: learned.pruneRate,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Check if state is a dead end
|
|
167
|
+
*/
|
|
168
|
+
isDeadEnd(state, _context) {
|
|
169
|
+
// Empty code
|
|
170
|
+
if (!state.code || state.code.trim().length === 0) {
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
// Syntax error indicators
|
|
174
|
+
const errorPatterns = [
|
|
175
|
+
'SyntaxError',
|
|
176
|
+
'TypeError',
|
|
177
|
+
'undefined is not',
|
|
178
|
+
'null is not',
|
|
179
|
+
];
|
|
180
|
+
for (const pattern of errorPatterns) {
|
|
181
|
+
if (state.code.includes(pattern)) {
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=PruningManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PruningManager.js","sourceRoot":"","sources":["../../src/search/PruningManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search Engine Module
|
|
3
|
+
* @module @nahisaho/musubix-neural-search/search
|
|
4
|
+
*/
|
|
5
|
+
export { PriorityQueue } from './PriorityQueue.js';
|
|
6
|
+
export { BeamSearch } from './BeamSearch.js';
|
|
7
|
+
export { BestFirstSearch } from './BestFirstSearch.js';
|
|
8
|
+
export { PruningManager } from './PruningManager.js';
|
|
9
|
+
export type { PruningConfig } from './PruningManager.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/search/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search Engine Module
|
|
3
|
+
* @module @nahisaho/musubix-neural-search/search
|
|
4
|
+
*/
|
|
5
|
+
export { PriorityQueue } from './PriorityQueue.js';
|
|
6
|
+
export { BeamSearch } from './BeamSearch.js';
|
|
7
|
+
export { BestFirstSearch } from './BestFirstSearch.js';
|
|
8
|
+
export { PruningManager } from './PruningManager.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/search/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Neural Search Types
|
|
3
|
+
* @module @nahisaho/musubix-neural-search
|
|
4
|
+
* @description Type definitions for neural search engine
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Vector embedding representation
|
|
8
|
+
*/
|
|
9
|
+
export type Embedding = Float32Array | number[];
|
|
10
|
+
/**
|
|
11
|
+
* Configuration for embedding model
|
|
12
|
+
*/
|
|
13
|
+
export interface EmbeddingConfig {
|
|
14
|
+
readonly modelName: string;
|
|
15
|
+
readonly dimension: number;
|
|
16
|
+
readonly maxLength: number;
|
|
17
|
+
readonly poolingStrategy: 'mean' | 'cls' | 'max';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Embedding model interface
|
|
21
|
+
* Traces to: REQ-NS-001 (分岐スコアリング)
|
|
22
|
+
*/
|
|
23
|
+
export interface IEmbeddingModel {
|
|
24
|
+
/**
|
|
25
|
+
* Embed source code
|
|
26
|
+
*/
|
|
27
|
+
embedCode(code: string): Promise<Embedding>;
|
|
28
|
+
/**
|
|
29
|
+
* Embed specification/requirement
|
|
30
|
+
*/
|
|
31
|
+
embedSpec(spec: string): Promise<Embedding>;
|
|
32
|
+
/**
|
|
33
|
+
* Calculate similarity between embeddings
|
|
34
|
+
*/
|
|
35
|
+
similarity(a: Embedding, b: Embedding): number;
|
|
36
|
+
/**
|
|
37
|
+
* Batch embed multiple texts
|
|
38
|
+
*/
|
|
39
|
+
embedBatch(texts: string[]): Promise<Embedding[]>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Search state representing a partial synthesis
|
|
43
|
+
*/
|
|
44
|
+
export interface SearchState {
|
|
45
|
+
readonly id: string;
|
|
46
|
+
readonly code: string;
|
|
47
|
+
readonly parent?: string;
|
|
48
|
+
readonly depth: number;
|
|
49
|
+
readonly metadata: Record<string, unknown>;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Branch in the search tree
|
|
53
|
+
*/
|
|
54
|
+
export interface Branch {
|
|
55
|
+
readonly from: SearchState;
|
|
56
|
+
readonly to: SearchState;
|
|
57
|
+
readonly action: string;
|
|
58
|
+
readonly features: BranchFeatures;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Features extracted from a branch
|
|
62
|
+
*/
|
|
63
|
+
export interface BranchFeatures {
|
|
64
|
+
readonly codeEmbedding: Embedding;
|
|
65
|
+
readonly specSimilarity: number;
|
|
66
|
+
readonly syntaxValid: boolean;
|
|
67
|
+
readonly typeChecks: boolean;
|
|
68
|
+
readonly complexity: number;
|
|
69
|
+
readonly novelty: number;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Score result for a branch
|
|
73
|
+
*/
|
|
74
|
+
export interface BranchScore {
|
|
75
|
+
readonly branch: Branch;
|
|
76
|
+
readonly score: number;
|
|
77
|
+
readonly confidence: number;
|
|
78
|
+
readonly components: ScoreComponents;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Components of the score
|
|
82
|
+
*/
|
|
83
|
+
export interface ScoreComponents {
|
|
84
|
+
readonly specAlignment: number;
|
|
85
|
+
readonly codeQuality: number;
|
|
86
|
+
readonly novelty: number;
|
|
87
|
+
readonly feasibility: number;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Branch scorer interface
|
|
91
|
+
* Traces to: REQ-NS-001 (分岐スコアリング)
|
|
92
|
+
*/
|
|
93
|
+
export interface IBranchScorer {
|
|
94
|
+
/**
|
|
95
|
+
* Score a single branch
|
|
96
|
+
*/
|
|
97
|
+
score(branch: Branch, context: SearchContext): Promise<BranchScore>;
|
|
98
|
+
/**
|
|
99
|
+
* Score multiple branches
|
|
100
|
+
*/
|
|
101
|
+
scoreBatch(branches: Branch[], context: SearchContext): Promise<BranchScore[]>;
|
|
102
|
+
/**
|
|
103
|
+
* Update scorer with feedback
|
|
104
|
+
*/
|
|
105
|
+
update(feedback: ScoreFeedback): void;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Context for search scoring
|
|
109
|
+
*/
|
|
110
|
+
export interface SearchContext {
|
|
111
|
+
readonly specification: string;
|
|
112
|
+
readonly specEmbedding: Embedding;
|
|
113
|
+
readonly constraints: string[];
|
|
114
|
+
readonly history: SearchState[];
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Feedback for score adjustment
|
|
118
|
+
*/
|
|
119
|
+
export interface ScoreFeedback {
|
|
120
|
+
readonly branchId: string;
|
|
121
|
+
readonly actualOutcome: 'success' | 'failure' | 'partial';
|
|
122
|
+
readonly reason?: string;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Encoded context representation
|
|
126
|
+
*/
|
|
127
|
+
export interface EncodedContext {
|
|
128
|
+
readonly embedding: Embedding;
|
|
129
|
+
readonly features: ContextFeatures;
|
|
130
|
+
readonly tokens: number;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Features extracted from context
|
|
134
|
+
*/
|
|
135
|
+
export interface ContextFeatures {
|
|
136
|
+
readonly specLength: number;
|
|
137
|
+
readonly constraintCount: number;
|
|
138
|
+
readonly complexityEstimate: number;
|
|
139
|
+
readonly domainSignals: string[];
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Context encoder interface
|
|
143
|
+
*/
|
|
144
|
+
export interface IContextEncoder {
|
|
145
|
+
/**
|
|
146
|
+
* Encode full search context
|
|
147
|
+
*/
|
|
148
|
+
encode(context: SearchContext): Promise<EncodedContext>;
|
|
149
|
+
/**
|
|
150
|
+
* Encode specification only
|
|
151
|
+
*/
|
|
152
|
+
encodeSpec(spec: string): Promise<EncodedContext>;
|
|
153
|
+
/**
|
|
154
|
+
* Update encoder with learned patterns
|
|
155
|
+
*/
|
|
156
|
+
updatePatterns(patterns: string[]): void;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Search configuration
|
|
160
|
+
*/
|
|
161
|
+
export interface SearchConfig {
|
|
162
|
+
readonly maxDepth: number;
|
|
163
|
+
readonly maxIterations: number;
|
|
164
|
+
readonly timeout: number;
|
|
165
|
+
readonly beamWidth?: number;
|
|
166
|
+
readonly pruneThreshold?: number;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Search result
|
|
170
|
+
*/
|
|
171
|
+
export interface SearchResult {
|
|
172
|
+
readonly state: SearchState;
|
|
173
|
+
readonly score: number;
|
|
174
|
+
readonly path: SearchState[];
|
|
175
|
+
readonly iterations: number;
|
|
176
|
+
readonly pruned: number;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Beam search interface
|
|
180
|
+
* Traces to: REQ-NS-002 (探索優先順位付け)
|
|
181
|
+
*/
|
|
182
|
+
export interface IBeamSearch {
|
|
183
|
+
/**
|
|
184
|
+
* Execute beam search
|
|
185
|
+
*/
|
|
186
|
+
search(initial: SearchState, expand: (state: SearchState) => Promise<Branch[]>, scorer: IBranchScorer, context: SearchContext, config: SearchConfig): Promise<SearchResult[]>;
|
|
187
|
+
/**
|
|
188
|
+
* Get current beam
|
|
189
|
+
*/
|
|
190
|
+
getCurrentBeam(): SearchState[];
|
|
191
|
+
/**
|
|
192
|
+
* Get search statistics
|
|
193
|
+
*/
|
|
194
|
+
getStatistics(): SearchStatistics;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Best-first search interface
|
|
198
|
+
*/
|
|
199
|
+
export interface IBestFirstSearch {
|
|
200
|
+
/**
|
|
201
|
+
* Execute best-first search
|
|
202
|
+
*/
|
|
203
|
+
search(initial: SearchState, expand: (state: SearchState) => Promise<Branch[]>, scorer: IBranchScorer, context: SearchContext, config: SearchConfig): Promise<SearchResult>;
|
|
204
|
+
/**
|
|
205
|
+
* Get open list size
|
|
206
|
+
*/
|
|
207
|
+
getOpenListSize(): number;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Search statistics
|
|
211
|
+
*/
|
|
212
|
+
export interface SearchStatistics {
|
|
213
|
+
readonly totalExpanded: number;
|
|
214
|
+
readonly totalPruned: number;
|
|
215
|
+
readonly maxDepthReached: number;
|
|
216
|
+
readonly averageScore: number;
|
|
217
|
+
readonly timeElapsed: number;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Pruning decision
|
|
221
|
+
*/
|
|
222
|
+
export interface PruningDecision {
|
|
223
|
+
readonly prune: boolean;
|
|
224
|
+
readonly reason: PruningReason;
|
|
225
|
+
readonly confidence: number;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Pruning reason
|
|
229
|
+
*/
|
|
230
|
+
export type PruningReason = 'low_score' | 'duplicate' | 'dead_end' | 'resource_limit' | 'learned_pattern';
|
|
231
|
+
/**
|
|
232
|
+
* Pruning manager interface
|
|
233
|
+
* Traces to: REQ-NS-003 (学習ベースプルーニング)
|
|
234
|
+
*/
|
|
235
|
+
export interface IPruningManager {
|
|
236
|
+
/**
|
|
237
|
+
* Decide whether to prune a state
|
|
238
|
+
*/
|
|
239
|
+
shouldPrune(state: SearchState, context: SearchContext): PruningDecision;
|
|
240
|
+
/**
|
|
241
|
+
* Learn from pruning outcome
|
|
242
|
+
*/
|
|
243
|
+
learn(state: SearchState, outcome: 'correct' | 'incorrect'): void;
|
|
244
|
+
/**
|
|
245
|
+
* Get pruning statistics
|
|
246
|
+
*/
|
|
247
|
+
getStatistics(): PruningStatistics;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Pruning statistics
|
|
251
|
+
*/
|
|
252
|
+
export interface PruningStatistics {
|
|
253
|
+
readonly totalDecisions: number;
|
|
254
|
+
readonly correctPrunes: number;
|
|
255
|
+
readonly incorrectPrunes: number;
|
|
256
|
+
readonly accuracy: number;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Search trajectory
|
|
260
|
+
* Traces to: REQ-NS-004 (探索履歴学習)
|
|
261
|
+
*/
|
|
262
|
+
export interface SearchTrajectory {
|
|
263
|
+
readonly id: string;
|
|
264
|
+
readonly specification: string;
|
|
265
|
+
readonly path: TrajectoryStep[];
|
|
266
|
+
readonly outcome: TrajectoryOutcome;
|
|
267
|
+
readonly timestamp: Date;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Step in a trajectory
|
|
271
|
+
*/
|
|
272
|
+
export interface TrajectoryStep {
|
|
273
|
+
readonly state: SearchState;
|
|
274
|
+
readonly score: number;
|
|
275
|
+
readonly action: string;
|
|
276
|
+
readonly duration: number;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Outcome of a trajectory
|
|
280
|
+
*/
|
|
281
|
+
export interface TrajectoryOutcome {
|
|
282
|
+
readonly success: boolean;
|
|
283
|
+
readonly finalScore: number;
|
|
284
|
+
readonly reason?: string;
|
|
285
|
+
readonly userFeedback?: 'accept' | 'reject' | 'modify';
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Trajectory log interface
|
|
289
|
+
*/
|
|
290
|
+
export interface ITrajectoryLog {
|
|
291
|
+
/**
|
|
292
|
+
* Log a completed trajectory
|
|
293
|
+
*/
|
|
294
|
+
log(trajectory: SearchTrajectory): void;
|
|
295
|
+
/**
|
|
296
|
+
* Query trajectories by specification
|
|
297
|
+
*/
|
|
298
|
+
queryBySpec(spec: string, limit?: number): SearchTrajectory[];
|
|
299
|
+
/**
|
|
300
|
+
* Get successful trajectories
|
|
301
|
+
*/
|
|
302
|
+
getSuccessful(limit?: number): SearchTrajectory[];
|
|
303
|
+
/**
|
|
304
|
+
* Get statistics
|
|
305
|
+
*/
|
|
306
|
+
getStatistics(): TrajectoryStatistics;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Trajectory statistics
|
|
310
|
+
*/
|
|
311
|
+
export interface TrajectoryStatistics {
|
|
312
|
+
readonly totalTrajectories: number;
|
|
313
|
+
readonly successRate: number;
|
|
314
|
+
readonly averageLength: number;
|
|
315
|
+
readonly averageDuration: number;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Learning update
|
|
319
|
+
*/
|
|
320
|
+
export interface LearningUpdate {
|
|
321
|
+
readonly trajectoryId: string;
|
|
322
|
+
readonly gradients: Map<string, number>;
|
|
323
|
+
readonly loss: number;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Online learner interface
|
|
327
|
+
*/
|
|
328
|
+
export interface IOnlineLearner {
|
|
329
|
+
/**
|
|
330
|
+
* Learn from a trajectory
|
|
331
|
+
*/
|
|
332
|
+
learnFromTrajectory(trajectory: SearchTrajectory): LearningUpdate;
|
|
333
|
+
/**
|
|
334
|
+
* Get current model parameters
|
|
335
|
+
*/
|
|
336
|
+
getParameters(): Map<string, number>;
|
|
337
|
+
/**
|
|
338
|
+
* Apply learning update
|
|
339
|
+
*/
|
|
340
|
+
applyUpdate(update: LearningUpdate): void;
|
|
341
|
+
/**
|
|
342
|
+
* Get learning statistics
|
|
343
|
+
*/
|
|
344
|
+
getStatistics(): LearningStatistics;
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Learning statistics
|
|
348
|
+
*/
|
|
349
|
+
export interface LearningStatistics {
|
|
350
|
+
readonly totalUpdates: number;
|
|
351
|
+
readonly averageLoss: number;
|
|
352
|
+
readonly learningRate: number;
|
|
353
|
+
readonly convergenceMetric: number;
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Model update request
|
|
357
|
+
*/
|
|
358
|
+
export interface ModelUpdateRequest {
|
|
359
|
+
readonly updates: LearningUpdate[];
|
|
360
|
+
readonly batchSize: number;
|
|
361
|
+
readonly epoch: number;
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Model updater interface
|
|
365
|
+
*/
|
|
366
|
+
export interface IModelUpdater {
|
|
367
|
+
/**
|
|
368
|
+
* Queue an update
|
|
369
|
+
*/
|
|
370
|
+
queueUpdate(update: LearningUpdate): void;
|
|
371
|
+
/**
|
|
372
|
+
* Flush pending updates
|
|
373
|
+
*/
|
|
374
|
+
flushUpdates(): Promise<void>;
|
|
375
|
+
/**
|
|
376
|
+
* Get pending update count
|
|
377
|
+
*/
|
|
378
|
+
getPendingCount(): number;
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Priority queue item
|
|
382
|
+
*/
|
|
383
|
+
export interface PriorityItem<T> {
|
|
384
|
+
readonly item: T;
|
|
385
|
+
readonly priority: number;
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Priority queue interface
|
|
389
|
+
*/
|
|
390
|
+
export interface IPriorityQueue<T> {
|
|
391
|
+
/**
|
|
392
|
+
* Add item with priority
|
|
393
|
+
*/
|
|
394
|
+
push(item: T, priority: number): void;
|
|
395
|
+
/**
|
|
396
|
+
* Remove and return highest priority item
|
|
397
|
+
*/
|
|
398
|
+
pop(): T | undefined;
|
|
399
|
+
/**
|
|
400
|
+
* Peek at highest priority item
|
|
401
|
+
*/
|
|
402
|
+
peek(): T | undefined;
|
|
403
|
+
/**
|
|
404
|
+
* Get queue size
|
|
405
|
+
*/
|
|
406
|
+
size(): number;
|
|
407
|
+
/**
|
|
408
|
+
* Check if empty
|
|
409
|
+
*/
|
|
410
|
+
isEmpty(): boolean;
|
|
411
|
+
/**
|
|
412
|
+
* Clear the queue
|
|
413
|
+
*/
|
|
414
|
+
clear(): void;
|
|
415
|
+
}
|
|
416
|
+
//# sourceMappingURL=types.d.ts.map
|