@nahisaho/musubix-library-learner 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 +117 -0
- package/dist/LibraryLearner.d.ts +36 -0
- package/dist/LibraryLearner.d.ts.map +1 -0
- package/dist/LibraryLearner.js +217 -0
- package/dist/LibraryLearner.js.map +1 -0
- package/dist/abstraction/Abstractor.d.ts +29 -0
- package/dist/abstraction/Abstractor.d.ts.map +1 -0
- package/dist/abstraction/Abstractor.js +290 -0
- package/dist/abstraction/Abstractor.js.map +1 -0
- package/dist/abstraction/PatternMiner.d.ts +23 -0
- package/dist/abstraction/PatternMiner.d.ts.map +1 -0
- package/dist/abstraction/PatternMiner.js +263 -0
- package/dist/abstraction/PatternMiner.js.map +1 -0
- package/dist/abstraction/TypeAnalyzer.d.ts +27 -0
- package/dist/abstraction/TypeAnalyzer.d.ts.map +1 -0
- package/dist/abstraction/TypeAnalyzer.js +239 -0
- package/dist/abstraction/TypeAnalyzer.js.map +1 -0
- package/dist/abstraction/index.d.ts +10 -0
- package/dist/abstraction/index.d.ts.map +1 -0
- package/dist/abstraction/index.js +7 -0
- package/dist/abstraction/index.js.map +1 -0
- package/dist/egraph/EGraph.d.ts +29 -0
- package/dist/egraph/EGraph.d.ts.map +1 -0
- package/dist/egraph/EGraph.js +86 -0
- package/dist/egraph/EGraph.js.map +1 -0
- package/dist/egraph/EGraphBuilder.d.ts +24 -0
- package/dist/egraph/EGraphBuilder.d.ts.map +1 -0
- package/dist/egraph/EGraphBuilder.js +37 -0
- package/dist/egraph/EGraphBuilder.js.map +1 -0
- package/dist/egraph/Extractor.d.ts +24 -0
- package/dist/egraph/Extractor.d.ts.map +1 -0
- package/dist/egraph/Extractor.js +61 -0
- package/dist/egraph/Extractor.js.map +1 -0
- package/dist/egraph/index.d.ts +10 -0
- package/dist/egraph/index.d.ts.map +1 -0
- package/dist/egraph/index.js +7 -0
- package/dist/egraph/index.js.map +1 -0
- package/dist/errors.d.ts +66 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +99 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/library/Consolidator.d.ts +26 -0
- package/dist/library/Consolidator.d.ts.map +1 -0
- package/dist/library/Consolidator.js +54 -0
- package/dist/library/Consolidator.js.map +1 -0
- package/dist/library/LibraryStore.d.ts +33 -0
- package/dist/library/LibraryStore.d.ts.map +1 -0
- package/dist/library/LibraryStore.js +61 -0
- package/dist/library/LibraryStore.js.map +1 -0
- package/dist/library/Pruner.d.ts +24 -0
- package/dist/library/Pruner.d.ts.map +1 -0
- package/dist/library/Pruner.js +41 -0
- package/dist/library/Pruner.js.map +1 -0
- package/dist/library/index.d.ts +10 -0
- package/dist/library/index.d.ts.map +1 -0
- package/dist/library/index.js +7 -0
- package/dist/library/index.js.map +1 -0
- package/dist/types.d.ts +365 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeAnalyzer - Type-directed search and analysis
|
|
3
|
+
*
|
|
4
|
+
* REQ-LL-003: 型指向探索
|
|
5
|
+
* DES-PHASE2-001: Abstraction Engine / TypeAnalyzer
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Default TypeAnalyzer implementation
|
|
9
|
+
*/
|
|
10
|
+
class TypeAnalyzerImpl {
|
|
11
|
+
isCompatible(source, target) {
|
|
12
|
+
// Same kind check
|
|
13
|
+
if (source.kind !== target.kind) {
|
|
14
|
+
// Special cases
|
|
15
|
+
if (target.kind === 'union' && target.members) {
|
|
16
|
+
return target.members.some((m) => this.isCompatible(source, m));
|
|
17
|
+
}
|
|
18
|
+
if (source.kind === 'primitive' && source.name === 'any') {
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
if (target.kind === 'primitive' && target.name === 'any') {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
// unknown is compatible with anything (top type)
|
|
25
|
+
if (source.kind === 'primitive' && source.name === 'unknown') {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
if (target.kind === 'primitive' && target.name === 'unknown') {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
switch (source.kind) {
|
|
34
|
+
case 'primitive':
|
|
35
|
+
return source.name === target.name ||
|
|
36
|
+
target.name === 'any' ||
|
|
37
|
+
source.name === 'any' ||
|
|
38
|
+
source.name === 'unknown' ||
|
|
39
|
+
target.name === 'unknown';
|
|
40
|
+
case 'function':
|
|
41
|
+
return this.isFunctionCompatible(source, target);
|
|
42
|
+
case 'array':
|
|
43
|
+
return this.isCompatible(source.elementType ?? { kind: 'primitive', name: 'unknown' }, target.elementType ?? { kind: 'primitive', name: 'unknown' });
|
|
44
|
+
case 'object':
|
|
45
|
+
return this.isObjectCompatible(source, target);
|
|
46
|
+
case 'union':
|
|
47
|
+
return this.isUnionCompatible(source, target);
|
|
48
|
+
case 'intersection':
|
|
49
|
+
return this.isIntersectionCompatible(source, target);
|
|
50
|
+
case 'generic':
|
|
51
|
+
// Generics match if they have the same type parameters
|
|
52
|
+
return JSON.stringify(source.typeParams) === JSON.stringify(target.typeParams);
|
|
53
|
+
default:
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
filterByType(candidates, expectedType) {
|
|
58
|
+
return candidates.filter((candidate) => {
|
|
59
|
+
const candidateType = this.inferPatternType(candidate);
|
|
60
|
+
return this.isCompatible(candidateType, expectedType);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
scoreByTypeMatch(candidate, context) {
|
|
64
|
+
const candidateType = this.inferPatternType(candidate);
|
|
65
|
+
let score = 0;
|
|
66
|
+
// Check compatibility with context variables
|
|
67
|
+
for (const [name, type] of context.variables) {
|
|
68
|
+
if (this.usesVariable(candidate, name)) {
|
|
69
|
+
if (this.isCompatible(candidateType, type)) {
|
|
70
|
+
score += 1;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Check compatibility with context functions
|
|
75
|
+
for (const [name, type] of context.functions) {
|
|
76
|
+
if (this.usesFunction(candidate, name)) {
|
|
77
|
+
if (this.isCompatible(candidateType, type)) {
|
|
78
|
+
score += 1;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return score;
|
|
83
|
+
}
|
|
84
|
+
inferType(expression) {
|
|
85
|
+
if (expression === null) {
|
|
86
|
+
return { kind: 'primitive', name: 'null' };
|
|
87
|
+
}
|
|
88
|
+
if (expression === undefined) {
|
|
89
|
+
return { kind: 'primitive', name: 'undefined' };
|
|
90
|
+
}
|
|
91
|
+
switch (typeof expression) {
|
|
92
|
+
case 'string':
|
|
93
|
+
return { kind: 'primitive', name: 'string' };
|
|
94
|
+
case 'number':
|
|
95
|
+
return { kind: 'primitive', name: 'number' };
|
|
96
|
+
case 'boolean':
|
|
97
|
+
return { kind: 'primitive', name: 'boolean' };
|
|
98
|
+
case 'function':
|
|
99
|
+
return { kind: 'function', paramTypes: [], returnType: { kind: 'primitive', name: 'unknown' } };
|
|
100
|
+
case 'object':
|
|
101
|
+
if (Array.isArray(expression)) {
|
|
102
|
+
const elementType = expression.length > 0
|
|
103
|
+
? this.inferType(expression[0])
|
|
104
|
+
: { kind: 'primitive', name: 'unknown' };
|
|
105
|
+
return { kind: 'array', elementType };
|
|
106
|
+
}
|
|
107
|
+
return this.inferObjectType(expression);
|
|
108
|
+
default:
|
|
109
|
+
return { kind: 'primitive', name: 'unknown' };
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
isSubtype(sub, sup) {
|
|
113
|
+
// any is supertype of everything
|
|
114
|
+
if (sup.kind === 'primitive' && sup.name === 'any') {
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
// never is subtype of everything
|
|
118
|
+
if (sub.kind === 'primitive' && sub.name === 'never') {
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
// unknown is not subtype of anything except any and unknown
|
|
122
|
+
if (sub.kind === 'primitive' && sub.name === 'unknown') {
|
|
123
|
+
return sup.kind === 'primitive' && (sup.name === 'any' || sup.name === 'unknown');
|
|
124
|
+
}
|
|
125
|
+
return this.isCompatible(sub, sup);
|
|
126
|
+
}
|
|
127
|
+
// =========================================================================
|
|
128
|
+
// Private methods
|
|
129
|
+
// =========================================================================
|
|
130
|
+
isFunctionCompatible(source, target) {
|
|
131
|
+
// Contravariant parameter types, covariant return type
|
|
132
|
+
const sourceParams = source.paramTypes ?? [];
|
|
133
|
+
const targetParams = target.paramTypes ?? [];
|
|
134
|
+
// Target can have fewer parameters (extra params are ignored)
|
|
135
|
+
if (targetParams.length > sourceParams.length) {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
// Check parameter types (contravariant)
|
|
139
|
+
for (let i = 0; i < targetParams.length; i++) {
|
|
140
|
+
if (!this.isCompatible(targetParams[i], sourceParams[i])) {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Check return type (covariant)
|
|
145
|
+
const sourceReturn = source.returnType ?? { kind: 'primitive', name: 'void' };
|
|
146
|
+
const targetReturn = target.returnType ?? { kind: 'primitive', name: 'void' };
|
|
147
|
+
return this.isCompatible(sourceReturn, targetReturn);
|
|
148
|
+
}
|
|
149
|
+
isObjectCompatible(source, target) {
|
|
150
|
+
const sourceProps = source.properties ?? {};
|
|
151
|
+
const targetProps = target.properties ?? {};
|
|
152
|
+
// Source must have all properties that target requires
|
|
153
|
+
for (const [key, targetType] of Object.entries(targetProps)) {
|
|
154
|
+
const sourceType = sourceProps[key];
|
|
155
|
+
if (!sourceType) {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
if (!this.isCompatible(sourceType, targetType)) {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
isUnionCompatible(source, target) {
|
|
165
|
+
const sourceMembers = source.members ?? [];
|
|
166
|
+
const targetMembers = target.members ?? [];
|
|
167
|
+
// Every source member must be compatible with some target member
|
|
168
|
+
return sourceMembers.every((sm) => targetMembers.some((tm) => this.isCompatible(sm, tm)));
|
|
169
|
+
}
|
|
170
|
+
isIntersectionCompatible(source, target) {
|
|
171
|
+
const sourceMembers = source.members ?? [];
|
|
172
|
+
const targetMembers = target.members ?? [];
|
|
173
|
+
// Source must satisfy all target intersection members
|
|
174
|
+
return targetMembers.every((tm) => sourceMembers.some((sm) => this.isCompatible(sm, tm)));
|
|
175
|
+
}
|
|
176
|
+
inferPatternType(candidate) {
|
|
177
|
+
// Infer type from pattern AST
|
|
178
|
+
const ast = candidate.ast;
|
|
179
|
+
switch (ast.type) {
|
|
180
|
+
case 'Declaration':
|
|
181
|
+
return { kind: 'primitive', name: 'void' };
|
|
182
|
+
case 'ReturnStatement':
|
|
183
|
+
return { kind: 'primitive', name: 'unknown' };
|
|
184
|
+
case 'IfStatement':
|
|
185
|
+
case 'ForLoop':
|
|
186
|
+
case 'WhileLoop':
|
|
187
|
+
return { kind: 'primitive', name: 'void' };
|
|
188
|
+
case 'Expression':
|
|
189
|
+
return this.inferType(ast.value);
|
|
190
|
+
case 'NumberLiteral':
|
|
191
|
+
return { kind: 'primitive', name: 'number' };
|
|
192
|
+
case 'StringLiteral':
|
|
193
|
+
return { kind: 'primitive', name: 'string' };
|
|
194
|
+
case 'BooleanLiteral':
|
|
195
|
+
return { kind: 'primitive', name: 'boolean' };
|
|
196
|
+
case 'ArrayExpression':
|
|
197
|
+
return { kind: 'array', elementType: { kind: 'primitive', name: 'unknown' } };
|
|
198
|
+
case 'Identifier':
|
|
199
|
+
return { kind: 'primitive', name: 'unknown' };
|
|
200
|
+
default:
|
|
201
|
+
return { kind: 'primitive', name: 'unknown' };
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
inferObjectType(obj) {
|
|
205
|
+
const properties = {};
|
|
206
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
207
|
+
properties[key] = this.inferType(value);
|
|
208
|
+
}
|
|
209
|
+
return { kind: 'object', properties };
|
|
210
|
+
}
|
|
211
|
+
usesVariable(candidate, name) {
|
|
212
|
+
// Check if the pattern uses a variable with the given name
|
|
213
|
+
return this.astContains(candidate.ast, name);
|
|
214
|
+
}
|
|
215
|
+
usesFunction(candidate, name) {
|
|
216
|
+
// Check if the pattern calls a function with the given name
|
|
217
|
+
return this.astContains(candidate.ast, name);
|
|
218
|
+
}
|
|
219
|
+
astContains(node, name) {
|
|
220
|
+
if (typeof node !== 'object' || node === null) {
|
|
221
|
+
return node === name;
|
|
222
|
+
}
|
|
223
|
+
const obj = node;
|
|
224
|
+
if (obj.name === name || obj.value === name) {
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
if (Array.isArray(obj.children)) {
|
|
228
|
+
return obj.children.some((child) => this.astContains(child, name));
|
|
229
|
+
}
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Factory function to create a TypeAnalyzer
|
|
235
|
+
*/
|
|
236
|
+
export function createTypeAnalyzer() {
|
|
237
|
+
return new TypeAnalyzerImpl();
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=TypeAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TypeAnalyzer.js","sourceRoot":"","sources":["../../src/abstraction/TypeAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA4BH;;GAEG;AACH,MAAM,gBAAgB;IACpB,YAAY,CAAC,MAAqB,EAAE,MAAqB;QACvD,kBAAkB;QAClB,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;YAChC,gBAAgB;YAChB,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC9C,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBACzD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBACzD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,iDAAiD;YACjD,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC7D,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC7D,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,WAAW;gBACd,OAAO,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI;oBAC3B,MAAM,CAAC,IAAI,KAAK,KAAK;oBACrB,MAAM,CAAC,IAAI,KAAK,KAAK;oBACrB,MAAM,CAAC,IAAI,KAAK,SAAS;oBACzB,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC;YAEnC,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAEnD,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,YAAY,CACtB,MAAM,CAAC,WAAW,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,EAC5D,MAAM,CAAC,WAAW,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAC7D,CAAC;YAEJ,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAEjD,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAEhD,KAAK,cAAc;gBACjB,OAAO,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAEvD,KAAK,SAAS;gBACZ,uDAAuD;gBACvD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAEjF;gBACE,OAAO,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;IAED,YAAY,CAAC,UAA8B,EAAE,YAA2B;QACtE,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE;YACrC,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB,CAAC,SAA2B,EAAE,OAAoB;QAChE,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,6CAA6C;QAC7C,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YAC7C,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC;gBACvC,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC;oBAC3C,KAAK,IAAI,CAAC,CAAC;gBACb,CAAC;YACH,CAAC;QACH,CAAC;QAED,6CAA6C;QAC7C,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YAC7C,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC;gBACvC,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC;oBAC3C,KAAK,IAAI,CAAC,CAAC;gBACb,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,SAAS,CAAC,UAAmB;QAC3B,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC7C,CAAC;QAED,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QAClD,CAAC;QAED,QAAQ,OAAO,UAAU,EAAE,CAAC;YAC1B,KAAK,QAAQ;gBACX,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YAC/C,KAAK,QAAQ;gBACX,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YAC/C,KAAK,SAAS;gBACZ,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YAChD,KAAK,UAAU;gBACb,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;YAClG,KAAK,QAAQ;gBACX,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC9B,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC;wBACvC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;wBAC/B,CAAC,CAAC,EAAE,IAAI,EAAE,WAAoB,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;oBACpD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;gBACxC,CAAC;gBACD,OAAO,IAAI,CAAC,eAAe,CAAC,UAAqC,CAAC,CAAC;YACrE;gBACE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IAED,SAAS,CAAC,GAAkB,EAAE,GAAkB;QAC9C,iCAAiC;QACjC,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACnD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,iCAAiC;QACjC,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,4DAA4D;QAC5D,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACvD,OAAO,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,4EAA4E;IAC5E,kBAAkB;IAClB,4EAA4E;IAEpE,oBAAoB,CAAC,MAAqB,EAAE,MAAqB;QACvE,uDAAuD;QACvD,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;QAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;QAE7C,8DAA8D;QAC9D,IAAI,YAAY,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,wCAAwC;QACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC9E,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAE9E,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACvD,CAAC;IAEO,kBAAkB,CAAC,MAAqB,EAAE,MAAqB;QACrE,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;QAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;QAE5C,uDAAuD;QACvD,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5D,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC;gBAC/C,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,iBAAiB,CAAC,MAAqB,EAAE,MAAqB;QACpE,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QAC3C,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QAE3C,iEAAiE;QACjE,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAChC,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CACtD,CAAC;IACJ,CAAC;IAEO,wBAAwB,CAAC,MAAqB,EAAE,MAAqB;QAC3E,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QAC3C,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QAE3C,sDAAsD;QACtD,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAChC,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CACtD,CAAC;IACJ,CAAC;IAEO,gBAAgB,CAAC,SAA2B;QAClD,8BAA8B;QAC9B,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;QAE1B,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,aAAa;gBAChB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAC7C,KAAK,iBAAiB;gBACpB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YAChD,KAAK,aAAa,CAAC;YACnB,KAAK,SAAS,CAAC;YACf,KAAK,WAAW;gBACd,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAC7C,KAAK,YAAY;gBACf,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnC,KAAK,eAAe;gBAClB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YAC/C,KAAK,eAAe;gBAClB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YAC/C,KAAK,gBAAgB;gBACnB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YAChD,KAAK,iBAAiB;gBACpB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;YAChF,KAAK,YAAY;gBACf,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YAChD;gBACE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,GAA4B;QAClD,MAAM,UAAU,GAAkC,EAAE,CAAC;QAErD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IACxC,CAAC;IAEO,YAAY,CAAC,SAA2B,EAAE,IAAY;QAC5D,2DAA2D;QAC3D,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;IAEO,YAAY,CAAC,SAA2B,EAAE,IAAY;QAC5D,4DAA4D;QAC5D,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;IAEO,WAAW,CAAC,IAAa,EAAE,IAAY;QAC7C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9C,OAAO,IAAI,KAAK,IAAI,CAAC;QACvB,CAAC;QAED,MAAM,GAAG,GAAG,IAA+B,CAAC;QAE5C,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QACrE,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,gBAAgB,EAAE,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstraction Engine exports
|
|
3
|
+
*/
|
|
4
|
+
export type { PatternMiner } from './PatternMiner.js';
|
|
5
|
+
export { createPatternMiner } from './PatternMiner.js';
|
|
6
|
+
export type { Abstractor } from './Abstractor.js';
|
|
7
|
+
export { createAbstractor } from './Abstractor.js';
|
|
8
|
+
export type { TypeAnalyzer } from './TypeAnalyzer.js';
|
|
9
|
+
export { createTypeAnalyzer } from './TypeAnalyzer.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/abstraction/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/abstraction/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EGraph - Equality Graph data structure
|
|
3
|
+
*
|
|
4
|
+
* REQ-LL-004: E-graph最適化
|
|
5
|
+
* DES-PHASE2-001: E-Graph Optimizer / EGraph
|
|
6
|
+
*
|
|
7
|
+
* @stub This is a stub implementation. Full implementation in M3.
|
|
8
|
+
*/
|
|
9
|
+
import type { ENode, EClass, EClassId } from '../types.js';
|
|
10
|
+
/**
|
|
11
|
+
* EGraph interface
|
|
12
|
+
*/
|
|
13
|
+
export interface EGraph {
|
|
14
|
+
/** Add a node to the e-graph */
|
|
15
|
+
add(node: ENode): EClassId;
|
|
16
|
+
/** Merge two e-classes */
|
|
17
|
+
merge(id1: EClassId, id2: EClassId): EClassId;
|
|
18
|
+
/** Get an e-class by ID */
|
|
19
|
+
getEClass(id: EClassId): EClass | undefined;
|
|
20
|
+
/** Get all e-classes */
|
|
21
|
+
getAllClasses(): EClass[];
|
|
22
|
+
/** Find the canonical ID for an e-class */
|
|
23
|
+
find(id: EClassId): EClassId;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Factory function to create an EGraph
|
|
27
|
+
*/
|
|
28
|
+
export declare function createEGraph(): EGraph;
|
|
29
|
+
//# sourceMappingURL=EGraph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EGraph.d.ts","sourceRoot":"","sources":["../../src/egraph/EGraph.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,gCAAgC;IAChC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,QAAQ,CAAC;IAE3B,0BAA0B;IAC1B,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAE9C,2BAA2B;IAC3B,SAAS,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;IAE5C,wBAAwB;IACxB,aAAa,IAAI,MAAM,EAAE,CAAC;IAE1B,2CAA2C;IAC3C,IAAI,CAAC,EAAE,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC9B;AAqFD;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EGraph - Equality Graph data structure
|
|
3
|
+
*
|
|
4
|
+
* REQ-LL-004: E-graph最適化
|
|
5
|
+
* DES-PHASE2-001: E-Graph Optimizer / EGraph
|
|
6
|
+
*
|
|
7
|
+
* @stub This is a stub implementation. Full implementation in M3.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Default EGraph implementation (stub)
|
|
11
|
+
*/
|
|
12
|
+
class EGraphImpl {
|
|
13
|
+
classes = new Map();
|
|
14
|
+
unionFind = new Map();
|
|
15
|
+
nextId = 0;
|
|
16
|
+
add(node) {
|
|
17
|
+
const id = this.nextId++;
|
|
18
|
+
const eclass = {
|
|
19
|
+
id,
|
|
20
|
+
nodes: [node],
|
|
21
|
+
parents: new Set(),
|
|
22
|
+
};
|
|
23
|
+
this.classes.set(id, eclass);
|
|
24
|
+
this.unionFind.set(id, id);
|
|
25
|
+
return id;
|
|
26
|
+
}
|
|
27
|
+
merge(id1, id2) {
|
|
28
|
+
const root1 = this.find(id1);
|
|
29
|
+
const root2 = this.find(id2);
|
|
30
|
+
if (root1 === root2) {
|
|
31
|
+
return root1;
|
|
32
|
+
}
|
|
33
|
+
// Merge root2 into root1
|
|
34
|
+
const class1 = this.classes.get(root1);
|
|
35
|
+
const class2 = this.classes.get(root2);
|
|
36
|
+
if (class1 && class2) {
|
|
37
|
+
class1.nodes.push(...class2.nodes);
|
|
38
|
+
for (const parent of class2.parents) {
|
|
39
|
+
class1.parents.add(parent);
|
|
40
|
+
}
|
|
41
|
+
this.unionFind.set(root2, root1);
|
|
42
|
+
}
|
|
43
|
+
return root1;
|
|
44
|
+
}
|
|
45
|
+
getEClass(id) {
|
|
46
|
+
const root = this.find(id);
|
|
47
|
+
return this.classes.get(root);
|
|
48
|
+
}
|
|
49
|
+
getAllClasses() {
|
|
50
|
+
// Return only root classes
|
|
51
|
+
const roots = new Set();
|
|
52
|
+
for (const id of this.classes.keys()) {
|
|
53
|
+
roots.add(this.find(id));
|
|
54
|
+
}
|
|
55
|
+
return Array.from(roots).map((id) => this.classes.get(id)).filter(Boolean);
|
|
56
|
+
}
|
|
57
|
+
find(id) {
|
|
58
|
+
// Handle unregistered IDs
|
|
59
|
+
if (!this.unionFind.has(id)) {
|
|
60
|
+
return id;
|
|
61
|
+
}
|
|
62
|
+
let root = id;
|
|
63
|
+
let parent = this.unionFind.get(root);
|
|
64
|
+
while (parent !== undefined && parent !== root) {
|
|
65
|
+
root = parent;
|
|
66
|
+
parent = this.unionFind.get(root);
|
|
67
|
+
}
|
|
68
|
+
// Path compression
|
|
69
|
+
let current = id;
|
|
70
|
+
while (current !== root) {
|
|
71
|
+
const next = this.unionFind.get(current);
|
|
72
|
+
if (next === undefined)
|
|
73
|
+
break;
|
|
74
|
+
this.unionFind.set(current, root);
|
|
75
|
+
current = next;
|
|
76
|
+
}
|
|
77
|
+
return root;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Factory function to create an EGraph
|
|
82
|
+
*/
|
|
83
|
+
export function createEGraph() {
|
|
84
|
+
return new EGraphImpl();
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=EGraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EGraph.js","sourceRoot":"","sources":["../../src/egraph/EGraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EGraphBuilder - Build e-graphs from patterns
|
|
3
|
+
*
|
|
4
|
+
* REQ-LL-004: E-graph最適化
|
|
5
|
+
* DES-PHASE2-001: E-Graph Optimizer / EGraphBuilder
|
|
6
|
+
*
|
|
7
|
+
* @stub This is a stub implementation. Full implementation in M3.
|
|
8
|
+
*/
|
|
9
|
+
import type { LearnedPattern, EqualityRule } from '../types.js';
|
|
10
|
+
import type { EGraph } from './EGraph.js';
|
|
11
|
+
/**
|
|
12
|
+
* EGraphBuilder interface
|
|
13
|
+
*/
|
|
14
|
+
export interface EGraphBuilder {
|
|
15
|
+
/** Build an e-graph from patterns */
|
|
16
|
+
build(patterns: LearnedPattern[]): EGraph;
|
|
17
|
+
/** Apply rules until saturation */
|
|
18
|
+
saturate(graph: EGraph, rules: EqualityRule[]): EGraph;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Factory function to create an EGraphBuilder
|
|
22
|
+
*/
|
|
23
|
+
export declare function createEGraphBuilder(): EGraphBuilder;
|
|
24
|
+
//# sourceMappingURL=EGraphBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EGraphBuilder.d.ts","sourceRoot":"","sources":["../../src/egraph/EGraphBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;IAE1C,mCAAmC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;CACxD;AA2BD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAEnD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EGraphBuilder - Build e-graphs from patterns
|
|
3
|
+
*
|
|
4
|
+
* REQ-LL-004: E-graph最適化
|
|
5
|
+
* DES-PHASE2-001: E-Graph Optimizer / EGraphBuilder
|
|
6
|
+
*
|
|
7
|
+
* @stub This is a stub implementation. Full implementation in M3.
|
|
8
|
+
*/
|
|
9
|
+
import { createEGraph } from './EGraph.js';
|
|
10
|
+
/**
|
|
11
|
+
* Default EGraphBuilder implementation (stub)
|
|
12
|
+
*/
|
|
13
|
+
class EGraphBuilderImpl {
|
|
14
|
+
build(patterns) {
|
|
15
|
+
const graph = createEGraph();
|
|
16
|
+
for (const pattern of patterns) {
|
|
17
|
+
// Add pattern as a node
|
|
18
|
+
graph.add({
|
|
19
|
+
op: pattern.name,
|
|
20
|
+
children: [],
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return graph;
|
|
24
|
+
}
|
|
25
|
+
saturate(graph, _rules) {
|
|
26
|
+
// Stub: return graph unchanged
|
|
27
|
+
// Full implementation would apply rules until fixpoint
|
|
28
|
+
return graph;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Factory function to create an EGraphBuilder
|
|
33
|
+
*/
|
|
34
|
+
export function createEGraphBuilder() {
|
|
35
|
+
return new EGraphBuilderImpl();
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=EGraphBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EGraphBuilder.js","sourceRoot":"","sources":["../../src/egraph/EGraphBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAa3C;;GAEG;AACH,MAAM,iBAAiB;IACrB,KAAK,CAAC,QAA0B;QAC9B,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;QAE7B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,wBAAwB;YACxB,KAAK,CAAC,GAAG,CAAC;gBACR,EAAE,EAAE,OAAO,CAAC,IAAI;gBAChB,QAAQ,EAAE,EAAE;aACb,CAAC,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,QAAQ,CAAC,KAAa,EAAE,MAAsB;QAC5C,+BAA+B;QAC/B,uDAAuD;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,iBAAiB,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extractor - Extract optimal expressions from e-graphs
|
|
3
|
+
*
|
|
4
|
+
* REQ-LL-004: E-graph最適化
|
|
5
|
+
* DES-PHASE2-001: E-Graph Optimizer / Extractor
|
|
6
|
+
*
|
|
7
|
+
* @stub This is a stub implementation. Full implementation in M3.
|
|
8
|
+
*/
|
|
9
|
+
import type { EClassId, CostFunction, OptimalExpression } from '../types.js';
|
|
10
|
+
import type { EGraph } from './EGraph.js';
|
|
11
|
+
/**
|
|
12
|
+
* Extractor interface
|
|
13
|
+
*/
|
|
14
|
+
export interface Extractor {
|
|
15
|
+
/** Extract the optimal expression from an e-graph */
|
|
16
|
+
extract(graph: EGraph, costFn: CostFunction): OptimalExpression;
|
|
17
|
+
/** Extract from a specific e-class */
|
|
18
|
+
extractFromClass(graph: EGraph, classId: EClassId, costFn: CostFunction): OptimalExpression;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Factory function to create an Extractor
|
|
22
|
+
*/
|
|
23
|
+
export declare function createExtractor(): Extractor;
|
|
24
|
+
//# sourceMappingURL=Extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Extractor.d.ts","sourceRoot":"","sources":["../../src/egraph/Extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,qDAAqD;IACrD,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,iBAAiB,CAAC;IAEhE,sCAAsC;IACtC,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,GAAG,iBAAiB,CAAC;CAC7F;AAsDD;;GAEG;AACH,wBAAgB,eAAe,IAAI,SAAS,CAE3C"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extractor - Extract optimal expressions from e-graphs
|
|
3
|
+
*
|
|
4
|
+
* REQ-LL-004: E-graph最適化
|
|
5
|
+
* DES-PHASE2-001: E-Graph Optimizer / Extractor
|
|
6
|
+
*
|
|
7
|
+
* @stub This is a stub implementation. Full implementation in M3.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Default Extractor implementation (stub)
|
|
11
|
+
*/
|
|
12
|
+
class ExtractorImpl {
|
|
13
|
+
extract(graph, costFn) {
|
|
14
|
+
const classes = graph.getAllClasses();
|
|
15
|
+
if (classes.length === 0) {
|
|
16
|
+
return {
|
|
17
|
+
root: -1,
|
|
18
|
+
ast: { type: 'Empty' },
|
|
19
|
+
cost: Infinity,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
// Find the root (class with no parents)
|
|
23
|
+
const root = classes.find((c) => c.parents.size === 0) ?? classes[0];
|
|
24
|
+
return this.extractFromClass(graph, root.id, costFn);
|
|
25
|
+
}
|
|
26
|
+
extractFromClass(graph, classId, costFn) {
|
|
27
|
+
const eclass = graph.getEClass(classId);
|
|
28
|
+
if (!eclass || eclass.nodes.length === 0) {
|
|
29
|
+
return {
|
|
30
|
+
root: classId,
|
|
31
|
+
ast: { type: 'Empty' },
|
|
32
|
+
cost: Infinity,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// Find the lowest cost node
|
|
36
|
+
let bestNode = eclass.nodes[0];
|
|
37
|
+
let bestCost = costFn(bestNode, []);
|
|
38
|
+
for (const node of eclass.nodes) {
|
|
39
|
+
const cost = costFn(node, []);
|
|
40
|
+
if (cost < bestCost) {
|
|
41
|
+
bestCost = cost;
|
|
42
|
+
bestNode = node;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
root: classId,
|
|
47
|
+
ast: {
|
|
48
|
+
type: bestNode.op,
|
|
49
|
+
children: [],
|
|
50
|
+
},
|
|
51
|
+
cost: bestCost,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Factory function to create an Extractor
|
|
57
|
+
*/
|
|
58
|
+
export function createExtractor() {
|
|
59
|
+
return new ExtractorImpl();
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=Extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Extractor.js","sourceRoot":"","sources":["../../src/egraph/Extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAgBH;;GAEG;AACH,MAAM,aAAa;IACjB,OAAO,CAAC,KAAa,EAAE,MAAoB;QACzC,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,IAAI,EAAE,CAAC,CAAC;gBACR,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;gBACtB,IAAI,EAAE,QAAQ;aACf,CAAC;QACJ,CAAC;QAED,wCAAwC;QACxC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;IAED,gBAAgB,CAAC,KAAa,EAAE,OAAiB,EAAE,MAAoB;QACrE,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;gBACtB,IAAI,EAAE,QAAQ;aACf,CAAC;QACJ,CAAC;QAED,4BAA4B;QAC5B,IAAI,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAEpC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC9B,IAAI,IAAI,GAAG,QAAQ,EAAE,CAAC;gBACpB,QAAQ,GAAG,IAAI,CAAC;gBAChB,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;QACH,CAAC;QAED,OAAO;YACL,IAAI,EAAE,OAAO;YACb,GAAG,EAAE;gBACH,IAAI,EAAE,QAAQ,CAAC,EAAE;gBACjB,QAAQ,EAAE,EAAE;aACb;YACD,IAAI,EAAE,QAAQ;SACf,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,aAAa,EAAE,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E-Graph exports
|
|
3
|
+
*/
|
|
4
|
+
export type { EGraph } from './EGraph.js';
|
|
5
|
+
export { createEGraph } from './EGraph.js';
|
|
6
|
+
export type { EGraphBuilder } from './EGraphBuilder.js';
|
|
7
|
+
export { createEGraphBuilder } from './EGraphBuilder.js';
|
|
8
|
+
export type { Extractor } from './Extractor.js';
|
|
9
|
+
export { createExtractor } from './Extractor.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/egraph/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/egraph/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
|