176 lines
5.5 KiB
TypeScript
176 lines
5.5 KiB
TypeScript
/**
|
|
* Strange Loops Simulation
|
|
*
|
|
* Tests self-referential learning patterns using strange-loops concepts
|
|
* Agents observe their own performance and adapt based on meta-cognitive feedback
|
|
*/
|
|
|
|
import { createUnifiedDatabase } from '../../src/db-unified.js';
|
|
import { ReflexionMemory } from '../../src/controllers/ReflexionMemory.js';
|
|
import { CausalMemoryGraph } from '../../src/controllers/CausalMemoryGraph.js';
|
|
import { EmbeddingService } from '../../src/controllers/EmbeddingService.js';
|
|
import * as path from 'path';
|
|
|
|
export default {
|
|
description: 'Self-referential learning with strange loops and meta-cognition',
|
|
|
|
async run(config: any) {
|
|
const { verbosity = 2, depth = 3 } = config;
|
|
|
|
if (verbosity >= 2) {
|
|
console.log(` 🔄 Initializing Strange Loops Simulation (depth=${depth})`);
|
|
}
|
|
|
|
// Initialize AgentDB
|
|
const embedder = new EmbeddingService({
|
|
model: 'Xenova/all-MiniLM-L6-v2',
|
|
dimension: 384,
|
|
provider: 'transformers'
|
|
});
|
|
await embedder.initialize();
|
|
|
|
const db = await createUnifiedDatabase(
|
|
path.join(process.cwd(), 'simulation', 'data', 'strange-loops.graph'),
|
|
embedder,
|
|
{ forceMode: 'graph' }
|
|
);
|
|
|
|
const reflexion = new ReflexionMemory(
|
|
db.getGraphDatabase() as any,
|
|
embedder,
|
|
undefined,
|
|
undefined,
|
|
db.getGraphDatabase() as any
|
|
);
|
|
|
|
const causal = new CausalMemoryGraph(
|
|
db.getGraphDatabase() as any,
|
|
db.getGraphDatabase() as any // Pass graphBackend for GraphDatabaseAdapter support
|
|
);
|
|
|
|
const results = {
|
|
loops: 0,
|
|
metaLearnings: 0,
|
|
selfReferences: 0,
|
|
adaptations: 0,
|
|
totalTime: 0
|
|
};
|
|
|
|
const startTime = performance.now();
|
|
|
|
// Level 0: Base action
|
|
const baseActionId = await reflexion.storeEpisode({
|
|
sessionId: 'strange-loop',
|
|
task: 'perform base action',
|
|
reward: 0.70,
|
|
success: true,
|
|
input: 'Initial task',
|
|
output: 'Initial result',
|
|
critique: 'Can be improved'
|
|
});
|
|
|
|
results.loops++;
|
|
|
|
if (verbosity >= 3) {
|
|
console.log(` 🔹 Level 0: Base action (reward: 0.70)`);
|
|
}
|
|
|
|
// Strange loop: Each level observes and improves the previous level
|
|
let previousId = baseActionId;
|
|
let previousReward = 0.70;
|
|
|
|
for (let level = 1; level <= depth; level++) {
|
|
// Meta-observation: Observe previous level's performance
|
|
const metaObservation = await reflexion.storeEpisode({
|
|
sessionId: 'strange-loop',
|
|
task: `observe level ${level - 1} performance`,
|
|
reward: previousReward + 0.05, // Slight improvement from observation
|
|
success: true,
|
|
input: `Analyzing level ${level - 1}`,
|
|
output: `Identified improvement opportunities`,
|
|
critique: `Level ${level - 1} critique: reward ${previousReward.toFixed(2)}`
|
|
});
|
|
|
|
results.metaLearnings++;
|
|
|
|
// Self-reference: Create causal link back to previous level
|
|
await causal.addCausalEdge({
|
|
fromMemoryId: previousId,
|
|
fromMemoryType: 'episode',
|
|
toMemoryId: metaObservation,
|
|
toMemoryType: 'episode',
|
|
similarity: 0.90,
|
|
uplift: 0.05,
|
|
confidence: 0.85,
|
|
sampleSize: 100,
|
|
mechanism: `Meta-observation of level ${level - 1}`
|
|
});
|
|
|
|
results.selfReferences++;
|
|
|
|
// Adaptation: Apply learnings to create improved action
|
|
const improvedReward = Math.min(0.95, previousReward + 0.08);
|
|
const improvedActionId = await reflexion.storeEpisode({
|
|
sessionId: 'strange-loop',
|
|
task: `perform improved action at level ${level}`,
|
|
reward: improvedReward,
|
|
success: true,
|
|
input: `Enhanced task based on meta-observation`,
|
|
output: `Improved result`,
|
|
critique: `Applied learnings from level ${level - 1}`
|
|
});
|
|
|
|
results.adaptations++;
|
|
|
|
// Create causal link from meta-observation to improved action
|
|
await causal.addCausalEdge({
|
|
fromMemoryId: metaObservation,
|
|
fromMemoryType: 'episode',
|
|
toMemoryId: improvedActionId,
|
|
toMemoryType: 'episode',
|
|
similarity: 0.95,
|
|
uplift: 0.08,
|
|
confidence: 0.90,
|
|
sampleSize: 100,
|
|
mechanism: `Self-improvement through meta-cognition`
|
|
});
|
|
|
|
results.loops++;
|
|
|
|
if (verbosity >= 3) {
|
|
console.log(` 🔹 Level ${level}: Meta-observation + Adaptation (reward: ${improvedReward.toFixed(2)})`);
|
|
}
|
|
|
|
// The loop: Next iteration observes THIS level's performance
|
|
previousId = improvedActionId;
|
|
previousReward = improvedReward;
|
|
}
|
|
|
|
// Note: Causal chain querying requires full SQL migration
|
|
// For now, we track the strange loop structure through episode creation
|
|
|
|
if (verbosity >= 2) {
|
|
console.log(` 🔄 Strange Loop Structure: ${baseActionId} → ... → ${previousId}`);
|
|
console.log(` 📊 Loops: ${results.loops}`);
|
|
console.log(` 📊 Meta-learnings: ${results.metaLearnings}`);
|
|
console.log(` 📊 Self-references: ${results.selfReferences}`);
|
|
console.log(` 📊 Adaptations: ${results.adaptations}`);
|
|
}
|
|
|
|
if (verbosity >= 3) {
|
|
console.log(` 🔍 Reward Progression: 0.70 → ${previousReward.toFixed(2)} (+${((previousReward - 0.70) * 100).toFixed(1)}%)`);
|
|
}
|
|
|
|
const endTime = performance.now();
|
|
results.totalTime = endTime - startTime;
|
|
|
|
db.close();
|
|
|
|
if (verbosity >= 2) {
|
|
console.log(` ⏱️ Duration: ${results.totalTime.toFixed(2)}ms`);
|
|
}
|
|
|
|
return results;
|
|
}
|
|
};
|