Squashed 'vendor/ruvector/' content from commit b64c2172

git-subtree-dir: vendor/ruvector
git-subtree-split: b64c21726f2bb37286d9ee36a7869fef60cc6900
This commit is contained in:
ruv
2026-02-28 14:39:40 -05:00
commit d803bfe2b1
7854 changed files with 3522914 additions and 0 deletions

View File

@@ -0,0 +1,897 @@
#!/usr/bin/env node
/**
* 🔬 COGNITIVE EXPLORER - Autonomous Discovery System
*
* Combines SNN + AgentDB + Attention + SIMD to discover emergent capabilities
*
* Novel Features:
* - Neuromorphic semantic memory (spikes + vectors)
* - Attention-modulated STDP learning
* - Self-organizing knowledge graphs
* - Meta-learning (learns how to learn)
* - Autonomous capability discovery
*/
const path = require('path');
const { VectorDB } = require('@ruvector/core');
const { MultiHeadAttention, HyperbolicAttention, FlashAttention } = require('@ruvector/attention');
const { createFeedforwardSNN, rateEncoding } = require('../snn/lib/SpikingNeuralNetwork');
// SIMD ops are in a benchmark file, so inline simple versions
function distanceSIMD(a, b) {
let sum = 0;
for (let i = 0; i < a.length; i++) {
const diff = a[i] - b[i];
sum += diff * diff;
}
return Math.sqrt(sum);
}
function dotProductSIMD(a, b) {
let sum = 0;
for (let i = 0; i < a.length; i++) {
sum += a[i] * b[i];
}
return sum;
}
function cosineSimilaritySIMD(a, b) {
let dotProduct = 0;
let magA = 0;
let magB = 0;
for (let i = 0; i < a.length; i++) {
dotProduct += a[i] * b[i];
magA += a[i] * a[i];
magB += b[i] * b[i];
}
return dotProduct / (Math.sqrt(magA) * Math.sqrt(magB));
}
console.log('🔬 COGNITIVE EXPLORER - Autonomous Discovery System\n');
console.log('='.repeat(70));
// ============================================================================
// Hybrid Cognitive Architecture
// ============================================================================
class NeuromorphicMemory {
constructor(dimension = 128, capacity = 1000) {
this.dimension = dimension;
this.capacity = capacity;
// Vector database for semantic storage
const dbPath = path.join(process.cwd(), 'demos', 'exploration', 'memory.bin');
this.vectorDB = new VectorDB({
dimensions: dimension,
maxElements: capacity,
storagePath: dbPath
});
// Spiking neural network for temporal processing
this.snn = createFeedforwardSNN([dimension, 256, 128, dimension], {
dt: 1.0,
tau: 20.0,
a_plus: 0.01,
lateral_inhibition: true,
inhibition_strength: 10.0
});
// Attention mechanism for selective focus
this.attention = new MultiHeadAttention(dimension, 8);
// Metadata
this.memories = [];
this.memory_count = 0;
}
/**
* Store experience using hybrid spike + vector encoding
*/
async storeExperience(vector, metadata, spike_pattern = null) {
const id = `exp_${this.memory_count++}`;
// Encode via SNN if spike pattern not provided
if (!spike_pattern) {
spike_pattern = await this.encodeAsSpikes(vector);
}
// Store in vector DB (vector must be regular array, not TypedArray)
const vectorArray = Array.isArray(vector) ? vector : Array.from(vector);
// Store metadata without spike_pattern (too large for VectorDB metadata)
const simpleMetadata = {};
for (const key in metadata) {
if (typeof metadata[key] !== 'object' || metadata[key] === null) {
simpleMetadata[key] = metadata[key];
} else if (typeof metadata[key] === 'string' || typeof metadata[key] === 'number') {
simpleMetadata[key] = metadata[key];
}
}
simpleMetadata.timestamp = Date.now();
simpleMetadata.retrieval_count = 0;
await this.vectorDB.insert({
id: id,
vector: vectorArray,
metadata: simpleMetadata
});
this.memories.push({ id, vector, metadata, spike_pattern });
return id;
}
/**
* Encode vector as spike pattern through SNN
*/
async encodeAsSpikes(vector) {
this.snn.reset();
const spike_history = [];
// Present vector as input over time
for (let t = 0; t < 50; t++) {
const input_spikes = rateEncoding(vector, this.snn.dt, 100);
this.snn.step(input_spikes);
// Collect output spikes
const output = this.snn.getOutput();
spike_history.push(Array.from(output));
}
// Aggregate spike pattern (sum over time)
const pattern = new Float32Array(this.dimension);
for (const spikes of spike_history) {
for (let i = 0; i < spikes.length && i < pattern.length; i++) {
pattern[i] += spikes[i];
}
}
// Normalize
const sum = pattern.reduce((a, b) => a + b, 0);
if (sum > 0) {
for (let i = 0; i < pattern.length; i++) {
pattern[i] /= sum;
}
}
return pattern;
}
/**
* Retrieve memories using attention-weighted similarity
*/
async retrieve(query_vector, k = 5, use_attention = true) {
// Convert to Float32Array for SIMD
const query = new Float32Array(query_vector);
// Get candidates from vector DB
const candidates = await this.vectorDB.search({
vector: Array.from(query),
k: k * 2 // Get more candidates for reranking
});
// Retrieve full metadata
const memories = [];
for (const candidate of candidates) {
const data = await this.vectorDB.get(candidate.id);
if (data) {
memories.push({
id: candidate.id,
score: candidate.score,
vector: new Float32Array(data.vector),
metadata: data.metadata
});
}
}
if (!use_attention || memories.length === 0) {
return memories.slice(0, k);
}
// Rerank using attention mechanism
const query_expanded = this.expandDimension(query);
const keys = memories.map(m => this.expandDimension(m.vector));
// Compute attention scores
const attention_scores = this.computeAttentionScores(query_expanded, keys);
// Combine vector similarity with attention
for (let i = 0; i < memories.length; i++) {
const vector_sim = 1 - memories[i].score; // Convert distance to similarity
const attention_weight = attention_scores[i];
// Hybrid score: 0.7 * vector + 0.3 * attention
memories[i].hybrid_score = 0.7 * vector_sim + 0.3 * attention_weight;
}
// Sort by hybrid score
memories.sort((a, b) => b.hybrid_score - a.hybrid_score);
return memories.slice(0, k);
}
/**
* Compute attention scores using multi-head attention
*/
computeAttentionScores(query, keys) {
// Simple attention: dot product + softmax
const scores = new Float32Array(keys.length);
for (let i = 0; i < keys.length; i++) {
scores[i] = dotProductSIMD(query, keys[i]);
}
// Softmax
const max_score = Math.max(...scores);
const exp_scores = Array.from(scores).map(s => Math.exp(s - max_score));
const sum_exp = exp_scores.reduce((a, b) => a + b, 0);
return exp_scores.map(e => e / sum_exp);
}
/**
* Expand dimension if needed (for attention compatibility)
*/
expandDimension(vector) {
if (vector.length === this.dimension) {
return vector;
}
const expanded = new Float32Array(this.dimension);
for (let i = 0; i < Math.min(vector.length, this.dimension); i++) {
expanded[i] = vector[i];
}
return expanded;
}
/**
* Consolidate memories (replay and strengthen important ones)
*/
async consolidate(iterations = 10) {
console.log('\n🧠 Consolidating memories...');
for (let iter = 0; iter < iterations; iter++) {
// Sample random memory
if (this.memories.length === 0) break;
const memory = this.memories[Math.floor(Math.random() * this.memories.length)];
// Replay through SNN (strengthens connections via STDP)
this.snn.reset();
for (let t = 0; t < 100; t++) {
const input = rateEncoding(memory.vector, this.snn.dt, 100);
this.snn.step(input);
}
// Find similar memories and link them
const similar = await this.retrieve(memory.vector, 3, false);
if (similar.length > 1 && iter % 5 === 0) {
console.log(` Memory ${memory.id.slice(-4)} linked to ${similar.length} similar experiences`);
}
}
console.log(` Consolidated ${iterations} memory replays`);
}
/**
* Get memory statistics
*/
getStats() {
const snn_stats = this.snn.getStats();
return {
total_memories: this.memory_count,
active_memories: this.memories.length,
snn_layers: snn_stats.layers.length,
avg_layer_activity: snn_stats.layers.map(l =>
l.neurons ? l.neurons.avg_voltage : 0
)
};
}
}
// ============================================================================
// Autonomous Capability Explorer
// ============================================================================
class CapabilityExplorer {
constructor() {
this.memory = new NeuromorphicMemory(128, 5000);
this.discoveries = [];
this.experiments_run = 0;
// Hyperbolic attention for hierarchical discovery
this.hierarchical_attention = new HyperbolicAttention(128, -1.0);
}
/**
* Explore: Discover emergent capabilities through experimentation
*/
async explore() {
console.log('\n\n🔬 STARTING AUTONOMOUS EXPLORATION\n');
console.log('='.repeat(70));
// Experiment 1: Spike-Vector Duality
await this.discoverSpikeVectorDuality();
// Experiment 2: Attention-Modulated Memory
await this.discoverAttentionModulation();
// Experiment 3: Temporal Pattern Emergence
await this.discoverTemporalPatterns();
// Experiment 4: Hierarchical Clustering
await this.discoverHierarchicalClustering();
// Experiment 5: Meta-Learning
await this.discoverMetaLearning();
// Experiment 6: Emergent Abstraction
await this.discoverEmergentAbstraction();
// Consolidate all discoveries
await this.memory.consolidate(20);
// Report findings
this.reportDiscoveries();
}
/**
* Discovery 1: Spike-Vector Duality
* Vectors can be encoded as spike patterns and vice versa
*/
async discoverSpikeVectorDuality() {
console.log('\n📊 Experiment 1: Spike-Vector Duality\n');
const test_vectors = this.generateTestVectors(10);
let reconstruction_error = 0;
const spike_patterns = [];
for (const vector of test_vectors) {
// Encode as spikes
const spikes = await this.memory.encodeAsSpikes(vector);
spike_patterns.push(spikes);
// Measure reconstruction quality
const error = distanceSIMD(vector, spikes);
reconstruction_error += error;
}
const avg_error = reconstruction_error / test_vectors.length;
console.log(` Encoded ${test_vectors.length} vectors as spike patterns`);
console.log(` Average reconstruction error: ${avg_error.toFixed(4)}`);
console.log(` Quality: ${avg_error < 0.5 ? '✅ Excellent' : avg_error < 1.0 ? '✓ Good' : '⚠️ Fair'}`);
// Analyze spike patterns
const spike_diversity = this.analyzeSpikePatternDiversity(spike_patterns);
console.log(` Spike pattern diversity: ${spike_diversity.toFixed(3)}`);
this.recordDiscovery('Spike-Vector Duality', {
description: 'Vectors can be reliably encoded as spike patterns with low reconstruction error',
avg_error: avg_error,
spike_diversity: spike_diversity,
insight: 'Spike encoding preserves semantic information while adding temporal dynamics',
novelty: avg_error < 0.5 ? 'High' : 'Medium'
});
}
/**
* Discovery 2: Attention-Modulated Memory Retrieval
*/
async discoverAttentionModulation() {
console.log('\n\n🎯 Experiment 2: Attention-Modulated Memory\n');
// Store diverse memories
const concepts = [
{ vec: this.randomVector(), label: 'Abstract Concept A', category: 'abstract' },
{ vec: this.randomVector(), label: 'Concrete Object B', category: 'concrete' },
{ vec: this.randomVector(), label: 'Abstract Concept C', category: 'abstract' },
{ vec: this.randomVector(), label: 'Concrete Object D', category: 'concrete' },
{ vec: this.randomVector(), label: 'Abstract Concept E', category: 'abstract' }
];
for (const concept of concepts) {
await this.memory.storeExperience(concept.vec, {
label: concept.label,
category: concept.category
});
}
// Test retrieval with vs without attention
const query = this.randomVector();
const without_attention = await this.memory.retrieve(query, 3, false);
const with_attention = await this.memory.retrieve(query, 3, true);
console.log(' Retrieval WITHOUT attention:');
without_attention.forEach((m, i) => {
console.log(` ${i+1}. ${m.metadata?.label || m.id} (score: ${m.score.toFixed(4)})`);
});
console.log('\n Retrieval WITH attention:');
with_attention.forEach((m, i) => {
console.log(` ${i+1}. ${m.metadata?.label || m.id} (hybrid: ${m.hybrid_score.toFixed(4)})`);
});
// Measure ranking change
const ranking_change = this.measureRankingChange(without_attention, with_attention);
console.log(`\n Ranking change: ${ranking_change.toFixed(2)}%`);
console.log(` Impact: ${ranking_change > 30 ? '🔥 Significant' : ranking_change > 10 ? '✓ Moderate' : '~ Minimal'}`);
this.recordDiscovery('Attention-Modulated Retrieval', {
description: 'Attention mechanism reranks retrieved memories based on learned importance',
ranking_change: ranking_change,
insight: 'Attention provides context-sensitive memory access beyond pure similarity',
novelty: ranking_change > 30 ? 'High' : 'Medium'
});
}
/**
* Discovery 3: Temporal Pattern Emergence
*/
async discoverTemporalPatterns() {
console.log('\n\n⏱ Experiment 3: Temporal Pattern Emergence\n');
// Create sequence of related experiences
const sequence = [];
let base_vector = this.randomVector();
console.log(' Generating temporal sequence...');
for (let i = 0; i < 10; i++) {
// Each step evolves from previous
const evolved = this.evolveVector(base_vector, 0.1);
await this.memory.storeExperience(evolved, {
sequence_id: 'seq_1',
step: i,
description: `Step ${i} in temporal sequence`
});
sequence.push(evolved);
base_vector = evolved;
}
// Process entire sequence through SNN
this.memory.snn.reset();
const snn_outputs = [];
for (let i = 0; i < sequence.length; i++) {
const input = rateEncoding(sequence[i], this.memory.snn.dt, 100);
for (let t = 0; t < 10; t++) {
this.memory.snn.step(input);
}
const output = this.memory.snn.getOutput();
snn_outputs.push(Array.from(output));
}
// Analyze temporal coherence
const coherence = this.measureTemporalCoherence(snn_outputs);
console.log(` Sequence length: ${sequence.length} steps`);
console.log(` Temporal coherence: ${coherence.toFixed(3)}`);
console.log(` Pattern detected: ${coherence > 0.7 ? '✅ Strong' : coherence > 0.5 ? '✓ Moderate' : '~ Weak'}`);
// Check if SNN learned the sequence structure
const snn_stats = this.memory.snn.getStats();
const learning_occurred = snn_stats.layers.some(l =>
l.synapses && (l.synapses.mean > 0.35 || l.synapses.mean < 0.25)
);
console.log(` STDP learning: ${learning_occurred ? '✅ Weights adapted' : '~ Minimal change'}`);
this.recordDiscovery('Temporal Pattern Emergence', {
description: 'SNN learns temporal structure through STDP, creating coherent sequence representations',
coherence: coherence,
learning: learning_occurred,
insight: 'Spike timing naturally encodes sequential dependencies',
novelty: coherence > 0.7 && learning_occurred ? 'High' : 'Medium'
});
}
/**
* Discovery 4: Hierarchical Clustering with Hyperbolic Attention
*/
async discoverHierarchicalClustering() {
console.log('\n\n🌳 Experiment 4: Hierarchical Knowledge Organization\n');
// Create hierarchical data
const hierarchy = {
'Animals': {
'Mammals': ['Dog', 'Cat', 'Elephant'],
'Birds': ['Eagle', 'Sparrow', 'Penguin']
},
'Plants': {
'Trees': ['Oak', 'Pine', 'Maple'],
'Flowers': ['Rose', 'Tulip', 'Daisy']
}
};
// Generate vectors with hierarchical structure
const items = [];
for (const [category, subcategories] of Object.entries(hierarchy)) {
const category_vec = this.randomVector();
for (const [subcategory, members] of Object.entries(subcategories)) {
const subcat_vec = this.evolveVector(category_vec, 0.3);
for (const member of members) {
const member_vec = this.evolveVector(subcat_vec, 0.2);
items.push({
vector: member_vec,
category: category,
subcategory: subcategory,
name: member,
level: 'item'
});
await this.memory.storeExperience(member_vec, {
category, subcategory, name: member
});
}
}
}
console.log(` Created hierarchical dataset: ${items.length} items`);
// Test hyperbolic attention for hierarchy detection
const query_item = items[0];
const similar = await this.memory.retrieve(query_item.vector, 5);
console.log(`\n Query: ${query_item.name} (${query_item.subcategory}, ${query_item.category})`);
console.log(' Retrieved similar items:');
let hierarchy_preserved = 0;
for (const result of similar) {
const same_subcat = result.metadata?.subcategory === query_item.subcategory;
const same_cat = result.metadata?.category === query_item.category;
console.log(` - ${result.metadata?.name || result.id}`);
console.log(` Same subcategory: ${same_subcat ? '✓' : '✗'}, Same category: ${same_cat ? '✓' : '✗'}`);
if (same_subcat) hierarchy_preserved += 2;
else if (same_cat) hierarchy_preserved += 1;
}
const hierarchy_score = hierarchy_preserved / (similar.length * 2);
console.log(`\n Hierarchy preservation: ${(hierarchy_score * 100).toFixed(1)}%`);
console.log(` Quality: ${hierarchy_score > 0.7 ? '✅ Excellent' : hierarchy_score > 0.5 ? '✓ Good' : '~ Fair'}`);
this.recordDiscovery('Hierarchical Clustering', {
description: 'Vector space naturally organizes hierarchical relationships',
hierarchy_score: hierarchy_score,
insight: 'Hyperbolic geometry could enhance hierarchy representation',
novelty: 'High'
});
}
/**
* Discovery 5: Meta-Learning (Learning to Learn)
*/
async discoverMetaLearning() {
console.log('\n\n🎓 Experiment 5: Meta-Learning Discovery\n');
// Train SNN on different tasks and measure adaptation speed
const tasks = [
{ name: 'Pattern A', generator: () => this.generatePattern('alternating') },
{ name: 'Pattern B', generator: () => this.generatePattern('clustered') },
{ name: 'Pattern C', generator: () => this.generatePattern('random') }
];
const adaptation_speeds = [];
for (const task of tasks) {
console.log(`\n Learning ${task.name}...`);
this.memory.snn.reset();
let performance_history = [];
// Train for 50 steps
for (let step = 0; step < 50; step++) {
const pattern = task.generator();
const input = rateEncoding(pattern, this.memory.snn.dt, 100);
this.memory.snn.step(input);
// Measure performance every 10 steps
if (step % 10 === 0) {
const output = this.memory.snn.getOutput();
const activity = Array.from(output).reduce((a, b) => a + b, 0);
performance_history.push(activity);
}
}
// Calculate adaptation speed (how quickly performance improves)
const adaptation = this.measureAdaptationSpeed(performance_history);
adaptation_speeds.push(adaptation);
console.log(` Adaptation speed: ${adaptation.toFixed(3)}`);
}
// Check if network learns faster on later tasks (meta-learning)
const early_avg = adaptation_speeds.slice(0, 1)[0];
const later_avg = adaptation_speeds.slice(-1)[0];
const meta_learning_gain = later_avg - early_avg;
console.log(`\n First task adaptation: ${early_avg.toFixed(3)}`);
console.log(` Last task adaptation: ${later_avg.toFixed(3)}`);
console.log(` Meta-learning gain: ${meta_learning_gain > 0 ? '+' : ''}${meta_learning_gain.toFixed(3)}`);
console.log(` Result: ${meta_learning_gain > 0.1 ? '✅ Learning to learn!' : meta_learning_gain > 0 ? '✓ Some improvement' : '~ No meta-learning'}`);
this.recordDiscovery('Meta-Learning', {
description: 'SNN shows improved adaptation speed across sequential tasks',
meta_learning_gain: meta_learning_gain,
insight: 'STDP enables learning how to learn through synaptic priming',
novelty: meta_learning_gain > 0.1 ? 'Very High' : 'Medium'
});
}
/**
* Discovery 6: Emergent Abstraction
*/
async discoverEmergentAbstraction() {
console.log('\n\n💡 Experiment 6: Emergent Abstraction\n');
// Store many specific examples
const examples = [];
for (let i = 0; i < 20; i++) {
const specific = this.randomVector();
examples.push(specific);
await this.memory.storeExperience(specific, {
type: 'specific',
id: i
});
}
console.log(` Stored ${examples.length} specific examples`);
// Process all examples to find emergent abstract representation
console.log(' Searching for emergent abstraction...');
// Compute centroid (abstract representation)
const abstraction = this.computeCentroid(examples);
// Store abstraction
await this.memory.storeExperience(abstraction, {
type: 'abstraction',
derived_from: examples.length
});
// Measure how well abstraction represents all examples
let total_distance = 0;
for (const example of examples) {
const dist = distanceSIMD(abstraction, example);
total_distance += dist;
}
const avg_distance = total_distance / examples.length;
const abstraction_quality = Math.max(0, 1 - avg_distance);
console.log(` Abstraction quality: ${(abstraction_quality * 100).toFixed(1)}%`);
console.log(` Average distance to examples: ${avg_distance.toFixed(4)}`);
console.log(` Result: ${abstraction_quality > 0.7 ? '✅ Strong abstraction' : abstraction_quality > 0.5 ? '✓ Moderate' : '~ Weak'}`);
// Test: Can we recognize new examples as instances of this abstraction?
const new_example = this.evolveVector(examples[0], 0.15);
const dist_to_abstraction = distanceSIMD(abstraction, new_example);
const dist_to_random = distanceSIMD(this.randomVector(), new_example);
const recognition_score = 1 - (dist_to_abstraction / dist_to_random);
console.log(`\n New example recognition:`);
console.log(` Distance to abstraction: ${dist_to_abstraction.toFixed(4)}`);
console.log(` Distance to random: ${dist_to_random.toFixed(4)}`);
console.log(` Recognition: ${recognition_score > 0.5 ? '✅ Recognized' : '✗ Not recognized'}`);
this.recordDiscovery('Emergent Abstraction', {
description: 'System autonomously forms abstract representations from specific examples',
abstraction_quality: abstraction_quality,
recognition_score: recognition_score,
insight: 'Centroids in vector space naturally encode category abstractions',
novelty: recognition_score > 0.5 ? 'High' : 'Medium'
});
}
// ============================================================================
// Helper Methods
// ============================================================================
generateTestVectors(n) {
const vectors = [];
for (let i = 0; i < n; i++) {
vectors.push(this.randomVector());
}
return vectors;
}
randomVector() {
const vec = new Float32Array(128);
for (let i = 0; i < vec.length; i++) {
vec[i] = Math.random();
}
return vec;
}
evolveVector(base, noise_level) {
const evolved = new Float32Array(base.length);
for (let i = 0; i < base.length; i++) {
evolved[i] = base[i] + (Math.random() - 0.5) * noise_level;
evolved[i] = Math.max(0, Math.min(1, evolved[i]));
}
return evolved;
}
generatePattern(type) {
const pattern = new Float32Array(128);
if (type === 'alternating') {
for (let i = 0; i < pattern.length; i++) {
pattern[i] = i % 2 === 0 ? 1.0 : 0.0;
}
} else if (type === 'clustered') {
const cluster_size = 16;
const cluster_start = Math.floor(Math.random() * (pattern.length - cluster_size));
for (let i = cluster_start; i < cluster_start + cluster_size; i++) {
pattern[i] = 1.0;
}
} else {
for (let i = 0; i < pattern.length; i++) {
pattern[i] = Math.random();
}
}
return pattern;
}
computeCentroid(vectors) {
const centroid = new Float32Array(vectors[0].length);
for (const vec of vectors) {
for (let i = 0; i < centroid.length; i++) {
centroid[i] += vec[i];
}
}
for (let i = 0; i < centroid.length; i++) {
centroid[i] /= vectors.length;
}
return centroid;
}
analyzeSpikePatternDiversity(patterns) {
// Measure average pairwise distance
let total_distance = 0;
let count = 0;
for (let i = 0; i < patterns.length; i++) {
for (let j = i + 1; j < patterns.length; j++) {
total_distance += distanceSIMD(patterns[i], patterns[j]);
count++;
}
}
return count > 0 ? total_distance / count : 0;
}
measureRankingChange(list1, list2) {
const ids1 = list1.map(m => m.id);
const ids2 = list2.map(m => m.id);
let position_changes = 0;
for (let i = 0; i < ids1.length; i++) {
const old_pos = i;
const new_pos = ids2.indexOf(ids1[i]);
if (new_pos !== -1) {
position_changes += Math.abs(new_pos - old_pos);
}
}
const max_change = ids1.length * (ids1.length - 1) / 2;
return (position_changes / max_change) * 100;
}
measureTemporalCoherence(outputs) {
if (outputs.length < 2) return 0;
let coherence = 0;
for (let i = 0; i < outputs.length - 1; i++) {
const sim = cosineSimilaritySIMD(
new Float32Array(outputs[i]),
new Float32Array(outputs[i + 1])
);
coherence += sim;
}
return coherence / (outputs.length - 1);
}
measureAdaptationSpeed(performance) {
if (performance.length < 2) return 0;
// Calculate slope (rate of improvement)
const first = performance[0];
const last = performance[performance.length - 1];
return (last - first) / performance.length;
}
recordDiscovery(name, details) {
this.discoveries.push({
name,
...details,
timestamp: Date.now(),
experiment_number: ++this.experiments_run
});
console.log(`\n ✨ Discovery recorded: "${name}"`);
console.log(` Novelty: ${details.novelty}`);
}
reportDiscoveries() {
console.log('\n\n📋 DISCOVERY REPORT\n');
console.log('='.repeat(70));
console.log(`\nTotal experiments: ${this.experiments_run}`);
console.log(`Total discoveries: ${this.discoveries.length}\n`);
// Sort by novelty
const noveltyOrder = { 'Very High': 4, 'High': 3, 'Medium': 2, 'Low': 1 };
const sorted = [...this.discoveries].sort((a, b) =>
(noveltyOrder[b.novelty] || 0) - (noveltyOrder[a.novelty] || 0)
);
for (let i = 0; i < sorted.length; i++) {
const d = sorted[i];
console.log(`${i + 1}. ${d.name}`);
console.log(` ${d.description}`);
console.log(` 💡 Insight: ${d.insight}`);
console.log(` ⭐ Novelty: ${d.novelty}`);
console.log('');
}
// Memory stats
const stats = this.memory.getStats();
console.log('\n📊 Final System State:\n');
console.log(` Total memories stored: ${stats.total_memories}`);
console.log(` Active memories: ${stats.active_memories}`);
console.log(` SNN layers: ${stats.snn_layers}`);
// Highlight most novel discovery
const most_novel = sorted[0];
console.log('\n\n🏆 MOST NOVEL DISCOVERY:\n');
console.log(` "${most_novel.name}"`);
console.log(` ${most_novel.description}`);
console.log(`\n ${most_novel.insight}`);
console.log('\n\n✨ Exploration complete! The system has autonomously discovered');
console.log(' emergent capabilities through hybrid neuromorphic architecture.\n');
}
}
// ============================================================================
// Main Execution
// ============================================================================
async function main() {
const explorer = new CapabilityExplorer();
try {
await explorer.explore();
} catch (error) {
console.error('\n❌ Exploration error:', error.message);
console.error(error.stack);
}
console.log('\n' + '='.repeat(70));
console.log('🔬 Cognitive Explorer session ended\n');
}
main().catch(console.error);