@nahisaho/musubix-synthesis 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 +100 -0
- package/dist/dsl/DSL.d.ts +73 -0
- package/dist/dsl/DSL.d.ts.map +1 -0
- package/dist/dsl/DSL.js +250 -0
- package/dist/dsl/DSL.js.map +1 -0
- package/dist/dsl/DSLBuilder.d.ts +33 -0
- package/dist/dsl/DSLBuilder.d.ts.map +1 -0
- package/dist/dsl/DSLBuilder.js +51 -0
- package/dist/dsl/DSLBuilder.js.map +1 -0
- package/dist/dsl/TypeSystem.d.ts +51 -0
- package/dist/dsl/TypeSystem.d.ts.map +1 -0
- package/dist/dsl/TypeSystem.js +253 -0
- package/dist/dsl/TypeSystem.js.map +1 -0
- package/dist/dsl/index.d.ts +8 -0
- package/dist/dsl/index.d.ts.map +1 -0
- package/dist/dsl/index.js +8 -0
- package/dist/dsl/index.js.map +1 -0
- package/dist/errors.d.ts +93 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +142 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/rules/MetaLearner.d.ts +50 -0
- package/dist/rules/MetaLearner.d.ts.map +1 -0
- package/dist/rules/MetaLearner.js +144 -0
- package/dist/rules/MetaLearner.js.map +1 -0
- package/dist/rules/RuleExtractor.d.ts +69 -0
- package/dist/rules/RuleExtractor.d.ts.map +1 -0
- package/dist/rules/RuleExtractor.js +290 -0
- package/dist/rules/RuleExtractor.js.map +1 -0
- package/dist/rules/RuleLibrary.d.ts +55 -0
- package/dist/rules/RuleLibrary.d.ts.map +1 -0
- package/dist/rules/RuleLibrary.js +190 -0
- package/dist/rules/RuleLibrary.js.map +1 -0
- package/dist/rules/index.d.ts +9 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +9 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/synthesis/Enumerator.d.ts +78 -0
- package/dist/synthesis/Enumerator.d.ts.map +1 -0
- package/dist/synthesis/Enumerator.js +292 -0
- package/dist/synthesis/Enumerator.js.map +1 -0
- package/dist/synthesis/PBESynthesizer.d.ts +37 -0
- package/dist/synthesis/PBESynthesizer.d.ts.map +1 -0
- package/dist/synthesis/PBESynthesizer.js +187 -0
- package/dist/synthesis/PBESynthesizer.js.map +1 -0
- package/dist/synthesis/VersionSpace.d.ts +50 -0
- package/dist/synthesis/VersionSpace.d.ts.map +1 -0
- package/dist/synthesis/VersionSpace.js +102 -0
- package/dist/synthesis/VersionSpace.js.map +1 -0
- package/dist/synthesis/WitnessEngine.d.ts +64 -0
- package/dist/synthesis/WitnessEngine.d.ts.map +1 -0
- package/dist/synthesis/WitnessEngine.js +217 -0
- package/dist/synthesis/WitnessEngine.js.map +1 -0
- package/dist/synthesis/index.d.ts +9 -0
- package/dist/synthesis/index.d.ts.map +1 -0
- package/dist/synthesis/index.js +9 -0
- package/dist/synthesis/index.js.map +1 -0
- package/dist/types.d.ts +372 -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 +52 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Meta Learner
|
|
3
|
+
* @module @nahisaho/musubix-synthesis
|
|
4
|
+
* @description Continuous rule improvement and suggestions
|
|
5
|
+
* Traces to: REQ-SYN-004 (Rule Learning)
|
|
6
|
+
*/
|
|
7
|
+
import { RuleExtractor, resetRuleIdCounter } from './RuleExtractor.js';
|
|
8
|
+
/**
|
|
9
|
+
* Meta learner implementation
|
|
10
|
+
*/
|
|
11
|
+
export class MetaLearner {
|
|
12
|
+
library;
|
|
13
|
+
extractor;
|
|
14
|
+
pendingSuggestions;
|
|
15
|
+
totalLearned;
|
|
16
|
+
constructor(library) {
|
|
17
|
+
this.library = library;
|
|
18
|
+
this.extractor = new RuleExtractor();
|
|
19
|
+
this.pendingSuggestions = [];
|
|
20
|
+
this.totalLearned = 0;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Learn from synthesis result
|
|
24
|
+
*/
|
|
25
|
+
async learn(result, usedRules) {
|
|
26
|
+
// Update confidence for used rules
|
|
27
|
+
for (const rule of usedRules) {
|
|
28
|
+
await this.library.recordUsage(rule.id, result.success);
|
|
29
|
+
}
|
|
30
|
+
// Extract new rules from successful synthesis
|
|
31
|
+
if (result.success && result.program) {
|
|
32
|
+
const newRules = this.extractor.extract({ examples: [] }, // Simplified - would need actual spec
|
|
33
|
+
result.program);
|
|
34
|
+
for (const rule of newRules) {
|
|
35
|
+
// Check if similar rule exists
|
|
36
|
+
const existing = await this.library.getAll();
|
|
37
|
+
if (!this.hasSimularRule(rule, existing)) {
|
|
38
|
+
this.pendingSuggestions.push(rule);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
this.totalLearned++;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Update confidence for a rule
|
|
46
|
+
*/
|
|
47
|
+
async updateConfidence(ruleId, success) {
|
|
48
|
+
await this.library.recordUsage(ruleId, success);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Suggest new rules
|
|
52
|
+
*/
|
|
53
|
+
async suggestRules() {
|
|
54
|
+
// Generalize pending suggestions
|
|
55
|
+
if (this.pendingSuggestions.length > 0) {
|
|
56
|
+
const generalized = this.extractor.generalize(this.pendingSuggestions);
|
|
57
|
+
// Filter out low-confidence suggestions
|
|
58
|
+
const suggestions = generalized.filter((r) => r.confidence >= 0.5);
|
|
59
|
+
// Clear pending
|
|
60
|
+
this.pendingSuggestions.length = 0;
|
|
61
|
+
return suggestions;
|
|
62
|
+
}
|
|
63
|
+
// Analyze existing rules for generalization opportunities
|
|
64
|
+
const allRules = await this.library.getAll();
|
|
65
|
+
const opportunities = this.findGeneralizationOpportunities(allRules);
|
|
66
|
+
return opportunities;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get total learned count
|
|
70
|
+
*/
|
|
71
|
+
getTotalLearned() {
|
|
72
|
+
return this.totalLearned;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Reset state (for testing)
|
|
76
|
+
*/
|
|
77
|
+
reset() {
|
|
78
|
+
this.pendingSuggestions.length = 0;
|
|
79
|
+
this.totalLearned = 0;
|
|
80
|
+
resetRuleIdCounter();
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Check if similar rule exists
|
|
84
|
+
*/
|
|
85
|
+
hasSimularRule(rule, existing) {
|
|
86
|
+
for (const r of existing) {
|
|
87
|
+
if (this.rulesAreSimilar(rule, r)) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Check rule similarity
|
|
95
|
+
*/
|
|
96
|
+
rulesAreSimilar(a, b) {
|
|
97
|
+
// Compare template structure
|
|
98
|
+
const aExpr = a.template.expression;
|
|
99
|
+
const bExpr = b.template.expression;
|
|
100
|
+
if (aExpr.kind !== bExpr.kind)
|
|
101
|
+
return false;
|
|
102
|
+
if (aExpr.kind === 'application' && bExpr.kind === 'application') {
|
|
103
|
+
if (aExpr.operator !== bExpr.operator)
|
|
104
|
+
return false;
|
|
105
|
+
if (aExpr.args.length !== bExpr.args.length)
|
|
106
|
+
return false;
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
if (aExpr.kind === 'constant' && bExpr.kind === 'constant') {
|
|
110
|
+
return aExpr.name === bExpr.name;
|
|
111
|
+
}
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Find generalization opportunities
|
|
116
|
+
*/
|
|
117
|
+
findGeneralizationOpportunities(rules) {
|
|
118
|
+
const opportunities = [];
|
|
119
|
+
// Group by operator
|
|
120
|
+
const byOperator = new Map();
|
|
121
|
+
for (const rule of rules) {
|
|
122
|
+
const expr = rule.template.expression;
|
|
123
|
+
if (expr.kind === 'application') {
|
|
124
|
+
const group = byOperator.get(expr.operator) ?? [];
|
|
125
|
+
group.push(rule);
|
|
126
|
+
byOperator.set(expr.operator, group);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Look for groups with multiple similar rules
|
|
130
|
+
for (const [_operator, group] of byOperator) {
|
|
131
|
+
if (group.length >= 2) {
|
|
132
|
+
// Could potentially merge these
|
|
133
|
+
const avgConfidence = group.reduce((sum, r) => sum + r.confidence, 0) / group.length;
|
|
134
|
+
if (avgConfidence >= 0.7) {
|
|
135
|
+
// Create a generalized rule
|
|
136
|
+
const generalized = this.extractor.generalize(group);
|
|
137
|
+
opportunities.push(...generalized);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return opportunities;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=MetaLearner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetaLearner.js","sourceRoot":"","sources":["../../src/rules/MetaLearner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule Extractor
|
|
3
|
+
* @module @nahisaho/musubix-synthesis
|
|
4
|
+
* @description Extract synthesis rules from successful synthesis
|
|
5
|
+
* Traces to: REQ-SYN-004 (Rule Learning)
|
|
6
|
+
*/
|
|
7
|
+
import type { IRuleExtractor, Program, Specification, SynthesisRule } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Reset rule ID counter (for testing)
|
|
10
|
+
*/
|
|
11
|
+
export declare function resetRuleIdCounter(): void;
|
|
12
|
+
/**
|
|
13
|
+
* Rule extractor implementation
|
|
14
|
+
*/
|
|
15
|
+
export declare class RuleExtractor implements IRuleExtractor {
|
|
16
|
+
/**
|
|
17
|
+
* Extract rules from successful synthesis
|
|
18
|
+
*/
|
|
19
|
+
extract(spec: Specification, program: Program): SynthesisRule[];
|
|
20
|
+
/**
|
|
21
|
+
* Generalize multiple rules
|
|
22
|
+
*/
|
|
23
|
+
generalize(rules: SynthesisRule[]): SynthesisRule[];
|
|
24
|
+
/**
|
|
25
|
+
* Extract pattern from specification
|
|
26
|
+
*/
|
|
27
|
+
private extractPattern;
|
|
28
|
+
/**
|
|
29
|
+
* Extract template from program
|
|
30
|
+
*/
|
|
31
|
+
private extractTemplate;
|
|
32
|
+
/**
|
|
33
|
+
* Convert expression to template with holes
|
|
34
|
+
*/
|
|
35
|
+
private templatizeExpression;
|
|
36
|
+
/**
|
|
37
|
+
* Extract sub-rules from nested expressions
|
|
38
|
+
*/
|
|
39
|
+
private extractSubRules;
|
|
40
|
+
/**
|
|
41
|
+
* Generate rule name from program
|
|
42
|
+
*/
|
|
43
|
+
private generateRuleName;
|
|
44
|
+
/**
|
|
45
|
+
* Find common pattern in values
|
|
46
|
+
*/
|
|
47
|
+
private findCommonPattern;
|
|
48
|
+
/**
|
|
49
|
+
* Find common prefix of strings
|
|
50
|
+
*/
|
|
51
|
+
private findCommonPrefix;
|
|
52
|
+
/**
|
|
53
|
+
* Find common suffix of strings
|
|
54
|
+
*/
|
|
55
|
+
private findCommonSuffix;
|
|
56
|
+
/**
|
|
57
|
+
* Group similar rules
|
|
58
|
+
*/
|
|
59
|
+
private groupSimilarRules;
|
|
60
|
+
/**
|
|
61
|
+
* Check if two rules are similar
|
|
62
|
+
*/
|
|
63
|
+
private areRulesSimilar;
|
|
64
|
+
/**
|
|
65
|
+
* Merge similar rules
|
|
66
|
+
*/
|
|
67
|
+
private mergeRules;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=RuleExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuleExtractor.d.ts","sourceRoot":"","sources":["../../src/rules/RuleExtractor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAGV,cAAc,EACd,OAAO,EAGP,aAAa,EACb,aAAa,EACd,MAAM,aAAa,CAAC;AAcrB;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED;;GAEG;AACH,qBAAa,aAAc,YAAW,cAAc;IAClD;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,aAAa,EAAE;IA6B/D;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE;IAkBnD;;OAEG;IACH,OAAO,CAAC,cAAc;IAyBtB;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAoC5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAmBvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgCzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAwBzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;OAEG;IACH,OAAO,CAAC,UAAU;CA6BnB"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule Extractor
|
|
3
|
+
* @module @nahisaho/musubix-synthesis
|
|
4
|
+
* @description Extract synthesis rules from successful synthesis
|
|
5
|
+
* Traces to: REQ-SYN-004 (Rule Learning)
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Rule ID counter
|
|
9
|
+
*/
|
|
10
|
+
let ruleIdCounter = 0;
|
|
11
|
+
/**
|
|
12
|
+
* Generate rule ID
|
|
13
|
+
*/
|
|
14
|
+
function generateRuleId() {
|
|
15
|
+
return `RULE-${String(++ruleIdCounter).padStart(3, '0')}`;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Reset rule ID counter (for testing)
|
|
19
|
+
*/
|
|
20
|
+
export function resetRuleIdCounter() {
|
|
21
|
+
ruleIdCounter = 0;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Rule extractor implementation
|
|
25
|
+
*/
|
|
26
|
+
export class RuleExtractor {
|
|
27
|
+
/**
|
|
28
|
+
* Extract rules from successful synthesis
|
|
29
|
+
*/
|
|
30
|
+
extract(spec, program) {
|
|
31
|
+
const rules = [];
|
|
32
|
+
// Extract pattern from spec
|
|
33
|
+
const pattern = this.extractPattern(spec);
|
|
34
|
+
// Extract template from program
|
|
35
|
+
const template = this.extractTemplate(program);
|
|
36
|
+
// Create rule
|
|
37
|
+
const rule = {
|
|
38
|
+
id: generateRuleId(),
|
|
39
|
+
name: this.generateRuleName(program),
|
|
40
|
+
pattern,
|
|
41
|
+
template,
|
|
42
|
+
confidence: 0.5, // Initial confidence (prior)
|
|
43
|
+
usageCount: 0,
|
|
44
|
+
successCount: 0,
|
|
45
|
+
};
|
|
46
|
+
rules.push(rule);
|
|
47
|
+
// Also extract sub-rules from nested expressions
|
|
48
|
+
const subRules = this.extractSubRules(program.expression, spec);
|
|
49
|
+
rules.push(...subRules);
|
|
50
|
+
return rules;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Generalize multiple rules
|
|
54
|
+
*/
|
|
55
|
+
generalize(rules) {
|
|
56
|
+
// Group similar rules
|
|
57
|
+
const groups = this.groupSimilarRules(rules);
|
|
58
|
+
const generalized = [];
|
|
59
|
+
for (const group of groups) {
|
|
60
|
+
if (group.length === 1) {
|
|
61
|
+
generalized.push(group[0]);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
// Merge similar rules
|
|
65
|
+
const merged = this.mergeRules(group);
|
|
66
|
+
generalized.push(merged);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return generalized;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Extract pattern from specification
|
|
73
|
+
*/
|
|
74
|
+
extractPattern(spec) {
|
|
75
|
+
const examples = spec.examples;
|
|
76
|
+
// Try to find common patterns in inputs
|
|
77
|
+
const inputPattern = this.findCommonPattern(examples.map((e) => e.input));
|
|
78
|
+
// Try to find common patterns in outputs
|
|
79
|
+
const outputPattern = this.findCommonPattern(examples.map((e) => e.output));
|
|
80
|
+
// Count input keys from first example
|
|
81
|
+
const firstInput = examples[0]?.input;
|
|
82
|
+
const inputCount = typeof firstInput === 'object' && firstInput !== null
|
|
83
|
+
? Object.keys(firstInput).length
|
|
84
|
+
: undefined;
|
|
85
|
+
return {
|
|
86
|
+
inputPattern,
|
|
87
|
+
outputPattern,
|
|
88
|
+
typeConstraints: spec.inputType
|
|
89
|
+
? [spec.inputType, spec.outputType ?? 'any']
|
|
90
|
+
: undefined,
|
|
91
|
+
inputCount,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Extract template from program
|
|
96
|
+
*/
|
|
97
|
+
extractTemplate(program) {
|
|
98
|
+
const holes = [];
|
|
99
|
+
const expression = this.templatizeExpression(program.expression, holes, []);
|
|
100
|
+
return {
|
|
101
|
+
expression,
|
|
102
|
+
holes,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Convert expression to template with holes
|
|
107
|
+
*/
|
|
108
|
+
templatizeExpression(expr, holes, path) {
|
|
109
|
+
switch (expr.kind) {
|
|
110
|
+
case 'constant':
|
|
111
|
+
// Keep constants as-is
|
|
112
|
+
return expr;
|
|
113
|
+
case 'variable':
|
|
114
|
+
// Keep variables as-is
|
|
115
|
+
return expr;
|
|
116
|
+
case 'application':
|
|
117
|
+
// Recursively templatize arguments
|
|
118
|
+
return {
|
|
119
|
+
kind: 'application',
|
|
120
|
+
operator: expr.operator,
|
|
121
|
+
args: expr.args.map((arg, i) => this.templatizeExpression(arg, holes, [...path, i])),
|
|
122
|
+
};
|
|
123
|
+
case 'lambda':
|
|
124
|
+
// Templatize body
|
|
125
|
+
return {
|
|
126
|
+
...expr,
|
|
127
|
+
body: this.templatizeExpression(expr.body, holes, [...path, 0]),
|
|
128
|
+
};
|
|
129
|
+
default:
|
|
130
|
+
return expr;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Extract sub-rules from nested expressions
|
|
135
|
+
*/
|
|
136
|
+
extractSubRules(expr, _spec) {
|
|
137
|
+
const subRules = [];
|
|
138
|
+
if (expr.kind === 'application') {
|
|
139
|
+
// Create a rule for this operator application
|
|
140
|
+
for (const arg of expr.args) {
|
|
141
|
+
if (arg.kind === 'application') {
|
|
142
|
+
// Recursively extract from nested applications
|
|
143
|
+
subRules.push(...this.extractSubRules(arg, _spec));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return subRules;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Generate rule name from program
|
|
151
|
+
*/
|
|
152
|
+
generateRuleName(program) {
|
|
153
|
+
const expr = program.expression;
|
|
154
|
+
if (expr.kind === 'application') {
|
|
155
|
+
return `${expr.operator}-rule`;
|
|
156
|
+
}
|
|
157
|
+
if (expr.kind === 'constant') {
|
|
158
|
+
return `const-${expr.name}-rule`;
|
|
159
|
+
}
|
|
160
|
+
if (expr.kind === 'variable') {
|
|
161
|
+
return `var-${expr.name}-rule`;
|
|
162
|
+
}
|
|
163
|
+
return 'anonymous-rule';
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Find common pattern in values
|
|
167
|
+
*/
|
|
168
|
+
findCommonPattern(values) {
|
|
169
|
+
if (values.length === 0)
|
|
170
|
+
return undefined;
|
|
171
|
+
if (values.length === 1)
|
|
172
|
+
return values[0];
|
|
173
|
+
// Check if all values are same type
|
|
174
|
+
const types = values.map((v) => typeof v);
|
|
175
|
+
if (new Set(types).size > 1) {
|
|
176
|
+
return { anyOf: values };
|
|
177
|
+
}
|
|
178
|
+
// For strings, try to find common structure
|
|
179
|
+
if (types[0] === 'string') {
|
|
180
|
+
const strings = values;
|
|
181
|
+
const commonPrefix = this.findCommonPrefix(strings);
|
|
182
|
+
const commonSuffix = this.findCommonSuffix(strings);
|
|
183
|
+
if (commonPrefix || commonSuffix) {
|
|
184
|
+
return { prefix: commonPrefix, suffix: commonSuffix };
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// For arrays, try to find common structure
|
|
188
|
+
if (Array.isArray(values[0])) {
|
|
189
|
+
const arrays = values;
|
|
190
|
+
if (arrays.every((a) => a.length === arrays[0].length)) {
|
|
191
|
+
return { arrayLength: arrays[0].length };
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return { type: types[0] };
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Find common prefix of strings
|
|
198
|
+
*/
|
|
199
|
+
findCommonPrefix(strings) {
|
|
200
|
+
if (strings.length === 0)
|
|
201
|
+
return '';
|
|
202
|
+
let prefix = strings[0];
|
|
203
|
+
for (const s of strings.slice(1)) {
|
|
204
|
+
while (!s.startsWith(prefix) && prefix.length > 0) {
|
|
205
|
+
prefix = prefix.slice(0, -1);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return prefix;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Find common suffix of strings
|
|
212
|
+
*/
|
|
213
|
+
findCommonSuffix(strings) {
|
|
214
|
+
if (strings.length === 0)
|
|
215
|
+
return '';
|
|
216
|
+
let suffix = strings[0];
|
|
217
|
+
for (const s of strings.slice(1)) {
|
|
218
|
+
while (!s.endsWith(suffix) && suffix.length > 0) {
|
|
219
|
+
suffix = suffix.slice(1);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return suffix;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Group similar rules
|
|
226
|
+
*/
|
|
227
|
+
groupSimilarRules(rules) {
|
|
228
|
+
const groups = [];
|
|
229
|
+
const assigned = new Set();
|
|
230
|
+
for (const rule of rules) {
|
|
231
|
+
if (assigned.has(rule.id))
|
|
232
|
+
continue;
|
|
233
|
+
const group = [rule];
|
|
234
|
+
assigned.add(rule.id);
|
|
235
|
+
for (const other of rules) {
|
|
236
|
+
if (assigned.has(other.id))
|
|
237
|
+
continue;
|
|
238
|
+
if (this.areRulesSimilar(rule, other)) {
|
|
239
|
+
group.push(other);
|
|
240
|
+
assigned.add(other.id);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
groups.push(group);
|
|
244
|
+
}
|
|
245
|
+
return groups;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Check if two rules are similar
|
|
249
|
+
*/
|
|
250
|
+
areRulesSimilar(a, b) {
|
|
251
|
+
// Check if templates have same structure
|
|
252
|
+
const aExpr = a.template.expression;
|
|
253
|
+
const bExpr = b.template.expression;
|
|
254
|
+
if (aExpr.kind !== bExpr.kind)
|
|
255
|
+
return false;
|
|
256
|
+
if (aExpr.kind === 'application' && bExpr.kind === 'application') {
|
|
257
|
+
return aExpr.operator === bExpr.operator;
|
|
258
|
+
}
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Merge similar rules
|
|
263
|
+
*/
|
|
264
|
+
mergeRules(rules) {
|
|
265
|
+
// Use the most common template
|
|
266
|
+
const templateCounts = new Map();
|
|
267
|
+
for (const rule of rules) {
|
|
268
|
+
const key = JSON.stringify(rule.template.expression);
|
|
269
|
+
templateCounts.set(key, (templateCounts.get(key) ?? 0) + 1);
|
|
270
|
+
}
|
|
271
|
+
let bestTemplate = rules[0].template;
|
|
272
|
+
let bestCount = 0;
|
|
273
|
+
for (const [key, count] of templateCounts) {
|
|
274
|
+
if (count > bestCount) {
|
|
275
|
+
bestCount = count;
|
|
276
|
+
bestTemplate = rules.find((r) => JSON.stringify(r.template.expression) === key).template;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return {
|
|
280
|
+
id: generateRuleId(),
|
|
281
|
+
name: `merged-${rules[0].name ?? 'rule'}`,
|
|
282
|
+
pattern: rules[0].pattern, // Use first pattern (could be merged)
|
|
283
|
+
template: bestTemplate,
|
|
284
|
+
confidence: rules.reduce((sum, r) => sum + r.confidence, 0) / rules.length,
|
|
285
|
+
usageCount: rules.reduce((sum, r) => sum + (r.usageCount ?? 0), 0),
|
|
286
|
+
successCount: rules.reduce((sum, r) => sum + (r.successCount ?? 0), 0),
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=RuleExtractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuleExtractor.js","sourceRoot":"","sources":["../../src/rules/RuleExtractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule Library
|
|
3
|
+
* @module @nahisaho/musubix-synthesis
|
|
4
|
+
* @description Storage and retrieval of synthesis rules
|
|
5
|
+
* Traces to: REQ-SYN-004 (Rule Learning)
|
|
6
|
+
*/
|
|
7
|
+
import type { IRuleLibrary, Specification, SynthesisRule } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Rule library implementation
|
|
10
|
+
*/
|
|
11
|
+
export declare class RuleLibrary implements IRuleLibrary {
|
|
12
|
+
private rules;
|
|
13
|
+
constructor();
|
|
14
|
+
/**
|
|
15
|
+
* Add a rule to the library
|
|
16
|
+
*/
|
|
17
|
+
add(rule: SynthesisRule): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Get a rule by ID
|
|
20
|
+
*/
|
|
21
|
+
get(id: string): Promise<SynthesisRule | null>;
|
|
22
|
+
/**
|
|
23
|
+
* Match rules against specification
|
|
24
|
+
*/
|
|
25
|
+
match(spec: Specification): Promise<SynthesisRule[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Record rule usage
|
|
28
|
+
*/
|
|
29
|
+
recordUsage(ruleId: string, success: boolean): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Calculate confidence from usage statistics
|
|
32
|
+
*/
|
|
33
|
+
private calculateConfidence;
|
|
34
|
+
/**
|
|
35
|
+
* Prune low-confidence rules
|
|
36
|
+
*/
|
|
37
|
+
prune(threshold: number): Promise<number>;
|
|
38
|
+
/**
|
|
39
|
+
* Get all rules
|
|
40
|
+
*/
|
|
41
|
+
getAll(): Promise<SynthesisRule[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Check if rule matches spec
|
|
44
|
+
*/
|
|
45
|
+
private ruleMatchesSpec;
|
|
46
|
+
/**
|
|
47
|
+
* Check if value matches pattern
|
|
48
|
+
*/
|
|
49
|
+
private valueMatchesPattern;
|
|
50
|
+
/**
|
|
51
|
+
* Value equality
|
|
52
|
+
*/
|
|
53
|
+
private valuesEqual;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=RuleLibrary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuleLibrary.d.ts","sourceRoot":"","sources":["../../src/rules/RuleLibrary.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE9E;;GAEG;AACH,qBAAa,WAAY,YAAW,YAAY;IAC9C,OAAO,CAAC,KAAK,CAA6B;;IAM1C;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C;;OAEG;IACG,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAIpD;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAe1D;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBlE;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;OAEG;IACG,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsB/C;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAIxC;;OAEG;IACH,OAAO,CAAC,eAAe;IAgDvB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAmC3B;;OAEG;IACH,OAAO,CAAC,WAAW;CAQpB"}
|