@higher.archi/boe 1.0.0 → 1.0.2
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/dist/core/operators/examples.d.ts +1 -1
- package/dist/core/operators/examples.js +1 -1
- package/dist/engines/scoring/compiler.d.ts.map +1 -1
- package/dist/engines/scoring/compiler.js +55 -2
- package/dist/engines/scoring/compiler.js.map +1 -1
- package/dist/engines/scoring/index.d.ts +1 -1
- package/dist/engines/scoring/index.d.ts.map +1 -1
- package/dist/engines/scoring/index.js.map +1 -1
- package/dist/engines/scoring/strategy.d.ts.map +1 -1
- package/dist/engines/scoring/strategy.js +216 -3
- package/dist/engines/scoring/strategy.js.map +1 -1
- package/dist/engines/scoring/types.d.ts +142 -1
- package/dist/engines/scoring/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/core/operators/examples.ts +1 -1
- package/src/engines/scoring/compiler.ts +76 -3
- package/src/engines/scoring/index.ts +15 -0
- package/src/engines/scoring/strategy.ts +232 -4
- package/src/engines/scoring/types.ts +170 -0
- package/src/index.ts +14 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/engines/scoring/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACV,cAAc,EACf,MAAM,YAAY,CAAC;AAMpB;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GACrB,KAAK,GACL,YAAY,GACZ,UAAU,GACV,kBAAkB,GAClB,QAAQ,CAAC;AAEb;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC5B,YAAY,GACZ,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,YAAY,CAAC;AAEjB;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,WAAW,CAAC;CACjC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAMF;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG;IACnC,IAAI,EAAE,aAAa,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG;IACzC,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CACjC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/engines/scoring/types.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -30,7 +30,7 @@ export type { ForwardRule, ForwardRuleSet, ForwardConfig, CompiledForwardRuleSet
|
|
|
30
30
|
export { BackwardChainingStrategy, compileBackwardRuleSet, backwardStrategy } from './engines/backward';
|
|
31
31
|
export type { BackwardRule, BackwardRuleSet, BackwardConfig, CompiledBackwardRuleSet, BackwardOptions, BackwardResult, ProofStep, ProofResult } from './engines/backward';
|
|
32
32
|
export { ScoringStrategy, compileScoringRuleSet, scoringStrategy } from './engines/scoring';
|
|
33
|
-
export type { ScoringRule, ScoringRuleSet, ScoringConfig, CompiledScoringRuleSet, ScoringOptions, ScoringResult, ScoreFunctionRegistry, ScoringMethod, OutputBounds } from './engines/scoring';
|
|
33
|
+
export type { ScoringRule, ScoringRuleSet, ScoringConfig, CompiledScoringRuleSet, ScoringOptions, ScoringResult, ScoreFunctionRegistry, ScoringMethod, OutputBounds, ScoringCategory, CategoryResult, OverrideEffect, OverrideDefinition, ForceTierOverride, FloorTierOverride, CapTierOverride, ExcludeOverride, AdjustScoreOverride, ClampScoreOverride, ForceScoreOverride, OverrideResult, CompiledOverrideDefinition } from './engines/scoring';
|
|
34
34
|
export { SequentialStrategy, compileSequentialRuleSet, sequentialStrategy } from './engines/sequential';
|
|
35
35
|
export type { SequentialRule, SequentialRuleSet, SequentialConfig, CompiledSequentialRuleSet, SequentialOptions, SequentialResult } from './engines/sequential';
|
|
36
36
|
export { FuzzyStrategy, compileFuzzyRuleSet, fuzzyStrategy, compileFuzzyVariable, analyzeCoverage, autoAdjustCoverage } from './engines/fuzzy';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAMlD,cAAc,QAAQ,CAAC;AAOvB,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,cAAc,EACd,aAAa,EACd,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,wBAAwB,EACxB,sBAAsB,EACtB,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,YAAY,EACZ,eAAe,EACf,cAAc,EACd,uBAAuB,EACvB,eAAe,EACf,cAAc,EACd,SAAS,EACT,WAAW,EACZ,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACb,sBAAsB,EACtB,cAAc,EACd,aAAa,EACb,qBAAqB,EACrB,aAAa,EACb,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;;;;;;;;;;;;;;;;AAEH,2CAA2C;AAC3C,UAAU;AACV,2CAA2C;AAE3C,iEAAiE;AACjE,6CAAkD;AAAzC,wGAAA,aAAa,OAAA;AACtB,+CAAoD;AAA3C,0GAAA,cAAc,OAAA;AACvB,6CAAkD;AAAzC,wGAAA,aAAa,OAAA;AACtB,mDAAwD;AAA/C,8GAAA,gBAAgB,OAAA;AACzB,yCAA8C;AAArC,oGAAA,WAAW,OAAA;AACpB,+CAAoD;AAA3C,0GAAA,cAAc,OAAA;AACvB,qDAAyD;AAAhD,+GAAA,gBAAgB,OAAA;AACzB,yDAA6D;AAApD,mHAAA,kBAAkB,OAAA;AAC3B,mDAAwD;AAA/C,8GAAA,gBAAgB,OAAA;AACzB,6CAAkD;AAAzC,wGAAA,aAAa,OAAA;AACtB,6CAAkD;AAAzC,wGAAA,aAAa,OAAA;AAEtB,2CAA2C;AAC3C,yBAAyB;AACzB,2CAA2C;AAE3C,yCAAuB;AAEvB,2CAA2C;AAC3C,UAAU;AACV,2CAA2C;AAE3C,mBAAmB;AACnB,6CAK2B;AAJzB,kHAAA,uBAAuB,OAAA;AACvB,gHAAA,qBAAqB,OAAA;AACrB,6GAAA,kBAAkB,OAAA;AAClB,0GAAA,eAAe,OAAA;AAcjB,oBAAoB;AACpB,+CAI4B;AAH1B,oHAAA,wBAAwB,OAAA;AACxB,kHAAA,sBAAsB,OAAA;AACtB,4GAAA,gBAAgB,OAAA;AAalB,UAAU;AACV,6CAI2B;AAHzB,0GAAA,eAAe,OAAA;AACf,gHAAA,qBAAqB,OAAA;AACrB,0GAAA,eAAe,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@higher.archi/boe",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "A multi-strategy rule engine supporting forward chaining, backward chaining, scoring, sequential, fuzzy logic, and Bayesian inference",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Operator Examples
|
|
3
3
|
*
|
|
4
4
|
* Demonstrates evaluation for each OperatorCategory.
|
|
5
|
-
* Run with: npx ts-node packages/
|
|
5
|
+
* Run with: npx ts-node packages/boe/src/core/operators/examples.ts
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { createDefaultRegistry, createEvaluator } from './index';
|
|
@@ -14,7 +14,9 @@ import {
|
|
|
14
14
|
ScoringConfig,
|
|
15
15
|
CompiledScoringRule,
|
|
16
16
|
CompiledScoringRuleSet,
|
|
17
|
-
CompiledScoringAction
|
|
17
|
+
CompiledScoringAction,
|
|
18
|
+
CompiledOverrideDefinition,
|
|
19
|
+
OverrideDefinition
|
|
18
20
|
} from './types';
|
|
19
21
|
|
|
20
22
|
// ========================================
|
|
@@ -110,22 +112,92 @@ export function compileScoringRule(rule: ScoringRule, index: number = 0): Compil
|
|
|
110
112
|
index,
|
|
111
113
|
inputs,
|
|
112
114
|
when,
|
|
115
|
+
category: rule.category,
|
|
113
116
|
action: compileScoringAction(rule.then)
|
|
114
117
|
};
|
|
115
118
|
}
|
|
116
119
|
|
|
120
|
+
// ========================================
|
|
121
|
+
// Override Compilation
|
|
122
|
+
// ========================================
|
|
123
|
+
|
|
124
|
+
function compileOverride(override: OverrideDefinition): CompiledOverrideDefinition {
|
|
125
|
+
const { condition, ...rest } = override;
|
|
126
|
+
return {
|
|
127
|
+
...rest,
|
|
128
|
+
condition: compileCondition(condition as Condition)
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
117
132
|
// ========================================
|
|
118
133
|
// RuleSet Compilation
|
|
119
134
|
// ========================================
|
|
120
135
|
|
|
121
136
|
export function compileScoringRuleSet(ruleSet: ScoringRuleSet): CompiledScoringRuleSet {
|
|
137
|
+
const categories = ruleSet.config?.categories;
|
|
138
|
+
|
|
139
|
+
// Validate categories if defined
|
|
140
|
+
if (categories?.length) {
|
|
141
|
+
const categoryIds = new Set(categories.map(c => c.id));
|
|
142
|
+
|
|
143
|
+
// Every rule must reference a valid category
|
|
144
|
+
for (const rule of ruleSet.rules) {
|
|
145
|
+
if (!rule.category) {
|
|
146
|
+
throw new Error(
|
|
147
|
+
`Rule "${rule.id}" is missing a category. When categories are defined, every rule must have a category.`
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
if (!categoryIds.has(rule.category)) {
|
|
151
|
+
throw new Error(
|
|
152
|
+
`Rule "${rule.id}" references unknown category "${rule.category}". Valid categories: ${[...categoryIds].join(', ')}`
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Normalize category weights to sum to 1.0
|
|
158
|
+
const totalWeight = categories.reduce((sum, c) => sum + c.weight, 0);
|
|
159
|
+
if (totalWeight > 0 && Math.abs(totalWeight - 1.0) > 0.001) {
|
|
160
|
+
for (const cat of categories) {
|
|
161
|
+
cat.weight = cat.weight / totalWeight;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Validate and compile overrides if defined
|
|
167
|
+
const overrides = ruleSet.config?.overrides;
|
|
168
|
+
let compiledOverrides: CompiledOverrideDefinition[] | undefined;
|
|
169
|
+
|
|
170
|
+
if (overrides?.length) {
|
|
171
|
+
const tierIds = new Set((ruleSet.config?.tiers ?? []).map(t => t.id));
|
|
172
|
+
|
|
173
|
+
for (const override of overrides) {
|
|
174
|
+
// Validate tier effects reference valid tiers
|
|
175
|
+
if (override.effect === 'force_tier' || override.effect === 'floor_tier' || override.effect === 'cap_tier') {
|
|
176
|
+
if (!tierIds.size) {
|
|
177
|
+
throw new Error(
|
|
178
|
+
`Override "${override.id}" uses effect "${override.effect}" but no tiers are defined.`
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
if (!tierIds.has(override.targetTier)) {
|
|
182
|
+
throw new Error(
|
|
183
|
+
`Override "${override.id}" references unknown tier "${override.targetTier}". Valid tiers: ${[...tierIds].join(', ')}`
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
compiledOverrides = overrides.map(compileOverride);
|
|
190
|
+
}
|
|
191
|
+
|
|
122
192
|
const config: ScoringConfig = {
|
|
123
193
|
mode: 'scoring',
|
|
124
194
|
strategies: ruleSet.config?.strategies ?? ['raw'],
|
|
125
195
|
caps: ruleSet.config?.caps,
|
|
126
196
|
outputBounds: ruleSet.config?.outputBounds,
|
|
127
197
|
baseScore: ruleSet.config?.baseScore,
|
|
128
|
-
tiers: ruleSet.config?.tiers
|
|
198
|
+
tiers: ruleSet.config?.tiers,
|
|
199
|
+
categories,
|
|
200
|
+
overrides
|
|
129
201
|
};
|
|
130
202
|
|
|
131
203
|
return {
|
|
@@ -134,6 +206,7 @@ export function compileScoringRuleSet(ruleSet: ScoringRuleSet): CompiledScoringR
|
|
|
134
206
|
mode: 'scoring',
|
|
135
207
|
schema: ruleSet.shape ? normalizeShape(ruleSet.shape) : { type: 'object' },
|
|
136
208
|
rules: ruleSet.rules.map((rule, index) => compileScoringRule(rule, index)),
|
|
137
|
-
config
|
|
209
|
+
config,
|
|
210
|
+
overrides: compiledOverrides
|
|
138
211
|
};
|
|
139
212
|
}
|
|
@@ -14,6 +14,21 @@ export {
|
|
|
14
14
|
// Tier types
|
|
15
15
|
TierDefinition,
|
|
16
16
|
ScoringTierMatch,
|
|
17
|
+
// Category types
|
|
18
|
+
ScoringCategory,
|
|
19
|
+
CategoryResult,
|
|
20
|
+
// Override types
|
|
21
|
+
OverrideEffect,
|
|
22
|
+
OverrideDefinition,
|
|
23
|
+
ForceTierOverride,
|
|
24
|
+
FloorTierOverride,
|
|
25
|
+
CapTierOverride,
|
|
26
|
+
ExcludeOverride,
|
|
27
|
+
AdjustScoreOverride,
|
|
28
|
+
ClampScoreOverride,
|
|
29
|
+
ForceScoreOverride,
|
|
30
|
+
OverrideResult,
|
|
31
|
+
CompiledOverrideDefinition,
|
|
17
32
|
// Source types
|
|
18
33
|
ScoringAction,
|
|
19
34
|
ScoringRule,
|
|
@@ -16,7 +16,10 @@ import {
|
|
|
16
16
|
CompiledScoringAction,
|
|
17
17
|
ScoringOptions,
|
|
18
18
|
ScoringResult,
|
|
19
|
-
ScoringTierMatch
|
|
19
|
+
ScoringTierMatch,
|
|
20
|
+
OverrideResult,
|
|
21
|
+
CategoryResult,
|
|
22
|
+
TierDefinition
|
|
20
23
|
} from './types';
|
|
21
24
|
|
|
22
25
|
export class ScoringStrategy {
|
|
@@ -119,8 +122,101 @@ export class ScoringStrategy {
|
|
|
119
122
|
contributions[rule.id] = accumulatedScore;
|
|
120
123
|
}
|
|
121
124
|
|
|
122
|
-
// Phase 3: Apply global strategies
|
|
123
|
-
|
|
125
|
+
// Phase 3: Apply global strategies
|
|
126
|
+
let categoryBreakdown: CategoryResult[] | undefined;
|
|
127
|
+
|
|
128
|
+
if (config.categories?.length) {
|
|
129
|
+
// Category-aware aggregation
|
|
130
|
+
const categories = config.categories;
|
|
131
|
+
// Group all rules (fired and unfired) by category
|
|
132
|
+
const rulesByCategory = new Map<string, { fired: string[]; missing: string[] }>();
|
|
133
|
+
for (const cat of categories) {
|
|
134
|
+
rulesByCategory.set(cat.id, { fired: [], missing: [] });
|
|
135
|
+
}
|
|
136
|
+
for (const rule of ruleSet.rules) {
|
|
137
|
+
const catId = rule.category!;
|
|
138
|
+
const group = rulesByCategory.get(catId)!;
|
|
139
|
+
if (fired.includes(rule.id)) {
|
|
140
|
+
group.fired.push(rule.id);
|
|
141
|
+
} else {
|
|
142
|
+
group.missing.push(rule.id);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Build category results
|
|
147
|
+
const catResults: CategoryResult[] = [];
|
|
148
|
+
for (const cat of categories) {
|
|
149
|
+
const group = rulesByCategory.get(cat.id)!;
|
|
150
|
+
const totalSignals = group.fired.length + group.missing.length;
|
|
151
|
+
const minRatio = cat.minSignalRatio ?? 0.5;
|
|
152
|
+
const excluded = totalSignals > 0 && (group.fired.length / totalSignals) < minRatio;
|
|
153
|
+
|
|
154
|
+
let rawScore = 0;
|
|
155
|
+
if (!excluded && group.fired.length > 0) {
|
|
156
|
+
// Normalize signal weights within category to sum to 1.0 among fired signals
|
|
157
|
+
const firedWeights: Record<string, number> = {};
|
|
158
|
+
let totalFiredWeight = 0;
|
|
159
|
+
for (const ruleId of group.fired) {
|
|
160
|
+
const w = weights[ruleId] ?? 1;
|
|
161
|
+
firedWeights[ruleId] = w;
|
|
162
|
+
totalFiredWeight += w;
|
|
163
|
+
}
|
|
164
|
+
// Compute weighted average of fired signal scores
|
|
165
|
+
for (const ruleId of group.fired) {
|
|
166
|
+
const normalizedWeight = totalFiredWeight > 0 ? firedWeights[ruleId] / totalFiredWeight : 0;
|
|
167
|
+
rawScore += contributions[ruleId] * normalizedWeight;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
catResults.push({
|
|
172
|
+
id: cat.id,
|
|
173
|
+
name: cat.name,
|
|
174
|
+
weight: cat.weight,
|
|
175
|
+
effectiveWeight: excluded ? 0 : cat.weight,
|
|
176
|
+
rawScore,
|
|
177
|
+
weightedContribution: 0, // computed after redistribution
|
|
178
|
+
signalsWithData: group.fired,
|
|
179
|
+
signalsMissing: group.missing,
|
|
180
|
+
excluded
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Redistribute excluded category weights proportionally to active categories
|
|
185
|
+
const excludedWeight = catResults.filter(c => c.excluded).reduce((sum, c) => sum + c.weight, 0);
|
|
186
|
+
const activeWeight = catResults.filter(c => !c.excluded).reduce((sum, c) => sum + c.weight, 0);
|
|
187
|
+
if (activeWeight > 0 && excludedWeight > 0) {
|
|
188
|
+
for (const cr of catResults) {
|
|
189
|
+
if (!cr.excluded) {
|
|
190
|
+
cr.effectiveWeight = cr.weight + (cr.weight / activeWeight) * excludedWeight;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Compute weighted contributions and update per-rule contributions
|
|
196
|
+
for (const cr of catResults) {
|
|
197
|
+
cr.weightedContribution = cr.effectiveWeight * cr.rawScore;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Rewrite per-rule contributions to reflect category-weighted values
|
|
201
|
+
for (const cr of catResults) {
|
|
202
|
+
if (cr.excluded || cr.signalsWithData.length === 0) continue;
|
|
203
|
+
const firedWeightsTotal = cr.signalsWithData.reduce((sum, id) => sum + (weights[id] ?? 1), 0);
|
|
204
|
+
for (const ruleId of cr.signalsWithData) {
|
|
205
|
+
const normalizedWeight = firedWeightsTotal > 0 ? (weights[ruleId] ?? 1) / firedWeightsTotal : 0;
|
|
206
|
+
contributions[ruleId] = contributions[ruleId] * normalizedWeight * cr.effectiveWeight;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// Zero out contributions for excluded categories
|
|
210
|
+
for (const cr of catResults) {
|
|
211
|
+
if (cr.excluded) {
|
|
212
|
+
for (const ruleId of cr.signalsWithData) {
|
|
213
|
+
contributions[ruleId] = 0;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
categoryBreakdown = catResults;
|
|
219
|
+
} else if (strategies.includes('weighted-percent')) {
|
|
124
220
|
const totalWeight = Object.values(weights).reduce((sum, w) => sum + w, 0);
|
|
125
221
|
if (totalWeight > 0) {
|
|
126
222
|
for (const ruleId in contributions) {
|
|
@@ -145,7 +241,7 @@ export class ScoringStrategy {
|
|
|
145
241
|
|
|
146
242
|
// Calculate total score (base score + contributions)
|
|
147
243
|
const baseScore = config.baseScore ?? 0;
|
|
148
|
-
|
|
244
|
+
let totalScore = baseScore + Object.values(contributions).reduce((sum, score) => sum + score, 0);
|
|
149
245
|
|
|
150
246
|
// Match tier if tiers are configured
|
|
151
247
|
let tier: ScoringTierMatch | undefined;
|
|
@@ -173,6 +269,136 @@ export class ScoringStrategy {
|
|
|
173
269
|
}
|
|
174
270
|
}
|
|
175
271
|
|
|
272
|
+
// Phase 4: Override evaluation
|
|
273
|
+
let overrideResult: OverrideResult | undefined;
|
|
274
|
+
|
|
275
|
+
if (ruleSet.overrides?.length && ruleSet.overrides.length > 0) {
|
|
276
|
+
// Build a BindingContext from all facts in working memory (type name -> fact)
|
|
277
|
+
const allFacts = wm.getAll();
|
|
278
|
+
const context: Record<string, any> = {};
|
|
279
|
+
for (const fact of allFacts) {
|
|
280
|
+
// Use lowercase type name as the binding key (e.g., Deal -> deal)
|
|
281
|
+
const key = fact.type.charAt(0).toLowerCase() + fact.type.slice(1);
|
|
282
|
+
context[key] = fact;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Helper to resolve tier threshold for ranking
|
|
286
|
+
const resolveThreshold = (t: number | '-Infinity'): number =>
|
|
287
|
+
t === '-Infinity' ? Number.NEGATIVE_INFINITY : t;
|
|
288
|
+
|
|
289
|
+
// Build tier lookup and ranking
|
|
290
|
+
const tierMap = new Map<string, TierDefinition>();
|
|
291
|
+
const sortedTierIds: string[] = [];
|
|
292
|
+
if (config.tiers?.length) {
|
|
293
|
+
const sorted = [...config.tiers].sort(
|
|
294
|
+
(a, b) => resolveThreshold(b.threshold) - resolveThreshold(a.threshold)
|
|
295
|
+
);
|
|
296
|
+
for (const t of sorted) {
|
|
297
|
+
tierMap.set(t.id, t);
|
|
298
|
+
sortedTierIds.push(t.id);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
const tierRank = (tierId: string | undefined): number => {
|
|
303
|
+
if (!tierId) return -1;
|
|
304
|
+
const idx = sortedTierIds.indexOf(tierId);
|
|
305
|
+
return idx === -1 ? -1 : sortedTierIds.length - idx; // higher rank = higher tier
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
const findTier = (tierId: string): ScoringTierMatch | undefined => {
|
|
309
|
+
const def = tierMap.get(tierId);
|
|
310
|
+
if (!def) return undefined;
|
|
311
|
+
return {
|
|
312
|
+
id: def.id,
|
|
313
|
+
name: def.name,
|
|
314
|
+
description: def.description,
|
|
315
|
+
threshold: resolveThreshold(def.threshold)
|
|
316
|
+
};
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
// Evaluate overrides in order — first match wins
|
|
320
|
+
for (const override of ruleSet.overrides) {
|
|
321
|
+
let matched: boolean;
|
|
322
|
+
try {
|
|
323
|
+
matched = evaluateCondition(override.condition as any, context) as unknown as boolean;
|
|
324
|
+
} catch {
|
|
325
|
+
matched = false;
|
|
326
|
+
}
|
|
327
|
+
if (!matched) continue;
|
|
328
|
+
|
|
329
|
+
const originalScore = totalScore;
|
|
330
|
+
const originalTier = tier ? { ...tier } : undefined;
|
|
331
|
+
|
|
332
|
+
switch (override.effect) {
|
|
333
|
+
case 'force_tier': {
|
|
334
|
+
tier = findTier(override.targetTier);
|
|
335
|
+
if (override.score !== undefined) {
|
|
336
|
+
totalScore = override.score;
|
|
337
|
+
}
|
|
338
|
+
break;
|
|
339
|
+
}
|
|
340
|
+
case 'floor_tier': {
|
|
341
|
+
if (tierRank(tier?.id) < tierRank(override.targetTier)) {
|
|
342
|
+
tier = findTier(override.targetTier);
|
|
343
|
+
}
|
|
344
|
+
break;
|
|
345
|
+
}
|
|
346
|
+
case 'cap_tier': {
|
|
347
|
+
if (tierRank(tier?.id) > tierRank(override.targetTier)) {
|
|
348
|
+
tier = findTier(override.targetTier);
|
|
349
|
+
}
|
|
350
|
+
break;
|
|
351
|
+
}
|
|
352
|
+
case 'exclude': {
|
|
353
|
+
const executionTimeMs = Math.round((performance.now() - startTime) * 100) / 100;
|
|
354
|
+
return {
|
|
355
|
+
totalScore: 0,
|
|
356
|
+
contributions: {},
|
|
357
|
+
fired: [],
|
|
358
|
+
iterations: 1,
|
|
359
|
+
override: {
|
|
360
|
+
id: override.id,
|
|
361
|
+
effect: 'exclude',
|
|
362
|
+
originalScore,
|
|
363
|
+
originalTier,
|
|
364
|
+
applied: true
|
|
365
|
+
},
|
|
366
|
+
categoryBreakdown,
|
|
367
|
+
executionTimeMs
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
case 'adjust_score': {
|
|
371
|
+
totalScore += override.value;
|
|
372
|
+
break;
|
|
373
|
+
}
|
|
374
|
+
case 'clamp_score': {
|
|
375
|
+
if (override.min !== undefined) totalScore = Math.max(override.min, totalScore);
|
|
376
|
+
if (override.max !== undefined) totalScore = Math.min(override.max, totalScore);
|
|
377
|
+
break;
|
|
378
|
+
}
|
|
379
|
+
case 'force_score': {
|
|
380
|
+
if (typeof override.score === 'number') {
|
|
381
|
+
totalScore = override.score;
|
|
382
|
+
} else {
|
|
383
|
+
const result = evaluateCondition(override.score as any, context);
|
|
384
|
+
totalScore = typeof result === 'number' ? result : 0;
|
|
385
|
+
}
|
|
386
|
+
break;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
overrideResult = {
|
|
391
|
+
id: override.id,
|
|
392
|
+
effect: override.effect,
|
|
393
|
+
originalScore,
|
|
394
|
+
originalTier,
|
|
395
|
+
applied: true
|
|
396
|
+
};
|
|
397
|
+
|
|
398
|
+
break; // first match wins
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
176
402
|
const executionTimeMs = Math.round((performance.now() - startTime) * 100) / 100;
|
|
177
403
|
|
|
178
404
|
return {
|
|
@@ -181,6 +407,8 @@ export class ScoringStrategy {
|
|
|
181
407
|
fired,
|
|
182
408
|
iterations: 1,
|
|
183
409
|
tier,
|
|
410
|
+
categoryBreakdown,
|
|
411
|
+
override: overrideResult,
|
|
184
412
|
executionTimeMs
|
|
185
413
|
};
|
|
186
414
|
}
|