@higher.archi/boe 1.0.23 → 1.0.24
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/types/rule.d.ts +1 -1
- package/dist/core/types/rule.d.ts.map +1 -1
- package/dist/engines/prediction/compiler.d.ts +11 -0
- package/dist/engines/prediction/compiler.d.ts.map +1 -0
- package/dist/engines/prediction/compiler.js +153 -0
- package/dist/engines/prediction/compiler.js.map +1 -0
- package/dist/engines/prediction/engine.d.ts +49 -0
- package/dist/engines/prediction/engine.d.ts.map +1 -0
- package/dist/engines/prediction/engine.js +91 -0
- package/dist/engines/prediction/engine.js.map +1 -0
- package/dist/engines/prediction/index.d.ts +9 -0
- package/dist/engines/prediction/index.d.ts.map +1 -0
- package/dist/engines/prediction/index.js +25 -0
- package/dist/engines/prediction/index.js.map +1 -0
- package/dist/engines/prediction/strategy.d.ts +20 -0
- package/dist/engines/prediction/strategy.d.ts.map +1 -0
- package/dist/engines/prediction/strategy.js +441 -0
- package/dist/engines/prediction/strategy.js.map +1 -0
- package/dist/engines/prediction/types.d.ts +150 -0
- package/dist/engines/prediction/types.d.ts.map +1 -0
- package/dist/engines/prediction/types.js +59 -0
- package/dist/engines/prediction/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/core/types/rule.ts +1 -1
- package/src/engines/prediction/compiler.ts +186 -0
- package/src/engines/prediction/engine.ts +120 -0
- package/src/engines/prediction/index.ts +49 -0
- package/src/engines/prediction/strategy.ts +573 -0
- package/src/engines/prediction/types.ts +236 -0
- package/src/index.ts +39 -0
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Prediction Engine Strategy
|
|
4
|
+
*
|
|
5
|
+
* Core execution logic for all prediction strategies:
|
|
6
|
+
* - linear-regression: Least-squares line fit with R² confidence
|
|
7
|
+
* - exponential-smoothing: Holt's double exponential (level + trend)
|
|
8
|
+
* - weighted-moving-average: Rolling window with recency weighting
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.predictionStrategy = exports.PredictionExecutor = void 0;
|
|
12
|
+
const types_1 = require("./types");
|
|
13
|
+
// Milliseconds per day / per month (30 days)
|
|
14
|
+
const MS_PER_DAY = 86_400_000;
|
|
15
|
+
const MS_PER_MONTH = 2_592_000_000; // 30 days
|
|
16
|
+
class PredictionExecutor {
|
|
17
|
+
run(ruleSet, wm, options = {}) {
|
|
18
|
+
const startTime = performance.now();
|
|
19
|
+
const asOf = options.asOf ? options.asOf.getTime() : Date.now();
|
|
20
|
+
// Group snapshots by entity
|
|
21
|
+
const entityGroups = groupByEntity(wm.getByType(ruleSet.snapshotType), ruleSet.fields);
|
|
22
|
+
const predictions = [];
|
|
23
|
+
for (const [entityId, points] of entityGroups) {
|
|
24
|
+
let prediction;
|
|
25
|
+
switch (ruleSet.strategy) {
|
|
26
|
+
case 'linear-regression':
|
|
27
|
+
prediction = this.runLinearRegression(ruleSet, entityId, points, asOf);
|
|
28
|
+
break;
|
|
29
|
+
case 'exponential-smoothing':
|
|
30
|
+
prediction = this.runExponentialSmoothing(ruleSet, entityId, points, asOf);
|
|
31
|
+
break;
|
|
32
|
+
case 'weighted-moving-average':
|
|
33
|
+
prediction = this.runWeightedMovingAverage(ruleSet, entityId, points, asOf);
|
|
34
|
+
break;
|
|
35
|
+
default:
|
|
36
|
+
throw new Error(`Unknown prediction strategy: '${ruleSet.strategy}'`);
|
|
37
|
+
}
|
|
38
|
+
if (options.onPredict) {
|
|
39
|
+
options.onPredict(prediction);
|
|
40
|
+
}
|
|
41
|
+
predictions.push(prediction);
|
|
42
|
+
}
|
|
43
|
+
const executionTimeMs = Math.round((performance.now() - startTime) * 100) / 100;
|
|
44
|
+
return {
|
|
45
|
+
predictions,
|
|
46
|
+
totalEntities: predictions.length,
|
|
47
|
+
strategy: ruleSet.strategy,
|
|
48
|
+
horizonMs: ruleSet.horizonMs,
|
|
49
|
+
executionTimeMs
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
// ========================================
|
|
53
|
+
// Linear Regression
|
|
54
|
+
// ========================================
|
|
55
|
+
runLinearRegression(ruleSet, entityId, points, asOf) {
|
|
56
|
+
const currentScore = points[points.length - 1].score;
|
|
57
|
+
const forecastTime = asOf + ruleSet.horizonMs;
|
|
58
|
+
const forecastDate = new Date(forecastTime);
|
|
59
|
+
// 1 data point
|
|
60
|
+
if (points.length === 1) {
|
|
61
|
+
return this.buildSinglePointPrediction(ruleSet, entityId, currentScore, asOf, forecastDate, 'linear-regression');
|
|
62
|
+
}
|
|
63
|
+
// 2 data points
|
|
64
|
+
if (points.length === 2) {
|
|
65
|
+
const dt = points[1].timestamp - points[0].timestamp;
|
|
66
|
+
const ds = points[1].score - points[0].score;
|
|
67
|
+
const slopePerMs = dt > 0 ? ds / dt : 0;
|
|
68
|
+
const predicted = currentScore + slopePerMs * ruleSet.horizonMs;
|
|
69
|
+
const stableThreshold = ruleSet.config.stableThreshold / MS_PER_DAY; // convert to per-ms
|
|
70
|
+
return {
|
|
71
|
+
entityId,
|
|
72
|
+
dataPoints: 2,
|
|
73
|
+
trend: (0, types_1.resolveTrendDirection)(slopePerMs, stableThreshold),
|
|
74
|
+
trendSlope: round(slopePerMs * MS_PER_DAY, 4),
|
|
75
|
+
confidence: 0.3,
|
|
76
|
+
confidenceBracket: (0, types_1.resolveConfidenceBracket)(0.3),
|
|
77
|
+
currentScore,
|
|
78
|
+
forecast: {
|
|
79
|
+
date: forecastDate,
|
|
80
|
+
dateIso: forecastDate.toISOString(),
|
|
81
|
+
predictedScore: round(predicted, 2)
|
|
82
|
+
},
|
|
83
|
+
thresholdCrossings: computeThresholdCrossings(currentScore, slopePerMs, asOf, ruleSet.thresholds),
|
|
84
|
+
model: {
|
|
85
|
+
strategy: 'linear-regression',
|
|
86
|
+
params: { slopePerDay: round(slopePerMs * MS_PER_DAY, 6), intercept: 0, rSquared: 0 }
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// 3+ data points: full least-squares
|
|
91
|
+
const n = points.length;
|
|
92
|
+
const tMin = points[0].timestamp;
|
|
93
|
+
// Normalize timestamps to avoid precision loss
|
|
94
|
+
const xs = points.map(p => p.timestamp - tMin);
|
|
95
|
+
const ys = points.map(p => p.score);
|
|
96
|
+
const xMean = xs.reduce((a, b) => a + b, 0) / n;
|
|
97
|
+
const yMean = ys.reduce((a, b) => a + b, 0) / n;
|
|
98
|
+
let sXX = 0;
|
|
99
|
+
let sXY = 0;
|
|
100
|
+
for (let i = 0; i < n; i++) {
|
|
101
|
+
const dx = xs[i] - xMean;
|
|
102
|
+
sXX += dx * dx;
|
|
103
|
+
sXY += dx * (ys[i] - yMean);
|
|
104
|
+
}
|
|
105
|
+
const slope = sXX > 0 ? sXY / sXX : 0;
|
|
106
|
+
const intercept = yMean - slope * xMean;
|
|
107
|
+
// R²
|
|
108
|
+
let ssTot = 0;
|
|
109
|
+
let ssRes = 0;
|
|
110
|
+
for (let i = 0; i < n; i++) {
|
|
111
|
+
const yHat = slope * xs[i] + intercept;
|
|
112
|
+
ssTot += (ys[i] - yMean) * (ys[i] - yMean);
|
|
113
|
+
ssRes += (ys[i] - yHat) * (ys[i] - yHat);
|
|
114
|
+
}
|
|
115
|
+
const rSquared = ssTot > 0 ? Math.max(0, Math.min(1, 1 - ssRes / ssTot)) : 0;
|
|
116
|
+
// Prediction at horizon
|
|
117
|
+
const xPred = forecastTime - tMin;
|
|
118
|
+
const predicted = slope * xPred + intercept;
|
|
119
|
+
// 95% confidence interval
|
|
120
|
+
const se = n > 2 ? Math.sqrt(ssRes / (n - 2)) : 0;
|
|
121
|
+
const margin = 1.96 * se * Math.sqrt(1 + 1 / n + ((xPred - xMean) * (xPred - xMean)) / sXX);
|
|
122
|
+
const stableThreshold = ruleSet.config.stableThreshold / MS_PER_DAY;
|
|
123
|
+
return {
|
|
124
|
+
entityId,
|
|
125
|
+
dataPoints: n,
|
|
126
|
+
trend: (0, types_1.resolveTrendDirection)(slope, stableThreshold),
|
|
127
|
+
trendSlope: round(slope * MS_PER_DAY, 4),
|
|
128
|
+
confidence: round(rSquared, 4),
|
|
129
|
+
confidenceBracket: (0, types_1.resolveConfidenceBracket)(rSquared),
|
|
130
|
+
currentScore,
|
|
131
|
+
forecast: {
|
|
132
|
+
date: forecastDate,
|
|
133
|
+
dateIso: forecastDate.toISOString(),
|
|
134
|
+
predictedScore: round(predicted, 2),
|
|
135
|
+
confidenceInterval: margin > 0
|
|
136
|
+
? { lower: round(predicted - margin, 2), upper: round(predicted + margin, 2) }
|
|
137
|
+
: undefined
|
|
138
|
+
},
|
|
139
|
+
thresholdCrossings: computeThresholdCrossings(currentScore, slope, asOf - tMin, ruleSet.thresholds, tMin),
|
|
140
|
+
model: {
|
|
141
|
+
strategy: 'linear-regression',
|
|
142
|
+
params: {
|
|
143
|
+
slopePerDay: round(slope * MS_PER_DAY, 6),
|
|
144
|
+
intercept: round(intercept, 4),
|
|
145
|
+
rSquared: round(rSquared, 4)
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
// ========================================
|
|
151
|
+
// Exponential Smoothing (Holt's Double)
|
|
152
|
+
// ========================================
|
|
153
|
+
runExponentialSmoothing(ruleSet, entityId, points, asOf) {
|
|
154
|
+
const currentScore = points[points.length - 1].score;
|
|
155
|
+
const forecastTime = asOf + ruleSet.horizonMs;
|
|
156
|
+
const forecastDate = new Date(forecastTime);
|
|
157
|
+
// 1 data point
|
|
158
|
+
if (points.length === 1) {
|
|
159
|
+
return this.buildSinglePointPrediction(ruleSet, entityId, currentScore, asOf, forecastDate, 'exponential-smoothing');
|
|
160
|
+
}
|
|
161
|
+
// 2 data points
|
|
162
|
+
if (points.length === 2) {
|
|
163
|
+
const dt = points[1].timestamp - points[0].timestamp;
|
|
164
|
+
const ds = points[1].score - points[0].score;
|
|
165
|
+
const slopePerMs = dt > 0 ? ds / dt : 0;
|
|
166
|
+
const predicted = currentScore + slopePerMs * ruleSet.horizonMs;
|
|
167
|
+
// Use a default stable threshold for exponential smoothing
|
|
168
|
+
const stableThreshold = 0.001 / MS_PER_DAY;
|
|
169
|
+
return {
|
|
170
|
+
entityId,
|
|
171
|
+
dataPoints: 2,
|
|
172
|
+
trend: (0, types_1.resolveTrendDirection)(slopePerMs, stableThreshold),
|
|
173
|
+
trendSlope: round(slopePerMs * MS_PER_DAY, 4),
|
|
174
|
+
confidence: 0.3,
|
|
175
|
+
confidenceBracket: (0, types_1.resolveConfidenceBracket)(0.3),
|
|
176
|
+
currentScore,
|
|
177
|
+
forecast: {
|
|
178
|
+
date: forecastDate,
|
|
179
|
+
dateIso: forecastDate.toISOString(),
|
|
180
|
+
predictedScore: round(predicted, 2)
|
|
181
|
+
},
|
|
182
|
+
thresholdCrossings: computeThresholdCrossings(currentScore, slopePerMs, asOf, ruleSet.thresholds),
|
|
183
|
+
model: {
|
|
184
|
+
strategy: 'exponential-smoothing',
|
|
185
|
+
params: {
|
|
186
|
+
level: currentScore,
|
|
187
|
+
trendPerDay: round(slopePerMs * MS_PER_DAY, 6),
|
|
188
|
+
alpha: ruleSet.config.alpha,
|
|
189
|
+
beta: ruleSet.config.beta
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
// 3+ points: Holt's double exponential smoothing
|
|
195
|
+
const { alpha, beta } = ruleSet.config;
|
|
196
|
+
let level = points[0].score;
|
|
197
|
+
let trend = points[1].score - points[0].score;
|
|
198
|
+
// Track errors for MAE-based confidence
|
|
199
|
+
let totalAbsError = 0;
|
|
200
|
+
let minScore = points[0].score;
|
|
201
|
+
let maxScore = points[0].score;
|
|
202
|
+
for (let i = 1; i < points.length; i++) {
|
|
203
|
+
const score = points[i].score;
|
|
204
|
+
minScore = Math.min(minScore, score);
|
|
205
|
+
maxScore = Math.max(maxScore, score);
|
|
206
|
+
const predicted = level + trend;
|
|
207
|
+
totalAbsError += Math.abs(score - predicted);
|
|
208
|
+
const prevLevel = level;
|
|
209
|
+
level = alpha * score + (1 - alpha) * (prevLevel + trend);
|
|
210
|
+
trend = beta * (level - prevLevel) + (1 - beta) * trend;
|
|
211
|
+
}
|
|
212
|
+
const avgInterval = (points[points.length - 1].timestamp - points[0].timestamp) / (points.length - 1);
|
|
213
|
+
const stepsAhead = avgInterval > 0 ? ruleSet.horizonMs / avgInterval : 0;
|
|
214
|
+
const predicted = level + trend * stepsAhead;
|
|
215
|
+
// Confidence: 1 - (MAE / range), clamped [0, 1]
|
|
216
|
+
const mae = totalAbsError / (points.length - 1);
|
|
217
|
+
const range = maxScore - minScore;
|
|
218
|
+
const confidence = range > 0 ? Math.max(0, Math.min(1, 1 - mae / range)) : (mae === 0 ? 1 : 0);
|
|
219
|
+
// Convert trend per interval to per ms
|
|
220
|
+
const trendPerMs = avgInterval > 0 ? trend / avgInterval : 0;
|
|
221
|
+
const stableThreshold = 0.001 / MS_PER_DAY;
|
|
222
|
+
return {
|
|
223
|
+
entityId,
|
|
224
|
+
dataPoints: points.length,
|
|
225
|
+
trend: (0, types_1.resolveTrendDirection)(trendPerMs, stableThreshold),
|
|
226
|
+
trendSlope: round(trendPerMs * MS_PER_DAY, 4),
|
|
227
|
+
confidence: round(confidence, 4),
|
|
228
|
+
confidenceBracket: (0, types_1.resolveConfidenceBracket)(confidence),
|
|
229
|
+
currentScore,
|
|
230
|
+
forecast: {
|
|
231
|
+
date: forecastDate,
|
|
232
|
+
dateIso: forecastDate.toISOString(),
|
|
233
|
+
predictedScore: round(predicted, 2)
|
|
234
|
+
},
|
|
235
|
+
thresholdCrossings: computeThresholdCrossings(currentScore, trendPerMs, asOf, ruleSet.thresholds),
|
|
236
|
+
model: {
|
|
237
|
+
strategy: 'exponential-smoothing',
|
|
238
|
+
params: {
|
|
239
|
+
level: round(level, 4),
|
|
240
|
+
trendPerDay: round(trendPerMs * MS_PER_DAY, 6),
|
|
241
|
+
alpha,
|
|
242
|
+
beta
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
// ========================================
|
|
248
|
+
// Weighted Moving Average
|
|
249
|
+
// ========================================
|
|
250
|
+
runWeightedMovingAverage(ruleSet, entityId, points, asOf) {
|
|
251
|
+
const currentScore = points[points.length - 1].score;
|
|
252
|
+
const forecastTime = asOf + ruleSet.horizonMs;
|
|
253
|
+
const forecastDate = new Date(forecastTime);
|
|
254
|
+
// 1 data point
|
|
255
|
+
if (points.length === 1) {
|
|
256
|
+
return this.buildSinglePointPrediction(ruleSet, entityId, currentScore, asOf, forecastDate, 'weighted-moving-average');
|
|
257
|
+
}
|
|
258
|
+
// 2+ points
|
|
259
|
+
const windowSize = Math.min(ruleSet.config.window, points.length);
|
|
260
|
+
const recent = points.slice(-windowSize);
|
|
261
|
+
// Weighted average: weights = [1, 2, ..., N]
|
|
262
|
+
let weightedSum = 0;
|
|
263
|
+
let totalWeight = 0;
|
|
264
|
+
for (let i = 0; i < recent.length; i++) {
|
|
265
|
+
const w = i + 1;
|
|
266
|
+
weightedSum += recent[i].score * w;
|
|
267
|
+
totalWeight += w;
|
|
268
|
+
}
|
|
269
|
+
const weightedAvg = weightedSum / totalWeight;
|
|
270
|
+
// Weighted slope from consecutive diffs
|
|
271
|
+
let slopeWeightedSum = 0;
|
|
272
|
+
let slopeTotalWeight = 0;
|
|
273
|
+
for (let i = 1; i < recent.length; i++) {
|
|
274
|
+
const dt = recent[i].timestamp - recent[i - 1].timestamp;
|
|
275
|
+
if (dt > 0) {
|
|
276
|
+
const diff = (recent[i].score - recent[i - 1].score) / dt;
|
|
277
|
+
const w = i; // more weight on recent diffs
|
|
278
|
+
slopeWeightedSum += diff * w;
|
|
279
|
+
slopeTotalWeight += w;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
const slopePerMs = slopeTotalWeight > 0 ? slopeWeightedSum / slopeTotalWeight : 0;
|
|
283
|
+
const predicted = weightedAvg + slopePerMs * ruleSet.horizonMs;
|
|
284
|
+
// Confidence: max(0, 1 - CV) where CV = stdDev / |mean|
|
|
285
|
+
const mean = recent.reduce((a, b) => a + b.score, 0) / recent.length;
|
|
286
|
+
const variance = recent.reduce((a, b) => a + (b.score - mean) * (b.score - mean), 0) / recent.length;
|
|
287
|
+
const stdDev = Math.sqrt(variance);
|
|
288
|
+
const cv = Math.abs(mean) > 0 ? stdDev / Math.abs(mean) : 0;
|
|
289
|
+
const confidence = Math.max(0, Math.min(1, 1 - cv));
|
|
290
|
+
const stableThreshold = 0.001 / MS_PER_DAY;
|
|
291
|
+
return {
|
|
292
|
+
entityId,
|
|
293
|
+
dataPoints: points.length,
|
|
294
|
+
trend: (0, types_1.resolveTrendDirection)(slopePerMs, stableThreshold),
|
|
295
|
+
trendSlope: round(slopePerMs * MS_PER_DAY, 4),
|
|
296
|
+
confidence: round(confidence, 4),
|
|
297
|
+
confidenceBracket: (0, types_1.resolveConfidenceBracket)(confidence),
|
|
298
|
+
currentScore,
|
|
299
|
+
forecast: {
|
|
300
|
+
date: forecastDate,
|
|
301
|
+
dateIso: forecastDate.toISOString(),
|
|
302
|
+
predictedScore: round(predicted, 2)
|
|
303
|
+
},
|
|
304
|
+
thresholdCrossings: computeThresholdCrossings(currentScore, slopePerMs, asOf, ruleSet.thresholds),
|
|
305
|
+
model: {
|
|
306
|
+
strategy: 'weighted-moving-average',
|
|
307
|
+
params: {
|
|
308
|
+
weightedAverage: round(weightedAvg, 4),
|
|
309
|
+
window: windowSize,
|
|
310
|
+
slopePerDay: round(slopePerMs * MS_PER_DAY, 6)
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
// ========================================
|
|
316
|
+
// Shared Helpers
|
|
317
|
+
// ========================================
|
|
318
|
+
buildSinglePointPrediction(ruleSet, entityId, currentScore, asOf, forecastDate, strategy) {
|
|
319
|
+
// If defaultTrend is configured, use it as slope (per month -> per ms)
|
|
320
|
+
let slopePerMs = 0;
|
|
321
|
+
let trend = 'insufficient-data';
|
|
322
|
+
let predicted = currentScore;
|
|
323
|
+
if (ruleSet.defaultTrend !== undefined) {
|
|
324
|
+
slopePerMs = ruleSet.defaultTrend / MS_PER_MONTH;
|
|
325
|
+
predicted = currentScore + slopePerMs * ruleSet.horizonMs;
|
|
326
|
+
const stableThreshold = 0.001 / MS_PER_DAY;
|
|
327
|
+
trend = (0, types_1.resolveTrendDirection)(slopePerMs, stableThreshold);
|
|
328
|
+
}
|
|
329
|
+
return {
|
|
330
|
+
entityId,
|
|
331
|
+
dataPoints: 1,
|
|
332
|
+
trend,
|
|
333
|
+
trendSlope: round(slopePerMs * MS_PER_DAY, 4),
|
|
334
|
+
confidence: 0,
|
|
335
|
+
confidenceBracket: 'insufficient-data',
|
|
336
|
+
currentScore,
|
|
337
|
+
forecast: {
|
|
338
|
+
date: forecastDate,
|
|
339
|
+
dateIso: forecastDate.toISOString(),
|
|
340
|
+
predictedScore: round(predicted, 2)
|
|
341
|
+
},
|
|
342
|
+
thresholdCrossings: slopePerMs !== 0
|
|
343
|
+
? computeThresholdCrossings(currentScore, slopePerMs, asOf, ruleSet.thresholds)
|
|
344
|
+
: [],
|
|
345
|
+
model: {
|
|
346
|
+
strategy,
|
|
347
|
+
params: {}
|
|
348
|
+
}
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
exports.PredictionExecutor = PredictionExecutor;
|
|
353
|
+
// ========================================
|
|
354
|
+
// Module-Level Helpers
|
|
355
|
+
// ========================================
|
|
356
|
+
function resolveDotPath(obj, path) {
|
|
357
|
+
const parts = path.split('.');
|
|
358
|
+
let current = obj;
|
|
359
|
+
for (const part of parts) {
|
|
360
|
+
if (current == null)
|
|
361
|
+
return undefined;
|
|
362
|
+
current = current[part];
|
|
363
|
+
}
|
|
364
|
+
return current;
|
|
365
|
+
}
|
|
366
|
+
function groupByEntity(facts, fields) {
|
|
367
|
+
const groups = new Map();
|
|
368
|
+
for (const fact of facts) {
|
|
369
|
+
const entityId = resolveDotPath(fact.data, fields.entityId);
|
|
370
|
+
const score = resolveDotPath(fact.data, fields.score);
|
|
371
|
+
const timestampRaw = resolveDotPath(fact.data, fields.timestamp);
|
|
372
|
+
if (entityId == null || score == null || timestampRaw == null)
|
|
373
|
+
continue;
|
|
374
|
+
const timestamp = typeof timestampRaw === 'string'
|
|
375
|
+
? new Date(timestampRaw).getTime()
|
|
376
|
+
: typeof timestampRaw === 'number'
|
|
377
|
+
? timestampRaw
|
|
378
|
+
: NaN;
|
|
379
|
+
if (isNaN(timestamp))
|
|
380
|
+
continue;
|
|
381
|
+
if (!groups.has(entityId)) {
|
|
382
|
+
groups.set(entityId, []);
|
|
383
|
+
}
|
|
384
|
+
groups.get(entityId).push({ score: Number(score), timestamp });
|
|
385
|
+
}
|
|
386
|
+
// Sort each group by timestamp ascending
|
|
387
|
+
for (const points of groups.values()) {
|
|
388
|
+
points.sort((a, b) => a.timestamp - b.timestamp);
|
|
389
|
+
}
|
|
390
|
+
return groups;
|
|
391
|
+
}
|
|
392
|
+
function computeThresholdCrossings(currentScore, slopePerMs, asOf, thresholds, tMin = 0) {
|
|
393
|
+
if (slopePerMs === 0 || thresholds.length === 0)
|
|
394
|
+
return [];
|
|
395
|
+
const crossings = [];
|
|
396
|
+
const now = tMin > 0 ? asOf + tMin : asOf; // adjust if tMin is a normalization offset
|
|
397
|
+
for (const threshold of thresholds) {
|
|
398
|
+
const diff = threshold.value - currentScore;
|
|
399
|
+
// Check if crossing is possible given direction of slope
|
|
400
|
+
if (threshold.direction === 'above') {
|
|
401
|
+
// Currently below threshold, trending up
|
|
402
|
+
if (currentScore < threshold.value && slopePerMs > 0) {
|
|
403
|
+
const msToThreshold = diff / slopePerMs;
|
|
404
|
+
const crossTime = now + msToThreshold;
|
|
405
|
+
const crossDate = new Date(crossTime);
|
|
406
|
+
crossings.push({
|
|
407
|
+
thresholdId: threshold.id,
|
|
408
|
+
thresholdName: threshold.name,
|
|
409
|
+
value: threshold.value,
|
|
410
|
+
direction: 'above',
|
|
411
|
+
estimatedAt: crossDate,
|
|
412
|
+
estimatedAtIso: crossDate.toISOString()
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
else {
|
|
417
|
+
// direction === 'below': currently above threshold, trending down
|
|
418
|
+
if (currentScore > threshold.value && slopePerMs < 0) {
|
|
419
|
+
const msToThreshold = diff / slopePerMs;
|
|
420
|
+
const crossTime = now + msToThreshold;
|
|
421
|
+
const crossDate = new Date(crossTime);
|
|
422
|
+
crossings.push({
|
|
423
|
+
thresholdId: threshold.id,
|
|
424
|
+
thresholdName: threshold.name,
|
|
425
|
+
value: threshold.value,
|
|
426
|
+
direction: 'below',
|
|
427
|
+
estimatedAt: crossDate,
|
|
428
|
+
estimatedAtIso: crossDate.toISOString()
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
return crossings;
|
|
434
|
+
}
|
|
435
|
+
function round(value, decimals) {
|
|
436
|
+
const factor = Math.pow(10, decimals);
|
|
437
|
+
return Math.round(value * factor) / factor;
|
|
438
|
+
}
|
|
439
|
+
/** Singleton instance */
|
|
440
|
+
exports.predictionStrategy = new PredictionExecutor();
|
|
441
|
+
//# sourceMappingURL=strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy.js","sourceRoot":"","sources":["../../../src/engines/prediction/strategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prediction Engine Types
|
|
3
|
+
*
|
|
4
|
+
* Trajectory forecasting engine that takes historical score snapshots,
|
|
5
|
+
* fits a model, and projects forward. Supports linear regression,
|
|
6
|
+
* exponential smoothing, and weighted moving average strategies.
|
|
7
|
+
*/
|
|
8
|
+
/** Prediction algorithm to use */
|
|
9
|
+
export type PredictionStrategy = 'linear-regression' | 'exponential-smoothing' | 'weighted-moving-average';
|
|
10
|
+
/** Trend direction derived from slope */
|
|
11
|
+
export type TrendDirection = 'rising' | 'stable' | 'declining' | 'insufficient-data';
|
|
12
|
+
/** Exponential smoothing sensitivity presets */
|
|
13
|
+
export type SmoothingPreset = 'responsive' | 'balanced' | 'smooth';
|
|
14
|
+
/** Forecast horizon presets */
|
|
15
|
+
export type HorizonPreset = '1-day' | '1-week' | '1-month' | '3-months' | '6-months' | '1-year';
|
|
16
|
+
/** Human-readable confidence bracket */
|
|
17
|
+
export type ConfidenceBracket = 'high' | 'moderate' | 'low' | 'insufficient-data';
|
|
18
|
+
export declare const SMOOTHING_PRESET_VALUES: Record<SmoothingPreset, {
|
|
19
|
+
alpha: number;
|
|
20
|
+
beta: number;
|
|
21
|
+
}>;
|
|
22
|
+
export declare const HORIZON_PRESET_VALUES: Record<HorizonPreset, number>;
|
|
23
|
+
export declare function isSmoothingPreset(value: unknown): value is SmoothingPreset;
|
|
24
|
+
export declare function isHorizonPreset(value: unknown): value is HorizonPreset;
|
|
25
|
+
/** Map a confidence value (0-1) to a semantic bracket */
|
|
26
|
+
export declare function resolveConfidenceBracket(confidence: number): ConfidenceBracket;
|
|
27
|
+
/** Map a slope (per ms) to a semantic trend direction */
|
|
28
|
+
export declare function resolveTrendDirection(slopePerMs: number, stableThreshold: number): TrendDirection;
|
|
29
|
+
/** Configurable dot-path field mapping into fact.data */
|
|
30
|
+
export type FieldMapping = {
|
|
31
|
+
entityId: string;
|
|
32
|
+
score: string;
|
|
33
|
+
timestamp: string;
|
|
34
|
+
};
|
|
35
|
+
export type ThresholdDefinition = {
|
|
36
|
+
id: string;
|
|
37
|
+
name?: string;
|
|
38
|
+
value: number;
|
|
39
|
+
direction: 'above' | 'below';
|
|
40
|
+
};
|
|
41
|
+
export type LinearRegressionConfig = {
|
|
42
|
+
stableThreshold?: number;
|
|
43
|
+
};
|
|
44
|
+
export type ExponentialSmoothingConfig = {
|
|
45
|
+
smoothing?: SmoothingPreset | {
|
|
46
|
+
alpha: number;
|
|
47
|
+
beta: number;
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
export type WeightedMovingAverageConfig = {
|
|
51
|
+
window?: number;
|
|
52
|
+
};
|
|
53
|
+
type PredictionRuleSetBase = {
|
|
54
|
+
id: string;
|
|
55
|
+
name?: string;
|
|
56
|
+
mode: 'prediction';
|
|
57
|
+
snapshotType: string;
|
|
58
|
+
fields: FieldMapping;
|
|
59
|
+
horizon: HorizonPreset | number;
|
|
60
|
+
thresholds?: ThresholdDefinition[];
|
|
61
|
+
defaultTrend?: number;
|
|
62
|
+
};
|
|
63
|
+
export type LinearRegressionRuleSet = PredictionRuleSetBase & {
|
|
64
|
+
strategy: 'linear-regression';
|
|
65
|
+
config?: LinearRegressionConfig;
|
|
66
|
+
};
|
|
67
|
+
export type ExponentialSmoothingRuleSet = PredictionRuleSetBase & {
|
|
68
|
+
strategy: 'exponential-smoothing';
|
|
69
|
+
config?: ExponentialSmoothingConfig;
|
|
70
|
+
};
|
|
71
|
+
export type WeightedMovingAverageRuleSet = PredictionRuleSetBase & {
|
|
72
|
+
strategy: 'weighted-moving-average';
|
|
73
|
+
config?: WeightedMovingAverageConfig;
|
|
74
|
+
};
|
|
75
|
+
export type PredictionRuleSet = LinearRegressionRuleSet | ExponentialSmoothingRuleSet | WeightedMovingAverageRuleSet;
|
|
76
|
+
type CompiledPredictionRuleSetBase = {
|
|
77
|
+
id: string;
|
|
78
|
+
name?: string;
|
|
79
|
+
mode: 'prediction';
|
|
80
|
+
snapshotType: string;
|
|
81
|
+
fields: FieldMapping;
|
|
82
|
+
horizonMs: number;
|
|
83
|
+
thresholds: ThresholdDefinition[];
|
|
84
|
+
defaultTrend?: number;
|
|
85
|
+
};
|
|
86
|
+
export type CompiledLinearRegressionRuleSet = CompiledPredictionRuleSetBase & {
|
|
87
|
+
strategy: 'linear-regression';
|
|
88
|
+
config: {
|
|
89
|
+
stableThreshold: number;
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
export type CompiledExponentialSmoothingRuleSet = CompiledPredictionRuleSetBase & {
|
|
93
|
+
strategy: 'exponential-smoothing';
|
|
94
|
+
config: {
|
|
95
|
+
alpha: number;
|
|
96
|
+
beta: number;
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
export type CompiledWeightedMovingAverageRuleSet = CompiledPredictionRuleSetBase & {
|
|
100
|
+
strategy: 'weighted-moving-average';
|
|
101
|
+
config: {
|
|
102
|
+
window: number;
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
export type CompiledPredictionRuleSet = CompiledLinearRegressionRuleSet | CompiledExponentialSmoothingRuleSet | CompiledWeightedMovingAverageRuleSet;
|
|
106
|
+
export type ThresholdCrossing = {
|
|
107
|
+
thresholdId: string;
|
|
108
|
+
thresholdName?: string;
|
|
109
|
+
value: number;
|
|
110
|
+
direction: 'above' | 'below';
|
|
111
|
+
estimatedAt: Date;
|
|
112
|
+
estimatedAtIso: string;
|
|
113
|
+
};
|
|
114
|
+
export type Forecast = {
|
|
115
|
+
date: Date;
|
|
116
|
+
dateIso: string;
|
|
117
|
+
predictedScore: number;
|
|
118
|
+
confidenceInterval?: {
|
|
119
|
+
lower: number;
|
|
120
|
+
upper: number;
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
export type EntityPrediction = {
|
|
124
|
+
entityId: string;
|
|
125
|
+
dataPoints: number;
|
|
126
|
+
trend: TrendDirection;
|
|
127
|
+
trendSlope: number;
|
|
128
|
+
confidence: number;
|
|
129
|
+
confidenceBracket: ConfidenceBracket;
|
|
130
|
+
currentScore: number;
|
|
131
|
+
forecast: Forecast;
|
|
132
|
+
thresholdCrossings: ThresholdCrossing[];
|
|
133
|
+
model: {
|
|
134
|
+
strategy: PredictionStrategy;
|
|
135
|
+
params: Record<string, number>;
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
export type PredictionResult = {
|
|
139
|
+
predictions: EntityPrediction[];
|
|
140
|
+
totalEntities: number;
|
|
141
|
+
strategy: PredictionStrategy;
|
|
142
|
+
horizonMs: number;
|
|
143
|
+
executionTimeMs: number;
|
|
144
|
+
};
|
|
145
|
+
export type PredictionOptions = {
|
|
146
|
+
onPredict?: (prediction: EntityPrediction) => void;
|
|
147
|
+
asOf?: Date;
|
|
148
|
+
};
|
|
149
|
+
export {};
|
|
150
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/engines/prediction/types.ts"],"names":[],"mappings":"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"}
|