@higher.archi/boe 1.0.7 → 1.0.8
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/evaluation/decay.d.ts +60 -0
- package/dist/core/evaluation/decay.d.ts.map +1 -0
- package/dist/core/evaluation/decay.js +111 -0
- package/dist/core/evaluation/decay.js.map +1 -0
- package/dist/core/evaluation/index.d.ts +2 -0
- package/dist/core/evaluation/index.d.ts.map +1 -1
- package/dist/core/evaluation/index.js +5 -1
- package/dist/core/evaluation/index.js.map +1 -1
- package/dist/engines/bayesian/compiler.d.ts.map +1 -1
- package/dist/engines/bayesian/compiler.js +14 -2
- package/dist/engines/bayesian/compiler.js.map +1 -1
- package/dist/engines/bayesian/strategy.d.ts.map +1 -1
- package/dist/engines/bayesian/strategy.js +41 -4
- package/dist/engines/bayesian/strategy.js.map +1 -1
- package/dist/engines/bayesian/types.d.ts +16 -0
- package/dist/engines/bayesian/types.d.ts.map +1 -1
- package/dist/engines/bayesian/types.js.map +1 -1
- package/dist/engines/defeasible/compiler.d.ts.map +1 -1
- package/dist/engines/defeasible/compiler.js +16 -2
- package/dist/engines/defeasible/compiler.js.map +1 -1
- package/dist/engines/defeasible/strategy.d.ts.map +1 -1
- package/dist/engines/defeasible/strategy.js +47 -2
- package/dist/engines/defeasible/strategy.js.map +1 -1
- package/dist/engines/defeasible/types.d.ts +29 -1
- package/dist/engines/defeasible/types.d.ts.map +1 -1
- package/dist/engines/defeasible/types.js.map +1 -1
- package/dist/engines/scoring/compiler.d.ts.map +1 -1
- package/dist/engines/scoring/compiler.js +17 -4
- package/dist/engines/scoring/compiler.js.map +1 -1
- package/dist/engines/scoring/strategy.d.ts.map +1 -1
- package/dist/engines/scoring/strategy.js +49 -0
- package/dist/engines/scoring/strategy.js.map +1 -1
- package/dist/engines/scoring/types.d.ts +16 -0
- package/dist/engines/scoring/types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/core/evaluation/decay.ts +165 -0
- package/src/core/evaluation/index.ts +13 -0
- package/src/engines/bayesian/compiler.ts +15 -2
- package/src/engines/bayesian/strategy.ts +54 -4
- package/src/engines/bayesian/types.ts +17 -0
- package/src/engines/defeasible/compiler.ts +17 -2
- package/src/engines/defeasible/strategy.ts +62 -2
- package/src/engines/defeasible/types.ts +33 -0
- package/src/engines/scoring/compiler.ts +18 -4
- package/src/engines/scoring/strategy.ts +63 -0
- package/src/engines/scoring/types.ts +17 -0
- package/src/index.ts +12 -0
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -30,7 +30,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
30
30
|
};
|
|
31
31
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
32
|
exports.compileUtilityRule = exports.compileUtilityRuleSet = exports.UtilityStrategy = exports.SEMANTIC_WEIGHTS = exports.constraintStrategy = exports.compileConstraintRuleSet = exports.ConstraintStrategy = exports.stateMachineStrategy = exports.compileStateMachineDefinition = exports.compileStateMachine = exports.StateMachineStrategy = exports.monteCarloStrategy = exports.compileMonteCarloRuleSet = exports.MonteCarloStrategy = exports.SEMANTIC_LIKELIHOODS = exports.parseLikelihood = exports.bayesianStrategy = exports.compileBayesianRule = exports.compileBayesianRuleSet = exports.BayesianStrategy = exports.autoAdjustCoverage = exports.analyzeCoverage = exports.compileFuzzyVariable = exports.fuzzyStrategy = exports.compileFuzzyRuleSet = exports.FuzzyStrategy = exports.sequentialStrategy = exports.compileSequentialRuleSet = exports.SequentialStrategy = exports.scoringStrategy = exports.compileScoringRuleSet = exports.ScoringStrategy = exports.backwardStrategy = exports.compileBackwardRuleSet = exports.BackwardChainingStrategy = exports.forwardStrategy = exports.compileForwardRule = exports.compileForwardRuleSet = exports.ForwardChainingStrategy = exports.PricingEngine = exports.UtilityEngine = exports.ConstraintEngine = exports.StateMachineEngine = exports.MonteCarloEngine = exports.BayesianEngine = exports.FuzzyEngine = exports.SequentialEngine = exports.ScoringEngine = exports.BackwardEngine = exports.ForwardEngine = void 0;
|
|
33
|
-
exports.cosineSimilarity = exports.caverphone2 = exports.nysiis = exports.soundex = exports.getCurrencyInfo = exports.CURRENCIES = exports.applyMinMax = exports.calculateDiscount = exports.round = exports.formatPercent = exports.formatNumber = exports.formatCurrency = exports.calculateVolume = exports.calculateGraduated = exports.calculateFlat = exports.pricingEngine = exports.pricingStrategy = exports.compilePricingRule = exports.compilePricingRuleSet = exports.PricingStrategy = exports.buildAvailableRefs = exports.hasInterpolation = exports.interpolate = exports.compileTemplate = exports.expertStrategy = exports.compileExpertRuleSet = exports.ExpertStrategy = exports.ExpertEngine = exports.compileDefeasibleRuleSet = exports.DefeasibleEngine = exports.utilityStrategy = void 0;
|
|
33
|
+
exports.resolveDecayTimestamp = exports.calculateDecayMultiplier = exports.cosineSimilarity = exports.caverphone2 = exports.nysiis = exports.soundex = exports.getCurrencyInfo = exports.CURRENCIES = exports.applyMinMax = exports.calculateDiscount = exports.round = exports.formatPercent = exports.formatNumber = exports.formatCurrency = exports.calculateVolume = exports.calculateGraduated = exports.calculateFlat = exports.pricingEngine = exports.pricingStrategy = exports.compilePricingRule = exports.compilePricingRuleSet = exports.PricingStrategy = exports.buildAvailableRefs = exports.hasInterpolation = exports.interpolate = exports.compileTemplate = exports.expertStrategy = exports.compileExpertRuleSet = exports.ExpertStrategy = exports.ExpertEngine = exports.compileDefeasibleRuleSet = exports.DefeasibleEngine = exports.utilityStrategy = void 0;
|
|
34
34
|
// ========================================
|
|
35
35
|
// Engines
|
|
36
36
|
// ========================================
|
|
@@ -169,6 +169,10 @@ Object.defineProperty(exports, "soundex", { enumerable: true, get: function () {
|
|
|
169
169
|
Object.defineProperty(exports, "nysiis", { enumerable: true, get: function () { return functions_1.nysiis; } });
|
|
170
170
|
Object.defineProperty(exports, "caverphone2", { enumerable: true, get: function () { return functions_1.caverphone2; } });
|
|
171
171
|
Object.defineProperty(exports, "cosineSimilarity", { enumerable: true, get: function () { return functions_1.cosineSimilarity; } });
|
|
172
|
+
// Temporal Decay (re-exported from core for convenience)
|
|
173
|
+
var decay_1 = require("./core/evaluation/decay");
|
|
174
|
+
Object.defineProperty(exports, "calculateDecayMultiplier", { enumerable: true, get: function () { return decay_1.calculateDecayMultiplier; } });
|
|
175
|
+
Object.defineProperty(exports, "resolveDecayTimestamp", { enumerable: true, get: function () { return decay_1.resolveDecayTimestamp; } });
|
|
172
176
|
// ========================================
|
|
173
177
|
// QFacts - Probabilistic Fact Hydration
|
|
174
178
|
// ========================================
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
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.8",
|
|
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",
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Temporal Decay Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides continuous decay multipliers (0→1) that degrade a rule's
|
|
5
|
+
* contribution based on how old its underlying data is.
|
|
6
|
+
*
|
|
7
|
+
* Complementary to temporal validity (binary gate) — validity runs first,
|
|
8
|
+
* decay modifies strength continuously.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { BindingContext, Fact } from '../types';
|
|
12
|
+
|
|
13
|
+
// ========================================
|
|
14
|
+
// Types
|
|
15
|
+
// ========================================
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Decay curve shape
|
|
19
|
+
* - exponential: e^(-ln(2)/halfLife * age), smooth asymptotic decay
|
|
20
|
+
* - linear: 1 - age/maxAge, straight-line to zero
|
|
21
|
+
* - step: binary cutoff at threshold age
|
|
22
|
+
*/
|
|
23
|
+
export type DecayCurve = 'exponential' | 'linear' | 'step';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Time unit for decay calculations
|
|
27
|
+
*/
|
|
28
|
+
export type DecayTimeUnit = 'hours' | 'days' | 'weeks' | 'months';
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Configuration for temporal decay
|
|
32
|
+
*/
|
|
33
|
+
export type DecayConfig = {
|
|
34
|
+
curve: DecayCurve;
|
|
35
|
+
timeUnit: DecayTimeUnit;
|
|
36
|
+
halfLife?: number; // exponential: age at which multiplier = 0.5
|
|
37
|
+
maxAge?: number; // linear: age at which multiplier = 0
|
|
38
|
+
threshold?: number; // step: binary cutoff age
|
|
39
|
+
floor?: number; // minimum multiplier (default 0)
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Decay calculation result with audit trail
|
|
44
|
+
*/
|
|
45
|
+
export type DecayInfo = {
|
|
46
|
+
multiplier: number;
|
|
47
|
+
ageInUnits: number;
|
|
48
|
+
curve: DecayCurve;
|
|
49
|
+
timestamp: string; // resolved ISO timestamp
|
|
50
|
+
fullyDecayed: boolean;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// ========================================
|
|
54
|
+
// Time Unit Conversion
|
|
55
|
+
// ========================================
|
|
56
|
+
|
|
57
|
+
const MS_PER_HOUR = 3_600_000;
|
|
58
|
+
const MS_PER_DAY = 86_400_000;
|
|
59
|
+
const MS_PER_WEEK = 604_800_000;
|
|
60
|
+
const MS_PER_MONTH = 2_592_000_000; // 30 days
|
|
61
|
+
|
|
62
|
+
function msPerUnit(unit: DecayTimeUnit): number {
|
|
63
|
+
switch (unit) {
|
|
64
|
+
case 'hours': return MS_PER_HOUR;
|
|
65
|
+
case 'days': return MS_PER_DAY;
|
|
66
|
+
case 'weeks': return MS_PER_WEEK;
|
|
67
|
+
case 'months': return MS_PER_MONTH;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// ========================================
|
|
72
|
+
// Core Calculation
|
|
73
|
+
// ========================================
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Calculate a decay multiplier based on age and configuration
|
|
77
|
+
*
|
|
78
|
+
* @param dataTimestamp - When the data was collected/created
|
|
79
|
+
* @param now - Current time reference point
|
|
80
|
+
* @param config - Decay configuration
|
|
81
|
+
* @returns DecayInfo with multiplier and audit data
|
|
82
|
+
*/
|
|
83
|
+
export function calculateDecayMultiplier(
|
|
84
|
+
dataTimestamp: Date,
|
|
85
|
+
now: Date,
|
|
86
|
+
config: DecayConfig
|
|
87
|
+
): DecayInfo {
|
|
88
|
+
const ageMs = now.getTime() - dataTimestamp.getTime();
|
|
89
|
+
const ageInUnits = ageMs / msPerUnit(config.timeUnit);
|
|
90
|
+
const floor = config.floor ?? 0;
|
|
91
|
+
|
|
92
|
+
let rawMultiplier: number;
|
|
93
|
+
|
|
94
|
+
switch (config.curve) {
|
|
95
|
+
case 'exponential': {
|
|
96
|
+
const halfLife = config.halfLife ?? 1;
|
|
97
|
+
// e^(-ln(2)/halfLife * age)
|
|
98
|
+
rawMultiplier = Math.exp(-Math.LN2 / halfLife * ageInUnits);
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
case 'linear': {
|
|
103
|
+
const maxAge = config.maxAge ?? 1;
|
|
104
|
+
rawMultiplier = 1 - ageInUnits / maxAge;
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
case 'step': {
|
|
109
|
+
const threshold = config.threshold ?? 1;
|
|
110
|
+
rawMultiplier = ageInUnits < threshold ? 1.0 : 0.0;
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Clamp to [floor, 1]
|
|
116
|
+
const multiplier = Math.max(floor, Math.min(1, rawMultiplier));
|
|
117
|
+
|
|
118
|
+
return {
|
|
119
|
+
multiplier,
|
|
120
|
+
ageInUnits,
|
|
121
|
+
curve: config.curve,
|
|
122
|
+
timestamp: dataTimestamp.toISOString(),
|
|
123
|
+
fullyDecayed: multiplier <= floor
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Resolve a decay timestamp from a $-prefixed path in the binding context
|
|
129
|
+
*
|
|
130
|
+
* @param ref - A $-prefixed path like '$inspection.date'
|
|
131
|
+
* @param context - The current binding context
|
|
132
|
+
* @returns Resolved Date, or null if path is missing/invalid
|
|
133
|
+
*/
|
|
134
|
+
export function resolveDecayTimestamp(ref: string, context: BindingContext): Date | null {
|
|
135
|
+
if (!ref.startsWith('$')) return null;
|
|
136
|
+
|
|
137
|
+
const stripped = ref.slice(1);
|
|
138
|
+
const parts = stripped.split('.');
|
|
139
|
+
const param = parts[0];
|
|
140
|
+
const path = parts.slice(1);
|
|
141
|
+
|
|
142
|
+
const fact = context[param] as Fact | undefined;
|
|
143
|
+
if (!fact) return null;
|
|
144
|
+
|
|
145
|
+
let value: any = fact.data;
|
|
146
|
+
for (const key of path) {
|
|
147
|
+
if (value === null || value === undefined) return null;
|
|
148
|
+
value = value[key];
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (value === null || value === undefined) return null;
|
|
152
|
+
|
|
153
|
+
// Accept Date objects, ISO strings, or numeric timestamps
|
|
154
|
+
if (value instanceof Date) return value;
|
|
155
|
+
if (typeof value === 'string') {
|
|
156
|
+
const parsed = new Date(value);
|
|
157
|
+
return isNaN(parsed.getTime()) ? null : parsed;
|
|
158
|
+
}
|
|
159
|
+
if (typeof value === 'number') {
|
|
160
|
+
const parsed = new Date(value);
|
|
161
|
+
return isNaN(parsed.getTime()) ? null : parsed;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
@@ -18,3 +18,16 @@ export {
|
|
|
18
18
|
getRuleTemporalInfo,
|
|
19
19
|
RulesetMetadata
|
|
20
20
|
} from './temporal';
|
|
21
|
+
|
|
22
|
+
// Temporal decay utilities
|
|
23
|
+
export {
|
|
24
|
+
calculateDecayMultiplier,
|
|
25
|
+
resolveDecayTimestamp
|
|
26
|
+
} from './decay';
|
|
27
|
+
|
|
28
|
+
export type {
|
|
29
|
+
DecayCurve,
|
|
30
|
+
DecayTimeUnit,
|
|
31
|
+
DecayConfig,
|
|
32
|
+
DecayInfo
|
|
33
|
+
} from './decay';
|
|
@@ -346,6 +346,17 @@ export function compileBayesianRule(
|
|
|
346
346
|
const inputs = rule.inputs.map(compileInputParameter);
|
|
347
347
|
const when = rule.when ? compileCondition(rule.when) : undefined;
|
|
348
348
|
|
|
349
|
+
// Compile decay — only pass through $-prefixed string timestamps
|
|
350
|
+
let compiledDecay: { timestamp: string; config?: any } | undefined;
|
|
351
|
+
if (rule.decay) {
|
|
352
|
+
const ts = rule.decay.timestamp;
|
|
353
|
+
if (typeof ts === 'string') {
|
|
354
|
+
compiledDecay = { timestamp: ts, config: rule.decay.config };
|
|
355
|
+
}
|
|
356
|
+
// Expression timestamps for Bayesian are not supported (would need runtime eval);
|
|
357
|
+
// only $-prefixed paths are supported
|
|
358
|
+
}
|
|
359
|
+
|
|
349
360
|
return {
|
|
350
361
|
id: rule.id,
|
|
351
362
|
name: rule.name,
|
|
@@ -354,7 +365,8 @@ export function compileBayesianRule(
|
|
|
354
365
|
index,
|
|
355
366
|
inputs,
|
|
356
367
|
when,
|
|
357
|
-
likelihood: compileLikelihoodMap(rule.likelihood, hypothesisNames, rule.id)
|
|
368
|
+
likelihood: compileLikelihoodMap(rule.likelihood, hypothesisNames, rule.id),
|
|
369
|
+
decay: compiledDecay
|
|
358
370
|
};
|
|
359
371
|
}
|
|
360
372
|
|
|
@@ -370,7 +382,8 @@ export function compileBayesianRuleSet(ruleSet: BayesianRuleSet): CompiledBayesi
|
|
|
370
382
|
const config: BayesianConfig = {
|
|
371
383
|
mode: 'bayesian',
|
|
372
384
|
threshold: ruleSet.config?.threshold,
|
|
373
|
-
priorDefault: ruleSet.config?.priorDefault ?? 'uniform'
|
|
385
|
+
priorDefault: ruleSet.config?.priorDefault ?? 'uniform',
|
|
386
|
+
decay: ruleSet.config?.decay
|
|
374
387
|
};
|
|
375
388
|
|
|
376
389
|
// Get hypothesis names for validation
|
|
@@ -13,6 +13,12 @@ import {
|
|
|
13
13
|
Fact
|
|
14
14
|
} from '../../core';
|
|
15
15
|
import { IWorkingMemory } from '../../core/memory';
|
|
16
|
+
import {
|
|
17
|
+
calculateDecayMultiplier,
|
|
18
|
+
resolveDecayTimestamp,
|
|
19
|
+
DecayConfig,
|
|
20
|
+
DecayInfo
|
|
21
|
+
} from '../../core/evaluation/decay';
|
|
16
22
|
|
|
17
23
|
import {
|
|
18
24
|
CompiledBayesianRuleSet,
|
|
@@ -191,6 +197,8 @@ export class BayesianStrategy {
|
|
|
191
197
|
const fired: string[] = [];
|
|
192
198
|
const evidence: EvidenceEntry[] = [];
|
|
193
199
|
let thresholdExceeded: string | undefined;
|
|
200
|
+
const decayInfoMap: Record<string, DecayInfo> = {};
|
|
201
|
+
const now = new Date();
|
|
194
202
|
|
|
195
203
|
// Track which hypotheses were below threshold initially
|
|
196
204
|
// (so we can detect when they cross it)
|
|
@@ -213,20 +221,59 @@ export class BayesianStrategy {
|
|
|
213
221
|
fired.push(rule.id);
|
|
214
222
|
}
|
|
215
223
|
|
|
224
|
+
// Compute decay for this rule's evidence
|
|
225
|
+
let effectiveLikelihoods = rule.likelihood;
|
|
226
|
+
let likelihoodsBeforeDecay: CompiledLikelihoodMap | undefined;
|
|
227
|
+
let ruleDecayInfo: DecayInfo | undefined;
|
|
228
|
+
|
|
229
|
+
const ruleDecay = rule.decay;
|
|
230
|
+
const engineDecay = config.decay;
|
|
231
|
+
|
|
232
|
+
if (ruleDecay || engineDecay) {
|
|
233
|
+
const tsRef = ruleDecay?.timestamp ?? (engineDecay?.timestamp as string | undefined);
|
|
234
|
+
|
|
235
|
+
if (typeof tsRef === 'string') {
|
|
236
|
+
const dataTimestamp = resolveDecayTimestamp(tsRef, activation.facts);
|
|
237
|
+
|
|
238
|
+
if (dataTimestamp) {
|
|
239
|
+
const decayConfig: DecayConfig = {
|
|
240
|
+
...(engineDecay?.config ?? { curve: 'exponential', timeUnit: 'days' }),
|
|
241
|
+
...ruleDecay?.config
|
|
242
|
+
} as DecayConfig;
|
|
243
|
+
|
|
244
|
+
const info = calculateDecayMultiplier(dataTimestamp, now, decayConfig);
|
|
245
|
+
ruleDecayInfo = info;
|
|
246
|
+
decayInfoMap[rule.id] = info;
|
|
247
|
+
|
|
248
|
+
// Decay likelihoods toward 1.0 (neutral)
|
|
249
|
+
// decayedLikelihood = 1.0 + (originalLikelihood - 1.0) * multiplier
|
|
250
|
+
if (info.multiplier < 1.0) {
|
|
251
|
+
likelihoodsBeforeDecay = { ...rule.likelihood };
|
|
252
|
+
effectiveLikelihoods = {};
|
|
253
|
+
for (const [h, lh] of Object.entries(rule.likelihood)) {
|
|
254
|
+
effectiveLikelihoods[h] = 1.0 + (lh - 1.0) * info.multiplier;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
216
261
|
// Record evidence
|
|
217
262
|
evidence.push({
|
|
218
263
|
ruleId: rule.id,
|
|
219
264
|
ruleName: rule.name,
|
|
220
|
-
likelihoods:
|
|
265
|
+
likelihoods: effectiveLikelihoods,
|
|
266
|
+
likelihoodsBeforeDecay,
|
|
267
|
+
decayInfo: ruleDecayInfo
|
|
221
268
|
});
|
|
222
269
|
|
|
223
270
|
// Callback
|
|
224
271
|
if (onFire) {
|
|
225
|
-
onFire(rule.id, activation.facts,
|
|
272
|
+
onFire(rule.id, activation.facts, effectiveLikelihoods);
|
|
226
273
|
}
|
|
227
274
|
|
|
228
|
-
// Update posteriors with this evidence
|
|
229
|
-
posteriors = applyEvidence(posteriors,
|
|
275
|
+
// Update posteriors with this evidence (using decayed likelihoods)
|
|
276
|
+
posteriors = applyEvidence(posteriors, effectiveLikelihoods);
|
|
230
277
|
|
|
231
278
|
// Check if any hypothesis crossed the threshold (from below to above)
|
|
232
279
|
if (threshold !== undefined && thresholdExceeded === undefined) {
|
|
@@ -255,6 +302,8 @@ export class BayesianStrategy {
|
|
|
255
302
|
|
|
256
303
|
const executionTimeMs = Math.round((performance.now() - startTime) * 100) / 100;
|
|
257
304
|
|
|
305
|
+
const hasDecay = Object.keys(decayInfoMap).length > 0;
|
|
306
|
+
|
|
258
307
|
return {
|
|
259
308
|
priors: normalizedPriors,
|
|
260
309
|
posteriors,
|
|
@@ -263,6 +312,7 @@ export class BayesianStrategy {
|
|
|
263
312
|
fired,
|
|
264
313
|
evidence,
|
|
265
314
|
thresholdExceeded,
|
|
315
|
+
...(hasDecay ? { decayInfo: decayInfoMap } : {}),
|
|
266
316
|
iterations: 1,
|
|
267
317
|
executionTimeMs
|
|
268
318
|
};
|
|
@@ -17,6 +17,8 @@ import {
|
|
|
17
17
|
BindingContext
|
|
18
18
|
} from '../../core';
|
|
19
19
|
|
|
20
|
+
import { DecayConfig, DecayInfo } from '../../core/evaluation/decay';
|
|
21
|
+
|
|
20
22
|
// ========================================
|
|
21
23
|
// Likelihood Value Types
|
|
22
24
|
// ========================================
|
|
@@ -100,6 +102,10 @@ export type PriorDefault =
|
|
|
100
102
|
*/
|
|
101
103
|
export type BayesianRule = BaseRule & {
|
|
102
104
|
likelihood: LikelihoodMap; // How this evidence affects each hypothesis
|
|
105
|
+
decay?: {
|
|
106
|
+
timestamp: string | Expression; // e.g. '$sensor.readingDate'
|
|
107
|
+
config?: Partial<DecayConfig>; // overrides engine-level defaults
|
|
108
|
+
};
|
|
103
109
|
};
|
|
104
110
|
|
|
105
111
|
/**
|
|
@@ -109,6 +115,10 @@ export type BayesianConfig = {
|
|
|
109
115
|
mode: 'bayesian';
|
|
110
116
|
threshold?: number; // Flag if any posterior exceeds this (e.g., 0.5)
|
|
111
117
|
priorDefault?: PriorDefault; // How to fill missing priors (default: 'uniform')
|
|
118
|
+
decay?: {
|
|
119
|
+
timestamp?: string | Expression; // default timestamp path for all rules
|
|
120
|
+
config: DecayConfig; // engine-level decay config
|
|
121
|
+
};
|
|
112
122
|
};
|
|
113
123
|
|
|
114
124
|
/**
|
|
@@ -152,6 +162,10 @@ export type CompiledLikelihoodMap = Record<string, number>;
|
|
|
152
162
|
*/
|
|
153
163
|
export type CompiledBayesianRule = CompiledBaseRule & {
|
|
154
164
|
likelihood: CompiledLikelihoodMap;
|
|
165
|
+
decay?: {
|
|
166
|
+
timestamp: string; // $-prefixed path
|
|
167
|
+
config?: Partial<DecayConfig>;
|
|
168
|
+
};
|
|
155
169
|
};
|
|
156
170
|
|
|
157
171
|
/**
|
|
@@ -176,6 +190,8 @@ export type EvidenceEntry = {
|
|
|
176
190
|
ruleId: string;
|
|
177
191
|
ruleName?: string;
|
|
178
192
|
likelihoods: CompiledLikelihoodMap;
|
|
193
|
+
likelihoodsBeforeDecay?: CompiledLikelihoodMap; // original likelihoods before decay
|
|
194
|
+
decayInfo?: DecayInfo;
|
|
179
195
|
};
|
|
180
196
|
|
|
181
197
|
/**
|
|
@@ -197,6 +213,7 @@ export type BayesianResult = {
|
|
|
197
213
|
fired: string[]; // Rules that matched and provided evidence
|
|
198
214
|
evidence: EvidenceEntry[]; // Audit trail
|
|
199
215
|
thresholdExceeded?: string; // First hypothesis to exceed threshold (if any)
|
|
216
|
+
decayInfo?: Record<string, DecayInfo>; // per-rule decay audit
|
|
200
217
|
iterations: 1; // Bayesian is always one-pass
|
|
201
218
|
executionTimeMs: number; // Processing time in milliseconds
|
|
202
219
|
};
|
|
@@ -34,7 +34,8 @@ const DEFAULT_CONFIG: Required<DefeasibleConfig> = {
|
|
|
34
34
|
aggregation: 'average',
|
|
35
35
|
threshold: 0.5,
|
|
36
36
|
conflictResolution: 'specificity',
|
|
37
|
-
maxIterations: 100
|
|
37
|
+
maxIterations: 100,
|
|
38
|
+
decay: undefined as any // Optional at runtime; Required<> demands a key
|
|
38
39
|
};
|
|
39
40
|
|
|
40
41
|
// ========================================
|
|
@@ -198,6 +199,19 @@ function compileRule(rule: DefeasibleRule, index: number): CompiledDefeasibleRul
|
|
|
198
199
|
const inputs = (rule.inputs || []).map(compileInputParameter);
|
|
199
200
|
const when = rule.when ? compileCondition(rule.when) : undefined;
|
|
200
201
|
|
|
202
|
+
// Compile decay — only pass through $-prefixed string timestamps
|
|
203
|
+
let compiledDecay: CompiledDefeasibleRule['decay'] | undefined;
|
|
204
|
+
if (rule.decay) {
|
|
205
|
+
const ts = rule.decay.timestamp;
|
|
206
|
+
if (typeof ts === 'string') {
|
|
207
|
+
compiledDecay = {
|
|
208
|
+
timestamp: ts,
|
|
209
|
+
config: rule.decay.config,
|
|
210
|
+
target: rule.decay.target
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
201
215
|
return {
|
|
202
216
|
id: rule.id,
|
|
203
217
|
name: rule.name,
|
|
@@ -210,7 +224,8 @@ function compileRule(rule: DefeasibleRule, index: number): CompiledDefeasibleRul
|
|
|
210
224
|
credibility: normalizeCredibility(rule.credibility),
|
|
211
225
|
conclusion: compileConclusion(rule.conclude),
|
|
212
226
|
defeats: (rule.defeats || []).map(normalizeDefeat),
|
|
213
|
-
specificity: countSpecificity(rule)
|
|
227
|
+
specificity: countSpecificity(rule),
|
|
228
|
+
decay: compiledDecay
|
|
214
229
|
};
|
|
215
230
|
}
|
|
216
231
|
|
|
@@ -7,6 +7,12 @@
|
|
|
7
7
|
|
|
8
8
|
import { match } from '../../core/matching';
|
|
9
9
|
import { IWorkingMemory } from '../../core/memory';
|
|
10
|
+
import {
|
|
11
|
+
calculateDecayMultiplier,
|
|
12
|
+
resolveDecayTimestamp,
|
|
13
|
+
DecayConfig,
|
|
14
|
+
DecayInfo
|
|
15
|
+
} from '../../core/evaluation/decay';
|
|
10
16
|
|
|
11
17
|
import {
|
|
12
18
|
CompiledDefeasibleRuleSet,
|
|
@@ -101,17 +107,57 @@ export class DefeasibleStrategy {
|
|
|
101
107
|
// Phase 1: Match all rules and collect fired rules
|
|
102
108
|
const firedRules: FiredRule[] = [];
|
|
103
109
|
const firedRuleIds: string[] = [];
|
|
110
|
+
const decayInfoMap: Record<string, DecayInfo> = {};
|
|
111
|
+
const decayMultipliersByRule: Record<string, number> = {};
|
|
112
|
+
const now = new Date();
|
|
104
113
|
|
|
105
114
|
for (const rule of ruleSet.rules) {
|
|
106
115
|
// Match inputs against working memory (includes when clause evaluation)
|
|
107
116
|
const activations = match(rule, wm);
|
|
108
117
|
|
|
109
118
|
for (const activation of activations) {
|
|
119
|
+
// Compute decay if configured
|
|
120
|
+
let effectiveCredibility = rule.credibility;
|
|
121
|
+
let credibilityBeforeDecay: number | undefined;
|
|
122
|
+
let ruleDecayInfo: DecayInfo | undefined;
|
|
123
|
+
|
|
124
|
+
const ruleDecay = rule.decay;
|
|
125
|
+
const engineDecay = config.decay;
|
|
126
|
+
|
|
127
|
+
if (ruleDecay || engineDecay) {
|
|
128
|
+
const tsRef = ruleDecay?.timestamp ?? (engineDecay?.timestamp as string | undefined);
|
|
129
|
+
const decayTarget = ruleDecay?.target ?? engineDecay?.target ?? 'credibility';
|
|
130
|
+
|
|
131
|
+
if (typeof tsRef === 'string') {
|
|
132
|
+
const dataTimestamp = resolveDecayTimestamp(tsRef, activation.facts);
|
|
133
|
+
|
|
134
|
+
if (dataTimestamp) {
|
|
135
|
+
const decayConfig: DecayConfig = {
|
|
136
|
+
...(engineDecay?.config ?? { curve: 'exponential', timeUnit: 'days' }),
|
|
137
|
+
...ruleDecay?.config
|
|
138
|
+
} as DecayConfig;
|
|
139
|
+
|
|
140
|
+
const info = calculateDecayMultiplier(dataTimestamp, now, decayConfig);
|
|
141
|
+
ruleDecayInfo = info;
|
|
142
|
+
decayInfoMap[rule.id] = info;
|
|
143
|
+
decayMultipliersByRule[rule.id] = info.multiplier;
|
|
144
|
+
|
|
145
|
+
// Apply decay to credibility if target includes it
|
|
146
|
+
if (decayTarget === 'credibility' || decayTarget === 'both') {
|
|
147
|
+
credibilityBeforeDecay = rule.credibility;
|
|
148
|
+
effectiveCredibility = rule.credibility * info.multiplier;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
110
154
|
// Rule fires
|
|
111
155
|
firedRules.push({
|
|
112
156
|
ruleId: rule.id,
|
|
113
157
|
conclusion: rule.conclusion,
|
|
114
|
-
credibility:
|
|
158
|
+
credibility: effectiveCredibility,
|
|
159
|
+
credibilityBeforeDecay,
|
|
160
|
+
decayInfo: ruleDecayInfo,
|
|
115
161
|
bindings: activation.facts
|
|
116
162
|
});
|
|
117
163
|
|
|
@@ -166,9 +212,21 @@ export class DefeasibleStrategy {
|
|
|
166
212
|
if (!defeatsMap.has(defeat.rule)) {
|
|
167
213
|
defeatsMap.set(defeat.rule, []);
|
|
168
214
|
}
|
|
215
|
+
|
|
216
|
+
// Apply decay to defeat strength if target includes it
|
|
217
|
+
let effectiveStrength = defeat.strength;
|
|
218
|
+
const ruleDecay = rule.decay;
|
|
219
|
+
const engineDecay = config.decay;
|
|
220
|
+
const decayTarget = ruleDecay?.target ?? engineDecay?.target ?? 'credibility';
|
|
221
|
+
|
|
222
|
+
if ((decayTarget === 'defeat-strength' || decayTarget === 'both') &&
|
|
223
|
+
decayMultipliersByRule[fired.ruleId] !== undefined) {
|
|
224
|
+
effectiveStrength = defeat.strength * decayMultipliersByRule[fired.ruleId];
|
|
225
|
+
}
|
|
226
|
+
|
|
169
227
|
defeatsMap.get(defeat.rule)!.push({
|
|
170
228
|
by: fired.ruleId,
|
|
171
|
-
strength:
|
|
229
|
+
strength: effectiveStrength
|
|
172
230
|
});
|
|
173
231
|
}
|
|
174
232
|
}
|
|
@@ -291,6 +349,7 @@ export class DefeasibleStrategy {
|
|
|
291
349
|
};
|
|
292
350
|
|
|
293
351
|
const executionTimeMs = Math.round((performance.now() - startTime) * 100) / 100;
|
|
352
|
+
const hasDecay = Object.keys(decayInfoMap).length > 0;
|
|
294
353
|
|
|
295
354
|
return {
|
|
296
355
|
conclusions,
|
|
@@ -300,6 +359,7 @@ export class DefeasibleStrategy {
|
|
|
300
359
|
conflicts,
|
|
301
360
|
fired: firedRuleIds,
|
|
302
361
|
iterations: 1, // Current implementation is single-pass
|
|
362
|
+
...(hasDecay ? { decayInfo: decayInfoMap } : {}),
|
|
303
363
|
executionTimeMs,
|
|
304
364
|
query
|
|
305
365
|
};
|
|
@@ -20,9 +20,12 @@ import {
|
|
|
20
20
|
CompiledBaseRule,
|
|
21
21
|
CompiledBaseRuleSet,
|
|
22
22
|
CompiledInputParameter,
|
|
23
|
+
Expression,
|
|
23
24
|
BindingContext
|
|
24
25
|
} from '../../core';
|
|
25
26
|
|
|
27
|
+
import { DecayConfig, DecayInfo } from '../../core/evaluation/decay';
|
|
28
|
+
|
|
26
29
|
// ========================================
|
|
27
30
|
// Rule Strength Types
|
|
28
31
|
// ========================================
|
|
@@ -167,6 +170,15 @@ export type DefeasibleRule = BaseRule & {
|
|
|
167
170
|
* Useful for audit trails and explainability.
|
|
168
171
|
*/
|
|
169
172
|
explanation?: string;
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Temporal decay configuration for this rule
|
|
176
|
+
*/
|
|
177
|
+
decay?: {
|
|
178
|
+
timestamp: string | Expression;
|
|
179
|
+
config?: Partial<DecayConfig>;
|
|
180
|
+
target?: 'credibility' | 'defeat-strength' | 'both'; // default: 'credibility'
|
|
181
|
+
};
|
|
170
182
|
};
|
|
171
183
|
|
|
172
184
|
/**
|
|
@@ -216,6 +228,15 @@ export type DefeasibleConfig = {
|
|
|
216
228
|
* Maximum iterations for computing defeat cycles (default: 100)
|
|
217
229
|
*/
|
|
218
230
|
maxIterations?: number;
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Engine-level temporal decay configuration
|
|
234
|
+
*/
|
|
235
|
+
decay?: {
|
|
236
|
+
timestamp?: string | Expression;
|
|
237
|
+
config: DecayConfig;
|
|
238
|
+
target?: 'credibility' | 'defeat-strength' | 'both';
|
|
239
|
+
};
|
|
219
240
|
};
|
|
220
241
|
|
|
221
242
|
/**
|
|
@@ -263,6 +284,11 @@ export type CompiledDefeasibleRule = CompiledBaseRule & {
|
|
|
263
284
|
conclusion: CompiledConclusion | null; // null for pure defeaters
|
|
264
285
|
defeats: CompiledDefeat[]; // Normalized defeats
|
|
265
286
|
specificity: number; // Number of conditions (for tie-breaking)
|
|
287
|
+
decay?: {
|
|
288
|
+
timestamp: string; // $-prefixed path
|
|
289
|
+
config?: Partial<DecayConfig>;
|
|
290
|
+
target?: 'credibility' | 'defeat-strength' | 'both';
|
|
291
|
+
};
|
|
266
292
|
};
|
|
267
293
|
|
|
268
294
|
/**
|
|
@@ -293,6 +319,8 @@ export type FiredRule = {
|
|
|
293
319
|
ruleId: string;
|
|
294
320
|
conclusion: CompiledConclusion | null;
|
|
295
321
|
credibility: number;
|
|
322
|
+
credibilityBeforeDecay?: number; // original credibility before decay
|
|
323
|
+
decayInfo?: DecayInfo;
|
|
296
324
|
bindings: BindingContext;
|
|
297
325
|
};
|
|
298
326
|
|
|
@@ -385,6 +413,11 @@ export type DefeasibleResult = {
|
|
|
385
413
|
*/
|
|
386
414
|
iterations: number;
|
|
387
415
|
|
|
416
|
+
/**
|
|
417
|
+
* Per-rule decay audit trail
|
|
418
|
+
*/
|
|
419
|
+
decayInfo?: Record<string, DecayInfo>;
|
|
420
|
+
|
|
388
421
|
/**
|
|
389
422
|
* Processing time in milliseconds
|
|
390
423
|
*/
|