dpth 0.1.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.
@@ -0,0 +1,463 @@
1
+ /**
2
+ * dpth.io Correlation Engine
3
+ *
4
+ * The magic sauce. Automatically discovers relationships between metrics
5
+ * across different data sources without explicit configuration.
6
+ *
7
+ * Key capabilities:
8
+ * - Pearson correlation for contemporaneous relationships
9
+ * - Cross-correlation for lagged/causal relationships
10
+ * - Anomaly detection via statistical analysis
11
+ * - Significance testing to filter noise
12
+ */
13
+ // ─── Metric Store ────────────────────────────────────
14
+ /** In-memory metric store */
15
+ const metrics = new Map();
16
+ /**
17
+ * Register a metric for correlation analysis
18
+ */
19
+ export function registerMetric(metric) {
20
+ metrics.set(metric.id, metric);
21
+ }
22
+ /**
23
+ * Add data points to a metric
24
+ */
25
+ export function addMetricPoints(metricId, points) {
26
+ const metric = metrics.get(metricId);
27
+ if (!metric)
28
+ return;
29
+ metric.points.push(...points);
30
+ // Keep sorted by timestamp
31
+ metric.points.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
32
+ }
33
+ /**
34
+ * Get a metric by ID
35
+ */
36
+ export function getMetric(id) {
37
+ return metrics.get(id);
38
+ }
39
+ /**
40
+ * List all metrics
41
+ */
42
+ export function listMetrics() {
43
+ return Array.from(metrics.values());
44
+ }
45
+ // ─── Statistical Helpers ─────────────────────────────
46
+ /**
47
+ * Calculate mean of values
48
+ */
49
+ function mean(values) {
50
+ if (values.length === 0)
51
+ return 0;
52
+ return values.reduce((a, b) => a + b, 0) / values.length;
53
+ }
54
+ /**
55
+ * Calculate standard deviation
56
+ */
57
+ function stdDev(values) {
58
+ if (values.length < 2)
59
+ return 0;
60
+ const avg = mean(values);
61
+ const squareDiffs = values.map(v => Math.pow(v - avg, 2));
62
+ return Math.sqrt(mean(squareDiffs));
63
+ }
64
+ /**
65
+ * Calculate Pearson correlation coefficient
66
+ */
67
+ function pearsonCorrelation(x, y) {
68
+ if (x.length !== y.length || x.length < 3)
69
+ return 0;
70
+ const n = x.length;
71
+ const meanX = mean(x);
72
+ const meanY = mean(y);
73
+ let numerator = 0;
74
+ let denomX = 0;
75
+ let denomY = 0;
76
+ for (let i = 0; i < n; i++) {
77
+ const dx = x[i] - meanX;
78
+ const dy = y[i] - meanY;
79
+ numerator += dx * dy;
80
+ denomX += dx * dx;
81
+ denomY += dy * dy;
82
+ }
83
+ const denominator = Math.sqrt(denomX * denomY);
84
+ if (denominator === 0)
85
+ return 0;
86
+ return numerator / denominator;
87
+ }
88
+ /**
89
+ * Calculate statistical significance (p-value approximation)
90
+ * Uses t-distribution approximation for correlation significance
91
+ */
92
+ function correlationSignificance(r, n) {
93
+ if (n < 4 || Math.abs(r) >= 1)
94
+ return 1;
95
+ const t = r * Math.sqrt((n - 2) / (1 - r * r));
96
+ const df = n - 2;
97
+ // Approximation of two-tailed p-value
98
+ // Using normal approximation for large df
99
+ const p = 2 * (1 - normalCDF(Math.abs(t)));
100
+ return p;
101
+ }
102
+ /**
103
+ * Normal CDF approximation
104
+ */
105
+ function normalCDF(x) {
106
+ const a1 = 0.254829592;
107
+ const a2 = -0.284496736;
108
+ const a3 = 1.421413741;
109
+ const a4 = -1.453152027;
110
+ const a5 = 1.061405429;
111
+ const p = 0.3275911;
112
+ const sign = x < 0 ? -1 : 1;
113
+ x = Math.abs(x) / Math.sqrt(2);
114
+ const t = 1.0 / (1.0 + p * x);
115
+ const y = 1.0 - (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1) * t * Math.exp(-x * x);
116
+ return 0.5 * (1.0 + sign * y);
117
+ }
118
+ // ─── Time Alignment ──────────────────────────────────
119
+ /**
120
+ * Align two metrics to the same time points using interpolation
121
+ */
122
+ function alignMetrics(metricA, metricB, lagDays = 0) {
123
+ // Get overlapping time range
124
+ const pointsA = metricA.points;
125
+ const pointsB = metricB.points;
126
+ if (pointsA.length < 2 || pointsB.length < 2) {
127
+ return { valuesA: [], valuesB: [], timestamps: [] };
128
+ }
129
+ const startA = pointsA[0].timestamp.getTime();
130
+ const endA = pointsA[pointsA.length - 1].timestamp.getTime();
131
+ const startB = pointsB[0].timestamp.getTime() + lagDays * 86400000;
132
+ const endB = pointsB[pointsB.length - 1].timestamp.getTime() + lagDays * 86400000;
133
+ const start = Math.max(startA, startB);
134
+ const end = Math.min(endA, endB);
135
+ if (start >= end) {
136
+ return { valuesA: [], valuesB: [], timestamps: [] };
137
+ }
138
+ // Sample at daily intervals
139
+ const dayMs = 86400000;
140
+ const valuesA = [];
141
+ const valuesB = [];
142
+ const timestamps = [];
143
+ for (let t = start; t <= end; t += dayMs) {
144
+ const valueA = interpolateAt(pointsA, t);
145
+ const valueB = interpolateAt(pointsB, t - lagDays * dayMs);
146
+ if (valueA !== null && valueB !== null) {
147
+ valuesA.push(valueA);
148
+ valuesB.push(valueB);
149
+ timestamps.push(new Date(t));
150
+ }
151
+ }
152
+ return { valuesA, valuesB, timestamps };
153
+ }
154
+ /**
155
+ * Linear interpolation at a specific timestamp
156
+ */
157
+ function interpolateAt(points, timestamp) {
158
+ if (points.length === 0)
159
+ return null;
160
+ // Find surrounding points
161
+ let before = null;
162
+ let after = null;
163
+ for (const point of points) {
164
+ const t = point.timestamp.getTime();
165
+ if (t <= timestamp) {
166
+ before = point;
167
+ }
168
+ else {
169
+ after = point;
170
+ break;
171
+ }
172
+ }
173
+ if (!before && !after)
174
+ return null;
175
+ if (!before)
176
+ return after.value;
177
+ if (!after)
178
+ return before.value;
179
+ // Linear interpolation
180
+ const t1 = before.timestamp.getTime();
181
+ const t2 = after.timestamp.getTime();
182
+ const ratio = (timestamp - t1) / (t2 - t1);
183
+ return before.value + ratio * (after.value - before.value);
184
+ }
185
+ /**
186
+ * Calculate correlation between two metrics
187
+ */
188
+ export function calculateCorrelation(metricIdA, metricIdB, lagDays = 0) {
189
+ const metricA = metrics.get(metricIdA);
190
+ const metricB = metrics.get(metricIdB);
191
+ if (!metricA || !metricB)
192
+ return null;
193
+ const { valuesA, valuesB } = alignMetrics(metricA, metricB, lagDays);
194
+ if (valuesA.length < 10)
195
+ return null; // Need minimum sample size
196
+ const correlation = pearsonCorrelation(valuesA, valuesB);
197
+ const pValue = correlationSignificance(correlation, valuesA.length);
198
+ return {
199
+ metricA: metricIdA,
200
+ metricB: metricIdB,
201
+ correlation,
202
+ lagDays,
203
+ pValue,
204
+ sampleSize: valuesA.length,
205
+ direction: correlation >= 0 ? 'positive' : 'negative',
206
+ };
207
+ }
208
+ /**
209
+ * Find all correlations for a metric
210
+ */
211
+ export function findCorrelations(query) {
212
+ const results = [];
213
+ const minCorrelation = query.minCorrelation ?? 0.5;
214
+ const maxLag = query.maxLagDays ?? 30;
215
+ const targetMetric = metrics.get(query.metricId);
216
+ if (!targetMetric)
217
+ return results;
218
+ for (const [id, metric] of metrics) {
219
+ if (id === query.metricId)
220
+ continue;
221
+ // Check different lag values
222
+ for (let lag = 0; lag <= maxLag; lag++) {
223
+ const result = calculateCorrelation(query.metricId, id, lag);
224
+ if (result && Math.abs(result.correlation) >= minCorrelation && result.pValue < 0.05) {
225
+ results.push(result);
226
+ }
227
+ // Also check negative lag (B leads A)
228
+ if (lag > 0) {
229
+ const reverseResult = calculateCorrelation(id, query.metricId, lag);
230
+ if (reverseResult && Math.abs(reverseResult.correlation) >= minCorrelation && reverseResult.pValue < 0.05) {
231
+ // Flip the result to show from perspective of query metric
232
+ results.push({
233
+ ...reverseResult,
234
+ metricA: query.metricId,
235
+ metricB: id,
236
+ lagDays: -lag, // Negative lag means target is lagging
237
+ });
238
+ }
239
+ }
240
+ }
241
+ }
242
+ // Sort by absolute correlation strength
243
+ results.sort((a, b) => Math.abs(b.correlation) - Math.abs(a.correlation));
244
+ // Deduplicate (keep strongest correlation per metric pair)
245
+ const seen = new Set();
246
+ const deduped = [];
247
+ for (const result of results) {
248
+ const key = [result.metricA, result.metricB].sort().join(':');
249
+ if (!seen.has(key)) {
250
+ seen.add(key);
251
+ deduped.push(result);
252
+ }
253
+ }
254
+ return deduped.slice(0, query.limit ?? 20);
255
+ }
256
+ /**
257
+ * Discover all significant correlations in the system
258
+ */
259
+ export function discoverAllCorrelations(minCorrelation = 0.6, maxLagDays = 14) {
260
+ const allResults = [];
261
+ const metricList = Array.from(metrics.keys());
262
+ for (let i = 0; i < metricList.length; i++) {
263
+ for (let j = i + 1; j < metricList.length; j++) {
264
+ // Check contemporaneous
265
+ const result = calculateCorrelation(metricList[i], metricList[j], 0);
266
+ if (result && Math.abs(result.correlation) >= minCorrelation && result.pValue < 0.05) {
267
+ allResults.push(result);
268
+ }
269
+ // Check lagged relationships
270
+ for (let lag = 1; lag <= maxLagDays; lag++) {
271
+ const laggedAB = calculateCorrelation(metricList[i], metricList[j], lag);
272
+ if (laggedAB && Math.abs(laggedAB.correlation) >= minCorrelation && laggedAB.pValue < 0.05) {
273
+ allResults.push(laggedAB);
274
+ }
275
+ const laggedBA = calculateCorrelation(metricList[j], metricList[i], lag);
276
+ if (laggedBA && Math.abs(laggedBA.correlation) >= minCorrelation && laggedBA.pValue < 0.05) {
277
+ allResults.push(laggedBA);
278
+ }
279
+ }
280
+ }
281
+ }
282
+ // Sort and deduplicate
283
+ allResults.sort((a, b) => Math.abs(b.correlation) - Math.abs(a.correlation));
284
+ return allResults;
285
+ }
286
+ /**
287
+ * Detect anomalies in a metric using z-score
288
+ */
289
+ export function detectAnomalies(metricId, threshold = 2.5) {
290
+ const metric = metrics.get(metricId);
291
+ if (!metric || metric.points.length < 10)
292
+ return [];
293
+ const values = metric.points.map(p => p.value);
294
+ const avg = mean(values);
295
+ const std = stdDev(values);
296
+ if (std === 0)
297
+ return [];
298
+ const anomalies = [];
299
+ for (const point of metric.points) {
300
+ const zScore = Math.abs((point.value - avg) / std);
301
+ if (zScore >= threshold) {
302
+ anomalies.push({
303
+ metricId,
304
+ timestamp: point.timestamp,
305
+ value: point.value,
306
+ expected: avg,
307
+ stdDeviations: zScore,
308
+ severity: zScore >= 4 ? 'high' : zScore >= 3 ? 'medium' : 'low',
309
+ });
310
+ }
311
+ }
312
+ return anomalies;
313
+ }
314
+ /**
315
+ * Detect all anomalies across all metrics
316
+ */
317
+ export function discoverAllAnomalies(threshold = 2.5) {
318
+ const allAnomalies = [];
319
+ for (const metricId of metrics.keys()) {
320
+ const anomalies = detectAnomalies(metricId, threshold);
321
+ allAnomalies.push(...anomalies);
322
+ }
323
+ // Sort by severity and recency
324
+ allAnomalies.sort((a, b) => {
325
+ const severityOrder = { high: 3, medium: 2, low: 1 };
326
+ const severityDiff = severityOrder[b.severity] - severityOrder[a.severity];
327
+ if (severityDiff !== 0)
328
+ return severityDiff;
329
+ return b.timestamp.getTime() - a.timestamp.getTime();
330
+ });
331
+ return allAnomalies;
332
+ }
333
+ /**
334
+ * Detect trend in a metric using linear regression
335
+ */
336
+ export function detectTrend(metricId, periodDays = 30) {
337
+ const metric = metrics.get(metricId);
338
+ if (!metric || metric.points.length < 5)
339
+ return null;
340
+ // Filter to period
341
+ const cutoff = Date.now() - periodDays * 86400000;
342
+ const recentPoints = metric.points.filter(p => p.timestamp.getTime() >= cutoff);
343
+ if (recentPoints.length < 5)
344
+ return null;
345
+ // Linear regression
346
+ const n = recentPoints.length;
347
+ const x = recentPoints.map((_, i) => i);
348
+ const y = recentPoints.map(p => p.value);
349
+ const meanX = mean(x);
350
+ const meanY = mean(y);
351
+ let numerator = 0;
352
+ let denominator = 0;
353
+ for (let i = 0; i < n; i++) {
354
+ numerator += (x[i] - meanX) * (y[i] - meanY);
355
+ denominator += (x[i] - meanX) * (x[i] - meanX);
356
+ }
357
+ const slope = denominator !== 0 ? numerator / denominator : 0;
358
+ const intercept = meanY - slope * meanX;
359
+ // Calculate R-squared
360
+ let ssRes = 0;
361
+ let ssTot = 0;
362
+ for (let i = 0; i < n; i++) {
363
+ const predicted = intercept + slope * x[i];
364
+ ssRes += Math.pow(y[i] - predicted, 2);
365
+ ssTot += Math.pow(y[i] - meanY, 2);
366
+ }
367
+ const rSquared = ssTot !== 0 ? 1 - ssRes / ssTot : 0;
368
+ // Calculate percent change
369
+ const firstValue = recentPoints[0].value;
370
+ const lastValue = recentPoints[recentPoints.length - 1].value;
371
+ const changePercent = firstValue !== 0 ? ((lastValue - firstValue) / firstValue) * 100 : 0;
372
+ // Determine direction (need significant slope and R²)
373
+ let direction = 'stable';
374
+ if (rSquared > 0.3 && Math.abs(changePercent) > 5) {
375
+ direction = slope > 0 ? 'up' : 'down';
376
+ }
377
+ return {
378
+ metricId,
379
+ direction,
380
+ slope,
381
+ rSquared,
382
+ changePercent,
383
+ period: {
384
+ start: recentPoints[0].timestamp,
385
+ end: recentPoints[recentPoints.length - 1].timestamp,
386
+ },
387
+ };
388
+ }
389
+ // ─── Pattern Conversion ──────────────────────────────
390
+ /**
391
+ * Convert correlation results to Pattern format
392
+ */
393
+ export function correlationToPattern(result) {
394
+ const isCausal = result.lagDays !== 0;
395
+ const data = {
396
+ type: isCausal ? 'causation' : 'correlation',
397
+ metricA: result.metricA,
398
+ metricB: result.metricB,
399
+ coefficient: result.correlation,
400
+ lagDays: result.lagDays,
401
+ sampleSize: result.sampleSize,
402
+ };
403
+ const metricA = metrics.get(result.metricA);
404
+ const metricB = metrics.get(result.metricB);
405
+ let summary;
406
+ if (isCausal) {
407
+ const direction = result.correlation > 0 ? 'increases' : 'decreases';
408
+ summary = `${metricA?.name || result.metricA} ${direction} → ${metricB?.name || result.metricB} follows ${Math.abs(result.lagDays)} days later`;
409
+ }
410
+ else {
411
+ const direction = result.correlation > 0 ? 'move together' : 'move opposite';
412
+ summary = `${metricA?.name || result.metricA} and ${metricB?.name || result.metricB} ${direction} (r=${result.correlation.toFixed(2)})`;
413
+ }
414
+ return {
415
+ id: `corr_${result.metricA}_${result.metricB}_${result.lagDays}`,
416
+ type: isCausal ? 'causation' : 'correlation',
417
+ confidence: 1 - result.pValue,
418
+ significance: 1 / Math.max(result.pValue, 0.001),
419
+ entities: [],
420
+ metrics: [result.metricA, result.metricB],
421
+ data,
422
+ discoveredAt: new Date(),
423
+ lastValidated: new Date(),
424
+ validationCount: 1,
425
+ summary,
426
+ };
427
+ }
428
+ /**
429
+ * Convert anomaly result to Pattern format
430
+ */
431
+ export function anomalyToPattern(result) {
432
+ const metric = metrics.get(result.metricId);
433
+ const data = {
434
+ type: 'anomaly',
435
+ metric: result.metricId,
436
+ value: result.value,
437
+ expected: result.expected,
438
+ stdDeviations: result.stdDeviations,
439
+ timestamp: result.timestamp,
440
+ };
441
+ const direction = result.value > result.expected ? 'spike' : 'drop';
442
+ const summary = `Unusual ${direction} in ${metric?.name || result.metricId}: ${result.value.toFixed(1)} vs expected ${result.expected.toFixed(1)}`;
443
+ return {
444
+ id: `anom_${result.metricId}_${result.timestamp.getTime()}`,
445
+ type: 'anomaly',
446
+ confidence: Math.min(result.stdDeviations / 5, 1),
447
+ significance: result.stdDeviations,
448
+ entities: [],
449
+ metrics: [result.metricId],
450
+ data,
451
+ discoveredAt: new Date(),
452
+ lastValidated: new Date(),
453
+ validationCount: 1,
454
+ summary,
455
+ };
456
+ }
457
+ /**
458
+ * Clear all metrics (for testing)
459
+ */
460
+ export function clearMetrics() {
461
+ metrics.clear();
462
+ }
463
+ //# sourceMappingURL=correlation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"correlation.js","sourceRoot":"","sources":["../src/correlation.ts"],"names":[],"mappings":"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"}