@timmeck/brain-core 2.3.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/causal/engine.d.ts +98 -0
- package/dist/causal/engine.js +265 -0
- package/dist/causal/engine.js.map +1 -0
- package/dist/hypothesis/engine.d.ts +104 -0
- package/dist/hypothesis/engine.js +386 -0
- package/dist/hypothesis/engine.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/meta-learning/engine.d.ts +108 -0
- package/dist/meta-learning/engine.js +275 -0
- package/dist/meta-learning/engine.js.map +1 -0
- package/package.json +5 -2
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
import { getLogger } from '../utils/logger.js';
|
|
2
|
+
// ── Migration ───────────────────────────────────────────
|
|
3
|
+
export function runHypothesisMigration(db) {
|
|
4
|
+
db.exec(`
|
|
5
|
+
CREATE TABLE IF NOT EXISTS hypotheses (
|
|
6
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
7
|
+
statement TEXT NOT NULL,
|
|
8
|
+
type TEXT NOT NULL,
|
|
9
|
+
source TEXT NOT NULL,
|
|
10
|
+
variables TEXT NOT NULL,
|
|
11
|
+
condition TEXT NOT NULL,
|
|
12
|
+
status TEXT NOT NULL DEFAULT 'proposed',
|
|
13
|
+
evidence_for INTEGER NOT NULL DEFAULT 0,
|
|
14
|
+
evidence_against INTEGER NOT NULL DEFAULT 0,
|
|
15
|
+
confidence REAL NOT NULL DEFAULT 0,
|
|
16
|
+
p_value REAL NOT NULL DEFAULT 1,
|
|
17
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
18
|
+
tested_at TEXT
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
CREATE TABLE IF NOT EXISTS observations (
|
|
22
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
23
|
+
source TEXT NOT NULL,
|
|
24
|
+
type TEXT NOT NULL,
|
|
25
|
+
value REAL NOT NULL,
|
|
26
|
+
timestamp INTEGER NOT NULL,
|
|
27
|
+
metadata TEXT,
|
|
28
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
CREATE INDEX IF NOT EXISTS idx_hypotheses_status ON hypotheses(status);
|
|
32
|
+
CREATE INDEX IF NOT EXISTS idx_hypotheses_confidence ON hypotheses(confidence DESC);
|
|
33
|
+
CREATE INDEX IF NOT EXISTS idx_observations_type ON observations(type);
|
|
34
|
+
CREATE INDEX IF NOT EXISTS idx_observations_timestamp ON observations(timestamp);
|
|
35
|
+
`);
|
|
36
|
+
}
|
|
37
|
+
// ── Engine ───────────────────────────────────────────────
|
|
38
|
+
/**
|
|
39
|
+
* Hypothesis Engine: generates and tests hypotheses autonomously.
|
|
40
|
+
*
|
|
41
|
+
* Research approach: The scientific method, automated.
|
|
42
|
+
*
|
|
43
|
+
* 1. OBSERVE: Collect observations from all brains
|
|
44
|
+
* 2. HYPOTHESIZE: Generate hypotheses from patterns in observations
|
|
45
|
+
* - Temporal: "Event A occurs more often during time window X"
|
|
46
|
+
* - Correlation: "When metric A increases, metric B also increases"
|
|
47
|
+
* - Threshold: "Performance degrades when metric A exceeds value X"
|
|
48
|
+
* - Frequency: "Event A happens with period P"
|
|
49
|
+
* 3. TEST: Evaluate hypotheses against historical data using statistical tests
|
|
50
|
+
* 4. CONCLUDE: Accept or reject based on evidence
|
|
51
|
+
*/
|
|
52
|
+
export class HypothesisEngine {
|
|
53
|
+
db;
|
|
54
|
+
logger = getLogger();
|
|
55
|
+
minEvidence;
|
|
56
|
+
confirmThreshold; // p-value below this → confirmed
|
|
57
|
+
rejectThreshold; // p-value above this → rejected
|
|
58
|
+
constructor(db, config) {
|
|
59
|
+
this.db = db;
|
|
60
|
+
runHypothesisMigration(db);
|
|
61
|
+
this.minEvidence = config?.minEvidence ?? 10;
|
|
62
|
+
this.confirmThreshold = config?.confirmThreshold ?? 0.05;
|
|
63
|
+
this.rejectThreshold = config?.rejectThreshold ?? 0.5;
|
|
64
|
+
}
|
|
65
|
+
/** Record an observation for hypothesis generation and testing. */
|
|
66
|
+
observe(observation) {
|
|
67
|
+
this.db.prepare(`
|
|
68
|
+
INSERT INTO observations (source, type, value, timestamp, metadata)
|
|
69
|
+
VALUES (?, ?, ?, ?, ?)
|
|
70
|
+
`).run(observation.source, observation.type, observation.value, observation.timestamp, observation.metadata ? JSON.stringify(observation.metadata) : null);
|
|
71
|
+
}
|
|
72
|
+
/** Propose a hypothesis manually or from automated detection. */
|
|
73
|
+
propose(hypothesis) {
|
|
74
|
+
const stmt = this.db.prepare(`
|
|
75
|
+
INSERT INTO hypotheses (statement, type, source, variables, condition, status)
|
|
76
|
+
VALUES (?, ?, ?, ?, ?, 'proposed')
|
|
77
|
+
`);
|
|
78
|
+
const info = stmt.run(hypothesis.statement, hypothesis.type, hypothesis.source, JSON.stringify(hypothesis.variables), JSON.stringify(hypothesis.condition));
|
|
79
|
+
this.logger.info(`Hypothesis proposed: "${hypothesis.statement}"`);
|
|
80
|
+
return this.get(Number(info.lastInsertRowid));
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Auto-generate hypotheses from observation patterns.
|
|
84
|
+
* This is the creative part — the system forms its own theories.
|
|
85
|
+
*/
|
|
86
|
+
generate() {
|
|
87
|
+
const generated = [];
|
|
88
|
+
// Strategy 1: Temporal patterns — "Event X happens more on certain hours"
|
|
89
|
+
const temporalHypotheses = this.generateTemporalHypotheses();
|
|
90
|
+
generated.push(...temporalHypotheses);
|
|
91
|
+
// Strategy 2: Correlation — "When metric A is high, metric B is also high"
|
|
92
|
+
const correlationHypotheses = this.generateCorrelationHypotheses();
|
|
93
|
+
generated.push(...correlationHypotheses);
|
|
94
|
+
// Strategy 3: Threshold — "Performance drops when metric exceeds X"
|
|
95
|
+
const thresholdHypotheses = this.generateThresholdHypotheses();
|
|
96
|
+
generated.push(...thresholdHypotheses);
|
|
97
|
+
this.logger.info(`Generated ${generated.length} hypotheses`);
|
|
98
|
+
return generated;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Test a hypothesis against available data.
|
|
102
|
+
* Returns the test result with updated status.
|
|
103
|
+
*/
|
|
104
|
+
test(hypothesisId) {
|
|
105
|
+
const hyp = this.get(hypothesisId);
|
|
106
|
+
if (!hyp)
|
|
107
|
+
return null;
|
|
108
|
+
const condition = typeof hyp.condition === 'string'
|
|
109
|
+
? JSON.parse(hyp.condition)
|
|
110
|
+
: hyp.condition;
|
|
111
|
+
let result;
|
|
112
|
+
switch (condition.type) {
|
|
113
|
+
case 'temporal':
|
|
114
|
+
result = this.testTemporalHypothesis(hyp, condition);
|
|
115
|
+
break;
|
|
116
|
+
case 'correlation':
|
|
117
|
+
result = this.testCorrelationHypothesis(hyp, condition);
|
|
118
|
+
break;
|
|
119
|
+
case 'threshold':
|
|
120
|
+
result = this.testThresholdHypothesis(hyp, condition);
|
|
121
|
+
break;
|
|
122
|
+
case 'frequency':
|
|
123
|
+
result = this.testFrequencyHypothesis(hyp, condition);
|
|
124
|
+
break;
|
|
125
|
+
default:
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
const totalEvidence = result.evidenceFor + result.evidenceAgainst;
|
|
129
|
+
const confidence = totalEvidence > 0 ? result.evidenceFor / totalEvidence : 0;
|
|
130
|
+
let newStatus = 'testing';
|
|
131
|
+
if (totalEvidence >= this.minEvidence) {
|
|
132
|
+
if (result.pValue < this.confirmThreshold) {
|
|
133
|
+
newStatus = 'confirmed';
|
|
134
|
+
}
|
|
135
|
+
else if (result.pValue > this.rejectThreshold) {
|
|
136
|
+
newStatus = 'rejected';
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
newStatus = 'inconclusive';
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Update in DB
|
|
143
|
+
this.db.prepare(`
|
|
144
|
+
UPDATE hypotheses SET
|
|
145
|
+
evidence_for = ?, evidence_against = ?,
|
|
146
|
+
confidence = ?, p_value = ?, status = ?,
|
|
147
|
+
tested_at = datetime('now')
|
|
148
|
+
WHERE id = ?
|
|
149
|
+
`).run(result.evidenceFor, result.evidenceAgainst, confidence, result.pValue, newStatus, hypothesisId);
|
|
150
|
+
this.logger.info(`Hypothesis #${hypothesisId} tested: ${newStatus} (p=${result.pValue.toFixed(4)}, confidence=${confidence.toFixed(3)})`);
|
|
151
|
+
return {
|
|
152
|
+
hypothesisId,
|
|
153
|
+
passed: newStatus === 'confirmed',
|
|
154
|
+
evidenceFor: result.evidenceFor,
|
|
155
|
+
evidenceAgainst: result.evidenceAgainst,
|
|
156
|
+
pValue: result.pValue,
|
|
157
|
+
confidence,
|
|
158
|
+
newStatus,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/** Test all proposed/testing hypotheses. */
|
|
162
|
+
testAll() {
|
|
163
|
+
const hypotheses = this.db.prepare(`SELECT id FROM hypotheses WHERE status IN ('proposed', 'testing')`).all();
|
|
164
|
+
return hypotheses
|
|
165
|
+
.map(h => this.test(h.id))
|
|
166
|
+
.filter((r) => r !== null);
|
|
167
|
+
}
|
|
168
|
+
/** Get a hypothesis by ID. */
|
|
169
|
+
get(id) {
|
|
170
|
+
const row = this.db.prepare('SELECT * FROM hypotheses WHERE id = ?').get(id);
|
|
171
|
+
if (!row)
|
|
172
|
+
return null;
|
|
173
|
+
return {
|
|
174
|
+
...row,
|
|
175
|
+
variables: JSON.parse(row.variables),
|
|
176
|
+
condition: JSON.parse(row.condition),
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/** List hypotheses by status. */
|
|
180
|
+
list(status, limit = 50) {
|
|
181
|
+
let rows;
|
|
182
|
+
if (status) {
|
|
183
|
+
rows = this.db.prepare('SELECT * FROM hypotheses WHERE status = ? ORDER BY confidence DESC LIMIT ?').all(status, limit);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
rows = this.db.prepare('SELECT * FROM hypotheses ORDER BY confidence DESC LIMIT ?').all(limit);
|
|
187
|
+
}
|
|
188
|
+
return rows.map(r => ({
|
|
189
|
+
...r,
|
|
190
|
+
variables: JSON.parse(r.variables),
|
|
191
|
+
condition: JSON.parse(r.condition),
|
|
192
|
+
}));
|
|
193
|
+
}
|
|
194
|
+
/** Get summary statistics. */
|
|
195
|
+
getSummary() {
|
|
196
|
+
const counts = this.db.prepare(`
|
|
197
|
+
SELECT status, COUNT(*) as count FROM hypotheses GROUP BY status
|
|
198
|
+
`).all();
|
|
199
|
+
const statusMap = {};
|
|
200
|
+
let total = 0;
|
|
201
|
+
for (const { status, count } of counts) {
|
|
202
|
+
statusMap[status] = count;
|
|
203
|
+
total += count;
|
|
204
|
+
}
|
|
205
|
+
const obsCount = this.db.prepare('SELECT COUNT(*) as c FROM observations').get().c;
|
|
206
|
+
const topConfirmed = this.list('confirmed', 5);
|
|
207
|
+
return {
|
|
208
|
+
total,
|
|
209
|
+
proposed: statusMap['proposed'] ?? 0,
|
|
210
|
+
testing: statusMap['testing'] ?? 0,
|
|
211
|
+
confirmed: statusMap['confirmed'] ?? 0,
|
|
212
|
+
rejected: statusMap['rejected'] ?? 0,
|
|
213
|
+
inconclusive: statusMap['inconclusive'] ?? 0,
|
|
214
|
+
totalObservations: obsCount,
|
|
215
|
+
topConfirmed,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
// ── Hypothesis Generation Strategies ──────────────
|
|
219
|
+
generateTemporalHypotheses() {
|
|
220
|
+
const results = [];
|
|
221
|
+
const types = this.getObservationTypes();
|
|
222
|
+
for (const type of types) {
|
|
223
|
+
// Check if there's a time-of-day pattern
|
|
224
|
+
const hourCounts = this.db.prepare(`
|
|
225
|
+
SELECT (timestamp / 3600000) % 24 as hour, COUNT(*) as count
|
|
226
|
+
FROM observations WHERE type = ?
|
|
227
|
+
GROUP BY hour HAVING count >= 3
|
|
228
|
+
ORDER BY count DESC LIMIT 1
|
|
229
|
+
`).get(type);
|
|
230
|
+
if (!hourCounts)
|
|
231
|
+
continue;
|
|
232
|
+
const totalCount = this.db.prepare('SELECT COUNT(*) as c FROM observations WHERE type = ?').get(type).c;
|
|
233
|
+
// If peak hour has > 2x average, propose a hypothesis
|
|
234
|
+
const avgPerHour = totalCount / 24;
|
|
235
|
+
if (hourCounts.count > avgPerHour * 2) {
|
|
236
|
+
const existing = this.db.prepare(`SELECT id FROM hypotheses WHERE type = 'temporal' AND variables LIKE ? AND status != 'rejected'`).get(`%"${type}"%`);
|
|
237
|
+
if (!existing) {
|
|
238
|
+
results.push(this.propose({
|
|
239
|
+
statement: `"${type}" events occur disproportionately around hour ${hourCounts.hour}:00 UTC`,
|
|
240
|
+
type: 'temporal',
|
|
241
|
+
source: 'hypothesis-engine',
|
|
242
|
+
variables: [type],
|
|
243
|
+
condition: {
|
|
244
|
+
type: 'temporal',
|
|
245
|
+
params: { eventType: type, peakHour: hourCounts.hour, expectedRatio: hourCounts.count / avgPerHour },
|
|
246
|
+
},
|
|
247
|
+
}));
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return results;
|
|
252
|
+
}
|
|
253
|
+
generateCorrelationHypotheses() {
|
|
254
|
+
const results = [];
|
|
255
|
+
const types = this.getObservationTypes();
|
|
256
|
+
// Check pairwise correlations between observation types
|
|
257
|
+
for (let i = 0; i < types.length; i++) {
|
|
258
|
+
for (let j = i + 1; j < types.length; j++) {
|
|
259
|
+
const typeA = types[i];
|
|
260
|
+
const typeB = types[j];
|
|
261
|
+
// Simple correlation: count co-occurrences within 1 minute windows
|
|
262
|
+
const coOccurrences = this.db.prepare(`
|
|
263
|
+
SELECT COUNT(*) as count FROM observations a
|
|
264
|
+
INNER JOIN observations b ON b.type = ? AND ABS(a.timestamp - b.timestamp) < 60000
|
|
265
|
+
WHERE a.type = ?
|
|
266
|
+
`).get(typeB, typeA).count;
|
|
267
|
+
const countA = this.db.prepare('SELECT COUNT(*) as c FROM observations WHERE type = ?').get(typeA).c;
|
|
268
|
+
if (countA > 0 && coOccurrences / countA > 0.3) {
|
|
269
|
+
const existing = this.db.prepare(`SELECT id FROM hypotheses WHERE type = 'correlation' AND variables LIKE ? AND variables LIKE ? AND status != 'rejected'`).get(`%"${typeA}"%`, `%"${typeB}"%`);
|
|
270
|
+
if (!existing) {
|
|
271
|
+
results.push(this.propose({
|
|
272
|
+
statement: `"${typeA}" and "${typeB}" events tend to occur together (co-occurrence rate: ${(coOccurrences / countA * 100).toFixed(0)}%)`,
|
|
273
|
+
type: 'correlation',
|
|
274
|
+
source: 'hypothesis-engine',
|
|
275
|
+
variables: [typeA, typeB],
|
|
276
|
+
condition: {
|
|
277
|
+
type: 'correlation',
|
|
278
|
+
params: { typeA, typeB, windowMs: 60_000, observedRate: coOccurrences / countA },
|
|
279
|
+
},
|
|
280
|
+
}));
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return results;
|
|
286
|
+
}
|
|
287
|
+
generateThresholdHypotheses() {
|
|
288
|
+
const results = [];
|
|
289
|
+
const types = this.getObservationTypes();
|
|
290
|
+
for (const type of types) {
|
|
291
|
+
// Look for value distributions with clear thresholds
|
|
292
|
+
const stats = this.db.prepare(`
|
|
293
|
+
SELECT AVG(value) as avg, MAX(value) as max, MIN(value) as min,
|
|
294
|
+
COUNT(*) as count
|
|
295
|
+
FROM observations WHERE type = ?
|
|
296
|
+
`).get(type);
|
|
297
|
+
if (stats.count < 10)
|
|
298
|
+
continue;
|
|
299
|
+
// Check if high values correlate with other events
|
|
300
|
+
const threshold = stats.avg + (stats.max - stats.avg) * 0.5;
|
|
301
|
+
const highCount = this.db.prepare('SELECT COUNT(*) as c FROM observations WHERE type = ? AND value > ?').get(type, threshold).c;
|
|
302
|
+
if (highCount >= 3 && highCount < stats.count * 0.3) {
|
|
303
|
+
const existing = this.db.prepare(`SELECT id FROM hypotheses WHERE type = 'threshold' AND variables LIKE ? AND status != 'rejected'`).get(`%"${type}"%`);
|
|
304
|
+
if (!existing) {
|
|
305
|
+
results.push(this.propose({
|
|
306
|
+
statement: `"${type}" shows anomalous behavior when value exceeds ${threshold.toFixed(2)} (affects ${(highCount / stats.count * 100).toFixed(0)}% of observations)`,
|
|
307
|
+
type: 'threshold',
|
|
308
|
+
source: 'hypothesis-engine',
|
|
309
|
+
variables: [type],
|
|
310
|
+
condition: {
|
|
311
|
+
type: 'threshold',
|
|
312
|
+
params: { eventType: type, threshold, aboveCount: highCount, totalCount: stats.count },
|
|
313
|
+
},
|
|
314
|
+
}));
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
return results;
|
|
319
|
+
}
|
|
320
|
+
// ── Hypothesis Testing ────────────────────────────
|
|
321
|
+
testTemporalHypothesis(hyp, condition) {
|
|
322
|
+
const { eventType, peakHour } = condition.params;
|
|
323
|
+
const total = this.db.prepare('SELECT COUNT(*) as c FROM observations WHERE type = ?').get(eventType).c;
|
|
324
|
+
const inPeak = this.db.prepare('SELECT COUNT(*) as c FROM observations WHERE type = ? AND (timestamp / 3600000) % 24 = ?').get(eventType, peakHour).c;
|
|
325
|
+
const expected = total / 24;
|
|
326
|
+
const evidenceFor = inPeak;
|
|
327
|
+
const evidenceAgainst = Math.max(0, Math.round(expected) - inPeak);
|
|
328
|
+
// Chi-squared test approximation (1 degree of freedom)
|
|
329
|
+
const chiSq = expected > 0 ? Math.pow(inPeak - expected, 2) / expected : 0;
|
|
330
|
+
const pValue = Math.exp(-chiSq / 2); // rough p-value approximation
|
|
331
|
+
return { evidenceFor, evidenceAgainst, pValue };
|
|
332
|
+
}
|
|
333
|
+
testCorrelationHypothesis(hyp, condition) {
|
|
334
|
+
const { typeA, typeB, windowMs } = condition.params;
|
|
335
|
+
const coOccurrences = this.db.prepare(`
|
|
336
|
+
SELECT COUNT(*) as count FROM observations a
|
|
337
|
+
INNER JOIN observations b ON b.type = ? AND ABS(a.timestamp - b.timestamp) < ?
|
|
338
|
+
WHERE a.type = ?
|
|
339
|
+
`).get(typeB, windowMs, typeA).count;
|
|
340
|
+
const countA = this.db.prepare('SELECT COUNT(*) as c FROM observations WHERE type = ?').get(typeA).c;
|
|
341
|
+
const countB = this.db.prepare('SELECT COUNT(*) as c FROM observations WHERE type = ?').get(typeB).c;
|
|
342
|
+
if (countA === 0 || countB === 0)
|
|
343
|
+
return { evidenceFor: 0, evidenceAgainst: 0, pValue: 1 };
|
|
344
|
+
const observedRate = coOccurrences / countA;
|
|
345
|
+
// Expected rate under independence
|
|
346
|
+
const timeRange = this.getObservationTimeRange();
|
|
347
|
+
const expectedRate = timeRange > 0 ? Math.min(1, (countB / timeRange) * windowMs * 2) : 0;
|
|
348
|
+
const evidenceFor = coOccurrences;
|
|
349
|
+
const evidenceAgainst = Math.max(0, countA - coOccurrences);
|
|
350
|
+
// Simplified z-test for proportions
|
|
351
|
+
if (expectedRate <= 0 || expectedRate >= 1)
|
|
352
|
+
return { evidenceFor, evidenceAgainst, pValue: 1 };
|
|
353
|
+
const z = (observedRate - expectedRate) / Math.sqrt(expectedRate * (1 - expectedRate) / countA);
|
|
354
|
+
const pValue = Math.exp(-0.5 * z * z); // rough p-value
|
|
355
|
+
return { evidenceFor, evidenceAgainst, pValue: Math.min(1, pValue) };
|
|
356
|
+
}
|
|
357
|
+
testThresholdHypothesis(hyp, condition) {
|
|
358
|
+
const { eventType, threshold } = condition.params;
|
|
359
|
+
const above = this.db.prepare('SELECT COUNT(*) as c FROM observations WHERE type = ? AND value > ?').get(eventType, threshold).c;
|
|
360
|
+
const total = this.db.prepare('SELECT COUNT(*) as c FROM observations WHERE type = ?').get(eventType).c;
|
|
361
|
+
const below = total - above;
|
|
362
|
+
// Test: is the proportion above threshold significantly different from random?
|
|
363
|
+
const proportion = total > 0 ? above / total : 0;
|
|
364
|
+
// Under null hypothesis, threshold splits data randomly
|
|
365
|
+
const expectedProportion = 0.5;
|
|
366
|
+
const z = total > 0
|
|
367
|
+
? (proportion - expectedProportion) / Math.sqrt(expectedProportion * (1 - expectedProportion) / total)
|
|
368
|
+
: 0;
|
|
369
|
+
// We care about the threshold being meaningful, so evidence is relative
|
|
370
|
+
const pValue = Math.exp(-0.5 * z * z);
|
|
371
|
+
return { evidenceFor: above, evidenceAgainst: below, pValue: Math.min(1, pValue) };
|
|
372
|
+
}
|
|
373
|
+
testFrequencyHypothesis(_hyp, _condition) {
|
|
374
|
+
// Placeholder for frequency/periodicity testing
|
|
375
|
+
return { evidenceFor: 0, evidenceAgainst: 0, pValue: 1 };
|
|
376
|
+
}
|
|
377
|
+
// ── Helpers ───────────────────────────────────────
|
|
378
|
+
getObservationTypes() {
|
|
379
|
+
return this.db.prepare('SELECT DISTINCT type FROM observations').all().map(r => r.type);
|
|
380
|
+
}
|
|
381
|
+
getObservationTimeRange() {
|
|
382
|
+
const row = this.db.prepare('SELECT MIN(timestamp) as min_ts, MAX(timestamp) as max_ts FROM observations').get();
|
|
383
|
+
return (row.max_ts ?? 0) - (row.min_ts ?? 0);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/hypothesis/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -59,3 +59,9 @@ export { ExportService } from './export/service.js';
|
|
|
59
59
|
export type { ExportOptions, ExportResult } from './export/service.js';
|
|
60
60
|
export { BackupService } from './backup/service.js';
|
|
61
61
|
export type { BackupConfig, BackupRecord, RestoreResult } from './backup/service.js';
|
|
62
|
+
export { MetaLearningEngine, runMetaLearningMigration } from './meta-learning/engine.js';
|
|
63
|
+
export type { HyperParameter, LearningSnapshot, ParameterRecommendation, MetaLearningStatus } from './meta-learning/engine.js';
|
|
64
|
+
export { CausalGraph, runCausalMigration } from './causal/engine.js';
|
|
65
|
+
export type { CausalEvent, CausalEdge, CausalPath, CausalAnalysis } from './causal/engine.js';
|
|
66
|
+
export { HypothesisEngine, runHypothesisMigration } from './hypothesis/engine.js';
|
|
67
|
+
export type { Hypothesis, HypothesisStatus, HypothesisCondition, HypothesisTestResult, Observation } from './hypothesis/engine.js';
|
package/dist/index.js
CHANGED
|
@@ -51,4 +51,10 @@ export { WebhookService, runWebhookMigration } from './webhooks/service.js';
|
|
|
51
51
|
export { ExportService } from './export/service.js';
|
|
52
52
|
// ── Backup ────────────────────────────────────────────────
|
|
53
53
|
export { BackupService } from './backup/service.js';
|
|
54
|
+
// ── Meta-Learning ────────────────────────────────────────
|
|
55
|
+
export { MetaLearningEngine, runMetaLearningMigration } from './meta-learning/engine.js';
|
|
56
|
+
// ── Causal Inference ─────────────────────────────────────
|
|
57
|
+
export { CausalGraph, runCausalMigration } from './causal/engine.js';
|
|
58
|
+
// ── Hypothesis Engine ────────────────────────────────────
|
|
59
|
+
export { HypothesisEngine, runHypothesisMigration } from './hypothesis/engine.js';
|
|
54
60
|
//# sourceMappingURL=index.js.map
|
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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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
export interface HyperParameter {
|
|
3
|
+
name: string;
|
|
4
|
+
value: number;
|
|
5
|
+
min: number;
|
|
6
|
+
max: number;
|
|
7
|
+
step: number;
|
|
8
|
+
}
|
|
9
|
+
export interface LearningSnapshot {
|
|
10
|
+
id?: number;
|
|
11
|
+
cycle: number;
|
|
12
|
+
params: Record<string, number>;
|
|
13
|
+
metrics: Record<string, number>;
|
|
14
|
+
score: number;
|
|
15
|
+
created_at?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ParameterRecommendation {
|
|
18
|
+
name: string;
|
|
19
|
+
currentValue: number;
|
|
20
|
+
recommendedValue: number;
|
|
21
|
+
expectedImprovement: number;
|
|
22
|
+
confidence: number;
|
|
23
|
+
evidence: number;
|
|
24
|
+
}
|
|
25
|
+
export interface MetaLearningStatus {
|
|
26
|
+
totalSnapshots: number;
|
|
27
|
+
totalOptimizations: number;
|
|
28
|
+
bestScore: number;
|
|
29
|
+
worstScore: number;
|
|
30
|
+
currentScore: number;
|
|
31
|
+
trend: 'improving' | 'stable' | 'declining';
|
|
32
|
+
recommendations: ParameterRecommendation[];
|
|
33
|
+
}
|
|
34
|
+
export declare function runMetaLearningMigration(db: Database.Database): void;
|
|
35
|
+
/**
|
|
36
|
+
* Meta-Learning Engine: observes learning cycle outcomes over time
|
|
37
|
+
* and auto-tunes hyperparameters using gradient-free optimization.
|
|
38
|
+
*
|
|
39
|
+
* Research approach: Bayesian-inspired parameter search.
|
|
40
|
+
* - After each learning cycle, record a snapshot (params + metrics + effectiveness score)
|
|
41
|
+
* - Periodically analyze: which parameter configurations produced the best scores?
|
|
42
|
+
* - Use perturbation: try small changes to parameters, measure improvement, keep what works
|
|
43
|
+
* - Implements "explore vs exploit": 80% exploit best known, 20% explore new configurations
|
|
44
|
+
*/
|
|
45
|
+
export declare class MetaLearningEngine {
|
|
46
|
+
private db;
|
|
47
|
+
private params;
|
|
48
|
+
private logger;
|
|
49
|
+
private cycleCount;
|
|
50
|
+
private analyzeInterval;
|
|
51
|
+
private explorationRate;
|
|
52
|
+
constructor(db: Database.Database, params: HyperParameter[], config?: {
|
|
53
|
+
analyzeInterval?: number;
|
|
54
|
+
explorationRate?: number;
|
|
55
|
+
});
|
|
56
|
+
/**
|
|
57
|
+
* Record a learning cycle's outcome. Called after each learning cycle.
|
|
58
|
+
* @param metrics - the raw metrics from the cycle (e.g. newPatterns, updatedRules, prunedRules)
|
|
59
|
+
* @param score - a composite effectiveness score (higher = better)
|
|
60
|
+
*/
|
|
61
|
+
recordSnapshot(metrics: Record<string, number>, score: number): LearningSnapshot;
|
|
62
|
+
/**
|
|
63
|
+
* Analyze snapshots and recommend parameter changes.
|
|
64
|
+
* Uses a simplified approach inspired by Bayesian optimization:
|
|
65
|
+
* - Group snapshots by parameter ranges
|
|
66
|
+
* - Find which ranges produced the best average scores
|
|
67
|
+
* - Recommend moving towards those ranges
|
|
68
|
+
*/
|
|
69
|
+
analyze(): ParameterRecommendation[];
|
|
70
|
+
/**
|
|
71
|
+
* Apply recommendations: perturb parameters towards better configurations.
|
|
72
|
+
* Returns the parameters that were changed.
|
|
73
|
+
*/
|
|
74
|
+
optimize(): ParameterRecommendation[];
|
|
75
|
+
/**
|
|
76
|
+
* Run analysis + optimization if it's time. Call this after every learning cycle.
|
|
77
|
+
*/
|
|
78
|
+
step(metrics: Record<string, number>, score: number): {
|
|
79
|
+
snapshot: LearningSnapshot;
|
|
80
|
+
optimized: ParameterRecommendation[];
|
|
81
|
+
};
|
|
82
|
+
/** Get current parameter values. */
|
|
83
|
+
getParams(): Record<string, number>;
|
|
84
|
+
/** Update a parameter value externally (e.g. user override). */
|
|
85
|
+
setParam(name: string, value: number): boolean;
|
|
86
|
+
/** Get learning effectiveness status. */
|
|
87
|
+
getStatus(): MetaLearningStatus;
|
|
88
|
+
/** Get optimization history. */
|
|
89
|
+
getHistory(limit?: number): Array<{
|
|
90
|
+
param_name: string;
|
|
91
|
+
old_value: number;
|
|
92
|
+
new_value: number;
|
|
93
|
+
reason: string;
|
|
94
|
+
improvement: number | null;
|
|
95
|
+
created_at: string;
|
|
96
|
+
}>;
|
|
97
|
+
private getSnapshots;
|
|
98
|
+
/**
|
|
99
|
+
* Analyze a single parameter's effect on learning effectiveness.
|
|
100
|
+
*
|
|
101
|
+
* Algorithm:
|
|
102
|
+
* 1. Divide the parameter's range into bins
|
|
103
|
+
* 2. For each bin, calculate the average score of snapshots in that bin
|
|
104
|
+
* 3. Find the bin with the highest average score
|
|
105
|
+
* 4. Recommend moving towards the center of that bin
|
|
106
|
+
*/
|
|
107
|
+
private analyzeParameter;
|
|
108
|
+
}
|