@nahisaho/musubix-synthesis 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/EnhancedPBESynthesizer.d.ts +182 -0
  2. package/dist/EnhancedPBESynthesizer.d.ts.map +1 -0
  3. package/dist/EnhancedPBESynthesizer.js +266 -0
  4. package/dist/EnhancedPBESynthesizer.js.map +1 -0
  5. package/dist/analysis/ExampleAnalyzer.d.ts +81 -0
  6. package/dist/analysis/ExampleAnalyzer.d.ts.map +1 -0
  7. package/dist/analysis/ExampleAnalyzer.js +358 -0
  8. package/dist/analysis/ExampleAnalyzer.js.map +1 -0
  9. package/dist/analysis/index.d.ts +9 -0
  10. package/dist/analysis/index.d.ts.map +1 -0
  11. package/dist/analysis/index.js +8 -0
  12. package/dist/analysis/index.js.map +1 -0
  13. package/dist/dsl/DSLExtender.d.ts +79 -0
  14. package/dist/dsl/DSLExtender.d.ts.map +1 -0
  15. package/dist/dsl/DSLExtender.js +312 -0
  16. package/dist/dsl/DSLExtender.js.map +1 -0
  17. package/dist/dsl/index.d.ts +2 -0
  18. package/dist/dsl/index.d.ts.map +1 -1
  19. package/dist/dsl/index.js +2 -0
  20. package/dist/dsl/index.js.map +1 -1
  21. package/dist/explain/ExplanationGenerator.d.ts +91 -0
  22. package/dist/explain/ExplanationGenerator.d.ts.map +1 -0
  23. package/dist/explain/ExplanationGenerator.js +236 -0
  24. package/dist/explain/ExplanationGenerator.js.map +1 -0
  25. package/dist/explain/index.d.ts +7 -0
  26. package/dist/explain/index.d.ts.map +1 -0
  27. package/dist/explain/index.js +7 -0
  28. package/dist/explain/index.js.map +1 -0
  29. package/dist/index.d.ts +14 -1
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +13 -1
  32. package/dist/index.js.map +1 -1
  33. package/dist/meta/MetaLearningEngine.d.ts +106 -0
  34. package/dist/meta/MetaLearningEngine.d.ts.map +1 -0
  35. package/dist/meta/MetaLearningEngine.js +196 -0
  36. package/dist/meta/MetaLearningEngine.js.map +1 -0
  37. package/dist/meta/__tests__/MetaLearningEngine.test.d.ts +8 -0
  38. package/dist/meta/__tests__/MetaLearningEngine.test.d.ts.map +1 -0
  39. package/dist/meta/__tests__/MetaLearningEngine.test.js +244 -0
  40. package/dist/meta/__tests__/MetaLearningEngine.test.js.map +1 -0
  41. package/dist/meta/index.d.ts +9 -0
  42. package/dist/meta/index.d.ts.map +1 -0
  43. package/dist/meta/index.js +8 -0
  44. package/dist/meta/index.js.map +1 -0
  45. package/dist/versionspace/EnhancedVersionSpace.d.ts +170 -0
  46. package/dist/versionspace/EnhancedVersionSpace.d.ts.map +1 -0
  47. package/dist/versionspace/EnhancedVersionSpace.js +265 -0
  48. package/dist/versionspace/EnhancedVersionSpace.js.map +1 -0
  49. package/dist/versionspace/index.d.ts +7 -0
  50. package/dist/versionspace/index.d.ts.map +1 -0
  51. package/dist/versionspace/index.js +6 -0
  52. package/dist/versionspace/index.js.map +1 -0
  53. package/dist/witness/EnhancedWitnessEngine.d.ts +108 -0
  54. package/dist/witness/EnhancedWitnessEngine.d.ts.map +1 -0
  55. package/dist/witness/EnhancedWitnessEngine.js +555 -0
  56. package/dist/witness/EnhancedWitnessEngine.js.map +1 -0
  57. package/dist/witness/index.d.ts +6 -0
  58. package/dist/witness/index.d.ts.map +1 -0
  59. package/dist/witness/index.js +6 -0
  60. package/dist/witness/index.js.map +1 -0
  61. package/package.json +1 -1
@@ -0,0 +1,312 @@
1
+ /**
2
+ * DSLExtender
3
+ * @module @nahisaho/musubix-synthesis
4
+ * @description DSL grammar extension capabilities
5
+ * Traces to: TSK-SY-104, DES-SY-104, REQ-SY-104
6
+ */
7
+ /**
8
+ * Default configuration
9
+ */
10
+ const DEFAULT_CONFIG = {
11
+ maxSuggestions: 5,
12
+ minConfidence: 0.5,
13
+ };
14
+ /**
15
+ * Known operator database
16
+ */
17
+ const KNOWN_OPERATORS = {
18
+ string: [
19
+ 'uppercase',
20
+ 'lowercase',
21
+ 'concat',
22
+ 'substring',
23
+ 'trim',
24
+ 'split',
25
+ 'join',
26
+ 'replace',
27
+ 'charAt',
28
+ 'length',
29
+ ],
30
+ array: [
31
+ 'map',
32
+ 'filter',
33
+ 'reduce',
34
+ 'sum',
35
+ 'length',
36
+ 'head',
37
+ 'tail',
38
+ 'reverse',
39
+ 'sort',
40
+ 'flatten',
41
+ ],
42
+ number: [
43
+ 'add',
44
+ 'subtract',
45
+ 'multiply',
46
+ 'divide',
47
+ 'modulo',
48
+ 'abs',
49
+ 'floor',
50
+ 'ceil',
51
+ 'round',
52
+ ],
53
+ conversion: [
54
+ 'toString',
55
+ 'toNumber',
56
+ 'toBoolean',
57
+ 'parseFloat',
58
+ 'parseInt',
59
+ ],
60
+ };
61
+ const TRANSFORMATION_PATTERNS = [
62
+ {
63
+ pattern: (i, o) => typeof i === 'string' && typeof o === 'string' &&
64
+ o === i.toUpperCase(),
65
+ operator: 'uppercase',
66
+ signature: 'string -> string',
67
+ confidence: 0.95,
68
+ },
69
+ {
70
+ pattern: (i, o) => typeof i === 'string' && typeof o === 'string' &&
71
+ o === i.toLowerCase(),
72
+ operator: 'lowercase',
73
+ signature: 'string -> string',
74
+ confidence: 0.95,
75
+ },
76
+ {
77
+ pattern: (i, o) => typeof i === 'string' && typeof o === 'string' &&
78
+ isTitleCase(i, o),
79
+ operator: 'titleCase',
80
+ signature: 'string -> string',
81
+ confidence: 0.85,
82
+ },
83
+ {
84
+ pattern: (i, o) => Array.isArray(i) && typeof o === 'number' &&
85
+ i.reduce((a, b) => a + b, 0) === o,
86
+ operator: 'sum',
87
+ signature: 'number[] -> number',
88
+ confidence: 0.9,
89
+ },
90
+ {
91
+ pattern: (i, o) => typeof i === 'string' && typeof o === 'number' &&
92
+ Number(i) === o,
93
+ operator: 'toNumber',
94
+ signature: 'string -> number',
95
+ confidence: 0.9,
96
+ },
97
+ {
98
+ pattern: (i, o) => typeof i === 'number' && typeof o === 'string' &&
99
+ String(i) === o,
100
+ operator: 'toString',
101
+ signature: 'number -> string',
102
+ confidence: 0.9,
103
+ },
104
+ {
105
+ pattern: (i, o) => Array.isArray(i) && Array.isArray(o) &&
106
+ i.length === o.length,
107
+ operator: 'map',
108
+ signature: '(a -> b) -> [a] -> [b]',
109
+ confidence: 0.7,
110
+ },
111
+ ];
112
+ /**
113
+ * Check if output is title case of input
114
+ */
115
+ function isTitleCase(input, output) {
116
+ const expected = input.split(' ')
117
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
118
+ .join(' ');
119
+ return output === expected;
120
+ }
121
+ /**
122
+ * Default DSL extender implementation
123
+ */
124
+ class DefaultDSLExtender {
125
+ config;
126
+ constructor(config = DEFAULT_CONFIG) {
127
+ this.config = { ...DEFAULT_CONFIG, ...config };
128
+ }
129
+ analyzeGap(examples, dslOperators) {
130
+ const gaps = [];
131
+ const operatorSet = new Set(dslOperators.map(o => o.toLowerCase()));
132
+ for (const example of examples) {
133
+ // Analyze type transformations
134
+ const inputType = this.detectType(example.input);
135
+ const outputType = this.detectType(example.output);
136
+ if (inputType !== outputType) {
137
+ const conversionOp = this.findConversionOperator(inputType, outputType);
138
+ if (conversionOp && !operatorSet.has(conversionOp.toLowerCase())) {
139
+ gaps.push({
140
+ type: 'type-conversion',
141
+ severity: 'high',
142
+ description: `Missing ${inputType} to ${outputType} conversion operator (e.g., ${conversionOp})`,
143
+ suggestedFix: `Add ${conversionOp} operator`,
144
+ });
145
+ }
146
+ }
147
+ // Analyze required operators
148
+ const requiredOps = this.detectRequiredOperators(example);
149
+ for (const op of requiredOps) {
150
+ if (!operatorSet.has(op.toLowerCase())) {
151
+ gaps.push({
152
+ type: 'missing-operator',
153
+ severity: 'medium',
154
+ description: `Missing operator: ${op} (may need ${op} or reduce for this transformation)`,
155
+ suggestedFix: `Add ${op} operator`,
156
+ });
157
+ }
158
+ }
159
+ }
160
+ // Deduplicate gaps
161
+ const seen = new Set();
162
+ return gaps.filter(g => {
163
+ const key = `${g.type}:${g.description}`;
164
+ if (seen.has(key))
165
+ return false;
166
+ seen.add(key);
167
+ return true;
168
+ });
169
+ }
170
+ suggestOperators(examples) {
171
+ const suggestions = [];
172
+ for (const pattern of TRANSFORMATION_PATTERNS) {
173
+ let matchCount = 0;
174
+ for (const example of examples) {
175
+ if (pattern.pattern(example.input, example.output)) {
176
+ matchCount++;
177
+ }
178
+ }
179
+ if (matchCount > 0) {
180
+ const confidence = (matchCount / examples.length) * pattern.confidence;
181
+ if (confidence >= this.config.minConfidence) {
182
+ suggestions.push({
183
+ name: pattern.operator,
184
+ signature: pattern.signature,
185
+ confidence,
186
+ description: `Transform using ${pattern.operator}`,
187
+ });
188
+ }
189
+ }
190
+ }
191
+ // Sort by confidence and limit
192
+ suggestions.sort((a, b) => b.confidence - a.confidence);
193
+ return suggestions.slice(0, this.config.maxSuggestions);
194
+ }
195
+ generateOperatorCode(suggestion) {
196
+ const [inputType, outputType] = suggestion.signature.split('->').map(s => s.trim());
197
+ // Generate type-safe function template
198
+ const templates = {
199
+ titleCase: `function titleCase(input: string): string {
200
+ return input.split(' ')
201
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
202
+ .join(' ');
203
+ }`,
204
+ sum: `function sum(input: number[]): number {
205
+ return input.reduce((acc, val) => acc + val, 0);
206
+ }`,
207
+ toNumber: `function toNumber(input: string): number {
208
+ return Number(input);
209
+ }`,
210
+ toString: `function toString(input: number): string {
211
+ return String(input);
212
+ }`,
213
+ };
214
+ if (templates[suggestion.name]) {
215
+ return templates[suggestion.name];
216
+ }
217
+ // Generate generic template
218
+ return `function ${suggestion.name}(input: ${inputType}): ${outputType} {
219
+ // TODO: Implement ${suggestion.description}
220
+ throw new Error('Not implemented');
221
+ }`;
222
+ }
223
+ getAvailableOperators() {
224
+ return Object.values(KNOWN_OPERATORS).flat();
225
+ }
226
+ getOperatorCategories() {
227
+ return { ...KNOWN_OPERATORS };
228
+ }
229
+ validateOperator(_name, signature, implementation) {
230
+ try {
231
+ // Basic validation - try to call the function
232
+ const testInputs = this.generateTestInputs(signature);
233
+ for (const input of testInputs) {
234
+ implementation(input);
235
+ }
236
+ return { valid: true };
237
+ }
238
+ catch (error) {
239
+ return {
240
+ valid: false,
241
+ error: error instanceof Error ? error.message : 'Unknown error',
242
+ };
243
+ }
244
+ }
245
+ /**
246
+ * Detect type of value
247
+ */
248
+ detectType(value) {
249
+ if (value === null)
250
+ return 'null';
251
+ if (value === undefined)
252
+ return 'undefined';
253
+ if (Array.isArray(value))
254
+ return 'array';
255
+ return typeof value;
256
+ }
257
+ /**
258
+ * Find conversion operator for type transformation
259
+ */
260
+ findConversionOperator(fromType, toType) {
261
+ const conversionMap = {
262
+ 'string->number': 'toNumber',
263
+ 'number->string': 'toString',
264
+ 'string->boolean': 'toBoolean',
265
+ 'array->number': 'reduce',
266
+ };
267
+ return conversionMap[`${fromType}->${toType}`] || null;
268
+ }
269
+ /**
270
+ * Detect required operators for transformation
271
+ */
272
+ detectRequiredOperators(example) {
273
+ const ops = [];
274
+ // Check for array sum pattern
275
+ if (Array.isArray(example.input) && typeof example.output === 'number') {
276
+ const input = example.input;
277
+ if (input.every(x => typeof x === 'number')) {
278
+ const sum = input.reduce((a, b) => a + b, 0);
279
+ if (sum === example.output) {
280
+ ops.push('sum', 'reduce');
281
+ }
282
+ }
283
+ }
284
+ // Check for title case pattern
285
+ if (typeof example.input === 'string' && typeof example.output === 'string') {
286
+ if (isTitleCase(example.input, example.output)) {
287
+ ops.push('capitalize', 'titleCase');
288
+ }
289
+ }
290
+ return ops;
291
+ }
292
+ /**
293
+ * Generate test inputs based on signature
294
+ */
295
+ generateTestInputs(signature) {
296
+ const inputType = signature.split('->')[0].trim();
297
+ const testInputs = {
298
+ 'string': ['test', 'hello world'],
299
+ 'number': [42, 0, -1],
300
+ 'number[]': [[1, 2, 3], []],
301
+ 'boolean': [true, false],
302
+ };
303
+ return testInputs[inputType] || ['test'];
304
+ }
305
+ }
306
+ /**
307
+ * Create DSL extender
308
+ */
309
+ export function createDSLExtender(config) {
310
+ return new DefaultDSLExtender(config);
311
+ }
312
+ //# sourceMappingURL=DSLExtender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DSLExtender.js","sourceRoot":"","sources":["../../src/dsl/DSLExtender.ts"],"names":[],"mappings":"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"}
@@ -5,4 +5,6 @@
5
5
  export { DSL } from './DSL.js';
6
6
  export { DSLBuilder } from './DSLBuilder.js';
7
7
  export { TypeSystem } from './TypeSystem.js';
8
+ export { createDSLExtender } from './DSLExtender.js';
9
+ export type { DSLExtender, DSLExtenderConfig, DSLGap, OperatorSuggestion, OperatorValidationResult, Example, } from './DSLExtender.js';
8
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dsl/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dsl/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,MAAM,EACN,kBAAkB,EAClB,wBAAwB,EACxB,OAAO,GACR,MAAM,kBAAkB,CAAC"}
package/dist/dsl/index.js CHANGED
@@ -5,4 +5,6 @@
5
5
  export { DSL } from './DSL.js';
6
6
  export { DSLBuilder } from './DSLBuilder.js';
7
7
  export { TypeSystem } from './TypeSystem.js';
8
+ // DSL Extension (v2.2.0 NEW!)
9
+ export { createDSLExtender } from './DSLExtender.js';
8
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dsl/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dsl/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,8BAA8B;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * ExplanationGenerator - Program Synthesis Explanation
3
+ *
4
+ * 合成されたプログラムの自然言語説明を生成する。
5
+ *
6
+ * @see TSK-SY-106 - ExplanationGenerator実装
7
+ * @see REQ-SY-106 - 説明生成要件
8
+ * @module @nahisaho/musubix-synthesis
9
+ */
10
+ /**
11
+ * 入出力例
12
+ */
13
+ export interface Example {
14
+ input: unknown;
15
+ output: unknown;
16
+ }
17
+ /**
18
+ * 合成されたプログラム
19
+ */
20
+ export interface SynthesizedProgram {
21
+ /** プログラムID */
22
+ id: string;
23
+ /** 合成されたコード */
24
+ code: string;
25
+ /** 対象ドメイン */
26
+ domain: string;
27
+ /** 入出力例 */
28
+ examples: Example[];
29
+ /** 合成信頼度 */
30
+ confidence: number;
31
+ }
32
+ /**
33
+ * 説明
34
+ */
35
+ export interface Explanation {
36
+ /** 説明文 */
37
+ description: string;
38
+ /** 対象ドメイン */
39
+ domain: string;
40
+ /** ステップ */
41
+ steps: string[];
42
+ /** 例のウォークスルー */
43
+ exampleWalkthrough: ExampleWalkthrough[];
44
+ /** 信頼度 */
45
+ confidence: number;
46
+ }
47
+ /**
48
+ * 例のウォークスルー
49
+ */
50
+ export interface ExampleWalkthrough {
51
+ input: string;
52
+ output: string;
53
+ trace: string;
54
+ }
55
+ /**
56
+ * 詳細説明
57
+ */
58
+ export interface DetailedExplanation extends Explanation {
59
+ /** 根拠 */
60
+ rationale: string;
61
+ /** 制限事項 */
62
+ limitations: string[];
63
+ /** 入出力関係 */
64
+ relationship: string;
65
+ }
66
+ /**
67
+ * 説明生成器インターフェース
68
+ */
69
+ export interface ExplanationGenerator {
70
+ /**
71
+ * プログラムの説明を生成
72
+ */
73
+ generate(program: SynthesizedProgram): Explanation;
74
+ /**
75
+ * 説明の信頼度を取得
76
+ */
77
+ getConfidence(program: SynthesizedProgram): number;
78
+ /**
79
+ * 詳細説明を生成
80
+ */
81
+ explain(program: SynthesizedProgram): DetailedExplanation;
82
+ /**
83
+ * 一行サマリーを生成
84
+ */
85
+ summarize(program: SynthesizedProgram): string;
86
+ }
87
+ /**
88
+ * ExplanationGenerator を作成
89
+ */
90
+ export declare function createExplanationGenerator(): ExplanationGenerator;
91
+ //# sourceMappingURL=ExplanationGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExplanationGenerator.d.ts","sourceRoot":"","sources":["../../src/explain/ExplanationGenerator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,cAAc;IACd,EAAE,EAAE,MAAM,CAAC;IACX,eAAe;IACf,IAAI,EAAE,MAAM,CAAC;IACb,aAAa;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW;IACX,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,YAAY;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,UAAU;IACV,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW;IACX,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,gBAAgB;IAChB,kBAAkB,EAAE,kBAAkB,EAAE,CAAC;IACzC,UAAU;IACV,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACtD,SAAS;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW;IACX,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY;IACZ,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAAC;IAEnD;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAAC;IAEnD;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,mBAAmB,CAAC;IAE1D;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAAC;CAChD;AA2QD;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,oBAAoB,CAEjE"}
@@ -0,0 +1,236 @@
1
+ /**
2
+ * ExplanationGenerator - Program Synthesis Explanation
3
+ *
4
+ * 合成されたプログラムの自然言語説明を生成する。
5
+ *
6
+ * @see TSK-SY-106 - ExplanationGenerator実装
7
+ * @see REQ-SY-106 - 説明生成要件
8
+ * @module @nahisaho/musubix-synthesis
9
+ */
10
+ /**
11
+ * 操作パターンの定義
12
+ */
13
+ const operationPatterns = {
14
+ toUpperCase: { pattern: /\.toUpperCase\(\)/, description: 'converts text to uppercase' },
15
+ toLowerCase: { pattern: /\.toLowerCase\(\)/, description: 'converts text to lowercase' },
16
+ trim: { pattern: /\.trim\(\)/, description: 'removes leading and trailing whitespace' },
17
+ split: { pattern: /\.split\([^)]+\)/, description: 'splits text into parts' },
18
+ join: { pattern: /\.join\([^)]+\)/, description: 'joins parts into text' },
19
+ map: { pattern: /\.map\([^)]+\)/, description: 'transforms each element' },
20
+ filter: { pattern: /\.filter\([^)]+\)/, description: 'filters elements based on condition' },
21
+ reduce: { pattern: /\.reduce\([^)]+\)/, description: 'combines elements into a single value' },
22
+ reverse: { pattern: /\.reverse\(\)/, description: 'reverses the order of elements' },
23
+ length: { pattern: /\.length/, description: 'gets the length' },
24
+ charAt: { pattern: /\.charAt\(\d+\)/, description: 'extracts a character at position' },
25
+ repeat: { pattern: /\.repeat\(\d+\)/, description: 'repeats the input' },
26
+ flat: { pattern: /\.flat\(\)/, description: 'flattens nested arrays' },
27
+ multiply: { pattern: /\*\s*\d+/, description: 'multiplies by a number' },
28
+ add: { pattern: /\+\s*\d+/, description: 'adds a number' },
29
+ subtract: { pattern: /-\s*\d+/, description: 'subtracts a number' },
30
+ };
31
+ /**
32
+ * デフォルト説明生成器
33
+ */
34
+ class DefaultExplanationGenerator {
35
+ /**
36
+ * プログラムの説明を生成
37
+ */
38
+ generate(program) {
39
+ const steps = this.extractSteps(program.code);
40
+ const description = this.generateDescription(program, steps);
41
+ const exampleWalkthrough = this.generateWalkthrough(program);
42
+ const confidence = this.calculateExplanationConfidence(program, steps);
43
+ return {
44
+ description,
45
+ domain: program.domain,
46
+ steps,
47
+ exampleWalkthrough,
48
+ confidence,
49
+ };
50
+ }
51
+ /**
52
+ * 説明の信頼度を取得
53
+ */
54
+ getConfidence(program) {
55
+ // 基礎信頼度
56
+ let confidence = program.confidence;
57
+ // コードの複雑さによる調整
58
+ const complexity = this.measureComplexity(program.code);
59
+ if (complexity > 3) {
60
+ confidence *= 0.8;
61
+ }
62
+ // 例の数による調整
63
+ const exampleBonus = Math.min(program.examples.length * 0.05, 0.2);
64
+ confidence = Math.min(confidence + exampleBonus, 1.0);
65
+ return Math.round(confidence * 100) / 100;
66
+ }
67
+ /**
68
+ * 詳細説明を生成
69
+ */
70
+ explain(program) {
71
+ const baseExplanation = this.generate(program);
72
+ const relationship = this.identifyRelationship(program);
73
+ const rationale = this.generateRationale(program);
74
+ const limitations = this.identifyLimitations(program);
75
+ return {
76
+ ...baseExplanation,
77
+ rationale,
78
+ limitations,
79
+ relationship,
80
+ };
81
+ }
82
+ /**
83
+ * 一行サマリーを生成
84
+ */
85
+ summarize(program) {
86
+ const steps = this.extractSteps(program.code);
87
+ if (steps.length === 0) {
88
+ return `Transforms ${program.domain} input to output`;
89
+ }
90
+ if (steps.length === 1) {
91
+ return this.toHumanReadable(steps[0]);
92
+ }
93
+ // 複数ステップの場合は主要な操作を抽出
94
+ const mainOps = steps.slice(0, 2);
95
+ const summary = mainOps.map(s => this.toHumanReadable(s)).join(', then ');
96
+ if (summary.length > 90) {
97
+ return summary.substring(0, 87) + '...';
98
+ }
99
+ return summary;
100
+ }
101
+ /**
102
+ * コードからステップを抽出
103
+ */
104
+ extractSteps(code) {
105
+ const steps = [];
106
+ for (const [name, { pattern }] of Object.entries(operationPatterns)) {
107
+ if (pattern.test(code)) {
108
+ steps.push(name);
109
+ }
110
+ }
111
+ // チェーンの順序を維持するために正規化
112
+ return steps;
113
+ }
114
+ /**
115
+ * 説明文を生成
116
+ */
117
+ generateDescription(program, steps) {
118
+ if (steps.length === 0) {
119
+ return `This program transforms a ${program.domain} input according to the specified pattern.`;
120
+ }
121
+ const operations = steps.map(s => operationPatterns[s]?.description || s).join(', then ');
122
+ return `This program ${operations}.`;
123
+ }
124
+ /**
125
+ * 例のウォークスルーを生成
126
+ */
127
+ generateWalkthrough(program) {
128
+ return program.examples.map((ex) => ({
129
+ input: JSON.stringify(ex.input),
130
+ output: JSON.stringify(ex.output),
131
+ trace: `Input ${JSON.stringify(ex.input)} → Apply transformation → Output ${JSON.stringify(ex.output)}`,
132
+ }));
133
+ }
134
+ /**
135
+ * 説明の信頼度を計算
136
+ */
137
+ calculateExplanationConfidence(program, steps) {
138
+ let confidence = 0.5;
139
+ // 認識されたステップが多いほど信頼度UP
140
+ confidence += Math.min(steps.length * 0.1, 0.3);
141
+ // 例が多いほど信頼度UP
142
+ confidence += Math.min(program.examples.length * 0.05, 0.15);
143
+ // プログラム自体の信頼度を反映
144
+ confidence = confidence * 0.5 + program.confidence * 0.5;
145
+ return Math.round(confidence * 100) / 100;
146
+ }
147
+ /**
148
+ * コードの複雑さを計測
149
+ */
150
+ measureComplexity(code) {
151
+ let complexity = 1;
152
+ // メソッドチェーンの数
153
+ const chainCount = (code.match(/\./g) || []).length;
154
+ complexity += chainCount * 0.5;
155
+ // コールバック関数の数
156
+ const callbackCount = (code.match(/=>/g) || []).length;
157
+ complexity += callbackCount * 0.8;
158
+ // ネストの深さ(括弧の数)
159
+ const parenDepth = Math.max((code.match(/\(/g) || []).length - 1, 0);
160
+ complexity += parenDepth * 0.3;
161
+ return complexity;
162
+ }
163
+ /**
164
+ * 入出力関係を識別
165
+ */
166
+ identifyRelationship(program) {
167
+ if (program.examples.length === 0) {
168
+ return 'Unable to determine relationship without examples';
169
+ }
170
+ const { examples } = program;
171
+ const inputType = typeof examples[0].input;
172
+ const outputType = typeof examples[0].output;
173
+ if (inputType === outputType) {
174
+ return `Transforms ${inputType} to ${outputType} while preserving type`;
175
+ }
176
+ return `Converts ${inputType} to ${outputType}`;
177
+ }
178
+ /**
179
+ * 根拠を生成
180
+ */
181
+ generateRationale(program) {
182
+ const steps = this.extractSteps(program.code);
183
+ if (steps.length === 0) {
184
+ return 'The transformation pattern was inferred from the provided examples.';
185
+ }
186
+ return `The program uses ${steps.join(', ')} operations to achieve the transformation shown in the examples.`;
187
+ }
188
+ /**
189
+ * 制限事項を識別
190
+ */
191
+ identifyLimitations(program) {
192
+ const limitations = [];
193
+ if (program.examples.length < 3) {
194
+ limitations.push('Limited examples may not cover all edge cases');
195
+ }
196
+ if (program.confidence < 0.7) {
197
+ limitations.push('Low confidence suggests uncertain generalization');
198
+ }
199
+ const complexity = this.measureComplexity(program.code);
200
+ if (complexity > 4) {
201
+ limitations.push('Complex transformation may have unexpected behavior');
202
+ }
203
+ return limitations;
204
+ }
205
+ /**
206
+ * 操作名を人間可読な形式に変換
207
+ */
208
+ toHumanReadable(step) {
209
+ const descriptions = {
210
+ toUpperCase: 'Converts to uppercase',
211
+ toLowerCase: 'Converts to lowercase',
212
+ trim: 'Removes whitespace',
213
+ split: 'Splits into parts',
214
+ join: 'Joins parts together',
215
+ map: 'Transforms each element',
216
+ filter: 'Filters elements',
217
+ reduce: 'Combines elements',
218
+ reverse: 'Reverses order',
219
+ length: 'Gets the length',
220
+ charAt: 'Extracts a character',
221
+ repeat: 'Repeats the input',
222
+ flat: 'Flattens the array',
223
+ multiply: 'Multiplies the value',
224
+ add: 'Adds to the value',
225
+ subtract: 'Subtracts from the value',
226
+ };
227
+ return descriptions[step] || `Applies ${step} operation`;
228
+ }
229
+ }
230
+ /**
231
+ * ExplanationGenerator を作成
232
+ */
233
+ export function createExplanationGenerator() {
234
+ return new DefaultExplanationGenerator();
235
+ }
236
+ //# sourceMappingURL=ExplanationGenerator.js.map