@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,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding Model
|
|
3
|
+
* @module @nahisaho/musubix-neural-search
|
|
4
|
+
* @description Neural embedding model for code and specifications
|
|
5
|
+
* Traces to: REQ-NS-001 (分岐スコアリング)
|
|
6
|
+
*/
|
|
7
|
+
import { EmbeddingError } from '../errors.js';
|
|
8
|
+
/**
|
|
9
|
+
* Default embedding configuration
|
|
10
|
+
*/
|
|
11
|
+
const DEFAULT_CONFIG = {
|
|
12
|
+
modelName: 'simple-hash',
|
|
13
|
+
dimension: 128,
|
|
14
|
+
maxLength: 512,
|
|
15
|
+
poolingStrategy: 'mean',
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Simple hash-based embedding model (for testing without ML dependencies)
|
|
19
|
+
*/
|
|
20
|
+
export class EmbeddingModel {
|
|
21
|
+
config;
|
|
22
|
+
constructor(config = {}) {
|
|
23
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Embed source code
|
|
27
|
+
*/
|
|
28
|
+
async embedCode(code) {
|
|
29
|
+
if (!code) {
|
|
30
|
+
throw new EmbeddingError('Code cannot be empty');
|
|
31
|
+
}
|
|
32
|
+
return this.hashEmbed(code, 'code');
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Embed specification
|
|
36
|
+
*/
|
|
37
|
+
async embedSpec(spec) {
|
|
38
|
+
if (!spec) {
|
|
39
|
+
throw new EmbeddingError('Specification cannot be empty');
|
|
40
|
+
}
|
|
41
|
+
return this.hashEmbed(spec, 'spec');
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Calculate cosine similarity between embeddings
|
|
45
|
+
*/
|
|
46
|
+
similarity(a, b) {
|
|
47
|
+
if (a.length !== b.length) {
|
|
48
|
+
throw new EmbeddingError('Embedding dimensions must match');
|
|
49
|
+
}
|
|
50
|
+
let dotProduct = 0;
|
|
51
|
+
let normA = 0;
|
|
52
|
+
let normB = 0;
|
|
53
|
+
for (let i = 0; i < a.length; i++) {
|
|
54
|
+
const valA = a[i];
|
|
55
|
+
const valB = b[i];
|
|
56
|
+
dotProduct += valA * valB;
|
|
57
|
+
normA += valA * valA;
|
|
58
|
+
normB += valB * valB;
|
|
59
|
+
}
|
|
60
|
+
const denominator = Math.sqrt(normA) * Math.sqrt(normB);
|
|
61
|
+
if (denominator === 0) {
|
|
62
|
+
return 0;
|
|
63
|
+
}
|
|
64
|
+
return dotProduct / denominator;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Batch embed multiple texts
|
|
68
|
+
*/
|
|
69
|
+
async embedBatch(texts) {
|
|
70
|
+
return Promise.all(texts.map((text) => this.hashEmbed(text, 'batch')));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get configuration
|
|
74
|
+
*/
|
|
75
|
+
getConfig() {
|
|
76
|
+
return this.config;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Simple hash-based embedding (deterministic, for testing)
|
|
80
|
+
*/
|
|
81
|
+
hashEmbed(text, prefix) {
|
|
82
|
+
const combined = `${prefix}:${text}`;
|
|
83
|
+
const embedding = new Float32Array(this.config.dimension);
|
|
84
|
+
// Simple character-based hashing
|
|
85
|
+
for (let i = 0; i < combined.length && i < this.config.maxLength; i++) {
|
|
86
|
+
const charCode = combined.charCodeAt(i);
|
|
87
|
+
const idx = i % this.config.dimension;
|
|
88
|
+
embedding[idx] += charCode / 256;
|
|
89
|
+
}
|
|
90
|
+
// Normalize
|
|
91
|
+
let norm = 0;
|
|
92
|
+
for (let i = 0; i < embedding.length; i++) {
|
|
93
|
+
norm += embedding[i] * embedding[i];
|
|
94
|
+
}
|
|
95
|
+
norm = Math.sqrt(norm);
|
|
96
|
+
if (norm > 0) {
|
|
97
|
+
for (let i = 0; i < embedding.length; i++) {
|
|
98
|
+
embedding[i] /= norm;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return embedding;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=EmbeddingModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmbeddingModel.js","sourceRoot":"","sources":["../../src/scorer/EmbeddingModel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Neural Scorer Module
|
|
3
|
+
* @module @nahisaho/musubix-neural-search/scorer
|
|
4
|
+
*/
|
|
5
|
+
export { EmbeddingModel } from './EmbeddingModel.js';
|
|
6
|
+
export { BranchScorer } from './BranchScorer.js';
|
|
7
|
+
export type { ScoreWeights } from './BranchScorer.js';
|
|
8
|
+
export { ContextEncoder } from './ContextEncoder.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Neural Scorer Module
|
|
3
|
+
* @module @nahisaho/musubix-neural-search/scorer
|
|
4
|
+
*/
|
|
5
|
+
export { EmbeddingModel } from './EmbeddingModel.js';
|
|
6
|
+
export { BranchScorer } from './BranchScorer.js';
|
|
7
|
+
export { ContextEncoder } from './ContextEncoder.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Beam Search
|
|
3
|
+
* @module @nahisaho/musubix-neural-search
|
|
4
|
+
* @description Beam search algorithm for code synthesis
|
|
5
|
+
* Traces to: REQ-NS-002 (探索優先順位付け)
|
|
6
|
+
*/
|
|
7
|
+
import type { Branch, IBranchScorer, IBeamSearch, SearchConfig, SearchContext, SearchResult, SearchState, SearchStatistics } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Beam search implementation
|
|
10
|
+
*/
|
|
11
|
+
export declare class BeamSearch implements IBeamSearch {
|
|
12
|
+
private currentBeam;
|
|
13
|
+
private statistics;
|
|
14
|
+
constructor();
|
|
15
|
+
/**
|
|
16
|
+
* Execute beam search
|
|
17
|
+
*/
|
|
18
|
+
search(initial: SearchState, expand: (state: SearchState) => Promise<Branch[]>, scorer: IBranchScorer, context: SearchContext, config: SearchConfig): Promise<SearchResult[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Get current beam
|
|
21
|
+
*/
|
|
22
|
+
getCurrentBeam(): SearchState[];
|
|
23
|
+
/**
|
|
24
|
+
* Get search statistics
|
|
25
|
+
*/
|
|
26
|
+
getStatistics(): SearchStatistics;
|
|
27
|
+
/**
|
|
28
|
+
* Build path from state to root
|
|
29
|
+
*/
|
|
30
|
+
private buildPath;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=BeamSearch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BeamSearch.d.ts","sourceRoot":"","sources":["../../src/search/BeamSearch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,MAAM,EACN,aAAa,EACb,WAAW,EACX,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAGrB;;GAEG;AACH,qBAAa,UAAW,YAAW,WAAW;IAC5C,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,UAAU,CAAmB;;IAarC;;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;IAsG1B;;OAEG;IACH,cAAc,IAAI,WAAW,EAAE;IAI/B;;OAEG;IACH,aAAa,IAAI,gBAAgB;IAIjC;;OAEG;IACH,OAAO,CAAC,SAAS;CAalB"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Beam Search
|
|
3
|
+
* @module @nahisaho/musubix-neural-search
|
|
4
|
+
* @description Beam search algorithm for code synthesis
|
|
5
|
+
* Traces to: REQ-NS-002 (探索優先順位付け)
|
|
6
|
+
*/
|
|
7
|
+
import { SearchTimeoutError } from '../errors.js';
|
|
8
|
+
/**
|
|
9
|
+
* Beam search implementation
|
|
10
|
+
*/
|
|
11
|
+
export class BeamSearch {
|
|
12
|
+
currentBeam;
|
|
13
|
+
statistics;
|
|
14
|
+
constructor() {
|
|
15
|
+
this.currentBeam = [];
|
|
16
|
+
this.statistics = {
|
|
17
|
+
totalExpanded: 0,
|
|
18
|
+
totalPruned: 0,
|
|
19
|
+
maxDepthReached: 0,
|
|
20
|
+
averageScore: 0,
|
|
21
|
+
timeElapsed: 0,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Execute beam search
|
|
26
|
+
*/
|
|
27
|
+
async search(initial, expand, scorer, context, config) {
|
|
28
|
+
const startTime = Date.now();
|
|
29
|
+
const beamWidth = config.beamWidth ?? 5;
|
|
30
|
+
this.currentBeam = [initial];
|
|
31
|
+
const allResults = [];
|
|
32
|
+
let iteration = 0;
|
|
33
|
+
let totalPruned = 0;
|
|
34
|
+
let totalExpanded = 0;
|
|
35
|
+
let maxDepth = 0;
|
|
36
|
+
const scores = [];
|
|
37
|
+
while (iteration < config.maxIterations &&
|
|
38
|
+
this.currentBeam.length > 0) {
|
|
39
|
+
// Check timeout
|
|
40
|
+
if (Date.now() - startTime > config.timeout) {
|
|
41
|
+
throw new SearchTimeoutError(config.timeout);
|
|
42
|
+
}
|
|
43
|
+
// Check depth - return results instead of throwing
|
|
44
|
+
const maxBeamDepth = Math.max(...this.currentBeam.map((s) => s.depth));
|
|
45
|
+
maxDepth = Math.max(maxDepth, maxBeamDepth);
|
|
46
|
+
if (maxBeamDepth >= config.maxDepth) {
|
|
47
|
+
// Reached max depth, return current results
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
// Expand all states in beam
|
|
51
|
+
const candidates = [];
|
|
52
|
+
for (const state of this.currentBeam) {
|
|
53
|
+
const branches = await expand(state);
|
|
54
|
+
totalExpanded += branches.length;
|
|
55
|
+
// Score all branches
|
|
56
|
+
const scored = await scorer.scoreBatch(branches, context);
|
|
57
|
+
for (const branchScore of scored) {
|
|
58
|
+
// Apply pruning threshold
|
|
59
|
+
if (config.pruneThreshold !== undefined &&
|
|
60
|
+
branchScore.score < config.pruneThreshold) {
|
|
61
|
+
totalPruned++;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const path = this.buildPath(branchScore.branch.to, context.history);
|
|
65
|
+
candidates.push({
|
|
66
|
+
state: branchScore.branch.to,
|
|
67
|
+
score: branchScore.score,
|
|
68
|
+
path,
|
|
69
|
+
});
|
|
70
|
+
scores.push(branchScore.score);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Sort by score and keep top beamWidth
|
|
74
|
+
candidates.sort((a, b) => b.score - a.score);
|
|
75
|
+
const nextBeam = candidates.slice(0, beamWidth);
|
|
76
|
+
// Add to results
|
|
77
|
+
for (const candidate of nextBeam) {
|
|
78
|
+
allResults.push({
|
|
79
|
+
state: candidate.state,
|
|
80
|
+
score: candidate.score,
|
|
81
|
+
path: candidate.path,
|
|
82
|
+
iterations: iteration + 1,
|
|
83
|
+
pruned: totalPruned,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// Update beam
|
|
87
|
+
this.currentBeam = nextBeam.map((c) => c.state);
|
|
88
|
+
iteration++;
|
|
89
|
+
}
|
|
90
|
+
// Update statistics
|
|
91
|
+
this.statistics = {
|
|
92
|
+
totalExpanded,
|
|
93
|
+
totalPruned,
|
|
94
|
+
maxDepthReached: maxDepth,
|
|
95
|
+
averageScore: scores.length > 0
|
|
96
|
+
? scores.reduce((a, b) => a + b, 0) / scores.length
|
|
97
|
+
: 0,
|
|
98
|
+
timeElapsed: Date.now() - startTime,
|
|
99
|
+
};
|
|
100
|
+
// Return best results (deduplicated by state id)
|
|
101
|
+
const seen = new Set();
|
|
102
|
+
return allResults
|
|
103
|
+
.filter((r) => {
|
|
104
|
+
if (seen.has(r.state.id))
|
|
105
|
+
return false;
|
|
106
|
+
seen.add(r.state.id);
|
|
107
|
+
return true;
|
|
108
|
+
})
|
|
109
|
+
.sort((a, b) => b.score - a.score)
|
|
110
|
+
.slice(0, beamWidth);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Get current beam
|
|
114
|
+
*/
|
|
115
|
+
getCurrentBeam() {
|
|
116
|
+
return [...this.currentBeam];
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get search statistics
|
|
120
|
+
*/
|
|
121
|
+
getStatistics() {
|
|
122
|
+
return { ...this.statistics };
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Build path from state to root
|
|
126
|
+
*/
|
|
127
|
+
buildPath(state, history) {
|
|
128
|
+
const path = [state];
|
|
129
|
+
// Add history states
|
|
130
|
+
for (let i = history.length - 1; i >= 0; i--) {
|
|
131
|
+
if (history[i].id === state.parent) {
|
|
132
|
+
path.unshift(history[i]);
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return path;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=BeamSearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BeamSearch.js","sourceRoot":"","sources":["../../src/search/BeamSearch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD;;GAEG;AACH,MAAM,OAAO,UAAU;IACb,WAAW,CAAgB;IAC3B,UAAU,CAAmB;IAErC;QACE,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG;YAChB,aAAa,EAAE,CAAC;YAChB,WAAW,EAAE,CAAC;YACd,eAAe,EAAE,CAAC;YAClB,YAAY,EAAE,CAAC;YACf,WAAW,EAAE,CAAC;SACf,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CACV,OAAoB,EACpB,MAAiD,EACjD,MAAqB,EACrB,OAAsB,EACtB,MAAoB;QAEpB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;QAExC,IAAI,CAAC,WAAW,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7B,MAAM,UAAU,GAAmB,EAAE,CAAC;QACtC,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,OACE,SAAS,GAAG,MAAM,CAAC,aAAa;YAChC,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAC3B,CAAC;YACD,gBAAgB;YAChB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC5C,MAAM,IAAI,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC/C,CAAC;YAED,mDAAmD;YACnD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACvE,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC5C,IAAI,YAAY,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpC,4CAA4C;gBAC5C,MAAM;YACR,CAAC;YAED,4BAA4B;YAC5B,MAAM,UAAU,GAAsE,EAAE,CAAC;YAEzF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;gBACrC,aAAa,IAAI,QAAQ,CAAC,MAAM,CAAC;gBAEjC,qBAAqB;gBACrB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAE1D,KAAK,MAAM,WAAW,IAAI,MAAM,EAAE,CAAC;oBACjC,0BAA0B;oBAC1B,IACE,MAAM,CAAC,cAAc,KAAK,SAAS;wBACnC,WAAW,CAAC,KAAK,GAAG,MAAM,CAAC,cAAc,EACzC,CAAC;wBACD,WAAW,EAAE,CAAC;wBACd,SAAS;oBACX,CAAC;oBAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;oBACpE,UAAU,CAAC,IAAI,CAAC;wBACd,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE;wBAC5B,KAAK,EAAE,WAAW,CAAC,KAAK;wBACxB,IAAI;qBACL,CAAC,CAAC;oBACH,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;YAED,uCAAuC;YACvC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAEhD,iBAAiB;YACjB,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;gBACjC,UAAU,CAAC,IAAI,CAAC;oBACd,KAAK,EAAE,SAAS,CAAC,KAAK;oBACtB,KAAK,EAAE,SAAS,CAAC,KAAK;oBACtB,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,UAAU,EAAE,SAAS,GAAG,CAAC;oBACzB,MAAM,EAAE,WAAW;iBACpB,CAAC,CAAC;YACL,CAAC;YAED,cAAc;YACd,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAChD,SAAS,EAAE,CAAC;QACd,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC,UAAU,GAAG;YAChB,aAAa;YACb,WAAW;YACX,eAAe,EAAE,QAAQ;YACzB,YAAY,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC;gBAC7B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM;gBACnD,CAAC,CAAC,CAAC;YACL,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SACpC,CAAC;QAEF,iDAAiD;QACjD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,OAAO,UAAU;aACd,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACZ,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBAAE,OAAO,KAAK,CAAC;YACvC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;aACjC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,KAAkB,EAAE,OAAsB;QAC1D,MAAM,IAAI,GAAkB,CAAC,KAAK,CAAC,CAAC;QAEpC,qBAAqB;QACrB,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;gBACnC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzB,MAAM;YACR,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Best-First Search
|
|
3
|
+
* @module @nahisaho/musubix-neural-search
|
|
4
|
+
* @description Best-first search algorithm for code synthesis
|
|
5
|
+
*/
|
|
6
|
+
import type { Branch, IBranchScorer, IBestFirstSearch, SearchConfig, SearchContext, SearchResult, SearchState } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Best-first search implementation
|
|
9
|
+
*/
|
|
10
|
+
export declare class BestFirstSearch implements IBestFirstSearch {
|
|
11
|
+
private openList;
|
|
12
|
+
private closedSet;
|
|
13
|
+
constructor();
|
|
14
|
+
/**
|
|
15
|
+
* Execute best-first search
|
|
16
|
+
*/
|
|
17
|
+
search(initial: SearchState, expand: (state: SearchState) => Promise<Branch[]>, scorer: IBranchScorer, context: SearchContext, config: SearchConfig): Promise<SearchResult>;
|
|
18
|
+
/**
|
|
19
|
+
* Get open list size
|
|
20
|
+
*/
|
|
21
|
+
getOpenListSize(): number;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=BestFirstSearch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BestFirstSearch.d.ts","sourceRoot":"","sources":["../../src/search/BestFirstSearch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,MAAM,EACN,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACZ,MAAM,aAAa,CAAC;AAIrB;;GAEG;AACH,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,OAAO,CAAC,QAAQ,CAA4E;IAC5F,OAAO,CAAC,SAAS,CAAc;;IAO/B;;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,CAAC;IA0GxB;;OAEG;IACH,eAAe,IAAI,MAAM;CAG1B"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Best-First Search
|
|
3
|
+
* @module @nahisaho/musubix-neural-search
|
|
4
|
+
* @description Best-first search algorithm for code synthesis
|
|
5
|
+
*/
|
|
6
|
+
import { SearchDepthExceededError, SearchTimeoutError } from '../errors.js';
|
|
7
|
+
import { PriorityQueue } from './PriorityQueue.js';
|
|
8
|
+
/**
|
|
9
|
+
* Best-first search implementation
|
|
10
|
+
*/
|
|
11
|
+
export class BestFirstSearch {
|
|
12
|
+
openList;
|
|
13
|
+
closedSet;
|
|
14
|
+
constructor() {
|
|
15
|
+
this.openList = new PriorityQueue();
|
|
16
|
+
this.closedSet = new Set();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Execute best-first search
|
|
20
|
+
*/
|
|
21
|
+
async search(initial, expand, scorer, context, config) {
|
|
22
|
+
const startTime = Date.now();
|
|
23
|
+
// Reset state
|
|
24
|
+
this.openList.clear();
|
|
25
|
+
this.closedSet.clear();
|
|
26
|
+
// Add initial state with neutral score (not a goal yet)
|
|
27
|
+
this.openList.push({ state: initial, score: 0.0, path: [initial] }, 0.0);
|
|
28
|
+
let iteration = 0;
|
|
29
|
+
let totalPruned = 0;
|
|
30
|
+
while (!this.openList.isEmpty() && iteration < config.maxIterations) {
|
|
31
|
+
// Check timeout
|
|
32
|
+
if (Date.now() - startTime > config.timeout) {
|
|
33
|
+
throw new SearchTimeoutError(config.timeout);
|
|
34
|
+
}
|
|
35
|
+
// Get best state
|
|
36
|
+
const current = this.openList.pop();
|
|
37
|
+
if (!current)
|
|
38
|
+
break;
|
|
39
|
+
const { state, score, path } = current;
|
|
40
|
+
// Skip if already visited
|
|
41
|
+
if (this.closedSet.has(state.id)) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
this.closedSet.add(state.id);
|
|
45
|
+
// Check depth (only after at least one expansion)
|
|
46
|
+
if (state.depth > 0 && state.depth >= config.maxDepth) {
|
|
47
|
+
throw new SearchDepthExceededError(config.maxDepth);
|
|
48
|
+
}
|
|
49
|
+
// Check if goal (assume high score = goal, but only for non-initial states)
|
|
50
|
+
if (state.depth > 0 && score >= 0.9) {
|
|
51
|
+
return {
|
|
52
|
+
state,
|
|
53
|
+
score,
|
|
54
|
+
path,
|
|
55
|
+
iterations: iteration + 1,
|
|
56
|
+
pruned: totalPruned,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Expand state
|
|
60
|
+
const branches = await expand(state);
|
|
61
|
+
// Check timeout again after expansion (expansion might be slow)
|
|
62
|
+
if (Date.now() - startTime > config.timeout) {
|
|
63
|
+
throw new SearchTimeoutError(config.timeout);
|
|
64
|
+
}
|
|
65
|
+
const scored = await scorer.scoreBatch(branches, context);
|
|
66
|
+
for (const branchScore of scored) {
|
|
67
|
+
const nextState = branchScore.branch.to;
|
|
68
|
+
// Skip if already visited
|
|
69
|
+
if (this.closedSet.has(nextState.id)) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
// Apply pruning
|
|
73
|
+
if (config.pruneThreshold !== undefined &&
|
|
74
|
+
branchScore.score < config.pruneThreshold) {
|
|
75
|
+
totalPruned++;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
const nextPath = [...path, nextState];
|
|
79
|
+
this.openList.push({ state: nextState, score: branchScore.score, path: nextPath }, branchScore.score);
|
|
80
|
+
}
|
|
81
|
+
iteration++;
|
|
82
|
+
}
|
|
83
|
+
// Return best found if no goal reached
|
|
84
|
+
const best = this.openList.pop();
|
|
85
|
+
if (best) {
|
|
86
|
+
return {
|
|
87
|
+
state: best.state,
|
|
88
|
+
score: best.score,
|
|
89
|
+
path: best.path,
|
|
90
|
+
iterations: iteration,
|
|
91
|
+
pruned: totalPruned,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// Return initial if nothing better found
|
|
95
|
+
return {
|
|
96
|
+
state: initial,
|
|
97
|
+
score: 0,
|
|
98
|
+
path: [initial],
|
|
99
|
+
iterations: iteration,
|
|
100
|
+
pruned: totalPruned,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get open list size
|
|
105
|
+
*/
|
|
106
|
+
getOpenListSize() {
|
|
107
|
+
return this.openList.size();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=BestFirstSearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BestFirstSearch.js","sourceRoot":"","sources":["../../src/search/BestFirstSearch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Priority Queue
|
|
3
|
+
* @module @nahisaho/musubix-neural-search
|
|
4
|
+
* @description Max-heap priority queue for search
|
|
5
|
+
*/
|
|
6
|
+
import type { IPriorityQueue } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Max-heap priority queue implementation
|
|
9
|
+
*/
|
|
10
|
+
export declare class PriorityQueue<T> implements IPriorityQueue<T> {
|
|
11
|
+
private heap;
|
|
12
|
+
constructor();
|
|
13
|
+
/**
|
|
14
|
+
* Add item with priority
|
|
15
|
+
*/
|
|
16
|
+
push(item: T, priority: number): void;
|
|
17
|
+
/**
|
|
18
|
+
* Remove and return highest priority item
|
|
19
|
+
*/
|
|
20
|
+
pop(): T | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Peek at highest priority item
|
|
23
|
+
*/
|
|
24
|
+
peek(): T | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Get queue size
|
|
27
|
+
*/
|
|
28
|
+
size(): number;
|
|
29
|
+
/**
|
|
30
|
+
* Check if empty
|
|
31
|
+
*/
|
|
32
|
+
isEmpty(): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Clear the queue
|
|
35
|
+
*/
|
|
36
|
+
clear(): void;
|
|
37
|
+
/**
|
|
38
|
+
* Get all items sorted by priority
|
|
39
|
+
*/
|
|
40
|
+
toArray(): T[];
|
|
41
|
+
/**
|
|
42
|
+
* Bubble up the element at index
|
|
43
|
+
*/
|
|
44
|
+
private bubbleUp;
|
|
45
|
+
/**
|
|
46
|
+
* Bubble down the element at index
|
|
47
|
+
*/
|
|
48
|
+
private bubbleDown;
|
|
49
|
+
/**
|
|
50
|
+
* Swap two elements
|
|
51
|
+
*/
|
|
52
|
+
private swap;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=PriorityQueue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PriorityQueue.d.ts","sourceRoot":"","sources":["../../src/search/PriorityQueue.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,aAAa,CAAC;AAEhE;;GAEG;AACH,qBAAa,aAAa,CAAC,CAAC,CAAE,YAAW,cAAc,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAoB;;IAMhC;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKrC;;OAEG;IACH,GAAG,IAAI,CAAC,GAAG,SAAS;IAgBpB;;OAEG;IACH,IAAI,IAAI,CAAC,GAAG,SAAS;IAIrB;;OAEG;IACH,IAAI,IAAI,MAAM;IAId;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,OAAO,IAAI,CAAC,EAAE;IAMd;;OAEG;IACH,OAAO,CAAC,QAAQ;IAWhB;;OAEG;IACH,OAAO,CAAC,UAAU;IA+BlB;;OAEG;IACH,OAAO,CAAC,IAAI;CAKb"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Priority Queue
|
|
3
|
+
* @module @nahisaho/musubix-neural-search
|
|
4
|
+
* @description Max-heap priority queue for search
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Max-heap priority queue implementation
|
|
8
|
+
*/
|
|
9
|
+
export class PriorityQueue {
|
|
10
|
+
heap;
|
|
11
|
+
constructor() {
|
|
12
|
+
this.heap = [];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Add item with priority
|
|
16
|
+
*/
|
|
17
|
+
push(item, priority) {
|
|
18
|
+
this.heap.push({ item, priority });
|
|
19
|
+
this.bubbleUp(this.heap.length - 1);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Remove and return highest priority item
|
|
23
|
+
*/
|
|
24
|
+
pop() {
|
|
25
|
+
if (this.heap.length === 0) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
const top = this.heap[0];
|
|
29
|
+
const last = this.heap.pop();
|
|
30
|
+
if (this.heap.length > 0 && last) {
|
|
31
|
+
this.heap[0] = last;
|
|
32
|
+
this.bubbleDown(0);
|
|
33
|
+
}
|
|
34
|
+
return top.item;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Peek at highest priority item
|
|
38
|
+
*/
|
|
39
|
+
peek() {
|
|
40
|
+
return this.heap[0]?.item;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get queue size
|
|
44
|
+
*/
|
|
45
|
+
size() {
|
|
46
|
+
return this.heap.length;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Check if empty
|
|
50
|
+
*/
|
|
51
|
+
isEmpty() {
|
|
52
|
+
return this.heap.length === 0;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Clear the queue
|
|
56
|
+
*/
|
|
57
|
+
clear() {
|
|
58
|
+
this.heap = [];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get all items sorted by priority
|
|
62
|
+
*/
|
|
63
|
+
toArray() {
|
|
64
|
+
return [...this.heap]
|
|
65
|
+
.sort((a, b) => b.priority - a.priority)
|
|
66
|
+
.map((item) => item.item);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Bubble up the element at index
|
|
70
|
+
*/
|
|
71
|
+
bubbleUp(index) {
|
|
72
|
+
while (index > 0) {
|
|
73
|
+
const parentIdx = Math.floor((index - 1) / 2);
|
|
74
|
+
if (this.heap[parentIdx].priority >= this.heap[index].priority) {
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
this.swap(parentIdx, index);
|
|
78
|
+
index = parentIdx;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Bubble down the element at index
|
|
83
|
+
*/
|
|
84
|
+
bubbleDown(index) {
|
|
85
|
+
const length = this.heap.length;
|
|
86
|
+
while (true) {
|
|
87
|
+
const leftIdx = 2 * index + 1;
|
|
88
|
+
const rightIdx = 2 * index + 2;
|
|
89
|
+
let largestIdx = index;
|
|
90
|
+
if (leftIdx < length &&
|
|
91
|
+
this.heap[leftIdx].priority > this.heap[largestIdx].priority) {
|
|
92
|
+
largestIdx = leftIdx;
|
|
93
|
+
}
|
|
94
|
+
if (rightIdx < length &&
|
|
95
|
+
this.heap[rightIdx].priority > this.heap[largestIdx].priority) {
|
|
96
|
+
largestIdx = rightIdx;
|
|
97
|
+
}
|
|
98
|
+
if (largestIdx === index) {
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
this.swap(index, largestIdx);
|
|
102
|
+
index = largestIdx;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Swap two elements
|
|
107
|
+
*/
|
|
108
|
+
swap(i, j) {
|
|
109
|
+
const temp = this.heap[i];
|
|
110
|
+
this.heap[i] = this.heap[j];
|
|
111
|
+
this.heap[j] = temp;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=PriorityQueue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PriorityQueue.js","sourceRoot":"","sources":["../../src/search/PriorityQueue.ts"],"names":[],"mappings":"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"}
|