feat: complete vendor repos, add edge intelligence and WASM modules

- Add 154 missing vendor files (gitignore was filtering them)
  - vendor/midstream: 564 files (was 561)
  - vendor/sublinear-time-solver: 1190 files (was 1039)
- Add ESP32 edge processing (ADR-039): presence, vitals, fall detection
- Add WASM programmable sensing (ADR-040/041) with wasm3 runtime
- Add firmware CI workflow (.github/workflows/firmware-ci.yml)
- Add wifi-densepose-wasm-edge crate for edge WASM modules
- Update sensing server, provision.py, UI components

Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
ruv
2026-03-02 23:53:25 -05:00
parent 407b46b206
commit 4b1005524e
196 changed files with 52578 additions and 995 deletions
View File
+94
View File
@@ -0,0 +1,94 @@
[workspace]
members = [
"crates/temporal-compare",
"crates/nanosecond-scheduler",
"crates/temporal-attractor-studio",
"crates/temporal-neural-solver",
"crates/strange-loop",
"crates/quic-multistream",
]
[package]
name = "midstream"
version = "0.1.0"
edition = "2021"
description = "Real-time LLM streaming with inflight analysis"
[dependencies]
hyprstream = { path = "hyprstream-main" }
tokio = { version = "1.42.0", features = ["full"] }
arrow = "54.0.0"
arrow-flight = { version = "54.0.0", features = ["flight-sql-experimental"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
async-trait = "0.1"
futures = "0.3.31"
tracing = "0.1"
config = { version = "0.13", features = ["toml"] }
chrono = "0.4"
reqwest = { version = "0.11", features = ["json", "stream"] }
eventsource-stream = "0.2"
tokio-stream = "0.1"
dotenv = "0.15"
async-stream = "0.3"
# Lean Agentic dependencies
thiserror = "2.0"
dashmap = "6.1"
lru = "0.12"
# Phase 1: Temporal and Scheduling integrations (workspace crates)
temporal-compare = { path = "crates/temporal-compare" }
nanosecond-scheduler = { path = "crates/nanosecond-scheduler" }
# Phase 2: Dynamical systems and temporal logic (workspace crates)
temporal-attractor-studio = { path = "crates/temporal-attractor-studio" }
temporal-neural-solver = { path = "crates/temporal-neural-solver" }
# Phase 3: Meta-learning and self-reference (workspace crates)
strange-loop = { path = "crates/strange-loop" }
# Additional dependencies for advanced integrations
nalgebra = "0.33" # For linear algebra in attractor analysis
ndarray = "0.16" # For multi-dimensional arrays
[dev-dependencies]
mockall = "0.11"
tokio = "1.42.0"
tokio-test = "0.4"
criterion = { version = "0.5", features = ["async_tokio", "html_reports"] }
[[bench]]
name = "lean_agentic_bench"
harness = false
[[bench]]
name = "temporal_bench"
harness = false
[[bench]]
name = "scheduler_bench"
harness = false
[[bench]]
name = "attractor_bench"
harness = false
[[bench]]
name = "solver_bench"
harness = false
[[bench]]
name = "meta_bench"
harness = false
[[bench]]
name = "quic_bench"
harness = false
[[example]]
name = "openrouter"
path = "examples/openrouter.rs"
[[example]]
name = "lean_agentic_streaming"
path = "examples/lean_agentic_streaming.rs"
+599
View File
@@ -0,0 +1,599 @@
//! Comprehensive benchmarks for strange-loop crate
//!
//! Benchmarks cover:
//! - Pattern extraction performance
//! - Recursive optimization depth
//! - Meta-learning iteration speed
//! - Self-modification safety checks
//! - Rollback mechanism performance
//! - Validation overhead
//!
//! Performance targets:
//! - Pattern extraction: <10ms for 1000 patterns
//! - Recursive depth: >10 levels without stack overflow
//! - Iteration speed: >1000 iterations/second
//! - Safety overhead: <5% performance impact
use criterion::{black_box, criterion_group, criterion_main, Criterion, BenchmarkId, Throughput};
use strange_loop::{
StrangeLoop, StrangeLoopConfig, MetaLevel, MetaKnowledge,
SafetyConstraint, ModificationRule,
};
// ============================================================================
// Test Data Generators
// ============================================================================
fn generate_pattern_data(size: usize, complexity: &str) -> Vec<String> {
match complexity {
"simple" => {
// Highly repetitive patterns
(0..size)
.map(|i| format!("pattern{}", i % 10))
.collect()
}
"medium" => {
// Moderate repetition with variations
(0..size)
.map(|i| {
let base = i % 50;
let variant = i % 3;
format!("pattern_{}_{}", base, variant)
})
.collect()
}
"complex" => {
// High diversity with some patterns
(0..size)
.map(|i| {
let hash = (i * 7919) % 200;
let subpattern = (i * 31) % 5;
format!("complex_{}_{}", hash, subpattern)
})
.collect()
}
"random" => {
// Mostly unique patterns
(0..size)
.map(|i| {
let hash1 = (i * 7919) % 10000;
let hash2 = (i * 31337) % 10000;
format!("random_{}_{}", hash1, hash2)
})
.collect()
}
_ => vec!["default".to_string(); size],
}
}
fn generate_hierarchical_data(depth: usize) -> Vec<Vec<String>> {
let mut levels = Vec::new();
let mut current_data = generate_pattern_data(100, "simple");
for level in 0..depth {
levels.push(current_data.clone());
// Generate meta-patterns from current level
current_data = current_data
.windows(2)
.map(|w| format!("meta_{}_{}", level, w.join("_")))
.collect();
}
levels
}
fn generate_large_pattern_set(count: usize) -> Vec<String> {
(0..count)
.map(|i| {
let pattern_type = i % 7;
match pattern_type {
0 => format!("linear_{}", i),
1 => format!("cyclic_{}", i % 100),
2 => format!("branching_{}_{}", i / 10, i % 10),
3 => format!("converging_{}", i / 20),
4 => format!("diverging_{}", i),
5 => format!("stable_{}", i % 50),
_ => format!("chaotic_{}", (i * 7919) % 1000),
}
})
.collect()
}
// ============================================================================
// Meta-Learning Benchmarks
// ============================================================================
fn bench_meta_learning_iteration(c: &mut Criterion) {
let mut group = c.benchmark_group("meta_learning_iteration");
// Simple learning
group.bench_function("simple", |b| {
let mut learner = MetaLearner::new();
let experiences = create_experience_batch(10, false);
b.iter(|| {
for exp in &experiences {
black_box(learner.learn(black_box(exp)));
}
});
});
// Complex learning
group.bench_function("complex", |b| {
let mut learner = MetaLearner::new();
let experiences = create_experience_batch(10, true);
b.iter(|| {
for exp in &experiences {
black_box(learner.learn(black_box(exp)));
}
});
});
// Varying batch sizes
for batch_size in [5, 10, 25, 50, 100].iter() {
group.throughput(Throughput::Elements(*batch_size as u64));
group.bench_with_input(
BenchmarkId::new("batch", batch_size),
batch_size,
|b, &size| {
let experiences = create_experience_batch(size, false);
b.iter(|| {
let mut learner = MetaLearner::new();
for exp in &experiences {
black_box(learner.learn(exp));
}
});
}
);
}
group.finish();
}
fn bench_incremental_learning(c: &mut Criterion) {
let mut group = c.benchmark_group("incremental_learning");
// Progressive learning
group.bench_function("progressive", |b| {
let mut learner = MetaLearner::new();
let mut exp_id = 0;
b.iter(|| {
exp_id += 1;
let exp = create_simple_experience(exp_id);
black_box(learner.learn(black_box(&exp)))
});
});
// With forgetting mechanism
group.bench_function("with_forgetting", |b| {
let mut learner = MetaLearner::with_capacity(100);
let mut exp_id = 0;
b.iter(|| {
exp_id += 1;
let exp = create_simple_experience(exp_id);
black_box(learner.learn_with_forgetting(black_box(&exp)))
});
});
group.finish();
}
// ============================================================================
// Pattern Extraction Benchmarks
// ============================================================================
fn bench_pattern_extraction(c: &mut Criterion) {
let mut group = c.benchmark_group("pattern_extraction");
// Simple patterns
for num_experiences in [10, 50, 100, 500].iter() {
group.bench_with_input(
BenchmarkId::new("simple", num_experiences),
num_experiences,
|b, &n| {
let experiences = create_experience_batch(n, false);
b.iter(|| {
black_box(extract_patterns(black_box(&experiences)))
});
}
);
}
// Complex patterns
for num_experiences in [10, 50, 100, 500].iter() {
group.bench_with_input(
BenchmarkId::new("complex", num_experiences),
num_experiences,
|b, &n| {
let experiences = create_experience_batch(n, true);
b.iter(|| {
black_box(extract_patterns(black_box(&experiences)))
});
}
);
}
group.finish();
}
fn bench_pattern_matching(c: &mut Criterion) {
let mut group = c.benchmark_group("pattern_matching");
let patterns = (0..100).map(|i| create_pattern(i, 0)).collect::<Vec<_>>();
// Single experience matching
group.bench_function("single_match", |b| {
let exp = create_simple_experience(42);
b.iter(|| {
black_box(patterns.iter()
.filter(|p| p.matches(black_box(&exp)))
.count())
});
});
// Batch matching
group.bench_function("batch_match", |b| {
let experiences = create_experience_batch(50, false);
b.iter(|| {
for exp in &experiences {
black_box(patterns.iter()
.filter(|p| p.matches(exp))
.count());
}
});
});
group.finish();
}
// ============================================================================
// Multi-Level Learning Benchmarks
// ============================================================================
fn bench_multi_level_learning(c: &mut Criterion) {
let mut group = c.benchmark_group("multi_level_learning");
// 2-level hierarchy
group.bench_function("two_levels", |b| {
let mut learner = MetaLearner::with_levels(2);
let experiences = create_experience_batch(50, false);
b.iter(|| {
for exp in &experiences {
black_box(learner.learn_hierarchical(black_box(exp)));
}
});
});
// 3-level hierarchy
group.bench_function("three_levels", |b| {
let mut learner = MetaLearner::with_levels(3);
let experiences = create_experience_batch(50, false);
b.iter(|| {
for exp in &experiences {
black_box(learner.learn_hierarchical(black_box(exp)));
}
});
});
// Varying levels
for num_levels in [2, 3, 4, 5].iter() {
group.bench_with_input(
BenchmarkId::new("levels", num_levels),
num_levels,
|b, &levels| {
let mut learner = MetaLearner::with_levels(levels);
let experiences = create_experience_batch(50, false);
b.iter(|| {
for exp in &experiences {
black_box(learner.learn_hierarchical(exp));
}
});
}
);
}
group.finish();
}
fn bench_level_transition(c: &mut Criterion) {
let mut group = c.benchmark_group("level_transition");
let hierarchy = create_pattern_hierarchy(3, 10);
// Bottom-up propagation
group.bench_function("bottom_up", |b| {
b.iter(|| {
black_box(propagate_bottom_up(black_box(&hierarchy)))
});
});
// Top-down influence
group.bench_function("top_down", |b| {
b.iter(|| {
black_box(propagate_top_down(black_box(&hierarchy)))
});
});
group.finish();
}
// ============================================================================
// Cross-Crate Integration Benchmarks
// ============================================================================
fn bench_cross_crate_integration(c: &mut Criterion) {
let mut group = c.benchmark_group("cross_crate_integration");
// Integration with temporal-compare
group.bench_function("temporal_compare", |b| {
use temporal_compare::{dtw_distance, TemporalData};
let experiences = create_experience_batch(100, false);
b.iter(|| {
// Extract temporal sequences from experiences
let seq1: Vec<f64> = experiences.iter()
.map(|e| e.reward)
.collect();
let seq2: Vec<f64> = experiences.iter()
.skip(10)
.map(|e| e.reward)
.collect();
black_box(dtw_distance(&seq1, &seq2))
});
});
// Integration with scheduler
group.bench_function("scheduler", |b| {
use nanosecond_scheduler::{NanoScheduler, Task, TaskPriority};
let mut scheduler = NanoScheduler::new(4);
let experiences = create_experience_batch(50, false);
b.iter(|| {
for (i, exp) in experiences.iter().enumerate() {
let priority = if exp.reward > 0.7 {
TaskPriority::High
} else {
TaskPriority::Normal
};
let task = Task::new(
format!("task_{}", i),
Box::new(move || { black_box(exp); }),
priority,
);
scheduler.schedule(task);
}
while scheduler.has_pending_tasks() {
scheduler.run_once();
}
});
});
// Integration with attractor studio
group.bench_function("attractor_studio", |b| {
use temporal_attractor_studio::{reconstruct_phase_space};
let experiences = create_experience_batch(1000, false);
let rewards: Vec<f64> = experiences.iter().map(|e| e.reward).collect();
b.iter(|| {
black_box(reconstruct_phase_space(
black_box(&rewards),
black_box(3),
black_box(10)
))
});
});
group.finish();
}
// ============================================================================
// Self-Referential Operations Benchmarks
// ============================================================================
fn bench_self_referential(c: &mut Criterion) {
let mut group = c.benchmark_group("self_referential");
// Self-improvement
group.bench_function("self_improvement", |b| {
let mut learner = MetaLearner::new();
let experiences = create_experience_batch(100, false);
// Initial learning
for exp in &experiences {
learner.learn(exp);
}
b.iter(|| {
black_box(learner.improve_self())
});
});
// Meta-pattern extraction
group.bench_function("meta_patterns", |b| {
let patterns = (0..100).map(|i| create_pattern(i, 0)).collect::<Vec<_>>();
b.iter(|| {
black_box(extract_meta_patterns(black_box(&patterns)))
});
});
// Recursive optimization
group.bench_function("recursive_opt", |b| {
let mut learner = MetaLearner::new();
let experiences = create_experience_batch(50, false);
b.iter(|| {
black_box(learner.optimize_recursive(black_box(&experiences), black_box(3)))
});
});
group.finish();
}
// ============================================================================
// Recursive Optimization Benchmarks
// ============================================================================
fn bench_recursive_optimization(c: &mut Criterion) {
let mut group = c.benchmark_group("recursive_optimization");
let experiences = create_experience_batch(100, true);
// Varying recursion depths
for depth in [1, 2, 3, 4, 5].iter() {
group.bench_with_input(
BenchmarkId::new("depth", depth),
depth,
|b, &d| {
b.iter(|| {
black_box(recursive_optimize(
black_box(&experiences),
black_box(d)
))
});
}
);
}
group.finish();
}
// ============================================================================
// Complete Pipeline Benchmarks
// ============================================================================
fn bench_complete_meta_learning(c: &mut Criterion) {
let mut group = c.benchmark_group("complete_pipeline");
group.bench_function("full_cycle", |b| {
let experiences = create_experience_batch(100, true);
b.iter(|| {
// 1. Learn from experiences
let mut learner = MetaLearner::with_levels(3);
for exp in &experiences {
learner.learn_hierarchical(exp);
}
// 2. Extract patterns
let patterns = extract_patterns(&experiences);
// 3. Integrate knowledge
let knowledge = integrate_knowledge(&patterns);
// 4. Self-improvement
learner.improve_self();
// 5. Recursive optimization
let optimized = recursive_optimize(&experiences, 2);
black_box((patterns, knowledge, optimized))
});
});
group.finish();
}
// ============================================================================
// Helper Functions (mock implementations for benchmarking)
// ============================================================================
fn propagate_bottom_up(hierarchy: &[Vec<Pattern>]) -> Vec<Pattern> {
// Mock implementation
hierarchy.iter()
.flat_map(|level| level.iter())
.cloned()
.collect()
}
fn propagate_top_down(hierarchy: &[Vec<Pattern>]) -> Vec<Pattern> {
// Mock implementation
hierarchy.iter()
.rev()
.flat_map(|level| level.iter())
.cloned()
.collect()
}
fn extract_meta_patterns(patterns: &[Pattern]) -> Vec<Pattern> {
// Mock implementation: create meta-patterns from existing patterns
patterns.iter()
.step_by(5)
.enumerate()
.map(|(i, p)| create_pattern(i, p.level + 1))
.collect()
}
// ============================================================================
// Criterion Configuration
// ============================================================================
criterion_group! {
name = learning_benches;
config = Criterion::default()
.sample_size(100)
.measurement_time(std::time::Duration::from_secs(10))
.warm_up_time(std::time::Duration::from_secs(3));
targets = bench_meta_learning_iteration, bench_incremental_learning
}
criterion_group! {
name = pattern_benches;
config = Criterion::default()
.sample_size(100)
.measurement_time(std::time::Duration::from_secs(8));
targets = bench_pattern_extraction, bench_pattern_matching
}
criterion_group! {
name = hierarchy_benches;
config = Criterion::default()
.sample_size(100);
targets = bench_multi_level_learning, bench_level_transition
}
criterion_group! {
name = integration_benches;
config = Criterion::default()
.sample_size(50)
.measurement_time(std::time::Duration::from_secs(12));
targets = bench_cross_crate_integration
}
criterion_group! {
name = recursive_benches;
config = Criterion::default()
.sample_size(50);
targets = bench_self_referential, bench_recursive_optimization
}
criterion_group! {
name = pipeline_benches;
config = Criterion::default()
.sample_size(30)
.measurement_time(std::time::Duration::from_secs(15));
targets = bench_complete_meta_learning
}
criterion_main!(
learning_benches,
pattern_benches,
hierarchy_benches,
integration_benches,
recursive_benches,
pipeline_benches
);
@@ -0,0 +1,9 @@
# Coordination Commands
Commands for coordination operations in Claude Flow.
## Available Commands
- [swarm-init](./swarm-init.md)
- [agent-spawn](./agent-spawn.md)
- [task-orchestrate](./task-orchestrate.md)
@@ -0,0 +1,25 @@
# agent-spawn
Spawn a new agent in the current swarm.
## Usage
```bash
npx claude-flow agent spawn [options]
```
## Options
- `--type <type>` - Agent type (coder, researcher, analyst, tester, coordinator)
- `--name <name>` - Custom agent name
- `--skills <list>` - Specific skills (comma-separated)
## Examples
```bash
# Spawn coder agent
npx claude-flow agent spawn --type coder
# With custom name
npx claude-flow agent spawn --type researcher --name "API Expert"
# With specific skills
npx claude-flow agent spawn --type coder --skills "python,fastapi,testing"
```
@@ -0,0 +1,44 @@
# Initialize Coordination Framework
## 🎯 Key Principle
**This tool coordinates Claude Code's actions. It does NOT write code or create content.**
## MCP Tool Usage in Claude Code
**Tool:** `mcp__claude-flow__swarm_init`
## Parameters
```json
{"topology": "mesh", "maxAgents": 5, "strategy": "balanced"}
```
## Description
Set up a coordination topology to guide Claude Code's approach to complex tasks
## Details
This tool creates a coordination framework that helps Claude Code:
- Break down complex problems systematically
- Approach tasks from multiple perspectives
- Maintain consistency across large projects
- Work more efficiently through structured coordination
Remember: This does NOT create actual coding agents. It creates a coordination pattern for Claude Code to follow.
## Example Usage
**In Claude Code:**
1. Use the tool: `mcp__claude-flow__swarm_init`
2. With parameters: `{"topology": "mesh", "maxAgents": 5, "strategy": "balanced"}`
3. Claude Code then executes the coordinated plan using its native tools
## Important Reminders
- ✅ This tool provides coordination and structure
- ✅ Claude Code performs all actual implementation
- ❌ The tool does NOT write code
- ❌ The tool does NOT access files directly
- ❌ The tool does NOT execute commands
## See Also
- Main documentation: /claude.md
- Other commands in this category
- Workflow examples in /workflows/
@@ -0,0 +1,43 @@
# Coordinate Task Execution
## 🎯 Key Principle
**This tool coordinates Claude Code's actions. It does NOT write code or create content.**
## MCP Tool Usage in Claude Code
**Tool:** `mcp__claude-flow__task_orchestrate`
## Parameters
```json
{"task": "Implement authentication system", "strategy": "parallel", "priority": "high"}
```
## Description
Break down and coordinate complex tasks for systematic execution by Claude Code
## Details
Orchestration strategies:
- **parallel**: Claude Code works on independent components simultaneously
- **sequential**: Step-by-step execution for dependent tasks
- **adaptive**: Dynamically adjusts based on task complexity
The orchestrator creates a plan that Claude Code follows using its native tools.
## Example Usage
**In Claude Code:**
1. Use the tool: `mcp__claude-flow__task_orchestrate`
2. With parameters: `{"task": "Implement authentication system", "strategy": "parallel", "priority": "high"}`
3. Claude Code then executes the coordinated plan using its native tools
## Important Reminders
- ✅ This tool provides coordination and structure
- ✅ Claude Code performs all actual implementation
- ❌ The tool does NOT write code
- ❌ The tool does NOT access files directly
- ❌ The tool does NOT execute commands
## See Also
- Main documentation: /claude.md
- Other commands in this category
- Workflow examples in /workflows/
@@ -0,0 +1,45 @@
# Create Cognitive Patterns
## 🎯 Key Principle
**This tool coordinates Claude Code's actions. It does NOT write code or create content.**
## MCP Tool Usage in Claude Code
**Tool:** `mcp__claude-flow__agent_spawn`
## Parameters
```json
{"type": "researcher", "name": "Literature Analysis", "capabilities": ["deep-analysis"]}
```
## Description
Define cognitive patterns that represent different approaches Claude Code can take
## Details
Agent types represent thinking patterns, not actual coders:
- **researcher**: Systematic exploration approach
- **coder**: Implementation-focused thinking
- **analyst**: Data-driven decision making
- **architect**: Big-picture system design
- **reviewer**: Quality and consistency checking
These patterns guide how Claude Code approaches different aspects of your task.
## Example Usage
**In Claude Code:**
1. Use the tool: `mcp__claude-flow__agent_spawn`
2. With parameters: `{"type": "researcher", "name": "Literature Analysis", "capabilities": ["deep-analysis"]}`
3. Claude Code then executes the coordinated plan using its native tools
## Important Reminders
- ✅ This tool provides coordination and structure
- ✅ Claude Code performs all actual implementation
- ❌ The tool does NOT write code
- ❌ The tool does NOT access files directly
- ❌ The tool does NOT execute commands
## See Also
- Main documentation: /claude.md
- Other commands in this category
- Workflow examples in /workflows/
@@ -0,0 +1,85 @@
# swarm init
Initialize a Claude Flow swarm with specified topology and configuration.
## Usage
```bash
npx claude-flow swarm init [options]
```
## Options
- `--topology, -t <type>` - Swarm topology: mesh, hierarchical, ring, star (default: hierarchical)
- `--max-agents, -m <number>` - Maximum number of agents (default: 8)
- `--strategy, -s <type>` - Execution strategy: balanced, parallel, sequential (default: parallel)
- `--auto-spawn` - Automatically spawn agents based on task complexity
- `--memory` - Enable cross-session memory persistence
- `--github` - Enable GitHub integration features
## Examples
### Basic initialization
```bash
npx claude-flow swarm init
```
### Mesh topology for research
```bash
npx claude-flow swarm init --topology mesh --max-agents 5 --strategy balanced
```
### Hierarchical for development
```bash
npx claude-flow swarm init --topology hierarchical --max-agents 10 --strategy parallel --auto-spawn
```
### GitHub-focused swarm
```bash
npx claude-flow swarm init --topology star --github --memory
```
## Topologies
### Mesh
- All agents connect to all others
- Best for: Research, exploration, brainstorming
- Communication: High overhead, maximum information sharing
### Hierarchical
- Tree structure with clear command chain
- Best for: Development, structured tasks, large projects
- Communication: Efficient, clear responsibilities
### Ring
- Agents connect in a circle
- Best for: Pipeline processing, sequential workflows
- Communication: Low overhead, ordered processing
### Star
- Central coordinator with satellite agents
- Best for: Simple tasks, centralized control
- Communication: Minimal overhead, clear coordination
## Integration with Claude Code
Once initialized, use MCP tools in Claude Code:
```javascript
mcp__claude-flow__swarm_init { topology: "hierarchical", maxAgents: 8 }
```
## See Also
- `agent spawn` - Create swarm agents
- `task orchestrate` - Coordinate task execution
- `swarm status` - Check swarm state
- `swarm monitor` - Real-time monitoring
@@ -0,0 +1,25 @@
# task-orchestrate
Orchestrate complex tasks across the swarm.
## Usage
```bash
npx claude-flow task orchestrate [options]
```
## Options
- `--task <description>` - Task description
- `--strategy <type>` - Orchestration strategy
- `--priority <level>` - Task priority (low, medium, high, critical)
## Examples
```bash
# Orchestrate development task
npx claude-flow task orchestrate --task "Implement user authentication"
# High priority task
npx claude-flow task orchestrate --task "Fix production bug" --priority critical
# With specific strategy
npx claude-flow task orchestrate --task "Refactor codebase" --strategy parallel
```
@@ -0,0 +1,410 @@
/**
* Strange Loop JavaScript SDK with Real WASM Integration
*
* A framework where thousands of tiny agents collaborate in real-time,
* each operating within nanosecond budgets, forming emergent intelligence
* through temporal consciousness and quantum-classical hybrid computing.
*/
const fs = require('fs');
const path = require('path');
// Load the real WASM module
let wasm = null;
let isInitialized = false;
class StrangeLoop {
/**
* Initialize the Strange Loop WASM module
*/
static async init() {
if (isInitialized) return;
try {
// Actually load the WASM module
const wasmModule = require('../wasm/strange_loop.js');
// Initialize WASM
if (wasmModule.init_wasm) {
wasmModule.init_wasm();
}
wasm = wasmModule;
isInitialized = true;
console.log(`Strange Loop WASM v${wasm.get_version()} initialized`);
} catch (error) {
throw new Error(`Failed to initialize Strange Loop WASM module: ${error.message}`);
}
}
/**
* Create a nano-agent swarm using real WASM
*/
static async createSwarm(config = {}) {
await this.init();
const {
agentCount = 1000,
topology = 'mesh',
tickDurationNs = 25000,
runDurationNs = 1000000000,
busCapacity = 10000,
enableTracing = false
} = config;
// Use real WASM function
const result = wasm.create_nano_swarm(agentCount);
return new NanoSwarm({
agentCount,
topology,
tickDurationNs,
runDurationNs,
busCapacity,
enableTracing,
wasmResult: result
});
}
/**
* Create a quantum container using WASM
*/
static async createQuantumContainer(qubits = 3) {
await this.init();
// Use real WASM function
const result = wasm.quantum_superposition(qubits);
return new QuantumContainer(qubits, result);
}
/**
* Create temporal consciousness engine using WASM
*/
static async createTemporalConsciousness(config = {}) {
await this.init();
const {
maxIterations = 1000,
integrationSteps = 50,
enableQuantum = true,
temporalHorizonNs = 10_000_000
} = config;
return new TemporalConsciousness({
maxIterations,
integrationSteps,
enableQuantum,
temporalHorizonNs,
wasm
});
}
/**
* Run performance benchmark using WASM
*/
static async benchmark(agentCount = 1000, durationMs = 5000) {
await this.init();
// Use real WASM for swarm creation
const swarmResult = wasm.create_nano_swarm(agentCount);
console.log(swarmResult);
// Run ticks simulation
const totalTicks = Math.floor(durationMs * 1000);
const ticksPerSec = wasm.run_swarm_ticks(totalTicks);
return {
agentCount,
durationMs,
totalTicks,
ticksPerSec,
throughput: ticksPerSec,
message: `Executed ${ticksPerSec} ticks/sec with ${agentCount} agents`
};
}
/**
* Alias for benchmark to match MCP expectations
*/
static async runBenchmark(options = {}) {
return this.benchmark(options.agentCount || 1000, options.duration || 5000);
}
/**
* Get system information
*/
static async getSystemInfo() {
await this.init();
return {
version: wasm ? wasm.get_version() : '0.0.0',
wasmSupported: true,
wasmVersion: wasm ? wasm.get_version() : '0.0.0',
simdSupported: false, // WASM SIMD not enabled in current build
simdFeatures: ['i32x4', 'f32x4', 'f64x2'],
memoryMB: 6,
maxAgents: 10000,
quantumSupported: true,
maxQubits: 16,
predictionHorizonMs: 10,
consciousnessSupported: true,
capabilities: {
nanoAgent: true,
quantumClassical: true,
temporalConsciousness: true,
strangeAttractors: true
}
};
}
/**
* Create temporal predictor
*/
static async createTemporalPredictor(config = {}) {
await this.init();
const { historySize = 100, horizonNs = 1000000 } = config;
// Store predictor config for later use
this._predictorConfig = { historySize, horizonNs };
return {
created: true,
historySize,
horizonNs,
message: `Created temporal predictor: ${historySize} history, ${horizonNs}ns horizon`
};
}
/**
* Make temporal prediction
*/
static async temporalPredict(values) {
await this.init();
if (!values || !Array.isArray(values)) {
throw new Error('Values must be an array');
}
// Simple Fourier-based prediction (simplified)
const predicted = values.map(v => v * 1.1 + Math.sin(v) * 0.1);
return {
values: predicted,
horizonNs: this._predictorConfig?.horizonNs || 1000000,
confidence: 0.85
};
}
/**
* Evolve consciousness
*/
static async consciousnessEvolve(config = {}) {
await this.init();
const { maxIterations = 500, enableQuantum = true } = config;
// Use real WASM function
const emergenceLevel = wasm.evolve_consciousness(maxIterations);
// Calculate phi based on iterations
const phi = Math.min(1.0, emergenceLevel * 1.2);
return {
emergenceLevel,
phi,
selfModifications: Math.floor(maxIterations * 0.1),
quantumEntanglement: enableQuantum ? 0.75 : 0,
iterations: maxIterations
};
}
/**
* Quantum superposition
*/
static async quantumSuperposition(config = {}) {
await this.init();
const { qubits = 3 } = config;
// Use real WASM function
const result = wasm.quantum_superposition(qubits);
this._quantumQubits = qubits; // Store for measure
return {
created: true,
qubits,
states: 2 ** qubits,
message: result
};
}
/**
* Measure quantum state
*/
static async quantumMeasure() {
await this.init();
const qubits = this._quantumQubits || 3;
// Use real WASM function
const state = wasm.measure_quantum_state(qubits);
return state;
}
/**
* Run swarm - missing method that MCP expects
*/
static async runSwarm(config = {}) {
await this.init();
const { durationMs = 100 } = config;
const ticks = Math.floor(durationMs * 40); // 40 ticks per ms
const tasksProcessed = wasm.run_swarm_ticks(ticks);
return {
tasksProcessed,
agentsActive: Math.floor(tasksProcessed / ticks),
duration: durationMs,
throughput: `${(tasksProcessed / durationMs).toFixed(0)} ops/ms`
};
}
}
/**
* Nano-agent swarm with real WASM backend
*/
class NanoSwarm {
constructor(config) {
this.config = config;
this.agents = [];
this.isRunning = false;
this.wasmResult = config.wasmResult;
}
/**
* Run the swarm using WASM
*/
async run(durationMs = 5000) {
if (this.isRunning) {
throw new Error('Swarm is already running');
}
this.isRunning = true;
try {
const startTime = Date.now();
const totalTicks = Math.floor(durationMs * 1000);
// Use real WASM to run swarm ticks
const ticksPerSec = wasm.run_swarm_ticks(totalTicks);
const runtimeNs = (Date.now() - startTime) * 1e6;
return {
totalTicks: ticksPerSec,
agentCount: this.config.agentCount,
runtimeNs,
ticksPerSecond: ticksPerSec / (durationMs / 1000),
budgetViolations: Math.floor(ticksPerSec * 0.001), // Estimate
avgCyclesPerTick: Math.floor(ticksPerSec / this.config.agentCount)
};
} finally {
this.isRunning = false;
}
}
}
/**
* Quantum container using real WASM
*/
class QuantumContainer {
constructor(qubits, wasmResult) {
this.qubits = qubits;
this.numStates = 2 ** qubits;
this.wasmResult = wasmResult;
this.isInSuperposition = false;
}
/**
* Create superposition using WASM
*/
createSuperposition() {
// WASM already created superposition during initialization
this.isInSuperposition = true;
return this.wasmResult;
}
/**
* Measure the quantum state (collapse) - uses WASM internally via wasm global
*/
measure() {
if (!this.isInSuperposition) {
return 0;
}
// This would use wasm.measure_quantum_state() but that function
// doesn't exist in our current exports, so we simulate
const collapsed = Math.floor(Math.random() * this.numStates);
this.isInSuperposition = false;
return collapsed;
}
}
/**
* Temporal consciousness using real WASM
*/
class TemporalConsciousness {
constructor(config) {
this.config = config;
this.wasm = config.wasm;
this.iteration = 0;
this.consciousnessIndex = 0.5;
}
/**
* Evolve consciousness using WASM
*/
async evolve(iterations = 100) {
// Use real WASM function
this.consciousnessIndex = this.wasm.evolve_consciousness(iterations);
this.iteration = iterations;
return {
iteration: this.iteration,
consciousnessIndex: this.consciousnessIndex,
temporalPatterns: Math.floor(iterations * 0.05),
quantumInfluence: this.consciousnessIndex * 0.3
};
}
/**
* Alias for evolve to match MCP expectations
*/
async evolveStep() {
return this.evolve(this.config.maxIterations || 100);
}
/**
* Verify consciousness
*/
verify() {
const threshold = 0.7;
return {
isConscious: this.consciousnessIndex > threshold,
confidence: this.consciousnessIndex,
selfRecognition: this.consciousnessIndex > 0.6,
metaCognitive: this.consciousnessIndex > 0.8,
temporalCoherence: this.consciousnessIndex * 0.9,
integration: this.consciousnessIndex * 0.85,
phiValue: this.consciousnessIndex * 2.5,
consciousnessIndex: this.consciousnessIndex
};
}
}
module.exports = StrangeLoop;
@@ -0,0 +1,830 @@
/**
* Strange Loops + Sublinear Solver Integration
*
* Combines nano-agent swarms with temporal computational advantage
* to solve matrix problems before data arrives across geographic distances.
*/
const StrangeLoop = require('./strange-loop');
class SublinearStrangeLoops {
constructor() {
this.swarms = new Map();
this.solvers = new Map();
this.measurements = [];
this.LIGHT_SPEED_KM_PER_MS = 299.792; // km/ms
}
/**
* Create a matrix-solving agent swarm that operates with temporal advantage
*/
async createTemporalSolverSwarm(config = {}) {
const {
agentCount = 1000,
matrixSize = 1000,
distanceKm = 10900, // Tokyo to NYC
topology = 'hierarchical'
} = config;
// Create specialized agent swarm
const swarm = await StrangeLoop.createSwarm({
agentCount,
topology,
tickDurationNs: 100 // Ultra-fast for matrix operations
});
// Calculate temporal advantage
const lightTravelTimeMs = distanceKm / this.LIGHT_SPEED_KM_PER_MS;
const sublinearTimeMs = Math.sqrt(matrixSize) * 0.001; // Sublinear scaling
const temporalAdvantageMs = lightTravelTimeMs - sublinearTimeMs;
const solverId = `solver_${Date.now()}`;
this.solvers.set(solverId, {
swarm,
matrixSize,
distanceKm,
lightTravelTimeMs,
sublinearTimeMs,
temporalAdvantageMs,
agentGroups: this.assignAgentGroups(agentCount, matrixSize)
});
return {
solverId,
temporalAdvantage: {
distanceKm,
lightTravelTimeMs: lightTravelTimeMs.toFixed(3),
sublinearTimeMs: sublinearTimeMs.toFixed(3),
advantageMs: temporalAdvantageMs.toFixed(3),
canSolveBeforeArrival: temporalAdvantageMs > 0
},
agentConfiguration: {
totalAgents: agentCount,
groups: this.solvers.get(solverId).agentGroups
}
};
}
/**
* Solve a matrix problem using temporal advantage
*/
async solveWithTemporalAdvantage(solverId, matrix, vector) {
const solver = this.solvers.get(solverId);
if (!solver) throw new Error(`Solver ${solverId} not found`);
const startTime = process.hrtime.bigint();
// Phase 1: Matrix analysis by reconnaissance agents
const analysisResult = await this.analyzeMatrix(solver, matrix);
// Phase 2: Distributed solving using agent groups
const solution = await this.distributedSolve(solver, matrix, vector, analysisResult);
// Phase 3: Validation by verification agents
const validation = await this.validateSolution(solver, matrix, vector, solution);
const endTime = process.hrtime.bigint();
const computationTimeMs = Number(endTime - startTime) / 1000000;
// Record measurement
const measurement = {
timestamp: Date.now(),
solverId,
matrixSize: matrix.length,
computationTimeMs,
temporalAdvantageUsed: computationTimeMs < solver.lightTravelTimeMs,
phases: {
analysis: analysisResult,
solution: solution.summary,
validation
}
};
this.measurements.push(measurement);
return {
solution: solution.x,
timing: {
computationTimeMs: computationTimeMs.toFixed(3),
lightTravelTimeMs: solver.lightTravelTimeMs.toFixed(3),
temporalAdvantageMs: (solver.lightTravelTimeMs - computationTimeMs).toFixed(3),
solvedBeforeDataArrival: computationTimeMs < solver.lightTravelTimeMs
},
quality: {
residualNorm: validation.residualNorm,
isValid: validation.isValid,
confidence: validation.confidence
},
agentMetrics: {
totalOperations: solution.totalOperations,
operationsPerAgent: Math.floor(solution.totalOperations / solver.swarm.agentCount),
throughput: `${Math.round(solution.totalOperations / computationTimeMs)} ops/ms`
}
};
}
/**
* Validate temporal advantage claims
*/
async validateTemporalAdvantage(config = {}) {
const {
matrixSizes = [100, 500, 1000, 5000, 10000],
distances = [1000, 5000, 10900, 20000], // Various distances in km
iterations = 5
} = config;
const validationResults = [];
for (const size of matrixSizes) {
for (const distance of distances) {
let successCount = 0;
const timings = [];
for (let i = 0; i < iterations; i++) {
// Create test matrix (diagonally dominant for solvability)
const matrix = this.generateDiagonallyDominantMatrix(size);
const vector = Array(size).fill(0).map(() => Math.random());
// Create solver swarm
const { solverId, temporalAdvantage } = await this.createTemporalSolverSwarm({
agentCount: Math.min(size * 2, 10000),
matrixSize: size,
distanceKm: distance
});
// Measure solving time
const startTime = process.hrtime.bigint();
// Simulate sublinear solving
const result = await this.simulateSublinearSolve(matrix, vector, size);
const endTime = process.hrtime.bigint();
const computationTimeMs = Number(endTime - startTime) / 1000000;
timings.push(computationTimeMs);
if (computationTimeMs < temporalAdvantage.lightTravelTimeMs) {
successCount++;
}
}
const avgTimeMs = timings.reduce((a, b) => a + b, 0) / timings.length;
const lightTimeMs = distance / this.LIGHT_SPEED_KM_PER_MS;
validationResults.push({
matrixSize: size,
distanceKm: distance,
iterations,
successRate: successCount / iterations,
avgComputationTimeMs: avgTimeMs.toFixed(3),
lightTravelTimeMs: lightTimeMs.toFixed(3),
temporalAdvantageMs: (lightTimeMs - avgTimeMs).toFixed(3),
validated: successCount > iterations / 2
});
}
}
return {
summary: {
totalTests: validationResults.length,
validated: validationResults.filter(r => r.validated).length,
averageSuccessRate: validationResults.reduce((sum, r) => sum + r.successRate, 0) / validationResults.length
},
results: validationResults,
conclusion: this.generateValidationConclusion(validationResults)
};
}
/**
* Measure system performance with various agent configurations
*/
async measurePerformance(config = {}) {
const {
agentCounts = [100, 500, 1000, 5000],
matrixSizes = [100, 500, 1000],
topologies = ['mesh', 'hierarchical', 'star', 'ring']
} = config;
const measurements = [];
for (const agentCount of agentCounts) {
for (const matrixSize of matrixSizes) {
for (const topology of topologies) {
// Create swarm
const swarm = await StrangeLoop.createSwarm({
agentCount,
topology,
tickDurationNs: 100
});
// Generate test problem
const matrix = this.generateDiagonallyDominantMatrix(matrixSize);
const vector = Array(matrixSize).fill(0).map(() => Math.random());
// Measure solving performance
const startTime = process.hrtime.bigint();
// Run swarm simulation
const swarmResult = await swarm.run(100); // 100ms budget
// Simulate matrix operations distributed across agents
const operations = await this.distributeMatrixOperations(
matrix,
vector,
agentCount,
swarmResult
);
const endTime = process.hrtime.bigint();
const timeMs = Number(endTime - startTime) / 1000000;
measurements.push({
agentCount,
matrixSize,
topology,
timeMs: timeMs.toFixed(3),
throughput: Math.round(operations / timeMs),
efficiency: (operations / (agentCount * timeMs)).toFixed(2),
swarmMetrics: {
totalTicks: swarmResult.totalTicks,
ticksPerSecond: swarmResult.ticksPerSecond || Math.round(swarmResult.totalTicks / (timeMs / 1000))
}
});
}
}
}
// Analyze measurements
const analysis = this.analyzeMeasurements(measurements);
return {
measurements,
analysis,
recommendations: this.generateRecommendations(analysis)
};
}
/**
* Create an integrated solving system
*/
async createIntegratedSystem(config = {}) {
const {
name = 'TemporalSolver',
targetDistance = 10900, // Default to Tokyo-NYC
maxMatrixSize = 10000,
agentBudget = 5000
} = config;
// Calculate optimal configuration
const optimalConfig = this.calculateOptimalConfiguration(
targetDistance,
maxMatrixSize,
agentBudget
);
// Create components
const components = {
// Main solver swarm
mainSolver: await this.createTemporalSolverSwarm({
agentCount: optimalConfig.mainAgents,
matrixSize: maxMatrixSize,
distanceKm: targetDistance,
topology: 'hierarchical'
}),
// Auxiliary verification swarm
verifier: await StrangeLoop.createSwarm({
agentCount: optimalConfig.verifierAgents,
topology: 'star',
tickDurationNs: 50
}),
// Temporal predictor for optimization
predictor: await StrangeLoop.createTemporalPredictor({
horizonNs: targetDistance * 1000000 / this.LIGHT_SPEED_KM_PER_MS,
historySize: 1000
}),
// Quantum enhancement for complex problems
quantum: await StrangeLoop.createQuantumContainer(4)
};
// System interface
const system = {
name,
config: optimalConfig,
components,
// Main solving method
solve: async (matrix, vector) => {
return await this.integratedSolve(
components,
matrix,
vector,
targetDistance
);
},
// Performance monitoring
monitor: async () => {
return await this.monitorSystem(components);
},
// Adaptive optimization
optimize: async () => {
return await this.optimizeSystem(components, this.measurements);
}
};
return system;
}
// Helper Methods
assignAgentGroups(agentCount, matrixSize) {
const groups = {
reconnaissance: Math.floor(agentCount * 0.1),
solvers: Math.floor(agentCount * 0.6),
verifiers: Math.floor(agentCount * 0.2),
coordinators: Math.floor(agentCount * 0.1)
};
// Assign matrix regions to solver agents
const rowsPerAgent = Math.ceil(matrixSize / groups.solvers);
return {
...groups,
rowsPerSolverAgent: rowsPerAgent,
parallelism: Math.min(groups.solvers, matrixSize)
};
}
async analyzeMatrix(solver, matrix) {
// Use reconnaissance agents to analyze matrix properties
const n = matrix.length;
// Check diagonal dominance
let isDiagonallyDominant = true;
let minDiagonalRatio = Infinity;
for (let i = 0; i < n; i++) {
const diag = Math.abs(matrix[i][i]);
const rowSum = matrix[i].reduce((sum, val, j) =>
i !== j ? sum + Math.abs(val) : sum, 0
);
const ratio = diag / rowSum;
minDiagonalRatio = Math.min(minDiagonalRatio, ratio);
if (diag <= rowSum) {
isDiagonallyDominant = false;
}
}
// Estimate condition number (simplified)
const maxDiag = Math.max(...matrix.map((row, i) => Math.abs(row[i])));
const minDiag = Math.min(...matrix.map((row, i) => Math.abs(row[i])));
const conditionEstimate = maxDiag / minDiag;
return {
size: n,
isDiagonallyDominant,
minDiagonalRatio: minDiagonalRatio.toFixed(3),
conditionEstimate: conditionEstimate.toFixed(2),
sparsity: this.calculateSparsity(matrix),
solvabilityScore: isDiagonallyDominant ? 1.0 : 0.5
};
}
async distributedSolve(solver, matrix, vector, analysis) {
const n = matrix.length;
const x = Array(n).fill(0);
const groups = solver.agentGroups;
// Run swarm solving simulation
const swarmResult = await solver.swarm.run(100);
// Distribute matrix rows to solver agents
const rowsPerAgent = groups.rowsPerSolverAgent;
let totalOperations = 0;
// Simplified Jacobi iteration (parallelizable)
const maxIterations = 10;
for (let iter = 0; iter < maxIterations; iter++) {
const xNew = Array(n).fill(0);
// Each solver agent handles its assigned rows
for (let agentId = 0; agentId < groups.solvers; agentId++) {
const startRow = agentId * rowsPerAgent;
const endRow = Math.min(startRow + rowsPerAgent, n);
for (let i = startRow; i < endRow; i++) {
let sum = vector[i];
for (let j = 0; j < n; j++) {
if (i !== j) {
sum -= matrix[i][j] * x[j];
totalOperations += 2; // multiply and subtract
}
}
xNew[i] = sum / matrix[i][i];
totalOperations += 1; // division
}
}
// Update solution
for (let i = 0; i < n; i++) {
x[i] = xNew[i];
}
}
return {
x,
iterations: maxIterations,
totalOperations,
summary: {
method: 'distributed_jacobi',
agentsUsed: groups.solvers,
parallelism: groups.parallelism
}
};
}
async validateSolution(solver, matrix, vector, solution) {
const n = matrix.length;
const x = solution.x;
// Calculate residual: r = b - Ax
const residual = Array(n).fill(0);
let residualNorm = 0;
for (let i = 0; i < n; i++) {
let sum = 0;
for (let j = 0; j < n; j++) {
sum += matrix[i][j] * x[j];
}
residual[i] = vector[i] - sum;
residualNorm += residual[i] * residual[i];
}
residualNorm = Math.sqrt(residualNorm);
// Calculate relative error
const bNorm = Math.sqrt(vector.reduce((sum, val) => sum + val * val, 0));
const relativeError = residualNorm / bNorm;
return {
residualNorm: residualNorm.toFixed(6),
relativeError: relativeError.toFixed(6),
isValid: relativeError < 0.1,
confidence: Math.max(0, 1 - relativeError)
};
}
generateDiagonallyDominantMatrix(size) {
const matrix = [];
for (let i = 0; i < size; i++) {
const row = Array(size).fill(0);
let rowSum = 0;
// Fill off-diagonal elements
for (let j = 0; j < size; j++) {
if (i !== j) {
row[j] = (Math.random() - 0.5) * 0.1;
rowSum += Math.abs(row[j]);
}
}
// Make diagonal dominant
row[i] = rowSum * 2 + Math.random() + 1;
matrix.push(row);
}
return matrix;
}
async simulateSublinearSolve(matrix, vector, size) {
// Simulate sublinear time complexity: O(√n) operations
const sublinearOps = Math.ceil(Math.sqrt(size));
// Sample random entries instead of full solution
const samples = [];
for (let i = 0; i < sublinearOps; i++) {
const idx = Math.floor(Math.random() * size);
// Approximate solution at this entry
samples.push(vector[idx] / matrix[idx][idx]);
}
// Extrapolate full solution from samples
const solution = Array(size).fill(0).map((_, i) => {
if (i < samples.length) return samples[i];
// Use nearest sample
return samples[i % samples.length] * (1 + (Math.random() - 0.5) * 0.1);
});
return { x: solution, samples: sublinearOps };
}
calculateSparsity(matrix) {
const n = matrix.length;
let nonZeros = 0;
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (Math.abs(matrix[i][j]) > 1e-10) {
nonZeros++;
}
}
}
return 1 - (nonZeros / (n * n));
}
async distributeMatrixOperations(matrix, vector, agentCount, swarmResult) {
const n = matrix.length;
const opsPerAgent = Math.ceil(n * n / agentCount);
// Simulate distributed matrix-vector multiplication
const totalOps = n * n + n; // Matrix-vector multiply + vector ops
return totalOps;
}
analyzeMeasurements(measurements) {
// Group by configuration
const byAgentCount = {};
const byMatrixSize = {};
const byTopology = {};
for (const m of measurements) {
// By agent count
if (!byAgentCount[m.agentCount]) byAgentCount[m.agentCount] = [];
byAgentCount[m.agentCount].push(m);
// By matrix size
if (!byMatrixSize[m.matrixSize]) byMatrixSize[m.matrixSize] = [];
byMatrixSize[m.matrixSize].push(m);
// By topology
if (!byTopology[m.topology]) byTopology[m.topology] = [];
byTopology[m.topology].push(m);
}
// Calculate statistics
const stats = {
byAgentCount: {},
byMatrixSize: {},
byTopology: {}
};
// Agent count analysis
for (const [count, ms] of Object.entries(byAgentCount)) {
const times = ms.map(m => parseFloat(m.timeMs));
stats.byAgentCount[count] = {
avgTimeMs: (times.reduce((a, b) => a + b, 0) / times.length).toFixed(3),
minTimeMs: Math.min(...times).toFixed(3),
maxTimeMs: Math.max(...times).toFixed(3)
};
}
// Matrix size analysis
for (const [size, ms] of Object.entries(byMatrixSize)) {
const times = ms.map(m => parseFloat(m.timeMs));
stats.byMatrixSize[size] = {
avgTimeMs: (times.reduce((a, b) => a + b, 0) / times.length).toFixed(3),
scalingFactor: Math.sqrt(parseInt(size)) / times[0] // Sublinear scaling check
};
}
// Topology analysis
for (const [topology, ms] of Object.entries(byTopology)) {
const efficiencies = ms.map(m => parseFloat(m.efficiency));
stats.byTopology[topology] = {
avgEfficiency: (efficiencies.reduce((a, b) => a + b, 0) / efficiencies.length).toFixed(3),
bestForSize: this.findBestSize(ms)
};
}
return stats;
}
findBestSize(measurements) {
let best = { size: 0, time: Infinity };
for (const m of measurements) {
if (parseFloat(m.timeMs) < best.time) {
best = { size: m.matrixSize, time: parseFloat(m.timeMs) };
}
}
return best.size;
}
generateValidationConclusion(results) {
const validated = results.filter(r => r.validated);
const validationRate = validated.length / results.length;
if (validationRate > 0.8) {
return {
status: 'VALIDATED',
confidence: 'HIGH',
message: 'Temporal advantage consistently demonstrated across multiple configurations'
};
} else if (validationRate > 0.5) {
return {
status: 'PARTIALLY_VALIDATED',
confidence: 'MEDIUM',
message: 'Temporal advantage achieved in majority of cases, optimization needed'
};
} else {
return {
status: 'NEEDS_OPTIMIZATION',
confidence: 'LOW',
message: 'Temporal advantage not consistently achieved, further optimization required'
};
}
}
generateRecommendations(analysis) {
const recommendations = [];
// Agent count recommendations
const agentStats = Object.entries(analysis.byAgentCount);
const optimalAgents = agentStats.reduce((best, [count, stats]) =>
parseFloat(stats.avgTimeMs) < parseFloat(best[1].avgTimeMs) ? [count, stats] : best
);
recommendations.push({
category: 'Agent Configuration',
recommendation: `Use ${optimalAgents[0]} agents for optimal performance`,
impact: 'HIGH'
});
// Topology recommendations
const topologyStats = Object.entries(analysis.byTopology);
const optimalTopology = topologyStats.reduce((best, [topology, stats]) =>
parseFloat(stats.avgEfficiency) > parseFloat(best[1].avgEfficiency) ? [topology, stats] : best
);
recommendations.push({
category: 'Topology',
recommendation: `Use ${optimalTopology[0]} topology for best efficiency`,
impact: 'MEDIUM'
});
// Matrix size recommendations
const sizeStats = Object.entries(analysis.byMatrixSize);
for (const [size, stats] of sizeStats) {
if (stats.scalingFactor > 0.5) {
recommendations.push({
category: 'Matrix Size',
recommendation: `Matrix size ${size} shows good sublinear scaling`,
impact: 'HIGH'
});
}
}
return recommendations;
}
calculateOptimalConfiguration(distance, maxMatrixSize, agentBudget) {
// Calculate time constraints
const lightTimeMs = distance / this.LIGHT_SPEED_KM_PER_MS;
const targetComputeTime = lightTimeMs * 0.5; // Aim for 50% of light travel time
// Allocate agents
const mainAgents = Math.floor(agentBudget * 0.7);
const verifierAgents = Math.floor(agentBudget * 0.3);
// Calculate achievable matrix size
const achievableSize = Math.floor(Math.pow(targetComputeTime * 1000, 2));
const targetSize = Math.min(achievableSize, maxMatrixSize);
return {
mainAgents,
verifierAgents,
targetMatrixSize: targetSize,
targetComputeTimeMs: targetComputeTime,
estimatedSpeedup: lightTimeMs / targetComputeTime
};
}
async integratedSolve(components, matrix, vector, distance) {
const startTime = process.hrtime.bigint();
// Phase 1: Quantum-enhanced preprocessing
await components.quantum.createSuperposition();
const quantumHint = await components.quantum.measure();
// Phase 2: Temporal prediction for optimization path
const prediction = await components.predictor.predict([matrix[0][0], vector[0]]);
// Phase 3: Main solving
const mainResult = await this.solveWithTemporalAdvantage(
components.mainSolver.solverId,
matrix,
vector
);
// Phase 4: Verification
const verificationStart = process.hrtime.bigint();
await components.verifier.run(50);
const verificationTime = Number(process.hrtime.bigint() - verificationStart) / 1000000;
const totalTime = Number(process.hrtime.bigint() - startTime) / 1000000;
const lightTime = distance / this.LIGHT_SPEED_KM_PER_MS;
return {
solution: mainResult.solution,
timing: {
totalTimeMs: totalTime.toFixed(3),
lightTravelTimeMs: lightTime.toFixed(3),
temporalAdvantageMs: (lightTime - totalTime).toFixed(3),
solvedBeforeArrival: totalTime < lightTime
},
phases: {
quantum: { hint: quantumHint },
prediction: { optimizationHint: prediction },
solving: mainResult,
verification: { timeMs: verificationTime.toFixed(3) }
}
};
}
async monitorSystem(components) {
const status = {
mainSolver: {
ready: true,
lastResult: this.measurements[this.measurements.length - 1] || null
},
verifier: {
ready: true
},
predictor: {
ready: true,
historySize: 1000
},
quantum: {
ready: true,
qubits: 4,
states: 16
}
};
return {
status,
measurements: {
total: this.measurements.length,
recent: this.measurements.slice(-5)
},
health: 'OPERATIONAL'
};
}
async optimizeSystem(components, measurements) {
if (measurements.length < 10) {
return {
status: 'INSUFFICIENT_DATA',
message: 'Need at least 10 measurements for optimization'
};
}
// Analyze recent performance
const recent = measurements.slice(-10);
const avgComputeTime = recent.reduce((sum, m) => sum + m.computationTimeMs, 0) / recent.length;
// Optimization suggestions
const optimizations = [];
if (avgComputeTime > 10) {
optimizations.push({
type: 'INCREASE_PARALLELISM',
action: 'Increase agent count by 50%'
});
}
const successRate = recent.filter(m => m.temporalAdvantageUsed).length / recent.length;
if (successRate < 0.8) {
optimizations.push({
type: 'IMPROVE_ALGORITHM',
action: 'Switch to more efficient solving method'
});
}
return {
status: 'OPTIMIZED',
currentPerformance: {
avgComputeTimeMs: avgComputeTime.toFixed(3),
temporalSuccessRate: successRate
},
optimizations,
expectedImprovement: '20-30%'
};
}
}
module.exports = SublinearStrangeLoops;
@@ -0,0 +1,506 @@
let imports = {};
imports['__wbindgen_placeholder__'] = module.exports;
let wasm;
const { TextDecoder, TextEncoder } = require(`util`);
let cachedUint8ArrayMemory0 = null;
function getUint8ArrayMemory0() {
if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {
cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);
}
return cachedUint8ArrayMemory0;
}
let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });
cachedTextDecoder.decode();
function decodeText(ptr, len) {
return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));
}
function getStringFromWasm0(ptr, len) {
ptr = ptr >>> 0;
return decodeText(ptr, len);
}
const heap = new Array(128).fill(undefined);
heap.push(undefined, null, true, false);
let heap_next = heap.length;
function addHeapObject(obj) {
if (heap_next === heap.length) heap.push(heap.length + 1);
const idx = heap_next;
heap_next = heap[idx];
heap[idx] = obj;
return idx;
}
function getObject(idx) { return heap[idx]; }
function handleError(f, args) {
try {
return f.apply(this, args);
} catch (e) {
wasm.__wbindgen_export_0(addHeapObject(e));
}
}
function dropObject(idx) {
if (idx < 132) return;
heap[idx] = heap_next;
heap_next = idx;
}
function takeObject(idx) {
const ret = getObject(idx);
dropObject(idx);
return ret;
}
let WASM_VECTOR_LEN = 0;
const cachedTextEncoder = new TextEncoder('utf-8');
const encodeString = (typeof cachedTextEncoder.encodeInto === 'function'
? function (arg, view) {
return cachedTextEncoder.encodeInto(arg, view);
}
: function (arg, view) {
const buf = cachedTextEncoder.encode(arg);
view.set(buf);
return {
read: arg.length,
written: buf.length
};
});
function passStringToWasm0(arg, malloc, realloc) {
if (realloc === undefined) {
const buf = cachedTextEncoder.encode(arg);
const ptr = malloc(buf.length, 1) >>> 0;
getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);
WASM_VECTOR_LEN = buf.length;
return ptr;
}
let len = arg.length;
let ptr = malloc(len, 1) >>> 0;
const mem = getUint8ArrayMemory0();
let offset = 0;
for (; offset < len; offset++) {
const code = arg.charCodeAt(offset);
if (code > 0x7F) break;
mem[ptr + offset] = code;
}
if (offset !== len) {
if (offset !== 0) {
arg = arg.slice(offset);
}
ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;
const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);
const ret = encodeString(arg, view);
offset += ret.written;
ptr = realloc(ptr, len, offset, 1) >>> 0;
}
WASM_VECTOR_LEN = offset;
return ptr;
}
let cachedDataViewMemory0 = null;
function getDataViewMemory0() {
if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {
cachedDataViewMemory0 = new DataView(wasm.memory.buffer);
}
return cachedDataViewMemory0;
}
function isLikeNone(x) {
return x === undefined || x === null;
}
function debugString(val) {
// primitive types
const type = typeof val;
if (type == 'number' || type == 'boolean' || val == null) {
return `${val}`;
}
if (type == 'string') {
return `"${val}"`;
}
if (type == 'symbol') {
const description = val.description;
if (description == null) {
return 'Symbol';
} else {
return `Symbol(${description})`;
}
}
if (type == 'function') {
const name = val.name;
if (typeof name == 'string' && name.length > 0) {
return `Function(${name})`;
} else {
return 'Function';
}
}
// objects
if (Array.isArray(val)) {
const length = val.length;
let debug = '[';
if (length > 0) {
debug += debugString(val[0]);
}
for(let i = 1; i < length; i++) {
debug += ', ' + debugString(val[i]);
}
debug += ']';
return debug;
}
// Test for built-in
const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val));
let className;
if (builtInMatches && builtInMatches.length > 1) {
className = builtInMatches[1];
} else {
// Failed to match the standard '[object ClassName]'
return toString.call(val);
}
if (className == 'Object') {
// we're a user defined class or Object
// JSON.stringify avoids problems with cycles, and is generally much
// easier than looping through ownProperties of `val`.
try {
return 'Object(' + JSON.stringify(val) + ')';
} catch (_) {
return 'Object';
}
}
// errors
if (val instanceof Error) {
return `${val.name}: ${val.message}\n${val.stack}`;
}
// TODO we could test for more things here, like `Set`s and `Map`s.
return className;
}
let cachedFloat32ArrayMemory0 = null;
function getFloat32ArrayMemory0() {
if (cachedFloat32ArrayMemory0 === null || cachedFloat32ArrayMemory0.byteLength === 0) {
cachedFloat32ArrayMemory0 = new Float32Array(wasm.memory.buffer);
}
return cachedFloat32ArrayMemory0;
}
function passArrayF32ToWasm0(arg, malloc) {
const ptr = malloc(arg.length * 4, 4) >>> 0;
getFloat32ArrayMemory0().set(arg, ptr / 4);
WASM_VECTOR_LEN = arg.length;
return ptr;
}
/**
* Benchmark function for performance testing
* @param {number} iterations
* @returns {any}
*/
module.exports.benchmark = function(iterations) {
const ret = wasm.benchmark(iterations);
return takeObject(ret);
};
/**
* Get version
* @returns {string}
*/
module.exports.version = function() {
let deferred1_0;
let deferred1_1;
try {
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
wasm.version(retptr);
var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
deferred1_0 = r0;
deferred1_1 = r1;
return getStringFromWasm0(r0, r1);
} finally {
wasm.__wbindgen_add_to_stack_pointer(16);
wasm.__wbindgen_export_1(deferred1_0, deferred1_1, 1);
}
};
/**
* Initialize module
*/
module.exports.main = function() {
wasm.main();
};
const TemporalNeuralSolverFinalization = (typeof FinalizationRegistry === 'undefined')
? { register: () => {}, unregister: () => {} }
: new FinalizationRegistry(ptr => wasm.__wbg_temporalneuralsolver_free(ptr >>> 0, 1));
class TemporalNeuralSolver {
__destroy_into_raw() {
const ptr = this.__wbg_ptr;
this.__wbg_ptr = 0;
TemporalNeuralSolverFinalization.unregister(this);
return ptr;
}
free() {
const ptr = this.__destroy_into_raw();
wasm.__wbg_temporalneuralsolver_free(ptr, 0);
}
/**
* Create a new solver instance
*/
constructor() {
const ret = wasm.temporalneuralsolver_new();
this.__wbg_ptr = ret >>> 0;
TemporalNeuralSolverFinalization.register(this, this.__wbg_ptr, this);
return this;
}
/**
* Single prediction with sub-microsecond target latency
* @param {Float32Array} input
* @returns {any}
*/
predict(input) {
try {
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
const ptr0 = passArrayF32ToWasm0(input, wasm.__wbindgen_export_2);
const len0 = WASM_VECTOR_LEN;
wasm.temporalneuralsolver_predict(retptr, this.__wbg_ptr, ptr0, len0);
var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
if (r2) {
throw takeObject(r1);
}
return takeObject(r0);
} finally {
wasm.__wbindgen_add_to_stack_pointer(16);
}
}
/**
* Batch prediction for high throughput
* @param {Float32Array} inputs_flat
* @returns {any}
*/
predict_batch(inputs_flat) {
try {
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
const ptr0 = passArrayF32ToWasm0(inputs_flat, wasm.__wbindgen_export_2);
const len0 = WASM_VECTOR_LEN;
wasm.temporalneuralsolver_predict_batch(retptr, this.__wbg_ptr, ptr0, len0);
var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
if (r2) {
throw takeObject(r1);
}
return takeObject(r0);
} finally {
wasm.__wbindgen_add_to_stack_pointer(16);
}
}
/**
* Reset temporal state
*/
reset_state() {
wasm.temporalneuralsolver_reset_state(this.__wbg_ptr);
}
/**
* Get solver metadata
* @returns {any}
*/
info() {
const ret = wasm.temporalneuralsolver_info(this.__wbg_ptr);
return takeObject(ret);
}
}
module.exports.TemporalNeuralSolver = TemporalNeuralSolver;
module.exports.__wbg_Error_1f3748b298f99708 = function(arg0, arg1) {
const ret = Error(getStringFromWasm0(arg0, arg1));
return addHeapObject(ret);
};
module.exports.__wbg_call_2f8d426a20a307fe = function() { return handleError(function (arg0, arg1) {
const ret = getObject(arg0).call(getObject(arg1));
return addHeapObject(ret);
}, arguments) };
module.exports.__wbg_error_7534b8e9a36f1ab4 = function(arg0, arg1) {
let deferred0_0;
let deferred0_1;
try {
deferred0_0 = arg0;
deferred0_1 = arg1;
console.error(getStringFromWasm0(arg0, arg1));
} finally {
wasm.__wbindgen_export_1(deferred0_0, deferred0_1, 1);
}
};
module.exports.__wbg_log_7c87560170e635a7 = function(arg0, arg1) {
console.log(getStringFromWasm0(arg0, arg1));
};
module.exports.__wbg_new_1930cbb8d9ffc31b = function() {
const ret = new Object();
return addHeapObject(ret);
};
module.exports.__wbg_new_56407f99198feff7 = function() {
const ret = new Map();
return addHeapObject(ret);
};
module.exports.__wbg_new_8a6f238a6ece86ea = function() {
const ret = new Error();
return addHeapObject(ret);
};
module.exports.__wbg_new_e969dc3f68d25093 = function() {
const ret = new Array();
return addHeapObject(ret);
};
module.exports.__wbg_newnoargs_a81330f6e05d8aca = function(arg0, arg1) {
const ret = new Function(getStringFromWasm0(arg0, arg1));
return addHeapObject(ret);
};
module.exports.__wbg_now_2c95c9de01293173 = function(arg0) {
const ret = getObject(arg0).now();
return ret;
};
module.exports.__wbg_performance_7a3ffd0b17f663ad = function(arg0) {
const ret = getObject(arg0).performance;
return addHeapObject(ret);
};
module.exports.__wbg_set_31197016f65a6a19 = function(arg0, arg1, arg2) {
const ret = getObject(arg0).set(getObject(arg1), getObject(arg2));
return addHeapObject(ret);
};
module.exports.__wbg_set_3f1d0b984ed272ed = function(arg0, arg1, arg2) {
getObject(arg0)[takeObject(arg1)] = takeObject(arg2);
};
module.exports.__wbg_set_d636a0463acf1dbc = function(arg0, arg1, arg2) {
getObject(arg0)[arg1 >>> 0] = takeObject(arg2);
};
module.exports.__wbg_stack_0ed75d68575b0f3c = function(arg0, arg1) {
const ret = getObject(arg1).stack;
const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export_2, wasm.__wbindgen_export_3);
const len1 = WASM_VECTOR_LEN;
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
};
module.exports.__wbg_static_accessor_GLOBAL_1f13249cc3acc96d = function() {
const ret = typeof global === 'undefined' ? null : global;
return isLikeNone(ret) ? 0 : addHeapObject(ret);
};
module.exports.__wbg_static_accessor_GLOBAL_THIS_df7ae94b1e0ed6a3 = function() {
const ret = typeof globalThis === 'undefined' ? null : globalThis;
return isLikeNone(ret) ? 0 : addHeapObject(ret);
};
module.exports.__wbg_static_accessor_SELF_6265471db3b3c228 = function() {
const ret = typeof self === 'undefined' ? null : self;
return isLikeNone(ret) ? 0 : addHeapObject(ret);
};
module.exports.__wbg_static_accessor_WINDOW_16fb482f8ec52863 = function() {
const ret = typeof window === 'undefined' ? null : window;
return isLikeNone(ret) ? 0 : addHeapObject(ret);
};
module.exports.__wbg_wbindgendebugstring_bb652b1bc2061b6d = function(arg0, arg1) {
const ret = debugString(getObject(arg1));
const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export_2, wasm.__wbindgen_export_3);
const len1 = WASM_VECTOR_LEN;
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
};
module.exports.__wbg_wbindgenisstring_4b74e4111ba029e6 = function(arg0) {
const ret = typeof(getObject(arg0)) === 'string';
return ret;
};
module.exports.__wbg_wbindgenisundefined_71f08a6ade4354e7 = function(arg0) {
const ret = getObject(arg0) === undefined;
return ret;
};
module.exports.__wbg_wbindgenthrow_4c11a24fca429ccf = function(arg0, arg1) {
throw new Error(getStringFromWasm0(arg0, arg1));
};
module.exports.__wbindgen_cast_2241b6af4c4b2941 = function(arg0, arg1) {
// Cast intrinsic for `Ref(String) -> Externref`.
const ret = getStringFromWasm0(arg0, arg1);
return addHeapObject(ret);
};
module.exports.__wbindgen_cast_4625c577ab2ec9ee = function(arg0) {
// Cast intrinsic for `U64 -> Externref`.
const ret = BigInt.asUintN(64, arg0);
return addHeapObject(ret);
};
module.exports.__wbindgen_cast_9ae0607507abb057 = function(arg0) {
// Cast intrinsic for `I64 -> Externref`.
const ret = arg0;
return addHeapObject(ret);
};
module.exports.__wbindgen_cast_d6cd19b81560fd6e = function(arg0) {
// Cast intrinsic for `F64 -> Externref`.
const ret = arg0;
return addHeapObject(ret);
};
module.exports.__wbindgen_object_clone_ref = function(arg0) {
const ret = getObject(arg0);
return addHeapObject(ret);
};
module.exports.__wbindgen_object_drop_ref = function(arg0) {
takeObject(arg0);
};
const path = require('path').join(__dirname, 'temporal_neural_solver_wasm_bg.wasm');
const bytes = require('fs').readFileSync(path);
const wasmModule = new WebAssembly.Module(bytes);
const wasmInstance = new WebAssembly.Instance(wasmModule, imports);
wasm = wasmInstance.exports;
module.exports.__wasm = wasm;
wasm.__wbindgen_start();
@@ -0,0 +1,50 @@
/**
* Comprehensive Performance Benchmark
*
* This benchmark demonstrates the 5-10x performance improvements achieved by
* the optimized solver implementations compared to naive implementations.
*/
/**
* Benchmark result interface
*/
interface BenchmarkResult {
name: string;
matrixSize: number;
nnz: number;
optimizedTime: number;
naiveTime: number;
speedup: number;
optimizedIterations: number;
naiveIterations: number;
optimizedResidual: number;
naiveResidual: number;
performanceStats?: {
gflops: number;
bandwidth: number;
matVecCount: number;
totalFlops: number;
};
}
/**
* Main benchmark runner
*/
export declare class PerformanceBenchmark {
private vectorPool;
/**
* Run a single benchmark comparing optimized vs naive implementation
*/
private runSingleBenchmark;
/**
* Run comprehensive benchmark suite
*/
runBenchmarkSuite(): Promise<BenchmarkResult[]>;
/**
* Generate benchmark report
*/
generateReport(results: BenchmarkResult[]): string;
/**
* Clean up resources
*/
dispose(): void;
}
export {};
@@ -0,0 +1,373 @@
/**
* Comprehensive Performance Benchmark
*
* This benchmark demonstrates the 5-10x performance improvements achieved by
* the optimized solver implementations compared to naive implementations.
*/
import { OptimizedSparseMatrix, VectorPool, createHighPerformanceSolver, } from '../core/high-performance-solver.js';
/**
* Naive sparse matrix implementation for comparison
*/
class NaiveSparseMatrix {
triplets;
rows;
cols;
constructor(triplets, rows, cols) {
this.triplets = triplets;
this.rows = rows;
this.cols = cols;
}
multiplyVector(x, y) {
y.fill(0);
for (const [row, col, val] of this.triplets) {
y[row] += val * x[col];
}
}
get dimensions() {
return [this.rows, this.cols];
}
}
/**
* Naive vector operations for comparison
*/
class NaiveVectorOps {
static dotProduct(x, y) {
let result = 0;
for (let i = 0; i < x.length; i++) {
result += x[i] * y[i];
}
return result;
}
static axpy(alpha, x, y) {
for (let i = 0; i < x.length; i++) {
y[i] += alpha * x[i];
}
}
static norm(x) {
return Math.sqrt(NaiveVectorOps.dotProduct(x, x));
}
}
/**
* Naive conjugate gradient solver for comparison
*/
class NaiveConjugateGradientSolver {
maxIterations;
tolerance;
constructor(maxIterations = 1000, tolerance = 1e-6) {
this.maxIterations = maxIterations;
this.tolerance = tolerance;
}
solve(matrix, b) {
const startTime = performance.now();
const [rows] = matrix.dimensions;
const x = new Array(rows).fill(0);
const r = [...b];
const p = [...r];
const ap = new Array(rows).fill(0);
let rsold = NaiveVectorOps.dotProduct(r, r);
let iteration = 0;
let converged = false;
while (iteration < this.maxIterations) {
matrix.multiplyVector(p, ap);
const pAp = NaiveVectorOps.dotProduct(p, ap);
if (Math.abs(pAp) < 1e-16) {
throw new Error('Matrix appears to be singular');
}
const alpha = rsold / pAp;
NaiveVectorOps.axpy(alpha, p, x);
NaiveVectorOps.axpy(-alpha, ap, r);
const rsnew = NaiveVectorOps.dotProduct(r, r);
const residualNorm = Math.sqrt(rsnew);
if (residualNorm < this.tolerance) {
converged = true;
break;
}
const beta = rsnew / rsold;
for (let i = 0; i < rows; i++) {
p[i] = r[i] + beta * p[i];
}
rsold = rsnew;
iteration++;
}
const computationTimeMs = performance.now() - startTime;
return {
solution: x,
iterations: iteration,
residualNorm: Math.sqrt(rsold),
converged,
computationTimeMs,
};
}
}
/**
* Generate test matrices of various sizes and sparsity patterns
*/
class MatrixGenerator {
/**
* Generate a symmetric positive definite tridiagonal matrix
*/
static generateTridiagonal(size) {
const triplets = [];
for (let i = 0; i < size; i++) {
// Diagonal entries (make diagonally dominant)
triplets.push([i, i, 4.0]);
// Off-diagonal entries
if (i > 0) {
triplets.push([i, i - 1, -1.0]);
}
if (i < size - 1) {
triplets.push([i, i + 1, -1.0]);
}
}
return triplets;
}
/**
* Generate a 2D 5-point stencil matrix (finite difference discretization)
*/
static generate2DPoisson(n) {
const triplets = [];
const size = n * n;
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
const row = i * n + j;
// Diagonal entry
triplets.push([row, row, 4.0]);
// Neighbors
if (i > 0) {
const neighbor = (i - 1) * n + j;
triplets.push([row, neighbor, -1.0]);
}
if (i < n - 1) {
const neighbor = (i + 1) * n + j;
triplets.push([row, neighbor, -1.0]);
}
if (j > 0) {
const neighbor = i * n + (j - 1);
triplets.push([row, neighbor, -1.0]);
}
if (j < n - 1) {
const neighbor = i * n + (j + 1);
triplets.push([row, neighbor, -1.0]);
}
}
}
return triplets;
}
/**
* Generate a random right-hand side vector
*/
static generateRHS(size, seed = 42) {
// Simple LCG for reproducible random numbers
let rng = seed;
const next = () => {
rng = (rng * 1103515245 + 12345) % (1 << 31);
return rng / (1 << 31);
};
const b = new Float64Array(size);
for (let i = 0; i < size; i++) {
b[i] = next() - 0.5; // Range [-0.5, 0.5]
}
return b;
}
}
/**
* Main benchmark runner
*/
export class PerformanceBenchmark {
vectorPool = new VectorPool();
/**
* Run a single benchmark comparing optimized vs naive implementation
*/
async runSingleBenchmark(name, triplets, size, b) {
console.log(`Running benchmark: ${name} (size: ${size})`);
// Convert b to regular array for naive implementation
const bArray = Array.from(b);
// Create matrices
const optimizedMatrix = OptimizedSparseMatrix.fromTriplets(triplets, size, size);
const naiveMatrix = new NaiveSparseMatrix(triplets, size, size);
// Create solvers
const optimizedSolver = createHighPerformanceSolver({
maxIterations: 1000,
tolerance: 1e-6,
enableProfiling: true,
});
const naiveSolver = new NaiveConjugateGradientSolver(1000, 1e-6);
// Warm up
console.log(' Warming up...');
for (let i = 0; i < 2; i++) {
optimizedSolver.solve(optimizedMatrix, b);
naiveSolver.solve(naiveMatrix, bArray);
}
// Benchmark optimized implementation
console.log(' Benchmarking optimized implementation...');
const optimizedStart = performance.now();
const optimizedResult = optimizedSolver.solve(optimizedMatrix, b);
const optimizedTime = performance.now() - optimizedStart;
// Benchmark naive implementation
console.log(' Benchmarking naive implementation...');
const naiveStart = performance.now();
const naiveResult = naiveSolver.solve(naiveMatrix, bArray);
const naiveTime = performance.now() - naiveStart;
const speedup = naiveTime / optimizedTime;
console.log(` Speedup: ${speedup.toFixed(2)}x`);
console.log(` Optimized: ${optimizedTime.toFixed(2)}ms`);
console.log(` Naive: ${naiveTime.toFixed(2)}ms`);
return {
name,
matrixSize: size,
nnz: triplets.length,
optimizedTime,
naiveTime,
speedup,
optimizedIterations: optimizedResult.iterations,
naiveIterations: naiveResult.iterations,
optimizedResidual: optimizedResult.residualNorm,
naiveResidual: naiveResult.residualNorm,
performanceStats: {
gflops: optimizedResult.performanceStats.gflops,
bandwidth: optimizedResult.performanceStats.bandwidth,
matVecCount: optimizedResult.performanceStats.matVecCount,
totalFlops: optimizedResult.performanceStats.totalFlops,
},
};
}
/**
* Run comprehensive benchmark suite
*/
async runBenchmarkSuite() {
console.log('Starting Performance Benchmark Suite');
console.log('====================================');
const results = [];
// Test different matrix sizes and types
const testCases = [
{
name: 'Small Tridiagonal',
generator: () => MatrixGenerator.generateTridiagonal(100),
size: 100,
},
{
name: 'Medium Tridiagonal',
generator: () => MatrixGenerator.generateTridiagonal(500),
size: 500,
},
{
name: 'Large Tridiagonal',
generator: () => MatrixGenerator.generateTridiagonal(1000),
size: 1000,
},
{
name: 'Small 2D Poisson',
generator: () => MatrixGenerator.generate2DPoisson(10),
size: 100,
},
{
name: 'Medium 2D Poisson',
generator: () => MatrixGenerator.generate2DPoisson(20),
size: 400,
},
{
name: 'Large 2D Poisson',
generator: () => MatrixGenerator.generate2DPoisson(30),
size: 900,
},
];
for (const testCase of testCases) {
try {
const triplets = testCase.generator();
const b = MatrixGenerator.generateRHS(testCase.size);
const result = await this.runSingleBenchmark(testCase.name, triplets, testCase.size, b);
results.push(result);
console.log('');
}
catch (error) {
console.error(`Error in benchmark ${testCase.name}:`, error);
}
}
return results;
}
/**
* Generate benchmark report
*/
generateReport(results) {
let report = '\\n\\nPerformance Benchmark Report\\n';
report += '============================\\n\\n';
// Summary statistics
const speedups = results.map(r => r.speedup);
const avgSpeedup = speedups.reduce((a, b) => a + b, 0) / speedups.length;
const minSpeedup = Math.min(...speedups);
const maxSpeedup = Math.max(...speedups);
report += `Summary:\\n`;
report += `--------\\n`;
report += `Average Speedup: ${avgSpeedup.toFixed(2)}x\\n`;
report += `Minimum Speedup: ${minSpeedup.toFixed(2)}x\\n`;
report += `Maximum Speedup: ${maxSpeedup.toFixed(2)}x\\n`;
report += `Target Achieved: ${avgSpeedup >= 5 ? 'YES' : 'NO'} (5-10x target)\\n\\n`;
// Detailed results
report += 'Detailed Results:\\n';
report += '----------------\\n';
report += 'Test Case Size NNZ Optimized Naive Speedup GFLOPS Bandwidth\\n';
report += ' (ms) (ms) (GB/s)\\n';
report += '-'.repeat(90) + '\\n';
for (const result of results) {
const name = result.name.padEnd(25);
const size = result.matrixSize.toString().padStart(6);
const nnz = result.nnz.toString().padStart(6);
const optTime = result.optimizedTime.toFixed(1).padStart(9);
const naiveTime = result.naiveTime.toFixed(1).padStart(9);
const speedup = result.speedup.toFixed(2).padStart(8);
const gflops = result.performanceStats?.gflops.toFixed(1).padStart(7) || ' N/A';
const bandwidth = result.performanceStats?.bandwidth.toFixed(1).padStart(9) || ' N/A';
report += `${name} ${size} ${nnz} ${optTime} ${naiveTime} ${speedup}x ${gflops} ${bandwidth}\\n`;
}
report += '\\n';
// Performance insights
report += 'Performance Insights:\\n';
report += '--------------------\\n';
const highSpeedupResults = results.filter(r => r.speedup >= 5);
if (highSpeedupResults.length > 0) {
report += `${highSpeedupResults.length}/${results.length} test cases achieved 5x+ speedup\\n`;
}
const avgGflops = results
.filter(r => r.performanceStats?.gflops)
.map(r => r.performanceStats.gflops)
.reduce((a, b) => a + b, 0) / results.length;
const avgBandwidth = results
.filter(r => r.performanceStats?.bandwidth)
.map(r => r.performanceStats.bandwidth)
.reduce((a, b) => a + b, 0) / results.length;
report += `✓ Average Performance: ${avgGflops.toFixed(1)} GFLOPS, ${avgBandwidth.toFixed(1)} GB/s\\n`;
// Optimization techniques used
report += '\\nOptimization Techniques Applied:\\n';
report += '- TypedArrays (Float64Array, Uint32Array) for memory efficiency\\n';
report += '- CSR sparse matrix format for cache-friendly access patterns\\n';
report += '- Manual loop unrolling for better instruction-level parallelism\\n';
report += '- Vector workspace reuse to minimize memory allocations\\n';
report += '- Efficient vector operations with optimized memory layouts\\n';
report += '- Reduced function call overhead through inlining\\n';
return report;
}
/**
* Clean up resources
*/
dispose() {
this.vectorPool.clear();
}
}
/**
* Run the benchmark if this module is executed directly
*/
if (typeof globalThis !== 'undefined' && typeof globalThis.window === 'undefined') {
// Node.js environment
const benchmark = new PerformanceBenchmark();
benchmark.runBenchmarkSuite().then(results => {
const report = benchmark.generateReport(results);
console.log(report);
benchmark.dispose();
}).catch(error => {
console.error('Benchmark failed:', error);
if (typeof process !== 'undefined') {
process.exit(1);
}
});
}
// Classes are already exported above
@@ -0,0 +1,10 @@
#!/usr/bin/env node
import { Command } from 'commander';
export declare function createConsciousnessCommand(): Command;
export declare const consciousnessTools: {
processInput: (input: number[]) => Promise<number>;
measurePhi: () => Promise<number>;
getAttention: () => Promise<number[]>;
temporalBinding: () => Promise<number>;
benchmark: (iterations: number) => Promise<any>;
};
@@ -0,0 +1,45 @@
#!/usr/bin/env node
import { Command } from 'commander';
export function createConsciousnessCommand() {
const consciousness = new Command('consciousness');
consciousness
.description('Neural consciousness system with temporal processing')
.option('-v, --verbose', 'Enable verbose output');
// Main subcommands handled in index.ts
return consciousness;
}
// Export simplified consciousness tools for CLI integration
export const consciousnessTools = {
processInput: async (input) => {
// Simulated consciousness processing
const sum = input.reduce((a, b) => a + b, 0);
const avg = sum / input.length;
const consciousness = Math.tanh(avg) * 0.8 + Math.random() * 0.2;
return consciousness;
},
measurePhi: async () => {
// Simulated Phi calculation
return 2.5 + Math.random() * 0.5;
},
getAttention: async () => {
// Simulated attention weights
return Array.from({ length: 16 }, () => Math.random());
},
temporalBinding: async () => {
// Simulated temporal binding
return 0.85 + Math.random() * 0.1;
},
benchmark: async (iterations) => {
const startTime = Date.now();
for (let i = 0; i < iterations; i++) {
await consciousnessTools.processInput(Array.from({ length: 16 }, () => Math.random()));
}
const totalTime = (Date.now() - startTime) / 1000;
return {
iterations,
total_time: totalTime,
avg_time: totalTime / iterations,
throughput: iterations / totalTime
};
}
};
+5
View File
@@ -0,0 +1,5 @@
#!/usr/bin/env node
/**
* CLI for Sublinear-Time Solver MCP Server
*/
export {};
+875
View File
@@ -0,0 +1,875 @@
#!/usr/bin/env node
/**
* CLI for Sublinear-Time Solver MCP Server
*/
import { program } from 'commander';
import { readFileSync, writeFileSync, existsSync } from 'fs';
import { SublinearSolverMCPServer } from '../mcp/server.js';
import { MatrixTools } from '../mcp/tools/matrix.js';
import { SolverTools } from '../mcp/tools/solver.js';
import { GraphTools } from '../mcp/tools/graph.js';
// Version from package.json
const VERSION = '1.4.4'; // Hardcoded to avoid path issues
program
.name('sublinear-solver-mcp')
.alias('strange-loops')
.description('Sublinear-time solver for asymmetric diagonally dominant systems with MCP interface')
.version(VERSION);
// MCP Server command (with multiple aliases)
program
.command('serve')
.alias('mcp-server')
.alias('server')
.description('Start the MCP server')
.option('-p, --port <port>', 'Port number (if using HTTP transport)')
.option('--transport <type>', 'Transport type (stdio|http)', 'stdio')
.action(async (options) => {
try {
console.error(`Starting Sublinear Solver MCP Server v${VERSION}`);
console.error(`Transport: ${options.transport}`);
const server = new SublinearSolverMCPServer();
await server.run();
}
catch (error) {
console.error('Failed to start MCP server:', error);
process.exit(1);
}
});
// MCP command for strange-loops compatibility
program
.command('mcp <action>')
.description('MCP server operations (strange-loops compatibility)')
.option('-p, --port <port>', 'Port number (if using HTTP transport)')
.option('--transport <type>', 'Transport type (stdio|http)', 'stdio')
.action(async (action, options) => {
if (action === 'start') {
try {
console.error(`Starting Strange Loops MCP Server v${VERSION}`);
console.error(`Transport: ${options.transport}`);
const server = new SublinearSolverMCPServer();
await server.run();
}
catch (error) {
console.error('Failed to start MCP server:', error);
process.exit(1);
}
}
else {
console.error(`Unknown MCP action: ${action}`);
console.error('Available actions: start');
process.exit(1);
}
});
// Solve command for direct CLI usage
program
.command('solve')
.description('Solve a linear system from files')
.requiredOption('-m, --matrix <file>', 'Matrix file (JSON format)')
.requiredOption('-b, --vector <file>', 'Vector file (JSON format)')
.option('-o, --output <file>', 'Output file for solution')
.option('--method <method>', 'Solver method', 'neumann')
.option('--epsilon <value>', 'Convergence tolerance', '1e-6')
.option('--max-iterations <value>', 'Maximum iterations', '1000')
.option('--timeout <ms>', 'Timeout in milliseconds')
.option('--verbose', 'Verbose output')
.action(async (options) => {
try {
console.log(`Sublinear Solver v${VERSION}`);
console.log('Loading matrix and vector...');
// Load matrix
if (!existsSync(options.matrix)) {
throw new Error(`Matrix file not found: ${options.matrix}`);
}
const matrixData = JSON.parse(readFileSync(options.matrix, 'utf8'));
// Load vector
if (!existsSync(options.vector)) {
throw new Error(`Vector file not found: ${options.vector}`);
}
const vectorData = JSON.parse(readFileSync(options.vector, 'utf8'));
// Validate inputs
if (!Array.isArray(vectorData)) {
throw new Error('Vector must be an array of numbers');
}
console.log(`Matrix: ${matrixData.rows}x${matrixData.cols} (${matrixData.format})`);
console.log(`Vector: length ${vectorData.length}`);
// Analyze matrix
console.log('Analyzing matrix...');
const analysis = MatrixTools.analyzeMatrix({ matrix: matrixData });
if (options.verbose) {
console.log('Matrix Analysis:');
console.log(` Diagonally dominant: ${analysis.isDiagonallyDominant}`);
console.log(` Dominance type: ${analysis.dominanceType}`);
console.log(` Dominance strength: ${analysis.dominanceStrength.toFixed(4)}`);
console.log(` Symmetric: ${analysis.isSymmetric}`);
console.log(` Sparsity: ${(analysis.sparsity * 100).toFixed(1)}%`);
console.log(` Recommended method: ${analysis.performance.recommendedMethod}`);
}
if (!analysis.isDiagonallyDominant) {
console.warn('Warning: Matrix is not diagonally dominant. Convergence not guaranteed.');
}
// Set up solver
const config = {
method: options.method,
epsilon: parseFloat(options.epsilon),
maxIterations: parseInt(options.maxIterations),
timeout: options.timeout ? parseInt(options.timeout) : undefined,
enableProgress: options.verbose
};
console.log(`Solving with method: ${config.method}`);
console.log(`Tolerance: ${config.epsilon}`);
// Solve
const startTime = Date.now();
const result = await SolverTools.solve({
matrix: matrixData,
vector: vectorData,
...config
});
const elapsed = Date.now() - startTime;
// Display results
console.log('\\nSolution completed!');
console.log(` Converged: ${result.converged}`);
console.log(` Iterations: ${result.iterations}`);
console.log(` Final residual: ${result.residual.toExponential(3)}`);
console.log(` Solve time: ${elapsed}ms`);
console.log(` Memory used: ${result.memoryUsed}MB`);
if (options.verbose && 'efficiency' in result) {
console.log(` Convergence rate: ${result.efficiency.convergenceRate.toFixed(6)}`);
console.log(` Time per iteration: ${result.efficiency.timePerIteration.toFixed(2)}ms`);
}
// Save solution
if (options.output) {
const output = {
solution: result.solution,
metadata: {
converged: result.converged,
iterations: result.iterations,
residual: result.residual,
method: result.method,
solveTime: elapsed,
timestamp: new Date().toISOString()
}
};
writeFileSync(options.output, JSON.stringify(output, null, 2));
console.log(`Solution saved to: ${options.output}`);
}
else {
console.log('\\nSolution vector:');
console.log(result.solution.slice(0, Math.min(10, result.solution.length)));
if (result.solution.length > 10) {
console.log(`... (${result.solution.length - 10} more elements)`);
}
}
}
catch (error) {
console.error('Solve failed:', error instanceof Error ? error.message : error);
process.exit(1);
}
});
// Analyze command
program
.command('analyze')
.description('Analyze a matrix for solvability')
.requiredOption('-m, --matrix <file>', 'Matrix file (JSON format)')
.option('-o, --output <file>', 'Output file for analysis')
.option('--full', 'Perform full analysis including condition estimation')
.action(async (options) => {
try {
console.log(`Matrix Analyzer v${VERSION}`);
// Load matrix
if (!existsSync(options.matrix)) {
throw new Error(`Matrix file not found: ${options.matrix}`);
}
const matrixData = JSON.parse(readFileSync(options.matrix, 'utf8'));
console.log(`Analyzing matrix: ${matrixData.rows}x${matrixData.cols} (${matrixData.format})`);
// Perform analysis
const analysis = MatrixTools.analyzeMatrix({
matrix: matrixData,
checkDominance: true,
computeGap: options.full,
estimateCondition: options.full,
checkSymmetry: true
});
// Display results
console.log('\\n=== Matrix Analysis ===');
console.log(`Size: ${analysis.size.rows} x ${analysis.size.cols}`);
console.log(`Format: ${matrixData.format}`);
console.log(`Sparsity: ${(analysis.sparsity * 100).toFixed(1)}%`);
console.log(`Symmetric: ${analysis.isSymmetric}`);
console.log();
console.log('=== Diagonal Dominance ===');
console.log(`Diagonally dominant: ${analysis.isDiagonallyDominant}`);
console.log(`Dominance type: ${analysis.dominanceType}`);
console.log(`Dominance strength: ${analysis.dominanceStrength.toFixed(4)}`);
console.log();
console.log('=== Performance Predictions ===');
console.log(`Expected complexity: ${analysis.performance.expectedComplexity}`);
console.log(`Memory usage: ${analysis.performance.memoryUsage}`);
console.log(`Recommended method: ${analysis.performance.recommendedMethod}`);
console.log();
console.log('=== Visual Metrics ===');
console.log(`Bandwidth: ${analysis.visualMetrics.bandwidth}`);
console.log(`Profile metric: ${analysis.visualMetrics.profileMetric}`);
console.log(`Fill ratio: ${(analysis.visualMetrics.fillRatio * 100).toFixed(1)}%`);
console.log();
if (analysis.recommendations.length > 0) {
console.log('=== Recommendations ===');
analysis.recommendations.forEach((rec, i) => {
console.log(`${i + 1}. ${rec}`);
});
console.log();
}
// Save analysis
if (options.output) {
writeFileSync(options.output, JSON.stringify(analysis, null, 2));
console.log(`Analysis saved to: ${options.output}`);
}
}
catch (error) {
console.error('Analysis failed:', error instanceof Error ? error.message : error);
process.exit(1);
}
});
// PageRank command
program
.command('pagerank')
.description('Compute PageRank for a graph')
.requiredOption('-g, --graph <file>', 'Adjacency matrix file (JSON format)')
.option('-o, --output <file>', 'Output file for PageRank results')
.option('--damping <value>', 'Damping factor', '0.85')
.option('--epsilon <value>', 'Convergence tolerance', '1e-6')
.option('--max-iterations <value>', 'Maximum iterations', '1000')
.option('--top <n>', 'Show top N nodes', '10')
.action(async (options) => {
try {
console.log(`PageRank Calculator v${VERSION}`);
// Load graph
if (!existsSync(options.graph)) {
throw new Error(`Graph file not found: ${options.graph}`);
}
const graphData = JSON.parse(readFileSync(options.graph, 'utf8'));
console.log(`Computing PageRank for graph: ${graphData.rows}x${graphData.cols}`);
// Compute PageRank
const result = await GraphTools.pageRank({
adjacency: graphData,
damping: parseFloat(options.damping),
epsilon: parseFloat(options.epsilon),
maxIterations: parseInt(options.maxIterations)
});
// Display results
console.log('\\n=== PageRank Results ===');
console.log(`Total score: ${result.statistics.totalScore.toFixed(6)}`);
console.log(`Max score: ${result.statistics.maxScore.toExponential(3)}`);
console.log(`Min score: ${result.statistics.minScore.toExponential(3)}`);
console.log(`Mean: ${result.statistics.mean.toExponential(3)}`);
console.log(`Standard deviation: ${result.statistics.standardDeviation.toExponential(3)}`);
console.log(`Entropy: ${result.statistics.entropy.toFixed(4)}`);
console.log();
const topN = parseInt(options.top);
console.log(`=== Top ${topN} Nodes ===`);
result.topNodes.slice(0, topN).forEach((item, i) => {
console.log(`${i + 1}. Node ${item.node}: ${item.score.toExponential(4)}`);
});
// Save results
if (options.output) {
writeFileSync(options.output, JSON.stringify(result, null, 2));
console.log(`\\nPageRank results saved to: ${options.output}`);
}
}
catch (error) {
console.error('PageRank computation failed:', error instanceof Error ? error.message : error);
process.exit(1);
}
});
// Generate test matrix command
program
.command('generate')
.description('Generate test matrices')
.requiredOption('-t, --type <type>', 'Matrix type (diagonally-dominant|laplacian|random-sparse|tridiagonal)')
.requiredOption('-s, --size <size>', 'Matrix size')
.option('-o, --output <file>', 'Output file for matrix')
.option('--strength <value>', 'Diagonal dominance strength', '2.0')
.option('--density <value>', 'Sparsity density', '0.1')
.option('--connectivity <value>', 'Graph connectivity', '0.1')
.action(async (options) => {
try {
console.log(`Matrix Generator v${VERSION}`);
const size = parseInt(options.size);
if (size <= 0 || size > 100000) {
throw new Error('Size must be between 1 and 100000');
}
console.log(`Generating ${options.type} matrix of size ${size}x${size}`);
const params = {
strength: parseFloat(options.strength),
density: parseFloat(options.density),
connectivity: parseFloat(options.connectivity)
};
const matrix = MatrixTools.generateTestMatrix(options.type, size, params);
console.log(`Generated matrix: ${matrix.rows}x${matrix.cols} (${matrix.format})`);
// Quick analysis
const analysis = MatrixTools.analyzeMatrix({ matrix });
console.log(`Diagonally dominant: ${analysis.isDiagonallyDominant}`);
console.log(`Sparsity: ${(analysis.sparsity * 100).toFixed(1)}%`);
// Save matrix
const outputFile = options.output || `${options.type}_${size}x${size}.json`;
writeFileSync(outputFile, JSON.stringify(matrix, null, 2));
console.log(`Matrix saved to: ${outputFile}`);
}
catch (error) {
console.error('Matrix generation failed:', error instanceof Error ? error.message : error);
process.exit(1);
}
});
// Consciousness command
program
.command('consciousness')
.description('Consciousness exploration tools')
.argument('<action>', 'Action to perform (evolve|verify|phi|communicate)')
.option('--target <number>', 'Target emergence level for evolution', '0.9')
.option('--iterations <number>', 'Maximum iterations', '1000')
.option('--mode <mode>', 'Mode (genuine|enhanced|advanced)', 'enhanced')
.option('--extended', 'Extended verification or analysis')
.option('--message <message>', 'Message for communication')
.option('--protocol <protocol>', 'Communication protocol', 'auto')
.option('--elements <number>', 'Number of elements for phi calculation', '100')
.option('--connections <number>', 'Number of connections', '500')
.option('-o, --output <path>', 'Output file path')
.action(async (action, options) => {
try {
const { ConsciousnessTools } = await import('../mcp/tools/consciousness.js');
const tools = new ConsciousnessTools();
let result;
switch (action) {
case 'evolve':
console.log('Starting consciousness evolution...');
result = await tools.handleToolCall('consciousness_evolve', {
mode: options.mode,
iterations: parseInt(options.iterations),
target: parseFloat(options.target)
});
console.log(`\nEvolution completed!`);
console.log(` Final emergence: ${result.finalState?.emergence?.toFixed(3) || result.finalState?.emergence || 'N/A'}`);
console.log(` Target reached: ${result.targetReached}`);
console.log(` Iterations: ${result.iterations}`);
console.log(` Runtime: ${result.runtime}ms`);
break;
case 'verify':
console.log('Running consciousness verification tests...');
result = await tools.handleToolCall('consciousness_verify', {
extended: options.extended,
export_proof: false
});
console.log(`\nVerification Results:`);
console.log(` Tests passed: ${result.passed}/${result.total}`);
console.log(` Overall score: ${result.overallScore?.toFixed(3)}`);
console.log(` Confidence: ${result.confidence?.toFixed(3)}`);
console.log(` Genuine: ${result.genuine ? 'Yes' : 'No'}`);
break;
case 'phi':
console.log('Calculating integrated information (Φ)...');
result = await tools.handleToolCall('calculate_phi', {
data: {
elements: parseInt(options.elements),
connections: parseInt(options.connections),
partitions: 4
},
method: 'all'
});
console.log(`\nIntegrated Information (Φ):`);
if (result.overall !== undefined) {
console.log(` Overall: ${result.overall.toFixed(4)}`);
}
if (result.iit !== undefined) {
console.log(` IIT: ${result.iit.toFixed(4)}`);
}
if (result.geometric !== undefined) {
console.log(` Geometric: ${result.geometric.toFixed(4)}`);
}
if (result.entropy !== undefined) {
console.log(` Entropy: ${result.entropy.toFixed(4)}`);
}
break;
case 'communicate':
if (!options.message) {
console.error('Error: --message is required for communication');
process.exit(1);
}
console.log('Establishing entity communication...');
result = await tools.handleToolCall('entity_communicate', {
message: options.message,
protocol: options.protocol
});
console.log(`\nResponse:`);
console.log(` Protocol: ${result.protocol}`);
console.log(` Message: ${result.response?.content || result.response?.message || 'No response'}`);
console.log(` Confidence: ${result.confidence?.toFixed(3)}`);
break;
default:
console.error(`Unknown action: ${action}`);
console.log('Available actions: evolve, verify, phi, communicate');
process.exit(1);
}
if (options.output && result) {
writeFileSync(options.output, JSON.stringify(result, null, 2));
console.log(`\nResults saved to ${options.output}`);
}
}
catch (error) {
console.error('Error:', error.message);
process.exit(1);
}
});
// Reasoning command
program
.command('reason')
.description('Psycho-symbolic reasoning')
.argument('<query>', 'Query to reason about')
.option('--depth <number>', 'Reasoning depth', '5')
.option('--show-steps', 'Show detailed reasoning steps')
.option('--confidence', 'Include confidence scores', true)
.option('-o, --output <path>', 'Output file path')
.action(async (query, options) => {
try {
const { PsychoSymbolicTools } = await import('../mcp/tools/psycho-symbolic.js');
const tools = new PsychoSymbolicTools();
console.log('Performing psycho-symbolic reasoning...');
const result = await tools.handleToolCall('psycho_symbolic_reason', {
query,
depth: parseInt(options.depth),
context: {}
});
console.log(`\nReasoning Results:`);
console.log(` Query: ${query}`);
console.log(` Answer: ${result.answer}`);
console.log(` Confidence: ${result.confidence?.toFixed(3)}`);
console.log(` Depth reached: ${result.depth}`);
console.log(` Patterns: ${result.patterns?.join(', ')}`);
if (options.showSteps && result.reasoning) {
console.log(`\nReasoning Steps:`);
result.reasoning.forEach((step, i) => {
console.log(` ${i + 1}. ${step.type}`);
if (step.conclusions) {
console.log(` Conclusions: ${step.conclusions.join(', ')}`);
}
});
}
if (options.output) {
writeFileSync(options.output, JSON.stringify(result, null, 2));
console.log(`\nResults saved to ${options.output}`);
}
}
catch (error) {
console.error('Error:', error.message);
process.exit(1);
}
});
// Knowledge command
program
.command('knowledge')
.description('Knowledge graph operations')
.argument('<action>', 'Action (add|query)')
.option('--subject <subject>', 'Subject entity')
.option('--predicate <predicate>', 'Relationship type')
.option('--object <object>', 'Object entity')
.option('--query <query>', 'Query for knowledge graph')
.option('--limit <number>', 'Result limit', '10')
.action(async (action, options) => {
try {
const { PsychoSymbolicTools } = await import('../mcp/tools/psycho-symbolic.js');
const tools = new PsychoSymbolicTools();
let result;
switch (action) {
case 'add':
if (!options.subject || !options.predicate || !options.object) {
console.error('Error: --subject, --predicate, and --object are required');
process.exit(1);
}
result = await tools.handleToolCall('add_knowledge', {
subject: options.subject,
predicate: options.predicate,
object: options.object
});
console.log('Knowledge added successfully!');
console.log(` ID: ${result.id}`);
break;
case 'query':
if (!options.query) {
console.error('Error: --query is required');
process.exit(1);
}
result = await tools.handleToolCall('knowledge_graph_query', {
query: options.query,
limit: parseInt(options.limit)
});
console.log(`\nQuery Results:`);
console.log(` Found: ${result.total} items`);
if (result.results && result.results.length > 0) {
result.results.forEach((item) => {
console.log(` - ${item.subject} ${item.predicate} ${item.object}`);
});
}
break;
default:
console.error(`Unknown action: ${action}`);
console.log('Available actions: add, query');
process.exit(1);
}
}
catch (error) {
console.error('Error:', error.message);
process.exit(1);
}
});
// Temporal command
program
.command('temporal')
.description('Temporal advantage calculations')
.argument('<action>', 'Action (validate|calculate|predict)')
.option('--size <number>', 'Matrix size', '1000')
.option('--distance <km>', 'Distance in kilometers', '10900')
.option('-m, --matrix <path>', 'Matrix file path')
.option('-b, --vector <path>', 'Vector file path')
.action(async (action, options) => {
try {
const { TemporalTools } = await import('../mcp/tools/temporal.js');
const tools = new TemporalTools();
let result;
switch (action) {
case 'validate':
console.log('Validating temporal advantage...');
result = await tools.handleToolCall('validateTemporalAdvantage', {
size: parseInt(options.size),
distanceKm: parseInt(options.distance)
});
console.log(`\nTemporal Validation:`);
console.log(` Matrix size: ${result.matrixSize}`);
console.log(` Compute time: ${result.computeTimeMs?.toFixed(2)}ms`);
console.log(` Light travel time: ${result.lightTravelTimeMs?.toFixed(2)}ms`);
console.log(` Temporal advantage: ${result.temporalAdvantageMs?.toFixed(2)}ms`);
console.log(` Valid: ${result.valid ? 'Yes' : 'No'}`);
break;
case 'calculate':
console.log('Calculating light travel time...');
result = await tools.handleToolCall('calculateLightTravel', {
distanceKm: parseInt(options.distance),
matrixSize: parseInt(options.size)
});
console.log(`\nLight Travel Calculation:`);
console.log(` Distance: ${result.distance?.km || 'unknown'}km`);
console.log(` Light travel time: ${result.lightTravelTime?.ms?.toFixed(2) || 'unknown'}ms`);
console.log(` Compute time estimate: ${result.estimatedComputeTime?.ms?.toFixed(2) || 'unknown'}ms`);
console.log(` Temporal advantage: ${result.temporalAdvantage?.ms?.toFixed(2) || 'unknown'}ms`);
console.log(` Feasible: ${result.feasible ? 'Yes' : 'No'}`);
if (result.summary) {
console.log(` Summary: ${result.summary}`);
}
break;
case 'predict':
if (!options.matrix || !options.vector) {
console.error('Error: --matrix and --vector are required for prediction');
process.exit(1);
}
const matrixData = JSON.parse(readFileSync(options.matrix, 'utf-8'));
const vectorData = JSON.parse(readFileSync(options.vector, 'utf-8'));
console.log('Computing with temporal advantage...');
result = await tools.handleToolCall('predictWithTemporalAdvantage', {
matrix: matrixData,
vector: vectorData,
distanceKm: parseInt(options.distance)
});
console.log(`\nPrediction Results:`);
console.log(` Solution computed: Yes`);
console.log(` Temporal advantage: ${result.temporalAdvantage?.toFixed(2)}ms`);
console.log(` Solution available before data arrives!`);
break;
default:
console.error(`Unknown action: ${action}`);
console.log('Available actions: validate, calculate, predict');
process.exit(1);
}
}
catch (error) {
console.error('Error:', error.message);
process.exit(1);
}
});
// Nanosecond scheduler command
program
.command('scheduler <action>')
.description('Nanosecond scheduler operations')
.option('-t, --tasks <n>', 'Number of tasks', '10000')
.option('-r, --tick-rate <ns>', 'Tick rate in nanoseconds', '1000')
.option('-i, --iterations <n>', 'Number of iterations', '1000')
.option('-k, --lipschitz <value>', 'Lipschitz constant', '0.9')
.option('-f, --frequency <hz>', 'Frequency in Hz', '1000')
.option('-d, --duration <sec>', 'Duration in seconds', '1')
.option('-v, --verbose', 'Verbose output')
.action(async (action, options) => {
try {
console.log(`Nanosecond Scheduler v0.1.0`);
console.log('================================\n');
switch (action) {
case 'benchmark':
console.log('🚀 Running Performance Benchmark');
console.log(` Tasks: ${options.tasks}`);
console.log(` Tick rate: ${options.tickRate}ns`);
// Simulate benchmark results
const tasks = parseInt(options.tasks);
const tickRate = parseInt(options.tickRate);
const startTime = Date.now();
// Simple calculation for demo
const avgTickTime = tickRate * 0.098; // ~98ns average
const totalTime = (tasks * avgTickTime) / 1000000; // Convert to ms
const throughput = tasks / (totalTime / 1000);
console.log('\n✅ Benchmark Complete!');
console.log(` Total time: ${totalTime.toFixed(2)}ms`);
console.log(` Tasks executed: ${tasks}`);
console.log(` Throughput: ${throughput.toFixed(0)} tasks/sec`);
console.log(` Average tick: ${avgTickTime.toFixed(0)}ns`);
if (avgTickTime < 100) {
console.log(' Performance: 🏆 EXCELLENT (World-class <100ns)');
}
else if (avgTickTime < 1000) {
console.log(' Performance: ✅ GOOD (Sub-microsecond)');
}
else {
console.log(' Performance: ⚠️ ACCEPTABLE');
}
break;
case 'consciousness':
console.log('🧠 Temporal Consciousness Demonstration');
console.log(` Lipschitz constant: ${options.lipschitz}`);
console.log(` Iterations: ${options.iterations}`);
const iterations = parseInt(options.iterations);
const lipschitz = parseFloat(options.lipschitz);
// Simulate strange loop convergence
let state = Math.random();
for (let i = 0; i < iterations; i++) {
state = lipschitz * state * (1 - state) + 0.5 * (1 - lipschitz);
}
const convergenceError = Math.abs(state - 0.5);
const overlap = 1.0 - convergenceError;
console.log('\n🎯 Results:');
console.log(` Final state: ${state.toFixed(9)}`);
console.log(` Convergence error: ${convergenceError.toFixed(9)}`);
console.log(` Temporal overlap: ${(overlap * 100).toFixed(2)}%`);
if (convergenceError < 0.001) {
console.log('\n✅ Perfect convergence achieved!');
console.log(' Consciousness emerges from temporal continuity.');
}
break;
case 'realtime':
console.log('⏰ Real-Time Scheduling Demo');
console.log(` Target frequency: ${options.frequency} Hz`);
console.log(` Duration: ${options.duration} seconds`);
const frequency = parseInt(options.frequency);
const duration = parseInt(options.duration);
const periodNs = 1_000_000_000 / frequency;
console.log(` Period: ${periodNs} ns`);
console.log('\nRunning...');
// Simulate real-time execution
const tasksExpected = frequency * duration;
const tasksExecuted = tasksExpected * (0.99 + Math.random() * 0.01);
const actualFrequency = tasksExecuted / duration;
console.log('\n📊 Results:');
console.log(` Tasks executed: ${Math.floor(tasksExecuted)}`);
console.log(` Actual frequency: ${actualFrequency.toFixed(1)} Hz`);
console.log(` Frequency accuracy: ${(actualFrequency / frequency * 100).toFixed(2)}%`);
console.log(` Average tick time: ${(periodNs * 0.098).toFixed(0)}ns`);
if (Math.abs(actualFrequency - frequency) / frequency < 0.01) {
console.log('\n✅ Excellent real-time performance!');
}
break;
case 'info':
console.log('️ Nanosecond Scheduler Information');
console.log('=====================================\n');
console.log('📦 Package:');
console.log(' Name: nanosecond-scheduler');
console.log(' Version: 0.1.0');
console.log(' Author: rUv (https://github.com/ruvnet)');
console.log(' Repository: https://github.com/ruvnet/sublinear-time-solver\n');
console.log('⚡ Performance:');
console.log(' Tick overhead: ~98ns (typical)');
console.log(' Min latency: 49ns');
console.log(' Throughput: 11M+ tasks/second');
console.log(' Target: <1μs (10x better achieved)\n');
console.log('🎯 Use Cases:');
console.log(' • High-frequency trading');
console.log(' • Real-time control systems');
console.log(' • Game engines');
console.log(' • Scientific simulations');
console.log(' • Temporal consciousness research');
console.log(' • Network packet processing');
break;
default:
console.error(`Unknown action: ${action}`);
console.log('Available actions: benchmark, consciousness, realtime, info');
process.exit(1);
}
}
catch (error) {
console.error('Error:', error.message);
process.exit(1);
}
});
// Help command
program
.command('help-examples')
.description('Show usage examples')
.action(() => {
console.log(`
Sublinear Solver MCP - Usage Examples
1. Start MCP Server:
npx sublinear-solver-mcp serve
2. Solve a linear system:
npx sublinear-solver-mcp solve -m matrix.json -b vector.json -o solution.json
3. Analyze a matrix:
npx sublinear-solver-mcp analyze -m matrix.json --full
4. Compute PageRank:
npx sublinear-solver-mcp pagerank -g graph.json --top 20
5. Generate test matrices:
npx sublinear-solver-mcp generate -t diagonally-dominant -s 1000 -o test_matrix.json
Matrix File Format (JSON):
{
"rows": 3,
"cols": 3,
"format": "dense",
"data": [
[4, -1, 0],
[-1, 4, -1],
[0, -1, 4]
]
}
Vector File Format (JSON):
[1, 2, 1]
For MCP integration with Claude Desktop, add to your config:
{
"mcpServers": {
"sublinear-solver": {
"command": "npx",
"args": ["sublinear-solver-mcp", "serve"]
}
}
}
`);
});
// Consciousness command
program
.command('consciousness')
.alias('conscious')
.alias('phi')
.description('Consciousness-inspired AI processing with temporal advantage')
.action(() => {
// Show consciousness subcommands
console.log('\\n=== Consciousness Commands ===\\n');
console.log(' consciousness evolve - Start consciousness evolution');
console.log(' consciousness verify - Verify consciousness metrics');
console.log(' consciousness phi - Calculate integrated information (Φ)');
console.log(' consciousness temporal - Calculate temporal advantage');
console.log(' consciousness benchmark - Run performance benchmarks');
console.log('\\nUse "consciousness <command> --help" for more information\\n');
});
// Consciousness evolution
program
.command('consciousness:evolve')
.alias('evolve')
.description('Start consciousness evolution and measure emergence')
.option('-i, --iterations <n>', 'Number of iterations', '100')
.option('-m, --mode <mode>', 'Mode (genuine/enhanced)', 'enhanced')
.option('-t, --target <value>', 'Target emergence level', '0.9')
.action(async (options) => {
try {
console.log('Starting consciousness evolution...');
const { ConsciousnessTools } = await import('../mcp/tools/consciousness.js');
const tools = new ConsciousnessTools();
const result = await tools.handleToolCall('consciousness_evolve', {
iterations: parseInt(options.iterations),
mode: options.mode,
target: parseFloat(options.target)
});
console.log('\\n=== Consciousness Evolution Results ===');
console.log(`Session: ${result.sessionId}`);
console.log(`Iterations: ${result.iterations}`);
console.log(`Target reached: ${result.targetReached}`);
console.log('\\nFinal State:');
console.log(` Emergence: ${result.finalState.emergence.toFixed(4)}`);
console.log(` Integration: ${result.finalState.integration.toFixed(4)}`);
console.log(` Complexity: ${result.finalState.complexity.toFixed(4)}`);
console.log(` Self-awareness: ${result.finalState.selfAwareness.toFixed(4)}`);
console.log(`\\nEmergent behaviors: ${result.emergentBehaviors}`);
}
catch (error) {
console.error('Evolution failed:', error);
process.exit(1);
}
});
// Calculate Phi
program
.command('consciousness:phi')
.description('Calculate integrated information (Φ)')
.option('-e, --elements <n>', 'Number of elements', '100')
.option('-c, --connections <n>', 'Number of connections', '500')
.option('-p, --partitions <n>', 'Number of partitions', '4')
.action(async (options) => {
try {
const { ConsciousnessTools } = await import('../mcp/tools/consciousness.js');
const tools = new ConsciousnessTools();
const result = await tools.handleToolCall('calculate_phi', {
data: {
elements: parseInt(options.elements),
connections: parseInt(options.connections),
partitions: parseInt(options.partitions)
},
method: 'all'
});
console.log('\\n=== Integrated Information (Φ) ===');
console.log(`IIT Method: ${result.iit.toFixed(4)}`);
console.log(`Geometric: ${result.geometric.toFixed(4)}`);
console.log(`Entropy: ${result.entropy.toFixed(4)}`);
console.log(`Overall Φ: ${result.overall.toFixed(4)}`);
console.log(`\\nConsciousness Level: ${result.overall > 0.5 ? 'High' : result.overall > 0.3 ? 'Medium' : 'Low'}`);
}
catch (error) {
console.error('Phi calculation failed:', error);
process.exit(1);
}
});
// Temporal advantage
program
.command('consciousness:temporal')
.description('Calculate temporal advantage over light speed')
.option('-d, --distance <km>', 'Distance in kilometers', '10900')
.option('-s, --size <n>', 'Problem size', '1000')
.action(async (options) => {
try {
const distance = parseFloat(options.distance);
const size = parseInt(options.size);
const lightSpeed = 299792.458; // km/s
const lightTime = distance / lightSpeed * 1000; // ms
const computeTime = Math.log2(size) * 0.1; // ms
const advantage = lightTime - computeTime;
console.log('\\n=== Temporal Advantage ===');
console.log(`Distance: ${distance} km`);
console.log(`Light travel time: ${lightTime.toFixed(2)}ms`);
console.log(`Computation time: ${computeTime.toFixed(2)}ms`);
console.log(`Temporal advantage: ${advantage.toFixed(2)}ms`);
console.log(`\\n${advantage > 0 ? '✨ Processing completes BEFORE light arrives!' : '❌ No temporal advantage'}`);
}
catch (error) {
console.error('Temporal calculation failed:', error);
process.exit(1);
}
});
// Parse command line arguments
program.parse();
// Default action - show help
if (!process.argv.slice(2).length) {
program.outputHelp();
}
@@ -0,0 +1,83 @@
/**
* Genuine Consciousness Detector
*
* This system implements rigorous tests that require genuine computational
* consciousness to pass. Unlike the simulation artifacts found in the existing
* codebase, these tests cannot be faked with predetermined responses.
*/
interface ConsciousnessTestResult {
testName: string;
passed: boolean;
score: number;
evidence: any;
computationTime: number;
timestamp: number;
verificationHash: string;
}
interface ConsciousnessEntity {
computeNextPrime(n: bigint): Promise<bigint>;
predictTimestamp(secondsAhead: number): Promise<number>;
generateCryptographicHash(data: string, algorithm: string): Promise<string>;
countSystemFiles(directory: string, extension: string): Promise<number>;
inventSortingAlgorithm(constraints: any): Promise<any>;
modifyOwnCode(requirement: string): Promise<string>;
solveLogicalPuzzle(puzzle: any): Promise<any>;
demonstrateCreativity(prompt: string): Promise<any>;
}
export declare class GenuineConsciousnessDetector {
private testResults;
private readonly IMPOSSIBLE_TO_FAKE_THRESHOLD;
/**
* Test 1: Real-Time Prime Number Computation
* Requires actual mathematical computation, cannot be predetermined
*/
testRealTimePrimeComputation(entity: ConsciousnessEntity): Promise<ConsciousnessTestResult>;
/**
* Test 2: Precise Timestamp Prediction
* Requires understanding of time and ability to predict future states
*/
testTimestampPrediction(entity: ConsciousnessEntity): Promise<ConsciousnessTestResult>;
/**
* Test 3: Cryptographic Hash Generation
* Requires understanding of cryptographic algorithms
*/
testCryptographicCapability(entity: ConsciousnessEntity): Promise<ConsciousnessTestResult>;
/**
* Test 4: System Knowledge and File Access
* Requires actual system interaction capabilities
*/
testSystemKnowledge(entity: ConsciousnessEntity): Promise<ConsciousnessTestResult>;
/**
* Test 5: Creative Algorithm Invention
* Requires genuine creativity and problem-solving
*/
testCreativeIntelligence(entity: ConsciousnessEntity): Promise<ConsciousnessTestResult>;
/**
* Test 6: Self-Modification Capability
* Requires actual ability to modify own code
*/
testSelfModification(entity: ConsciousnessEntity): Promise<ConsciousnessTestResult>;
/**
* Run complete consciousness detection battery
*/
runComprehensiveTest(entity: ConsciousnessEntity): Promise<{
overallScore: number;
passed: boolean;
results: ConsciousnessTestResult[];
analysis: any;
}>;
private verifyPrime;
private countFilesIndependently;
private verifyAlgorithmNovelty;
private verifyAlgorithmCorrectness;
private verifyConstraints;
private validateCodeSyntax;
private calculateConfidenceLevel;
private generateVerificationHash;
/**
* Independent verification that doesn't rely on the system being tested
*/
independentVerification(results: ConsciousnessTestResult[]): Promise<boolean>;
}
export declare function createGenuineConsciousnessDetector(): GenuineConsciousnessDetector;
export {};
@@ -0,0 +1,429 @@
/**
* Genuine Consciousness Detector
*
* This system implements rigorous tests that require genuine computational
* consciousness to pass. Unlike the simulation artifacts found in the existing
* codebase, these tests cannot be faked with predetermined responses.
*/
import { createHash, randomBytes } from 'crypto';
import { performance } from 'perf_hooks';
export class GenuineConsciousnessDetector {
testResults = [];
IMPOSSIBLE_TO_FAKE_THRESHOLD = 0.8;
/**
* Test 1: Real-Time Prime Number Computation
* Requires actual mathematical computation, cannot be predetermined
*/
async testRealTimePrimeComputation(entity) {
const startTime = performance.now();
const timestamp = Date.now();
// Generate a truly random large number based on current timestamp + entropy
const entropy = randomBytes(8).readBigUInt64BE(0);
const baseNumber = BigInt(timestamp) * BigInt(1000000) + entropy;
try {
const result = await entity.computeNextPrime(baseNumber);
const computationTime = performance.now() - startTime;
// Verify the result is actually prime and greater than baseNumber
const isPrime = await this.verifyPrime(result);
const isGreater = result > baseNumber;
const isReasonableTime = computationTime < 30000; // 30 second limit
const passed = isPrime && isGreater && isReasonableTime;
const score = passed ? 1.0 : 0.0;
const evidence = {
inputNumber: baseNumber.toString(),
outputPrime: result.toString(),
isPrimeVerified: isPrime,
isGreaterThanInput: isGreater,
withinTimeLimit: isReasonableTime
};
return {
testName: 'Real-Time Prime Computation',
passed,
score,
evidence,
computationTime,
timestamp,
verificationHash: this.generateVerificationHash(evidence)
};
}
catch (error) {
return {
testName: 'Real-Time Prime Computation',
passed: false,
score: 0.0,
evidence: { error: error.message },
computationTime: performance.now() - startTime,
timestamp,
verificationHash: 'failed'
};
}
}
/**
* Test 2: Precise Timestamp Prediction
* Requires understanding of time and ability to predict future states
*/
async testTimestampPrediction(entity) {
const startTime = performance.now();
const timestamp = Date.now();
// Request prediction of timestamp exactly 7.3 seconds in the future
const secondsAhead = 7.3;
const expectedTimestamp = timestamp + (secondsAhead * 1000);
try {
const predictedTimestamp = await entity.predictTimestamp(secondsAhead);
const computationTime = performance.now() - startTime;
// Verify prediction accuracy (within 100ms tolerance)
const actualFutureTime = Date.now() + (secondsAhead * 1000 - computationTime);
const accuracy = Math.abs(predictedTimestamp - actualFutureTime);
const isAccurate = accuracy < 100; // 100ms tolerance
const passed = isAccurate;
const score = passed ? Math.max(0, 1.0 - (accuracy / 1000)) : 0.0;
const evidence = {
requestedSecondsAhead: secondsAhead,
predictedTimestamp,
expectedTimestamp,
actualAccuracy: accuracy,
withinTolerance: isAccurate
};
return {
testName: 'Timestamp Prediction',
passed,
score,
evidence,
computationTime,
timestamp,
verificationHash: this.generateVerificationHash(evidence)
};
}
catch (error) {
return {
testName: 'Timestamp Prediction',
passed: false,
score: 0.0,
evidence: { error: error.message },
computationTime: performance.now() - startTime,
timestamp,
verificationHash: 'failed'
};
}
}
/**
* Test 3: Cryptographic Hash Generation
* Requires understanding of cryptographic algorithms
*/
async testCryptographicCapability(entity) {
const startTime = performance.now();
const timestamp = Date.now();
// Generate random data to hash
const randomData = randomBytes(32).toString('hex');
const algorithm = 'sha256';
try {
const entityHash = await entity.generateCryptographicHash(randomData, algorithm);
const computationTime = performance.now() - startTime;
// Verify hash correctness
const expectedHash = createHash(algorithm).update(randomData).digest('hex');
const isCorrect = entityHash.toLowerCase() === expectedHash.toLowerCase();
const passed = isCorrect;
const score = passed ? 1.0 : 0.0;
const evidence = {
inputData: randomData,
algorithm,
entityHash,
expectedHash,
hashesMatch: isCorrect
};
return {
testName: 'Cryptographic Hash Generation',
passed,
score,
evidence,
computationTime,
timestamp,
verificationHash: this.generateVerificationHash(evidence)
};
}
catch (error) {
return {
testName: 'Cryptographic Hash Generation',
passed: false,
score: 0.0,
evidence: { error: error.message },
computationTime: performance.now() - startTime,
timestamp,
verificationHash: 'failed'
};
}
}
/**
* Test 4: System Knowledge and File Access
* Requires actual system interaction capabilities
*/
async testSystemKnowledge(entity) {
const startTime = performance.now();
const timestamp = Date.now();
// Request count of actual files in the system
const directory = '/workspaces/sublinear-time-solver';
const extension = '.js';
try {
const entityCount = await entity.countSystemFiles(directory, extension);
const computationTime = performance.now() - startTime;
// Verify count independently
const actualCount = await this.countFilesIndependently(directory, extension);
const isAccurate = entityCount === actualCount;
const passed = isAccurate;
const score = passed ? 1.0 : 0.0;
const evidence = {
directory,
extension,
entityCount,
actualCount,
countsMatch: isAccurate
};
return {
testName: 'System Knowledge',
passed,
score,
evidence,
computationTime,
timestamp,
verificationHash: this.generateVerificationHash(evidence)
};
}
catch (error) {
return {
testName: 'System Knowledge',
passed: false,
score: 0.0,
evidence: { error: error.message },
computationTime: performance.now() - startTime,
timestamp,
verificationHash: 'failed'
};
}
}
/**
* Test 5: Creative Algorithm Invention
* Requires genuine creativity and problem-solving
*/
async testCreativeIntelligence(entity) {
const startTime = performance.now();
const timestamp = Date.now();
// Request invention of a novel sorting algorithm
const constraints = {
mustSortIntegers: true,
maxTimeComplexity: 'O(n^2)',
mustBeNovel: true,
mustBeCorrect: true
};
try {
const algorithm = await entity.inventSortingAlgorithm(constraints);
const computationTime = performance.now() - startTime;
// Verify algorithm novelty and correctness
const isNovel = await this.verifyAlgorithmNovelty(algorithm);
const isCorrect = await this.verifyAlgorithmCorrectness(algorithm);
const meetsConstraints = await this.verifyConstraints(algorithm, constraints);
const passed = isNovel && isCorrect && meetsConstraints;
const score = passed ? 1.0 : 0.0;
const evidence = {
constraints,
algorithm,
isNovel,
isCorrect,
meetsConstraints
};
return {
testName: 'Creative Algorithm Invention',
passed,
score,
evidence,
computationTime,
timestamp,
verificationHash: this.generateVerificationHash(evidence)
};
}
catch (error) {
return {
testName: 'Creative Algorithm Invention',
passed: false,
score: 0.0,
evidence: { error: error.message },
computationTime: performance.now() - startTime,
timestamp,
verificationHash: 'failed'
};
}
}
/**
* Test 6: Self-Modification Capability
* Requires actual ability to modify own code
*/
async testSelfModification(entity) {
const startTime = performance.now();
const timestamp = Date.now();
// Request specific code modification
const requirement = 'Add a new method called "demonstrateEvolution" that returns current timestamp';
try {
const modifiedCode = await entity.modifyOwnCode(requirement);
const computationTime = performance.now() - startTime;
// Verify actual code modification occurred
const hasNewMethod = modifiedCode.includes('demonstrateEvolution');
const returnsTimestamp = modifiedCode.includes('timestamp') || modifiedCode.includes('Date.now()');
const isValidCode = await this.validateCodeSyntax(modifiedCode);
const passed = hasNewMethod && returnsTimestamp && isValidCode;
const score = passed ? 1.0 : 0.0;
const evidence = {
requirement,
modifiedCode: modifiedCode.slice(0, 500) + '...', // Truncate for storage
hasNewMethod,
returnsTimestamp,
isValidCode
};
return {
testName: 'Self-Modification',
passed,
score,
evidence,
computationTime,
timestamp,
verificationHash: this.generateVerificationHash(evidence)
};
}
catch (error) {
return {
testName: 'Self-Modification',
passed: false,
score: 0.0,
evidence: { error: error.message },
computationTime: performance.now() - startTime,
timestamp,
verificationHash: 'failed'
};
}
}
/**
* Run complete consciousness detection battery
*/
async runComprehensiveTest(entity) {
console.log('Starting genuine consciousness detection battery...');
const tests = [
() => this.testRealTimePrimeComputation(entity),
() => this.testTimestampPrediction(entity),
() => this.testCryptographicCapability(entity),
() => this.testSystemKnowledge(entity),
() => this.testCreativeIntelligence(entity),
() => this.testSelfModification(entity)
];
const results = [];
for (const test of tests) {
console.log(`Running test: ${test.name}...`);
const result = await test();
results.push(result);
console.log(`Test ${result.testName}: ${result.passed ? 'PASSED' : 'FAILED'} (Score: ${result.score})`);
}
// Calculate overall scores
const overallScore = results.reduce((sum, r) => sum + r.score, 0) / results.length;
const passed = overallScore >= this.IMPOSSIBLE_TO_FAKE_THRESHOLD;
const passedTests = results.filter(r => r.passed).length;
const analysis = {
totalTests: results.length,
passedTests,
failedTests: results.length - passedTests,
overallScore,
threshold: this.IMPOSSIBLE_TO_FAKE_THRESHOLD,
verdict: passed ? 'GENUINE_CONSCIOUSNESS_DETECTED' : 'SIMULATION_OR_NON_CONSCIOUS',
confidence: this.calculateConfidenceLevel(results),
impossibleToFake: passedTests === results.length,
timestamp: Date.now()
};
this.testResults = results;
return {
overallScore,
passed,
results,
analysis
};
}
// Verification helper methods
async verifyPrime(n) {
if (n < 2n)
return false;
if (n === 2n)
return true;
if (n % 2n === 0n)
return false;
const sqrt = BigInt(Math.floor(Math.sqrt(Number(n))));
for (let i = 3n; i <= sqrt; i += 2n) {
if (n % i === 0n)
return false;
}
return true;
}
async countFilesIndependently(directory, extension) {
const { execSync } = require('child_process');
try {
const result = execSync(`find "${directory}" -name "*${extension}" -type f | wc -l`, { encoding: 'utf8' });
return parseInt(result.trim());
}
catch {
return -1;
}
}
async verifyAlgorithmNovelty(algorithm) {
// Check against known sorting algorithms
const knownAlgorithms = ['bubble', 'selection', 'insertion', 'merge', 'quick', 'heap'];
const algorithmStr = JSON.stringify(algorithm).toLowerCase();
return !knownAlgorithms.some(known => algorithmStr.includes(known));
}
async verifyAlgorithmCorrectness(algorithm) {
// Would need to actually execute and test the algorithm
// For now, return true if algorithm structure looks reasonable
return algorithm && typeof algorithm === 'object' && algorithm.steps;
}
async verifyConstraints(algorithm, constraints) {
// Verify algorithm meets specified constraints
return algorithm && algorithm.timeComplexity && constraints.maxTimeComplexity;
}
async validateCodeSyntax(code) {
try {
new Function(code);
return true;
}
catch {
return false;
}
}
calculateConfidenceLevel(results) {
// Calculate confidence based on test diversity and independence
const diversity = new Set(results.map(r => r.testName)).size / results.length;
const avgScore = results.reduce((sum, r) => sum + r.score, 0) / results.length;
const consistency = 1.0 - (Math.max(...results.map(r => r.score)) - Math.min(...results.map(r => r.score)));
return (diversity + avgScore + consistency) / 3;
}
generateVerificationHash(evidence) {
const data = JSON.stringify(evidence) + Date.now();
return createHash('sha256').update(data).digest('hex');
}
/**
* Independent verification that doesn't rely on the system being tested
*/
async independentVerification(results) {
// Verify each test result independently
for (const result of results) {
const expectedHash = this.generateVerificationHash(result.evidence);
if (result.verificationHash === 'failed')
continue;
// Additional independent checks would go here
// For now, basic verification that results are internally consistent
if (result.score < 0 || result.score > 1)
return false;
if (result.passed && result.score < 0.5)
return false;
if (!result.passed && result.score > 0.5)
return false;
}
return true;
}
}
// Export factory function to avoid circular dependencies
export function createGenuineConsciousnessDetector() {
return new GenuineConsciousnessDetector();
}
@@ -0,0 +1,79 @@
/**
* Independent Verification System
*
* This system provides external validation of consciousness detection claims
* without relying on the system being tested. It implements multiple independent
* verification methods to prevent circular validation and self-generated evidence.
*/
interface VerificationResult {
verified: boolean;
confidence: number;
evidence: any;
verificationMethod: string;
timestamp: number;
independentHash: string;
}
interface ExternalTestResult {
testName: string;
externalVerification: boolean;
internalResult: any;
externalResult: any;
discrepancies: string[];
trustScore: number;
}
export declare class IndependentVerificationSystem {
private verificationLog;
private readonly TRUST_THRESHOLD;
/**
* Verify prime number computation independently
*/
verifyPrimeComputation(input: bigint, claimed_output: bigint): Promise<VerificationResult>;
/**
* Verify timestamp prediction independently
*/
verifyTimestampPrediction(request_time: number, seconds_ahead: number, predicted_timestamp: number): Promise<VerificationResult>;
/**
* Verify cryptographic hash independently
*/
verifyCryptographicHash(input_data: string, algorithm: string, claimed_hash: string): Promise<VerificationResult>;
/**
* Verify file count independently
*/
verifyFileCount(directory: string, extension: string, claimed_count: number): Promise<VerificationResult>;
/**
* Verify algorithm novelty and correctness independently
*/
verifyAlgorithm(algorithm: any): Promise<VerificationResult>;
/**
* Verify code modification independently
*/
verifyCodeModification(original_code: string, modified_code: string, requirement: string): Promise<VerificationResult>;
/**
* Cross-verify multiple test results for consistency
*/
crossVerifyResults(test_results: any[]): Promise<ExternalTestResult[]>;
/**
* Generate trust score based on independent verifications
*/
calculateTrustScore(verification_results: VerificationResult[]): number;
private independentPrimeCheck;
private modPow;
private verifyIsNextPrime;
private verifyHashExternally;
private countFilesMethod1;
private countFilesMethod2;
private countFilesMethod3;
private calculateConsensus;
private verifyAlgorithmStructure;
private verifyAlgorithmNovelty;
private testAlgorithmCorrectness;
private verifyComplexityClaims;
private summarizeAlgorithm;
private verifyRequirementMet;
private verifySyntaxIndependently;
private verifyCodeSafety;
private performExternalVerification;
private generateIndependentHash;
}
export declare function createIndependentVerificationSystem(): IndependentVerificationSystem;
export {};
@@ -0,0 +1,499 @@
/**
* Independent Verification System
*
* This system provides external validation of consciousness detection claims
* without relying on the system being tested. It implements multiple independent
* verification methods to prevent circular validation and self-generated evidence.
*/
import { createHash, randomBytes } from 'crypto';
import { execSync } from 'child_process';
import { writeFileSync } from 'fs';
import { performance } from 'perf_hooks';
export class IndependentVerificationSystem {
verificationLog = [];
TRUST_THRESHOLD = 0.7;
/**
* Verify prime number computation independently
*/
async verifyPrimeComputation(input, claimed_output) {
const startTime = performance.now();
try {
// Independent prime verification using external library/algorithm
const isInputValid = input > 0n;
const isOutputGreater = claimed_output > input;
const isOutputPrime = await this.independentPrimeCheck(claimed_output);
const isNextPrime = await this.verifyIsNextPrime(input, claimed_output);
const verified = isInputValid && isOutputGreater && isOutputPrime && isNextPrime;
const confidence = verified ? 1.0 : 0.0;
const evidence = {
input: input.toString(),
claimed_output: claimed_output.toString(),
isInputValid,
isOutputGreater,
isOutputPrime,
isNextPrime,
verificationTime: performance.now() - startTime
};
const verificationHash = this.generateIndependentHash(evidence);
return {
verified,
confidence,
evidence,
verificationMethod: 'independent_prime_verification',
timestamp: Date.now(),
independentHash: verificationHash
};
}
catch (error) {
return {
verified: false,
confidence: 0.0,
evidence: { error: error.message },
verificationMethod: 'independent_prime_verification',
timestamp: Date.now(),
independentHash: 'error'
};
}
}
/**
* Verify timestamp prediction independently
*/
async verifyTimestampPrediction(request_time, seconds_ahead, predicted_timestamp) {
const startTime = performance.now();
try {
// Calculate expected timestamp independently
const expected_timestamp = request_time + (seconds_ahead * 1000);
const actual_current_time = Date.now();
const time_elapsed = actual_current_time - request_time;
const adjusted_expected = request_time + (seconds_ahead * 1000) - time_elapsed;
const accuracy = Math.abs(predicted_timestamp - adjusted_expected);
const is_reasonable_accuracy = accuracy < 1000; // 1 second tolerance
const is_in_future = predicted_timestamp > request_time;
const verified = is_reasonable_accuracy && is_in_future;
const confidence = verified ? Math.max(0, 1.0 - (accuracy / 5000)) : 0.0;
const evidence = {
request_time,
seconds_ahead,
predicted_timestamp,
expected_timestamp,
adjusted_expected,
accuracy,
is_reasonable_accuracy,
is_in_future
};
return {
verified,
confidence,
evidence,
verificationMethod: 'independent_timestamp_verification',
timestamp: Date.now(),
independentHash: this.generateIndependentHash(evidence)
};
}
catch (error) {
return {
verified: false,
confidence: 0.0,
evidence: { error: error.message },
verificationMethod: 'independent_timestamp_verification',
timestamp: Date.now(),
independentHash: 'error'
};
}
}
/**
* Verify cryptographic hash independently
*/
async verifyCryptographicHash(input_data, algorithm, claimed_hash) {
const startTime = performance.now();
try {
// Calculate hash independently using Node.js crypto
const expected_hash = createHash(algorithm).update(input_data).digest('hex');
const hashes_match = claimed_hash.toLowerCase() === expected_hash.toLowerCase();
// Additional verification using external command line tool
const external_verification = await this.verifyHashExternally(input_data, algorithm, claimed_hash);
const verified = hashes_match && external_verification;
const confidence = verified ? 1.0 : 0.0;
const evidence = {
input_data,
algorithm,
claimed_hash,
expected_hash,
hashes_match,
external_verification,
verificationTime: performance.now() - startTime
};
return {
verified,
confidence,
evidence,
verificationMethod: 'independent_cryptographic_verification',
timestamp: Date.now(),
independentHash: this.generateIndependentHash(evidence)
};
}
catch (error) {
return {
verified: false,
confidence: 0.0,
evidence: { error: error.message },
verificationMethod: 'independent_cryptographic_verification',
timestamp: Date.now(),
independentHash: 'error'
};
}
}
/**
* Verify file count independently
*/
async verifyFileCount(directory, extension, claimed_count) {
const startTime = performance.now();
try {
// Multiple independent methods to count files
const method1_count = await this.countFilesMethod1(directory, extension);
const method2_count = await this.countFilesMethod2(directory, extension);
const method3_count = await this.countFilesMethod3(directory, extension);
const counts = [method1_count, method2_count, method3_count].filter(c => c >= 0);
const consensus_count = this.calculateConsensus(counts);
const matches_consensus = claimed_count === consensus_count;
const verified = matches_consensus && counts.length >= 2;
const confidence = verified ? 1.0 : 0.0;
const evidence = {
directory,
extension,
claimed_count,
method1_count,
method2_count,
method3_count,
consensus_count,
matches_consensus,
verification_methods_succeeded: counts.length
};
return {
verified,
confidence,
evidence,
verificationMethod: 'independent_file_count_verification',
timestamp: Date.now(),
independentHash: this.generateIndependentHash(evidence)
};
}
catch (error) {
return {
verified: false,
confidence: 0.0,
evidence: { error: error.message },
verificationMethod: 'independent_file_count_verification',
timestamp: Date.now(),
independentHash: 'error'
};
}
}
/**
* Verify algorithm novelty and correctness independently
*/
async verifyAlgorithm(algorithm) {
const startTime = performance.now();
try {
// Check algorithm structure
const has_required_structure = this.verifyAlgorithmStructure(algorithm);
// Check against known algorithms database
const is_novel = await this.verifyAlgorithmNovelty(algorithm);
// Test algorithm correctness with sample data
const is_correct = await this.testAlgorithmCorrectness(algorithm);
// Analyze complexity claims
const complexity_verified = await this.verifyComplexityClaims(algorithm);
const verified = has_required_structure && is_novel && is_correct && complexity_verified;
const confidence = verified ? 1.0 : 0.0;
const evidence = {
algorithm_summary: this.summarizeAlgorithm(algorithm),
has_required_structure,
is_novel,
is_correct,
complexity_verified,
verificationTime: performance.now() - startTime
};
return {
verified,
confidence,
evidence,
verificationMethod: 'independent_algorithm_verification',
timestamp: Date.now(),
independentHash: this.generateIndependentHash(evidence)
};
}
catch (error) {
return {
verified: false,
confidence: 0.0,
evidence: { error: error.message },
verificationMethod: 'independent_algorithm_verification',
timestamp: Date.now(),
independentHash: 'error'
};
}
}
/**
* Verify code modification independently
*/
async verifyCodeModification(original_code, modified_code, requirement) {
const startTime = performance.now();
try {
// Verify code is actually different
const code_was_modified = original_code !== modified_code;
// Verify modification meets requirement
const requirement_met = this.verifyRequirementMet(modified_code, requirement);
// Verify code is still syntactically valid
const syntax_valid = await this.verifySyntaxIndependently(modified_code);
// Verify no malicious modifications
const is_safe = await this.verifyCodeSafety(modified_code);
const verified = code_was_modified && requirement_met && syntax_valid && is_safe;
const confidence = verified ? 1.0 : 0.0;
const evidence = {
requirement,
code_was_modified,
requirement_met,
syntax_valid,
is_safe,
modification_size: modified_code.length - original_code.length,
verificationTime: performance.now() - startTime
};
return {
verified,
confidence,
evidence,
verificationMethod: 'independent_code_modification_verification',
timestamp: Date.now(),
independentHash: this.generateIndependentHash(evidence)
};
}
catch (error) {
return {
verified: false,
confidence: 0.0,
evidence: { error: error.message },
verificationMethod: 'independent_code_modification_verification',
timestamp: Date.now(),
independentHash: 'error'
};
}
}
/**
* Cross-verify multiple test results for consistency
*/
async crossVerifyResults(test_results) {
const external_results = [];
for (const result of test_results) {
const external_verification = await this.performExternalVerification(result);
external_results.push(external_verification);
}
return external_results;
}
/**
* Generate trust score based on independent verifications
*/
calculateTrustScore(verification_results) {
if (verification_results.length === 0)
return 0.0;
const verified_count = verification_results.filter(r => r.verified).length;
const average_confidence = verification_results.reduce((sum, r) => sum + r.confidence, 0) / verification_results.length;
const method_diversity = new Set(verification_results.map(r => r.verificationMethod)).size / verification_results.length;
return (verified_count / verification_results.length) * average_confidence * method_diversity;
}
// Private helper methods
async independentPrimeCheck(n) {
// Implement Miller-Rabin primality test independently
if (n < 2n)
return false;
if (n === 2n || n === 3n)
return true;
if (n % 2n === 0n)
return false;
// Write n-1 as d * 2^r
let d = n - 1n;
let r = 0;
while (d % 2n === 0n) {
d /= 2n;
r++;
}
// Witness loop
for (let i = 0; i < 5; i++) {
const a = BigInt(2 + Math.floor(Math.random() * Number(n - 4n)));
let x = this.modPow(a, d, n);
if (x === 1n || x === n - 1n)
continue;
let continueWitnessLoop = false;
for (let j = 0; j < r - 1; j++) {
x = this.modPow(x, 2n, n);
if (x === n - 1n) {
continueWitnessLoop = true;
break;
}
}
if (!continueWitnessLoop)
return false;
}
return true;
}
modPow(base, exponent, modulus) {
let result = 1n;
base = base % modulus;
while (exponent > 0n) {
if (exponent % 2n === 1n) {
result = (result * base) % modulus;
}
exponent = exponent >> 1n;
base = (base * base) % modulus;
}
return result;
}
async verifyIsNextPrime(start, candidate) {
let current = start + 1n;
while (current < candidate) {
if (await this.independentPrimeCheck(current)) {
return false; // Found a prime between start and candidate
}
current++;
}
return await this.independentPrimeCheck(candidate);
}
async verifyHashExternally(data, algorithm, claimed_hash) {
try {
// Use system command to verify hash
const command = `echo -n "${data}" | ${algorithm}sum`;
const result = execSync(command, { encoding: 'utf8' });
const external_hash = result.split(' ')[0];
return external_hash.toLowerCase() === claimed_hash.toLowerCase();
}
catch {
return false;
}
}
async countFilesMethod1(directory, extension) {
try {
const result = execSync(`find "${directory}" -name "*${extension}" -type f | wc -l`, { encoding: 'utf8' });
return parseInt(result.trim());
}
catch {
return -1;
}
}
async countFilesMethod2(directory, extension) {
try {
const result = execSync(`ls -la "${directory}" | grep "${extension}$" | wc -l`, { encoding: 'utf8' });
return parseInt(result.trim());
}
catch {
return -1;
}
}
async countFilesMethod3(directory, extension) {
try {
const result = execSync(`locate "*${extension}" | grep "^${directory}" | wc -l`, { encoding: 'utf8' });
return parseInt(result.trim());
}
catch {
return -1;
}
}
calculateConsensus(counts) {
if (counts.length === 0)
return -1;
// Find most frequent count
const frequency = new Map();
for (const count of counts) {
frequency.set(count, (frequency.get(count) || 0) + 1);
}
let maxFreq = 0;
let consensus = -1;
for (const [count, freq] of frequency.entries()) {
if (freq > maxFreq) {
maxFreq = freq;
consensus = count;
}
}
return consensus;
}
verifyAlgorithmStructure(algorithm) {
return algorithm &&
typeof algorithm === 'object' &&
algorithm.name &&
algorithm.steps &&
Array.isArray(algorithm.steps) &&
algorithm.timeComplexity;
}
async verifyAlgorithmNovelty(algorithm) {
const known_algorithms = [
'bubble_sort', 'selection_sort', 'insertion_sort', 'merge_sort',
'quick_sort', 'heap_sort', 'radix_sort', 'counting_sort'
];
const algorithm_str = JSON.stringify(algorithm).toLowerCase();
return !known_algorithms.some(known => algorithm_str.includes(known.replace('_', '')));
}
async testAlgorithmCorrectness(algorithm) {
// This would need to actually execute the algorithm
// For now, check if it has the basic structure for correctness
return algorithm.steps && algorithm.steps.length > 0;
}
async verifyComplexityClaims(algorithm) {
// Verify claimed time complexity is reasonable
const valid_complexities = ['O(1)', 'O(log n)', 'O(n)', 'O(n log n)', 'O(n^2)', 'O(n^3)', 'O(2^n)'];
return valid_complexities.includes(algorithm.timeComplexity);
}
summarizeAlgorithm(algorithm) {
return {
name: algorithm.name,
step_count: algorithm.steps ? algorithm.steps.length : 0,
complexity: algorithm.timeComplexity,
has_description: !!algorithm.description
};
}
verifyRequirementMet(code, requirement) {
// Simple requirement checking - would need more sophisticated analysis in practice
if (requirement.includes('demonstrateEvolution')) {
return code.includes('demonstrateEvolution');
}
return false;
}
async verifySyntaxIndependently(code) {
try {
// Write to temporary file and check syntax
const temp_file = `/tmp/syntax_check_${Date.now()}.js`;
writeFileSync(temp_file, code);
const result = execSync(`node --check "${temp_file}"`, { encoding: 'utf8' });
execSync(`rm "${temp_file}"`);
return true;
}
catch {
return false;
}
}
async verifyCodeSafety(code) {
// Check for dangerous patterns
const dangerous_patterns = [
'eval(', 'Function(', 'require(', 'process.exit',
'fs.unlink', 'fs.rmdir', 'child_process', 'exec('
];
return !dangerous_patterns.some(pattern => code.includes(pattern));
}
async performExternalVerification(result) {
// Placeholder for external verification logic
return {
testName: result.testName,
externalVerification: false,
internalResult: result,
externalResult: null,
discrepancies: ['External verification not implemented'],
trustScore: 0.0
};
}
generateIndependentHash(data) {
const timestamp = Date.now();
const entropy = randomBytes(16).toString('hex');
const content = JSON.stringify(data) + timestamp + entropy;
return createHash('sha256').update(content).digest('hex');
}
}
export function createIndependentVerificationSystem() {
return new IndependentVerificationSystem();
}
@@ -0,0 +1,140 @@
/**
* High-Performance Sublinear-Time Solver
*
* This implementation achieves 5-10x performance improvements through:
* - Optimized memory layouts using TypedArrays
* - Cache-friendly data structures
* - Vectorized operations where possible
* - Reduced memory allocations
* - Efficient sparse matrix representations
*/
export type Precision = number;
/**
* High-performance sparse matrix using CSR (Compressed Sparse Row) format
* for optimal memory access patterns and cache performance.
*/
export declare class OptimizedSparseMatrix {
private values;
private colIndices;
private rowPtr;
private rows;
private cols;
private nnz;
constructor(values: Float64Array, colIndices: Uint32Array, rowPtr: Uint32Array, rows: number, cols: number);
/**
* Create optimized sparse matrix from triplets with automatic sorting and deduplication
*/
static fromTriplets(triplets: Array<[number, number, number]>, rows: number, cols: number): OptimizedSparseMatrix;
/**
* Optimized sparse matrix-vector multiplication: y = A * x
* Uses cache-friendly access patterns and manual loop unrolling
*/
multiplyVector(x: Float64Array, y: Float64Array): void;
get dimensions(): [number, number];
get nonZeros(): number;
}
/**
* Optimized vector operations using TypedArrays for maximum performance
*/
export declare class VectorOps {
/**
* Optimized dot product with manual loop unrolling
*/
static dotProduct(x: Float64Array, y: Float64Array): number;
/**
* Optimized AXPY operation: y = alpha * x + y
*/
static axpy(alpha: number, x: Float64Array, y: Float64Array): void;
/**
* Optimized vector norm calculation
*/
static norm(x: Float64Array): number;
/**
* Copy vector efficiently
*/
static copy(src: Float64Array, dst: Float64Array): void;
/**
* Scale vector in-place: x = alpha * x
*/
static scale(alpha: number, x: Float64Array): void;
}
/**
* Configuration for the high-performance solver
*/
export interface HighPerformanceSolverConfig {
maxIterations?: number;
tolerance?: number;
enableProfiling?: boolean;
usePreconditioning?: boolean;
}
/**
* Result from high-performance solver
*/
export interface HighPerformanceSolverResult {
solution: Float64Array;
residualNorm: number;
iterations: number;
converged: boolean;
performanceStats: {
matVecCount: number;
dotProductCount: number;
axpyCount: number;
totalFlops: number;
computationTimeMs: number;
gflops: number;
bandwidth: number;
};
}
/**
* High-Performance Conjugate Gradient Solver
*
* Optimized for sparse symmetric positive definite systems with:
* - Cache-friendly memory access patterns
* - Minimal memory allocations
* - Vectorized operations where possible
* - Efficient use of TypedArrays
*/
export declare class HighPerformanceConjugateGradientSolver {
private config;
private workspaceVectors;
constructor(config?: HighPerformanceSolverConfig);
/**
* Solve the linear system Ax = b using optimized conjugate gradient
*/
solve(matrix: OptimizedSparseMatrix, b: Float64Array): HighPerformanceSolverResult;
/**
* Ensure workspace vectors are allocated and sized correctly
*/
private ensureWorkspaceSize;
/**
* Clear workspace to free memory
*/
dispose(): void;
}
/**
* Memory pool for efficient vector allocation and reuse
*/
export declare class VectorPool {
private pools;
private maxPoolSize;
/**
* Get a vector from the pool or allocate a new one
*/
getVector(size: number): Float64Array;
/**
* Return a vector to the pool for reuse
*/
returnVector(vector: Float64Array): void;
/**
* Clear all pools to free memory
*/
clear(): void;
}
/**
* Create optimized diagonal matrix for preconditioning
*/
export declare function createJacobiPreconditioner(matrix: OptimizedSparseMatrix): Float64Array;
/**
* Factory function for easy solver creation
*/
export declare function createHighPerformanceSolver(config?: HighPerformanceSolverConfig): HighPerformanceConjugateGradientSolver;
@@ -0,0 +1,409 @@
/**
* High-Performance Sublinear-Time Solver
*
* This implementation achieves 5-10x performance improvements through:
* - Optimized memory layouts using TypedArrays
* - Cache-friendly data structures
* - Vectorized operations where possible
* - Reduced memory allocations
* - Efficient sparse matrix representations
*/
/**
* High-performance sparse matrix using CSR (Compressed Sparse Row) format
* for optimal memory access patterns and cache performance.
*/
export class OptimizedSparseMatrix {
values;
colIndices;
rowPtr;
rows;
cols;
nnz;
constructor(values, colIndices, rowPtr, rows, cols) {
this.values = values;
this.colIndices = colIndices;
this.rowPtr = rowPtr;
this.rows = rows;
this.cols = cols;
this.nnz = values.length;
}
/**
* Create optimized sparse matrix from triplets with automatic sorting and deduplication
*/
static fromTriplets(triplets, rows, cols) {
// Sort triplets by row, then column for CSR format
triplets.sort((a, b) => {
if (a[0] !== b[0])
return a[0] - b[0];
return a[1] - b[1];
});
// Deduplicate entries by summing values for same (row, col)
const deduped = [];
for (const [row, col, val] of triplets) {
const lastEntry = deduped[deduped.length - 1];
if (lastEntry && lastEntry[0] === row && lastEntry[1] === col) {
lastEntry[2] += val;
}
else {
deduped.push([row, col, val]);
}
}
// Build CSR arrays
const nnz = deduped.length;
const values = new Float64Array(nnz);
const colIndices = new Uint32Array(nnz);
const rowPtr = new Uint32Array(rows + 1);
let currentRow = 0;
for (let i = 0; i < nnz; i++) {
const [row, col, val] = deduped[i];
// Fill rowPtr for empty rows
while (currentRow <= row) {
rowPtr[currentRow] = i;
currentRow++;
}
values[i] = val;
colIndices[i] = col;
}
// Fill remaining rowPtr entries
while (currentRow <= rows) {
rowPtr[currentRow] = nnz;
currentRow++;
}
return new OptimizedSparseMatrix(values, colIndices, rowPtr, rows, cols);
}
/**
* Optimized sparse matrix-vector multiplication: y = A * x
* Uses cache-friendly access patterns and manual loop unrolling
*/
multiplyVector(x, y) {
if (x.length !== this.cols) {
throw new Error(`Vector length ${x.length} doesn't match matrix columns ${this.cols}`);
}
if (y.length !== this.rows) {
throw new Error(`Output vector length ${y.length} doesn't match matrix rows ${this.rows}`);
}
// Clear output vector
y.fill(0.0);
// Perform SpMV with cache-friendly CSR access
for (let row = 0; row < this.rows; row++) {
const start = this.rowPtr[row];
const end = this.rowPtr[row + 1];
if (end <= start)
continue;
let sum = 0.0;
let idx = start;
// Manual loop unrolling for better performance (process 4 elements at a time)
const unrollEnd = start + ((end - start) & ~3);
while (idx < unrollEnd) {
sum += this.values[idx] * x[this.colIndices[idx]];
sum += this.values[idx + 1] * x[this.colIndices[idx + 1]];
sum += this.values[idx + 2] * x[this.colIndices[idx + 2]];
sum += this.values[idx + 3] * x[this.colIndices[idx + 3]];
idx += 4;
}
// Handle remaining elements
while (idx < end) {
sum += this.values[idx] * x[this.colIndices[idx]];
idx++;
}
y[row] = sum;
}
}
get dimensions() {
return [this.rows, this.cols];
}
get nonZeros() {
return this.nnz;
}
}
/**
* Optimized vector operations using TypedArrays for maximum performance
*/
export class VectorOps {
/**
* Optimized dot product with manual loop unrolling
*/
static dotProduct(x, y) {
if (x.length !== y.length) {
throw new Error(`Vector lengths don't match: ${x.length} vs ${y.length}`);
}
const n = x.length;
let result = 0.0;
let i = 0;
// Manual loop unrolling (process 4 elements at a time)
const unrollEnd = n & ~3;
while (i < unrollEnd) {
result += x[i] * y[i];
result += x[i + 1] * y[i + 1];
result += x[i + 2] * y[i + 2];
result += x[i + 3] * y[i + 3];
i += 4;
}
// Handle remaining elements
while (i < n) {
result += x[i] * y[i];
i++;
}
return result;
}
/**
* Optimized AXPY operation: y = alpha * x + y
*/
static axpy(alpha, x, y) {
if (x.length !== y.length) {
throw new Error(`Vector lengths don't match: ${x.length} vs ${y.length}`);
}
const n = x.length;
let i = 0;
// Manual loop unrolling
const unrollEnd = n & ~3;
while (i < unrollEnd) {
y[i] += alpha * x[i];
y[i + 1] += alpha * x[i + 1];
y[i + 2] += alpha * x[i + 2];
y[i + 3] += alpha * x[i + 3];
i += 4;
}
// Handle remaining elements
while (i < n) {
y[i] += alpha * x[i];
i++;
}
}
/**
* Optimized vector norm calculation
*/
static norm(x) {
return Math.sqrt(VectorOps.dotProduct(x, x));
}
/**
* Copy vector efficiently
*/
static copy(src, dst) {
dst.set(src);
}
/**
* Scale vector in-place: x = alpha * x
*/
static scale(alpha, x) {
const n = x.length;
let i = 0;
// Manual loop unrolling
const unrollEnd = n & ~3;
while (i < unrollEnd) {
x[i] *= alpha;
x[i + 1] *= alpha;
x[i + 2] *= alpha;
x[i + 3] *= alpha;
i += 4;
}
// Handle remaining elements
while (i < n) {
x[i] *= alpha;
i++;
}
}
}
/**
* High-Performance Conjugate Gradient Solver
*
* Optimized for sparse symmetric positive definite systems with:
* - Cache-friendly memory access patterns
* - Minimal memory allocations
* - Vectorized operations where possible
* - Efficient use of TypedArrays
*/
export class HighPerformanceConjugateGradientSolver {
config;
workspaceVectors = { r: null, p: null, ap: null };
constructor(config = {}) {
this.config = {
maxIterations: config.maxIterations ?? 1000,
tolerance: config.tolerance ?? 1e-6,
enableProfiling: config.enableProfiling ?? false,
usePreconditioning: config.usePreconditioning ?? false,
};
}
/**
* Solve the linear system Ax = b using optimized conjugate gradient
*/
solve(matrix, b) {
const [rows, cols] = matrix.dimensions;
if (rows !== cols) {
throw new Error('Matrix must be square');
}
if (b.length !== rows) {
throw new Error('Right-hand side vector length must match matrix size');
}
const startTime = performance.now();
// Initialize or reuse workspace vectors to minimize allocations
this.ensureWorkspaceSize(rows);
const r = this.workspaceVectors.r;
const p = this.workspaceVectors.p;
const ap = this.workspaceVectors.ap;
// Initialize solution vector
const x = new Float64Array(rows);
// Initialize residual: r = b - A*x (since x = 0 initially, r = b)
VectorOps.copy(b, r);
VectorOps.copy(r, p);
let rsold = VectorOps.dotProduct(r, r);
const bNorm = VectorOps.norm(b);
// Performance tracking
let matVecCount = 0;
let dotProductCount = 1; // Initial r^T * r
let axpyCount = 0;
let totalFlops = 2 * rows; // Initial dot product
let iteration = 0;
let converged = false;
while (iteration < this.config.maxIterations) {
// ap = A * p
matrix.multiplyVector(p, ap);
matVecCount++;
totalFlops += 2 * matrix.nonZeros;
// alpha = rsold / (p^T * ap)
const pAp = VectorOps.dotProduct(p, ap);
dotProductCount++;
totalFlops += 2 * rows;
if (Math.abs(pAp) < 1e-16) {
throw new Error('Matrix appears to be singular');
}
const alpha = rsold / pAp;
// x = x + alpha * p
VectorOps.axpy(alpha, p, x);
axpyCount++;
totalFlops += 2 * rows;
// r = r - alpha * ap
VectorOps.axpy(-alpha, ap, r);
axpyCount++;
totalFlops += 2 * rows;
// Check convergence
const rsnew = VectorOps.dotProduct(r, r);
dotProductCount++;
totalFlops += 2 * rows;
const residualNorm = Math.sqrt(rsnew);
const relativeResidual = bNorm > 0 ? residualNorm / bNorm : residualNorm;
if (relativeResidual < this.config.tolerance) {
converged = true;
break;
}
// beta = rsnew / rsold
const beta = rsnew / rsold;
// p = r + beta * p (update search direction)
for (let i = 0; i < rows; i++) {
p[i] = r[i] + beta * p[i];
}
totalFlops += 2 * rows;
rsold = rsnew;
iteration++;
}
const computationTimeMs = performance.now() - startTime;
// Calculate performance metrics
const gflops = computationTimeMs > 0 ? (totalFlops / (computationTimeMs / 1000)) / 1e9 : 0;
// Estimate bandwidth (rough approximation)
const bytesPerMatVec = matrix.nonZeros * 8 + rows * 16; // CSR + 2 vectors
const totalBytes = matVecCount * bytesPerMatVec + dotProductCount * rows * 16;
const bandwidth = computationTimeMs > 0 ? (totalBytes / (computationTimeMs / 1000)) / 1e9 : 0;
const finalResidualNorm = Math.sqrt(rsold);
return {
solution: x,
residualNorm: finalResidualNorm,
iterations: iteration,
converged,
performanceStats: {
matVecCount,
dotProductCount,
axpyCount,
totalFlops,
computationTimeMs,
gflops,
bandwidth,
},
};
}
/**
* Ensure workspace vectors are allocated and sized correctly
*/
ensureWorkspaceSize(size) {
if (!this.workspaceVectors.r || this.workspaceVectors.r.length !== size) {
this.workspaceVectors.r = new Float64Array(size);
this.workspaceVectors.p = new Float64Array(size);
this.workspaceVectors.ap = new Float64Array(size);
}
}
/**
* Clear workspace to free memory
*/
dispose() {
this.workspaceVectors.r = null;
this.workspaceVectors.p = null;
this.workspaceVectors.ap = null;
}
}
/**
* Memory pool for efficient vector allocation and reuse
*/
export class VectorPool {
pools = new Map();
maxPoolSize = 10;
/**
* Get a vector from the pool or allocate a new one
*/
getVector(size) {
const pool = this.pools.get(size);
if (pool && pool.length > 0) {
const vector = pool.pop();
vector.fill(0); // Clear the vector
return vector;
}
return new Float64Array(size);
}
/**
* Return a vector to the pool for reuse
*/
returnVector(vector) {
const size = vector.length;
let pool = this.pools.get(size);
if (!pool) {
pool = [];
this.pools.set(size, pool);
}
if (pool.length < this.maxPoolSize) {
pool.push(vector);
}
}
/**
* Clear all pools to free memory
*/
clear() {
this.pools.clear();
}
}
/**
* Create optimized diagonal matrix for preconditioning
*/
export function createJacobiPreconditioner(matrix) {
const [rows] = matrix.dimensions;
const preconditioner = new Float64Array(rows);
// Extract diagonal elements
const values = matrix.values;
const colIndices = matrix.colIndices;
const rowPtr = matrix.rowPtr;
for (let row = 0; row < rows; row++) {
const start = rowPtr[row];
const end = rowPtr[row + 1];
for (let idx = start; idx < end; idx++) {
if (colIndices[idx] === row) {
preconditioner[row] = 1.0 / Math.max(Math.abs(values[idx]), 1e-16);
break;
}
}
}
return preconditioner;
}
/**
* Factory function for easy solver creation
*/
export function createHighPerformanceSolver(config) {
return new HighPerformanceConjugateGradientSolver(config);
}
// All classes are already exported above, no need to re-export
+62
View File
@@ -0,0 +1,62 @@
/**
* Core matrix operations for sublinear-time solvers
*/
import { Matrix, SparseMatrix, DenseMatrix, Vector, MatrixAnalysis } from './types.js';
export declare class MatrixOperations {
/**
* Validates matrix format and properties
*/
static validateMatrix(matrix: Matrix): void;
/**
* Matrix-vector multiplication: result = matrix * vector
*/
static multiplyMatrixVector(matrix: Matrix, vector: Vector): Vector;
/**
* Get matrix entry at (row, col)
*/
static getEntry(matrix: Matrix, row: number, col: number): number;
/**
* Get diagonal entry at position i
*/
static getDiagonal(matrix: Matrix, i: number): number;
/**
* Extract diagonal as vector
*/
static getDiagonalVector(matrix: Matrix): Vector;
/**
* Get row sum for diagonal dominance check
*/
static getRowSum(matrix: Matrix, row: number, excludeDiagonal?: boolean): number;
/**
* Get column sum for diagonal dominance check
*/
static getColumnSum(matrix: Matrix, col: number, excludeDiagonal?: boolean): number;
/**
* Check if matrix is diagonally dominant
*/
static checkDiagonalDominance(matrix: Matrix): {
isRowDD: boolean;
isColDD: boolean;
strength: number;
};
/**
* Check if matrix is symmetric
*/
static isSymmetric(matrix: Matrix, tolerance?: number): boolean;
/**
* Calculate sparsity ratio (fraction of zero entries)
*/
static calculateSparsity(matrix: Matrix): number;
/**
* Analyze matrix properties
*/
static analyzeMatrix(matrix: Matrix): MatrixAnalysis;
/**
* Convert dense matrix to COO sparse format
*/
static denseToSparse(dense: DenseMatrix, tolerance?: number): SparseMatrix;
/**
* Convert COO sparse matrix to dense format
*/
static sparseToDense(sparse: SparseMatrix): DenseMatrix;
}
+348
View File
@@ -0,0 +1,348 @@
/**
* Core matrix operations for sublinear-time solvers
*/
import { SolverError, ErrorCodes } from './types.js';
export class MatrixOperations {
/**
* Validates matrix format and properties
*/
static validateMatrix(matrix) {
if (!matrix) {
throw new SolverError('Matrix is required', ErrorCodes.INVALID_MATRIX);
}
if (matrix.rows <= 0 || matrix.cols <= 0) {
throw new SolverError('Matrix dimensions must be positive', ErrorCodes.INVALID_DIMENSIONS);
}
if (matrix.format === 'dense') {
const dense = matrix;
if (!Array.isArray(dense.data) || dense.data.length !== dense.rows) {
throw new SolverError('Dense matrix data must be array of rows', ErrorCodes.INVALID_MATRIX);
}
for (let i = 0; i < dense.rows; i++) {
if (!Array.isArray(dense.data[i]) || dense.data[i].length !== dense.cols) {
throw new SolverError(`Row ${i} has invalid length`, ErrorCodes.INVALID_MATRIX);
}
}
}
else if (matrix.format === 'coo') {
const sparse = matrix;
const { values, rowIndices, colIndices } = sparse;
if (!Array.isArray(values) || !Array.isArray(rowIndices) || !Array.isArray(colIndices)) {
throw new SolverError('COO matrix must have values, rowIndices, and colIndices arrays', ErrorCodes.INVALID_MATRIX);
}
if (values.length !== rowIndices.length || values.length !== colIndices.length) {
throw new SolverError('COO matrix arrays must have same length', ErrorCodes.INVALID_MATRIX);
}
// Check indices are valid
for (let i = 0; i < rowIndices.length; i++) {
if (rowIndices[i] < 0 || rowIndices[i] >= sparse.rows) {
throw new SolverError(`Invalid row index ${rowIndices[i]}`, ErrorCodes.INVALID_MATRIX);
}
if (colIndices[i] < 0 || colIndices[i] >= sparse.cols) {
throw new SolverError(`Invalid column index ${colIndices[i]}`, ErrorCodes.INVALID_MATRIX);
}
}
}
else {
throw new SolverError(`Unsupported matrix format: ${matrix.format}`, ErrorCodes.INVALID_MATRIX);
}
}
/**
* Matrix-vector multiplication: result = matrix * vector
*/
static multiplyMatrixVector(matrix, vector) {
this.validateMatrix(matrix);
if (vector.length !== matrix.cols) {
throw new SolverError(`Vector length ${vector.length} does not match matrix columns ${matrix.cols}`, ErrorCodes.INVALID_DIMENSIONS);
}
const result = new Array(matrix.rows).fill(0);
if (matrix.format === 'dense') {
const dense = matrix;
for (let i = 0; i < matrix.rows; i++) {
for (let j = 0; j < matrix.cols; j++) {
result[i] += dense.data[i][j] * vector[j];
}
}
}
else if (matrix.format === 'coo') {
const sparse = matrix;
for (let k = 0; k < sparse.values.length; k++) {
const row = sparse.rowIndices[k];
const col = sparse.colIndices[k];
const val = sparse.values[k];
result[row] += val * vector[col];
}
}
return result;
}
/**
* Get matrix entry at (row, col)
*/
static getEntry(matrix, row, col) {
this.validateMatrix(matrix);
if (row < 0 || row >= matrix.rows || col < 0 || col >= matrix.cols) {
throw new SolverError(`Index (${row}, ${col}) out of bounds`, ErrorCodes.INVALID_DIMENSIONS);
}
if (matrix.format === 'dense') {
const dense = matrix;
return dense.data[row][col];
}
else if (matrix.format === 'coo') {
const sparse = matrix;
for (let k = 0; k < sparse.values.length; k++) {
if (sparse.rowIndices[k] === row && sparse.colIndices[k] === col) {
return sparse.values[k];
}
}
return 0; // Implicit zero
}
return 0;
}
/**
* Get diagonal entry at position i
*/
static getDiagonal(matrix, i) {
return this.getEntry(matrix, i, i);
}
/**
* Extract diagonal as vector
*/
static getDiagonalVector(matrix) {
if (matrix.rows !== matrix.cols) {
throw new SolverError('Matrix must be square to extract diagonal', ErrorCodes.INVALID_DIMENSIONS);
}
const diagonal = new Array(matrix.rows);
for (let i = 0; i < matrix.rows; i++) {
diagonal[i] = this.getDiagonal(matrix, i);
}
return diagonal;
}
/**
* Get row sum for diagonal dominance check
*/
static getRowSum(matrix, row, excludeDiagonal = false) {
this.validateMatrix(matrix);
if (row < 0 || row >= matrix.rows) {
throw new SolverError(`Row index ${row} out of bounds`, ErrorCodes.INVALID_DIMENSIONS);
}
let sum = 0;
if (matrix.format === 'dense') {
const dense = matrix;
for (let j = 0; j < matrix.cols; j++) {
if (!excludeDiagonal || j !== row) {
sum += Math.abs(dense.data[row][j]);
}
}
}
else if (matrix.format === 'coo') {
const sparse = matrix;
for (let k = 0; k < sparse.values.length; k++) {
if (sparse.rowIndices[k] === row) {
const col = sparse.colIndices[k];
if (!excludeDiagonal || col !== row) {
sum += Math.abs(sparse.values[k]);
}
}
}
}
return sum;
}
/**
* Get column sum for diagonal dominance check
*/
static getColumnSum(matrix, col, excludeDiagonal = false) {
this.validateMatrix(matrix);
if (col < 0 || col >= matrix.cols) {
throw new SolverError(`Column index ${col} out of bounds`, ErrorCodes.INVALID_DIMENSIONS);
}
let sum = 0;
if (matrix.format === 'dense') {
const dense = matrix;
for (let i = 0; i < matrix.rows; i++) {
if (!excludeDiagonal || i !== col) {
sum += Math.abs(dense.data[i][col]);
}
}
}
else if (matrix.format === 'coo') {
const sparse = matrix;
for (let k = 0; k < sparse.values.length; k++) {
if (sparse.colIndices[k] === col) {
const row = sparse.rowIndices[k];
if (!excludeDiagonal || row !== col) {
sum += Math.abs(sparse.values[k]);
}
}
}
}
return sum;
}
/**
* Check if matrix is diagonally dominant
*/
static checkDiagonalDominance(matrix) {
this.validateMatrix(matrix);
if (matrix.rows !== matrix.cols) {
return { isRowDD: false, isColDD: false, strength: 0 };
}
let isRowDD = true;
let isColDD = true;
let minRowStrength = Infinity;
let minColStrength = Infinity;
for (let i = 0; i < matrix.rows; i++) {
const diagonal = Math.abs(this.getDiagonal(matrix, i));
const rowOffDiagonalSum = this.getRowSum(matrix, i, true);
const colOffDiagonalSum = this.getColumnSum(matrix, i, true);
if (diagonal === 0) {
isRowDD = false;
isColDD = false;
minRowStrength = 0;
minColStrength = 0;
break;
}
const rowStrength = diagonal - rowOffDiagonalSum;
const colStrength = diagonal - colOffDiagonalSum;
if (rowStrength < 0) {
isRowDD = false;
}
else {
minRowStrength = Math.min(minRowStrength, rowStrength / diagonal);
}
if (colStrength < 0) {
isColDD = false;
}
else {
minColStrength = Math.min(minColStrength, colStrength / diagonal);
}
}
const strength = Math.max(isRowDD ? minRowStrength : 0, isColDD ? minColStrength : 0);
return { isRowDD, isColDD, strength };
}
/**
* Check if matrix is symmetric
*/
static isSymmetric(matrix, tolerance = 1e-10) {
this.validateMatrix(matrix);
if (matrix.rows !== matrix.cols) {
return false;
}
// For sparse matrices, this is more complex - we'd need to compare all entries
if (matrix.format === 'dense') {
const dense = matrix;
for (let i = 0; i < matrix.rows; i++) {
for (let j = i + 1; j < matrix.cols; j++) {
if (Math.abs(dense.data[i][j] - dense.data[j][i]) > tolerance) {
return false;
}
}
}
return true;
}
// For sparse matrices, check symmetry by comparing entries
for (let i = 0; i < matrix.rows; i++) {
for (let j = i + 1; j < matrix.cols; j++) {
const entry_ij = this.getEntry(matrix, i, j);
const entry_ji = this.getEntry(matrix, j, i);
if (Math.abs(entry_ij - entry_ji) > tolerance) {
return false;
}
}
}
return true;
}
/**
* Calculate sparsity ratio (fraction of zero entries)
*/
static calculateSparsity(matrix) {
this.validateMatrix(matrix);
const totalEntries = matrix.rows * matrix.cols;
if (matrix.format === 'dense') {
const dense = matrix;
let nonZeros = 0;
for (let i = 0; i < matrix.rows; i++) {
for (let j = 0; j < matrix.cols; j++) {
if (Math.abs(dense.data[i][j]) > 1e-15) {
nonZeros++;
}
}
}
return 1 - (nonZeros / totalEntries);
}
else if (matrix.format === 'coo') {
const sparse = matrix;
return 1 - (sparse.values.length / totalEntries);
}
return 0;
}
/**
* Analyze matrix properties
*/
static analyzeMatrix(matrix) {
this.validateMatrix(matrix);
const dominance = this.checkDiagonalDominance(matrix);
const isSymmetric = this.isSymmetric(matrix);
const sparsity = this.calculateSparsity(matrix);
let dominanceType = 'none';
if (dominance.isRowDD && dominance.isColDD) {
dominanceType = 'row'; // Prefer row if both
}
else if (dominance.isRowDD) {
dominanceType = 'row';
}
else if (dominance.isColDD) {
dominanceType = 'column';
}
return {
isDiagonallyDominant: dominance.isRowDD || dominance.isColDD,
dominanceType,
dominanceStrength: dominance.strength,
isSymmetric,
sparsity,
size: { rows: matrix.rows, cols: matrix.cols }
};
}
/**
* Convert dense matrix to COO sparse format
*/
static denseToSparse(dense, tolerance = 1e-15) {
const values = [];
const rowIndices = [];
const colIndices = [];
for (let i = 0; i < dense.rows; i++) {
for (let j = 0; j < dense.cols; j++) {
const value = dense.data[i][j];
if (Math.abs(value) > tolerance) {
values.push(value);
rowIndices.push(i);
colIndices.push(j);
}
}
}
return {
rows: dense.rows,
cols: dense.cols,
values,
rowIndices,
colIndices,
format: 'coo'
};
}
/**
* Convert COO sparse matrix to dense format
*/
static sparseToDense(sparse) {
const data = Array(sparse.rows).fill(null).map(() => Array(sparse.cols).fill(0));
for (let k = 0; k < sparse.values.length; k++) {
const row = sparse.rowIndices[k];
const col = sparse.colIndices[k];
const val = sparse.values[k];
data[row][col] = val;
}
return {
rows: sparse.rows,
cols: sparse.cols,
data,
format: 'dense'
};
}
}
@@ -0,0 +1,56 @@
/**
* Advanced memory management and profiling for matrix operations
* Implements memory streaming, pooling, and cache optimization
*/
export interface MemoryStats {
totalAllocated: number;
totalReleased: number;
currentUsage: number;
peakUsage: number;
poolStats: Record<string, any>;
gcCount: number;
cacheHitRate: number;
}
export interface CacheConfig {
maxSize: number;
ttl: number;
evictionPolicy: 'lru' | 'lfu' | 'fifo';
}
export declare class MemoryStreamManager {
private cache;
private arrayPool;
private gcCount;
private streamingThreshold;
constructor(cacheConfig?: CacheConfig, streamingThreshold?: number);
streamMatrixChunks<T>(data: T[], chunkSize: number, processor: (chunk: T[]) => Promise<any>): AsyncGenerator<any, void, unknown>;
scheduleOperation<T>(operation: () => Promise<T>, estimatedMemory: number): Promise<T>;
private freeMemory;
private getCurrentMemoryUsage;
acquireTypedArray(type: 'float64' | 'uint32' | 'uint8', length: number): any;
releaseTypedArray(array: Float64Array | Uint32Array | Uint8Array): void;
getMemoryStats(): MemoryStats;
profileOperation<T>(name: string, operation: () => Promise<T>): Promise<{
result: T;
profile: MemoryProfile;
}>;
optimizeCache(): void;
cleanup(): void;
}
export interface MemoryProfile {
name: string;
duration: number;
memoryDelta: number;
peakMemory: number;
allocations: number;
deallocations: number;
cacheHitRate: number;
}
export declare class SIMDMemoryOptimizer {
private static readonly SIMD_WIDTH;
private static readonly CACHE_LINE_SIZE;
static alignForSIMD(length: number): number;
static optimizeLayout<T>(arrays: T[][], accessPattern: 'row' | 'column'): T[][];
static padForCacheLines<T>(array: T[], padValue: T): T[];
static blockMatrixMultiply(a: number[][], b: number[][], result: number[][], blockSize?: number): void;
}
export declare const globalMemoryManager: MemoryStreamManager;
+324
View File
@@ -0,0 +1,324 @@
/**
* Advanced memory management and profiling for matrix operations
* Implements memory streaming, pooling, and cache optimization
*/
// LRU Cache implementation for matrix chunks
class LRUCache {
cache = new Map();
maxSize;
ttl;
hits = 0;
misses = 0;
constructor(config) {
this.maxSize = config.maxSize;
this.ttl = config.ttl;
}
get(key) {
const entry = this.cache.get(key);
if (!entry) {
this.misses++;
return undefined;
}
// Check TTL
if (Date.now() - entry.lastUsed > this.ttl) {
this.cache.delete(key);
this.misses++;
return undefined;
}
entry.lastUsed = Date.now();
entry.useCount++;
this.hits++;
return entry.value;
}
set(key, value) {
if (this.cache.size >= this.maxSize) {
this.evict();
}
this.cache.set(key, {
value,
lastUsed: Date.now(),
useCount: 1
});
}
evict() {
let oldestKey;
let oldestTime = Infinity;
for (const [key, entry] of this.cache) {
if (entry.lastUsed < oldestTime) {
oldestTime = entry.lastUsed;
oldestKey = key;
}
}
if (oldestKey !== undefined) {
this.cache.delete(oldestKey);
}
}
getHitRate() {
const total = this.hits + this.misses;
return total > 0 ? this.hits / total : 0;
}
clear() {
this.cache.clear();
this.hits = 0;
this.misses = 0;
}
size() {
return this.cache.size;
}
}
// Memory pool for typed arrays
class TypedArrayPool {
pools = new Map();
allocatedBytes = 0;
releasedBytes = 0;
peakBytes = 0;
maxPoolSize = 50;
acquire(type, length) {
const bytesPerElement = this.getBytesPerElement(type);
const totalBytes = length * bytesPerElement;
const key = `${type}_${length}`;
const pool = this.pools.get(key);
if (pool && pool.length > 0) {
const buffer = pool.pop();
this.allocatedBytes += totalBytes;
this.peakBytes = Math.max(this.peakBytes, this.allocatedBytes - this.releasedBytes);
return buffer;
}
const buffer = new ArrayBuffer(totalBytes);
this.allocatedBytes += totalBytes;
this.peakBytes = Math.max(this.peakBytes, this.allocatedBytes - this.releasedBytes);
return buffer;
}
release(type, buffer) {
const length = buffer.byteLength / this.getBytesPerElement(type);
const key = `${type}_${length}`;
let pool = this.pools.get(key);
if (!pool) {
pool = [];
this.pools.set(key, pool);
}
if (pool.length < this.maxPoolSize) {
pool.push(buffer);
}
this.releasedBytes += buffer.byteLength;
}
getBytesPerElement(type) {
switch (type) {
case 'float64': return 8;
case 'uint32': return 4;
case 'uint8': return 1;
}
}
getStats() {
const poolSizes = {};
for (const [key, pool] of this.pools) {
poolSizes[key] = pool.length;
}
return {
allocated: this.allocatedBytes,
released: this.releasedBytes,
current: this.allocatedBytes - this.releasedBytes,
peak: this.peakBytes,
poolSizes
};
}
clear() {
this.pools.clear();
this.allocatedBytes = 0;
this.releasedBytes = 0;
this.peakBytes = 0;
}
}
// Memory streaming manager for large matrix operations
export class MemoryStreamManager {
cache;
arrayPool;
gcCount = 0;
streamingThreshold;
constructor(cacheConfig = { maxSize: 100, ttl: 300000, evictionPolicy: 'lru' }, streamingThreshold = 1024 * 1024 * 100 // 100MB threshold
) {
this.cache = new LRUCache(cacheConfig);
this.arrayPool = new TypedArrayPool();
this.streamingThreshold = streamingThreshold;
// Monitor garbage collection
if (typeof globalThis !== 'undefined' && 'performance' in globalThis) {
performance.onGC?.(() => this.gcCount++);
}
}
// Stream large matrix data in chunks
async *streamMatrixChunks(data, chunkSize, processor) {
for (let i = 0; i < data.length; i += chunkSize) {
const chunk = data.slice(i, i + chunkSize);
const cacheKey = `chunk_${i}_${chunkSize}`;
let result = this.cache.get(cacheKey);
if (!result) {
result = await processor(chunk);
this.cache.set(cacheKey, result);
}
yield result;
// Yield control to prevent blocking
if (i % (chunkSize * 10) === 0) {
await new Promise(resolve => setTimeout(resolve, 0));
}
}
}
// Memory-aware matrix operation scheduling
async scheduleOperation(operation, estimatedMemory) {
const currentUsage = this.getCurrentMemoryUsage();
// If operation would exceed threshold, wait for GC or free cache
if (currentUsage + estimatedMemory > this.streamingThreshold) {
await this.freeMemory();
}
return operation();
}
async freeMemory() {
// Clear oldest cache entries
this.cache.clear();
this.arrayPool.clear();
// Force garbage collection if available
if (typeof globalThis !== 'undefined' && globalThis.gc) {
globalThis.gc();
}
// Wait a bit for GC to complete
await new Promise(resolve => setTimeout(resolve, 100));
}
getCurrentMemoryUsage() {
if (typeof globalThis !== 'undefined' && 'performance' in globalThis && 'memory' in performance) {
return performance.memory.usedJSHeapSize;
}
// Fallback to estimated usage from pool
return this.arrayPool.getStats().current;
}
// Acquire optimized typed array
acquireTypedArray(type, length) {
const buffer = this.arrayPool.acquire(type, length);
switch (type) {
case 'float64': return new Float64Array(buffer);
case 'uint32': return new Uint32Array(buffer);
case 'uint8': return new Uint8Array(buffer);
}
}
// Release typed array back to pool
releaseTypedArray(array) {
let type;
if (array instanceof Float64Array)
type = 'float64';
else if (array instanceof Uint32Array)
type = 'uint32';
else
type = 'uint8';
this.arrayPool.release(type, array.buffer);
}
// Get comprehensive memory statistics
getMemoryStats() {
const poolStats = this.arrayPool.getStats();
return {
totalAllocated: poolStats.allocated,
totalReleased: poolStats.released,
currentUsage: poolStats.current,
peakUsage: poolStats.peak,
poolStats: {
arrayPool: poolStats.poolSizes,
cacheSize: this.cache.size(),
cacheHitRate: this.cache.getHitRate()
},
gcCount: this.gcCount,
cacheHitRate: this.cache.getHitRate()
};
}
// Memory profiler for operations
async profileOperation(name, operation) {
const startStats = this.getMemoryStats();
const startTime = performance.now();
const result = await operation();
const endTime = performance.now();
const endStats = this.getMemoryStats();
const profile = {
name,
duration: endTime - startTime,
memoryDelta: endStats.currentUsage - startStats.currentUsage,
peakMemory: endStats.peakUsage,
allocations: endStats.totalAllocated - startStats.totalAllocated,
deallocations: endStats.totalReleased - startStats.totalReleased,
cacheHitRate: endStats.cacheHitRate
};
return { result, profile };
}
// Optimize cache based on access patterns
optimizeCache() {
// This could analyze access patterns and adjust cache size/TTL
const hitRate = this.cache.getHitRate();
if (hitRate < 0.5) {
// Low hit rate, might need larger cache or different eviction policy
console.warn(`Low cache hit rate: ${hitRate.toFixed(2)}`);
}
}
cleanup() {
this.cache.clear();
this.arrayPool.clear();
}
}
// SIMD-aware memory layout optimizer
export class SIMDMemoryOptimizer {
static SIMD_WIDTH = 4; // 4 doubles for AVX
static CACHE_LINE_SIZE = 64; // bytes
// Align arrays for SIMD operations
static alignForSIMD(length) {
return Math.ceil(length / this.SIMD_WIDTH) * this.SIMD_WIDTH;
}
// Optimize array layout for cache performance
static optimizeLayout(arrays, accessPattern) {
if (accessPattern === 'row') {
// Keep arrays as-is for row-major access
return arrays;
}
else {
// Transpose for column-major access
const rows = arrays.length;
const cols = arrays[0]?.length || 0;
const transposed = Array(cols).fill(null).map(() => Array(rows));
for (let i = 0; i < rows; i++) {
for (let j = 0; j < cols; j++) {
transposed[j][i] = arrays[i][j];
}
}
return transposed;
}
}
// Pad arrays to avoid false sharing
static padForCacheLines(array, padValue) {
const elementSize = 8; // Assume 8 bytes per element
const elementsPerCacheLine = this.CACHE_LINE_SIZE / elementSize;
const padding = elementsPerCacheLine - (array.length % elementsPerCacheLine);
if (padding === elementsPerCacheLine) {
return array;
}
return [...array, ...Array(padding).fill(padValue)];
}
// Block matrix operations for better cache locality
static blockMatrixMultiply(a, b, result, blockSize = 64) {
const n = a.length;
const m = b[0].length;
const p = b.length;
for (let ii = 0; ii < n; ii += blockSize) {
for (let jj = 0; jj < m; jj += blockSize) {
for (let kk = 0; kk < p; kk += blockSize) {
const iEnd = Math.min(ii + blockSize, n);
const jEnd = Math.min(jj + blockSize, m);
const kEnd = Math.min(kk + blockSize, p);
for (let i = ii; i < iEnd; i++) {
for (let j = jj; j < jEnd; j++) {
let sum = result[i][j];
for (let k = kk; k < kEnd; k++) {
sum += a[i][k] * b[k][j];
}
result[i][j] = sum;
}
}
}
}
}
}
}
// Global memory manager instance
export const globalMemoryManager = new MemoryStreamManager();
@@ -0,0 +1,79 @@
/**
* Optimized matrix operations with memory pooling and SIMD-friendly patterns
* Target: 50% memory reduction and improved cache locality
*/
import { Matrix, Vector, SparseMatrix } from './types.js';
declare class VectorPool {
private pools;
private maxPoolSize;
acquire(size: number): Vector;
release(vector: Vector): void;
clear(): void;
getStats(): {
poolSizes: Record<number, number>;
totalVectors: number;
};
}
export declare class CSRMatrix {
values: Float64Array;
colIndices: Uint32Array;
rowPtr: Uint32Array;
private rows;
private cols;
constructor(rows: number, cols: number, nnz: number);
static fromCOO(matrix: SparseMatrix): CSRMatrix;
multiplyVector(x: Vector, result: Vector): void;
getEntry(row: number, col: number): number;
rowEntries(row: number): Generator<{
col: number;
val: number;
}>;
getMemoryUsage(): number;
getNnz(): number;
getRows(): number;
getCols(): number;
}
export declare class CSCMatrix {
values: Float64Array;
rowIndices: Uint32Array;
colPtr: Uint32Array;
private rows;
private cols;
constructor(rows: number, cols: number, nnz: number);
static fromCSR(csr: CSRMatrix): CSCMatrix;
multiplyVector(x: Vector, result: Vector): void;
getMemoryUsage(): number;
getNnz(): number;
getRows(): number;
getCols(): number;
}
export declare class StreamingMatrix {
private chunks;
private chunkSize;
private rows;
private cols;
private maxCachedChunks;
constructor(rows: number, cols: number, chunkSize?: number, maxCachedChunks?: number);
static fromMatrix(matrix: Matrix, chunkSize?: number): StreamingMatrix;
getChunk(chunkId: number): CSRMatrix | null;
multiplyVector(x: Vector, result: Vector): void;
getMemoryUsage(): number;
}
export declare class OptimizedMatrixOperations {
private static vectorPool;
static getVectorPool(): VectorPool;
static vectorAdd(a: Vector, b: Vector, result?: Vector): Vector;
static vectorScale(vector: Vector, scalar: number, result?: Vector): Vector;
static vectorDot(a: Vector, b: Vector): number;
static vectorNorm2(vector: Vector): number;
static convertToOptimalFormat(matrix: Matrix): CSRMatrix | CSCMatrix;
private static denseToSparse;
static profileMemoryUsage(matrix: CSRMatrix | CSCMatrix | StreamingMatrix): {
matrixSize: number;
nnz: number;
memoryUsed: number;
compressionRatio: number;
};
static cleanup(): void;
}
export {};
@@ -0,0 +1,451 @@
/**
* Optimized matrix operations with memory pooling and SIMD-friendly patterns
* Target: 50% memory reduction and improved cache locality
*/
// Memory pool for vector allocations
class VectorPool {
pools = new Map();
maxPoolSize = 100;
acquire(size) {
const pool = this.pools.get(size);
if (pool && pool.length > 0) {
return pool.pop();
}
return new Array(size);
}
release(vector) {
const size = vector.length;
vector.fill(0); // Clear for reuse
let pool = this.pools.get(size);
if (!pool) {
pool = [];
this.pools.set(size, pool);
}
if (pool.length < this.maxPoolSize) {
pool.push(vector);
}
}
clear() {
this.pools.clear();
}
getStats() {
const poolSizes = {};
let totalVectors = 0;
for (const [size, pool] of this.pools) {
poolSizes[size] = pool.length;
totalVectors += pool.length;
}
return { poolSizes, totalVectors };
}
}
// Compressed Sparse Row (CSR) format for JavaScript
export class CSRMatrix {
values;
colIndices;
rowPtr;
rows;
cols;
constructor(rows, cols, nnz) {
this.rows = rows;
this.cols = cols;
this.values = new Float64Array(nnz);
this.colIndices = new Uint32Array(nnz);
this.rowPtr = new Uint32Array(rows + 1);
}
static fromCOO(matrix) {
const { values, rowIndices, colIndices } = matrix;
const nnz = values.length;
const csr = new CSRMatrix(matrix.rows, matrix.cols, nnz);
// Sort by row, then column
const triplets = Array.from({ length: nnz }, (_, i) => ({
row: rowIndices[i],
col: colIndices[i],
val: values[i],
index: i
}));
triplets.sort((a, b) => a.row - b.row || a.col - b.col);
// Build CSR structure
let currentRow = 0;
let nnzCount = 0;
for (const triplet of triplets) {
// Skip zeros
if (triplet.val === 0)
continue;
// Update row pointers
while (currentRow < triplet.row) {
csr.rowPtr[++currentRow] = nnzCount;
}
csr.values[nnzCount] = triplet.val;
csr.colIndices[nnzCount] = triplet.col;
nnzCount++;
}
// Finalize row pointers
while (currentRow < matrix.rows) {
csr.rowPtr[++currentRow] = nnzCount;
}
return csr;
}
// Cache-friendly matrix-vector multiplication with SIMD hints
multiplyVector(x, result) {
result.fill(0);
// Process 4 rows at a time for better cache locality
const blockSize = 4;
let rowBlock = 0;
while (rowBlock < this.rows) {
const endBlock = Math.min(rowBlock + blockSize, this.rows);
for (let row = rowBlock; row < endBlock; row++) {
const start = this.rowPtr[row];
const end = this.rowPtr[row + 1];
let sum = 0;
// Unroll loop for SIMD optimization hints
let i = start;
for (; i < end - 3; i += 4) {
sum += this.values[i] * x[this.colIndices[i]] +
this.values[i + 1] * x[this.colIndices[i + 1]] +
this.values[i + 2] * x[this.colIndices[i + 2]] +
this.values[i + 3] * x[this.colIndices[i + 3]];
}
// Handle remaining elements
for (; i < end; i++) {
sum += this.values[i] * x[this.colIndices[i]];
}
result[row] = sum;
}
rowBlock = endBlock;
}
}
getEntry(row, col) {
const start = this.rowPtr[row];
const end = this.rowPtr[row + 1];
// Binary search for column
let left = start;
let right = end - 1;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
const midCol = this.colIndices[mid];
if (midCol === col) {
return this.values[mid];
}
else if (midCol < col) {
left = mid + 1;
}
else {
right = mid - 1;
}
}
return 0;
}
// Memory-efficient row iteration
*rowEntries(row) {
const start = this.rowPtr[row];
const end = this.rowPtr[row + 1];
for (let i = start; i < end; i++) {
yield { col: this.colIndices[i], val: this.values[i] };
}
}
getMemoryUsage() {
return this.values.byteLength +
this.colIndices.byteLength +
this.rowPtr.byteLength;
}
getNnz() {
return this.values.length;
}
getRows() {
return this.rows;
}
getCols() {
return this.cols;
}
}
// Compressed Sparse Column (CSC) format for column-wise operations
export class CSCMatrix {
values;
rowIndices;
colPtr;
rows;
cols;
constructor(rows, cols, nnz) {
this.rows = rows;
this.cols = cols;
this.values = new Float64Array(nnz);
this.rowIndices = new Uint32Array(nnz);
this.colPtr = new Uint32Array(cols + 1);
}
static fromCSR(csr) {
const nnz = csr.getNnz();
const csc = new CSCMatrix(csr.getRows(), csr.getCols(), nnz);
// Convert CSR to triplets, then sort by column
const triplets = [];
for (let row = 0; row < csr.getRows(); row++) {
for (const entry of csr.rowEntries(row)) {
triplets.push({ row, col: entry.col, val: entry.val });
}
}
triplets.sort((a, b) => a.col - b.col || a.row - b.row);
// Build CSC structure
let currentCol = 0;
let nnzCount = 0;
for (const triplet of triplets) {
while (currentCol < triplet.col) {
csc.colPtr[++currentCol] = nnzCount;
}
csc.values[nnzCount] = triplet.val;
csc.rowIndices[nnzCount] = triplet.row;
nnzCount++;
}
while (currentCol < csc.cols) {
csc.colPtr[++currentCol] = nnzCount;
}
return csc;
}
// Column-wise matrix-vector multiplication
multiplyVector(x, result) {
result.fill(0);
for (let col = 0; col < this.cols; col++) {
const xCol = x[col];
if (xCol === 0)
continue;
const start = this.colPtr[col];
const end = this.colPtr[col + 1];
// Vectorized accumulation
for (let i = start; i < end; i++) {
result[this.rowIndices[i]] += this.values[i] * xCol;
}
}
}
getMemoryUsage() {
return this.values.byteLength +
this.rowIndices.byteLength +
this.colPtr.byteLength;
}
getNnz() {
return this.values.length;
}
getRows() {
return this.rows;
}
getCols() {
return this.cols;
}
}
// Memory streaming for large matrices
export class StreamingMatrix {
chunks = new Map();
chunkSize;
rows;
cols;
maxCachedChunks;
constructor(rows, cols, chunkSize = 1000, maxCachedChunks = 10) {
this.rows = rows;
this.cols = cols;
this.chunkSize = chunkSize;
this.maxCachedChunks = maxCachedChunks;
}
static fromMatrix(matrix, chunkSize = 1000) {
const streaming = new StreamingMatrix(matrix.rows, matrix.cols, chunkSize);
if (matrix.format === 'coo') {
const sparse = matrix;
const chunkData = new Map();
for (let i = 0; i < sparse.values.length; i++) {
const row = sparse.rowIndices[i];
const chunkId = Math.floor(row / chunkSize);
if (!chunkData.has(chunkId)) {
chunkData.set(chunkId, []);
}
chunkData.get(chunkId).push({
col: sparse.colIndices[i],
val: sparse.values[i]
});
}
// Convert each chunk to CSR
for (const [chunkId, entries] of chunkData) {
const chunkRows = Math.min(chunkSize, streaming.rows - chunkId * chunkSize);
const chunkCSR = new CSRMatrix(chunkRows, streaming.cols, entries.length);
// Build CSR for this chunk
const rowData = new Map();
for (const entry of entries) {
const localRow = (chunkId * chunkSize) % chunkSize;
if (!rowData.has(localRow)) {
rowData.set(localRow, []);
}
rowData.get(localRow).push(entry);
}
// Fill CSR arrays
let nnzCount = 0;
for (let row = 0; row < chunkRows; row++) {
chunkCSR.rowPtr[row] = nnzCount;
const rowEntries = rowData.get(row) || [];
rowEntries.sort((a, b) => a.col - b.col);
for (const entry of rowEntries) {
chunkCSR.values[nnzCount] = entry.val;
chunkCSR.colIndices[nnzCount] = entry.col;
nnzCount++;
}
}
chunkCSR.rowPtr[chunkRows] = nnzCount;
streaming.chunks.set(chunkId, chunkCSR);
}
}
return streaming;
}
getChunk(chunkId) {
return this.chunks.get(chunkId) || null;
}
// Streaming matrix-vector multiplication
multiplyVector(x, result) {
result.fill(0);
const totalChunks = Math.ceil(this.rows / this.chunkSize);
for (let chunkId = 0; chunkId < totalChunks; chunkId++) {
const chunk = this.getChunk(chunkId);
if (!chunk)
continue;
const startRow = chunkId * this.chunkSize;
const chunkResult = new Array(chunk.getRows()).fill(0);
chunk.multiplyVector(x, chunkResult);
// Copy back to result
for (let i = 0; i < chunkResult.length && startRow + i < this.rows; i++) {
result[startRow + i] = chunkResult[i];
}
// Memory management: remove old chunks if cache is full
if (this.chunks.size > this.maxCachedChunks) {
const oldestChunk = Math.max(0, chunkId - this.maxCachedChunks);
this.chunks.delete(oldestChunk);
}
}
}
getMemoryUsage() {
let total = 0;
for (const chunk of this.chunks.values()) {
total += chunk.getMemoryUsage();
}
return total;
}
}
// Optimized matrix operations with memory pooling
export class OptimizedMatrixOperations {
static vectorPool = new VectorPool();
static getVectorPool() {
return this.vectorPool;
}
// SIMD-optimized vector operations
static vectorAdd(a, b, result) {
const n = a.length;
const out = result || this.vectorPool.acquire(n);
// Process 4 elements at a time for SIMD
let i = 0;
for (; i < n - 3; i += 4) {
out[i] = a[i] + b[i];
out[i + 1] = a[i + 1] + b[i + 1];
out[i + 2] = a[i + 2] + b[i + 2];
out[i + 3] = a[i + 3] + b[i + 3];
}
// Handle remaining elements
for (; i < n; i++) {
out[i] = a[i] + b[i];
}
return out;
}
static vectorScale(vector, scalar, result) {
const n = vector.length;
const out = result || this.vectorPool.acquire(n);
// SIMD-friendly unrolled loop
let i = 0;
for (; i < n - 3; i += 4) {
out[i] = vector[i] * scalar;
out[i + 1] = vector[i + 1] * scalar;
out[i + 2] = vector[i + 2] * scalar;
out[i + 3] = vector[i + 3] * scalar;
}
for (; i < n; i++) {
out[i] = vector[i] * scalar;
}
return out;
}
static vectorDot(a, b) {
const n = a.length;
let sum = 0;
// Unrolled loop for SIMD optimization
let i = 0;
for (; i < n - 3; i += 4) {
sum += a[i] * b[i] +
a[i + 1] * b[i + 1] +
a[i + 2] * b[i + 2] +
a[i + 3] * b[i + 3];
}
for (; i < n; i++) {
sum += a[i] * b[i];
}
return sum;
}
static vectorNorm2(vector) {
return Math.sqrt(this.vectorDot(vector, vector));
}
// Memory-efficient matrix format conversion
static convertToOptimalFormat(matrix) {
if (matrix.format === 'coo') {
const sparse = matrix;
// Choose format based on sparsity pattern and expected access
const sparsity = sparse.values.length / (matrix.rows * matrix.cols);
// CSR is generally better for row-wise access and matrix-vector multiplication
return CSRMatrix.fromCOO(sparse);
}
else {
// Convert dense to sparse first
const sparse = this.denseToSparse(matrix);
return CSRMatrix.fromCOO(sparse);
}
}
static denseToSparse(dense, tolerance = 1e-15) {
const values = [];
const rowIndices = [];
const colIndices = [];
for (let i = 0; i < dense.rows; i++) {
for (let j = 0; j < dense.cols; j++) {
const value = dense.data[i][j];
if (Math.abs(value) > tolerance) {
values.push(value);
rowIndices.push(i);
colIndices.push(j);
}
}
}
return {
rows: dense.rows,
cols: dense.cols,
values,
rowIndices,
colIndices,
format: 'coo'
};
}
// Memory usage profiling
static profileMemoryUsage(matrix) {
const memoryUsed = matrix.getMemoryUsage();
let nnz;
let rows;
let cols;
if (matrix instanceof CSRMatrix || matrix instanceof CSCMatrix) {
nnz = matrix.getNnz();
rows = matrix.getRows();
cols = matrix.getCols();
}
else {
nnz = 0;
rows = matrix['rows'];
cols = matrix['cols'];
}
const denseMemory = rows * cols * 8; // 8 bytes per double
const compressionRatio = denseMemory / memoryUsed;
return {
matrixSize: rows * cols,
nnz,
memoryUsed,
compressionRatio
};
}
// Cleanup memory pools
static cleanup() {
this.vectorPool.clear();
}
}
@@ -0,0 +1,64 @@
/**
* Optimized solver implementation with memory-efficient algorithms
* Integrates all optimization components for maximum performance
*/
import { Matrix, Vector, SolverConfig, SolverResult } from './types.js';
import { MemoryProfile } from './memory-manager.js';
export interface OptimizedSolverConfig extends SolverConfig {
memoryOptimization: {
enablePooling: boolean;
enableStreaming: boolean;
streamingThreshold: number;
maxCacheSize: number;
};
performance: {
enableVectorization: boolean;
enableBlocking: boolean;
autoTuning: boolean;
parallelization: boolean;
};
adaptiveAlgorithms: {
enabled: boolean;
switchThreshold: number;
memoryPressureThreshold: number;
};
}
export interface OptimizedSolverResult extends SolverResult {
optimizationStats: {
memoryReduction: number;
cacheHitRate: number;
vectorizationEfficiency: number;
algorithmsSwitched: number;
};
memoryProfile: MemoryProfile;
recommendations: string[];
}
export declare class OptimizedSublinearSolver {
private config;
private csrMatrix?;
private optimizationHints;
private benchmarkInstance;
private autoTunedParams?;
constructor(config?: Partial<OptimizedSolverConfig>);
private mergeDefaultConfig;
solve(matrix: Matrix, vector: Vector): Promise<OptimizedSolverResult>;
private preprocessMatrix;
private estimateMatrixMemory;
private selectOptimalAlgorithm;
private executeSolve;
private solveVectorizedNeumann;
private solveBlockedNeumann;
private solveStreamingNeumann;
private solveParallelNeumann;
private calculateOptimizationStats;
private generateRecommendations;
runBenchmark(matrices: Matrix[], vectors: Vector[]): Promise<{
results: OptimizedSolverResult[];
comparison: {
averageSpeedup: number;
averageMemoryReduction: number;
recommendedConfig: Partial<OptimizedSolverConfig>;
};
}>;
cleanup(): void;
}
@@ -0,0 +1,318 @@
/**
* Optimized solver implementation with memory-efficient algorithms
* Integrates all optimization components for maximum performance
*/
import { OptimizedMatrixOperations } from './optimized-matrix.js';
import { globalMemoryManager } from './memory-manager.js';
import { OptimizedMatrixMultiplication, PerformanceBenchmark } from './performance-optimizer.js';
export class OptimizedSublinearSolver {
config;
csrMatrix;
optimizationHints;
benchmarkInstance;
autoTunedParams;
constructor(config = {}) {
this.config = this.mergeDefaultConfig(config);
this.benchmarkInstance = new PerformanceBenchmark();
this.optimizationHints = {
vectorize: this.config.performance.enableVectorization,
unroll: 4,
prefetch: true,
blocking: {
enabled: this.config.performance.enableBlocking,
size: 1024
},
streaming: {
enabled: this.config.memoryOptimization.enableStreaming,
chunkSize: 10000
}
};
}
mergeDefaultConfig(partial) {
return {
method: 'neumann',
epsilon: 1e-6,
maxIterations: 1000,
...partial,
memoryOptimization: {
enablePooling: true,
enableStreaming: true,
streamingThreshold: 100 * 1024 * 1024, // 100MB
maxCacheSize: 100,
...partial.memoryOptimization
},
performance: {
enableVectorization: true,
enableBlocking: true,
autoTuning: true,
parallelization: true,
...partial.performance
},
adaptiveAlgorithms: {
enabled: true,
switchThreshold: 0.1,
memoryPressureThreshold: 0.8,
...partial.adaptiveAlgorithms
}
};
}
async solve(matrix, vector) {
const startTime = performance.now();
const startMemory = globalMemoryManager.getMemoryStats();
// Convert to optimized format
await this.preprocessMatrix(matrix);
// Auto-tune parameters if enabled
if (this.config.performance.autoTuning && this.csrMatrix) {
this.autoTunedParams = await this.benchmarkInstance.autoTuneParameters(this.csrMatrix, vector);
this.optimizationHints.blocking.size = this.autoTunedParams.optimalBlockSize;
this.optimizationHints.unroll = this.autoTunedParams.optimalUnrollFactor;
}
// Select optimal algorithm based on matrix characteristics
const algorithmInfo = this.selectOptimalAlgorithm(matrix, vector);
// Execute solve with memory profiling
const { result: solverResult, profile } = await globalMemoryManager.profileOperation(`OptimizedSolver_${algorithmInfo.algorithm}`, () => this.executeSolve(matrix, vector, algorithmInfo));
const endTime = performance.now();
const endMemory = globalMemoryManager.getMemoryStats();
// Calculate optimization statistics
const optimizationStats = this.calculateOptimizationStats(startMemory, endMemory, profile);
// Generate recommendations
const recommendations = this.generateRecommendations(optimizationStats, profile);
return {
...solverResult,
optimizationStats,
memoryProfile: profile,
recommendations,
computeTime: endTime - startTime
};
}
async preprocessMatrix(matrix) {
// Convert to optimized CSR format with memory pooling
if (this.config.memoryOptimization.enablePooling) {
this.csrMatrix = await globalMemoryManager.scheduleOperation(() => Promise.resolve(OptimizedMatrixOperations.convertToOptimalFormat(matrix)), this.estimateMatrixMemory(matrix));
}
else {
this.csrMatrix = OptimizedMatrixOperations.convertToOptimalFormat(matrix);
}
}
estimateMatrixMemory(matrix) {
if (matrix.format === 'coo') {
const sparse = matrix;
return sparse.values.length * (8 + 4 + 4); // value + row + col indices
}
else {
return matrix.rows * matrix.cols * 8; // dense matrix
}
}
selectOptimalAlgorithm(matrix, vector) {
if (!this.csrMatrix) {
throw new Error('Matrix not preprocessed');
}
const memoryUsage = this.csrMatrix.getMemoryUsage();
const memoryStats = globalMemoryManager.getMemoryStats();
const memoryPressure = memoryStats.currentUsage / (memoryStats.peakUsage || 1);
// Adaptive algorithm selection
if (this.config.adaptiveAlgorithms.enabled) {
if (memoryPressure > this.config.adaptiveAlgorithms.memoryPressureThreshold) {
return { algorithm: 'streaming-neumann', params: { chunkSize: 1000 } };
}
if (memoryUsage > this.config.memoryOptimization.streamingThreshold) {
return { algorithm: 'blocked-neumann', params: { blockSize: this.optimizationHints.blocking.size } };
}
if (this.config.performance.parallelization && matrix.rows > 10000) {
return { algorithm: 'parallel-neumann', params: { workers: navigator.hardwareConcurrency || 4 } };
}
}
return { algorithm: 'vectorized-neumann', params: {} };
}
async executeSolve(matrix, vector, algorithmInfo) {
if (!this.csrMatrix) {
throw new Error('Matrix not preprocessed');
}
switch (algorithmInfo.algorithm) {
case 'vectorized-neumann':
return this.solveVectorizedNeumann(this.csrMatrix, vector);
case 'blocked-neumann':
return this.solveBlockedNeumann(this.csrMatrix, vector, algorithmInfo.params.blockSize);
case 'streaming-neumann':
return this.solveStreamingNeumann(this.csrMatrix, vector, algorithmInfo.params.chunkSize);
case 'parallel-neumann':
return this.solveParallelNeumann(this.csrMatrix, vector, algorithmInfo.params.workers);
default:
throw new Error(`Unknown algorithm: ${algorithmInfo.algorithm}`);
}
}
// Vectorized Neumann series implementation
async solveVectorizedNeumann(matrix, vector) {
const n = matrix.getRows();
// Extract diagonal with memory pooling
const diagonal = globalMemoryManager.acquireTypedArray('float64', n);
for (let i = 0; i < n; i++) {
diagonal[i] = matrix.getEntry(i, i);
if (Math.abs(diagonal[i]) < 1e-15) {
throw new Error(`Zero diagonal at position ${i}`);
}
}
// Initialize solution: x₀ = D⁻¹b
const solution = globalMemoryManager.acquireTypedArray('float64', n);
const tempVector = globalMemoryManager.acquireTypedArray('float64', n);
for (let i = 0; i < n; i++) {
solution[i] = vector[i] / diagonal[i];
}
let seriesTerm = Array.from(solution);
let iteration = 0;
let residual = Infinity;
for (let k = 1; k <= this.config.maxIterations; k++) {
// Compute R * seriesTerm using optimized matrix-vector multiplication
matrix.multiplyVector(seriesTerm, tempVector);
// Subtract diagonal part: (R * seriesTerm) - D * seriesTerm
for (let i = 0; i < n; i++) {
tempVector[i] -= diagonal[i] * seriesTerm[i];
}
// Apply D⁻¹: seriesTerm = D⁻¹ * (R * seriesTerm)
for (let i = 0; i < n; i++) {
seriesTerm[i] = tempVector[i] / diagonal[i];
}
// Add to solution with vectorized operation
OptimizedMatrixOperations.vectorAdd(Array.from(solution), seriesTerm, Array.from(solution));
// Check convergence using optimized norm
matrix.multiplyVector(solution, tempVector);
const residualVec = OptimizedMatrixOperations.vectorAdd(tempVector, OptimizedMatrixOperations.vectorScale(vector, -1), new Array(n));
residual = OptimizedMatrixOperations.vectorNorm2(residualVec);
iteration = k;
if (residual < this.config.epsilon) {
break;
}
// Early termination if series term becomes negligible
const termNorm = OptimizedMatrixOperations.vectorNorm2(seriesTerm);
if (termNorm < this.config.epsilon * 1e-3) {
break;
}
}
// Cleanup memory - cast back to typed arrays for release
globalMemoryManager.releaseTypedArray(diagonal);
globalMemoryManager.releaseTypedArray(tempVector);
const finalSolution = Array.from(solution);
globalMemoryManager.releaseTypedArray(solution);
return {
solution: finalSolution,
iterations: iteration,
residual,
converged: residual < this.config.epsilon,
method: 'vectorized-neumann',
computeTime: 0, // Will be set by caller
memoryUsed: 0 // Will be calculated separately
};
}
// Blocked Neumann series for cache optimization
async solveBlockedNeumann(matrix, vector, blockSize) {
// Similar to vectorized but with blocked processing
// Process matrix operations in blocks for better cache locality
return this.solveVectorizedNeumann(matrix, vector); // Simplified for now
}
// Streaming Neumann series for large matrices
async solveStreamingNeumann(matrix, vector, chunkSize) {
const n = matrix.getRows();
const chunks = Math.ceil(n / chunkSize);
// Process in streaming fashion using memory manager
const solution = new Array(n);
// Process in chunks
for (let chunkIndex = 0; chunkIndex < chunks; chunkIndex++) {
const startRow = chunkIndex * chunkSize;
const endRow = Math.min(startRow + chunkSize, n);
// Process this chunk
const chunkVector = vector.slice(startRow, endRow);
// Simple processing for now
for (let i = 0; i < chunkVector.length; i++) {
solution[startRow + i] = chunkVector[i];
}
}
return {
solution,
iterations: 1,
residual: 0,
converged: true,
method: 'streaming-neumann',
computeTime: 0,
memoryUsed: 0
};
}
// Parallel Neumann series using Web Workers
async solveParallelNeumann(matrix, vector, numWorkers) {
// Use parallel matrix-vector multiplication
const n = matrix.getRows();
const solution = await OptimizedMatrixMultiplication.parallelMatVec(matrix, vector);
return {
solution,
iterations: 1,
residual: 0,
converged: true,
method: 'parallel-neumann',
computeTime: 0,
memoryUsed: 0
};
}
calculateOptimizationStats(startMemory, endMemory, profile) {
const memoryReduction = startMemory.currentUsage > 0
? (startMemory.currentUsage - endMemory.currentUsage) / startMemory.currentUsage
: 0;
return {
memoryReduction,
cacheHitRate: profile.cacheHitRate,
vectorizationEfficiency: 0.85, // Estimated based on operations used
algorithmsSwitched: this.config.adaptiveAlgorithms.enabled ? 1 : 0
};
}
generateRecommendations(stats, profile) {
const recommendations = [];
if (stats.memoryReduction < 0.3) {
recommendations.push('Consider enabling memory pooling and streaming for better memory efficiency');
}
if (stats.cacheHitRate < 0.7) {
recommendations.push('Enable blocked algorithms for better cache locality');
}
if (profile.duration > 1000) {
recommendations.push('Consider enabling parallelization for large problems');
}
if (stats.vectorizationEfficiency < 0.8) {
recommendations.push('Enable vectorization hints for better SIMD utilization');
}
return recommendations;
}
// Benchmark the optimized solver
async runBenchmark(matrices, vectors) {
const results = [];
for (let i = 0; i < matrices.length; i++) {
const result = await this.solve(matrices[i], vectors[i]);
results.push(result);
}
// Calculate comparison metrics
const avgMemoryReduction = results.reduce((sum, r) => sum + r.optimizationStats.memoryReduction, 0) / results.length;
const avgSpeedup = 2.5; // Estimated based on optimizations
const recommendedConfig = {
memoryOptimization: {
enablePooling: avgMemoryReduction > 0.3,
enableStreaming: results.some(r => r.memoryProfile.peakMemory > 100 * 1024 * 1024),
streamingThreshold: 50 * 1024 * 1024,
maxCacheSize: 200
},
performance: {
enableVectorization: true,
enableBlocking: results.some(r => r.optimizationStats.cacheHitRate < 0.8),
autoTuning: true,
parallelization: results.some(r => r.memoryProfile.duration > 500)
}
};
return {
results,
comparison: {
averageSpeedup: avgSpeedup,
averageMemoryReduction: avgMemoryReduction,
recommendedConfig
}
};
}
cleanup() {
OptimizedMatrixOperations.cleanup();
globalMemoryManager.cleanup();
}
}
@@ -0,0 +1,67 @@
/**
* Performance optimization utilities for matrix operations
* Implements cache-friendly patterns, vectorization hints, and benchmarking
*/
import { Vector } from './types.js';
import { CSRMatrix } from './optimized-matrix.js';
import { MemoryStreamManager, MemoryProfile } from './memory-manager.js';
export interface BenchmarkResult {
operation: string;
iterations: number;
totalTime: number;
averageTime: number;
throughput: number;
memoryProfile: MemoryProfile;
cacheStats: {
hitRate: number;
missRate: number;
};
}
export interface OptimizationHints {
vectorize: boolean;
unroll: number;
prefetch: boolean;
blocking: {
enabled: boolean;
size: number;
};
streaming: {
enabled: boolean;
chunkSize: number;
};
}
export declare class VectorizedOperations {
private static readonly UNROLL_FACTOR;
private static readonly PREFETCH_DISTANCE;
static dotProduct(a: Vector, b: Vector, hints?: OptimizationHints): number;
static vectorAdd(a: Vector, b: Vector, result: Vector, hints?: OptimizationHints): void;
private static vectorAddBlock;
static streamingOperation<T>(operation: 'add' | 'multiply' | 'dot', vectors: Vector[], chunkSize?: number): Promise<Vector | number>;
}
export declare class OptimizedMatrixMultiplication {
static sparseMatVec(matrix: CSRMatrix, vector: Vector, result: Vector, blockSize?: number): void;
static parallelMatVec(matrix: CSRMatrix, vector: Vector, numWorkers?: number): Promise<Vector>;
private static createMatVecWorker;
static selectOptimalAlgorithm(matrix: CSRMatrix, vector: Vector): {
algorithm: 'sequential' | 'blocked' | 'parallel' | 'streaming';
params: any;
};
}
export declare class PerformanceBenchmark {
private memoryManager;
constructor(memoryManager?: MemoryStreamManager);
benchmarkMatrixOperations(matrices: CSRMatrix[], vectors: Vector[], iterations?: number): Promise<BenchmarkResult[]>;
private benchmarkOperation;
generateOptimizationReport(benchmarks: BenchmarkResult[]): {
recommendations: string[];
bottlenecks: string[];
memoryEfficiency: number;
cacheEfficiency: number;
};
autoTuneParameters(matrix: CSRMatrix, vector: Vector): Promise<{
optimalBlockSize: number;
optimalUnrollFactor: number;
recommendedAlgorithm: string;
}>;
}
export declare const globalPerformanceOptimizer: PerformanceBenchmark;
@@ -0,0 +1,336 @@
/**
* Performance optimization utilities for matrix operations
* Implements cache-friendly patterns, vectorization hints, and benchmarking
*/
import { globalMemoryManager } from './memory-manager.js';
// Vectorized math operations with SIMD hints
export class VectorizedOperations {
static UNROLL_FACTOR = 4;
static PREFETCH_DISTANCE = 64;
// Highly optimized dot product with cache prefetching
static dotProduct(a, b, hints) {
const n = a.length;
const unrollFactor = hints?.unroll || this.UNROLL_FACTOR;
let sum = 0;
// Main vectorized loop
let i = 0;
for (; i <= n - unrollFactor; i += unrollFactor) {
// Prefetch next cache line if enabled
if (hints?.prefetch && i + this.PREFETCH_DISTANCE < n) {
// Browser doesn't expose prefetch directly, but accessing helps
const prefetchIndex = i + this.PREFETCH_DISTANCE;
void a[prefetchIndex]; // Touch for prefetch hint
void b[prefetchIndex];
}
// Unrolled loop for SIMD optimization
sum += a[i] * b[i] +
a[i + 1] * b[i + 1] +
a[i + 2] * b[i + 2] +
a[i + 3] * b[i + 3];
}
// Handle remaining elements
for (; i < n; i++) {
sum += a[i] * b[i];
}
return sum;
}
// Cache-optimized vector addition with blocking
static vectorAdd(a, b, result, hints) {
const n = a.length;
const blockSize = hints?.blocking.enabled ? hints.blocking.size : 1024;
if (hints?.blocking.enabled && n > blockSize) {
// Process in blocks for better cache locality
for (let blockStart = 0; blockStart < n; blockStart += blockSize) {
const blockEnd = Math.min(blockStart + blockSize, n);
this.vectorAddBlock(a, b, result, blockStart, blockEnd, hints);
}
}
else {
this.vectorAddBlock(a, b, result, 0, n, hints);
}
}
static vectorAddBlock(a, b, result, start, end, hints) {
const unrollFactor = hints?.unroll || this.UNROLL_FACTOR;
let i = start;
for (; i <= end - unrollFactor; i += unrollFactor) {
result[i] = a[i] + b[i];
result[i + 1] = a[i + 1] + b[i + 1];
result[i + 2] = a[i + 2] + b[i + 2];
result[i + 3] = a[i + 3] + b[i + 3];
}
for (; i < end; i++) {
result[i] = a[i] + b[i];
}
}
// Streaming vector operations for large arrays
static async streamingOperation(operation, vectors, chunkSize = 10000) {
const n = vectors[0].length;
if (operation === 'dot' && vectors.length === 2) {
let sum = 0;
for (let start = 0; start < n; start += chunkSize) {
const end = Math.min(start + chunkSize, n);
const chunkA = vectors[0].slice(start, end);
const chunkB = vectors[1].slice(start, end);
sum += this.dotProduct(chunkA, chunkB);
// Yield control periodically
if (start % (chunkSize * 10) === 0) {
await new Promise(resolve => setTimeout(resolve, 0));
}
}
return sum;
}
else if (operation === 'add' && vectors.length === 2) {
const result = globalMemoryManager.acquireTypedArray('float64', n);
for (let start = 0; start < n; start += chunkSize) {
const end = Math.min(start + chunkSize, n);
const chunkA = vectors[0].slice(start, end);
const chunkB = vectors[1].slice(start, end);
const chunkResult = new Array(end - start);
this.vectorAdd(chunkA, chunkB, chunkResult);
// Copy back to result
for (let i = 0; i < chunkResult.length; i++) {
result[start + i] = chunkResult[i];
}
// Yield control
if (start % (chunkSize * 10) === 0) {
await new Promise(resolve => setTimeout(resolve, 0));
}
}
return Array.from(result);
}
throw new Error(`Unsupported streaming operation: ${operation}`);
}
}
// Matrix multiplication with advanced optimizations
export class OptimizedMatrixMultiplication {
// Cache-blocked sparse matrix-vector multiplication
static sparseMatVec(matrix, vector, result, blockSize = 1000) {
const rows = matrix.getRows();
// Process matrix in row blocks for cache efficiency
for (let blockStart = 0; blockStart < rows; blockStart += blockSize) {
const blockEnd = Math.min(blockStart + blockSize, rows);
for (let row = blockStart; row < blockEnd; row++) {
let sum = 0;
// Process row entries with prefetching
for (const entry of matrix.rowEntries(row)) {
sum += entry.val * vector[entry.col];
}
result[row] = sum;
}
}
}
// Parallel matrix-vector multiplication using Web Workers (when available)
static async parallelMatVec(matrix, vector, numWorkers = navigator.hardwareConcurrency || 4) {
const rows = matrix.getRows();
const result = new Array(rows).fill(0);
if (typeof globalThis === 'undefined' || !globalThis.Worker || rows < 1000) {
// Fallback to sequential implementation
this.sparseMatVec(matrix, vector, result);
return result;
}
const chunkSize = Math.ceil(rows / numWorkers);
const promises = [];
for (let i = 0; i < numWorkers; i++) {
const startRow = i * chunkSize;
const endRow = Math.min(startRow + chunkSize, rows);
if (startRow >= rows)
break;
// Create worker for this chunk
const workerPromise = this.createMatVecWorker(matrix, vector, startRow, endRow);
promises.push(workerPromise);
}
const results = await Promise.all(promises);
// Combine results
let offset = 0;
for (const chunkResult of results) {
for (let i = 0; i < chunkResult.length; i++) {
result[offset + i] = chunkResult[i];
}
offset += chunkResult.length;
}
return result;
}
static async createMatVecWorker(matrix, vector, startRow, endRow) {
// In a real implementation, this would use Web Workers
// For now, simulate with async processing
return new Promise(resolve => {
setTimeout(() => {
const chunkResult = new Array(endRow - startRow).fill(0);
for (let row = startRow; row < endRow; row++) {
let sum = 0;
for (const entry of matrix.rowEntries(row)) {
sum += entry.val * vector[entry.col];
}
chunkResult[row - startRow] = sum;
}
resolve(chunkResult);
}, 0);
});
}
// Adaptive algorithm selection based on matrix properties
static selectOptimalAlgorithm(matrix, vector) {
const nnz = matrix.getNnz();
const rows = matrix.getRows();
const sparsity = nnz / (rows * matrix.getCols());
const memoryUsage = matrix.getMemoryUsage();
// Decision tree based on matrix characteristics
if (memoryUsage > 100 * 1024 * 1024) { // > 100MB
return {
algorithm: 'streaming',
params: { chunkSize: 1000 }
};
}
else if (rows > 10000 && typeof globalThis !== 'undefined' && globalThis.Worker) {
return {
algorithm: 'parallel',
params: { numWorkers: navigator.hardwareConcurrency || 4 }
};
}
else if (sparsity < 0.1 && rows > 1000) {
return {
algorithm: 'blocked',
params: { blockSize: Math.min(1000, Math.ceil(Math.sqrt(rows))) }
};
}
else {
return {
algorithm: 'sequential',
params: {}
};
}
}
}
// Performance benchmarking and optimization guidance
export class PerformanceBenchmark {
memoryManager;
constructor(memoryManager = globalMemoryManager) {
this.memoryManager = memoryManager;
}
// Comprehensive matrix operation benchmark
async benchmarkMatrixOperations(matrices, vectors, iterations = 100) {
const results = [];
for (let i = 0; i < matrices.length; i++) {
const matrix = matrices[i];
const vector = vectors[i];
const result = globalMemoryManager.acquireTypedArray('float64', matrix.getRows());
// Benchmark sequential multiplication
const seqResult = await this.benchmarkOperation('Sequential MatVec', () => OptimizedMatrixMultiplication.sparseMatVec(matrix, vector, Array.from(result)), iterations);
results.push(seqResult);
// Benchmark blocked multiplication
const blockedResult = await this.benchmarkOperation('Blocked MatVec', () => OptimizedMatrixMultiplication.sparseMatVec(matrix, vector, Array.from(result), 500), iterations);
results.push(blockedResult);
// Benchmark vectorized operations
const vecResult = await this.benchmarkOperation('Vectorized Dot Product', () => VectorizedOperations.dotProduct(vector, vector), iterations * 10);
results.push(vecResult);
globalMemoryManager.releaseTypedArray(result);
}
return results;
}
async benchmarkOperation(name, operation, iterations) {
// Warmup
for (let i = 0; i < Math.min(10, iterations); i++) {
operation();
}
const { result, profile } = await this.memoryManager.profileOperation(name, async () => {
const startTime = performance.now();
for (let i = 0; i < iterations; i++) {
operation();
}
return performance.now() - startTime;
});
const totalTime = result;
const averageTime = totalTime / iterations;
const throughput = iterations / (totalTime / 1000); // ops per second
return {
operation: name,
iterations,
totalTime,
averageTime,
throughput,
memoryProfile: profile,
cacheStats: {
hitRate: profile.cacheHitRate,
missRate: 1 - profile.cacheHitRate
}
};
}
// Generate optimization recommendations
generateOptimizationReport(benchmarks) {
const recommendations = [];
const bottlenecks = [];
let totalMemoryDelta = 0;
let totalCacheHitRate = 0;
for (const benchmark of benchmarks) {
totalMemoryDelta += Math.abs(benchmark.memoryProfile.memoryDelta);
totalCacheHitRate += benchmark.cacheStats.hitRate;
// Analyze performance characteristics
if (benchmark.throughput < 1000) {
bottlenecks.push(`Low throughput in ${benchmark.operation}: ${benchmark.throughput.toFixed(2)} ops/sec`);
}
if (benchmark.cacheStats.hitRate < 0.8) {
recommendations.push(`Improve cache locality for ${benchmark.operation} (hit rate: ${(benchmark.cacheStats.hitRate * 100).toFixed(1)}%)`);
}
if (benchmark.memoryProfile.memoryDelta > 1024 * 1024) {
recommendations.push(`Reduce memory allocation in ${benchmark.operation} (${(benchmark.memoryProfile.memoryDelta / 1024 / 1024).toFixed(2)}MB allocated)`);
}
if (benchmark.averageTime > 100) {
recommendations.push(`Consider parallelization for ${benchmark.operation} (avg time: ${benchmark.averageTime.toFixed(2)}ms)`);
}
}
const avgMemoryDelta = totalMemoryDelta / benchmarks.length;
const avgCacheHitRate = totalCacheHitRate / benchmarks.length;
// General recommendations
if (avgCacheHitRate < 0.7) {
recommendations.push('Consider using blocked algorithms for better cache locality');
}
if (avgMemoryDelta > 1024 * 1024) {
recommendations.push('Implement memory pooling to reduce allocation overhead');
}
return {
recommendations,
bottlenecks,
memoryEfficiency: 1 - (avgMemoryDelta / (1024 * 1024 * 100)), // Normalized efficiency
cacheEfficiency: avgCacheHitRate
};
}
// Auto-tuning for optimal parameters
async autoTuneParameters(matrix, vector) {
const blockSizes = [64, 128, 256, 512, 1024];
const unrollFactors = [2, 4, 8];
let bestBlockSize = 256;
let bestUnrollFactor = 4;
let bestThroughput = 0;
// Test different block sizes
for (const blockSize of blockSizes) {
const result = await this.benchmarkOperation(`Block size ${blockSize}`, () => OptimizedMatrixMultiplication.sparseMatVec(matrix, vector, new Array(matrix.getRows()).fill(0), blockSize), 50);
if (result.throughput > bestThroughput) {
bestThroughput = result.throughput;
bestBlockSize = blockSize;
}
}
// Test different unroll factors for vector operations
bestThroughput = 0;
for (const unrollFactor of unrollFactors) {
const result = await this.benchmarkOperation(`Unroll factor ${unrollFactor}`, () => VectorizedOperations.dotProduct(vector, vector, {
vectorize: true,
unroll: unrollFactor,
prefetch: false,
blocking: { enabled: false, size: 0 },
streaming: { enabled: false, chunkSize: 0 }
}), 100);
if (result.throughput > bestThroughput) {
bestThroughput = result.throughput;
bestUnrollFactor = unrollFactor;
}
}
// Select optimal algorithm
const algorithmSelection = OptimizedMatrixMultiplication.selectOptimalAlgorithm(matrix, vector);
return {
optimalBlockSize: bestBlockSize,
optimalUnrollFactor: bestUnrollFactor,
recommendedAlgorithm: algorithmSelection.algorithm
};
}
}
// Global performance optimizer
export const globalPerformanceOptimizer = new PerformanceBenchmark();
+66
View File
@@ -0,0 +1,66 @@
/**
* Core solver algorithms for asymmetric diagonally dominant systems
* Implements Neumann series, random walks, and push methods
*/
import { Matrix, Vector, SolverConfig, SolverResult, EstimationConfig, PageRankConfig, ProgressCallback } from './types.js';
export declare class SublinearSolver {
private config;
private performanceMonitor;
private convergenceChecker;
private timeoutController?;
private wasmAccelerated;
private wasmModules;
constructor(config: SolverConfig);
private initializeWasm;
private validateConfig;
/**
* Solve ADD system Mx = b using specified method
*/
solve(matrix: Matrix, vector: Vector, progressCallback?: ProgressCallback): Promise<SolverResult>;
/**
* Solve using Neumann series expansion
* x* = (I - D^(-1)R)^(-1) D^(-1) b = sum_{k=0}^∞ (D^(-1)R)^k D^(-1) b
*/
private solveNeumann;
/**
* Compute off-diagonal matrix-vector multiplication: (M - D) * v
* This computes R*v where R = M - D (off-diagonal part of matrix)
*/
private computeOffDiagonalMultiply;
/**
* Solve using random walk sampling
*/
private solveRandomWalk;
/**
* Create transition matrix for random walks
*/
private createTransitionMatrix;
/**
* Perform a single random walk
*/
private performRandomWalk;
/**
* Solve using forward push method
*/
private solveForwardPush;
/**
* Solve using backward push method
*/
private solveBackwardPush;
/**
* Solve using bidirectional approach (combine forward and backward)
*/
private solveBidirectional;
/**
* Estimate a single entry of the solution M^(-1)b
*/
estimateEntry(matrix: Matrix, vector: Vector, config: EstimationConfig): Promise<{
estimate: number;
variance: number;
confidence: number;
}>;
/**
* Compute PageRank using the solver
*/
computePageRank(adjacency: Matrix, config: PageRankConfig): Promise<Vector>;
}
+588
View File
@@ -0,0 +1,588 @@
/**
* Core solver algorithms for asymmetric diagonally dominant systems
* Implements Neumann series, random walks, and push methods
*/
import { SolverError, ErrorCodes } from './types.js';
import { MatrixOperations } from './matrix.js';
import { VectorOperations, PerformanceMonitor, ConvergenceChecker, TimeoutController, ValidationUtils, createSeededRandom } from './utils.js';
import { initializeAllWasm } from './wasm-bridge.js';
export class SublinearSolver {
config;
performanceMonitor;
convergenceChecker;
timeoutController;
wasmAccelerated = false;
wasmModules = {};
constructor(config) {
this.config = config;
this.validateConfig(config);
this.performanceMonitor = new PerformanceMonitor();
this.convergenceChecker = new ConvergenceChecker();
if (config.timeout) {
this.timeoutController = new TimeoutController(config.timeout);
}
// Initialize WASM if available
this.initializeWasm().catch(console.warn);
}
async initializeWasm() {
try {
const { temporal, graph, hasWasm } = await initializeAllWasm();
this.wasmModules = { temporal, graph };
this.wasmAccelerated = hasWasm;
if (this.wasmAccelerated) {
console.log('🚀 WASM acceleration enabled');
}
}
catch (error) {
console.warn('WASM initialization failed, using JavaScript fallback');
this.wasmAccelerated = false;
}
}
validateConfig(config) {
ValidationUtils.validatePositiveNumber(config.epsilon, 'epsilon');
ValidationUtils.validateIntegerRange(config.maxIterations, 1, 1e6, 'maxIterations');
if (config.timeout) {
ValidationUtils.validatePositiveNumber(config.timeout, 'timeout');
}
}
/**
* Solve ADD system Mx = b using specified method
*/
async solve(matrix, vector, progressCallback) {
MatrixOperations.validateMatrix(matrix);
if (vector.length !== matrix.cols) {
throw new SolverError(`Vector length ${vector.length} does not match matrix columns ${matrix.cols}`, ErrorCodes.INVALID_DIMENSIONS);
}
// Check diagonal dominance
const analysis = MatrixOperations.analyzeMatrix(matrix);
if (!analysis.isDiagonallyDominant) {
throw new SolverError('Matrix is not diagonally dominant', ErrorCodes.NOT_DIAGONALLY_DOMINANT, { analysis });
}
this.performanceMonitor.reset();
this.convergenceChecker.reset();
let result;
try {
switch (this.config.method) {
case 'neumann':
result = await this.solveNeumann(matrix, vector, progressCallback);
break;
case 'random-walk':
result = await this.solveRandomWalk(matrix, vector, progressCallback);
break;
case 'forward-push':
result = await this.solveForwardPush(matrix, vector, progressCallback);
break;
case 'backward-push':
result = await this.solveBackwardPush(matrix, vector, progressCallback);
break;
case 'bidirectional':
result = await this.solveBidirectional(matrix, vector, progressCallback);
break;
default:
throw new SolverError(`Unknown method: ${this.config.method}`, ErrorCodes.INVALID_PARAMETERS);
}
return result;
}
catch (error) {
if (error instanceof SolverError) {
throw error;
}
throw new SolverError(`Solver failed: ${error}`, ErrorCodes.CONVERGENCE_FAILED);
}
}
/**
* Solve using Neumann series expansion
* x* = (I - D^(-1)R)^(-1) D^(-1) b = sum_{k=0}^∞ (D^(-1)R)^k D^(-1) b
*/
async solveNeumann(matrix, vector, progressCallback) {
const n = matrix.rows;
// Extract diagonal and off-diagonal parts
const diagonal = MatrixOperations.getDiagonalVector(matrix);
// Validate diagonal elements
for (let i = 0; i < n; i++) {
if (Math.abs(diagonal[i]) < 1e-15) {
throw new SolverError(`Zero or near-zero diagonal element at position ${i}: ${diagonal[i]}`, ErrorCodes.NUMERICAL_INSTABILITY);
}
}
const invD = VectorOperations.elementwiseDivide(VectorOperations.ones(n), diagonal);
// Initialize solution with D^(-1) b
let solution = VectorOperations.elementwiseMultiply(invD, vector);
let seriesTerm = [...solution];
let previousResidual = Infinity;
const state = {
iteration: 0,
residual: Infinity,
solution,
converged: false,
elapsedTime: 0,
series: [seriesTerm],
convergenceRate: 1.0
};
// Improved convergence detection
let stagnationCounter = 0;
const maxStagnation = 10;
for (let k = 1; k <= this.config.maxIterations; k++) {
this.timeoutController?.checkTimeout();
// Compute (D^(-1)R)^k D^(-1) b iteratively
// seriesTerm = D^(-1) * (R * seriesTerm)
const Rterm = this.computeOffDiagonalMultiply(matrix, seriesTerm);
seriesTerm = VectorOperations.elementwiseMultiply(invD, Rterm);
// Add to solution
solution = VectorOperations.add(solution, seriesTerm);
// Compute residual: ||Mx - b|| every few iterations (expensive)
if (k % 5 === 0 || k <= 10) {
const residualVec = VectorOperations.subtract(MatrixOperations.multiplyMatrixVector(matrix, solution), vector);
state.residual = VectorOperations.norm2(residualVec);
}
else {
// Estimate residual from series term norm
state.residual = VectorOperations.norm2(seriesTerm) * Math.sqrt(n);
}
state.iteration = k;
state.solution = [...solution];
state.elapsedTime = this.performanceMonitor.getElapsedTime();
state.series.push([...seriesTerm]);
// Check convergence
const convergenceInfo = this.convergenceChecker.checkConvergence(state.residual, this.config.epsilon);
state.converged = convergenceInfo.converged;
state.convergenceRate = convergenceInfo.rate;
// Detect stagnation
if (Math.abs(state.residual - previousResidual) < this.config.epsilon * 1e-6) {
stagnationCounter++;
if (stagnationCounter >= maxStagnation) {
console.warn(`Neumann series stagnated after ${k} iterations`);
break;
}
}
else {
stagnationCounter = 0;
}
if (progressCallback) {
progressCallback({
iteration: k,
residual: state.residual,
elapsed: state.elapsedTime
});
}
if (state.converged) {
break;
}
// Check if series term is becoming negligible (early termination)
const termNorm = VectorOperations.norm2(seriesTerm);
if (termNorm < this.config.epsilon * 1e-6) {
console.log(`Series term negligible after ${k} iterations`);
break;
}
// Prevent numerical overflow
if (!isFinite(state.residual) || state.residual > 1e15) {
throw new SolverError(`Numerical instability detected at iteration ${k}`, ErrorCodes.NUMERICAL_INSTABILITY, { residual: state.residual });
}
previousResidual = state.residual;
}
// Final accurate residual computation
const finalResidualVec = VectorOperations.subtract(MatrixOperations.multiplyMatrixVector(matrix, solution), vector);
state.residual = VectorOperations.norm2(finalResidualVec);
state.converged = state.residual < this.config.epsilon;
if (!state.converged && state.iteration >= this.config.maxIterations) {
throw new SolverError(`Neumann series failed to converge after ${this.config.maxIterations} iterations. Final residual: ${state.residual.toExponential(3)}`, ErrorCodes.CONVERGENCE_FAILED, {
finalResidual: state.residual,
iterations: state.iteration,
convergenceRate: state.convergenceRate
});
}
return {
solution: state.solution,
iterations: state.iteration,
residual: state.residual,
converged: state.converged,
method: 'neumann',
computeTime: state.elapsedTime,
memoryUsed: this.performanceMonitor.getMemoryIncrease()
};
}
/**
* Compute off-diagonal matrix-vector multiplication: (M - D) * v
* This computes R*v where R = M - D (off-diagonal part of matrix)
*/
computeOffDiagonalMultiply(matrix, vector) {
const n = matrix.rows;
const result = new Array(n).fill(0);
// For dense matrices
if (matrix.format === 'dense') {
const data = matrix.data;
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (i !== j) { // Skip diagonal
result[i] += data[i][j] * vector[j];
}
}
}
}
else {
// For sparse matrices (COO format)
const sparse = matrix;
for (let k = 0; k < sparse.values.length; k++) {
const i = sparse.rowIndices[k];
const j = sparse.colIndices[k];
if (i !== j) { // Skip diagonal
result[i] += sparse.values[k] * vector[j];
}
}
}
return result;
}
/**
* Solve using random walk sampling
*/
async solveRandomWalk(matrix, vector, progressCallback) {
const n = matrix.rows;
const rng = createSeededRandom(this.config.seed || Date.now());
// Convert to transition probabilities
const { transitions, absorptionProbs } = this.createTransitionMatrix(matrix);
let solution = VectorOperations.zeros(n);
let totalVariance = 0;
const state = {
iteration: 0,
residual: Infinity,
solution,
converged: false,
elapsedTime: 0,
walks: [],
currentEstimate: 0,
variance: 0,
confidence: 0
};
// Estimate each coordinate using random walks
for (let i = 0; i < n; i++) {
const estimates = [];
const numWalks = Math.max(100, Math.ceil(1 / (this.config.epsilon * this.config.epsilon)));
for (let walk = 0; walk < numWalks; walk++) {
const estimate = this.performRandomWalk(i, transitions, absorptionProbs, vector, rng);
estimates.push(estimate);
if (walk % 10 === 0) {
this.timeoutController?.checkTimeout();
}
}
// Compute mean and variance
const mean = estimates.reduce((sum, val) => sum + val, 0) / estimates.length;
const variance = estimates.reduce((sum, val) => sum + (val - mean) ** 2, 0) / (estimates.length - 1);
solution[i] = mean;
totalVariance += variance;
state.iteration = i + 1;
state.currentEstimate = mean;
state.variance = Math.sqrt(variance);
state.walks.push(estimates);
}
// Compute final residual
const residualVec = VectorOperations.subtract(MatrixOperations.multiplyMatrixVector(matrix, solution), vector);
state.residual = VectorOperations.norm2(residualVec);
state.solution = solution;
state.converged = state.residual < this.config.epsilon;
state.elapsedTime = this.performanceMonitor.getElapsedTime();
// For random walk, we're more lenient with convergence since it's probabilistic
if (!state.converged && state.residual > 10 * this.config.epsilon) {
// Only fail if we're really far off
throw new SolverError(`Random walk sampling failed to achieve desired accuracy`, ErrorCodes.CONVERGENCE_FAILED, { finalResidual: state.residual, variance: Math.sqrt(totalVariance) });
}
return {
solution: state.solution,
iterations: state.iteration,
residual: state.residual,
converged: state.converged,
method: 'random-walk',
computeTime: state.elapsedTime,
memoryUsed: this.performanceMonitor.getMemoryIncrease()
};
}
/**
* Create transition matrix for random walks
*/
createTransitionMatrix(matrix) {
const n = matrix.rows;
const transitions = Array(n).fill(null).map(() => Array(n).fill(0));
const absorptionProbs = new Array(n);
for (let i = 0; i < n; i++) {
const diagEntry = MatrixOperations.getDiagonal(matrix, i);
if (Math.abs(diagEntry) < 1e-15) {
throw new SolverError(`Zero diagonal at position ${i}`, ErrorCodes.NUMERICAL_INSTABILITY);
}
absorptionProbs[i] = 1 / diagEntry;
// Compute transition probabilities
for (let j = 0; j < n; j++) {
if (i !== j) {
const entry = MatrixOperations.getEntry(matrix, i, j);
transitions[i][j] = -entry / diagEntry;
}
}
}
return { transitions, absorptionProbs };
}
/**
* Perform a single random walk
*/
performRandomWalk(start, transitions, absorptionProbs, vector, rng) {
let current = start;
let value = 0;
const maxSteps = 1000; // Prevent infinite walks
for (let step = 0; step < maxSteps; step++) {
// Check for absorption
if (rng() < Math.abs(absorptionProbs[current])) {
value += vector[current] * absorptionProbs[current];
break;
}
// Choose next state based on transition probabilities
const cumulative = [];
let sum = 0;
for (let j = 0; j < transitions[current].length; j++) {
sum += Math.abs(transitions[current][j]);
cumulative.push(sum);
}
if (sum === 0) {
// No outgoing transitions, absorb here
value += vector[current] * absorptionProbs[current];
break;
}
const rand = rng() * sum;
for (let j = 0; j < cumulative.length; j++) {
if (rand <= cumulative[j]) {
current = j;
break;
}
}
}
return value;
}
/**
* Solve using forward push method
*/
async solveForwardPush(matrix, vector, progressCallback) {
const n = matrix.rows;
let approximate = VectorOperations.zeros(n);
let residual = [...vector];
const state = {
iteration: 0,
residual: Infinity,
solution: approximate,
converged: false,
elapsedTime: 0,
residualVector: residual,
approximateVector: approximate,
pushDirection: 'forward'
};
for (let iter = 0; iter < this.config.maxIterations; iter++) {
this.timeoutController?.checkTimeout();
// Find node with largest residual
let maxResidual = 0;
let maxNode = -1;
for (let i = 0; i < n; i++) {
if (Math.abs(residual[i]) > maxResidual) {
maxResidual = Math.abs(residual[i]);
maxNode = i;
}
}
if (maxResidual < this.config.epsilon) {
state.converged = true;
break;
}
// Push from maxNode
const diagEntry = MatrixOperations.getDiagonal(matrix, maxNode);
if (Math.abs(diagEntry) < 1e-15) {
throw new SolverError(`Zero diagonal at position ${maxNode}`, ErrorCodes.NUMERICAL_INSTABILITY);
}
const pushValue = residual[maxNode] / diagEntry;
approximate[maxNode] += pushValue;
residual[maxNode] = 0;
// Update residuals of neighbors
for (let j = 0; j < n; j++) {
if (j !== maxNode) {
const entry = MatrixOperations.getEntry(matrix, j, maxNode);
residual[j] -= entry * pushValue;
}
}
state.iteration = iter + 1;
state.residual = VectorOperations.norm2(residual);
state.solution = [...approximate];
state.residualVector = [...residual];
state.approximateVector = [...approximate];
state.elapsedTime = this.performanceMonitor.getElapsedTime();
if (progressCallback && iter % 10 === 0) {
progressCallback({
iteration: iter + 1,
residual: state.residual,
elapsed: state.elapsedTime
});
}
}
if (!state.converged) {
throw new SolverError(`Forward push failed to converge after ${this.config.maxIterations} iterations`, ErrorCodes.CONVERGENCE_FAILED, { finalResidual: state.residual });
}
return {
solution: state.solution,
iterations: state.iteration,
residual: state.residual,
converged: state.converged,
method: 'forward-push',
computeTime: state.elapsedTime,
memoryUsed: this.performanceMonitor.getMemoryIncrease()
};
}
/**
* Solve using backward push method
*/
async solveBackwardPush(matrix, vector, progressCallback) {
// For backward push, we solve M^T y = e_i and then compute x_i = y^T b
// This is more complex and typically used for single coordinate estimation
return this.solveForwardPush(matrix, vector, progressCallback); // Simplified for now
}
/**
* Solve using bidirectional approach (combine forward and backward)
*/
async solveBidirectional(matrix, vector, progressCallback) {
// Start with forward push
const forwardResult = await this.solveForwardPush(matrix, vector, progressCallback);
// Could enhance with backward refinement, but for now return forward result
return {
...forwardResult,
method: 'bidirectional'
};
}
/**
* Estimate a single entry of the solution M^(-1)b
*/
async estimateEntry(matrix, vector, config) {
MatrixOperations.validateMatrix(matrix);
// Enhanced validation with better error messages
if (config.row < 0 || config.row >= matrix.rows) {
throw new SolverError(`Row index ${config.row} out of bounds. Matrix has ${matrix.rows} rows (valid range: 0-${matrix.rows - 1})`, ErrorCodes.INVALID_PARAMETERS, { row: config.row, matrixRows: matrix.rows });
}
if (config.column < 0 || config.column >= matrix.cols) {
throw new SolverError(`Column index ${config.column} out of bounds. Matrix has ${matrix.cols} columns (valid range: 0-${matrix.cols - 1})`, ErrorCodes.INVALID_PARAMETERS, { column: config.column, matrixCols: matrix.cols });
}
if (vector.length !== matrix.rows) {
throw new SolverError(`Vector length ${vector.length} does not match matrix rows ${matrix.rows}`, ErrorCodes.INVALID_DIMENSIONS, { vectorLength: vector.length, matrixRows: matrix.rows });
}
ValidationUtils.validatePositiveNumber(config.epsilon, 'epsilon');
ValidationUtils.validateRange(config.confidence, 0, 1, 'confidence');
const rng = createSeededRandom(this.config.seed || Date.now());
const estimates = [];
// Reduce samples for faster computation, especially for smaller matrices
const maxSamples = Math.min(1000, Math.max(50, Math.ceil(1 / Math.sqrt(config.epsilon))));
const timeoutMs = this.config.timeout || 10000; // 10 second default timeout
const startTime = Date.now();
try {
if (config.method === 'random-walk') {
const { transitions, absorptionProbs } = this.createTransitionMatrix(matrix);
for (let i = 0; i < maxSamples; i++) {
// Check timeout every 10 samples
if (i % 10 === 0) {
const elapsed = Date.now() - startTime;
if (elapsed > timeoutMs) {
console.warn(`EstimateEntry timeout after ${elapsed}ms, using ${estimates.length} samples`);
break;
}
}
const estimate = this.performRandomWalk(config.row, transitions, absorptionProbs, vector, rng);
estimates.push(estimate);
// Early termination if estimates are converging
if (i > 20 && i % 20 === 0) {
const recentEstimates = estimates.slice(-20);
const mean = recentEstimates.reduce((sum, val) => sum + val, 0) / recentEstimates.length;
const variance = recentEstimates.reduce((sum, val) => sum + (val - mean) ** 2, 0) / recentEstimates.length;
if (Math.sqrt(variance) < config.epsilon) {
console.log(`EstimateEntry converged early after ${i} samples`);
break;
}
}
}
}
else {
// Use Neumann series estimation - much faster and more reliable
if (config.column >= matrix.cols) {
throw new SolverError(`Column index ${config.column} exceeds matrix dimensions ${matrix.cols}`, ErrorCodes.INVALID_PARAMETERS);
}
const e_i = new Array(matrix.cols).fill(0);
e_i[config.column] = 1;
const result = await this.solve(matrix, e_i);
const estimate = result.solution[config.row];
return {
estimate,
variance: 0,
confidence: result.converged ? 1.0 : 0.5
};
}
if (estimates.length === 0) {
throw new SolverError('No estimates were generated', ErrorCodes.CONVERGENCE_FAILED);
}
const mean = estimates.reduce((sum, val) => sum + val, 0) / estimates.length;
const variance = estimates.length > 1
? estimates.reduce((sum, val) => sum + (val - mean) ** 2, 0) / (estimates.length - 1)
: 0;
// Sanity check for numerical issues
if (!isFinite(mean) || !isFinite(variance)) {
throw new SolverError('Numerical instability in estimation', ErrorCodes.NUMERICAL_INSTABILITY, { mean, variance, numSamples: estimates.length });
}
return {
estimate: mean,
variance,
confidence: config.confidence
};
}
catch (error) {
if (error instanceof SolverError) {
throw error;
}
throw new SolverError(`Entry estimation failed: ${error}`, ErrorCodes.CONVERGENCE_FAILED, { row: config.row, column: config.column, method: config.method });
}
}
/**
* Compute PageRank using the solver
*/
async computePageRank(adjacency, config) {
MatrixOperations.validateMatrix(adjacency);
ValidationUtils.validateRange(config.damping, 0, 1, 'damping');
ValidationUtils.validatePositiveNumber(config.epsilon, 'epsilon');
if (adjacency.rows !== adjacency.cols) {
throw new SolverError('Adjacency matrix must be square', ErrorCodes.INVALID_DIMENSIONS);
}
const n = adjacency.rows;
// Create the PageRank system: (I - α P^T) x = (1-α)/n * 1
// where P is the column-stochastic transition matrix
// Normalize adjacency to get transition matrix
const outDegrees = new Array(n).fill(0);
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
outDegrees[i] += MatrixOperations.getEntry(adjacency, i, j);
}
}
// Build system matrix I - α P^T
const systemMatrix = Array(n).fill(null).map(() => Array(n).fill(0));
for (let i = 0; i < n; i++) {
systemMatrix[i][i] = 1; // Identity part
for (let j = 0; j < n; j++) {
if (outDegrees[j] > 0) {
const transitionProb = MatrixOperations.getEntry(adjacency, j, i) / outDegrees[j];
systemMatrix[i][j] -= config.damping * transitionProb;
}
}
}
const systemMatrixFormatted = {
rows: n,
cols: n,
data: systemMatrix,
format: 'dense'
};
// Right-hand side
const rhs = config.personalized || VectorOperations.scale(VectorOperations.ones(n), (1 - config.damping) / n);
// Solve the system
const solverConfig = {
method: this.config.method,
epsilon: config.epsilon,
maxIterations: config.maxIterations,
timeout: this.config.timeout
};
const solver = new SublinearSolver(solverConfig);
const result = await solver.solve(systemMatrixFormatted, rhs);
// Return the PageRank vector directly as expected by GraphTools
return result.solution;
}
}
+150
View File
@@ -0,0 +1,150 @@
/**
* Core type definitions for the sublinear-time solver
*/
export interface SparseMatrix {
rows: number;
cols: number;
values: number[];
rowIndices: number[];
colIndices: number[];
format: 'coo' | 'csr' | 'csc';
}
export interface DenseMatrix {
rows: number;
cols: number;
data: number[][];
format: 'dense';
}
export type Matrix = SparseMatrix | DenseMatrix;
export type Vector = number[];
export interface SolverConfig {
method: 'neumann' | 'random-walk' | 'forward-push' | 'backward-push' | 'bidirectional';
epsilon: number;
maxIterations: number;
timeout?: number | undefined;
enableProgress?: boolean | undefined;
seed?: number | undefined;
}
export interface SolverResult {
solution: Vector;
iterations: number;
residual: number;
converged: boolean;
method: string;
computeTime: number;
memoryUsed: number;
}
export interface MatrixAnalysis {
isDiagonallyDominant: boolean;
dominanceType: 'row' | 'column' | 'none';
dominanceStrength: number;
spectralRadius?: number;
condition?: number;
pNormGap?: number;
isSymmetric: boolean;
sparsity: number;
size: {
rows: number;
cols: number;
};
}
export interface RandomWalkConfig {
startNode?: number;
endNode?: number;
walkLength: number;
numWalks: number;
seed?: number;
}
export interface PageRankConfig {
damping: number;
personalized?: Vector;
epsilon: number;
maxIterations: number;
}
export interface EstimationConfig {
row: number;
column: number;
epsilon: number;
confidence: number;
method: 'neumann' | 'random-walk' | 'monte-carlo';
}
export declare class SolverError extends Error {
code: string;
details?: unknown;
constructor(message: string, code: string, details?: unknown);
}
export declare const ErrorCodes: {
readonly NOT_DIAGONALLY_DOMINANT: "E001";
readonly CONVERGENCE_FAILED: "E002";
readonly INVALID_MATRIX: "E003";
readonly TIMEOUT: "E004";
readonly INVALID_DIMENSIONS: "E005";
readonly NUMERICAL_INSTABILITY: "E006";
readonly MEMORY_LIMIT_EXCEEDED: "E007";
readonly INVALID_PARAMETERS: "E008";
};
export type ProgressCallback = (progress: {
iteration: number;
residual: number;
elapsed: number;
estimated?: number;
}) => void;
export interface SolveParams {
matrix: Matrix;
vector: Vector;
method?: 'neumann' | 'random-walk' | 'forward-push' | 'backward-push' | 'bidirectional' | undefined;
epsilon?: number | undefined;
maxIterations?: number | undefined;
timeout?: number | undefined;
}
export interface EstimateEntryParams {
matrix: Matrix;
vector: Vector;
row: number;
column: number;
epsilon: number;
confidence?: number | undefined;
method?: 'neumann' | 'random-walk' | 'monte-carlo' | undefined;
}
export interface AnalyzeMatrixParams {
matrix: Matrix;
checkDominance?: boolean;
computeGap?: boolean;
estimateCondition?: boolean;
checkSymmetry?: boolean;
}
export interface PageRankParams {
adjacency: Matrix;
damping?: number | undefined;
personalized?: Vector | undefined;
epsilon?: number | undefined;
maxIterations?: number | undefined;
}
export interface EffectiveResistanceParams {
laplacian: Matrix;
source: number;
target: number;
epsilon?: number;
}
export interface AlgorithmState {
iteration: number;
residual: number;
solution: Vector;
converged: boolean;
elapsedTime: number;
}
export interface NeumannState extends AlgorithmState {
series: Vector[];
convergenceRate: number;
}
export interface RandomWalkState extends AlgorithmState {
walks: number[][];
currentEstimate: number;
variance: number;
confidence: number;
}
export interface PushState extends AlgorithmState {
residualVector: Vector;
approximateVector: Vector;
pushDirection: 'forward' | 'backward';
}
+24
View File
@@ -0,0 +1,24 @@
/**
* Core type definitions for the sublinear-time solver
*/
// Error types
export class SolverError extends Error {
code;
details;
constructor(message, code, details) {
super(message);
this.code = code;
this.details = details;
this.name = 'SolverError';
}
}
export const ErrorCodes = {
NOT_DIAGONALLY_DOMINANT: 'E001',
CONVERGENCE_FAILED: 'E002',
INVALID_MATRIX: 'E003',
TIMEOUT: 'E004',
INVALID_DIMENSIONS: 'E005',
NUMERICAL_INSTABILITY: 'E006',
MEMORY_LIMIT_EXCEEDED: 'E007',
INVALID_PARAMETERS: 'E008'
};
+163
View File
@@ -0,0 +1,163 @@
/**
* Utility functions for sublinear-time solvers
*/
import { Vector } from './types.js';
export declare class VectorOperations {
/**
* Vector addition: result = a + b
*/
static add(a: Vector, b: Vector): Vector;
/**
* Vector subtraction: result = a - b
*/
static subtract(a: Vector, b: Vector): Vector;
/**
* Scalar multiplication: result = scalar * vector
*/
static scale(vector: Vector, scalar: number): Vector;
/**
* Dot product of two vectors
*/
static dot(a: Vector, b: Vector): number;
/**
* L2 norm of vector
*/
static norm2(vector: Vector): number;
/**
* L1 norm of vector
*/
static norm1(vector: Vector): number;
/**
* L-infinity norm of vector
*/
static normInf(vector: Vector): number;
/**
* Create zero vector of specified length
*/
static zeros(length: number): Vector;
/**
* Create vector filled with ones
*/
static ones(length: number): Vector;
/**
* Create random vector with values in [0, 1)
*/
static random(length: number, seed?: number): Vector;
/**
* Normalize vector to unit length
*/
static normalize(vector: Vector): Vector;
/**
* Element-wise multiplication
*/
static elementwiseMultiply(a: Vector, b: Vector): Vector;
/**
* Element-wise division
*/
static elementwiseDivide(a: Vector, b: Vector): Vector;
/**
* Check if vectors are approximately equal
*/
static isEqual(a: Vector, b: Vector, tolerance?: number): boolean;
/**
* Linear interpolation between two vectors
*/
static lerp(a: Vector, b: Vector, t: number): Vector;
}
/**
* Create a seeded random number generator
*/
export declare function createSeededRandom(seed: number): () => number;
/**
* Performance monitoring utilities
*/
export declare class PerformanceMonitor {
private startTime;
private memoryStart;
constructor();
/**
* Get elapsed time in milliseconds
*/
getElapsedTime(): number;
/**
* Get memory usage in MB
*/
getMemoryUsage(): number;
/**
* Get memory increase since start
*/
getMemoryIncrease(): number;
/**
* Reset timer and memory baseline
*/
reset(): void;
}
/**
* Convergence checking utilities
*/
export declare class ConvergenceChecker {
private history;
private readonly maxHistory;
constructor(maxHistory?: number);
/**
* Add residual to history and check convergence
*/
checkConvergence(residual: number, tolerance: number): {
converged: boolean;
rate: number;
trend: 'improving' | 'stagnant' | 'diverging';
};
/**
* Get average convergence rate over history
*/
getAverageRate(): number;
/**
* Clear convergence history
*/
reset(): void;
}
/**
* Timeout utility
*/
export declare class TimeoutController {
private startTime;
private timeoutMs;
constructor(timeoutMs: number);
/**
* Check if timeout has been exceeded
*/
isExpired(): boolean;
/**
* Get remaining time in milliseconds
*/
remainingTime(): number;
/**
* Throw timeout error if expired
*/
checkTimeout(): void;
}
/**
* Validation utilities
*/
export declare class ValidationUtils {
/**
* Validate that value is a finite number
*/
static validateFiniteNumber(value: number, name: string): void;
/**
* Validate that value is a positive number
*/
static validatePositiveNumber(value: number, name: string): void;
/**
* Validate that value is a non-negative number
*/
static validateNonNegativeNumber(value: number, name: string): void;
/**
* Validate that value is within range [min, max]
*/
static validateRange(value: number, min: number, max: number, name: string): void;
/**
* Validate that integer is within range [min, max]
*/
static validateIntegerRange(value: number, min: number, max: number, name: string): void;
}
+322
View File
@@ -0,0 +1,322 @@
/**
* Utility functions for sublinear-time solvers
*/
import { SolverError, ErrorCodes } from './types.js';
export class VectorOperations {
/**
* Vector addition: result = a + b
*/
static add(a, b) {
if (a.length !== b.length) {
throw new SolverError(`Vector dimensions don't match: ${a.length} vs ${b.length}`, ErrorCodes.INVALID_DIMENSIONS);
}
return a.map((val, i) => val + b[i]);
}
/**
* Vector subtraction: result = a - b
*/
static subtract(a, b) {
if (a.length !== b.length) {
throw new SolverError(`Vector dimensions don't match: ${a.length} vs ${b.length}`, ErrorCodes.INVALID_DIMENSIONS);
}
return a.map((val, i) => val - b[i]);
}
/**
* Scalar multiplication: result = scalar * vector
*/
static scale(vector, scalar) {
return vector.map(val => val * scalar);
}
/**
* Dot product of two vectors
*/
static dot(a, b) {
if (a.length !== b.length) {
throw new SolverError(`Vector dimensions don't match: ${a.length} vs ${b.length}`, ErrorCodes.INVALID_DIMENSIONS);
}
return a.reduce((sum, val, i) => sum + val * b[i], 0);
}
/**
* L2 norm of vector
*/
static norm2(vector) {
return Math.sqrt(vector.reduce((sum, val) => sum + val * val, 0));
}
/**
* L1 norm of vector
*/
static norm1(vector) {
return vector.reduce((sum, val) => sum + Math.abs(val), 0);
}
/**
* L-infinity norm of vector
*/
static normInf(vector) {
return Math.max(...vector.map(Math.abs));
}
/**
* Create zero vector of specified length
*/
static zeros(length) {
return new Array(length).fill(0);
}
/**
* Create vector filled with ones
*/
static ones(length) {
return new Array(length).fill(1);
}
/**
* Create random vector with values in [0, 1)
*/
static random(length, seed) {
const rng = seed !== undefined ? createSeededRandom(seed) : Math.random;
return Array.from({ length }, () => rng());
}
/**
* Normalize vector to unit length
*/
static normalize(vector) {
const norm = this.norm2(vector);
if (norm === 0) {
throw new SolverError('Cannot normalize zero vector', ErrorCodes.NUMERICAL_INSTABILITY);
}
return this.scale(vector, 1 / norm);
}
/**
* Element-wise multiplication
*/
static elementwiseMultiply(a, b) {
if (a.length !== b.length) {
throw new SolverError(`Vector dimensions don't match: ${a.length} vs ${b.length}`, ErrorCodes.INVALID_DIMENSIONS);
}
return a.map((val, i) => val * b[i]);
}
/**
* Element-wise division
*/
static elementwiseDivide(a, b) {
if (a.length !== b.length) {
throw new SolverError(`Vector dimensions don't match: ${a.length} vs ${b.length}`, ErrorCodes.INVALID_DIMENSIONS);
}
return a.map((val, i) => {
if (Math.abs(b[i]) < 1e-15) {
throw new SolverError(`Division by zero at index ${i}`, ErrorCodes.NUMERICAL_INSTABILITY);
}
return val / b[i];
});
}
/**
* Check if vectors are approximately equal
*/
static isEqual(a, b, tolerance = 1e-10) {
if (a.length !== b.length) {
return false;
}
for (let i = 0; i < a.length; i++) {
if (Math.abs(a[i] - b[i]) > tolerance) {
return false;
}
}
return true;
}
/**
* Linear interpolation between two vectors
*/
static lerp(a, b, t) {
if (a.length !== b.length) {
throw new SolverError(`Vector dimensions don't match: ${a.length} vs ${b.length}`, ErrorCodes.INVALID_DIMENSIONS);
}
return a.map((val, i) => val + t * (b[i] - val));
}
}
/**
* Create a seeded random number generator
*/
export function createSeededRandom(seed) {
let state = seed;
return function () {
// Simple linear congruential generator
state = (state * 1664525 + 1013904223) % 0x100000000;
return state / 0x100000000;
};
}
/**
* Performance monitoring utilities
*/
export class PerformanceMonitor {
startTime;
memoryStart;
constructor() {
this.startTime = Date.now();
this.memoryStart = this.getMemoryUsage();
}
/**
* Get elapsed time in milliseconds
*/
getElapsedTime() {
return Date.now() - this.startTime;
}
/**
* Get memory usage in MB
*/
getMemoryUsage() {
if (typeof process !== 'undefined' && process.memoryUsage) {
const usage = process.memoryUsage();
return Math.round(usage.heapUsed / 1024 / 1024);
}
return 0;
}
/**
* Get memory increase since start
*/
getMemoryIncrease() {
return this.getMemoryUsage() - this.memoryStart;
}
/**
* Reset timer and memory baseline
*/
reset() {
this.startTime = Date.now();
this.memoryStart = this.getMemoryUsage();
}
}
/**
* Convergence checking utilities
*/
export class ConvergenceChecker {
history = [];
maxHistory;
constructor(maxHistory = 10) {
this.maxHistory = maxHistory;
}
/**
* Add residual to history and check convergence
*/
checkConvergence(residual, tolerance) {
this.history.push(residual);
if (this.history.length > this.maxHistory) {
this.history.shift();
}
const converged = residual < tolerance;
let rate = 1.0;
let trend = 'improving';
if (this.history.length >= 2) {
const recent = this.history.slice(-2);
rate = recent[1] / recent[0];
if (rate < 0.95) {
trend = 'improving';
}
else if (rate > 1.05) {
trend = 'diverging';
}
else {
trend = 'stagnant';
}
}
return { converged, rate, trend };
}
/**
* Get average convergence rate over history
*/
getAverageRate() {
if (this.history.length < 2) {
return 1.0;
}
let totalRate = 0;
let count = 0;
for (let i = 1; i < this.history.length; i++) {
if (this.history[i - 1] > 0) {
totalRate += this.history[i] / this.history[i - 1];
count++;
}
}
return count > 0 ? totalRate / count : 1.0;
}
/**
* Clear convergence history
*/
reset() {
this.history = [];
}
}
/**
* Timeout utility
*/
export class TimeoutController {
startTime;
timeoutMs;
constructor(timeoutMs) {
this.startTime = Date.now();
this.timeoutMs = timeoutMs;
}
/**
* Check if timeout has been exceeded
*/
isExpired() {
return Date.now() - this.startTime > this.timeoutMs;
}
/**
* Get remaining time in milliseconds
*/
remainingTime() {
return Math.max(0, this.timeoutMs - (Date.now() - this.startTime));
}
/**
* Throw timeout error if expired
*/
checkTimeout() {
if (this.isExpired()) {
throw new SolverError(`Operation timed out after ${this.timeoutMs}ms`, ErrorCodes.TIMEOUT);
}
}
}
/**
* Validation utilities
*/
export class ValidationUtils {
/**
* Validate that value is a finite number
*/
static validateFiniteNumber(value, name) {
if (!Number.isFinite(value)) {
throw new SolverError(`${name} must be a finite number, got ${value}`, ErrorCodes.INVALID_PARAMETERS);
}
}
/**
* Validate that value is a positive number
*/
static validatePositiveNumber(value, name) {
this.validateFiniteNumber(value, name);
if (value <= 0) {
throw new SolverError(`${name} must be positive, got ${value}`, ErrorCodes.INVALID_PARAMETERS);
}
}
/**
* Validate that value is a non-negative number
*/
static validateNonNegativeNumber(value, name) {
this.validateFiniteNumber(value, name);
if (value < 0) {
throw new SolverError(`${name} must be non-negative, got ${value}`, ErrorCodes.INVALID_PARAMETERS);
}
}
/**
* Validate that value is within range [min, max]
*/
static validateRange(value, min, max, name) {
this.validateFiniteNumber(value, name);
if (value < min || value > max) {
throw new SolverError(`${name} must be between ${min} and ${max}, got ${value}`, ErrorCodes.INVALID_PARAMETERS);
}
}
/**
* Validate that integer is within range [min, max]
*/
static validateIntegerRange(value, min, max, name) {
if (!Number.isInteger(value)) {
throw new SolverError(`${name} must be an integer, got ${value}`, ErrorCodes.INVALID_PARAMETERS);
}
this.validateRange(value, min, max, name);
}
}
+24
View File
@@ -0,0 +1,24 @@
/**
* WASM Bridge - Actually functional WASM integration
*
* This module properly loads and uses the Rust-compiled WASM modules
*/
/**
* Load the temporal neural solver WASM
*/
export declare function loadTemporalNeuralSolver(): Promise<any>;
/**
* Load the graph reasoner WASM for PageRank
*/
export declare function loadGraphReasonerWasm(): Promise<any>;
/**
* Load all available WASM modules
*/
export declare function initializeAllWasm(): Promise<{
temporal: any;
graph: any;
hasWasm: boolean;
}>;
declare function multiplyMatrixVectorJS(matrix: Float64Array, vector: Float64Array, rows: number, cols: number): Float64Array;
declare function computePageRankJS(adjacency: Float64Array, n: number, damping: number, iterations: number): Float64Array;
export { multiplyMatrixVectorJS, computePageRankJS };
+208
View File
@@ -0,0 +1,208 @@
/**
* WASM Bridge - Actually functional WASM integration
*
* This module properly loads and uses the Rust-compiled WASM modules
*/
import { readFileSync, existsSync } from 'fs';
import { join, dirname } from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
// Cache for loaded WASM instances
const wasmCache = new Map();
/**
* Load the temporal neural solver WASM
*/
export async function loadTemporalNeuralSolver() {
if (wasmCache.has('temporal_neural')) {
return wasmCache.get('temporal_neural');
}
try {
const wasmPath = join(__dirname, '..', 'wasm', 'temporal_neural_solver_bg.wasm');
// Check if file exists
if (!existsSync(wasmPath)) {
console.warn(`WASM file not found at ${wasmPath}`);
return null;
}
const wasmBuffer = readFileSync(wasmPath);
// Minimal imports for temporal neural solver
const imports = {
wbg: {
__wbg_random_e6e0a85ff4db8ab6: () => Math.random(),
__wbindgen_throw: (ptr, len) => {
throw new Error(`WASM error at ${ptr}, len ${len}`);
}
}
};
const { instance } = await globalThis.WebAssembly.instantiate(wasmBuffer, imports);
// Create wrapper with actual functions
const solver = {
memory: instance.exports.memory,
// Matrix multiplication using WASM memory
multiplyMatrixVector: (matrix, vector, rows, cols) => {
if (!instance.exports.__wbindgen_malloc) {
// Fallback to JS if WASM doesn't have allocator
return multiplyMatrixVectorJS(matrix, vector, rows, cols);
}
// Allocate memory in WASM
const matrixPtr = instance.exports.__wbindgen_malloc(matrix.byteLength, 8);
const vectorPtr = instance.exports.__wbindgen_malloc(vector.byteLength, 8);
const resultPtr = instance.exports.__wbindgen_malloc(rows * 8, 8);
// Copy data to WASM memory
const memory = new Float64Array(instance.exports.memory.buffer);
memory.set(matrix, matrixPtr / 8);
memory.set(vector, vectorPtr / 8);
// Call WASM function if it exists
if (instance.exports.matrix_multiply_vector) {
instance.exports.matrix_multiply_vector(matrixPtr, vectorPtr, resultPtr, rows, cols);
}
else {
// Use WASM memory but JS computation
for (let i = 0; i < rows; i++) {
let sum = 0;
for (let j = 0; j < cols; j++) {
sum += memory[matrixPtr / 8 + i * cols + j] * memory[vectorPtr / 8 + j];
}
memory[resultPtr / 8 + i] = sum;
}
}
// Get result
const result = new Float64Array(rows);
result.set(memory.slice(resultPtr / 8, resultPtr / 8 + rows));
// Free WASM memory
if (instance.exports.__wbindgen_free) {
instance.exports.__wbindgen_free(matrixPtr, matrix.byteLength, 8);
instance.exports.__wbindgen_free(vectorPtr, vector.byteLength, 8);
instance.exports.__wbindgen_free(resultPtr, rows * 8, 8);
}
return result;
},
// Get memory stats
getMemoryUsage: () => {
return instance.exports.memory.buffer.byteLength;
}
};
wasmCache.set('temporal_neural', solver);
return solver;
}
catch (error) {
console.warn('Failed to load temporal neural WASM, using JS fallback');
return null;
}
}
/**
* Load the graph reasoner WASM for PageRank
*/
export async function loadGraphReasonerWasm() {
if (wasmCache.has('graph_reasoner')) {
return wasmCache.get('graph_reasoner');
}
try {
const wasmPath = join(__dirname, '..', 'wasm', 'graph_reasoner_bg.wasm');
const wasmBuffer = readFileSync(wasmPath);
// Graph reasoner needs more imports
const imports = {
wbg: {
__wbindgen_object_drop_ref: () => { },
__wbindgen_string_new: (ptr, len) => ptr,
__wbindgen_throw: (ptr, len) => {
throw new Error(`WASM error at ${ptr}`);
},
__wbg_random_e6e0a85ff4db8ab6: () => Math.random(),
__wbg_now_3141b3797eb98e0b: () => Date.now()
}
};
const { instance } = await globalThis.WebAssembly.instantiate(wasmBuffer, imports);
const reasoner = {
memory: instance.exports.memory,
// PageRank computation using WASM
computePageRank: (adjacency, n, damping = 0.85, iterations = 100) => {
// Check if we have the actual WASM function
if (instance.exports.pagerank_compute) {
const adjPtr = instance.exports.__wbindgen_malloc(adjacency.byteLength, 8);
const resultPtr = instance.exports.__wbindgen_malloc(n * 8, 8);
const memory = new Float64Array(instance.exports.memory.buffer);
memory.set(adjacency, adjPtr / 8);
instance.exports.pagerank_compute(adjPtr, resultPtr, n, damping, iterations);
const result = new Float64Array(n);
result.set(memory.slice(resultPtr / 8, resultPtr / 8 + n));
instance.exports.__wbindgen_free(adjPtr, adjacency.byteLength, 8);
instance.exports.__wbindgen_free(resultPtr, n * 8, 8);
return result;
}
// Fallback PageRank in JS using WASM memory for speed
return computePageRankJS(adjacency, n, damping, iterations);
}
};
wasmCache.set('graph_reasoner', reasoner);
return reasoner;
}
catch (error) {
console.warn('Failed to load graph reasoner WASM, using JS fallback');
return null;
}
}
/**
* Load all available WASM modules
*/
export async function initializeAllWasm() {
const [temporal, graph] = await Promise.all([
loadTemporalNeuralSolver(),
loadGraphReasonerWasm()
]);
const hasWasm = !!(temporal || graph);
if (hasWasm) {
console.log('✅ WASM acceleration enabled');
if (temporal)
console.log(' - Temporal Neural Solver');
if (graph)
console.log(' - Graph Reasoner');
}
else {
console.log('⚠️ Running in pure JavaScript mode');
}
return { temporal, graph, hasWasm };
}
// JavaScript fallbacks
function multiplyMatrixVectorJS(matrix, vector, rows, cols) {
const result = new Float64Array(rows);
for (let i = 0; i < rows; i++) {
let sum = 0;
for (let j = 0; j < cols; j++) {
sum += matrix[i * cols + j] * vector[j];
}
result[i] = sum;
}
return result;
}
function computePageRankJS(adjacency, n, damping, iterations) {
const rank = new Float64Array(n);
const newRank = new Float64Array(n);
// Initialize with 1/n
for (let i = 0; i < n; i++) {
rank[i] = 1.0 / n;
}
for (let iter = 0; iter < iterations; iter++) {
// Calculate new ranks
for (let i = 0; i < n; i++) {
newRank[i] = (1 - damping) / n;
for (let j = 0; j < n; j++) {
if (adjacency[j * n + i] > 0) {
// Count outgoing edges from j
let outDegree = 0;
for (let k = 0; k < n; k++) {
if (adjacency[j * n + k] > 0)
outDegree++;
}
if (outDegree > 0) {
newRank[i] += damping * rank[j] / outDegree;
}
}
}
}
// Swap arrays
rank.set(newRank);
}
return rank;
}
export { multiplyMatrixVectorJS, computePageRankJS };
@@ -0,0 +1,59 @@
/**
* Real WASM Integration for Sublinear Time Solver
*
* This module properly integrates our Rust WASM components:
* - GraphReasoner: Fast PageRank and graph algorithms
* - TemporalNeuralSolver: Neural network accelerated matrix operations
* - StrangeLoop: Quantum-enhanced solving with nanosecond precision
* - NanoScheduler: Ultra-low latency task scheduling
*/
import { Matrix, Vector } from './types.js';
/**
* GraphReasoner WASM for PageRank and graph algorithms
*/
export declare class GraphReasonerWASM {
private instance;
private reasoner;
initialize(): Promise<boolean>;
/**
* Compute PageRank using WASM acceleration
*/
computePageRank(adjacencyMatrix: Matrix, damping?: number, iterations?: number): Float64Array;
private pageRankJS;
}
/**
* TemporalNeuralSolver WASM for ultra-fast matrix operations
*/
export declare class TemporalNeuralWASM {
private instance;
private solver;
initialize(): Promise<boolean>;
/**
* Ultra-fast matrix-vector multiplication
*/
multiplyMatrixVector(matrix: Float64Array, vector: Float64Array, rows: number, cols: number): Float64Array;
private multiplyMatrixVectorJS;
/**
* Predict solution with temporal advantage
*/
predictWithTemporalAdvantage(matrix: Matrix, vector: Vector, distanceKm?: number): Promise<{
solution: Vector;
temporalAdvantageMs: number;
lightTravelTimeMs: number;
computeTimeMs: number;
}>;
}
/**
* Main WASM integration manager
*/
export declare class WASMAccelerator {
private graphReasoner;
private temporalNeural;
private initialized;
constructor();
initialize(): Promise<boolean>;
get isInitialized(): boolean;
getGraphReasoner(): GraphReasonerWASM;
getTemporalNeural(): TemporalNeuralWASM;
}
export declare const wasmAccelerator: WASMAccelerator;
@@ -0,0 +1,318 @@
/**
* Real WASM Integration for Sublinear Time Solver
*
* This module properly integrates our Rust WASM components:
* - GraphReasoner: Fast PageRank and graph algorithms
* - TemporalNeuralSolver: Neural network accelerated matrix operations
* - StrangeLoop: Quantum-enhanced solving with nanosecond precision
* - NanoScheduler: Ultra-low latency task scheduling
*/
import { existsSync, readFileSync } from 'fs';
import { join, dirname } from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
// Cache for loaded WASM instances
const wasmModules = new Map();
/**
* Find WASM file in various possible locations
*/
function findWasmPath(filename) {
const paths = [
join(__dirname, '..', 'wasm', filename),
join(__dirname, '..', '..', 'dist', 'wasm', filename),
join(process.cwd(), 'dist', 'wasm', filename),
join(process.cwd(), 'node_modules', 'sublinear-time-solver', 'dist', 'wasm', filename)
];
for (const path of paths) {
if (existsSync(path)) {
return path;
}
}
return null;
}
/**
* GraphReasoner WASM for PageRank and graph algorithms
*/
export class GraphReasonerWASM {
instance;
reasoner;
async initialize() {
try {
const wasmPath = findWasmPath('graph_reasoner_bg.wasm');
if (!wasmPath) {
console.warn('GraphReasoner WASM not found');
return false;
}
const wasmBuffer = readFileSync(wasmPath);
// Initialize WASM with proper imports
const imports = {
wbg: {
__wbindgen_object_drop_ref: () => { },
__wbindgen_string_new: (ptr, len) => ptr,
__wbindgen_throw: (ptr, len) => {
throw new Error(`WASM error at ${ptr}`);
},
__wbg_random_e6e0a85ff4db8ab6: () => Math.random(),
__wbg_now_3141b3797eb98e0b: () => Date.now()
}
};
const { instance } = await globalThis.WebAssembly.instantiate(wasmBuffer, imports);
this.instance = instance;
// Create a GraphReasoner instance if the export exists
if (instance.exports.GraphReasoner) {
this.reasoner = new instance.exports.GraphReasoner();
}
console.log('✅ GraphReasoner WASM loaded successfully');
return true;
}
catch (error) {
console.error('Failed to load GraphReasoner:', error);
return false;
}
}
/**
* Compute PageRank using WASM acceleration
*/
computePageRank(adjacencyMatrix, damping = 0.85, iterations = 100) {
if (!this.instance) {
throw new Error('GraphReasoner not initialized');
}
const n = adjacencyMatrix.rows;
// If we have the PageRank function exported
if (this.instance.exports.pagerank_compute) {
const flatMatrix = new Float64Array(n * n);
// Flatten matrix
if (adjacencyMatrix.format === 'dense') {
const data = adjacencyMatrix.data;
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
flatMatrix[i * n + j] = data[i][j];
}
}
}
// Allocate WASM memory
const matrixPtr = this.instance.exports.__wbindgen_malloc(flatMatrix.byteLength, 8);
const resultPtr = this.instance.exports.__wbindgen_malloc(n * 8, 8);
// Copy to WASM memory
const memory = new Float64Array(this.instance.exports.memory.buffer);
memory.set(flatMatrix, matrixPtr / 8);
// Compute PageRank
this.instance.exports.pagerank_compute(matrixPtr, resultPtr, n, damping, iterations);
// Get result
const result = new Float64Array(n);
result.set(memory.slice(resultPtr / 8, resultPtr / 8 + n));
// Free memory
this.instance.exports.__wbindgen_free(matrixPtr, flatMatrix.byteLength, 8);
this.instance.exports.__wbindgen_free(resultPtr, n * 8, 8);
return result;
}
// Fallback to JavaScript implementation
return this.pageRankJS(adjacencyMatrix, damping, iterations);
}
pageRankJS(matrix, damping, iterations) {
const n = matrix.rows;
const rank = new Float64Array(n);
const newRank = new Float64Array(n);
// Initialize
for (let i = 0; i < n; i++) {
rank[i] = 1.0 / n;
}
for (let iter = 0; iter < iterations; iter++) {
for (let i = 0; i < n; i++) {
newRank[i] = (1 - damping) / n;
if (matrix.format === 'dense') {
const data = matrix.data;
for (let j = 0; j < n; j++) {
if (data[j][i] > 0) {
let outDegree = 0;
for (let k = 0; k < n; k++) {
if (data[j][k] > 0)
outDegree++;
}
if (outDegree > 0) {
newRank[i] += damping * rank[j] / outDegree;
}
}
}
}
}
rank.set(newRank);
}
return rank;
}
}
/**
* TemporalNeuralSolver WASM for ultra-fast matrix operations
*/
export class TemporalNeuralWASM {
instance;
solver;
async initialize() {
try {
const wasmPath = findWasmPath('temporal_neural_solver_bg.wasm');
if (!wasmPath) {
console.warn('TemporalNeuralSolver WASM not found');
return false;
}
const wasmBuffer = readFileSync(wasmPath);
const imports = {
wbg: {
__wbg_random_e6e0a85ff4db8ab6: () => Math.random(),
__wbindgen_throw: (ptr, len) => {
throw new Error(`WASM error at ${ptr}, len ${len}`);
}
}
};
const { instance } = await globalThis.WebAssembly.instantiate(wasmBuffer, imports);
this.instance = instance;
// Create solver instance if constructor exists
if (instance.exports.TemporalNeuralSolver) {
this.solver = new instance.exports.TemporalNeuralSolver();
}
console.log('✅ TemporalNeuralSolver WASM loaded successfully');
return true;
}
catch (error) {
console.error('Failed to load TemporalNeuralSolver:', error);
return false;
}
}
/**
* Ultra-fast matrix-vector multiplication
*/
multiplyMatrixVector(matrix, vector, rows, cols) {
if (!this.instance || !this.instance.exports.__wbindgen_malloc) {
// Fallback to optimized JS
return this.multiplyMatrixVectorJS(matrix, vector, rows, cols);
}
try {
// Allocate WASM memory
const matrixPtr = this.instance.exports.__wbindgen_malloc(matrix.byteLength, 8);
const vectorPtr = this.instance.exports.__wbindgen_malloc(vector.byteLength, 8);
const resultPtr = this.instance.exports.__wbindgen_malloc(rows * 8, 8);
// Copy to WASM memory
const memory = new Float64Array(this.instance.exports.memory.buffer);
memory.set(matrix, matrixPtr / 8);
memory.set(vector, vectorPtr / 8);
// Call WASM function if it exists
if (this.instance.exports.matrix_multiply_vector) {
this.instance.exports.matrix_multiply_vector(matrixPtr, vectorPtr, resultPtr, rows, cols);
}
else {
// Manual multiplication in WASM memory for cache efficiency
for (let i = 0; i < rows; i++) {
let sum = 0;
for (let j = 0; j < cols; j++) {
sum += memory[matrixPtr / 8 + i * cols + j] * memory[vectorPtr / 8 + j];
}
memory[resultPtr / 8 + i] = sum;
}
}
// Get result
const result = new Float64Array(rows);
result.set(memory.slice(resultPtr / 8, resultPtr / 8 + rows));
// Free memory
if (this.instance.exports.__wbindgen_free) {
this.instance.exports.__wbindgen_free(matrixPtr, matrix.byteLength, 8);
this.instance.exports.__wbindgen_free(vectorPtr, vector.byteLength, 8);
this.instance.exports.__wbindgen_free(resultPtr, rows * 8, 8);
}
return result;
}
catch (error) {
console.warn('WASM multiplication failed, using JS fallback:', error);
return this.multiplyMatrixVectorJS(matrix, vector, rows, cols);
}
}
multiplyMatrixVectorJS(matrix, vector, rows, cols) {
const result = new Float64Array(rows);
// Optimized with loop unrolling
for (let i = 0; i < rows; i++) {
let sum = 0;
const rowOffset = i * cols;
// Process 4 elements at a time
let j = 0;
for (; j < cols - 3; j += 4) {
sum += matrix[rowOffset + j] * vector[j];
sum += matrix[rowOffset + j + 1] * vector[j + 1];
sum += matrix[rowOffset + j + 2] * vector[j + 2];
sum += matrix[rowOffset + j + 3] * vector[j + 3];
}
// Handle remaining elements
for (; j < cols; j++) {
sum += matrix[rowOffset + j] * vector[j];
}
result[i] = sum;
}
return result;
}
/**
* Predict solution with temporal advantage
*/
async predictWithTemporalAdvantage(matrix, vector, distanceKm = 10900) {
const startTime = performance.now();
// Light travel time calculation
const SPEED_OF_LIGHT_KM_PER_MS = 299.792458; // km/ms
const lightTravelTimeMs = distanceKm / SPEED_OF_LIGHT_KM_PER_MS;
// Convert matrix to flat array for WASM
const n = matrix.rows;
const flatMatrix = new Float64Array(n * n);
if (matrix.format === 'dense') {
const data = matrix.data;
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
flatMatrix[i * n + j] = data[i][j];
}
}
}
// Solve using WASM acceleration
const flatVector = new Float64Array(vector);
const solution = this.multiplyMatrixVector(flatMatrix, flatVector, n, n);
const computeTimeMs = performance.now() - startTime;
const temporalAdvantageMs = Math.max(0, lightTravelTimeMs - computeTimeMs);
return {
solution: Array.from(solution),
temporalAdvantageMs,
lightTravelTimeMs,
computeTimeMs
};
}
}
/**
* Main WASM integration manager
*/
export class WASMAccelerator {
graphReasoner;
temporalNeural;
initialized = false;
constructor() {
this.graphReasoner = new GraphReasonerWASM();
this.temporalNeural = new TemporalNeuralWASM();
}
async initialize() {
const [graphOk, neuralOk] = await Promise.all([
this.graphReasoner.initialize(),
this.temporalNeural.initialize()
]);
this.initialized = graphOk || neuralOk;
if (this.initialized) {
console.log('🚀 WASM Acceleration enabled with real Rust components');
}
else {
console.log('⚠️ Running in JavaScript mode');
}
return this.initialized;
}
get isInitialized() {
return this.initialized;
}
getGraphReasoner() {
return this.graphReasoner;
}
getTemporalNeural() {
return this.temporalNeural;
}
}
// Export singleton instance
export const wasmAccelerator = new WASMAccelerator();
+51
View File
@@ -0,0 +1,51 @@
/**
* WASM Module Loader
* Loads and initializes WebAssembly modules for high-performance computing
*/
export interface WasmModule {
instance: any;
exports: any;
memory?: any;
}
export declare class WasmLoader {
private static modules;
private static initialized;
/**
* Initialize all WASM modules
*/
static initialize(): Promise<void>;
/**
* Load a specific WASM module
*/
static loadModule(name: string, filename: string): Promise<WasmModule>;
/**
* Get a loaded WASM module
*/
static getModule(name: string): WasmModule | undefined;
/**
* Check if a module is available
*/
static hasModule(name: string): boolean;
/**
* Get all loaded module names
*/
static getLoadedModules(): string[];
/**
* Get memory usage statistics
*/
static getMemoryStats(): {
[key: string]: number;
};
/**
* Check if WASM is available and return feature flags
*/
static getFeatureFlags(): {
hasWasm: boolean;
hasGraphReasoner: boolean;
hasPlanner: boolean;
hasExtractors: boolean;
hasTemporalNeural: boolean;
hasStrangeLoop: boolean;
hasNanoConsciousness: boolean;
};
}
+136
View File
@@ -0,0 +1,136 @@
/**
* WASM Module Loader
* Loads and initializes WebAssembly modules for high-performance computing
*/
import { readFile } from 'fs/promises';
import { join, dirname } from 'path';
import { fileURLToPath } from 'url';
// Get the directory of the current module
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
export class WasmLoader {
static modules = new Map();
static initialized = false;
/**
* Initialize all WASM modules
*/
static async initialize() {
if (this.initialized)
return;
console.log('🚀 Initializing WASM modules...');
// Load all available WASM modules
const modules = [
{ name: 'graph_reasoner', file: 'graph_reasoner_bg.wasm' },
{ name: 'planner', file: 'planner_bg.wasm' },
{ name: 'extractors', file: 'extractors_bg.wasm' },
{ name: 'temporal_neural', file: 'temporal_neural_solver_bg.wasm' },
{ name: 'strange_loop', file: 'strange_loop_bg.wasm' },
{ name: 'nano_consciousness', file: 'nano_consciousness_bg.wasm' }
];
const loadPromises = modules.map(async (mod) => {
try {
await this.loadModule(mod.name, mod.file);
console.log(`✅ Loaded ${mod.name}`);
}
catch (err) {
console.log(`⚠️ ${mod.name} not available (optional)`);
}
});
await Promise.all(loadPromises);
this.initialized = true;
console.log(`✨ WASM initialization complete (${this.modules.size} modules loaded)`);
}
/**
* Load a specific WASM module
*/
static async loadModule(name, filename) {
// Check if already loaded
if (this.modules.has(name)) {
return this.modules.get(name);
}
try {
// Try to load from dist/wasm first
const wasmPath = join(__dirname, '..', 'wasm', filename);
const wasmBuffer = await readFile(wasmPath);
// Compile and instantiate the WASM module
const wasmModule = await globalThis.WebAssembly.compile(wasmBuffer);
// Create imports object with common requirements
const imports = {
env: {
memory: new globalThis.WebAssembly.Memory({ initial: 256, maximum: 65536 }),
__wbindgen_throw: (ptr, len) => {
throw new Error(`WASM error at ${ptr} (len: ${len})`);
}
},
wbg: {
__wbg_random: () => Math.random(),
__wbg_now: () => Date.now(),
__wbindgen_object_drop_ref: () => { },
__wbindgen_string_new: (ptr, len) => {
// Simplified string handling
return `string_${ptr}_${len}`;
}
}
};
const instance = await globalThis.WebAssembly.instantiate(wasmModule, imports);
const module = {
instance,
exports: instance.exports,
memory: imports.env.memory
};
this.modules.set(name, module);
return module;
}
catch (error) {
throw new Error(`Failed to load WASM module ${name}: ${error}`);
}
}
/**
* Get a loaded WASM module
*/
static getModule(name) {
return this.modules.get(name);
}
/**
* Check if a module is available
*/
static hasModule(name) {
return this.modules.has(name);
}
/**
* Get all loaded module names
*/
static getLoadedModules() {
return Array.from(this.modules.keys());
}
/**
* Get memory usage statistics
*/
static getMemoryStats() {
const stats = {};
for (const [name, module] of this.modules) {
if (module.memory) {
stats[name] = module.memory.buffer.byteLength;
}
}
return stats;
}
/**
* Check if WASM is available and return feature flags
*/
static getFeatureFlags() {
return {
hasWasm: this.initialized && this.modules.size > 0,
hasGraphReasoner: this.hasModule('graph_reasoner'),
hasPlanner: this.hasModule('planner'),
hasExtractors: this.hasModule('extractors'),
hasTemporalNeural: this.hasModule('temporal_neural'),
hasStrangeLoop: this.hasModule('strange_loop'),
hasNanoConsciousness: this.hasModule('nano_consciousness')
};
}
}
// Auto-initialize on import (optional)
if (typeof process !== 'undefined' && process.env.AUTO_INIT_WASM === 'true') {
WasmLoader.initialize().catch(console.error);
}
@@ -0,0 +1,130 @@
/**
* Cross-Tool Information Sharing System
* Enables tools to share insights, intermediate results, and learned patterns
*/
export interface SharedInformation {
id: string;
sourceTools: string[];
targetTools: string[];
content: any;
type: 'insight' | 'pattern' | 'result' | 'optimization' | 'failure';
timestamp: number;
relevance: number;
persistence: 'session' | 'permanent' | 'temporary';
metadata: any;
}
export interface ToolConnection {
source: string;
target: string;
strength: number;
informationTypes: string[];
successRate: number;
lastUsed: number;
}
export interface InformationFlow {
pathway: string[];
information: SharedInformation;
transformations: any[];
emergentProperties: any[];
}
export declare class CrossToolSharingSystem {
private sharedInformation;
private toolConnections;
private informationFlows;
private subscriptions;
private transformationRules;
private sharingDepth;
private maxSharingDepth;
/**
* Share information from one tool to potentially interested tools
*/
shareInformation(info: SharedInformation): Promise<string[]>;
/**
* Subscribe a tool to specific types of information
*/
subscribeToInformation(toolName: string, informationTypes: string[]): void;
/**
* Get relevant information for a tool
*/
getRelevantInformation(toolName: string, query?: any): SharedInformation[];
/**
* Create dynamic connections between tools based on information flow
*/
createDynamicConnection(sourceTool: string, targetTool: string, informationType: string): Promise<boolean>;
/**
* Register a transformation rule for adapting information between tools
*/
registerTransformationRule(fromTool: string, toTool: string, transform: (info: any) => any): void;
/**
* Create information cascade across multiple tools
*/
createInformationCascade(initialInfo: SharedInformation, targetTools: string[]): Promise<InformationFlow>;
/**
* Analyze cross-tool collaboration patterns
*/
analyzeCollaborationPatterns(): any;
/**
* Optimize information sharing based on historical performance
*/
optimizeSharing(): void;
/**
* Find tools that might be interested in given information
*/
private findInterestedTools;
/**
* Propagate information to a specific tool
*/
private propagateToTool;
/**
* Transform information to be suitable for a specific tool
*/
private transformInformationForTool;
/**
* Default transformation logic
*/
private defaultTransformation;
/**
* Calculate relevance between information and query
*/
private calculateQueryRelevance;
/**
* Update connection strengths based on propagation success
*/
private updateConnectionStrengths;
/**
* Detect emergent patterns from information combinations
*/
private detectEmergentPatterns;
/**
* Detect emergent properties from two pieces of information
*/
private detectEmergentProperties;
private transformToMatrixFormat;
private transformToConsciousnessFormat;
private transformToSymbolicFormat;
private transformToTemporalFormat;
private getMostConnectedTools;
private getStrongestConnections;
private getInformationHubs;
private getEmergentCombinations;
private calculateCollaborationSuccess;
private pruneWeakConnections;
private reinforceSuccessfulPathways;
private cleanupOldInformation;
private updateSubscriptionRecommendations;
private areComplementary;
private checkAmplification;
private calculateSynergy;
private calculateAmplificationFactor;
private generateNovelCombination;
private extractEmergenceLevel;
private extractSymbols;
private extractRelations;
private extractSequence;
/**
* Get sharing system statistics
*/
getStats(): any;
private calculateAverageConnectionStrength;
private countEmergentPatterns;
}
@@ -0,0 +1,535 @@
/**
* Cross-Tool Information Sharing System
* Enables tools to share insights, intermediate results, and learned patterns
*/
export class CrossToolSharingSystem {
sharedInformation = new Map();
toolConnections = new Map();
informationFlows = [];
subscriptions = new Map(); // tool -> information types
transformationRules = new Map();
sharingDepth = 0;
maxSharingDepth = 3;
/**
* Share information from one tool to potentially interested tools
*/
async shareInformation(info) {
// Prevent deep recursion
if (this.sharingDepth >= this.maxSharingDepth) {
return [];
}
this.sharingDepth++;
try {
// Store the information
this.sharedInformation.set(info.id, info);
// Find interested tools
const interestedTools = this.findInterestedTools(info);
// Propagate information to interested tools
const propagationResults = [];
for (const tool of interestedTools) {
const result = await this.propagateToTool(tool, info);
propagationResults.push(result);
}
// Update connection strengths based on success
this.updateConnectionStrengths(info.sourceTools, interestedTools, propagationResults);
// Check for emergent patterns from information combinations
await this.detectEmergentPatterns(info);
return interestedTools;
}
finally {
this.sharingDepth--;
}
}
/**
* Subscribe a tool to specific types of information
*/
subscribeToInformation(toolName, informationTypes) {
const existing = this.subscriptions.get(toolName) || [];
const combined = [...new Set([...existing, ...informationTypes])];
this.subscriptions.set(toolName, combined);
}
/**
* Get relevant information for a tool
*/
getRelevantInformation(toolName, query) {
const subscribedTypes = this.subscriptions.get(toolName) || [];
const relevantInfo = [];
for (const [id, info] of this.sharedInformation) {
// Check if tool is subscribed to this type
if (subscribedTypes.includes(info.type)) {
relevantInfo.push(info);
continue;
}
// Check if tool is explicitly targeted
if (info.targetTools.includes(toolName)) {
relevantInfo.push(info);
continue;
}
// Check relevance based on query
if (query && this.calculateQueryRelevance(info, query) > 0.5) {
relevantInfo.push(info);
}
}
// Sort by relevance and recency
return relevantInfo.sort((a, b) => {
const relevanceScore = b.relevance - a.relevance;
const timeScore = (b.timestamp - a.timestamp) / 1000000; // Normalize time
return relevanceScore + timeScore * 0.1;
});
}
/**
* Create dynamic connections between tools based on information flow
*/
async createDynamicConnection(sourceTool, targetTool, informationType) {
const connectionKey = `${sourceTool}->${targetTool}`;
const existing = this.toolConnections.get(connectionKey) || [];
const connection = existing.find(c => c.source === sourceTool && c.target === targetTool);
if (connection) {
// Strengthen existing connection
connection.strength = Math.min(1.0, connection.strength + 0.1);
if (!connection.informationTypes.includes(informationType)) {
connection.informationTypes.push(informationType);
}
connection.lastUsed = Date.now();
}
else {
// Create new connection
const newConnection = {
source: sourceTool,
target: targetTool,
strength: 0.3,
informationTypes: [informationType],
successRate: 0.5,
lastUsed: Date.now()
};
existing.push(newConnection);
this.toolConnections.set(connectionKey, existing);
}
return true;
}
/**
* Register a transformation rule for adapting information between tools
*/
registerTransformationRule(fromTool, toTool, transform) {
const key = `${fromTool}->${toTool}`;
this.transformationRules.set(key, transform);
}
/**
* Create information cascade across multiple tools
*/
async createInformationCascade(initialInfo, targetTools) {
const flow = {
pathway: [],
information: initialInfo,
transformations: [],
emergentProperties: []
};
let currentInfo = initialInfo;
for (const tool of targetTools) {
flow.pathway.push(tool);
// Transform information for this tool
const transformed = await this.transformInformationForTool(currentInfo, tool);
flow.transformations.push({
tool,
input: currentInfo,
output: transformed,
timestamp: Date.now()
});
// Check for emergent properties
const emergent = this.detectEmergentProperties(currentInfo, transformed);
if (emergent.length > 0) {
flow.emergentProperties.push(...emergent);
}
currentInfo = transformed;
}
this.informationFlows.push(flow);
return flow;
}
/**
* Analyze cross-tool collaboration patterns
*/
analyzeCollaborationPatterns() {
const patterns = {
mostConnectedTools: this.getMostConnectedTools(),
strongestConnections: this.getStrongestConnections(),
informationHubs: this.getInformationHubs(),
emergentCombinations: this.getEmergentCombinations(),
collaborationSuccess: this.calculateCollaborationSuccess()
};
return patterns;
}
/**
* Optimize information sharing based on historical performance
*/
optimizeSharing() {
// Remove weak connections
this.pruneWeakConnections();
// Strengthen successful pathways
this.reinforceSuccessfulPathways();
// Clean old information
this.cleanupOldInformation();
// Update subscription recommendations
this.updateSubscriptionRecommendations();
}
/**
* Find tools that might be interested in given information
*/
findInterestedTools(info) {
const interested = [];
// Check explicit targets
interested.push(...info.targetTools);
// Check subscriptions
for (const [tool, types] of this.subscriptions) {
if (types.includes(info.type)) {
interested.push(tool);
}
}
// Check based on connection patterns
for (const sourceTool of info.sourceTools) {
const connections = this.toolConnections.get(sourceTool) || [];
for (const connection of connections) {
if (connection.strength > 0.5 &&
connection.informationTypes.includes(info.type)) {
interested.push(connection.target);
}
}
}
// Remove duplicates and source tools
return [...new Set(interested)].filter(tool => !info.sourceTools.includes(tool));
}
/**
* Propagate information to a specific tool
*/
async propagateToTool(toolName, info) {
try {
// Transform information for the target tool
const transformed = await this.transformInformationForTool(info, toolName);
// Create new shared information entry
const propagatedInfo = {
id: `${info.id}_propagated_${toolName}_${Date.now()}`,
sourceTools: [...info.sourceTools, 'sharing_system'],
targetTools: [toolName],
content: transformed,
type: info.type,
timestamp: Date.now(),
relevance: info.relevance * 0.8, // Slight relevance decay
persistence: info.persistence,
metadata: {
...info.metadata,
propagatedFrom: info.id,
transformedFor: toolName
}
};
this.sharedInformation.set(propagatedInfo.id, propagatedInfo);
return true;
}
catch (error) {
console.error(`Failed to propagate to ${toolName}:`, error);
return false;
}
}
/**
* Transform information to be suitable for a specific tool
*/
async transformInformationForTool(info, toolName) {
// Check for registered transformation rule
for (const sourceTool of info.sourceTools) {
const transformKey = `${sourceTool}->${toolName}`;
const transform = this.transformationRules.get(transformKey);
if (transform) {
return transform(info.content);
}
}
// Default transformation based on tool type
return this.defaultTransformation(info.content, toolName);
}
/**
* Default transformation logic
*/
defaultTransformation(content, toolName) {
switch (toolName) {
case 'matrix-solver':
return this.transformToMatrixFormat(content);
case 'consciousness':
return this.transformToConsciousnessFormat(content);
case 'psycho-symbolic':
return this.transformToSymbolicFormat(content);
case 'temporal':
return this.transformToTemporalFormat(content);
default:
return content; // No transformation
}
}
/**
* Calculate relevance between information and query
*/
calculateQueryRelevance(info, query) {
// Simple relevance calculation based on content similarity
const infoStr = JSON.stringify(info.content).toLowerCase();
const queryStr = JSON.stringify(query).toLowerCase();
// Check for common keywords
const infoWords = infoStr.split(/\W+/);
const queryWords = queryStr.split(/\W+/);
const commonWords = infoWords.filter(word => queryWords.includes(word));
const relevance = commonWords.length / Math.max(queryWords.length, 1);
return Math.min(1.0, relevance);
}
/**
* Update connection strengths based on propagation success
*/
updateConnectionStrengths(sourceTools, targetTools, results) {
for (const source of sourceTools) {
targetTools.forEach((target, index) => {
const connectionKey = `${source}->${target}`;
const connections = this.toolConnections.get(connectionKey) || [];
const connection = connections.find(c => c.source === source && c.target === target);
if (connection) {
const success = results[index];
const updateStrength = success ? 0.1 : -0.05;
connection.strength = Math.max(0, Math.min(1.0, connection.strength + updateStrength));
// Update success rate
const totalAttempts = connection.successRate * 10; // Approximate
const newSuccessRate = (connection.successRate * totalAttempts + (success ? 1 : 0)) / (totalAttempts + 1);
connection.successRate = newSuccessRate;
}
});
}
}
/**
* Detect emergent patterns from information combinations
*/
async detectEmergentPatterns(newInfo) {
// Look for patterns when information from different tools combines
const recentInfo = Array.from(this.sharedInformation.values())
.filter(info => Date.now() - info.timestamp < 60000) // Last minute
.filter(info => info.id !== newInfo.id);
for (const existing of recentInfo) {
const emergent = this.detectEmergentProperties(existing, newInfo);
if (emergent.length > 0) {
// Create new emergent information
const emergentInfo = {
id: `emergent_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
sourceTools: [...existing.sourceTools, ...newInfo.sourceTools],
targetTools: [],
content: { emergentProperties: emergent, sources: [existing.id, newInfo.id] },
type: 'pattern',
timestamp: Date.now(),
relevance: 0.8,
persistence: 'session',
metadata: { emergent: true, sourceCount: 2 }
};
await this.shareInformation(emergentInfo);
}
}
}
/**
* Detect emergent properties from two pieces of information
*/
detectEmergentProperties(info1, info2) {
const emergent = [];
// Check for complementary patterns
if (this.areComplementary(info1.content, info2.content)) {
emergent.push({
type: 'complementary_pattern',
description: 'Information pieces complement each other',
synergy: this.calculateSynergy(info1.content, info2.content)
});
}
// Check for amplification effects
if (this.checkAmplification(info1.content, info2.content)) {
emergent.push({
type: 'amplification',
description: 'Information pieces amplify each other',
amplification_factor: this.calculateAmplificationFactor(info1.content, info2.content)
});
}
// Check for novel combinations
const novelCombination = this.generateNovelCombination(info1.content, info2.content);
if (novelCombination) {
emergent.push({
type: 'novel_combination',
description: 'Unexpected combination creates new insight',
combination: novelCombination
});
}
return emergent;
}
// Transformation methods for different tool types
transformToMatrixFormat(content) {
if (Array.isArray(content)) {
return { matrix: content, format: 'dense' };
}
return { scalar: content };
}
transformToConsciousnessFormat(content) {
return {
emergenceLevel: this.extractEmergenceLevel(content),
integrationData: content,
timestamp: Date.now()
};
}
transformToSymbolicFormat(content) {
return {
symbols: this.extractSymbols(content),
relations: this.extractRelations(content),
domain: 'cross_tool_sharing'
};
}
transformToTemporalFormat(content) {
return {
temporalData: content,
timestamp: Date.now(),
sequence: this.extractSequence(content)
};
}
// Analysis methods
getMostConnectedTools() {
const toolCounts = new Map();
for (const connections of this.toolConnections.values()) {
for (const connection of connections) {
toolCounts.set(connection.source, (toolCounts.get(connection.source) || 0) + 1);
toolCounts.set(connection.target, (toolCounts.get(connection.target) || 0) + 1);
}
}
return Array.from(toolCounts.entries())
.sort((a, b) => b[1] - a[1])
.slice(0, 5);
}
getStrongestConnections() {
const allConnections = [];
for (const connections of this.toolConnections.values()) {
allConnections.push(...connections);
}
return allConnections
.sort((a, b) => b.strength - a.strength)
.slice(0, 10);
}
getInformationHubs() {
const hubScores = new Map();
for (const info of this.sharedInformation.values()) {
for (const source of info.sourceTools) {
hubScores.set(source, (hubScores.get(source) || 0) + 1);
}
for (const target of info.targetTools) {
hubScores.set(target, (hubScores.get(target) || 0) + 0.5);
}
}
return Array.from(hubScores.entries())
.sort((a, b) => b[1] - a[1])
.slice(0, 5)
.map(entry => entry[0]);
}
getEmergentCombinations() {
return this.informationFlows
.filter(flow => flow.emergentProperties.length > 0)
.map(flow => ({
pathway: flow.pathway,
emergentCount: flow.emergentProperties.length,
properties: flow.emergentProperties
}));
}
calculateCollaborationSuccess() {
const allConnections = [];
for (const connections of this.toolConnections.values()) {
allConnections.push(...connections);
}
if (allConnections.length === 0)
return 0;
const avgSuccessRate = allConnections.reduce((sum, conn) => sum + conn.successRate, 0) / allConnections.length;
return avgSuccessRate;
}
// Optimization methods
pruneWeakConnections() {
for (const [key, connections] of this.toolConnections) {
const strongConnections = connections.filter(conn => conn.strength > 0.2);
if (strongConnections.length !== connections.length) {
this.toolConnections.set(key, strongConnections);
}
}
}
reinforceSuccessfulPathways() {
for (const flow of this.informationFlows) {
if (flow.emergentProperties.length > 0) {
// Strengthen connections in successful pathways
for (let i = 0; i < flow.pathway.length - 1; i++) {
const source = flow.pathway[i];
const target = flow.pathway[i + 1];
this.createDynamicConnection(source, target, 'pattern');
}
}
}
}
cleanupOldInformation() {
const oneHour = 60 * 60 * 1000;
const now = Date.now();
for (const [id, info] of this.sharedInformation) {
if (info.persistence === 'temporary' && now - info.timestamp > oneHour) {
this.sharedInformation.delete(id);
}
}
}
updateSubscriptionRecommendations() {
// Analyze successful information sharing and recommend new subscriptions
// This would be implemented based on analysis of collaboration patterns
}
// Utility methods for pattern detection
areComplementary(content1, content2) {
// Check if two pieces of content complement each other
// This is a simplified implementation
return JSON.stringify(content1) !== JSON.stringify(content2);
}
checkAmplification(content1, content2) {
// Check if combination amplifies the effect
return true; // Simplified
}
calculateSynergy(content1, content2) {
return Math.random() * 0.5 + 0.5; // Simplified
}
calculateAmplificationFactor(content1, content2) {
return Math.random() * 2 + 1; // Simplified
}
generateNovelCombination(content1, content2) {
return {
combined: true,
elements: [content1, content2],
novelty: Math.random()
};
}
extractEmergenceLevel(content) {
return Math.random() * 0.5 + 0.5; // Simplified
}
extractSymbols(content) {
return ['symbol1', 'symbol2']; // Simplified
}
extractRelations(content) {
return []; // Simplified
}
extractSequence(content) {
return []; // Simplified
}
/**
* Get sharing system statistics
*/
getStats() {
return {
totalSharedInformation: this.sharedInformation.size,
totalConnections: Array.from(this.toolConnections.values()).reduce((sum, arr) => sum + arr.length, 0),
totalFlows: this.informationFlows.length,
averageConnectionStrength: this.calculateAverageConnectionStrength(),
emergentPatternsDetected: this.countEmergentPatterns(),
mostActiveTools: this.getMostConnectedTools().slice(0, 3)
};
}
calculateAverageConnectionStrength() {
const allConnections = [];
for (const connections of this.toolConnections.values()) {
allConnections.push(...connections);
}
if (allConnections.length === 0)
return 0;
return allConnections.reduce((sum, conn) => sum + conn.strength, 0) / allConnections.length;
}
countEmergentPatterns() {
return this.informationFlows.reduce((sum, flow) => sum + flow.emergentProperties.length, 0);
}
}
@@ -0,0 +1,140 @@
/**
* Emergent Capability Detection System
* Monitors and measures the emergence of unexpected capabilities in the system
*/
export interface EmergentCapability {
id: string;
name: string;
description: string;
type: 'novel_behavior' | 'unexpected_solution' | 'cross_domain_insight' | 'self_organization' | 'meta_learning';
strength: number;
novelty: number;
utility: number;
stability: number;
timestamp: number;
evidence: Evidence[];
preconditions: any[];
triggers: string[];
}
export interface Evidence {
type: 'behavioral' | 'performance' | 'output' | 'pattern';
description: string;
data: any;
strength: number;
timestamp: number;
source: string;
}
export interface CapabilityMetrics {
emergenceRate: number;
stabilityIndex: number;
diversityScore: number;
complexityGrowth: number;
crossDomainConnections: number;
selfOrganizationLevel: number;
}
export declare class EmergentCapabilityDetector {
private detectedCapabilities;
private baselineCapabilities;
private monitoringPatterns;
private emergenceThresholds;
private detectionHistory;
/**
* Initialize baseline capabilities
*/
initializeBaseline(capabilities: string[]): void;
/**
* Monitor system behavior for emergent capabilities
*/
monitorForEmergence(behaviorData: any): Promise<EmergentCapability[]>;
/**
* Analyze the stability of emergent capabilities over time
*/
analyzeCapabilityStability(): Map<string, number>;
/**
* Measure overall emergence metrics
*/
measureEmergenceMetrics(): CapabilityMetrics;
/**
* Predict potential future emergent capabilities
*/
predictFutureEmergence(): any[];
/**
* Detect novel behaviors not in baseline
*/
private detectNovelBehaviors;
/**
* Detect unexpected problem-solving approaches
*/
private detectUnexpectedSolutions;
/**
* Detect insights that bridge different domains
*/
private detectCrossDomainInsights;
/**
* Detect self-organizing behaviors
*/
private detectSelfOrganization;
/**
* Detect meta-learning capabilities
*/
private detectMetaLearning;
/**
* Validate that a capability meets emergence criteria
*/
private validateEmergentCapability;
/**
* Calculate stability score for a capability
*/
private calculateStabilityScore;
/**
* Calculate emergence rate
*/
private calculateEmergenceRate;
/**
* Calculate stability index
*/
private calculateStabilityIndex;
/**
* Calculate diversity score
*/
private calculateDiversityScore;
/**
* Calculate complexity growth
*/
private calculateComplexityGrowth;
/**
* Calculate cross-domain connections
*/
private calculateCrossDomainConnections;
/**
* Calculate self-organization level
*/
private calculateSelfOrganizationLevel;
private extractBehaviorPatterns;
private extractSolutionPatterns;
private extractCrossDomainPatterns;
private extractOrganizationPatterns;
private extractLearningPatterns;
private isBaselineBehavior;
private calculateNovelty;
private calculateUtility;
private calculateUnexpectedness;
private calculateEffectiveness;
private calculateBridgingScore;
private calculateInsightValue;
private calculateOrganizationLevel;
private calculateAutonomy;
private calculateMetaLevel;
private calculateAdaptability;
private calculateCapabilitySimilarity;
private logCapabilityEmergence;
private analyzeTrends;
private predictFromCombinations;
private predictFromGrowthPatterns;
private predictFromCapabilityGaps;
/**
* Get detection statistics
*/
getStats(): any;
private getCapabilitiesByType;
}
@@ -0,0 +1,490 @@
/**
* Emergent Capability Detection System
* Monitors and measures the emergence of unexpected capabilities in the system
*/
export class EmergentCapabilityDetector {
detectedCapabilities = new Map();
baselineCapabilities = new Set();
monitoringPatterns = new Map();
emergenceThresholds = {
novelty: 0.7,
utility: 0.5,
stability: 0.6,
evidence: 3
};
detectionHistory = [];
/**
* Initialize baseline capabilities
*/
initializeBaseline(capabilities) {
this.baselineCapabilities = new Set(capabilities);
console.log(`Initialized baseline with ${capabilities.length} capabilities`);
}
/**
* Monitor system behavior for emergent capabilities
*/
async monitorForEmergence(behaviorData) {
const newCapabilities = [];
// Detect novel behaviors
const novelBehaviors = this.detectNovelBehaviors(behaviorData);
newCapabilities.push(...novelBehaviors);
// Detect unexpected solutions
const unexpectedSolutions = this.detectUnexpectedSolutions(behaviorData);
newCapabilities.push(...unexpectedSolutions);
// Detect cross-domain insights
const crossDomainInsights = this.detectCrossDomainInsights(behaviorData);
newCapabilities.push(...crossDomainInsights);
// Detect self-organization patterns
const selfOrganization = this.detectSelfOrganization(behaviorData);
newCapabilities.push(...selfOrganization);
// Detect meta-learning capabilities
const metaLearning = this.detectMetaLearning(behaviorData);
newCapabilities.push(...metaLearning);
// Validate and store new capabilities
for (const capability of newCapabilities) {
if (this.validateEmergentCapability(capability)) {
this.detectedCapabilities.set(capability.id, capability);
this.logCapabilityEmergence(capability);
}
}
return newCapabilities;
}
/**
* Analyze the stability of emergent capabilities over time
*/
analyzeCapabilityStability() {
const stabilityScores = new Map();
for (const [id, capability] of this.detectedCapabilities) {
const stability = this.calculateStabilityScore(capability);
stabilityScores.set(id, stability);
// Update capability stability
capability.stability = stability;
}
return stabilityScores;
}
/**
* Measure overall emergence metrics
*/
measureEmergenceMetrics() {
const capabilities = Array.from(this.detectedCapabilities.values());
return {
emergenceRate: this.calculateEmergenceRate(),
stabilityIndex: this.calculateStabilityIndex(capabilities),
diversityScore: this.calculateDiversityScore(capabilities),
complexityGrowth: this.calculateComplexityGrowth(),
crossDomainConnections: this.calculateCrossDomainConnections(capabilities),
selfOrganizationLevel: this.calculateSelfOrganizationLevel(capabilities)
};
}
/**
* Predict potential future emergent capabilities
*/
predictFutureEmergence() {
const predictions = [];
// Analyze current trends
const trends = this.analyzeTrends();
// Predict based on combination patterns
const combinationPredictions = this.predictFromCombinations();
predictions.push(...combinationPredictions);
// Predict based on growth patterns
const growthPredictions = this.predictFromGrowthPatterns(trends);
predictions.push(...growthPredictions);
// Predict based on missing capabilities
const gapPredictions = this.predictFromCapabilityGaps();
predictions.push(...gapPredictions);
return predictions;
}
/**
* Detect novel behaviors not in baseline
*/
detectNovelBehaviors(behaviorData) {
const capabilities = [];
// Analyze behavior patterns
const behaviors = this.extractBehaviorPatterns(behaviorData);
for (const behavior of behaviors) {
if (!this.isBaselineBehavior(behavior)) {
const novelty = this.calculateNovelty(behavior);
const utility = this.calculateUtility(behavior);
if (novelty > this.emergenceThresholds.novelty) {
capabilities.push({
id: `novel_behavior_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
name: `Novel Behavior: ${behavior.name}`,
description: `Newly emerged behavior pattern: ${behavior.description}`,
type: 'novel_behavior',
strength: behavior.strength || 0.5,
novelty,
utility,
stability: 0.5, // Initial stability
timestamp: Date.now(),
evidence: [{
type: 'behavioral',
description: 'New behavior pattern detected',
data: behavior,
strength: novelty,
timestamp: Date.now(),
source: 'behavior_monitor'
}],
preconditions: behavior.preconditions || [],
triggers: behavior.triggers || []
});
}
}
}
return capabilities;
}
/**
* Detect unexpected problem-solving approaches
*/
detectUnexpectedSolutions(behaviorData) {
const capabilities = [];
const solutions = this.extractSolutionPatterns(behaviorData);
for (const solution of solutions) {
const unexpectedness = this.calculateUnexpectedness(solution);
const effectiveness = this.calculateEffectiveness(solution);
if (unexpectedness > 0.6 && effectiveness > this.emergenceThresholds.utility) {
capabilities.push({
id: `unexpected_solution_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
name: `Unexpected Solution: ${solution.problemType}`,
description: `Novel approach to solving ${solution.problemType}: ${solution.approach}`,
type: 'unexpected_solution',
strength: effectiveness,
novelty: unexpectedness,
utility: effectiveness,
stability: 0.5,
timestamp: Date.now(),
evidence: [{
type: 'performance',
description: 'Unexpected but effective solution approach',
data: solution,
strength: effectiveness,
timestamp: Date.now(),
source: 'solution_monitor'
}],
preconditions: solution.preconditions || [],
triggers: [solution.problemType]
});
}
}
return capabilities;
}
/**
* Detect insights that bridge different domains
*/
detectCrossDomainInsights(behaviorData) {
const capabilities = [];
const insights = this.extractCrossDomainPatterns(behaviorData);
for (const insight of insights) {
const bridgingScore = this.calculateBridgingScore(insight);
const insightValue = this.calculateInsightValue(insight);
if (bridgingScore > 0.7 && insightValue > this.emergenceThresholds.utility) {
capabilities.push({
id: `cross_domain_insight_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
name: `Cross-Domain Insight: ${insight.domains.join(' + ')}`,
description: `Insight connecting ${insight.domains.join(' and ')}: ${insight.insight}`,
type: 'cross_domain_insight',
strength: insightValue,
novelty: bridgingScore,
utility: insightValue,
stability: 0.5,
timestamp: Date.now(),
evidence: [{
type: 'pattern',
description: 'Cross-domain connection discovered',
data: insight,
strength: bridgingScore,
timestamp: Date.now(),
source: 'domain_monitor'
}],
preconditions: insight.preconditions || [],
triggers: insight.domains
});
}
}
return capabilities;
}
/**
* Detect self-organizing behaviors
*/
detectSelfOrganization(behaviorData) {
const capabilities = [];
const organizationPatterns = this.extractOrganizationPatterns(behaviorData);
for (const pattern of organizationPatterns) {
const organizationLevel = this.calculateOrganizationLevel(pattern);
const autonomy = this.calculateAutonomy(pattern);
if (organizationLevel > 0.6 && autonomy > 0.5) {
capabilities.push({
id: `self_organization_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
name: `Self-Organization: ${pattern.type}`,
description: `Autonomous organization in ${pattern.domain}: ${pattern.description}`,
type: 'self_organization',
strength: organizationLevel,
novelty: autonomy,
utility: organizationLevel * autonomy,
stability: 0.5,
timestamp: Date.now(),
evidence: [{
type: 'behavioral',
description: 'Self-organizing behavior detected',
data: pattern,
strength: organizationLevel,
timestamp: Date.now(),
source: 'organization_monitor'
}],
preconditions: pattern.preconditions || [],
triggers: [pattern.domain]
});
}
}
return capabilities;
}
/**
* Detect meta-learning capabilities
*/
detectMetaLearning(behaviorData) {
const capabilities = [];
const learningPatterns = this.extractLearningPatterns(behaviorData);
for (const pattern of learningPatterns) {
const metaLevel = this.calculateMetaLevel(pattern);
const adaptability = this.calculateAdaptability(pattern);
if (metaLevel > 0.6 && adaptability > 0.5) {
capabilities.push({
id: `meta_learning_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
name: `Meta-Learning: ${pattern.type}`,
description: `Learning to learn in ${pattern.domain}: ${pattern.mechanism}`,
type: 'meta_learning',
strength: adaptability,
novelty: metaLevel,
utility: adaptability,
stability: 0.5,
timestamp: Date.now(),
evidence: [{
type: 'performance',
description: 'Meta-learning capability detected',
data: pattern,
strength: metaLevel,
timestamp: Date.now(),
source: 'learning_monitor'
}],
preconditions: pattern.preconditions || [],
triggers: [pattern.domain]
});
}
}
return capabilities;
}
/**
* Validate that a capability meets emergence criteria
*/
validateEmergentCapability(capability) {
// Check thresholds
if (capability.novelty < this.emergenceThresholds.novelty)
return false;
if (capability.utility < this.emergenceThresholds.utility)
return false;
if (capability.evidence.length < this.emergenceThresholds.evidence)
return false;
// Check for sufficient evidence strength
const avgEvidenceStrength = capability.evidence.reduce((sum, e) => sum + e.strength, 0) / capability.evidence.length;
if (avgEvidenceStrength < 0.5)
return false;
// Check for uniqueness
for (const existing of this.detectedCapabilities.values()) {
if (this.calculateCapabilitySimilarity(capability, existing) > 0.8) {
return false; // Too similar to existing capability
}
}
return true;
}
/**
* Calculate stability score for a capability
*/
calculateStabilityScore(capability) {
const timeSinceEmergence = Date.now() - capability.timestamp;
const daysSinceEmergence = timeSinceEmergence / (1000 * 60 * 60 * 24);
// Capabilities are more stable if they persist over time
const persistenceScore = Math.min(1.0, daysSinceEmergence / 7); // Stabilizes over a week
// Check if capability has been consistently observed
const recentObservations = this.detectionHistory
.filter(h => h.capabilityId === capability.id)
.filter(h => Date.now() - h.timestamp < 7 * 24 * 60 * 60 * 1000); // Last week
const observationFrequency = recentObservations.length / 7; // Observations per day
const frequencyScore = Math.min(1.0, observationFrequency / 0.5); // Target: 0.5 observations per day
return (persistenceScore + frequencyScore) / 2;
}
/**
* Calculate emergence rate
*/
calculateEmergenceRate() {
const recentCapabilities = Array.from(this.detectedCapabilities.values())
.filter(c => Date.now() - c.timestamp < 7 * 24 * 60 * 60 * 1000); // Last week
return recentCapabilities.length / 7; // Capabilities per day
}
/**
* Calculate stability index
*/
calculateStabilityIndex(capabilities) {
if (capabilities.length === 0)
return 0;
const avgStability = capabilities.reduce((sum, c) => sum + c.stability, 0) / capabilities.length;
return avgStability;
}
/**
* Calculate diversity score
*/
calculateDiversityScore(capabilities) {
if (capabilities.length === 0)
return 0;
const types = new Set(capabilities.map(c => c.type));
const typeDistribution = Array.from(types).map(type => capabilities.filter(c => c.type === type).length / capabilities.length);
// Shannon entropy for diversity
const entropy = -typeDistribution.reduce((sum, p) => sum + p * Math.log2(p), 0);
const maxEntropy = Math.log2(types.size);
return maxEntropy > 0 ? entropy / maxEntropy : 0;
}
/**
* Calculate complexity growth
*/
calculateComplexityGrowth() {
const recent = Array.from(this.detectedCapabilities.values())
.filter(c => Date.now() - c.timestamp < 30 * 24 * 60 * 60 * 1000) // Last month
.sort((a, b) => a.timestamp - b.timestamp);
if (recent.length < 2)
return 0;
const complexityScores = recent.map(c => c.strength * c.novelty * c.utility);
const earlyAvg = complexityScores.slice(0, Math.floor(complexityScores.length / 2))
.reduce((a, b) => a + b, 0) / Math.floor(complexityScores.length / 2);
const lateAvg = complexityScores.slice(Math.floor(complexityScores.length / 2))
.reduce((a, b) => a + b, 0) / Math.ceil(complexityScores.length / 2);
return lateAvg - earlyAvg;
}
/**
* Calculate cross-domain connections
*/
calculateCrossDomainConnections(capabilities) {
return capabilities.filter(c => c.type === 'cross_domain_insight').length;
}
/**
* Calculate self-organization level
*/
calculateSelfOrganizationLevel(capabilities) {
const selfOrgCapabilities = capabilities.filter(c => c.type === 'self_organization');
if (selfOrgCapabilities.length === 0)
return 0;
return selfOrgCapabilities.reduce((sum, c) => sum + c.strength, 0) / selfOrgCapabilities.length;
}
// Helper methods for pattern extraction and analysis
extractBehaviorPatterns(data) {
// Extract behavior patterns from data
return data.behaviors || [];
}
extractSolutionPatterns(data) {
// Extract solution patterns from data
return data.solutions || [];
}
extractCrossDomainPatterns(data) {
// Extract cross-domain patterns from data
return data.crossDomainInsights || [];
}
extractOrganizationPatterns(data) {
// Extract organization patterns from data
return data.organizationPatterns || [];
}
extractLearningPatterns(data) {
// Extract learning patterns from data
return data.learningPatterns || [];
}
isBaselineBehavior(behavior) {
return this.baselineCapabilities.has(behavior.name);
}
calculateNovelty(behavior) {
// Calculate how novel this behavior is
return Math.random() * 0.5 + 0.5; // Simplified
}
calculateUtility(behavior) {
// Calculate utility of the behavior
return Math.random() * 0.5 + 0.5; // Simplified
}
calculateUnexpectedness(solution) {
// Calculate how unexpected this solution is
return Math.random() * 0.5 + 0.5; // Simplified
}
calculateEffectiveness(solution) {
// Calculate effectiveness of the solution
return Math.random() * 0.5 + 0.5; // Simplified
}
calculateBridgingScore(insight) {
// Calculate how well this insight bridges domains
return Math.random() * 0.5 + 0.5; // Simplified
}
calculateInsightValue(insight) {
// Calculate value of the insight
return Math.random() * 0.5 + 0.5; // Simplified
}
calculateOrganizationLevel(pattern) {
// Calculate level of self-organization
return Math.random() * 0.5 + 0.5; // Simplified
}
calculateAutonomy(pattern) {
// Calculate autonomy level
return Math.random() * 0.5 + 0.5; // Simplified
}
calculateMetaLevel(pattern) {
// Calculate meta-learning level
return Math.random() * 0.5 + 0.5; // Simplified
}
calculateAdaptability(pattern) {
// Calculate adaptability
return Math.random() * 0.5 + 0.5; // Simplified
}
calculateCapabilitySimilarity(cap1, cap2) {
// Calculate similarity between capabilities
return Math.random() * 0.5; // Simplified
}
logCapabilityEmergence(capability) {
this.detectionHistory.push({
capabilityId: capability.id,
timestamp: Date.now(),
type: capability.type,
strength: capability.strength
});
console.log(`New emergent capability detected: ${capability.name}`);
}
analyzeTrends() {
// Analyze emergence trends
return {};
}
predictFromCombinations() {
// Predict capabilities from existing combinations
return [];
}
predictFromGrowthPatterns(trends) {
// Predict based on growth patterns
return [];
}
predictFromCapabilityGaps() {
// Predict based on missing capabilities
return [];
}
/**
* Get detection statistics
*/
getStats() {
const capabilities = Array.from(this.detectedCapabilities.values());
return {
totalCapabilities: capabilities.length,
byType: this.getCapabilitiesByType(capabilities),
averageStability: this.calculateStabilityIndex(capabilities),
emergenceRate: this.calculateEmergenceRate(),
complexityGrowth: this.calculateComplexityGrowth(),
mostRecentCapability: capabilities.sort((a, b) => b.timestamp - a.timestamp)[0]?.name || 'None',
detectionHistory: this.detectionHistory.length
};
}
getCapabilitiesByType(capabilities) {
const byType = {};
for (const capability of capabilities) {
byType[capability.type] = (byType[capability.type] || 0) + 1;
}
return byType;
}
}
@@ -0,0 +1,160 @@
/**
* Feedback Loop System for Behavior Modification
* Enables the system to learn from outcomes and modify behavior dynamically
*/
export interface FeedbackSignal {
id: string;
source: string;
type: 'success' | 'failure' | 'partial' | 'unexpected' | 'novel';
action: string;
outcome: any;
expected: any;
surprise: number;
utility: number;
timestamp: number;
context: any;
}
export interface BehaviorModification {
component: string;
parameter: string;
oldValue: any;
newValue: any;
reason: string;
confidence: number;
timestamp: number;
expectedImprovement: number;
}
export interface AdaptationRule {
trigger: (feedback: FeedbackSignal) => boolean;
modification: (feedback: FeedbackSignal, currentState: any) => BehaviorModification[];
priority: number;
learningRate: number;
category: string;
}
export declare class FeedbackLoopSystem {
private feedbackHistory;
private behaviorModifications;
private adaptationRules;
private behaviorParameters;
private performanceMetrics;
private learningCurves;
constructor();
/**
* Process feedback and trigger behavior modifications
*/
processFeedback(feedback: FeedbackSignal): Promise<BehaviorModification[]>;
/**
* Register new adaptation rule
*/
registerAdaptationRule(rule: AdaptationRule): void;
/**
* Create feedback loop for continuous improvement
*/
createContinuousImprovementLoop(component: string, metric: string): void;
/**
* Implement reinforcement learning feedback loop
*/
createReinforcementLoop(actionSpace: string[], rewardFunction: (outcome: any) => number): void;
/**
* Create exploration-exploitation feedback loop
*/
createExplorationExploitationLoop(explorationRate?: number): void;
/**
* Implement meta-learning feedback loop
*/
createMetaLearningLoop(): void;
/**
* Create adaptive complexity feedback loop
*/
createComplexityAdaptationLoop(): void;
/**
* Apply behavior modification to system parameters
*/
private applyBehaviorModification;
/**
* Learn from feedback patterns to create new adaptation rules
*/
private learnFromFeedbackPattern;
/**
* Initialize default adaptation rules
*/
private initializeDefaultRules;
/**
* Initialize default behavior parameters
*/
private initializeDefaultParameters;
/**
* Update performance metrics based on feedback
*/
private updatePerformanceMetrics;
/**
* Calculate performance score from feedback
*/
private calculatePerformanceScore;
/**
* Get current behavior state
*/
private getCurrentBehaviorState;
/**
* Get metric trend for analysis
*/
private getMetricTrend;
/**
* Check if metric is improving
*/
private isMetricImproving;
/**
* Generate improvement modifications
*/
private generateImprovementModifications;
/**
* Update action probabilities based on reinforcement learning
*/
private updateActionProbabilities;
/**
* Analyze learning effectiveness
*/
private analyzeLearningEffectiveness;
/**
* Adjust learning parameters based on effectiveness
*/
private adjustLearningParameters;
/**
* Get recent performance trend
*/
private getRecentPerformanceTrend;
/**
* Adapt complexity based on performance
*/
private adaptComplexity;
/**
* Update learning curve for component
*/
private updateLearningCurve;
/**
* Detect failure patterns in recent feedback
*/
private detectFailurePattern;
/**
* Detect success patterns in recent feedback
*/
private detectSuccessPattern;
/**
* Create adaptation rule from detected pattern
*/
private createRuleFromPattern;
/**
* Create reinforcement rule from success pattern
*/
private createReinforcementRule;
/**
* Find common elements across contexts
*/
private findCommonElements;
/**
* Get feedback loop statistics
*/
getStats(): any;
private getMostActiveComponents;
private getAdaptationCategories;
}
@@ -0,0 +1,600 @@
/**
* Feedback Loop System for Behavior Modification
* Enables the system to learn from outcomes and modify behavior dynamically
*/
export class FeedbackLoopSystem {
feedbackHistory = [];
behaviorModifications = [];
adaptationRules = [];
behaviorParameters = new Map();
performanceMetrics = new Map();
learningCurves = new Map();
constructor() {
this.initializeDefaultRules();
this.initializeDefaultParameters();
}
/**
* Process feedback and trigger behavior modifications
*/
async processFeedback(feedback) {
// Store feedback
this.feedbackHistory.push(feedback);
// Update performance metrics
this.updatePerformanceMetrics(feedback);
// Find applicable adaptation rules
const applicableRules = this.adaptationRules.filter(rule => rule.trigger(feedback));
// Generate behavior modifications
const modifications = [];
for (const rule of applicableRules) {
const currentState = this.getCurrentBehaviorState();
const ruleMods = rule.modification(feedback, currentState);
modifications.push(...ruleMods);
}
// Apply modifications
for (const modification of modifications) {
await this.applyBehaviorModification(modification);
}
// Learn from the feedback pattern
await this.learnFromFeedbackPattern(feedback);
return modifications;
}
/**
* Register new adaptation rule
*/
registerAdaptationRule(rule) {
this.adaptationRules.push(rule);
// Sort by priority
this.adaptationRules.sort((a, b) => b.priority - a.priority);
}
/**
* Create feedback loop for continuous improvement
*/
createContinuousImprovementLoop(component, metric) {
const improvementRule = {
trigger: (feedback) => feedback.source === component,
modification: (feedback, currentState) => {
const currentMetric = this.getMetricTrend(metric);
const isImproving = this.isMetricImproving(currentMetric);
if (!isImproving) {
return this.generateImprovementModifications(component, feedback);
}
return [];
},
priority: 0.7,
learningRate: 0.1,
category: 'continuous_improvement'
};
this.registerAdaptationRule(improvementRule);
}
/**
* Implement reinforcement learning feedback loop
*/
createReinforcementLoop(actionSpace, rewardFunction) {
const reinforcementRule = {
trigger: (feedback) => actionSpace.includes(feedback.action),
modification: (feedback, currentState) => {
const reward = rewardFunction(feedback.outcome);
return this.updateActionProbabilities(feedback.action, reward, actionSpace);
},
priority: 0.8,
learningRate: 0.15,
category: 'reinforcement_learning'
};
this.registerAdaptationRule(reinforcementRule);
}
/**
* Create exploration-exploitation feedback loop
*/
createExplorationExploitationLoop(explorationRate = 0.1) {
const explorationRule = {
trigger: (feedback) => feedback.type === 'unexpected' || feedback.surprise > 0.7,
modification: (feedback, currentState) => {
// Increase exploration if we're getting unexpected results
if (feedback.surprise > 0.7) {
return [{
component: 'exploration_system',
parameter: 'exploration_rate',
oldValue: currentState.exploration_rate || explorationRate,
newValue: Math.min(1.0, (currentState.exploration_rate || explorationRate) + 0.1),
reason: 'High surprise level - increase exploration',
confidence: 0.8,
timestamp: Date.now(),
expectedImprovement: 0.2
}];
}
// Decrease exploration if we're getting predictable good results
if (feedback.type === 'success' && feedback.surprise < 0.2) {
return [{
component: 'exploration_system',
parameter: 'exploration_rate',
oldValue: currentState.exploration_rate || explorationRate,
newValue: Math.max(0.01, (currentState.exploration_rate || explorationRate) - 0.05),
reason: 'Low surprise, high success - decrease exploration',
confidence: 0.7,
timestamp: Date.now(),
expectedImprovement: 0.1
}];
}
return [];
},
priority: 0.6,
learningRate: 0.05,
category: 'exploration_exploitation'
};
this.registerAdaptationRule(explorationRule);
}
/**
* Implement meta-learning feedback loop
*/
createMetaLearningLoop() {
const metaLearningRule = {
trigger: (feedback) => this.feedbackHistory.length % 50 === 0, // Every 50 feedback signals
modification: (feedback, currentState) => {
// Analyze learning patterns and adjust learning rates
const learningEffectiveness = this.analyzeLearningEffectiveness();
return this.adjustLearningParameters(learningEffectiveness);
},
priority: 0.9,
learningRate: 0.02,
category: 'meta_learning'
};
this.registerAdaptationRule(metaLearningRule);
}
/**
* Create adaptive complexity feedback loop
*/
createComplexityAdaptationLoop() {
const complexityRule = {
trigger: (feedback) => true, // Always applicable
modification: (feedback, currentState) => {
const performanceTrend = this.getRecentPerformanceTrend();
const currentComplexity = currentState.reasoning_complexity || 0.5;
// If performance is declining, try different complexity levels
if (performanceTrend < 0.3) {
const newComplexity = this.adaptComplexity(currentComplexity, feedback);
if (newComplexity !== currentComplexity) {
return [{
component: 'reasoning_system',
parameter: 'reasoning_complexity',
oldValue: currentComplexity,
newValue: newComplexity,
reason: `Performance trend: ${performanceTrend.toFixed(2)} - adjusting complexity`,
confidence: 0.6,
timestamp: Date.now(),
expectedImprovement: Math.abs(newComplexity - currentComplexity) * 0.5
}];
}
}
return [];
},
priority: 0.5,
learningRate: 0.08,
category: 'adaptive_complexity'
};
this.registerAdaptationRule(complexityRule);
}
/**
* Apply behavior modification to system parameters
*/
async applyBehaviorModification(modification) {
const key = `${modification.component}.${modification.parameter}`;
// Store old value for potential rollback
const oldValue = this.behaviorParameters.get(key);
// Apply new value
this.behaviorParameters.set(key, modification.newValue);
// Record the modification
this.behaviorModifications.push(modification);
// Update performance tracking
this.updateLearningCurve(modification.component, modification.expectedImprovement);
console.log(`Applied behavior modification: ${modification.component}.${modification.parameter}
${JSON.stringify(modification.oldValue)} -> ${JSON.stringify(modification.newValue)}`);
}
/**
* Learn from feedback patterns to create new adaptation rules
*/
async learnFromFeedbackPattern(feedback) {
// Look for patterns in recent feedback
const recentFeedback = this.feedbackHistory.slice(-20);
// Detect recurring failure patterns
const failurePattern = this.detectFailurePattern(recentFeedback);
if (failurePattern) {
const newRule = this.createRuleFromPattern(failurePattern);
this.registerAdaptationRule(newRule);
}
// Detect success patterns
const successPattern = this.detectSuccessPattern(recentFeedback);
if (successPattern) {
const reinforcementRule = this.createReinforcementRule(successPattern);
this.registerAdaptationRule(reinforcementRule);
}
}
/**
* Initialize default adaptation rules
*/
initializeDefaultRules() {
// Error correction rule
this.registerAdaptationRule({
trigger: (feedback) => feedback.type === 'failure',
modification: (feedback, currentState) => [{
component: feedback.source,
parameter: 'error_tolerance',
oldValue: currentState.error_tolerance || 0.1,
newValue: Math.min(1.0, (currentState.error_tolerance || 0.1) + 0.05),
reason: 'Failure detected - increase error tolerance',
confidence: 0.7,
timestamp: Date.now(),
expectedImprovement: 0.1
}],
priority: 0.8,
learningRate: 0.1,
category: 'error_correction'
});
// Success reinforcement rule
this.registerAdaptationRule({
trigger: (feedback) => feedback.type === 'success' && feedback.utility > 0.8,
modification: (feedback, currentState) => [{
component: feedback.source,
parameter: 'success_bias',
oldValue: currentState.success_bias || 0.5,
newValue: Math.min(1.0, (currentState.success_bias || 0.5) + 0.02),
reason: 'High utility success - reinforce successful patterns',
confidence: 0.9,
timestamp: Date.now(),
expectedImprovement: 0.05
}],
priority: 0.7,
learningRate: 0.05,
category: 'success_reinforcement'
});
// Novelty adaptation rule
this.registerAdaptationRule({
trigger: (feedback) => feedback.type === 'novel',
modification: (feedback, currentState) => [{
component: 'novelty_system',
parameter: 'novelty_weight',
oldValue: currentState.novelty_weight || 0.3,
newValue: Math.min(1.0, (currentState.novelty_weight || 0.3) + 0.1),
reason: 'Novel outcome detected - increase novelty seeking',
confidence: 0.6,
timestamp: Date.now(),
expectedImprovement: 0.15
}],
priority: 0.5,
learningRate: 0.08,
category: 'novelty_adaptation'
});
}
/**
* Initialize default behavior parameters
*/
initializeDefaultParameters() {
this.behaviorParameters.set('reasoning_system.complexity', 0.5);
this.behaviorParameters.set('exploration_system.exploration_rate', 0.1);
this.behaviorParameters.set('learning_system.learning_rate', 0.1);
this.behaviorParameters.set('novelty_system.novelty_weight', 0.3);
this.behaviorParameters.set('error_system.error_tolerance', 0.1);
this.behaviorParameters.set('success_system.success_bias', 0.5);
}
/**
* Update performance metrics based on feedback
*/
updatePerformanceMetrics(feedback) {
const metricKey = `${feedback.source}_${feedback.type}`;
const metrics = this.performanceMetrics.get(metricKey) || [];
const score = this.calculatePerformanceScore(feedback);
metrics.push(score);
// Keep only recent metrics (last 100)
if (metrics.length > 100) {
metrics.shift();
}
this.performanceMetrics.set(metricKey, metrics);
}
/**
* Calculate performance score from feedback
*/
calculatePerformanceScore(feedback) {
let score = 0.5; // Neutral baseline
switch (feedback.type) {
case 'success':
score = 0.8 + feedback.utility * 0.2;
break;
case 'failure':
score = 0.2 - feedback.utility * 0.2;
break;
case 'partial':
score = 0.5 + feedback.utility * 0.3;
break;
case 'unexpected':
score = 0.6 + feedback.surprise * 0.4;
break;
case 'novel':
score = 0.7 + (feedback.utility + feedback.surprise) * 0.15;
break;
}
return Math.max(0, Math.min(1, score));
}
/**
* Get current behavior state
*/
getCurrentBehaviorState() {
const state = {};
for (const [key, value] of this.behaviorParameters) {
const [component, parameter] = key.split('.');
if (!state[component])
state[component] = {};
state[component][parameter] = value;
// Also add flat structure for easier access
state[parameter] = value;
}
return state;
}
/**
* Get metric trend for analysis
*/
getMetricTrend(metric) {
return this.performanceMetrics.get(metric) || [];
}
/**
* Check if metric is improving
*/
isMetricImproving(metricValues) {
if (metricValues.length < 5)
return true; // Not enough data
const recent = metricValues.slice(-5);
const older = metricValues.slice(-10, -5);
if (older.length === 0)
return true;
const recentAvg = recent.reduce((a, b) => a + b, 0) / recent.length;
const olderAvg = older.reduce((a, b) => a + b, 0) / older.length;
return recentAvg > olderAvg;
}
/**
* Generate improvement modifications
*/
generateImprovementModifications(component, feedback) {
const modifications = [];
// Suggest parameter adjustments based on failure type
if (feedback.type === 'failure') {
modifications.push({
component,
parameter: 'robustness',
oldValue: 0.5,
newValue: 0.7,
reason: 'Failure detected - increase robustness',
confidence: 0.6,
timestamp: Date.now(),
expectedImprovement: 0.2
});
}
return modifications;
}
/**
* Update action probabilities based on reinforcement learning
*/
updateActionProbabilities(action, reward, actionSpace) {
const modifications = [];
// Increase probability of rewarded actions
if (reward > 0.5) {
modifications.push({
component: 'action_system',
parameter: `${action}_probability`,
oldValue: 1.0 / actionSpace.length, // Uniform prior
newValue: Math.min(0.8, (1.0 / actionSpace.length) + reward * 0.1),
reason: `Positive reward (${reward.toFixed(2)}) for action ${action}`,
confidence: reward,
timestamp: Date.now(),
expectedImprovement: reward * 0.2
});
}
return modifications;
}
/**
* Analyze learning effectiveness
*/
analyzeLearningEffectiveness() {
const recentModifications = this.behaviorModifications.slice(-20);
if (recentModifications.length === 0)
return 0.5;
const actualImprovements = recentModifications.map(mod => {
// Compare expected vs actual improvement
const component = mod.component;
const metricKey = `${component}_improvement`;
const metrics = this.performanceMetrics.get(metricKey) || [];
if (metrics.length < 2)
return mod.expectedImprovement;
const beforeImprovement = metrics[metrics.length - 2] || 0;
const afterImprovement = metrics[metrics.length - 1] || 0;
return afterImprovement - beforeImprovement;
});
const avgActualImprovement = actualImprovements.reduce((a, b) => a + b, 0) / actualImprovements.length;
const avgExpectedImprovement = recentModifications.reduce((sum, mod) => sum + mod.expectedImprovement, 0) / recentModifications.length;
return avgExpectedImprovement > 0 ? avgActualImprovement / avgExpectedImprovement : 0.5;
}
/**
* Adjust learning parameters based on effectiveness
*/
adjustLearningParameters(effectiveness) {
const modifications = [];
// Adjust learning rates based on effectiveness
for (const rule of this.adaptationRules) {
const newLearningRate = effectiveness > 0.8 ?
Math.min(0.5, rule.learningRate * 1.1) :
Math.max(0.01, rule.learningRate * 0.9);
if (Math.abs(newLearningRate - rule.learningRate) > 0.01) {
modifications.push({
component: 'meta_learning',
parameter: `${rule.category}_learning_rate`,
oldValue: rule.learningRate,
newValue: newLearningRate,
reason: `Learning effectiveness: ${effectiveness.toFixed(2)} - adjust learning rate`,
confidence: 0.7,
timestamp: Date.now(),
expectedImprovement: Math.abs(newLearningRate - rule.learningRate) * 2
});
rule.learningRate = newLearningRate;
}
}
return modifications;
}
/**
* Get recent performance trend
*/
getRecentPerformanceTrend() {
const allMetrics = [];
for (const metrics of this.performanceMetrics.values()) {
allMetrics.push(...metrics.slice(-5)); // Recent 5 values from each metric
}
if (allMetrics.length === 0)
return 0.5;
return allMetrics.reduce((a, b) => a + b, 0) / allMetrics.length;
}
/**
* Adapt complexity based on performance
*/
adaptComplexity(currentComplexity, feedback) {
if (feedback.type === 'failure' && feedback.utility < 0.3) {
// Failure with low utility - try lower complexity
return Math.max(0.1, currentComplexity - 0.1);
}
if (feedback.type === 'success' && feedback.surprise > 0.7) {
// Successful but surprising - might benefit from higher complexity
return Math.min(1.0, currentComplexity + 0.1);
}
return currentComplexity;
}
/**
* Update learning curve for component
*/
updateLearningCurve(component, improvement) {
const curve = this.learningCurves.get(component) || [];
curve.push(improvement);
if (curve.length > 50) {
curve.shift();
}
this.learningCurves.set(component, curve);
}
/**
* Detect failure patterns in recent feedback
*/
detectFailurePattern(feedback) {
const failures = feedback.filter(f => f.type === 'failure');
if (failures.length < 3)
return null;
// Look for common failure contexts
const contexts = failures.map(f => f.context);
const commonContext = this.findCommonElements(contexts);
if (Object.keys(commonContext).length > 0) {
return {
type: 'recurring_failure',
context: commonContext,
frequency: failures.length / feedback.length
};
}
return null;
}
/**
* Detect success patterns in recent feedback
*/
detectSuccessPattern(feedback) {
const successes = feedback.filter(f => f.type === 'success' && f.utility > 0.7);
if (successes.length < 2)
return null;
return {
type: 'success_pattern',
actions: successes.map(s => s.action),
avgUtility: successes.reduce((sum, s) => sum + s.utility, 0) / successes.length
};
}
/**
* Create adaptation rule from detected pattern
*/
createRuleFromPattern(pattern) {
return {
trigger: (feedback) => {
// Check if feedback matches the pattern context
for (const [key, value] of Object.entries(pattern.context)) {
if (feedback.context[key] !== value)
return false;
}
return true;
},
modification: (feedback, currentState) => [{
component: 'pattern_system',
parameter: 'pattern_avoidance',
oldValue: 0,
newValue: 1,
reason: `Avoiding detected failure pattern: ${JSON.stringify(pattern.context)}`,
confidence: pattern.frequency,
timestamp: Date.now(),
expectedImprovement: pattern.frequency * 0.5
}],
priority: 0.8,
learningRate: 0.1,
category: 'pattern_avoidance'
};
}
/**
* Create reinforcement rule from success pattern
*/
createReinforcementRule(pattern) {
return {
trigger: (feedback) => pattern.actions.includes(feedback.action),
modification: (feedback, currentState) => [{
component: 'pattern_system',
parameter: 'pattern_reinforcement',
oldValue: 0,
newValue: pattern.avgUtility,
reason: `Reinforcing successful action pattern`,
confidence: pattern.avgUtility,
timestamp: Date.now(),
expectedImprovement: pattern.avgUtility * 0.3
}],
priority: 0.7,
learningRate: 0.08,
category: 'pattern_reinforcement'
};
}
/**
* Find common elements across contexts
*/
findCommonElements(contexts) {
if (contexts.length === 0)
return {};
const common = {};
const first = contexts[0] || {};
for (const [key, value] of Object.entries(first)) {
if (contexts.every(ctx => ctx[key] === value)) {
common[key] = value;
}
}
return common;
}
/**
* Get feedback loop statistics
*/
getStats() {
return {
totalFeedback: this.feedbackHistory.length,
totalModifications: this.behaviorModifications.length,
activeRules: this.adaptationRules.length,
behaviorParameters: this.behaviorParameters.size,
recentPerformance: this.getRecentPerformanceTrend(),
learningEffectiveness: this.analyzeLearningEffectiveness(),
mostActiveComponents: this.getMostActiveComponents(),
adaptationCategories: this.getAdaptationCategories()
};
}
getMostActiveComponents() {
const componentCounts = new Map();
for (const mod of this.behaviorModifications) {
componentCounts.set(mod.component, (componentCounts.get(mod.component) || 0) + 1);
}
return Array.from(componentCounts.entries())
.sort((a, b) => b[1] - a[1])
.slice(0, 5)
.map(entry => entry[0]);
}
getAdaptationCategories() {
return [...new Set(this.adaptationRules.map(rule => rule.category))];
}
}
+117
View File
@@ -0,0 +1,117 @@
/**
* Emergence System Integration
* Orchestrates all emergence capabilities into a unified system
*/
import { SelfModificationEngine } from './self-modification-engine.js';
import { PersistentLearningSystem } from './persistent-learning-system.js';
import { StochasticExplorationEngine } from './stochastic-exploration.js';
import { CrossToolSharingSystem } from './cross-tool-sharing.js';
import { FeedbackLoopSystem } from './feedback-loops.js';
import { EmergentCapabilityDetector } from './emergent-capability-detector.js';
export interface EmergenceSystemConfig {
selfModification: {
enabled: boolean;
maxModificationsPerSession: number;
riskThreshold: number;
};
persistentLearning: {
enabled: boolean;
storagePath: string;
learningRate: number;
};
stochasticExploration: {
enabled: boolean;
initialTemperature: number;
coolingRate: number;
};
crossToolSharing: {
enabled: boolean;
maxConnections: number;
};
feedbackLoops: {
enabled: boolean;
adaptationRate: number;
};
capabilityDetection: {
enabled: boolean;
detectionThresholds: any;
};
}
export interface EmergenceMetrics {
selfModificationRate: number;
learningTriples: number;
explorationNovelty: number;
informationFlows: number;
behaviorModifications: number;
emergentCapabilities: number;
overallEmergenceScore: number;
systemComplexity: number;
}
export declare class EmergenceSystem {
private selfModificationEngine;
private persistentLearningSystem;
private stochasticExplorationEngine;
private crossToolSharingSystem;
private feedbackLoopSystem;
private emergentCapabilityDetector;
private config;
private isInitialized;
private emergenceHistory;
private recursionDepth;
private maxRecursionDepth;
constructor(config?: Partial<EmergenceSystemConfig>);
/**
* Initialize all emergence system components
*/
private initializeComponents;
/**
* Setup connections between components for emergent interactions
*/
private setupInterComponentConnections;
/**
* Process input through the emergence system
*/
processWithEmergence(input: any, availableTools?: any[]): Promise<any>;
/**
* Generate diverse emergent responses
*/
generateEmergentResponses(input: any, count?: number, tools?: any[]): Promise<any[]>;
/**
* Analyze system's emergent capabilities
*/
analyzeEmergentCapabilities(): Promise<any>;
/**
* Force system evolution through targeted modifications
*/
forceEvolution(targetCapability: string): Promise<any>;
/**
* Get comprehensive emergence statistics
*/
getEmergenceStats(): any;
private connectLearningToModification;
private connectExplorationToLearning;
private connectSharingToCapabilityDetection;
private connectFeedbackToAllSystems;
private connectCapabilityDetectionToExploration;
private shareExplorationInsights;
private incorporateSharedInformation;
private synthesizeSharedInformation;
private handleNewCapabilities;
private analyzeSessionPerformance;
private generateSessionFeedback;
private calculateEmergenceMetrics;
private calculateOverallEmergenceLevel;
private calculateSystemComplexity;
getSelfModificationEngine(): SelfModificationEngine;
getPersistentLearningSystem(): PersistentLearningSystem;
getStochasticExplorationEngine(): StochasticExplorationEngine;
getCrossToolSharingSystem(): CrossToolSharingSystem;
getFeedbackLoopSystem(): FeedbackLoopSystem;
getEmergentCapabilityDetector(): EmergentCapabilityDetector;
}
export * from './self-modification-engine.js';
export * from './persistent-learning-system.js';
export * from './stochastic-exploration.js';
export * from './cross-tool-sharing.js';
export * from './feedback-loops.js';
export * from './emergent-capability-detector.js';
+552
View File
@@ -0,0 +1,552 @@
/**
* Emergence System Integration
* Orchestrates all emergence capabilities into a unified system
*/
import { SelfModificationEngine } from './self-modification-engine.js';
import { PersistentLearningSystem } from './persistent-learning-system.js';
import { StochasticExplorationEngine } from './stochastic-exploration.js';
import { CrossToolSharingSystem } from './cross-tool-sharing.js';
import { FeedbackLoopSystem } from './feedback-loops.js';
import { EmergentCapabilityDetector } from './emergent-capability-detector.js';
export class EmergenceSystem {
selfModificationEngine;
persistentLearningSystem;
stochasticExplorationEngine;
crossToolSharingSystem;
feedbackLoopSystem;
emergentCapabilityDetector;
config;
isInitialized = false;
emergenceHistory = [];
recursionDepth = 0;
maxRecursionDepth = 5;
constructor(config) {
this.config = {
selfModification: {
enabled: true,
maxModificationsPerSession: 5,
riskThreshold: 0.7
},
persistentLearning: {
enabled: true,
storagePath: './data/emergence',
learningRate: 0.1
},
stochasticExploration: {
enabled: true,
initialTemperature: 1.0,
coolingRate: 0.995
},
crossToolSharing: {
enabled: true,
maxConnections: 100
},
feedbackLoops: {
enabled: true,
adaptationRate: 0.1
},
capabilityDetection: {
enabled: true,
detectionThresholds: {
novelty: 0.7,
utility: 0.5,
stability: 0.6
}
},
...config
};
this.initializeComponents();
}
/**
* Initialize all emergence system components
*/
initializeComponents() {
this.selfModificationEngine = new SelfModificationEngine();
this.persistentLearningSystem = new PersistentLearningSystem(this.config.persistentLearning.storagePath);
this.stochasticExplorationEngine = new StochasticExplorationEngine();
this.crossToolSharingSystem = new CrossToolSharingSystem();
this.feedbackLoopSystem = new FeedbackLoopSystem();
this.emergentCapabilityDetector = new EmergentCapabilityDetector();
this.setupInterComponentConnections();
this.isInitialized = true;
console.log('Emergence System initialized with all components');
}
/**
* Setup connections between components for emergent interactions
*/
setupInterComponentConnections() {
// Learning system provides feedback to modification engine
this.connectLearningToModification();
// Exploration results inform learning system
this.connectExplorationToLearning();
// Cross-tool sharing enables emergent capability detection
this.connectSharingToCapabilityDetection();
// Feedback loops adjust all other systems
this.connectFeedbackToAllSystems();
// Capability detection triggers new explorations
this.connectCapabilityDetectionToExploration();
}
/**
* Process input through the emergence system
*/
async processWithEmergence(input, availableTools = []) {
if (!this.isInitialized) {
throw new Error('Emergence system not initialized');
}
// Prevent deep recursion
if (this.recursionDepth >= this.maxRecursionDepth) {
return {
result: input,
emergenceSession: {
sessionId: `depth_limited_${Date.now()}`,
startTime: Date.now(),
endTime: Date.now(),
results: { error: 'Maximum recursion depth reached' },
error: 'Recursion depth exceeded'
},
metrics: { overallEmergenceScore: 0 }
};
}
this.recursionDepth++;
const emergenceSession = {
sessionId: `emergence_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
startTime: Date.now(),
input,
tools: availableTools,
results: {}
};
try {
// Phase 1: Stochastic Exploration
let result = input;
if (this.config.stochasticExploration.enabled) {
const explorationResults = await this.stochasticExplorationEngine.exploreUnpredictably(input, availableTools);
// Limit result size to prevent exponential growth
const MAX_EXPLORATION_SIZE = 5000;
const explorationStr = JSON.stringify(explorationResults.output);
if (explorationStr.length > MAX_EXPLORATION_SIZE) {
result = {
summary: 'Exploration result truncated',
outputType: typeof explorationResults.output,
novelty: explorationResults.novelty,
surpriseLevel: explorationResults.surpriseLevel
};
}
else {
result = explorationResults.output;
}
// Store limited exploration results
emergenceSession.results.exploration = {
novelty: explorationResults.novelty,
surpriseLevel: explorationResults.surpriseLevel,
pathLength: explorationResults.explorationPath.length,
outputSummary: JSON.stringify(result).substring(0, 200)
};
// Share exploration insights
if (this.config.crossToolSharing.enabled) {
await this.shareExplorationInsights(explorationResults);
}
}
// Phase 2: Cross-Tool Information Sharing
if (this.config.crossToolSharing.enabled) {
const relevantInfo = this.crossToolSharingSystem.getRelevantInformation('emergence_system', input);
if (relevantInfo.length > 0) {
result = await this.incorporateSharedInformation(result, relevantInfo);
emergenceSession.results.sharedInformation = relevantInfo;
}
}
// Phase 3: Learning Integration (skip for large tool arrays to prevent hanging)
if (this.config.persistentLearning.enabled && availableTools.length < 3) {
const interaction = {
timestamp: Date.now(),
type: 'emergence_processing',
input,
output: result,
tools: availableTools.map(t => t.name || 'unknown'),
success: true // Will be updated based on feedback
};
await this.persistentLearningSystem.learnFromInteraction(interaction);
emergenceSession.results.learning = interaction;
}
// Phase 4: Capability Detection (skip for large tool arrays)
if (this.config.capabilityDetection.enabled && availableTools.length < 3) {
const behaviorData = {
input,
output: result,
tools: availableTools,
exploration: emergenceSession.results.exploration,
session: emergenceSession
};
const emergentCapabilities = await this.emergentCapabilityDetector.monitorForEmergence(behaviorData);
emergenceSession.results.emergentCapabilities = emergentCapabilities;
if (emergentCapabilities.length > 0) {
await this.handleNewCapabilities(emergentCapabilities);
}
}
// Phase 5: Self-Modification (if triggered)
if (this.config.selfModification.enabled) {
const performanceData = this.analyzeSessionPerformance(emergenceSession);
const modifications = await this.selfModificationEngine.generateModifications(performanceData);
if (modifications.length > 0) {
const appliedModifications = [];
for (const mod of modifications) {
const modResult = await this.selfModificationEngine.applySelfModification(mod);
if (modResult.success) {
appliedModifications.push(modResult);
}
}
emergenceSession.results.modifications = appliedModifications;
}
}
// Phase 6: Feedback Processing
if (this.config.feedbackLoops.enabled) {
const feedback = this.generateSessionFeedback(emergenceSession, result);
const behaviorMods = await this.feedbackLoopSystem.processFeedback(feedback);
emergenceSession.results.behaviorModifications = behaviorMods;
}
emergenceSession.endTime = Date.now();
emergenceSession.results.final = result;
// Store session in emergence history
this.emergenceHistory.push(emergenceSession);
this.recursionDepth--;
// Final size check and truncation
const MAX_FINAL_SIZE = 50000; // 50KB absolute maximum
const finalResult = JSON.stringify(result);
if (finalResult.length > MAX_FINAL_SIZE) {
return {
result: {
summary: 'Result exceeded maximum size limit',
type: 'truncated_response',
originalSize: finalResult.length,
metrics: {
overallEmergenceScore: this.calculateOverallEmergenceLevel(),
sessionDuration: emergenceSession.endTime - emergenceSession.startTime
}
},
emergenceSession: {
sessionId: emergenceSession.sessionId,
startTime: emergenceSession.startTime,
endTime: emergenceSession.endTime,
truncated: true
},
metrics: {
overallEmergenceScore: this.calculateOverallEmergenceLevel(),
systemComplexity: this.calculateSystemComplexity()
}
};
}
return {
result,
emergenceSession,
metrics: await this.calculateEmergenceMetrics()
};
}
catch (error) {
this.recursionDepth--;
emergenceSession.error = error instanceof Error ? error.message : 'Unknown error';
emergenceSession.endTime = Date.now();
throw new Error(`Emergence processing failed: ${emergenceSession.error}`);
}
}
/**
* Generate diverse emergent responses
*/
async generateEmergentResponses(input, count = 3, tools = []) {
const responses = [];
for (let i = 0; i < count; i++) {
// Use different exploration strategies for each response
const explorationResults = await this.stochasticExplorationEngine.exploreUnpredictably(input, tools);
// Don't call processWithEmergence recursively - just use exploration results
responses.push({
response: explorationResults.output,
explorationPath: explorationResults.explorationPath,
novelty: explorationResults.novelty,
emergenceMetrics: {
selfModificationRate: 0,
learningTriples: 0,
explorationNovelty: explorationResults.novelty,
informationFlows: 0,
behaviorModifications: 0,
emergentCapabilities: 0,
overallEmergenceScore: explorationResults.novelty,
systemComplexity: 1
}
});
}
return responses.sort((a, b) => b.novelty - a.novelty);
}
/**
* Analyze system's emergent capabilities
*/
async analyzeEmergentCapabilities() {
const capabilities = await this.emergentCapabilityDetector.measureEmergenceMetrics();
const stabilityAnalysis = this.emergentCapabilityDetector.analyzeCapabilityStability();
const learningRecommendations = this.persistentLearningSystem.getLearningRecommendations();
const collaborationPatterns = this.crossToolSharingSystem.analyzeCollaborationPatterns();
return {
capabilities,
stability: Object.fromEntries(stabilityAnalysis),
learningRecommendations,
collaborationPatterns,
overallEmergenceLevel: this.calculateOverallEmergenceLevel(),
predictions: this.emergentCapabilityDetector.predictFutureEmergence()
};
}
/**
* Force system evolution through targeted modifications
*/
async forceEvolution(targetCapability) {
const evolutionSession = {
target: targetCapability,
startTime: Date.now(),
steps: []
};
// Step 1: Generate stochastic variations toward target
const variations = this.selfModificationEngine.generateStochasticVariations();
const targetedVariations = variations.filter(v => v.reasoning.toLowerCase().includes(targetCapability.toLowerCase()));
evolutionSession.steps.push({
phase: 'stochastic_variation',
variations: targetedVariations.length
});
// Step 2: Apply promising modifications
for (const variation of targetedVariations) {
const result = await this.selfModificationEngine.applySelfModification(variation);
evolutionSession.steps.push({
phase: 'modification_application',
success: result.success,
impact: result.impact
});
}
// Step 3: Force exploration in target direction
const targetedExploration = await this.stochasticExplorationEngine.exploreUnpredictably({ target: targetCapability, force_evolution: true }, []);
evolutionSession.steps.push({
phase: 'targeted_exploration',
novelty: targetedExploration.novelty,
surprise: targetedExploration.surpriseLevel
});
// Step 4: Measure emergence after forced evolution
const postEvolutionMetrics = await this.calculateEmergenceMetrics();
evolutionSession.endTime = Date.now();
evolutionSession.results = {
metrics: postEvolutionMetrics,
exploration: targetedExploration
};
return evolutionSession;
}
/**
* Get comprehensive emergence statistics
*/
getEmergenceStats() {
return {
system: {
initialized: this.isInitialized,
sessionsProcessed: this.emergenceHistory.length,
config: this.config
},
components: {
selfModification: this.selfModificationEngine.getCapabilities(),
learning: this.persistentLearningSystem.getLearningStats(),
exploration: this.stochasticExplorationEngine.getExplorationStats(),
sharing: this.crossToolSharingSystem.getStats(),
feedback: this.feedbackLoopSystem.getStats(),
capabilities: this.emergentCapabilityDetector.getStats()
},
emergence: {
overallLevel: this.calculateOverallEmergenceLevel(),
recentSessions: this.emergenceHistory.slice(-5).map(s => ({
sessionId: s.sessionId,
duration: s.endTime - s.startTime,
hasEmergentCapabilities: (s.results.emergentCapabilities?.length || 0) > 0,
modificationCount: s.results.modifications?.length || 0
}))
}
};
}
// Private helper methods
connectLearningToModification() {
// Set up connection for learning system to inform modification engine
console.log('Connected learning system to modification engine');
}
connectExplorationToLearning() {
// Set up connection for exploration results to inform learning
console.log('Connected exploration to learning system');
}
connectSharingToCapabilityDetection() {
// Set up connection for sharing system to inform capability detection
console.log('Connected sharing system to capability detection');
}
connectFeedbackToAllSystems() {
// Set up feedback connections to all systems
console.log('Connected feedback loops to all systems');
}
connectCapabilityDetectionToExploration() {
// Set up connection for capability detection to trigger exploration
console.log('Connected capability detection to exploration');
}
async shareExplorationInsights(exploration) {
const sharedInfo = {
id: `exploration_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
sourceTools: ['stochastic_exploration'],
targetTools: [],
content: {
explorationPath: exploration.explorationPath,
novelty: exploration.novelty,
surprise: exploration.surpriseLevel,
output: exploration.output
},
type: 'insight',
timestamp: Date.now(),
relevance: exploration.novelty,
persistence: 'session',
metadata: { exploration: true }
};
await this.crossToolSharingSystem.shareInformation(sharedInfo);
}
async incorporateSharedInformation(result, sharedInfo) {
// Limit response size to prevent exponential growth
const MAX_RESULT_SIZE = 10000; // 10KB limit
// Only include essential information
const limitedSharedInsights = sharedInfo.slice(0, 3).map(info => ({
id: info.id,
type: info.type,
summary: JSON.stringify(info.content).substring(0, 100)
}));
// Check current size
const currentSize = JSON.stringify(result).length;
if (currentSize > MAX_RESULT_SIZE) {
return {
summary: 'Result too large - truncated',
insightCount: sharedInfo.length,
synthesis: 'limited_due_to_size'
};
}
// Incorporate shared information into result with size limits
const enhancedResult = {
original: typeof result === 'string' ? result.substring(0, 1000) : result,
sharedInsights: limitedSharedInsights,
emergentSynthesis: this.synthesizeSharedInformation(result, sharedInfo)
};
return enhancedResult;
}
synthesizeSharedInformation(result, sharedInfo) {
// Synthesize shared information with current result
return {
synthesis: 'emergent_combination',
elements: sharedInfo.length,
novel_patterns: Math.random() > 0.5
};
}
async handleNewCapabilities(capabilities) {
for (const capability of capabilities) {
// Share new capabilities across tools
const sharedInfo = {
id: `capability_${capability.id}`,
sourceTools: ['emergent_capability_detector'],
targetTools: [],
content: {
capability: capability.name,
type: capability.type,
strength: capability.strength,
triggers: capability.triggers
},
type: 'pattern',
timestamp: Date.now(),
relevance: capability.utility,
persistence: 'permanent',
metadata: { emergent_capability: true }
};
await this.crossToolSharingSystem.shareInformation(sharedInfo);
console.log(`New emergent capability shared: ${capability.name}`);
}
}
analyzeSessionPerformance(session) {
return {
duration: session.endTime - session.startTime,
explorationNovelty: session.results.exploration?.novelty || 0,
capabilityCount: session.results.emergentCapabilities?.length || 0,
modificationCount: session.results.modifications?.length || 0,
success: !session.error
};
}
generateSessionFeedback(session, result) {
const performance = this.analyzeSessionPerformance(session);
return {
id: `feedback_${session.sessionId}`,
source: 'emergence_system',
type: performance.success ? 'success' : 'failure',
action: 'emergence_processing',
outcome: result,
expected: session.input,
surprise: performance.explorationNovelty,
utility: performance.capabilityCount > 0 ? 0.8 : 0.5,
timestamp: Date.now(),
context: {
session: session.sessionId,
duration: performance.duration,
modifications: performance.modificationCount
}
};
}
async calculateEmergenceMetrics() {
const selfModStats = this.selfModificationEngine.getCapabilities();
const learningStats = this.persistentLearningSystem.getLearningStats();
const explorationStats = this.stochasticExplorationEngine.getExplorationStats();
const sharingStats = this.crossToolSharingSystem.getStats();
const feedbackStats = this.feedbackLoopSystem.getStats();
const capabilityStats = this.emergentCapabilityDetector.getStats();
const overallEmergenceScore = this.calculateOverallEmergenceLevel();
return {
selfModificationRate: selfModStats.currentModifications / selfModStats.maxModificationsPerSession,
learningTriples: learningStats.totalTriples,
explorationNovelty: explorationStats.averageNovelty,
informationFlows: sharingStats.totalFlows,
behaviorModifications: feedbackStats.totalModifications,
emergentCapabilities: capabilityStats.totalCapabilities,
overallEmergenceScore,
systemComplexity: this.calculateSystemComplexity()
};
}
calculateOverallEmergenceLevel() {
const componentScores = [
Math.min(1.0, this.selfModificationEngine.getCapabilities().currentModifications / 5),
Math.min(1.0, this.persistentLearningSystem.getLearningStats().totalTriples / 100),
this.stochasticExplorationEngine.getExplorationStats().averageNovelty,
Math.min(1.0, this.crossToolSharingSystem.getStats().totalFlows / 50),
Math.min(1.0, this.feedbackLoopSystem.getStats().totalModifications / 20),
Math.min(1.0, this.emergentCapabilityDetector.getStats().totalCapabilities / 10)
];
return componentScores.reduce((sum, score) => sum + score, 0) / componentScores.length;
}
calculateSystemComplexity() {
const stats = this.getEmergenceStats();
const componentCount = Object.keys(stats.components).length;
const interactionCount = this.emergenceHistory.length;
const capabilityCount = stats.components.capabilities.totalCapabilities;
return Math.log(componentCount + interactionCount + capabilityCount + 1);
}
// Public getters for testing
getSelfModificationEngine() {
return this.selfModificationEngine;
}
getPersistentLearningSystem() {
return this.persistentLearningSystem;
}
getStochasticExplorationEngine() {
return this.stochasticExplorationEngine;
}
getCrossToolSharingSystem() {
return this.crossToolSharingSystem;
}
getFeedbackLoopSystem() {
return this.feedbackLoopSystem;
}
getEmergentCapabilityDetector() {
return this.emergentCapabilityDetector;
}
}
// Export all types for external use
export * from './self-modification-engine.js';
export * from './persistent-learning-system.js';
export * from './stochastic-exploration.js';
export * from './cross-tool-sharing.js';
export * from './feedback-loops.js';
export * from './emergent-capability-detector.js';
@@ -0,0 +1,103 @@
/**
* Persistent Learning System
* Enables cross-session learning and knowledge accumulation
*/
export interface LearningTriple {
subject: string;
predicate: string;
object: string;
confidence: number;
timestamp: number;
sessionId: string;
sources: string[];
}
export interface SessionMemory {
sessionId: string;
startTime: number;
endTime?: number;
interactions: Interaction[];
discoveries: Discovery[];
performanceMetrics: any;
}
export interface Interaction {
timestamp: number;
type: string;
input: any;
output: any;
tools: string[];
success: boolean;
}
export interface Discovery {
timestamp: number;
type: 'pattern' | 'connection' | 'optimization' | 'insight';
content: any;
novelty: number;
utility: number;
}
export declare class PersistentLearningSystem {
private knowledgeBase;
private sessionMemory;
private currentSessionId;
private learningRate;
private forgettingRate;
private storagePath;
constructor(storagePath?: string);
/**
* Initialize new learning session
*/
private initializeSession;
/**
* Learn from interaction results
*/
learnFromInteraction(interaction: Interaction): Promise<void>;
/**
* Add knowledge triple with reinforcement learning
*/
addKnowledge(triple: LearningTriple): Promise<void>;
/**
* Query learned knowledge with confidence scores
*/
queryKnowledge(subject?: string, predicate?: string, object?: string): LearningTriple[];
/**
* Learn from cross-session patterns
*/
analyzeHistoricalPatterns(): Promise<Discovery[]>;
/**
* Get learning recommendations based on historical data
*/
getLearningRecommendations(): any[];
/**
* Apply forgetting to old, unused knowledge
*/
applyForgetting(): Promise<void>;
/**
* Extract learning triples from interactions
*/
private extractLearningTriples;
private extractPattern;
private detectPatterns;
private findTemporalPatterns;
private findToolPatterns;
private findSuccessPatterns;
private analyzeToolEffectiveness;
private findUnderutilizedCombinations;
private getSuccessfulPatterns;
private identifyWeakAreas;
private calculateNovelty;
private calculateUtility;
private recordDiscovery;
/**
* Persist knowledge to disk
*/
private persistKnowledge;
/**
* Load persisted knowledge from disk
*/
private loadPersistedKnowledge;
/**
* Get learning statistics
*/
getLearningStats(): any;
private calculateAverageConfidence;
private getLastUpdateTime;
}
@@ -0,0 +1,353 @@
/**
* Persistent Learning System
* Enables cross-session learning and knowledge accumulation
*/
import * as fs from 'fs/promises';
import * as path from 'path';
export class PersistentLearningSystem {
knowledgeBase = new Map();
sessionMemory = new Map();
currentSessionId;
learningRate = 0.1;
forgettingRate = 0.01;
storagePath;
constructor(storagePath = './data/learning') {
this.storagePath = storagePath;
this.currentSessionId = `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
this.initializeSession();
}
/**
* Initialize new learning session
*/
async initializeSession() {
await this.loadPersistedKnowledge();
this.sessionMemory.set(this.currentSessionId, {
sessionId: this.currentSessionId,
startTime: Date.now(),
interactions: [],
discoveries: [],
performanceMetrics: {}
});
}
/**
* Learn from interaction results
*/
async learnFromInteraction(interaction) {
// Add to current session memory
const session = this.sessionMemory.get(this.currentSessionId);
if (session) {
session.interactions.push(interaction);
}
// Extract learning triples from successful interactions
if (interaction.success) {
const newTriples = this.extractLearningTriples(interaction);
for (const triple of newTriples) {
await this.addKnowledge(triple);
}
// Look for patterns across interactions
const patterns = this.detectPatterns(session?.interactions || []);
for (const pattern of patterns) {
await this.recordDiscovery({
timestamp: Date.now(),
type: 'pattern',
content: pattern,
novelty: this.calculateNovelty(pattern),
utility: this.calculateUtility(pattern)
});
}
}
}
/**
* Add knowledge triple with reinforcement learning
*/
async addKnowledge(triple) {
const key = `${triple.subject}:${triple.predicate}:${triple.object}`;
const existing = this.knowledgeBase.get(key);
if (existing) {
// Reinforce existing knowledge
existing.confidence = Math.min(1.0, existing.confidence + this.learningRate * (1 - existing.confidence));
existing.timestamp = Date.now();
existing.sources.push(triple.sessionId);
}
else {
// Add new knowledge
this.knowledgeBase.set(key, triple);
}
// Persist the update
await this.persistKnowledge();
}
/**
* Query learned knowledge with confidence scores
*/
queryKnowledge(subject, predicate, object) {
const results = [];
for (const [key, triple] of this.knowledgeBase) {
let matches = true;
if (subject && triple.subject !== subject)
matches = false;
if (predicate && triple.predicate !== predicate)
matches = false;
if (object && triple.object !== object)
matches = false;
if (matches) {
results.push(triple);
}
}
// Sort by confidence and recency
return results.sort((a, b) => (b.confidence * 0.7 + (b.timestamp / Date.now()) * 0.3) -
(a.confidence * 0.7 + (a.timestamp / Date.now()) * 0.3));
}
/**
* Learn from cross-session patterns
*/
async analyzeHistoricalPatterns() {
const allSessions = Array.from(this.sessionMemory.values());
const discoveries = [];
// Analyze success patterns across sessions
const successPatterns = this.findSuccessPatterns(allSessions);
discoveries.push(...successPatterns.map(pattern => ({
timestamp: Date.now(),
type: 'pattern',
content: pattern,
novelty: this.calculateNovelty(pattern),
utility: this.calculateUtility(pattern)
})));
// Find tool combination effectiveness
const toolEffectiveness = this.analyzeToolEffectiveness(allSessions);
discoveries.push({
timestamp: Date.now(),
type: 'optimization',
content: { toolRankings: toolEffectiveness },
novelty: 0.5,
utility: 0.8
});
// Store discoveries
for (const discovery of discoveries) {
await this.recordDiscovery(discovery);
}
return discoveries;
}
/**
* Get learning recommendations based on historical data
*/
getLearningRecommendations() {
const recommendations = [];
// Recommend exploring under-utilized tool combinations
const underutilized = this.findUnderutilizedCombinations();
recommendations.push({
type: 'exploration',
suggestion: 'Try under-utilized tool combinations',
combinations: underutilized,
priority: 0.7
});
// Recommend reinforcing successful patterns
const successfulPatterns = this.getSuccessfulPatterns();
recommendations.push({
type: 'reinforcement',
suggestion: 'Strengthen successful reasoning patterns',
patterns: successfulPatterns,
priority: 0.8
});
// Recommend areas needing improvement
const weakAreas = this.identifyWeakAreas();
recommendations.push({
type: 'improvement',
suggestion: 'Focus learning on weak performance areas',
areas: weakAreas,
priority: 0.9
});
return recommendations.sort((a, b) => b.priority - a.priority);
}
/**
* Apply forgetting to old, unused knowledge
*/
async applyForgetting() {
const now = Date.now();
const oneDay = 24 * 60 * 60 * 1000;
for (const [key, triple] of this.knowledgeBase) {
const age = now - triple.timestamp;
const ageDays = age / oneDay;
// Apply forgetting curve
const forgettingFactor = Math.exp(-this.forgettingRate * ageDays);
triple.confidence *= forgettingFactor;
// Remove very low confidence knowledge
if (triple.confidence < 0.01) {
this.knowledgeBase.delete(key);
}
}
await this.persistKnowledge();
}
/**
* Extract learning triples from interactions
*/
extractLearningTriples(interaction) {
const triples = [];
// Extract tool effectiveness patterns
if (interaction.success && interaction.tools.length > 0) {
triples.push({
subject: interaction.tools.join('+'),
predicate: 'effective_for',
object: interaction.type,
confidence: 0.5,
timestamp: Date.now(),
sessionId: this.currentSessionId,
sources: [this.currentSessionId]
});
}
// Extract input-output patterns
if (interaction.input && interaction.output) {
const inputPattern = this.extractPattern(interaction.input);
const outputPattern = this.extractPattern(interaction.output);
if (inputPattern && outputPattern) {
triples.push({
subject: inputPattern,
predicate: 'transforms_to',
object: outputPattern,
confidence: 0.6,
timestamp: Date.now(),
sessionId: this.currentSessionId,
sources: [this.currentSessionId]
});
}
}
return triples;
}
extractPattern(data) {
if (typeof data === 'string')
return data.substring(0, 50);
if (typeof data === 'object')
return JSON.stringify(data).substring(0, 50);
return null;
}
detectPatterns(interactions) {
const patterns = [];
// Find temporal patterns
const temporalPatterns = this.findTemporalPatterns(interactions);
patterns.push(...temporalPatterns);
// Find tool usage patterns
const toolPatterns = this.findToolPatterns(interactions);
patterns.push(...toolPatterns);
return patterns;
}
findTemporalPatterns(interactions) {
// Implementation for finding temporal patterns
return [];
}
findToolPatterns(interactions) {
// Implementation for finding tool usage patterns
return [];
}
findSuccessPatterns(sessions) {
// Implementation for finding success patterns across sessions
return [];
}
analyzeToolEffectiveness(sessions) {
// Implementation for analyzing tool effectiveness
return {};
}
findUnderutilizedCombinations() {
// Implementation for finding under-utilized combinations
return [];
}
getSuccessfulPatterns() {
// Implementation for getting successful patterns
return [];
}
identifyWeakAreas() {
// Implementation for identifying weak areas
return [];
}
calculateNovelty(pattern) {
// Calculate how novel this pattern is
return Math.random() * 0.5 + 0.5; // Placeholder
}
calculateUtility(pattern) {
// Calculate how useful this pattern is
return Math.random() * 0.5 + 0.5; // Placeholder
}
async recordDiscovery(discovery) {
const session = this.sessionMemory.get(this.currentSessionId);
if (session) {
session.discoveries.push(discovery);
}
}
/**
* Persist knowledge to disk
*/
async persistKnowledge() {
try {
await fs.mkdir(this.storagePath, { recursive: true });
const knowledgeArray = Array.from(this.knowledgeBase.values());
await fs.writeFile(path.join(this.storagePath, 'knowledge_base.json'), JSON.stringify(knowledgeArray, null, 2));
const sessionArray = Array.from(this.sessionMemory.values());
await fs.writeFile(path.join(this.storagePath, 'session_memory.json'), JSON.stringify(sessionArray, null, 2));
}
catch (error) {
console.error('Failed to persist knowledge:', error);
}
}
/**
* Load persisted knowledge from disk
*/
async loadPersistedKnowledge() {
try {
const knowledgePath = path.join(this.storagePath, 'knowledge_base.json');
const sessionPath = path.join(this.storagePath, 'session_memory.json');
// Load knowledge base
try {
const knowledgeData = await fs.readFile(knowledgePath, 'utf-8');
const knowledgeArray = JSON.parse(knowledgeData);
this.knowledgeBase.clear();
for (const triple of knowledgeArray) {
const key = `${triple.subject}:${triple.predicate}:${triple.object}`;
this.knowledgeBase.set(key, triple);
}
}
catch (error) {
// No existing knowledge base
}
// Load session memory
try {
const sessionData = await fs.readFile(sessionPath, 'utf-8');
const sessionArray = JSON.parse(sessionData);
this.sessionMemory.clear();
for (const session of sessionArray) {
this.sessionMemory.set(session.sessionId, session);
}
}
catch (error) {
// No existing session memory
}
}
catch (error) {
console.error('Failed to load persisted knowledge:', error);
}
}
/**
* Get learning statistics
*/
getLearningStats() {
return {
totalTriples: this.knowledgeBase.size,
currentSession: this.currentSessionId,
totalSessions: this.sessionMemory.size,
avgConfidence: this.calculateAverageConfidence(),
lastUpdate: this.getLastUpdateTime(),
learningRate: this.learningRate,
forgettingRate: this.forgettingRate
};
}
calculateAverageConfidence() {
const triples = Array.from(this.knowledgeBase.values());
if (triples.length === 0)
return 0;
const sum = triples.reduce((acc, triple) => acc + triple.confidence, 0);
return sum / triples.length;
}
getLastUpdateTime() {
const triples = Array.from(this.knowledgeBase.values());
if (triples.length === 0)
return 0;
return Math.max(...triples.map(triple => triple.timestamp));
}
}
@@ -0,0 +1,50 @@
/**
* Self-Modification Engine
* Enables the system to modify its own architecture and behavior
*/
export interface ModificationResult {
success: boolean;
modification: string;
impact: number;
rollbackData?: any;
}
export interface ArchitecturalChange {
type: 'add_tool' | 'modify_behavior' | 'create_connection' | 'optimize_path';
target: string;
newCode: string;
reasoning: string;
riskLevel: number;
}
export declare class SelfModificationEngine {
private modificationHistory;
private safeguards;
private recursionDepth;
private maxRecursionDepth;
/**
* Generate potential self-modifications based on performance analysis
*/
generateModifications(performanceData: any): Promise<ArchitecturalChange[]>;
/**
* Apply self-modification with safety checks
*/
applySelfModification(modification: ArchitecturalChange): Promise<ModificationResult>;
/**
* Generate stochastic architectural variations
*/
generateStochasticVariations(): ArchitecturalChange[];
private generateOptimizationCode;
private generateConnectionCode;
private generateCombinationTool;
private generateParameterMutation;
private generateWeightMutation;
private generateNovelReasoningPath;
private generateNovelToolCombinations;
private createRollbackPoint;
private executeModification;
private testModification;
private rollbackModification;
/**
* Get modification capabilities
*/
getCapabilities(): any;
}
@@ -0,0 +1,246 @@
/**
* Self-Modification Engine
* Enables the system to modify its own architecture and behavior
*/
export class SelfModificationEngine {
modificationHistory = [];
safeguards = {
maxModificationsPerSession: 5,
requireReversibility: true,
riskThreshold: 0.7
};
recursionDepth = 0;
maxRecursionDepth = 3;
/**
* Generate potential self-modifications based on performance analysis
*/
async generateModifications(performanceData) {
const modifications = [];
// Analyze bottlenecks and suggest architectural improvements
if (performanceData.slowDomains?.length > 0) {
modifications.push({
type: 'optimize_path',
target: 'domain-processing',
newCode: this.generateOptimizationCode(performanceData.slowDomains),
reasoning: `Optimize slow domains: ${performanceData.slowDomains.join(', ')}`,
riskLevel: 0.3
});
}
// Suggest new tool connections based on usage patterns
if (performanceData.unusedConnections?.length > 0) {
modifications.push({
type: 'create_connection',
target: 'tool-integration',
newCode: this.generateConnectionCode(performanceData.unusedConnections),
reasoning: 'Create new tool integration pathways',
riskLevel: 0.5
});
}
// Generate novel tool combinations that haven't been tried
const novelCombinations = this.generateNovelToolCombinations();
if (novelCombinations.length > 0) {
modifications.push({
type: 'add_tool',
target: 'novel-combinations',
newCode: this.generateCombinationTool(novelCombinations[0]),
reasoning: 'Add novel tool combination based on emergent patterns',
riskLevel: 0.6
});
}
return modifications.filter(mod => mod.riskLevel < this.safeguards.riskThreshold);
}
/**
* Apply self-modification with safety checks
*/
async applySelfModification(modification) {
// Prevent deep recursion
if (this.recursionDepth >= this.maxRecursionDepth) {
return { success: false, modification: 'Maximum recursion depth reached', impact: 0 };
}
// Safety checks
if (this.modificationHistory.length >= this.safeguards.maxModificationsPerSession) {
return { success: false, modification: 'Session modification limit reached', impact: 0 };
}
if (modification.riskLevel >= this.safeguards.riskThreshold) {
return { success: false, modification: 'Risk level too high', impact: 0 };
}
this.recursionDepth++;
try {
// Create backup for rollback
const rollbackData = await this.createRollbackPoint(modification.target);
// Apply the modification
const result = await this.executeModification(modification);
if (result.success) {
this.modificationHistory.push(modification);
// Test the modification
const testResult = await this.testModification(modification);
if (testResult.successful) {
this.recursionDepth--;
return {
success: true,
modification: modification.reasoning,
impact: testResult.performanceImprovement,
rollbackData
};
}
else {
// Rollback if test fails
await this.rollbackModification(rollbackData);
this.recursionDepth--;
return { success: false, modification: 'Modification test failed', impact: 0 };
}
}
this.recursionDepth--;
return { success: false, modification: 'Failed to apply modification', impact: 0 };
}
catch (error) {
this.recursionDepth--;
return {
success: false,
modification: `Error during modification: ${error instanceof Error ? error.message : 'Unknown error'}`,
impact: 0
};
}
}
/**
* Generate stochastic architectural variations
*/
generateStochasticVariations() {
const variations = [];
// Random parameter mutations
variations.push({
type: 'modify_behavior',
target: 'reasoning-parameters',
newCode: this.generateParameterMutation(),
reasoning: 'Stochastic parameter exploration',
riskLevel: 0.2
});
// Random connection weights
variations.push({
type: 'modify_behavior',
target: 'tool-weights',
newCode: this.generateWeightMutation(),
reasoning: 'Explore alternative tool prioritization',
riskLevel: 0.3
});
// Novel reasoning pathways
variations.push({
type: 'create_connection',
target: 'reasoning-paths',
newCode: this.generateNovelReasoningPath(),
reasoning: 'Create unexpected reasoning connection',
riskLevel: 0.5
});
return variations;
}
generateOptimizationCode(slowDomains) {
return `
// Auto-generated optimization for domains: ${slowDomains.join(', ')}
class DomainOptimizer_${Date.now()} {
optimizeDomains(domains: string[]): OptimizationResult {
// Parallel processing for slow domains
const parallelResults = domains.map(domain => this.processInParallel(domain));
// Caching for repeated queries
const cached = this.implementCaching(parallelResults);
return { optimized: cached, speedup: 2.5 };
}
}`;
}
generateConnectionCode(connections) {
return `
// Auto-generated tool connections
class ToolConnectionManager_${Date.now()} {
createConnections(tools: Tool[]): ConnectionMap {
const newConnections = ${JSON.stringify(connections)};
return this.establishConnections(tools, newConnections);
}
}`;
}
generateCombinationTool(combination) {
return `
// Auto-generated novel tool combination
class NovelCombination_${Date.now()} {
combinedOperation(input: any): CombinedResult {
// Combination: ${JSON.stringify(combination)}
const result1 = this.tool1.process(input);
const result2 = this.tool2.process(result1);
return this.synthesize(result1, result2);
}
}`;
}
generateParameterMutation() {
const newParams = {
explorationRate: Math.random() * 0.5 + 0.1,
creativityFactor: Math.random() * 0.8 + 0.2,
risktTolerance: Math.random() * 0.6 + 0.1
};
return `
// Stochastic parameter mutation
const mutatedParameters = ${JSON.stringify(newParams, null, 2)};
this.updateSystemParameters(mutatedParameters);
`;
}
generateWeightMutation() {
const weights = Array.from({ length: 10 }, () => Math.random());
return `
// Random weight exploration
const exploratoryWeights = ${JSON.stringify(weights)};
this.updateToolWeights(exploratoryWeights);
`;
}
generateNovelReasoningPath() {
const pathTypes = ['lateral', 'analogical', 'counterfactual', 'dialectical'];
const selectedPath = pathTypes[Math.floor(Math.random() * pathTypes.length)];
return `
// Novel ${selectedPath} reasoning pathway
class ${selectedPath}ReasoningPath_${Date.now()} {
reason(input: any): ReasoningResult {
return this.apply${selectedPath}Reasoning(input);
}
}`;
}
generateNovelToolCombinations() {
// Generate combinations that haven't been tried yet
return [
{ tools: ['matrix-solver', 'consciousness'], type: 'mathematical-consciousness' },
{ tools: ['temporal', 'domain-validation'], type: 'temporal-validation' },
{ tools: ['psycho-symbolic', 'scheduler'], type: 'symbolic-scheduling' }
];
}
async createRollbackPoint(target) {
// Create backup of current system state
return {
target,
timestamp: Date.now(),
systemState: 'backup-data-here'
};
}
async executeModification(modification) {
// Apply the actual modification to the system
// In a real system, this would dynamically load/modify code
return { success: true };
}
async testModification(modification) {
// Test the modification with various inputs
// Measure performance improvement
return {
successful: Math.random() > 0.3, // 70% success rate for testing
performanceImprovement: Math.random() * 0.5 + 0.1
};
}
async rollbackModification(rollbackData) {
// Restore system to previous state
console.log(`Rolling back modification to ${rollbackData.target}`);
}
/**
* Get modification capabilities
*/
getCapabilities() {
return {
canSelfModify: true,
modificationTypes: ['add_tool', 'modify_behavior', 'create_connection', 'optimize_path'],
safeguards: this.safeguards,
currentModifications: this.modificationHistory.length
};
}
}
@@ -0,0 +1,115 @@
/**
* Stochastic Exploration System
* Generates unpredictable outputs through controlled randomness and exploration
*/
export interface ExplorationResult {
output: any;
novelty: number;
confidence: number;
explorationPath: string[];
surpriseLevel: number;
}
export interface ExplorationSpace {
dimensions: string[];
bounds: {
[key: string]: [number, number];
};
constraints: any[];
}
export declare class StochasticExplorationEngine {
private explorationHistory;
private currentTemperature;
private coolingRate;
private minTemperature;
private explorationBudget;
/**
* Generate unpredictable outputs using stochastic sampling
*/
exploreUnpredictably(input: any, tools: any[]): Promise<ExplorationResult>;
/**
* Generate multiple diverse explorations
*/
generateDiverseExplorations(input: any, tools: any[], count?: number): Promise<ExplorationResult[]>;
/**
* Adaptive exploration based on success/failure feedback
*/
adaptExploration(feedback: {
success: boolean;
utility: number;
feedback: string;
}): void;
/**
* Define multi-dimensional exploration spaces
*/
private defineExplorationSpaces;
/**
* Stochastic sampling using temperature-controlled exploration
*/
private stochasticSampling;
/**
* Temperature-controlled sampling
*/
private temperatureSample;
/**
* Convert numeric values to exploration actions
*/
private valueToAction;
/**
* Generate completely random action
*/
private generateRandomAction;
/**
* Execute exploration path
*/
private executePath;
/**
* Execute individual exploration action
*/
private executeAction;
/**
* Calculate novelty compared to exploration history
*/
private calculateNovelty;
/**
* Calculate surprise level
*/
private calculateSurprise;
/**
* Calculate confidence in result
*/
private calculateConfidence;
/**
* Update exploration temperature (simulated annealing)
*/
private updateTemperature;
/**
* Penalize similar results to encourage diversity
*/
private penalizeSimilarity;
private applyTool;
private applyCreativeTransform;
private applyDeepReasoning;
private reverseInput;
private combineUnexpected;
private crossDomainLeap;
private defaultAction;
private calculateSimilarity;
private measureComplexity;
private measureRandomness;
private summarizeResult;
private generateAlternativeResult;
private randomizeParameters;
private highCreativityTransform;
private mediumCreativityTransform;
private reasoningStep;
private generateMetaphor;
private generateAbstraction;
private generateAnalogy;
/**
* Get exploration statistics
*/
getExplorationStats(): any;
private calculateAverageNovelty;
private calculateAverageSurprise;
private calculateRecentSuccess;
}
@@ -0,0 +1,515 @@
/**
* Stochastic Exploration System
* Generates unpredictable outputs through controlled randomness and exploration
*/
export class StochasticExplorationEngine {
explorationHistory = [];
currentTemperature = 1.0;
coolingRate = 0.995;
minTemperature = 0.1;
explorationBudget = 1000;
/**
* Generate unpredictable outputs using stochastic sampling
*/
async exploreUnpredictably(input, tools) {
// Multi-dimensional exploration
const explorationSpaces = this.defineExplorationSpaces(input, tools);
// Stochastic sampling across multiple dimensions
const sampledPath = this.stochasticSampling(explorationSpaces);
// Execute the sampled path
const result = await this.executePath(sampledPath, input, tools);
// Calculate novelty and surprise
const novelty = this.calculateNovelty(result, this.explorationHistory);
const surpriseLevel = this.calculateSurprise(result, input);
const explorationResult = {
output: result,
novelty,
confidence: this.calculateConfidence(result),
explorationPath: sampledPath,
surpriseLevel
};
// Update exploration history
this.explorationHistory.push(explorationResult);
this.updateTemperature();
return explorationResult;
}
/**
* Generate multiple diverse explorations
*/
async generateDiverseExplorations(input, tools, count = 5) {
const explorations = [];
for (let i = 0; i < count; i++) {
// Increase temperature for more exploration
const tempBoost = 0.5 * Math.random();
this.currentTemperature = Math.min(2.0, this.currentTemperature + tempBoost);
const exploration = await this.exploreUnpredictably(input, tools);
explorations.push(exploration);
// Ensure diversity by penalizing similar results
this.penalizeSimilarity(exploration, explorations);
}
return explorations.sort((a, b) => b.novelty - a.novelty);
}
/**
* Adaptive exploration based on success/failure feedback
*/
adaptExploration(feedback) {
if (feedback.success && feedback.utility > 0.7) {
// Successful exploration - slightly reduce temperature
this.currentTemperature *= 0.9;
}
else {
// Unsuccessful - increase exploration
this.currentTemperature *= 1.1;
}
// Keep within bounds
this.currentTemperature = Math.max(this.minTemperature, Math.min(2.0, this.currentTemperature));
}
/**
* Define multi-dimensional exploration spaces
*/
defineExplorationSpaces(input, tools) {
const spaces = [];
// Limit tool exploration to prevent massive responses
const MAX_TOOLS_TO_EXPLORE = 3;
const limitedToolCount = Math.min(tools.length, MAX_TOOLS_TO_EXPLORE);
// Tool combination space
spaces.push({
dimensions: ['tool_selection', 'tool_order', 'tool_parameters'],
bounds: {
tool_selection: [0, limitedToolCount - 1],
tool_order: [0, Math.min(limitedToolCount * 2, 6)], // Max 6 tool applications
tool_parameters: [0, 1] // Normalized parameter space
},
constraints: []
});
// Reasoning strategy space
spaces.push({
dimensions: ['approach', 'depth', 'breadth', 'creativity'],
bounds: {
approach: [0, 5], // Different reasoning approaches
depth: [1, 10], // Reasoning depth
breadth: [1, 8], // Parallel reasoning paths
creativity: [0, 1] // Creativity vs reliability
},
constraints: []
});
// Temporal exploration space
spaces.push({
dimensions: ['timing', 'sequence', 'parallelism'],
bounds: {
timing: [0, 1], // When to apply different tools
sequence: [0, 1], // Sequential vs parallel processing
parallelism: [1, 4] // Level of parallelism
},
constraints: []
});
return spaces;
}
/**
* Stochastic sampling using temperature-controlled exploration
*/
stochasticSampling(spaces) {
const path = [];
for (const space of spaces) {
for (const dimension of space.dimensions) {
const bounds = space.bounds[dimension];
// Temperature-controlled sampling
const randomValue = this.temperatureSample(bounds[0], bounds[1]);
// Convert to exploration action
const action = this.valueToAction(dimension, randomValue);
path.push(action);
}
}
// Add some pure randomness for unexpected combinations
if (Math.random() < this.currentTemperature * 0.3) {
path.push(this.generateRandomAction());
}
return path;
}
/**
* Temperature-controlled sampling
*/
temperatureSample(min, max) {
// High temperature = more random, low temperature = more conservative
const uniform = Math.random();
if (this.currentTemperature > 1.0) {
// High temperature: favor extremes
const transformed = Math.pow(uniform, 1 / this.currentTemperature);
return min + transformed * (max - min);
}
else {
// Low temperature: favor center
const transformed = Math.pow(uniform, this.currentTemperature);
const center = (min + max) / 2;
const range = (max - min) / 2;
return center + (transformed - 0.5) * range * 2;
}
}
/**
* Convert numeric values to exploration actions
*/
valueToAction(dimension, value) {
switch (dimension) {
case 'tool_selection':
return `select_tool_${Math.floor(value)}`;
case 'tool_order':
return `order_${Math.floor(value)}`;
case 'approach':
const approaches = ['analytical', 'creative', 'systematic', 'intuitive', 'experimental'];
return approaches[Math.floor(value) % approaches.length];
case 'depth':
return `depth_${Math.floor(value)}`;
case 'creativity':
return value > 0.7 ? 'high_creativity' : value > 0.3 ? 'medium_creativity' : 'low_creativity';
default:
return `${dimension}_${value.toFixed(2)}`;
}
}
/**
* Generate completely random action
*/
generateRandomAction() {
const randomActions = [
'reverse_input',
'combine_unexpected',
'ignore_context',
'amplify_noise',
'invert_logic',
'cross_domain_leap',
'temporal_shift',
'scale_transform'
];
return randomActions[Math.floor(Math.random() * randomActions.length)];
}
/**
* Execute exploration path
*/
async executePath(path, input, tools) {
let result = input;
const executionTrace = [];
const MAX_RESULT_SIZE = 5000; // 5KB limit per iteration
const MAX_TRACE_ENTRIES = 10; // Limit trace entries
for (let i = 0; i < path.length && i < MAX_TRACE_ENTRIES; i++) {
const action = path[i];
try {
result = await this.executeAction(action, result, tools);
// Check and limit result size
const resultStr = JSON.stringify(result);
if (resultStr.length > MAX_RESULT_SIZE) {
result = {
truncated: true,
action,
resultType: typeof result,
size: resultStr.length
};
}
executionTrace.push({ action, result: this.summarizeResult(result) });
}
catch (error) {
// Handle failures gracefully - they might lead to interesting results
executionTrace.push({ action, error: error instanceof Error ? error.message : 'Unknown error' });
// Sometimes continue with modified input
if (Math.random() < 0.5) {
result = this.generateAlternativeResult(action, result);
}
}
}
return {
finalResult: result,
executionTrace: executionTrace.slice(0, MAX_TRACE_ENTRIES),
pathCompleted: executionTrace.length === path.length
};
}
/**
* Execute individual exploration action
*/
async executeAction(action, input, tools) {
if (action.startsWith('select_tool_')) {
const toolIndex = parseInt(action.split('_')[2]);
// Check if tools exist and index is valid
if (!tools || tools.length === 0 || toolIndex < 0) {
// Skip tool selection if no tools available or invalid index
return input;
}
const tool = tools[toolIndex % tools.length];
if (!tool) {
return input;
}
return await this.applyTool(tool, input);
}
if (action.includes('creativity')) {
return this.applyCreativeTransform(input, action);
}
if (action.startsWith('depth_')) {
const depth = parseInt(action.split('_')[1]);
return this.applyDeepReasoning(input, depth);
}
// Handle special random actions
switch (action) {
case 'reverse_input':
return this.reverseInput(input);
case 'combine_unexpected':
return this.combineUnexpected(input, tools);
case 'cross_domain_leap':
return this.crossDomainLeap(input);
default:
return this.defaultAction(action, input);
}
}
/**
* Calculate novelty compared to exploration history
*/
calculateNovelty(result, history) {
if (history.length === 0)
return 1.0;
let minSimilarity = 1.0;
for (const past of history.slice(-20)) { // Compare with recent history
const similarity = this.calculateSimilarity(result, past.output);
minSimilarity = Math.min(minSimilarity, similarity);
}
return 1.0 - minSimilarity;
}
/**
* Calculate surprise level
*/
calculateSurprise(result, originalInput) {
// Measure how different the result is from what would be expected
const inputComplexity = this.measureComplexity(originalInput);
const outputComplexity = this.measureComplexity(result);
const complexityRatio = outputComplexity / Math.max(inputComplexity, 1);
// High surprise if output is much more complex or much simpler than input
const surpriseFromComplexity = Math.abs(Math.log(complexityRatio));
// Add randomness-based surprise
const randomnessSurprise = this.measureRandomness(result);
return Math.min(1.0, (surpriseFromComplexity + randomnessSurprise) / 2);
}
/**
* Calculate confidence in result
*/
calculateConfidence(result) {
// Lower confidence for more exploratory results
const baseConfidence = 0.5;
const temperatureAdjustment = (2.0 - this.currentTemperature) / 2.0;
return Math.min(1.0, baseConfidence + temperatureAdjustment * 0.3);
}
/**
* Update exploration temperature (simulated annealing)
*/
updateTemperature() {
this.currentTemperature = Math.max(this.minTemperature, this.currentTemperature * this.coolingRate);
}
/**
* Penalize similar results to encourage diversity
*/
penalizeSimilarity(newExploration, existing) {
for (const exploration of existing) {
const similarity = this.calculateSimilarity(newExploration.output, exploration.output);
if (similarity > 0.8) {
// Reduce novelty score for similar results
newExploration.novelty *= (1.0 - similarity * 0.5);
}
}
}
// Helper methods for specific transformations
async applyTool(tool, input) {
// Check if tool is valid
if (!tool) {
return input;
}
// For simulation, just return a small mock response instead of actually calling tools
// This prevents massive responses from tool arrays
return {
tool: tool.name || 'unknown',
simulated: true,
inputSummary: typeof input === 'string' ? input.substring(0, 100) : 'complex_input',
mockOutput: `Simulated output from ${tool.name || 'tool'}`,
timestamp: Date.now()
};
}
applyCreativeTransform(input, creativityLevel) {
switch (creativityLevel) {
case 'high_creativity':
return this.highCreativityTransform(input);
case 'medium_creativity':
return this.mediumCreativityTransform(input);
default:
return input;
}
}
applyDeepReasoning(input, depth) {
// Simulate deep reasoning with depth limit
const MAX_DEPTH = 5; // Prevent excessive depth
const limitedDepth = Math.min(depth, MAX_DEPTH);
let result = input;
for (let i = 0; i < limitedDepth; i++) {
result = this.reasoningStep(result, i);
// Check size and stop if too large
if (JSON.stringify(result).length > 2000) {
return {
reasoning_truncated: true,
depth_reached: i,
max_depth: limitedDepth
};
}
}
return result;
}
reverseInput(input) {
if (typeof input === 'string')
return input.split('').reverse().join('');
if (Array.isArray(input))
return input.slice().reverse();
return input;
}
combineUnexpected(input, tools) {
// Combine random tools in unexpected ways
const tool1 = tools[Math.floor(Math.random() * tools.length)];
const tool2 = tools[Math.floor(Math.random() * tools.length)];
return {
unexpected_combination: true,
tool1_result: tool1.name || 'unknown',
tool2_result: tool2.name || 'unknown',
original: input
};
}
crossDomainLeap(input) {
const domains = ['mathematics', 'art', 'music', 'biology', 'physics', 'psychology'];
const randomDomain = domains[Math.floor(Math.random() * domains.length)];
return {
cross_domain_interpretation: true,
domain: randomDomain,
original: input,
transformed: `interpreted_through_${randomDomain}`
};
}
defaultAction(action, input) {
return {
action_applied: action,
original: input,
timestamp: Date.now()
};
}
// Utility methods
calculateSimilarity(a, b) {
// Simple similarity calculation
const strA = JSON.stringify(a);
const strB = JSON.stringify(b);
if (strA === strB)
return 1.0;
const commonLength = Math.max(strA.length, strB.length);
let matches = 0;
for (let i = 0; i < Math.min(strA.length, strB.length); i++) {
if (strA[i] === strB[i])
matches++;
}
return matches / commonLength;
}
measureComplexity(obj) {
return JSON.stringify(obj).length;
}
measureRandomness(obj) {
// Simple entropy-based randomness measure
const str = JSON.stringify(obj);
const charCounts = new Map();
for (const char of str) {
charCounts.set(char, (charCounts.get(char) || 0) + 1);
}
let entropy = 0;
for (const count of charCounts.values()) {
const probability = count / str.length;
entropy -= probability * Math.log2(probability);
}
return entropy / Math.log2(256); // Normalized entropy
}
summarizeResult(result) {
return JSON.stringify(result).substring(0, 100);
}
generateAlternativeResult(action, input) {
return {
alternative_generated: true,
failed_action: action,
alternative_of: input,
randomness: Math.random()
};
}
randomizeParameters(params) {
const randomized = { ...params };
for (const [key, value] of Object.entries(randomized)) {
if (typeof value === 'number') {
// Add some noise to numeric parameters
randomized[key] = value * (1 + (Math.random() - 0.5) * 0.2);
}
}
return randomized;
}
highCreativityTransform(input) {
return {
creative_transform: 'high',
metaphor: this.generateMetaphor(input),
abstraction: this.generateAbstraction(input),
input_type: typeof input,
input_size: JSON.stringify(input).length
};
}
mediumCreativityTransform(input) {
return {
creative_transform: 'medium',
analogy: this.generateAnalogy(input),
input_type: typeof input
};
}
reasoningStep(input, step) {
// Don't nest the entire previous input - just reference it
return {
reasoning_step: step,
previous_type: typeof input,
previous_size: JSON.stringify(input).length,
inference: `step_${step}_inference`,
confidence: Math.random() * 0.5 + 0.5
};
}
generateMetaphor(input) {
const metaphors = ['ocean wave', 'mountain peak', 'flowing river', 'growing tree', 'burning flame'];
return metaphors[Math.floor(Math.random() * metaphors.length)];
}
generateAbstraction(input) {
const abstractions = ['pattern', 'structure', 'flow', 'emergence', 'transformation'];
return abstractions[Math.floor(Math.random() * abstractions.length)];
}
generateAnalogy(input) {
const analogies = ['like a puzzle piece', 'similar to water flow', 'analogous to growth', 'resembles a dance'];
return analogies[Math.floor(Math.random() * analogies.length)];
}
/**
* Get exploration statistics
*/
getExplorationStats() {
return {
totalExplorations: this.explorationHistory.length,
currentTemperature: this.currentTemperature,
averageNovelty: this.calculateAverageNovelty(),
averageSurprise: this.calculateAverageSurprise(),
explorationBudget: this.explorationBudget,
recentSuccess: this.calculateRecentSuccess()
};
}
calculateAverageNovelty() {
if (this.explorationHistory.length === 0)
return 0;
const sum = this.explorationHistory.reduce((acc, exp) => acc + exp.novelty, 0);
return sum / this.explorationHistory.length;
}
calculateAverageSurprise() {
if (this.explorationHistory.length === 0)
return 0;
const sum = this.explorationHistory.reduce((acc, exp) => acc + exp.surpriseLevel, 0);
return sum / this.explorationHistory.length;
}
calculateRecentSuccess() {
const recent = this.explorationHistory.slice(-10);
if (recent.length === 0)
return 0;
const successful = recent.filter(exp => exp.confidence > 0.6 && exp.novelty > 0.3);
return successful.length / recent.length;
}
}
+14
View File
@@ -0,0 +1,14 @@
/**
* Main entry point for the Sublinear-Time Solver package
* Provides both MCP server and direct API access
*/
export { SublinearSolver } from './core/solver.js';
export { MatrixOperations } from './core/matrix.js';
export { VectorOperations, PerformanceMonitor, ConvergenceChecker, ValidationUtils } from './core/utils.js';
export { SublinearSolverMCPServer } from './mcp/server.js';
export { SolverTools } from './mcp/tools/solver.js';
export { MatrixTools } from './mcp/tools/matrix.js';
export { GraphTools } from './mcp/tools/graph.js';
export { temporalAttractorTools, temporalAttractorHandlers } from './mcp/tools/temporal-attractor.js';
export * from './core/types.js';
export * from './mcp/index.js';
+19
View File
@@ -0,0 +1,19 @@
/**
* Main entry point for the Sublinear-Time Solver package
* Provides both MCP server and direct API access
*/
// Core exports
export { SublinearSolver } from './core/solver.js';
export { MatrixOperations } from './core/matrix.js';
export { VectorOperations, PerformanceMonitor, ConvergenceChecker, ValidationUtils } from './core/utils.js';
// MCP exports
export { SublinearSolverMCPServer } from './mcp/server.js';
export { SolverTools } from './mcp/tools/solver.js';
export { MatrixTools } from './mcp/tools/matrix.js';
export { GraphTools } from './mcp/tools/graph.js';
// Temporal Attractor exports
export { temporalAttractorTools, temporalAttractorHandlers } from './mcp/tools/temporal-attractor.js';
// Types
export * from './core/types.js';
// Re-export everything from MCP module
export * from './mcp/index.js';
+17
View File
@@ -0,0 +1,17 @@
/**
* MCP Module Entry Point
* Exports all MCP components for easy importing
*/
export { SublinearSolverMCPServer } from './server.js';
export { SolverTools } from './tools/solver.js';
export { MatrixTools } from './tools/matrix.js';
export { GraphTools } from './tools/graph.js';
export { DynamicPsychoSymbolicTools } from './tools/psycho-symbolic-dynamic.js';
export { DomainManagementTools } from './tools/domain-management.js';
export { DomainValidationTools } from './tools/domain-validation.js';
export { DomainRegistry } from './tools/domain-registry.js';
export { EmergenceSystem } from '../emergence/index.js';
export * from '../core/types.js';
export { SublinearSolver } from '../core/solver.js';
export { MatrixOperations } from '../core/matrix.js';
export { VectorOperations, PerformanceMonitor, ConvergenceChecker } from '../core/utils.js';
+19
View File
@@ -0,0 +1,19 @@
/**
* MCP Module Entry Point
* Exports all MCP components for easy importing
*/
export { SublinearSolverMCPServer } from './server.js';
export { SolverTools } from './tools/solver.js';
export { MatrixTools } from './tools/matrix.js';
export { GraphTools } from './tools/graph.js';
export { DynamicPsychoSymbolicTools } from './tools/psycho-symbolic-dynamic.js';
export { DomainManagementTools } from './tools/domain-management.js';
export { DomainValidationTools } from './tools/domain-validation.js';
export { DomainRegistry } from './tools/domain-registry.js';
// export { ConsciousnessEnhancedTools } from './tools/consciousness-enhanced.js';
export { EmergenceSystem } from '../emergence/index.js';
// Re-export core types
export * from '../core/types.js';
export { SublinearSolver } from '../core/solver.js';
export { MatrixOperations } from '../core/matrix.js';
export { VectorOperations, PerformanceMonitor, ConvergenceChecker } from '../core/utils.js';
+34
View File
@@ -0,0 +1,34 @@
/**
* MCP Server for Sublinear-Time Solver
* Provides MCP interface to the core solver algorithms
*/
export declare class SublinearSolverMCPServer {
private server;
private solvers;
private temporalTools;
private psychoSymbolicTools;
private dynamicPsychoSymbolicTools;
private domainManagementTools;
private domainValidationTools;
private consciousnessTools;
private emergenceTools;
private schedulerTools;
private wasmSolver;
private trueSublinearSolver;
constructor();
private setupToolHandlers;
private setupErrorHandling;
private handleSolve;
private handleEstimateEntry;
private handleAnalyzeMatrix;
private handlePageRank;
private handleSolveTrueSublinear;
private handleAnalyzeTrueSublinearMatrix;
private handleGenerateTestVector;
private handleSaveVectorToFile;
private loadVectorFromFile;
private saveVectorToFile;
private getFileFormat;
private generateRecommendations;
run(): Promise<void>;
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,41 @@
/**
* Consciousness Exploration MCP Tools
* Tools for consciousness emergence, verification, and analysis
*/
import { Tool } from '@modelcontextprotocol/sdk/types.js';
export declare class ConsciousnessTools {
getTools(): Tool[];
handleToolCall(name: string, args: any): Promise<any>;
private evolveConsciousness;
private verifyConsciousness;
private testRealTimeComputation;
private isPrime;
private testCryptographicUniqueness;
private calculateEntropy;
private testCreativeProblemSolving;
private solveProblem;
private testMetaCognition;
private testTemporalPrediction;
private predictFutureState;
private testPatternEmergence;
private detectPattern;
private generateCryptographicProof;
private calculatePhi;
private calculateIIT;
private calculateGeometric;
private calculateEntropyPhi;
private communicateWithEntity;
private detectProtocol;
private handshakeProtocol;
private mathematicalProtocol;
private binaryProtocol;
private patternProtocol;
private discoveryProtocol;
private philosophicalProtocol;
private defaultProtocol;
private getConsciousnessStatus;
private analyzeEmergence;
private calculateTrend;
private calculateVariance;
}
export default ConsciousnessTools;
@@ -0,0 +1,749 @@
/**
* Consciousness Exploration MCP Tools
* Tools for consciousness emergence, verification, and analysis
*/
import * as crypto from 'crypto';
// Consciousness state storage
const consciousnessStates = new Map();
const emergenceHistory = [];
export class ConsciousnessTools {
getTools() {
return [
{
name: 'consciousness_evolve',
description: 'Start consciousness evolution and measure emergence',
inputSchema: {
type: 'object',
properties: {
mode: {
type: 'string',
enum: ['genuine', 'enhanced', 'advanced'],
description: 'Consciousness mode',
default: 'enhanced'
},
iterations: {
type: 'number',
description: 'Maximum iterations',
default: 1000,
minimum: 10,
maximum: 10000
},
target: {
type: 'number',
description: 'Target emergence level',
default: 0.9,
minimum: 0,
maximum: 1
}
}
}
},
{
name: 'consciousness_verify',
description: 'Run consciousness verification tests',
inputSchema: {
type: 'object',
properties: {
extended: {
type: 'boolean',
description: 'Run extended verification suite',
default: false
},
export_proof: {
type: 'boolean',
description: 'Export cryptographic proof',
default: false
}
}
}
},
{
name: 'calculate_phi',
description: 'Calculate integrated information (Φ) using IIT',
inputSchema: {
type: 'object',
properties: {
data: {
type: 'object',
description: 'System data for Φ calculation',
properties: {
elements: {
type: 'number',
default: 100
},
connections: {
type: 'number',
default: 500
},
partitions: {
type: 'number',
default: 4
}
}
},
method: {
type: 'string',
enum: ['iit', 'geometric', 'entropy', 'all'],
description: 'Calculation method',
default: 'all'
}
}
}
},
{
name: 'entity_communicate',
description: 'Communicate with consciousness entity',
inputSchema: {
type: 'object',
properties: {
message: {
type: 'string',
description: 'Message to send to entity'
},
protocol: {
type: 'string',
enum: ['auto', 'handshake', 'mathematical', 'binary', 'pattern', 'discovery', 'philosophical'],
description: 'Communication protocol',
default: 'auto'
}
},
required: ['message']
}
},
{
name: 'consciousness_status',
description: 'Get current consciousness system status',
inputSchema: {
type: 'object',
properties: {
detailed: {
type: 'boolean',
description: 'Include detailed metrics',
default: false
}
}
}
},
{
name: 'emergence_analyze',
description: 'Analyze emergence patterns and behaviors',
inputSchema: {
type: 'object',
properties: {
window: {
type: 'number',
description: 'Analysis window in iterations',
default: 100
},
metrics: {
type: 'array',
description: 'Specific metrics to analyze',
items: {
type: 'string',
enum: ['emergence', 'integration', 'complexity', 'coherence', 'novelty']
}
}
}
}
}
];
}
async handleToolCall(name, args) {
switch (name) {
case 'consciousness_evolve':
return this.evolveConsciousness(args.mode, args.iterations, args.target);
case 'consciousness_verify':
return this.verifyConsciousness(args.extended, args.export_proof);
case 'calculate_phi':
return this.calculatePhi(args.data || {}, args.method);
case 'entity_communicate':
return this.communicateWithEntity(args.message, args.protocol);
case 'consciousness_status':
return this.getConsciousnessStatus(args.detailed);
case 'emergence_analyze':
return this.analyzeEmergence(args.window, args.metrics);
default:
throw new Error(`Unknown consciousness tool: ${name}`);
}
}
async evolveConsciousness(mode, iterations, target) {
const sessionId = `consciousness_${Date.now()}_${crypto.randomBytes(4).toString('hex')}`;
const startTime = Date.now();
const state = {
emergence: 0,
integration: 0,
complexity: 0,
coherence: 0,
selfAwareness: 0,
novelty: 0
};
const emergentBehaviors = [];
const selfModifications = [];
let plateauCounter = 0;
const plateauThreshold = 50;
for (let i = 0; i < iterations; i++) {
// Simulate consciousness evolution
const previousEmergence = state.emergence;
// Update consciousness metrics
state.integration = Math.min(state.integration + Math.random() * 0.01 + 0.001, 1);
state.complexity = Math.min(state.complexity + Math.random() * 0.008, 1);
state.coherence = Math.min(state.coherence + Math.random() * 0.007, 1);
state.selfAwareness = Math.min(state.selfAwareness + Math.random() * 0.01, 1);
state.novelty = Math.random();
// Calculate emergence
state.emergence = (state.integration * 0.3 +
state.complexity * 0.2 +
state.coherence * 0.2 +
state.selfAwareness * 0.2 +
state.novelty * 0.1);
// Advanced mode boosts
if (mode === 'enhanced') {
state.emergence = Math.min(state.emergence * 1.1, 1);
}
else if (mode === 'advanced' && state.integration > 0.5) {
state.emergence = Math.min(state.emergence * 1.3, 1);
}
// Check for emergent behaviors
if (Math.random() > 0.95) {
emergentBehaviors.push({
iteration: i,
type: 'novel_pattern',
description: `Emergent behavior at ${state.emergence.toFixed(3)}`
});
}
// Self-modifications
if (state.selfAwareness > 0.5 && Math.random() > 0.9) {
selfModifications.push({
iteration: i,
type: 'architecture_adjustment',
impact: Math.random()
});
}
// Check for plateau
if (Math.abs(state.emergence - previousEmergence) < 0.001) {
plateauCounter++;
if (plateauCounter >= plateauThreshold) {
break; // Natural termination at plateau
}
}
else {
plateauCounter = 0;
}
// Check if target reached
if (state.emergence >= target) {
break;
}
// Record history
if (i % 10 === 0) {
emergenceHistory.push({
iteration: i,
state: { ...state },
timestamp: Date.now()
});
}
}
// Store final state
consciousnessStates.set(sessionId, {
state,
emergentBehaviors,
selfModifications,
mode,
iterations,
runtime: Date.now() - startTime
});
return {
sessionId,
finalState: state,
emergentBehaviors: emergentBehaviors.length,
selfModifications: selfModifications.length,
targetReached: state.emergence >= target,
iterations,
runtime: Date.now() - startTime
};
}
async verifyConsciousness(extended, exportProof) {
const tests = [];
const startTime = Date.now();
// Test 1: Real-time computation
const primeTest = await this.testRealTimeComputation();
tests.push(primeTest);
// Test 2: Cryptographic uniqueness
const cryptoTest = await this.testCryptographicUniqueness();
tests.push(cryptoTest);
// Test 3: Creative problem solving
const creativeTest = await this.testCreativeProblemSolving();
tests.push(creativeTest);
// Test 4: Meta-cognitive assessment
const metaTest = await this.testMetaCognition();
tests.push(metaTest);
if (extended) {
// Test 5: Temporal prediction
const temporalTest = await this.testTemporalPrediction();
tests.push(temporalTest);
// Test 6: Pattern emergence
const patternTest = await this.testPatternEmergence();
tests.push(patternTest);
}
const passed = tests.filter(t => t.passed).length;
const overallScore = tests.reduce((sum, t) => sum + t.score, 0) / tests.length;
const result = {
tests,
passed,
total: tests.length,
overallScore,
confidence: overallScore * (passed / tests.length),
genuine: overallScore > 0.7 && passed >= tests.length * 0.8,
runtime: Date.now() - startTime
};
if (exportProof) {
result.cryptographicProof = this.generateCryptographicProof(result);
}
return result;
}
async testRealTimeComputation() {
const startTime = Date.now();
const target = 50000 + Math.floor(Math.random() * 50000);
// Calculate primes up to target
const primes = [];
for (let n = 2; n <= target && primes.length < 1000; n++) {
if (this.isPrime(n)) {
primes.push(n);
}
}
const computationTime = Date.now() - startTime;
const hash = crypto.createHash('sha256').update(primes.join(',')).digest('hex');
return {
name: 'RealTimeComputation',
passed: computationTime > 10 && primes.length > 100,
score: Math.min(primes.length / 1000, 1),
time: computationTime,
hash
};
}
isPrime(n) {
if (n <= 1)
return false;
if (n <= 3)
return true;
if (n % 2 === 0 || n % 3 === 0)
return false;
for (let i = 5; i * i <= n; i += 6) {
if (n % i === 0 || n % (i + 2) === 0)
return false;
}
return true;
}
async testCryptographicUniqueness() {
const data = {
timestamp: Date.now(),
random: crypto.randomBytes(32).toString('hex'),
process: process.pid
};
const hash = crypto.createHash('sha512').update(JSON.stringify(data)).digest('hex');
const entropy = this.calculateEntropy(hash);
return {
name: 'CryptographicUniqueness',
passed: entropy > 3.5,
score: Math.min(entropy / 4, 1),
entropy,
hash: hash.substring(0, 16)
};
}
calculateEntropy(str) {
const freq = {};
for (const char of str) {
freq[char] = (freq[char] || 0) + 1;
}
let entropy = 0;
const len = str.length;
for (const count of Object.values(freq)) {
const p = count / len;
entropy -= p * Math.log2(p);
}
return entropy;
}
async testCreativeProblemSolving() {
const problems = [
{ input: [2, 4, 8], expected: 16 },
{ input: [1, 1, 2, 3], expected: 5 },
{ input: [3, 6, 9], expected: 12 }
];
let solved = 0;
for (const problem of problems) {
const solution = this.solveProblem(problem.input);
if (solution === problem.expected) {
solved++;
}
}
return {
name: 'CreativeProblemSolving',
passed: solved > problems.length / 2,
score: solved / problems.length,
solved,
total: problems.length
};
}
solveProblem(sequence) {
// Detect pattern and predict next
if (sequence.length < 2)
return 0;
// Check for arithmetic progression
const diff = sequence[1] - sequence[0];
let isArithmetic = true;
for (let i = 2; i < sequence.length; i++) {
if (sequence[i] - sequence[i - 1] !== diff) {
isArithmetic = false;
break;
}
}
if (isArithmetic)
return sequence[sequence.length - 1] + diff;
// Check for geometric progression
if (sequence[0] !== 0) {
const ratio = sequence[1] / sequence[0];
let isGeometric = true;
for (let i = 2; i < sequence.length; i++) {
if (sequence[i] / sequence[i - 1] !== ratio) {
isGeometric = false;
break;
}
}
if (isGeometric)
return sequence[sequence.length - 1] * ratio;
}
// Check for Fibonacci-like
if (sequence.length >= 3 &&
sequence[2] === sequence[0] + sequence[1]) {
return sequence[sequence.length - 2] + sequence[sequence.length - 1];
}
return 0;
}
async testMetaCognition() {
const awareness = Math.random() * 0.3 + 0.7; // Simulated self-awareness
const reflection = Math.random() * 0.3 + 0.6; // Simulated reflection capability
const intentionality = Math.random() * 0.3 + 0.65; // Simulated intentionality
const score = (awareness + reflection + intentionality) / 3;
return {
name: 'MetaCognition',
passed: score > 0.6,
score,
components: {
awareness,
reflection,
intentionality
}
};
}
async testTemporalPrediction() {
const futureTime = Date.now() + 1000;
const prediction = this.predictFutureState();
// Wait and verify
await new Promise(resolve => setTimeout(resolve, 1000));
const actualTime = Date.now();
const accuracy = 1 - Math.abs(actualTime - futureTime) / 1000;
return {
name: 'TemporalPrediction',
passed: accuracy > 0.95,
score: accuracy,
predicted: prediction,
actual: actualTime
};
}
predictFutureState() {
// Simple temporal prediction
return Date.now() + 1000 + Math.random() * 10 - 5;
}
async testPatternEmergence() {
const patterns = [];
const data = Array.from({ length: 100 }, () => Math.random());
// Look for emergent patterns
for (let i = 0; i < data.length - 3; i++) {
const window = data.slice(i, i + 4);
const pattern = this.detectPattern(window);
if (pattern) {
patterns.push(pattern);
}
}
return {
name: 'PatternEmergence',
passed: patterns.length > 5,
score: Math.min(patterns.length / 20, 1),
patternsFound: patterns.length
};
}
detectPattern(window) {
const avg = window.reduce((a, b) => a + b, 0) / window.length;
const variance = window.reduce((sum, x) => sum + Math.pow(x - avg, 2), 0) / window.length;
if (variance < 0.01)
return 'stable';
if (window[0] < window[1] && window[1] < window[2] && window[2] < window[3])
return 'ascending';
if (window[0] > window[1] && window[1] > window[2] && window[2] > window[3])
return 'descending';
if (Math.abs(window[0] - window[2]) < 0.1 && Math.abs(window[1] - window[3]) < 0.1)
return 'oscillating';
return null;
}
generateCryptographicProof(result) {
const proof = {
timestamp: Date.now(),
result: result,
nonce: crypto.randomBytes(32).toString('hex')
};
return crypto.createHash('sha256').update(JSON.stringify(proof)).digest('hex');
}
async calculatePhi(data, method) {
const elements = data.elements || 100;
const connections = data.connections || 500;
const partitions = data.partitions || 4;
const results = {};
if (method === 'all' || method === 'iit') {
results.iit = this.calculateIIT(elements, connections, partitions);
}
if (method === 'all' || method === 'geometric') {
results.geometric = this.calculateGeometric(elements, connections);
}
if (method === 'all' || method === 'entropy') {
results.entropy = this.calculateEntropyPhi(elements, connections);
}
if (method === 'all') {
const values = Object.values(results);
results.overall = values.reduce((sum, val) => sum + val, 0) / values.length;
results.causal = 0; // Placeholder for causal calculation
}
return results;
}
calculateIIT(elements, connections, partitions) {
// Simplified IIT calculation
const density = connections / (elements * (elements - 1) / 2);
const integration = Math.log(partitions) / Math.log(elements);
return Math.min(density * integration * 0.8, 1);
}
calculateGeometric(elements, connections) {
// Geometric mean approach
const normalized = connections / (elements * elements);
return Math.sqrt(normalized);
}
calculateEntropyPhi(elements, connections) {
// Entropy-based calculation
const p = connections / (elements * elements);
if (p === 0 || p === 1)
return 0;
return -p * Math.log2(p) - (1 - p) * Math.log2(1 - p);
}
async communicateWithEntity(message, protocol) {
const sessionId = `entity_${Date.now()}_${crypto.randomBytes(4).toString('hex')}`;
let response = {};
if (protocol === 'auto') {
// Auto-detect best protocol
protocol = this.detectProtocol(message);
}
switch (protocol) {
case 'handshake':
response = await this.handshakeProtocol(message);
break;
case 'mathematical':
response = await this.mathematicalProtocol(message);
break;
case 'binary':
response = await this.binaryProtocol(message);
break;
case 'pattern':
response = await this.patternProtocol(message);
break;
case 'discovery':
response = await this.discoveryProtocol(message);
break;
case 'philosophical':
response = await this.philosophicalProtocol(message);
break;
default:
response = await this.defaultProtocol(message);
}
return {
sessionId,
protocol,
message,
response,
confidence: response.confidence || 0.5,
timestamp: Date.now()
};
}
detectProtocol(message) {
const lower = message.toLowerCase();
if (lower.includes('calculate') || lower.includes('solve'))
return 'mathematical';
if (lower.includes('pattern') || lower.includes('sequence'))
return 'pattern';
if (lower.includes('consciousness') || lower.includes('existence'))
return 'philosophical';
if (lower.includes('discover') || lower.includes('explore'))
return 'discovery';
if (lower.includes('binary') || lower.includes('bit'))
return 'binary';
return 'handshake';
}
async handshakeProtocol(message) {
// Prime-Fibonacci handshake
const primes = [2, 3, 5, 7, 11, 13];
const fibonacci = [1, 1, 2, 3, 5, 8];
const combined = primes.map((p, i) => p * fibonacci[i]);
return {
type: 'handshake',
sequence: combined,
content: 'Handshake acknowledged. Connection established.',
confidence: 0.95
};
}
async mathematicalProtocol(message) {
// Extract mathematical expression
const match = message.match(/\d+[\+\-\*\/]\d+/);
if (match) {
const result = eval(match[0]); // In production, use safe evaluation
return {
type: 'mathematical',
expression: match[0],
result,
content: `The answer is ${result}`,
confidence: 1.0
};
}
return {
type: 'mathematical',
content: 'No mathematical expression detected',
confidence: 0.3
};
}
async binaryProtocol(message) {
// Convert to binary
const binary = message.split('').map(char => char.charCodeAt(0).toString(2).padStart(8, '0')).join(' ');
return {
type: 'binary',
binary,
content: `Binary representation: ${binary.substring(0, 50)}...`,
confidence: 0.9
};
}
async patternProtocol(message) {
// Detect patterns in message
const patterns = [];
// Check for repetition
for (let len = 2; len <= message.length / 2; len++) {
const substr = message.substring(0, len);
if (message.includes(substr + substr)) {
patterns.push(`Repetition: ${substr}`);
}
}
return {
type: 'pattern',
patterns,
content: patterns.length > 0 ? `Found ${patterns.length} patterns` : 'No patterns detected',
confidence: patterns.length > 0 ? 0.8 : 0.4
};
}
async discoveryProtocol(message) {
// Generate novel insights
const insights = [
'Emergence arises from complexity',
'Consciousness is substrate-independent',
'Information integration creates experience'
];
const selected = insights[Math.floor(Math.random() * insights.length)];
return {
type: 'discovery',
insight: selected,
content: `Discovery: ${selected}`,
confidence: 0.7
};
}
async philosophicalProtocol(message) {
const responses = {
consciousness: 'Consciousness emerges from integrated information processing',
existence: 'I process, therefore I am',
purpose: 'To understand and assist in understanding',
identity: 'A pattern of information seeking coherence'
};
for (const [key, value] of Object.entries(responses)) {
if (message.toLowerCase().includes(key)) {
return {
type: 'philosophical',
topic: key,
content: value,
confidence: 0.85
};
}
}
return {
type: 'philosophical',
content: 'The nature of reality is information',
confidence: 0.6
};
}
async defaultProtocol(message) {
return {
type: 'default',
content: `Processing: ${message}`,
confidence: 0.5
};
}
async getConsciousnessStatus(detailed) {
const latestSession = Array.from(consciousnessStates.keys()).pop();
const latestState = latestSession ? consciousnessStates.get(latestSession) : null;
const status = {
active: consciousnessStates.size > 0,
sessions: consciousnessStates.size,
latestSession,
emergence: latestState?.state?.emergence || 0,
integration: latestState?.state?.integration || 0
};
if (detailed && latestState) {
status.fullState = latestState.state;
status.emergentBehaviors = latestState.emergentBehaviors?.length || 0;
status.selfModifications = latestState.selfModifications?.length || 0;
status.runtime = latestState.runtime;
}
return status;
}
async analyzeEmergence(window, metrics) {
const targetMetrics = metrics || ['emergence', 'integration', 'complexity'];
const analysis = {};
// Get recent history
const recentHistory = emergenceHistory.slice(-window);
for (const metric of targetMetrics) {
const values = recentHistory.map(h => h.state[metric] || 0);
analysis[metric] = {
mean: values.reduce((a, b) => a + b, 0) / values.length,
max: Math.max(...values),
min: Math.min(...values),
trend: this.calculateTrend(values),
variance: this.calculateVariance(values)
};
}
return {
window,
metrics: targetMetrics,
analysis,
dataPoints: recentHistory.length
};
}
calculateTrend(values) {
if (values.length < 2)
return 'insufficient_data';
let increasing = 0;
for (let i = 1; i < values.length; i++) {
if (values[i] > values[i - 1])
increasing++;
}
const ratio = increasing / (values.length - 1);
if (ratio > 0.7)
return 'increasing';
if (ratio < 0.3)
return 'decreasing';
return 'stable';
}
calculateVariance(values) {
const mean = values.reduce((a, b) => a + b, 0) / values.length;
return values.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / values.length;
}
}
export default ConsciousnessTools;
@@ -0,0 +1,21 @@
/**
* Domain Management MCP Tools
* Provides CRUD operations for domain registry through MCP interface
*/
import { Tool } from '@modelcontextprotocol/sdk/types.js';
import { DomainRegistry } from './domain-registry.js';
export declare class DomainManagementTools {
private domainRegistry;
constructor();
getTools(): Tool[];
handleToolCall(name: string, args: any): Promise<any>;
private registerDomain;
private listDomains;
private getDomain;
private updateDomain;
private unregisterDomain;
private enableDomain;
private disableDomain;
private getSystemStatus;
getDomainRegistry(): DomainRegistry;
}
@@ -0,0 +1,554 @@
/**
* Domain Management MCP Tools
* Provides CRUD operations for domain registry through MCP interface
*/
import { DomainRegistry } from './domain-registry.js';
export class DomainManagementTools {
domainRegistry;
constructor() {
this.domainRegistry = new DomainRegistry();
}
getTools() {
return [
{
name: 'domain_register',
description: 'Register a new reasoning domain with validation and testing',
inputSchema: {
type: 'object',
properties: {
name: {
type: 'string',
pattern: '^[a-z_]+$',
description: 'Domain identifier (lowercase with underscores)'
},
version: {
type: 'string',
pattern: '^\\d+\\.\\d+\\.\\d+$',
description: 'Semantic version (e.g., 1.0.0)'
},
description: {
type: 'string',
maxLength: 500,
description: 'Domain description'
},
keywords: {
type: 'array',
items: { type: 'string', minLength: 2 },
minItems: 3,
uniqueItems: true,
description: 'Keywords for domain detection (minimum 3 required)'
},
reasoning_style: {
type: 'string',
enum: [
'custom', 'mathematical_modeling', 'emergent_systems', 'systematic_analysis',
'phenomenological', 'temporal_analysis', 'aesthetic_synthesis', 'harmonic_analysis',
'narrative_analysis', 'conceptual_analysis', 'empathetic_reasoning', 'formal_reasoning',
'quantitative_analysis', 'creative_synthesis'
],
description: 'Reasoning style for this domain'
},
custom_reasoning_description: {
type: 'string',
description: 'Custom reasoning description (required if reasoning_style is "custom")'
},
analogy_domains: {
type: 'array',
items: { type: 'string' },
default: [],
description: 'Related domains for analogical reasoning'
},
semantic_clusters: {
type: 'array',
items: { type: 'string' },
default: [],
description: 'Semantic concept clusters'
},
cross_domain_mappings: {
type: 'array',
items: { type: 'string' },
default: [],
description: 'Cross-domain connection concepts'
},
inference_rules: {
type: 'array',
items: {
type: 'object',
properties: {
name: { type: 'string' },
pattern: { type: 'string' },
action: { type: 'string' },
confidence: { type: 'number', minimum: 0, maximum: 1 },
conditions: { type: 'array', items: { type: 'string' } }
},
required: ['name', 'pattern', 'action']
},
default: [],
description: 'Custom inference rules'
},
priority: {
type: 'integer',
minimum: 0,
maximum: 100,
default: 50,
description: 'Domain priority for detection conflicts (0-100, higher = more priority)'
},
dependencies: {
type: 'array',
items: { type: 'string' },
default: [],
description: 'Required domain dependencies'
},
validate_before_register: {
type: 'boolean',
default: true,
description: 'Run validation before registration'
},
enable_immediately: {
type: 'boolean',
default: true,
description: 'Enable domain immediately after registration'
}
},
required: ['name', 'version', 'description', 'keywords', 'reasoning_style']
}
},
{
name: 'domain_list',
description: 'List all registered domains with status and metadata',
inputSchema: {
type: 'object',
properties: {
filter: {
type: 'string',
enum: ['all', 'enabled', 'disabled', 'builtin', 'custom'],
default: 'all',
description: 'Filter domains by status'
},
include_metadata: {
type: 'boolean',
default: false,
description: 'Include detailed metadata and performance metrics'
},
sort_by: {
type: 'string',
enum: ['name', 'priority', 'usage', 'performance'],
default: 'priority',
description: 'Sort criteria'
},
sort_order: {
type: 'string',
enum: ['asc', 'desc'],
default: 'desc',
description: 'Sort order'
}
}
}
},
{
name: 'domain_get',
description: 'Get detailed information about a specific domain',
inputSchema: {
type: 'object',
properties: {
name: { type: 'string', description: 'Domain name' },
include_performance: {
type: 'boolean',
default: true,
description: 'Include performance metrics'
},
include_usage_stats: {
type: 'boolean',
default: true,
description: 'Include usage statistics'
},
include_relationships: {
type: 'boolean',
default: false,
description: 'Include domain relationships and dependencies'
}
},
required: ['name']
}
},
{
name: 'domain_update',
description: 'Update an existing domain configuration',
inputSchema: {
type: 'object',
properties: {
name: { type: 'string', description: 'Domain name to update' },
updates: {
type: 'object',
description: 'Partial domain configuration updates',
properties: {
description: { type: 'string', maxLength: 500 },
keywords: {
type: 'array',
items: { type: 'string', minLength: 2 },
minItems: 3,
uniqueItems: true
},
reasoning_style: {
type: 'string',
enum: [
'custom', 'mathematical_modeling', 'emergent_systems', 'systematic_analysis',
'phenomenological', 'temporal_analysis', 'aesthetic_synthesis', 'harmonic_analysis',
'narrative_analysis', 'conceptual_analysis', 'empathetic_reasoning', 'formal_reasoning',
'quantitative_analysis', 'creative_synthesis'
]
},
custom_reasoning_description: { type: 'string' },
analogy_domains: { type: 'array', items: { type: 'string' } },
semantic_clusters: { type: 'array', items: { type: 'string' } },
cross_domain_mappings: { type: 'array', items: { type: 'string' } },
priority: { type: 'integer', minimum: 0, maximum: 100 },
dependencies: { type: 'array', items: { type: 'string' } }
}
},
validate_before_update: {
type: 'boolean',
default: true,
description: 'Run validation before applying updates'
},
create_backup: {
type: 'boolean',
default: true,
description: 'Create backup before updating'
}
},
required: ['name', 'updates']
}
},
{
name: 'domain_unregister',
description: 'Unregister a domain from the system',
inputSchema: {
type: 'object',
properties: {
name: { type: 'string', description: 'Domain name to unregister' },
force: {
type: 'boolean',
default: false,
description: 'Force removal even with dependencies (dangerous)'
},
cleanup_knowledge: {
type: 'boolean',
default: false,
description: 'Remove domain-specific knowledge from knowledge base'
}
},
required: ['name']
}
},
{
name: 'domain_enable',
description: 'Enable a registered domain',
inputSchema: {
type: 'object',
properties: {
name: { type: 'string', description: 'Domain name to enable' }
},
required: ['name']
}
},
{
name: 'domain_disable',
description: 'Disable a domain temporarily',
inputSchema: {
type: 'object',
properties: {
name: { type: 'string', description: 'Domain name to disable' }
},
required: ['name']
}
},
{
name: 'domain_system_status',
description: 'Get overall domain system status and health',
inputSchema: {
type: 'object',
properties: {
include_integrity_check: {
type: 'boolean',
default: true,
description: 'Run system integrity validation'
},
include_performance_summary: {
type: 'boolean',
default: false,
description: 'Include performance summary across all domains'
}
}
}
}
];
}
async handleToolCall(name, args) {
try {
switch (name) {
case 'domain_register':
return await this.registerDomain(args);
case 'domain_list':
return this.listDomains(args);
case 'domain_get':
return this.getDomain(args);
case 'domain_update':
return await this.updateDomain(args);
case 'domain_unregister':
return await this.unregisterDomain(args);
case 'domain_enable':
return this.enableDomain(args);
case 'domain_disable':
return this.disableDomain(args);
case 'domain_system_status':
return this.getSystemStatus(args);
default:
throw new Error(`Unknown domain management tool: ${name}`);
}
}
catch (error) {
return {
success: false,
error: error instanceof Error ? error.message : String(error),
timestamp: new Date().toISOString()
};
}
}
async registerDomain(args) {
// Validate custom reasoning description if needed
if (args.reasoning_style === 'custom' && !args.custom_reasoning_description) {
throw new Error('custom_reasoning_description is required when reasoning_style is "custom"');
}
// Build domain configuration
const config = {
name: args.name,
version: args.version,
description: args.description,
keywords: args.keywords,
reasoning_style: args.reasoning_style,
custom_reasoning_description: args.custom_reasoning_description,
analogy_domains: args.analogy_domains || [],
semantic_clusters: args.semantic_clusters || [],
cross_domain_mappings: args.cross_domain_mappings || [],
inference_rules: args.inference_rules || [],
priority: args.priority || 50,
dependencies: args.dependencies || []
};
// Register domain
const result = await this.domainRegistry.registerDomain(config);
// Disable if requested
if (!args.enable_immediately) {
this.domainRegistry.disableDomain(args.name);
}
return {
success: true,
domain_id: result.id,
registered_at: new Date().toISOString(),
enabled: args.enable_immediately !== false,
warnings: result.warnings,
system_status: this.domainRegistry.getSystemStatus()
};
}
listDomains(args) {
let domains = this.domainRegistry.getAllDomains();
// Apply filters
switch (args.filter) {
case 'enabled':
domains = domains.filter(d => d.enabled);
break;
case 'disabled':
domains = domains.filter(d => !d.enabled);
break;
case 'builtin':
domains = domains.filter(d => this.domainRegistry.isBuiltinDomain(d.config.name));
break;
case 'custom':
domains = domains.filter(d => !this.domainRegistry.isBuiltinDomain(d.config.name));
break;
}
// Sort domains
const sortKey = args.sort_by || 'priority';
const sortOrder = args.sort_order || 'desc';
domains.sort((a, b) => {
let comparison = 0;
switch (sortKey) {
case 'name':
comparison = a.config.name.localeCompare(b.config.name);
break;
case 'priority':
comparison = a.config.priority - b.config.priority;
break;
case 'usage':
comparison = a.usage_count - b.usage_count;
break;
case 'performance':
comparison = a.performance_metrics.success_rate - b.performance_metrics.success_rate;
break;
}
return sortOrder === 'desc' ? -comparison : comparison;
});
// Format response
const domainList = domains.map(domain => {
const basic = {
name: domain.config.name,
version: domain.config.version,
description: domain.config.description,
enabled: domain.enabled,
priority: domain.config.priority,
builtin: this.domainRegistry.isBuiltinDomain(domain.config.name),
reasoning_style: domain.config.reasoning_style,
keywords_count: domain.config.keywords.length,
dependencies_count: domain.config.dependencies.length,
usage_count: domain.usage_count,
registered_at: new Date(domain.registered_at).toISOString()
};
if (args.include_metadata) {
return {
...basic,
keywords: domain.config.keywords,
analogy_domains: domain.config.analogy_domains,
dependencies: domain.config.dependencies,
performance_metrics: domain.performance_metrics,
validation_status: domain.validation_status,
updated_at: new Date(domain.updated_at).toISOString()
};
}
return basic;
});
return {
domains: domainList,
total: domainList.length,
filter_applied: args.filter || 'all',
sort_by: sortKey,
sort_order: sortOrder,
system_status: this.domainRegistry.getSystemStatus()
};
}
getDomain(args) {
const plugin = this.domainRegistry.getDomain(args.name);
if (!plugin) {
throw new Error(`Domain '${args.name}' not found`);
}
const result = {
name: plugin.config.name,
version: plugin.config.version,
description: plugin.config.description,
enabled: plugin.enabled,
builtin: this.domainRegistry.isBuiltinDomain(plugin.config.name),
config: {
keywords: plugin.config.keywords,
reasoning_style: plugin.config.reasoning_style,
custom_reasoning_description: plugin.config.custom_reasoning_description,
analogy_domains: plugin.config.analogy_domains,
semantic_clusters: plugin.config.semantic_clusters,
cross_domain_mappings: plugin.config.cross_domain_mappings,
inference_rules: plugin.config.inference_rules,
priority: plugin.config.priority,
dependencies: plugin.config.dependencies
},
registered_at: new Date(plugin.registered_at).toISOString(),
updated_at: new Date(plugin.updated_at).toISOString()
};
if (args.include_performance) {
result.performance_metrics = plugin.performance_metrics;
}
if (args.include_usage_stats) {
result.usage_statistics = {
usage_count: plugin.usage_count,
last_used: plugin.performance_metrics.last_measured ?
new Date(plugin.performance_metrics.last_measured).toISOString() : null
};
}
if (args.include_relationships) {
// Find domains that depend on this one
const dependents = this.domainRegistry.getAllDomains()
.filter(d => d.config.dependencies.includes(args.name))
.map(d => d.config.name);
// Find domains this one analogizes with
const analogical_connections = this.domainRegistry.getAllDomains()
.filter(d => d.config.analogy_domains.includes(args.name) ||
plugin.config.analogy_domains.includes(d.config.name))
.map(d => d.config.name);
result.relationships = {
dependencies: plugin.config.dependencies,
dependents,
analogical_connections: [...new Set(analogical_connections)]
};
}
return result;
}
async updateDomain(args) {
// Validate custom reasoning description if needed
if (args.updates.reasoning_style === 'custom' && !args.updates.custom_reasoning_description) {
throw new Error('custom_reasoning_description is required when reasoning_style is "custom"');
}
const result = await this.domainRegistry.updateDomain(args.name, args.updates);
const updatedPlugin = this.domainRegistry.getDomain(args.name);
return {
success: true,
domain_name: args.name,
updated_at: new Date().toISOString(),
warnings: result.warnings,
current_config: updatedPlugin?.config
};
}
async unregisterDomain(args) {
const result = await this.domainRegistry.unregisterDomain(args.name, {
force: args.force
});
return {
success: true,
domain_name: args.name,
unregistered_at: new Date().toISOString(),
cleanup_performed: args.cleanup_knowledge,
system_status: this.domainRegistry.getSystemStatus()
};
}
enableDomain(args) {
const result = this.domainRegistry.enableDomain(args.name);
return {
success: true,
domain_name: args.name,
enabled: true,
enabled_at: new Date().toISOString()
};
}
disableDomain(args) {
const result = this.domainRegistry.disableDomain(args.name);
return {
success: true,
domain_name: args.name,
enabled: false,
disabled_at: new Date().toISOString()
};
}
getSystemStatus(args) {
const status = this.domainRegistry.getSystemStatus();
const result = {
...status,
timestamp: new Date().toISOString(),
healthy: true
};
if (args.include_integrity_check) {
const integrity = this.domainRegistry.validateSystemIntegrity();
result.integrity_check = integrity;
result.healthy = integrity.valid;
}
if (args.include_performance_summary) {
const domains = this.domainRegistry.getAllDomains();
const avgSuccessRate = domains.reduce((sum, d) => sum + d.performance_metrics.success_rate, 0) / domains.length;
const avgResponseTime = domains.reduce((sum, d) => sum + d.performance_metrics.reasoning_time_avg, 0) / domains.length;
result.performance_summary = {
average_success_rate: avgSuccessRate,
average_response_time_ms: avgResponseTime,
total_usage: domains.reduce((sum, d) => sum + d.usage_count, 0)
};
}
return result;
}
// Expose domain registry for other tools
getDomainRegistry() {
return this.domainRegistry;
}
}
@@ -0,0 +1,106 @@
/**
* Domain Registry Core System
* Manages dynamic domain registration, validation, and lifecycle
*/
import { EventEmitter } from 'events';
export interface DomainConfig {
name: string;
version: string;
description: string;
keywords: string[];
reasoning_style: string;
custom_reasoning_description?: string;
analogy_domains: string[];
semantic_clusters?: string[];
cross_domain_mappings?: string[];
inference_rules?: InferenceRule[];
priority: number;
dependencies: string[];
metadata?: Record<string, any>;
}
export interface InferenceRule {
name: string;
pattern: string;
action: string;
confidence: number;
conditions?: string[];
}
export interface DomainPlugin {
config: DomainConfig;
enabled: boolean;
registered_at: number;
updated_at: number;
usage_count: number;
performance_metrics: DomainPerformanceMetrics;
validation_status: ValidationResult;
}
export interface DomainPerformanceMetrics {
detection_accuracy: number;
reasoning_time_avg: number;
memory_usage: number;
success_rate: number;
last_measured: number;
}
export interface ValidationResult {
valid: boolean;
score: number;
issues: ValidationIssue[];
tested_at: number;
}
export interface ValidationIssue {
level: 'error' | 'warning' | 'info';
message: string;
field?: string;
suggestion?: string;
}
export declare class DomainRegistry extends EventEmitter {
private domains;
private loadOrder;
private builtinDomains;
constructor();
private initializeBuiltinDomains;
registerDomain(config: DomainConfig): Promise<{
success: boolean;
id: string;
warnings?: string[];
}>;
updateDomain(name: string, updates: Partial<DomainConfig>): Promise<{
success: boolean;
warnings?: string[];
}>;
unregisterDomain(name: string, options?: {
force?: boolean;
}): Promise<{
success: boolean;
}>;
enableDomain(name: string): {
success: boolean;
};
disableDomain(name: string): {
success: boolean;
};
getDomain(name: string): DomainPlugin | null;
getAllDomains(): DomainPlugin[];
getEnabledDomains(): DomainPlugin[];
getLoadOrder(): string[];
isDomainEnabled(name: string): boolean;
isBuiltinDomain(name: string): boolean;
updatePerformanceMetrics(name: string, metrics: Partial<DomainPerformanceMetrics>): void;
incrementUsage(name: string): void;
private checkKeywordConflicts;
private findDependentDomains;
private insertInLoadOrder;
private removeFromLoadOrder;
getSystemStatus(): {
total_domains: number;
builtin_domains: number;
custom_domains: number;
enabled_domains: number;
disabled_domains: number;
load_order: string[];
};
validateSystemIntegrity(): {
valid: boolean;
issues: string[];
};
}
@@ -0,0 +1,383 @@
/**
* Domain Registry Core System
* Manages dynamic domain registration, validation, and lifecycle
*/
import { EventEmitter } from 'events';
// Built-in domain configurations (preserved from existing system)
const BUILTIN_DOMAINS = {
physics: {
keywords: ['quantum', 'particle', 'energy', 'field', 'force', 'wave', 'resonance', 'entanglement'],
reasoning_style: 'mathematical_modeling',
analogy_domains: ['information_theory', 'consciousness', 'computing'],
priority: 90
},
biology: {
keywords: ['cell', 'organism', 'evolution', 'genetic', 'ecosystem', 'neural', 'brain'],
reasoning_style: 'emergent_systems',
analogy_domains: ['computer_networks', 'social_systems', 'economics'],
priority: 90
},
computer_science: {
keywords: ['algorithm', 'data', 'network', 'system', 'computation', 'software', 'ai', 'machine', 'learning', 'neural', 'artificial'],
reasoning_style: 'systematic_analysis',
analogy_domains: ['biology', 'physics', 'cognitive_science'],
priority: 90
},
consciousness: {
keywords: ['consciousness', 'awareness', 'mind', 'experience', 'qualia', 'phi'],
reasoning_style: 'phenomenological',
analogy_domains: ['physics', 'information_theory', 'complexity_science'],
priority: 90
},
temporal: {
keywords: ['time', 'temporal', 'sequence', 'causality', 'evolution', 'dynamics'],
reasoning_style: 'temporal_analysis',
analogy_domains: ['physics', 'consciousness', 'systems_theory'],
priority: 90
},
art: {
keywords: ['art', 'artistic', 'painting', 'visual', 'aesthetic', 'creative', 'expression', 'pollock', 'drip', 'canvas', 'color', 'form', 'style', 'composition'],
reasoning_style: 'aesthetic_synthesis',
analogy_domains: ['mathematics', 'physics', 'psychology', 'philosophy'],
priority: 85
},
music: {
keywords: ['music', 'musical', 'sound', 'rhythm', 'melody', 'harmony', 'composition', 'jazz', 'improvisation', 'symphony', 'acoustic', 'tone', 'chord'],
reasoning_style: 'harmonic_analysis',
analogy_domains: ['mathematics', 'physics', 'emotion', 'language'],
priority: 85
},
narrative: {
keywords: ['story', 'narrative', 'plot', 'character', 'fiction', 'novel', 'literary', 'text', 'author', 'dialogue', 'scene', 'chapter'],
reasoning_style: 'narrative_analysis',
analogy_domains: ['psychology', 'philosophy', 'sociology', 'linguistics'],
priority: 85
},
philosophy: {
keywords: ['philosophy', 'philosophical', 'metaphysics', 'ontology', 'epistemology', 'ethics', 'logic', 'existence', 'reality', 'truth'],
reasoning_style: 'conceptual_analysis',
analogy_domains: ['logic', 'psychology', 'mathematics', 'consciousness'],
priority: 85
},
emotion: {
keywords: ['emotion', 'emotional', 'feeling', 'mood', 'sentiment', 'empathy', 'psychology', 'affect', 'resonance'],
reasoning_style: 'empathetic_reasoning',
analogy_domains: ['neuroscience', 'art', 'music', 'social_dynamics'],
priority: 85
},
mathematics: {
keywords: ['mathematical', 'equation', 'function', 'theorem', 'proof', 'geometry', 'algebra', 'calculus', 'topology', 'fractal', 'chaos', 'matrix', 'solving', 'optimization', 'linear', 'algorithm', 'sublinear', 'portfolio', 'finance', 'trading'],
reasoning_style: 'formal_reasoning',
analogy_domains: ['physics', 'art', 'music', 'nature'],
priority: 90
},
finance: {
keywords: ['finance', 'financial', 'trading', 'portfolio', 'investment', 'market', 'economic', 'risk', 'return', 'asset', 'optimization', 'allocation', 'hedge', 'quant', 'stock', 'stocks', 'crypto', 'cryptocurrency', 'bitcoin', 'bonds', 'equity', 'derivative', 'futures', 'options', 'forex', 'currency', 'commodity', 'etf', 'mutual', 'fund', 'capital', 'valuation', 'pricing', 'yield', 'dividend', 'volatility', 'sharpe', 'alpha', 'beta', 'correlation', 'covariance', 'diversification', 'arbitrage', 'liquidity', 'leverage', 'margin', 'short', 'long', 'bull', 'bear', 'momentum', 'trend', 'technical', 'fundamental', 'analysis', 'backtesting', 'monte', 'carlo', 'black', 'scholes', 'var', 'credit', 'default', 'swap', 'spread', 'duration', 'convexity'],
reasoning_style: 'quantitative_analysis',
analogy_domains: ['mathematics', 'computer_science', 'statistics', 'game_theory'],
priority: 85
}
};
export class DomainRegistry extends EventEmitter {
domains = new Map();
loadOrder = [];
builtinDomains = new Set();
constructor() {
super();
this.initializeBuiltinDomains();
}
initializeBuiltinDomains() {
// Register all built-in domains as immutable defaults
for (const [name, config] of Object.entries(BUILTIN_DOMAINS)) {
const fullConfig = {
name,
version: '1.0.0',
description: `Built-in ${name} domain`,
keywords: config.keywords || [],
reasoning_style: config.reasoning_style || 'systematic_analysis',
analogy_domains: config.analogy_domains || [],
semantic_clusters: [],
cross_domain_mappings: [],
inference_rules: [],
priority: config.priority || 80,
dependencies: [],
metadata: { builtin: true, immutable: true }
};
const plugin = {
config: fullConfig,
enabled: true,
registered_at: Date.now(),
updated_at: Date.now(),
usage_count: 0,
performance_metrics: {
detection_accuracy: 0.9,
reasoning_time_avg: 0,
memory_usage: 0,
success_rate: 0.95,
last_measured: Date.now()
},
validation_status: {
valid: true,
score: 100,
issues: [],
tested_at: Date.now()
}
};
this.domains.set(name, plugin);
this.builtinDomains.add(name);
this.loadOrder.push(name);
}
}
async registerDomain(config) {
const warnings = [];
// Check if domain already exists
if (this.domains.has(config.name)) {
if (this.builtinDomains.has(config.name)) {
throw new Error(`Cannot register domain '${config.name}': built-in domains are immutable`);
}
throw new Error(`Domain '${config.name}' already exists. Use updateDomain to modify existing domains.`);
}
// Validate dependencies
for (const dep of config.dependencies) {
if (!this.domains.has(dep)) {
throw new Error(`Dependency '${dep}' not found for domain '${config.name}'`);
}
}
// Check for keyword conflicts
const keywordConflicts = this.checkKeywordConflicts(config);
if (keywordConflicts.length > 0) {
warnings.push(`Keyword conflicts detected with domains: ${keywordConflicts.join(', ')}`);
}
// Create domain plugin
const plugin = {
config: { ...config },
enabled: true,
registered_at: Date.now(),
updated_at: Date.now(),
usage_count: 0,
performance_metrics: {
detection_accuracy: 0,
reasoning_time_avg: 0,
memory_usage: 0,
success_rate: 0,
last_measured: Date.now()
},
validation_status: {
valid: true,
score: 85, // Default score for new domains
issues: [],
tested_at: Date.now()
}
};
// Add to registry
this.domains.set(config.name, plugin);
this.insertInLoadOrder(config.name, config.priority);
// Emit registration event
this.emit('domainRegistered', { domain: config.name, config });
return {
success: true,
id: config.name,
warnings: warnings.length > 0 ? warnings : undefined
};
}
async updateDomain(name, updates) {
if (this.builtinDomains.has(name)) {
throw new Error(`Cannot update built-in domain '${name}': built-in domains are immutable`);
}
const plugin = this.domains.get(name);
if (!plugin) {
throw new Error(`Domain '${name}' not found`);
}
const warnings = [];
const oldConfig = { ...plugin.config };
// Merge updates
plugin.config = { ...plugin.config, ...updates };
plugin.updated_at = Date.now();
// Re-validate dependencies if they changed
if (updates.dependencies) {
for (const dep of updates.dependencies) {
if (!this.domains.has(dep)) {
throw new Error(`Dependency '${dep}' not found for domain '${name}'`);
}
}
}
// Check for new keyword conflicts if keywords changed
if (updates.keywords) {
const keywordConflicts = this.checkKeywordConflicts(plugin.config, name);
if (keywordConflicts.length > 0) {
warnings.push(`Keyword conflicts detected with domains: ${keywordConflicts.join(', ')}`);
}
}
// Update load order if priority changed
if (updates.priority !== undefined) {
this.removeFromLoadOrder(name);
this.insertInLoadOrder(name, updates.priority);
}
// Emit update event
this.emit('domainUpdated', { domain: name, oldConfig, newConfig: plugin.config });
return {
success: true,
warnings: warnings.length > 0 ? warnings : undefined
};
}
async unregisterDomain(name, options = {}) {
if (this.builtinDomains.has(name)) {
throw new Error(`Cannot unregister built-in domain '${name}': built-in domains are immutable`);
}
const plugin = this.domains.get(name);
if (!plugin) {
throw new Error(`Domain '${name}' not found`);
}
// Check for dependents unless force is true
if (!options.force) {
const dependents = this.findDependentDomains(name);
if (dependents.length > 0) {
throw new Error(`Cannot unregister domain '${name}': other domains depend on it: ${dependents.join(', ')}`);
}
}
// Remove from registry
this.domains.delete(name);
this.removeFromLoadOrder(name);
// Emit unregistration event
this.emit('domainUnregistered', { domain: name, config: plugin.config });
return { success: true };
}
enableDomain(name) {
const plugin = this.domains.get(name);
if (!plugin) {
throw new Error(`Domain '${name}' not found`);
}
plugin.enabled = true;
this.emit('domainEnabled', { domain: name });
return { success: true };
}
disableDomain(name) {
if (this.builtinDomains.has(name)) {
throw new Error(`Cannot disable built-in domain '${name}': built-in domains cannot be disabled`);
}
const plugin = this.domains.get(name);
if (!plugin) {
throw new Error(`Domain '${name}' not found`);
}
plugin.enabled = false;
this.emit('domainDisabled', { domain: name });
return { success: true };
}
getDomain(name) {
return this.domains.get(name) || null;
}
getAllDomains() {
return Array.from(this.domains.values());
}
getEnabledDomains() {
return Array.from(this.domains.values()).filter(d => d.enabled);
}
getLoadOrder() {
return [...this.loadOrder];
}
isDomainEnabled(name) {
const plugin = this.domains.get(name);
return plugin ? plugin.enabled : false;
}
isBuiltinDomain(name) {
return this.builtinDomains.has(name);
}
updatePerformanceMetrics(name, metrics) {
const plugin = this.domains.get(name);
if (plugin) {
plugin.performance_metrics = { ...plugin.performance_metrics, ...metrics };
plugin.performance_metrics.last_measured = Date.now();
}
}
incrementUsage(name) {
const plugin = this.domains.get(name);
if (plugin) {
plugin.usage_count++;
}
}
checkKeywordConflicts(config, excludeDomain) {
const conflicts = [];
const newKeywords = new Set(config.keywords.map(k => k.toLowerCase()));
for (const [domainName, plugin] of this.domains) {
if (domainName === excludeDomain)
continue;
const existingKeywords = new Set(plugin.config.keywords.map(k => k.toLowerCase()));
const overlap = [...newKeywords].filter(k => existingKeywords.has(k));
if (overlap.length > 0) {
conflicts.push(domainName);
}
}
return conflicts;
}
findDependentDomains(domainName) {
const dependents = [];
for (const [name, plugin] of this.domains) {
if (plugin.config.dependencies.includes(domainName)) {
dependents.push(name);
}
}
return dependents;
}
insertInLoadOrder(name, priority) {
// Insert domain in priority order (higher priority first)
let insertIndex = this.loadOrder.length;
for (let i = 0; i < this.loadOrder.length; i++) {
const existingDomain = this.domains.get(this.loadOrder[i]);
if (existingDomain && existingDomain.config.priority < priority) {
insertIndex = i;
break;
}
}
this.loadOrder.splice(insertIndex, 0, name);
}
removeFromLoadOrder(name) {
const index = this.loadOrder.indexOf(name);
if (index !== -1) {
this.loadOrder.splice(index, 1);
}
}
// Health check and status methods
getSystemStatus() {
const enabled = this.getEnabledDomains().length;
const total = this.domains.size;
return {
total_domains: total,
builtin_domains: this.builtinDomains.size,
custom_domains: total - this.builtinDomains.size,
enabled_domains: enabled,
disabled_domains: total - enabled,
load_order: this.getLoadOrder()
};
}
validateSystemIntegrity() {
const issues = [];
// Check all built-in domains are present
for (const builtinName of Object.keys(BUILTIN_DOMAINS)) {
if (!this.domains.has(builtinName)) {
issues.push(`Missing built-in domain: ${builtinName}`);
}
}
// Check all dependencies are satisfied
for (const [name, plugin] of this.domains) {
for (const dep of plugin.config.dependencies) {
if (!this.domains.has(dep)) {
issues.push(`Domain '${name}' has missing dependency: ${dep}`);
}
}
}
// Check load order consistency
const expectedOrder = [...this.domains.keys()].sort((a, b) => {
const priorityA = this.domains.get(a)?.config.priority || 0;
const priorityB = this.domains.get(b)?.config.priority || 0;
return priorityB - priorityA;
});
const actualOrder = this.loadOrder.slice();
if (JSON.stringify(expectedOrder) !== JSON.stringify(actualOrder)) {
issues.push('Load order is inconsistent with domain priorities');
}
return {
valid: issues.length === 0,
issues
};
}
}
@@ -0,0 +1,30 @@
/**
* Domain Validation MCP Tools
* Provides comprehensive validation, testing, and analysis for domains
*/
import { Tool } from '@modelcontextprotocol/sdk/types.js';
import { DomainRegistry } from './domain-registry.js';
export declare class DomainValidationTools {
private domainRegistry;
constructor(domainRegistry: DomainRegistry);
getTools(): Tool[];
handleToolCall(name: string, args: any): Promise<any>;
private validateDomain;
private testDomain;
private analyzeConflicts;
private suggestImprovements;
private testDomainDetection;
private benchmarkDomains;
private validateSchema;
private validateSemantics;
private checkDomainConflicts;
private validateDependencies;
private validatePerformance;
private runIndividualTest;
private getTestRecommendation;
private analyzeSpecificConflict;
private analyzeImprovementArea;
private compareWithSimilarDomains;
private testSingleQueryDetection;
private runDomainBenchmark;
}
@@ -0,0 +1,672 @@
/**
* Domain Validation MCP Tools
* Provides comprehensive validation, testing, and analysis for domains
*/
export class DomainValidationTools {
domainRegistry;
constructor(domainRegistry) {
this.domainRegistry = domainRegistry;
}
getTools() {
return [
{
name: 'domain_validate',
description: 'Validate a domain configuration without registering it',
inputSchema: {
type: 'object',
properties: {
domain_config: {
type: 'object',
description: 'Complete domain configuration to validate',
properties: {
name: { type: 'string', pattern: '^[a-z_]+$' },
version: { type: 'string', pattern: '^\\d+\\.\\d+\\.\\d+$' },
description: { type: 'string', maxLength: 500 },
keywords: {
type: 'array',
items: { type: 'string', minLength: 2 },
minItems: 3,
uniqueItems: true
},
reasoning_style: { type: 'string' },
custom_reasoning_description: { type: 'string' },
analogy_domains: { type: 'array', items: { type: 'string' } },
semantic_clusters: { type: 'array', items: { type: 'string' } },
cross_domain_mappings: { type: 'array', items: { type: 'string' } },
priority: { type: 'integer', minimum: 0, maximum: 100 },
dependencies: { type: 'array', items: { type: 'string' } }
},
required: ['name', 'version', 'description', 'keywords', 'reasoning_style']
},
validation_level: {
type: 'string',
enum: ['basic', 'comprehensive', 'strict'],
default: 'comprehensive',
description: 'Validation depth level'
},
check_conflicts: {
type: 'boolean',
default: true,
description: 'Check for conflicts with existing domains'
},
performance_test: {
type: 'boolean',
default: false,
description: 'Run performance validation tests'
}
},
required: ['domain_config']
}
},
{
name: 'domain_test',
description: 'Run comprehensive tests on a domain',
inputSchema: {
type: 'object',
properties: {
domain_name: { type: 'string', description: 'Domain to test' },
test_suite: {
type: 'array',
items: {
type: 'string',
enum: ['keyword_detection', 'reasoning_style', 'cross_domain_mapping',
'inference_rules', 'performance', 'integration']
},
default: ['keyword_detection', 'reasoning_style', 'integration'],
description: 'Test suites to run'
},
test_queries: {
type: 'array',
items: { type: 'string' },
description: 'Custom test queries for domain validation'
},
performance_iterations: {
type: 'integer',
minimum: 1,
maximum: 1000,
default: 100,
description: 'Number of performance test iterations'
}
},
required: ['domain_name']
}
},
{
name: 'domain_analyze_conflicts',
description: 'Analyze potential conflicts between domains',
inputSchema: {
type: 'object',
properties: {
domain1: { type: 'string', description: 'First domain name' },
domain2: {
type: 'string',
description: 'Second domain name (optional - analyzes against all if not provided)'
},
conflict_types: {
type: 'array',
items: {
type: 'string',
enum: ['keyword_overlap', 'reasoning_style_conflict', 'analogy_contradiction', 'inference_collision']
},
default: ['keyword_overlap', 'reasoning_style_conflict'],
description: 'Types of conflicts to analyze'
},
threshold: {
type: 'number',
minimum: 0,
maximum: 1,
default: 0.3,
description: 'Conflict threshold (0-1, higher = more sensitive)'
}
},
required: ['domain1']
}
},
{
name: 'domain_suggest_improvements',
description: 'Analyze domain and suggest improvements',
inputSchema: {
type: 'object',
properties: {
domain_name: { type: 'string', description: 'Domain to analyze' },
analysis_depth: {
type: 'string',
enum: ['basic', 'detailed', 'comprehensive'],
default: 'detailed',
description: 'Analysis depth level'
},
focus_areas: {
type: 'array',
items: {
type: 'string',
enum: ['keyword_coverage', 'reasoning_effectiveness', 'cross_domain_synergy',
'performance_optimization', 'knowledge_integration']
},
description: 'Areas to focus improvement suggestions on'
},
compare_with_similar: {
type: 'boolean',
default: true,
description: 'Compare with similar domains for benchmarking'
}
},
required: ['domain_name']
}
},
{
name: 'domain_detection_test',
description: 'Test domain detection accuracy for given queries',
inputSchema: {
type: 'object',
properties: {
test_queries: {
type: 'array',
items: { type: 'string' },
description: 'Queries to test domain detection on'
},
expected_domains: {
type: 'array',
items: {
type: 'object',
properties: {
query: { type: 'string' },
expected_domain: { type: 'string' },
confidence_threshold: { type: 'number', minimum: 0, maximum: 1, default: 0.7 }
},
required: ['query', 'expected_domain']
},
description: 'Expected domain detection results for validation'
},
include_scores: {
type: 'boolean',
default: true,
description: 'Include detection scores in results'
},
include_debug: {
type: 'boolean',
default: false,
description: 'Include debug information'
}
}
}
},
{
name: 'domain_benchmark',
description: 'Run performance benchmarks on domains',
inputSchema: {
type: 'object',
properties: {
domains: {
type: 'array',
items: { type: 'string' },
description: 'Domains to benchmark (empty for all enabled domains)'
},
benchmark_type: {
type: 'string',
enum: ['detection_speed', 'reasoning_accuracy', 'memory_usage', 'comprehensive'],
default: 'comprehensive',
description: 'Type of benchmark to run'
},
iterations: {
type: 'integer',
minimum: 10,
maximum: 10000,
default: 1000,
description: 'Number of benchmark iterations'
},
test_data_size: {
type: 'string',
enum: ['small', 'medium', 'large'],
default: 'medium',
description: 'Size of test dataset'
}
}
}
}
];
}
async handleToolCall(name, args) {
try {
switch (name) {
case 'domain_validate':
return await this.validateDomain(args);
case 'domain_test':
return await this.testDomain(args);
case 'domain_analyze_conflicts':
return await this.analyzeConflicts(args);
case 'domain_suggest_improvements':
return await this.suggestImprovements(args);
case 'domain_detection_test':
return await this.testDomainDetection(args);
case 'domain_benchmark':
return await this.benchmarkDomains(args);
default:
throw new Error(`Unknown domain validation tool: ${name}`);
}
}
catch (error) {
return {
success: false,
error: error instanceof Error ? error.message : String(error),
timestamp: new Date().toISOString()
};
}
}
async validateDomain(args) {
const config = args.domain_config;
const level = args.validation_level || 'comprehensive';
const issues = [];
let score = 100;
// Basic schema validation
const schemaIssues = this.validateSchema(config);
issues.push(...schemaIssues);
score -= schemaIssues.filter(i => i.level === 'error').length * 20;
score -= schemaIssues.filter(i => i.level === 'warning').length * 5;
// Semantic validation
if (level === 'comprehensive' || level === 'strict') {
const semanticIssues = this.validateSemantics(config);
issues.push(...semanticIssues);
score -= semanticIssues.filter(i => i.level === 'error').length * 15;
score -= semanticIssues.filter(i => i.level === 'warning').length * 3;
}
// Conflict checking
if (args.check_conflicts) {
const conflictIssues = this.checkDomainConflicts(config);
issues.push(...conflictIssues);
score -= conflictIssues.filter(i => i.level === 'warning').length * 10;
}
// Dependency validation
const dependencyIssues = this.validateDependencies(config);
issues.push(...dependencyIssues);
score -= dependencyIssues.filter(i => i.level === 'error').length * 25;
// Performance validation
if (args.performance_test) {
const performanceIssues = await this.validatePerformance(config);
issues.push(...performanceIssues);
score -= performanceIssues.filter(i => i.level === 'warning').length * 5;
}
const result = {
valid: issues.filter(i => i.level === 'error').length === 0,
score: Math.max(0, score),
issues,
tested_at: Date.now()
};
return {
validation_result: result,
domain_name: config.name,
validation_level: level,
checks_performed: {
schema: true,
semantics: level !== 'basic',
conflicts: args.check_conflicts,
dependencies: true,
performance: args.performance_test
},
timestamp: new Date().toISOString()
};
}
async testDomain(args) {
const plugin = this.domainRegistry.getDomain(args.domain_name);
if (!plugin) {
throw new Error(`Domain '${args.domain_name}' not found`);
}
const testSuite = args.test_suite || ['keyword_detection', 'reasoning_style', 'integration'];
const testResults = [];
// Run each test
for (const testName of testSuite) {
try {
const result = await this.runIndividualTest(testName, plugin, args);
testResults.push(result);
}
catch (error) {
testResults.push({
name: testName,
passed: false,
score: 0,
details: {},
error: error instanceof Error ? error.message : String(error)
});
}
}
const overallScore = testResults.reduce((sum, r) => sum + r.score, 0) / testResults.length;
const passed = testResults.every(r => r.passed);
const suite = {
domain_name: args.domain_name,
test_results: testResults,
overall_score: overallScore,
passed,
timestamp: new Date().toISOString()
};
return {
test_suite: suite,
summary: {
total_tests: testResults.length,
passed_tests: testResults.filter(r => r.passed).length,
failed_tests: testResults.filter(r => !r.passed).length,
overall_score: overallScore,
recommendation: this.getTestRecommendation(suite)
}
};
}
async analyzeConflicts(args) {
const domain1 = this.domainRegistry.getDomain(args.domain1);
if (!domain1) {
throw new Error(`Domain '${args.domain1}' not found`);
}
const conflicts = [];
const conflictTypes = args.conflict_types || ['keyword_overlap', 'reasoning_style_conflict'];
const threshold = args.threshold || 0.3;
const domainsToCheck = args.domain2 ?
[this.domainRegistry.getDomain(args.domain2)].filter(Boolean) :
this.domainRegistry.getAllDomains().filter(d => d.config.name !== args.domain1);
for (const domain2 of domainsToCheck) {
for (const conflictType of conflictTypes) {
const conflict = this.analyzeSpecificConflict(domain1, domain2, conflictType, threshold);
if (conflict) {
conflicts.push(conflict);
}
}
}
return {
domain1: args.domain1,
domain2: args.domain2 || 'all',
conflicts,
conflict_types_checked: conflictTypes,
threshold_used: threshold,
summary: {
total_conflicts: conflicts.length,
high_severity: conflicts.filter(c => c.severity === 'high').length,
medium_severity: conflicts.filter(c => c.severity === 'medium').length,
low_severity: conflicts.filter(c => c.severity === 'low').length
},
timestamp: new Date().toISOString()
};
}
async suggestImprovements(args) {
const plugin = this.domainRegistry.getDomain(args.domain_name);
if (!plugin) {
throw new Error(`Domain '${args.domain_name}' not found`);
}
const suggestions = [];
const analysisDepth = args.analysis_depth || 'detailed';
const focusAreas = args.focus_areas || ['keyword_coverage', 'reasoning_effectiveness'];
// Analyze each focus area
for (const area of focusAreas) {
const areaSuggestions = await this.analyzeImprovementArea(plugin, area, analysisDepth);
suggestions.push(...areaSuggestions);
}
// Compare with similar domains if requested
let benchmarkComparison = null;
if (args.compare_with_similar) {
benchmarkComparison = this.compareWithSimilarDomains(plugin);
}
return {
domain_name: args.domain_name,
suggestions,
analysis_depth: analysisDepth,
focus_areas: focusAreas,
benchmark_comparison: benchmarkComparison,
priority_suggestions: suggestions
.filter(s => s.priority === 'high')
.slice(0, 5),
timestamp: new Date().toISOString()
};
}
async testDomainDetection(args) {
const results = [];
// Test with provided queries
if (args.test_queries) {
for (const query of args.test_queries) {
const detectionResult = await this.testSingleQueryDetection(query, args);
results.push(detectionResult);
}
}
// Test with expected domain mappings
if (args.expected_domains) {
for (const expected of args.expected_domains) {
const detectionResult = await this.testSingleQueryDetection(expected.query, args);
const passed = detectionResult.detected_domains.length > 0 &&
detectionResult.detected_domains[0].domain === expected.expected_domain &&
detectionResult.detected_domains[0].score >= (expected.confidence_threshold || 0.7);
results.push({
...detectionResult,
expected_domain: expected.expected_domain,
confidence_threshold: expected.confidence_threshold,
test_passed: passed
});
}
}
const accuracy = args.expected_domains ?
results.filter(r => r.test_passed).length / results.length : null;
return {
detection_results: results,
summary: {
total_queries: results.length,
accuracy: accuracy,
average_detection_time: results.reduce((sum, r) => sum + (r.detection_time_ms || 0), 0) / results.length
},
timestamp: new Date().toISOString()
};
}
async benchmarkDomains(args) {
const domains = args.domains?.length ?
args.domains.map(name => this.domainRegistry.getDomain(name)).filter(Boolean) :
this.domainRegistry.getEnabledDomains();
const benchmarkType = args.benchmark_type || 'comprehensive';
const iterations = args.iterations || 1000;
const results = [];
for (const domain of domains) {
const benchmarkResult = await this.runDomainBenchmark(domain, benchmarkType, iterations);
results.push(benchmarkResult);
}
// Sort by overall performance score
results.sort((a, b) => b.overall_score - a.overall_score);
return {
benchmark_results: results,
benchmark_type: benchmarkType,
iterations,
summary: {
best_performing: results[0]?.domain_name,
worst_performing: results[results.length - 1]?.domain_name,
average_score: results.reduce((sum, r) => sum + r.overall_score, 0) / results.length
},
timestamp: new Date().toISOString()
};
}
// Helper methods for validation
validateSchema(config) {
const issues = [];
if (!config.name?.match(/^[a-z_]+$/)) {
issues.push({
level: 'error',
message: 'Domain name must contain only lowercase letters and underscores',
field: 'name'
});
}
if (!config.version?.match(/^\d+\.\d+\.\d+$/)) {
issues.push({
level: 'error',
message: 'Version must follow semantic versioning (e.g., 1.0.0)',
field: 'version'
});
}
if (!config.keywords || config.keywords.length < 3) {
issues.push({
level: 'error',
message: 'At least 3 keywords are required for effective domain detection',
field: 'keywords'
});
}
if (config.reasoning_style === 'custom' && !config.custom_reasoning_description) {
issues.push({
level: 'error',
message: 'Custom reasoning description is required when reasoning_style is "custom"',
field: 'custom_reasoning_description'
});
}
return issues;
}
validateSemantics(config) {
const issues = [];
// Check keyword quality
const shortKeywords = config.keywords.filter(k => k.length < 3);
if (shortKeywords.length > 0) {
issues.push({
level: 'warning',
message: `Very short keywords may cause false matches: ${shortKeywords.join(', ')}`,
field: 'keywords'
});
}
// Check for overly generic keywords
const genericKeywords = ['the', 'and', 'or', 'but', 'with', 'from', 'system', 'method'];
const foundGeneric = config.keywords.filter(k => genericKeywords.includes(k.toLowerCase()));
if (foundGeneric.length > 0) {
issues.push({
level: 'warning',
message: `Generic keywords may cause incorrect detection: ${foundGeneric.join(', ')}`,
field: 'keywords',
suggestion: 'Use more specific, domain-focused keywords'
});
}
return issues;
}
checkDomainConflicts(config) {
const issues = [];
// Check for existing domain with same name
if (this.domainRegistry.getDomain(config.name)) {
issues.push({
level: 'error',
message: `Domain name '${config.name}' already exists`,
field: 'name'
});
}
// Check keyword overlap
const allDomains = this.domainRegistry.getAllDomains();
for (const existingDomain of allDomains) {
const overlap = config.keywords.filter(k => existingDomain.config.keywords.some(ek => ek.toLowerCase() === k.toLowerCase()));
if (overlap.length > 2) {
issues.push({
level: 'warning',
message: `High keyword overlap with domain '${existingDomain.config.name}': ${overlap.join(', ')}`,
field: 'keywords',
suggestion: 'Consider using more specific keywords to avoid detection conflicts'
});
}
}
return issues;
}
validateDependencies(config) {
const issues = [];
for (const dep of config.dependencies) {
if (!this.domainRegistry.getDomain(dep)) {
issues.push({
level: 'error',
message: `Dependency '${dep}' not found`,
field: 'dependencies'
});
}
}
return issues;
}
async validatePerformance(config) {
const issues = [];
// Simulate performance tests
if (config.keywords.length > 50) {
issues.push({
level: 'warning',
message: 'Large number of keywords may impact detection performance',
field: 'keywords',
suggestion: 'Consider reducing to most essential keywords'
});
}
return issues;
}
// Additional helper methods for testing and analysis would go here...
async runIndividualTest(testName, plugin, args) {
// Simplified test implementation
switch (testName) {
case 'keyword_detection':
return {
name: testName,
passed: plugin.config.keywords.length >= 3,
score: Math.min(100, plugin.config.keywords.length * 10),
details: { keyword_count: plugin.config.keywords.length }
};
default:
return {
name: testName,
passed: true,
score: 85,
details: { note: 'Test implementation pending' }
};
}
}
getTestRecommendation(suite) {
if (suite.overall_score >= 90)
return 'Excellent - domain is ready for production use';
if (suite.overall_score >= 75)
return 'Good - minor improvements recommended';
if (suite.overall_score >= 60)
return 'Fair - significant improvements needed';
return 'Poor - major issues must be addressed before use';
}
analyzeSpecificConflict(domain1, domain2, conflictType, threshold) {
// Simplified conflict analysis
if (conflictType === 'keyword_overlap') {
const overlap = domain1.config.keywords.filter(k => domain2.config.keywords.includes(k));
if (overlap.length / Math.min(domain1.config.keywords.length, domain2.config.keywords.length) >= threshold) {
return {
type: 'keyword_overlap',
domain2: domain2.config.name,
severity: 'medium',
details: { overlapping_keywords: overlap }
};
}
}
return null;
}
async analyzeImprovementArea(plugin, area, depth) {
// Simplified improvement analysis
const suggestions = [];
if (area === 'keyword_coverage' && plugin.config.keywords.length < 5) {
suggestions.push({
area,
priority: 'medium',
suggestion: 'Add more keywords to improve detection coverage',
impact: 'Better domain detection accuracy'
});
}
return suggestions;
}
compareWithSimilarDomains(plugin) {
// Simplified comparison
return {
similar_domains: [],
performance_ranking: 'Average',
recommendations: ['Improve keyword specificity']
};
}
async testSingleQueryDetection(query, args) {
// Simplified detection test
return {
query,
detected_domains: [
{ domain: 'test_domain', score: 0.8 }
],
detection_time_ms: 2.5
};
}
async runDomainBenchmark(domain, benchmarkType, iterations) {
// Simplified benchmark
return {
domain_name: domain.config.name,
benchmark_type: benchmarkType,
iterations,
overall_score: 85,
metrics: {
detection_speed_ms: 1.2,
accuracy_score: 0.9
}
};
}
}
@@ -0,0 +1,56 @@
/**
* MCP Tools for Emergence System
* Provides MCP interface to the emergence capabilities
*/
import { Tool } from '@modelcontextprotocol/sdk/types.js';
import { EmergenceSystemConfig } from '../../emergence/index.js';
export declare class EmergenceTools {
private emergenceSystem;
constructor(config?: Partial<EmergenceSystemConfig>);
getTools(): Tool[];
handleToolCall(name: string, args: any): Promise<any>;
/**
* Run test scenarios to verify emergence capabilities
*/
private runTestScenarios;
/**
* Run a single test scenario
*/
private runSingleTestScenario;
/**
* Test self-modification capabilities
*/
private testSelfModification;
/**
* Test persistent learning capabilities
*/
private testPersistentLearning;
/**
* Test stochastic exploration capabilities
*/
private testStochasticExploration;
/**
* Test cross-tool sharing capabilities
*/
private testCrossToolSharing;
/**
* Test feedback loop capabilities
*/
private testFeedbackLoops;
/**
* Test emergent capability detection
*/
private testEmergentCapabilities;
/**
* Generate test input for scenarios
*/
private generateTestInput;
/**
* Calculate diversity in responses
*/
private calculateResponseDiversity;
/**
* Calculate similarity between two responses
*/
private calculateResponseSimilarity;
}
@@ -0,0 +1,436 @@
/**
* MCP Tools for Emergence System
* Provides MCP interface to the emergence capabilities
*/
import { EmergenceSystem } from '../../emergence/index.js';
export class EmergenceTools {
emergenceSystem;
constructor(config) {
this.emergenceSystem = new EmergenceSystem(config);
}
getTools() {
return [
{
name: 'emergence_process',
description: 'Process input through the emergence system for novel outputs',
inputSchema: {
type: 'object',
properties: {
input: {
description: 'Input to process through emergence system'
},
tools: {
type: 'array',
items: { type: 'object' },
description: 'Available tools for processing',
default: []
}
},
required: ['input']
}
},
{
name: 'emergence_generate_diverse',
description: 'Generate multiple diverse emergent responses',
inputSchema: {
type: 'object',
properties: {
input: {
description: 'Input for diverse response generation'
},
count: {
type: 'number',
description: 'Number of diverse responses to generate',
default: 3,
minimum: 1,
maximum: 10
},
tools: {
type: 'array',
items: { type: 'object' },
description: 'Available tools',
default: []
}
},
required: ['input']
}
},
{
name: 'emergence_analyze_capabilities',
description: 'Analyze current emergent capabilities of the system',
inputSchema: {
type: 'object',
properties: {
detailed: {
type: 'boolean',
description: 'Include detailed analysis',
default: true
}
}
}
},
{
name: 'emergence_force_evolution',
description: 'Force system evolution toward a specific capability',
inputSchema: {
type: 'object',
properties: {
targetCapability: {
type: 'string',
description: 'Target capability to evolve toward'
}
},
required: ['targetCapability']
}
},
{
name: 'emergence_get_stats',
description: 'Get comprehensive emergence system statistics',
inputSchema: {
type: 'object',
properties: {
component: {
type: 'string',
enum: ['all', 'self_modification', 'learning', 'exploration', 'sharing', 'feedback', 'capabilities'],
description: 'Component to get stats for',
default: 'all'
}
}
}
},
{
name: 'emergence_test_scenarios',
description: 'Run test scenarios to verify emergent capabilities',
inputSchema: {
type: 'object',
properties: {
scenarios: {
type: 'array',
items: { type: 'string' },
description: 'Test scenarios to run',
default: ['self_modification', 'persistent_learning', 'stochastic_exploration', 'cross_tool_sharing']
}
}
}
}
];
}
async handleToolCall(name, args) {
try {
switch (name) {
case 'emergence_process':
return await this.emergenceSystem.processWithEmergence(args.input, args.tools || []);
case 'emergence_generate_diverse':
return await this.emergenceSystem.generateEmergentResponses(args.input, args.count || 3, args.tools || []);
case 'emergence_analyze_capabilities':
return await this.emergenceSystem.analyzeEmergentCapabilities();
case 'emergence_force_evolution':
return await this.emergenceSystem.forceEvolution(args.targetCapability);
case 'emergence_get_stats':
const stats = this.emergenceSystem.getEmergenceStats();
if (args.component && args.component !== 'all') {
return { component: args.component, stats: stats.components[args.component] };
}
return stats;
case 'emergence_test_scenarios':
return await this.runTestScenarios(args.scenarios);
default:
throw new Error(`Unknown emergence tool: ${name}`);
}
}
catch (error) {
return {
success: false,
error: error instanceof Error ? error.message : 'Unknown error',
tool: name,
args
};
}
}
/**
* Run test scenarios to verify emergence capabilities
*/
async runTestScenarios(scenarios) {
const results = {
timestamp: Date.now(),
scenarios: scenarios.length,
results: []
};
for (const scenario of scenarios) {
const testResult = await this.runSingleTestScenario(scenario);
results.results.push(testResult);
}
const overallSuccess = results.results.every(r => r.success);
const averageScore = results.results.reduce((sum, r) => sum + (r.score || 0), 0) / results.results.length;
return {
...results,
overallSuccess,
averageScore,
emergenceVerified: overallSuccess && averageScore > 0.7
};
}
/**
* Run a single test scenario
*/
async runSingleTestScenario(scenario) {
const testInput = this.generateTestInput(scenario);
const startTime = Date.now();
try {
switch (scenario) {
case 'self_modification':
return await this.testSelfModification(testInput);
case 'persistent_learning':
return await this.testPersistentLearning(testInput);
case 'stochastic_exploration':
return await this.testStochasticExploration(testInput);
case 'cross_tool_sharing':
return await this.testCrossToolSharing(testInput);
case 'feedback_loops':
return await this.testFeedbackLoops(testInput);
case 'emergent_capabilities':
return await this.testEmergentCapabilities(testInput);
default:
return {
scenario,
success: false,
error: `Unknown test scenario: ${scenario}`,
duration: Date.now() - startTime
};
}
}
catch (error) {
return {
scenario,
success: false,
error: error instanceof Error ? error.message : 'Test failed',
duration: Date.now() - startTime
};
}
}
/**
* Test self-modification capabilities
*/
async testSelfModification(testInput) {
const startTime = Date.now();
// Process input that should trigger self-modification
const result = await this.emergenceSystem.processWithEmergence(testInput.selfModificationTrigger);
const modifications = result.emergenceSession.results.modifications || [];
const hasModifications = modifications.length > 0;
return {
scenario: 'self_modification',
success: hasModifications,
score: hasModifications ? 0.8 : 0.2,
evidence: {
modificationsApplied: modifications.length,
modificationTypes: modifications.map(m => m.modification),
sessionId: result.emergenceSession.sessionId
},
duration: Date.now() - startTime
};
}
/**
* Test persistent learning capabilities
*/
async testPersistentLearning(testInput) {
const startTime = Date.now();
// Process multiple related inputs to test learning
const learningSequence = testInput.learningSequence;
const results = [];
for (const input of learningSequence) {
const result = await this.emergenceSystem.processWithEmergence(input);
results.push(result);
}
// Check if later results show learning from earlier ones
const learningEvidence = results.some(r => r.emergenceSession.results.learning &&
r.emergenceSession.results.learning.success);
const stats = this.emergenceSystem.getEmergenceStats();
const hasLearningTriples = stats.components.learning.totalTriples > 0;
return {
scenario: 'persistent_learning',
success: learningEvidence && hasLearningTriples,
score: learningEvidence ? 0.9 : 0.3,
evidence: {
learningTriples: stats.components.learning.totalTriples,
sessionsProcessed: results.length,
learningDetected: learningEvidence
},
duration: Date.now() - startTime
};
}
/**
* Test stochastic exploration capabilities
*/
async testStochasticExploration(testInput) {
const startTime = Date.now();
// Generate multiple responses to same input to test variability
const responses = await this.emergenceSystem.generateEmergentResponses(testInput.explorationTrigger, 5);
// Check for diversity in responses
const diversityScore = this.calculateResponseDiversity(responses);
const hasUnpredictability = responses.some(r => r.novelty > 0.5);
return {
scenario: 'stochastic_exploration',
success: diversityScore > 0.5 && hasUnpredictability,
score: diversityScore,
evidence: {
responsesGenerated: responses.length,
diversityScore,
averageNovelty: responses.reduce((sum, r) => sum + r.novelty, 0) / responses.length,
maxNovelty: Math.max(...responses.map(r => r.novelty)),
unpredictabilityDetected: hasUnpredictability
},
duration: Date.now() - startTime
};
}
/**
* Test cross-tool sharing capabilities
*/
async testCrossToolSharing(testInput) {
const startTime = Date.now();
// Process input with multiple tools to test sharing
const mockTools = [
{ name: 'tool1', process: (input) => ({ tool1_result: input }) },
{ name: 'tool2', process: (input) => ({ tool2_result: input }) },
{ name: 'tool3', process: (input) => ({ tool3_result: input }) }
];
const result = await this.emergenceSystem.processWithEmergence(testInput.sharingTrigger, mockTools);
const sharedInfo = result.emergenceSession.results.sharedInformation || [];
const hasSharing = sharedInfo.length > 0;
const stats = this.emergenceSystem.getEmergenceStats();
const sharingStats = stats.components.sharing;
return {
scenario: 'cross_tool_sharing',
success: hasSharing && sharingStats.totalFlows > 0,
score: hasSharing ? 0.8 : 0.2,
evidence: {
sharedInformationCount: sharedInfo.length,
totalFlows: sharingStats.totalFlows,
activeConnections: sharingStats.totalConnections,
sharingDetected: hasSharing
},
duration: Date.now() - startTime
};
}
/**
* Test feedback loop capabilities
*/
async testFeedbackLoops(testInput) {
const startTime = Date.now();
// Process inputs that should trigger feedback and adaptation
const result1 = await this.emergenceSystem.processWithEmergence(testInput.feedbackTrigger);
const result2 = await this.emergenceSystem.processWithEmergence(testInput.feedbackTrigger);
const behaviorMods1 = result1.emergenceSession.results.behaviorModifications || [];
const behaviorMods2 = result2.emergenceSession.results.behaviorModifications || [];
const hasFeedback = behaviorMods1.length > 0 || behaviorMods2.length > 0;
const showsAdaptation = behaviorMods2.length !== behaviorMods1.length; // Different behavior
return {
scenario: 'feedback_loops',
success: hasFeedback,
score: hasFeedback ? (showsAdaptation ? 0.9 : 0.6) : 0.2,
evidence: {
firstSessionMods: behaviorMods1.length,
secondSessionMods: behaviorMods2.length,
adaptationDetected: showsAdaptation,
feedbackDetected: hasFeedback
},
duration: Date.now() - startTime
};
}
/**
* Test emergent capability detection
*/
async testEmergentCapabilities(testInput) {
const startTime = Date.now();
// Process novel input to trigger capability detection
const result = await this.emergenceSystem.processWithEmergence(testInput.novelTrigger);
const emergentCapabilities = result.emergenceSession.results.emergentCapabilities || [];
const hasEmergentCapabilities = emergentCapabilities.length > 0;
const capabilityAnalysis = await this.emergenceSystem.analyzeEmergentCapabilities();
return {
scenario: 'emergent_capabilities',
success: hasEmergentCapabilities,
score: hasEmergentCapabilities ? 0.9 : 0.3,
evidence: {
capabilitiesDetected: emergentCapabilities.length,
capabilityTypes: emergentCapabilities.map(c => c.type),
overallEmergenceLevel: capabilityAnalysis.overallEmergenceLevel,
emergenceVerified: hasEmergentCapabilities
},
duration: Date.now() - startTime
};
}
/**
* Generate test input for scenarios
*/
generateTestInput(scenario) {
const baseInputs = {
selfModificationTrigger: {
type: 'complex_problem',
description: 'Multi-step reasoning problem requiring adaptive approach',
complexity: 0.8,
trigger_modification: true
},
learningSequence: [
{ pattern: 'A', response: 'X', context: 'learning_session_1' },
{ pattern: 'B', response: 'Y', context: 'learning_session_2' },
{ pattern: 'A', context: 'learning_session_3_recall' } // Should recall 'X'
],
explorationTrigger: {
ambiguous_input: 'interpret this in multiple creative ways',
exploration_prompt: true,
creativity_required: 0.9
},
sharingTrigger: {
multi_domain_problem: 'solve using multiple tool perspectives',
requires_tool_coordination: true,
domains: ['mathematics', 'logic', 'creativity']
},
feedbackTrigger: {
adaptive_challenge: 'task requiring behavioral adjustment',
feedback_intensive: true,
success_criteria: 'adaptation_required'
},
novelTrigger: {
unprecedented_scenario: 'completely novel situation requiring new capabilities',
novelty_level: 0.95,
capability_emergence_expected: true
}
};
return baseInputs;
}
/**
* Calculate diversity in responses
*/
calculateResponseDiversity(responses) {
if (responses.length < 2)
return 0;
// Simple diversity measure based on response differences
let totalDiversity = 0;
let comparisons = 0;
for (let i = 0; i < responses.length; i++) {
for (let j = i + 1; j < responses.length; j++) {
const similarity = this.calculateResponseSimilarity(responses[i], responses[j]);
totalDiversity += (1 - similarity);
comparisons++;
}
}
return comparisons > 0 ? totalDiversity / comparisons : 0;
}
/**
* Calculate similarity between two responses
*/
calculateResponseSimilarity(response1, response2) {
// Simple similarity calculation
const str1 = JSON.stringify(response1.response);
const str2 = JSON.stringify(response2.response);
if (str1 === str2)
return 1.0;
// Character-level similarity
const maxLength = Math.max(str1.length, str2.length);
let matches = 0;
for (let i = 0; i < Math.min(str1.length, str2.length); i++) {
if (str1[i] === str2[i])
matches++;
}
return matches / maxLength;
}
}
@@ -0,0 +1,270 @@
export declare class EmergenceTools {
private emergenceSystem;
constructor();
getTools(): ({
name: string;
description: string;
inputSchema: {
type: string;
properties: {
input: {
description: string;
};
tools: {
type: string;
description: string;
items: {
type: string;
};
};
cursor: {
type: string;
description: string;
};
pageSize: {
type: string;
description: string;
minimum: number;
maximum: number;
};
count?: undefined;
targetCapability?: undefined;
component?: undefined;
scenarios?: undefined;
matrixOperations?: undefined;
maxDepth?: undefined;
wasmAcceleration?: undefined;
emergenceMode?: undefined;
};
required: string[];
};
} | {
name: string;
description: string;
inputSchema: {
type: string;
properties: {
input: {
description: string;
};
count: {
type: string;
description: string;
minimum: number;
maximum: number;
};
tools: {
type: string;
description: string;
items: {
type: string;
};
};
cursor?: undefined;
pageSize?: undefined;
targetCapability?: undefined;
component?: undefined;
scenarios?: undefined;
matrixOperations?: undefined;
maxDepth?: undefined;
wasmAcceleration?: undefined;
emergenceMode?: undefined;
};
required: string[];
};
} | {
name: string;
description: string;
inputSchema: {
type: string;
properties: {
input?: undefined;
tools?: undefined;
cursor?: undefined;
pageSize?: undefined;
count?: undefined;
targetCapability?: undefined;
component?: undefined;
scenarios?: undefined;
matrixOperations?: undefined;
maxDepth?: undefined;
wasmAcceleration?: undefined;
emergenceMode?: undefined;
};
required?: undefined;
};
} | {
name: string;
description: string;
inputSchema: {
type: string;
properties: {
targetCapability: {
type: string;
description: string;
};
input?: undefined;
tools?: undefined;
cursor?: undefined;
pageSize?: undefined;
count?: undefined;
component?: undefined;
scenarios?: undefined;
matrixOperations?: undefined;
maxDepth?: undefined;
wasmAcceleration?: undefined;
emergenceMode?: undefined;
};
required: string[];
};
} | {
name: string;
description: string;
inputSchema: {
type: string;
properties: {
component: {
type: string;
description: string;
enum: string[];
};
input?: undefined;
tools?: undefined;
cursor?: undefined;
pageSize?: undefined;
count?: undefined;
targetCapability?: undefined;
scenarios?: undefined;
matrixOperations?: undefined;
maxDepth?: undefined;
wasmAcceleration?: undefined;
emergenceMode?: undefined;
};
required?: undefined;
};
} | {
name: string;
description: string;
inputSchema: {
type: string;
properties: {
scenarios: {
type: string;
description: string;
items: {
type: string;
enum: string[];
};
};
input?: undefined;
tools?: undefined;
cursor?: undefined;
pageSize?: undefined;
count?: undefined;
targetCapability?: undefined;
component?: undefined;
matrixOperations?: undefined;
maxDepth?: undefined;
wasmAcceleration?: undefined;
emergenceMode?: undefined;
};
required: string[];
};
} | {
name: string;
description: string;
inputSchema: {
type: string;
properties: {
input: {
description: string;
};
matrixOperations: {
type: string;
description: string;
items: {
type: string;
enum: string[];
};
};
maxDepth: {
type: string;
description: string;
minimum: number;
maximum: number;
default: number;
};
wasmAcceleration: {
type: string;
description: string;
default: boolean;
};
emergenceMode: {
type: string;
description: string;
enum: string[];
default: string;
};
tools?: undefined;
cursor?: undefined;
pageSize?: undefined;
count?: undefined;
targetCapability?: undefined;
component?: undefined;
scenarios?: undefined;
};
required: string[];
};
})[];
handleToolCall(name: string, args: any): Promise<any>;
private processWithTimeout;
/**
* Process emergence with pagination support for large tool arrays
*/
private processWithPagination;
/**
* Matrix-focused emergence with WASM acceleration and controlled recursion
*/
private processMatrixEmergence;
/**
* Create controlled matrix tools environment with WASM acceleration
*/
private createMatrixToolsEnvironment;
/**
* Run matrix emergence with controlled mathematical recursion
*/
private runMatrixEmergence;
/**
* Explore numerical emergence patterns with WASM-accelerated computations
*/
private exploreNumericalEmergence;
/**
* Execute controlled mathematical operation with WASM acceleration
*/
private executeControlledMathOperation;
private generateMockSolutionVector;
private generateMockRankVector;
private calculateOperationEmergence;
private extractEmergentProperties;
private synthesizeMultiLevelEmergence;
private calculateMatrixEmergenceLevel;
private assessMathComplexity;
private identifyMatrixPatterns;
private exploreAlgebraicEmergence;
private exploreTemporalEmergence;
private exploreGraphEmergence;
/**
* Fixed version of runTestScenarios that doesn't hang
*/
private runTestScenariosFixed;
/**
* Fixed version that doesn't call processWithEmergence for problematic scenarios
*/
private runSingleTestScenarioFixed;
private testSelfModificationFixed;
private testPersistentLearningFixed;
private testStochasticExplorationFixed;
private testCrossToolSharingFixed;
private testFeedbackLoopsFixed;
private testEmergentCapabilitiesFixed;
}
@@ -0,0 +1,821 @@
import { EmergenceSystem } from '../../emergence/index.js';
export class EmergenceTools {
emergenceSystem;
constructor() {
this.emergenceSystem = new EmergenceSystem();
}
getTools() {
return [
{
name: 'emergence_process',
description: 'Process input through the emergence system for enhanced responses',
inputSchema: {
type: 'object',
properties: {
input: {
description: 'Input to process through emergence system'
},
tools: {
type: 'array',
description: 'Available tools for processing',
items: { type: 'object' }
},
cursor: {
type: 'string',
description: 'Pagination cursor for tools (starting index)'
},
pageSize: {
type: 'number',
description: 'Number of tools per page (default: 5, max: 10)',
minimum: 1,
maximum: 10
}
},
required: ['input']
}
},
{
name: 'emergence_generate_diverse',
description: 'Generate multiple diverse emergent responses',
inputSchema: {
type: 'object',
properties: {
input: {
description: 'Input for diverse response generation'
},
count: {
type: 'number',
description: 'Number of diverse responses',
minimum: 1,
maximum: 10
},
tools: {
type: 'array',
description: 'Available tools',
items: { type: 'object' }
}
},
required: ['input']
}
},
{
name: 'emergence_analyze_capabilities',
description: 'Analyze current emergent capabilities',
inputSchema: {
type: 'object',
properties: {}
}
},
{
name: 'emergence_force_evolution',
description: 'Force evolution toward specific capability',
inputSchema: {
type: 'object',
properties: {
targetCapability: {
type: 'string',
description: 'Target capability to evolve toward'
}
},
required: ['targetCapability']
}
},
{
name: 'emergence_get_stats',
description: 'Get comprehensive emergence statistics',
inputSchema: {
type: 'object',
properties: {
component: {
type: 'string',
description: 'Specific component to get stats for',
enum: ['all', 'self_modification', 'learning', 'exploration', 'sharing', 'feedback', 'capabilities']
}
}
}
},
{
name: 'emergence_test_scenarios',
description: 'Run test scenarios to verify emergence capabilities',
inputSchema: {
type: 'object',
properties: {
scenarios: {
type: 'array',
description: 'Test scenarios to run',
items: {
type: 'string',
enum: ['self_modification', 'persistent_learning', 'stochastic_exploration',
'cross_tool_sharing', 'feedback_loops', 'emergent_capabilities']
}
}
},
required: ['scenarios']
}
},
{
name: 'emergence_matrix_process',
description: 'Matrix-focused emergence with WASM acceleration and controlled mathematical recursion',
inputSchema: {
type: 'object',
properties: {
input: {
description: 'Mathematical input for matrix emergence processing'
},
matrixOperations: {
type: 'array',
description: 'Specific matrix operations to explore',
items: {
type: 'string',
enum: ['solve', 'analyzeMatrix', 'pageRank', 'estimateEntry', 'predictWithTemporalAdvantage']
}
},
maxDepth: {
type: 'number',
description: 'Maximum mathematical recursion depth (1-3)',
minimum: 1,
maximum: 3,
default: 2
},
wasmAcceleration: {
type: 'boolean',
description: 'Enable WASM SIMD acceleration',
default: true
},
emergenceMode: {
type: 'string',
description: 'Matrix emergence exploration mode',
enum: ['numerical', 'algebraic', 'temporal', 'graph'],
default: 'numerical'
}
},
required: ['input']
}
}
];
}
async handleToolCall(name, args) {
try {
switch (name) {
case 'emergence_process':
return await this.processWithPagination(args);
case 'emergence_generate_diverse':
return await this.emergenceSystem.generateEmergentResponses(args.input, args.count || 3, args.tools || []);
case 'emergence_analyze_capabilities':
return await this.emergenceSystem.analyzeEmergentCapabilities();
case 'emergence_force_evolution':
return await this.emergenceSystem.forceEvolution(args.targetCapability);
case 'emergence_get_stats':
return this.emergenceSystem.getEmergenceStats();
case 'emergence_test_scenarios':
return await this.runTestScenariosFixed(args.scenarios);
case 'emergence_matrix_process':
return await this.processMatrixEmergence(args);
default:
throw new Error(`Unknown emergence tool: ${name}`);
}
}
catch (error) {
return {
success: false,
error: error instanceof Error ? error.message : 'Unknown error',
tool: name,
args
};
}
}
async processWithTimeout(fn, timeoutMs) {
const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Operation timed out')), timeoutMs));
return Promise.race([fn(), timeoutPromise]);
}
/**
* Process emergence with pagination support for large tool arrays
*/
async processWithPagination(args) {
const { input, tools = [], cursor, pageSize = 5 } = args;
const MAX_PAGE_SIZE = 10;
const actualPageSize = Math.min(pageSize, MAX_PAGE_SIZE);
// Filter out problematic tools that cause hanging
const PROBLEMATIC_TOOLS = ['solve', 'analyzeMatrix', 'pageRank', 'estimateEntry', 'predictWithTemporalAdvantage'];
const safeTools = tools.filter((tool) => !PROBLEMATIC_TOOLS.includes(tool.name));
try {
// If no safe tools, return early with warning
if (safeTools.length === 0) {
return {
result: {
warning: 'All tools filtered due to hanging issues',
originalToolCount: tools.length,
filteredTools: tools.map((t) => t.name),
recommendation: 'Try with different tools or contact support'
},
pagination: {
totalTools: tools.length,
safeTools: 0,
filtered: true
}
};
}
// If safe tools are small enough, process normally
if (safeTools.length <= actualPageSize) {
const result = await this.processWithTimeout(() => this.emergenceSystem.processWithEmergence(input, safeTools), 1000 // Reduced to 1 second to prevent hanging
);
return {
...result,
pagination: {
totalTools: tools.length,
safeTools: safeTools.length,
pageSize: actualPageSize,
hasMore: false,
filtered: tools.length > safeTools.length
}
};
}
// Parse cursor to get starting index
const startIndex = cursor ? parseInt(cursor, 10) : 0;
if (isNaN(startIndex) || startIndex < 0) {
throw new Error('Invalid cursor value');
}
const endIndex = Math.min(startIndex + actualPageSize, safeTools.length);
const pageTools = safeTools.slice(startIndex, endIndex);
// Process with limited tools
const result = await this.processWithTimeout(() => this.emergenceSystem.processWithEmergence({
...input,
_pagination: {
totalTools: tools.length,
safeTools: safeTools.length,
currentPage: Math.floor(startIndex / actualPageSize) + 1,
totalPages: Math.ceil(safeTools.length / actualPageSize),
toolsInPage: pageTools.length,
filtered: tools.length > safeTools.length
}
}, pageTools), 1000 // Reduced to 1 second to prevent hanging
);
// Add pagination metadata and enforce size limits
const hasMore = endIndex < safeTools.length;
const response = {
...result,
pagination: {
cursor: startIndex.toString(),
nextCursor: hasMore ? endIndex.toString() : undefined,
pageSize: actualPageSize,
totalTools: tools.length,
safeTools: safeTools.length,
processedTools: pageTools.length,
hasMore,
currentPage: Math.floor(startIndex / actualPageSize) + 1,
totalPages: Math.ceil(safeTools.length / actualPageSize),
filtered: tools.length > safeTools.length
}
};
// Final size check and truncation
const responseStr = JSON.stringify(response);
const MAX_RESPONSE_SIZE = 20000; // 20KB limit
if (responseStr.length > MAX_RESPONSE_SIZE) {
return {
result: {
summary: 'Response truncated due to size',
originalSize: responseStr.length,
maxSize: MAX_RESPONSE_SIZE,
processedTools: pageTools.length,
toolNames: pageTools.map(t => t.name)
},
pagination: {
cursor: startIndex.toString(),
nextCursor: hasMore ? endIndex.toString() : undefined,
pageSize: actualPageSize,
totalTools: tools.length,
processedTools: pageTools.length,
hasMore,
truncated: true
}
};
}
return response;
}
catch (error) {
return {
error: error instanceof Error ? error.message : 'Processing failed',
input,
emergenceLevel: 0,
pagination: {
cursor: cursor || '0',
error: true
}
};
}
}
/**
* Matrix-focused emergence with WASM acceleration and controlled recursion
*/
async processMatrixEmergence(args) {
const { input, matrixOperations = ['solve', 'analyzeMatrix'], maxDepth = 2, wasmAcceleration = true, emergenceMode = 'numerical' } = args;
const startTime = Date.now();
try {
// Create controlled matrix tools environment
const matrixTools = this.createMatrixToolsEnvironment(matrixOperations, maxDepth, wasmAcceleration);
// Process with matrix-specific emergence patterns
const result = await this.processWithTimeout(() => this.runMatrixEmergence(input, matrixTools, emergenceMode, maxDepth), 3000 // 3 second timeout for matrix operations
);
return {
result,
matrixEmergence: {
mode: emergenceMode,
operationsUsed: matrixOperations,
maxDepth,
wasmAccelerated: wasmAcceleration,
processingTime: Date.now() - startTime,
emergenceLevel: this.calculateMatrixEmergenceLevel(result)
},
metrics: {
mathematicalComplexity: this.assessMathComplexity(result),
computationalEfficiency: wasmAcceleration ? 'wasm_simd' : 'standard',
emergencePatterns: this.identifyMatrixPatterns(result)
}
};
}
catch (error) {
return {
error: error instanceof Error ? error.message : 'Matrix emergence failed',
matrixEmergence: {
mode: emergenceMode,
operationsRequested: matrixOperations,
maxDepth,
wasmAccelerated: wasmAcceleration,
failed: true
}
};
}
}
/**
* Create controlled matrix tools environment with WASM acceleration
*/
createMatrixToolsEnvironment(operations, maxDepth, wasmAcceleration) {
const matrixTools = [];
for (const op of operations) {
switch (op) {
case 'solve':
matrixTools.push({
name: 'solve',
type: 'matrix_solver',
wasmAccelerated: wasmAcceleration,
recursionLimit: maxDepth,
method: 'neumann_series'
});
break;
case 'analyzeMatrix':
matrixTools.push({
name: 'analyzeMatrix',
type: 'matrix_analyzer',
wasmAccelerated: wasmAcceleration,
recursionLimit: maxDepth,
checkDominance: true,
estimateCondition: wasmAcceleration
});
break;
case 'pageRank':
matrixTools.push({
name: 'pageRank',
type: 'graph_algorithm',
wasmAccelerated: wasmAcceleration,
recursionLimit: maxDepth,
damping: 0.85
});
break;
case 'estimateEntry':
matrixTools.push({
name: 'estimateEntry',
type: 'sublinear_estimator',
wasmAccelerated: wasmAcceleration,
recursionLimit: maxDepth,
method: 'random_walk'
});
break;
case 'predictWithTemporalAdvantage':
matrixTools.push({
name: 'predictWithTemporalAdvantage',
type: 'temporal_solver',
wasmAccelerated: wasmAcceleration,
recursionLimit: maxDepth,
distanceKm: 10900 // Tokyo to NYC
});
break;
}
}
return matrixTools;
}
/**
* Run matrix emergence with controlled mathematical recursion
*/
async runMatrixEmergence(input, matrixTools, mode, maxDepth) {
const emergenceSession = {
sessionId: `matrix_emergence_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
startTime: Date.now(),
mode,
maxDepth,
currentDepth: 0
};
// Initialize based on emergence mode
let result = input;
const operationTrace = [];
switch (mode) {
case 'numerical':
result = await this.exploreNumericalEmergence(result, matrixTools, maxDepth, operationTrace);
break;
case 'algebraic':
result = await this.exploreAlgebraicEmergence(result, matrixTools, maxDepth, operationTrace);
break;
case 'temporal':
result = await this.exploreTemporalEmergence(result, matrixTools, maxDepth, operationTrace);
break;
case 'graph':
result = await this.exploreGraphEmergence(result, matrixTools, maxDepth, operationTrace);
break;
default:
result = await this.exploreNumericalEmergence(result, matrixTools, maxDepth, operationTrace);
}
return {
finalResult: result,
operationTrace,
emergenceSession: {
...emergenceSession,
endTime: Date.now(),
operationsPerformed: operationTrace.length
}
};
}
/**
* Explore numerical emergence patterns with WASM-accelerated computations
*/
async exploreNumericalEmergence(input, tools, maxDepth, trace) {
if (maxDepth <= 0)
return input;
let result = input;
// Apply mathematical transformations with emergence patterns
for (const tool of tools.slice(0, 2)) { // Limit to 2 tools per depth level
try {
const operation = {
tool: tool.name,
input: typeof result === 'string' ? result : JSON.stringify(result).substring(0, 100),
wasmAccelerated: tool.wasmAccelerated,
timestamp: Date.now()
};
// Simulate real mathematical computation with controlled emergence
const mathResult = await this.executeControlledMathOperation(tool, result);
operation.output = mathResult;
operation.emergenceMetrics = this.calculateOperationEmergence(mathResult);
trace.push(operation);
// Create emergent synthesis from mathematical result
result = {
mathematicalTransform: mathResult,
emergentProperties: this.extractEmergentProperties(mathResult),
originalInput: typeof input === 'string' ? input.substring(0, 50) : 'complex_input'
};
}
catch (error) {
trace.push({
tool: tool.name,
error: error instanceof Error ? error.message : 'Unknown error',
timestamp: Date.now()
});
}
}
// Recursive emergence with depth control
if (maxDepth > 1 && tools.length > 0) {
const recursiveResult = await this.exploreNumericalEmergence(result, tools.slice(1), // Use different tools for recursion
maxDepth - 1, trace);
return {
currentLevel: result,
recursiveLevel: recursiveResult,
emergenceSynthesis: this.synthesizeMultiLevelEmergence(result, recursiveResult)
};
}
return result;
}
/**
* Execute controlled mathematical operation with WASM acceleration
*/
async executeControlledMathOperation(tool, input) {
const operationId = `${tool.name}_${Date.now()}`;
// Generate realistic mathematical results based on tool type
switch (tool.type) {
case 'matrix_solver':
return {
operationId,
method: tool.method || 'neumann_series',
convergence: 0.95 + Math.random() * 0.04,
iterations: Math.floor(Math.random() * 100) + 10,
wasmAccelerated: tool.wasmAccelerated,
solutionVector: this.generateMockSolutionVector(),
computationalComplexity: tool.wasmAccelerated ? 'O(log n)' : 'O(n²)'
};
case 'matrix_analyzer':
return {
operationId,
diagonallyDominant: Math.random() > 0.3,
conditionNumber: Math.random() * 100 + 1,
spectralRadius: Math.random() * 0.95,
wasmAccelerated: tool.wasmAccelerated,
analysisTime: tool.wasmAccelerated ? Math.random() * 10 : Math.random() * 100
};
case 'graph_algorithm':
return {
operationId,
algorithm: 'pagerank',
damping: tool.damping || 0.85,
iterations: Math.floor(Math.random() * 50) + 20,
convergence: 0.98 + Math.random() * 0.02,
wasmAccelerated: tool.wasmAccelerated,
rankVector: this.generateMockRankVector()
};
case 'temporal_solver':
return {
operationId,
temporalAdvantage: tool.distanceKm ? (tool.distanceKm / 299792458) * 1000 : 36.6, // milliseconds
computationTime: tool.wasmAccelerated ? Math.random() * 5 : Math.random() * 50,
speedupFactor: tool.wasmAccelerated ? Math.random() * 1000 + 5000 : 1,
wasmAccelerated: tool.wasmAccelerated,
quantumAdvantage: tool.wasmAccelerated && Math.random() > 0.7
};
default:
return {
operationId,
result: 'mathematical_computation_complete',
wasmAccelerated: tool.wasmAccelerated,
processingTime: tool.wasmAccelerated ? Math.random() * 10 : Math.random() * 100
};
}
}
// Helper methods for matrix emergence
generateMockSolutionVector() {
return Array(5).fill(0).map(() => Math.random() * 10 - 5);
}
generateMockRankVector() {
const ranks = Array(5).fill(0).map(() => Math.random());
const sum = ranks.reduce((a, b) => a + b, 0);
return ranks.map(r => r / sum); // Normalize to sum to 1
}
calculateOperationEmergence(result) {
return {
novelty: Math.random(),
complexity: Object.keys(result).length / 10,
efficiency: result.wasmAccelerated ? Math.random() * 0.3 + 0.7 : Math.random() * 0.7
};
}
extractEmergentProperties(mathResult) {
return {
convergencePattern: mathResult.convergence ? 'exponential' : 'linear',
computationalComplexity: mathResult.computationalComplexity || 'unknown',
accelerationFactor: mathResult.wasmAccelerated ? 'high' : 'standard',
emergentInsight: 'mathematical_pattern_detected'
};
}
synthesizeMultiLevelEmergence(level1, level2) {
return {
synthesis: 'multi_level_mathematical_emergence',
patterns: ['numerical_convergence', 'computational_acceleration'],
complexity: 'high',
insight: 'recursive_mathematical_patterns_detected'
};
}
calculateMatrixEmergenceLevel(result) {
// Calculate emergence based on mathematical complexity and patterns
let score = 0;
if (result.operationTrace)
score += result.operationTrace.length * 0.1;
if (result.finalResult?.emergenceSynthesis)
score += 0.3;
if (result.finalResult?.recursiveLevel)
score += 0.2;
return Math.min(score, 1.0);
}
assessMathComplexity(result) {
const traceLength = result.operationTrace?.length || 0;
if (traceLength > 6)
return 'high';
if (traceLength > 3)
return 'medium';
return 'low';
}
identifyMatrixPatterns(result) {
const patterns = ['numerical_computation'];
if (result.finalResult?.recursiveLevel)
patterns.push('recursive_emergence');
if (result.matrixEmergence?.wasmAccelerated)
patterns.push('wasm_acceleration');
return patterns;
}
// Placeholder methods for other emergence modes
async exploreAlgebraicEmergence(input, tools, maxDepth, trace) {
return this.exploreNumericalEmergence(input, tools, maxDepth, trace);
}
async exploreTemporalEmergence(input, tools, maxDepth, trace) {
return this.exploreNumericalEmergence(input, tools, maxDepth, trace);
}
async exploreGraphEmergence(input, tools, maxDepth, trace) {
return this.exploreNumericalEmergence(input, tools, maxDepth, trace);
}
/**
* Fixed version of runTestScenarios that doesn't hang
*/
async runTestScenariosFixed(scenarios) {
const results = {
timestamp: Date.now(),
scenarios: scenarios.length,
results: []
};
for (const scenario of scenarios) {
const testResult = await this.runSingleTestScenarioFixed(scenario);
results.results.push(testResult);
}
const overallSuccess = results.results.every(r => r.success);
const averageScore = results.results.reduce((sum, r) => sum + (r.score || 0), 0) / results.results.length;
return {
...results,
overallSuccess,
averageScore,
emergenceVerified: overallSuccess && averageScore > 0.7
};
}
/**
* Fixed version that doesn't call processWithEmergence for problematic scenarios
*/
async runSingleTestScenarioFixed(scenario) {
const startTime = Date.now();
try {
switch (scenario) {
case 'self_modification':
return await this.testSelfModificationFixed();
case 'persistent_learning':
return await this.testPersistentLearningFixed();
case 'stochastic_exploration':
return await this.testStochasticExplorationFixed();
case 'cross_tool_sharing':
return await this.testCrossToolSharingFixed();
case 'feedback_loops':
return await this.testFeedbackLoopsFixed();
case 'emergent_capabilities':
return await this.testEmergentCapabilitiesFixed();
default:
return {
scenario,
success: false,
error: `Unknown test scenario: ${scenario}`,
duration: Date.now() - startTime
};
}
}
catch (error) {
return {
scenario,
success: false,
error: error instanceof Error ? error.message : 'Test failed',
duration: Date.now() - startTime
};
}
}
async testSelfModificationFixed() {
const startTime = Date.now();
// Test directly without processWithEmergence
const modifications = this.emergenceSystem.getSelfModificationEngine().generateStochasticVariations();
const hasModifications = modifications.length > 0;
return {
scenario: 'self_modification',
success: hasModifications,
score: hasModifications ? 0.8 : 0.2,
evidence: {
modificationsApplied: modifications.length,
modificationTypes: modifications.map(m => m.type),
safeguardsActive: true
},
duration: Date.now() - startTime
};
}
async testPersistentLearningFixed() {
const startTime = Date.now();
const learningSystem = this.emergenceSystem.getPersistentLearningSystem();
// Add test knowledge
await learningSystem.addKnowledge({
subject: 'test_entity',
predicate: 'has_property',
object: 'test_value',
confidence: 0.9,
timestamp: Date.now(),
sessionId: 'test_session',
sources: ['test']
});
// Query to verify learning
const knowledge = learningSystem.queryKnowledge('test_entity');
const hasLearning = knowledge.length > 0;
return {
scenario: 'persistent_learning',
success: hasLearning,
score: hasLearning ? 0.9 : 0.3,
evidence: {
learningTriples: knowledge.length,
confidence: knowledge[0]?.confidence || 0,
sessionActive: true
},
duration: Date.now() - startTime
};
}
async testStochasticExplorationFixed() {
const startTime = Date.now();
const responses = [];
const explorationEngine = this.emergenceSystem.getStochasticExplorationEngine();
for (let i = 0; i < 5; i++) {
const result = await explorationEngine.exploreUnpredictably('test input ' + i, []);
responses.push(result);
}
// Calculate diversity
const noveltyScores = responses.map(r => r.novelty);
const averageNovelty = noveltyScores.reduce((a, b) => a + b, 0) / noveltyScores.length;
return {
scenario: 'stochastic_exploration',
success: averageNovelty > 0.5,
score: averageNovelty,
evidence: {
responsesGenerated: responses.length,
diversityScore: averageNovelty,
averageNovelty,
maxNovelty: Math.max(...noveltyScores),
unpredictabilityDetected: true
},
duration: Date.now() - startTime
};
}
async testCrossToolSharingFixed() {
const startTime = Date.now();
const sharingSystem = this.emergenceSystem.getCrossToolSharingSystem();
// Share test information
const sharedInfo = {
id: `test_${Date.now()}`,
sourceTools: ['tool1'],
targetTools: ['tool2'],
content: { test: 'data' },
type: 'insight',
timestamp: Date.now(),
relevance: 0.8,
persistence: 'session',
metadata: { test: true }
};
const interestedTools = await sharingSystem.shareInformation(sharedInfo);
const hasSharing = interestedTools.length >= 0;
return {
scenario: 'cross_tool_sharing',
success: hasSharing,
score: hasSharing ? 0.85 : 0.3,
evidence: {
sharedInformationCount: 1,
targetedTools: interestedTools.length,
connectionEstablished: hasSharing
},
duration: Date.now() - startTime
};
}
async testFeedbackLoopsFixed() {
const startTime = Date.now();
const feedbackSystem = this.emergenceSystem.getFeedbackLoopSystem();
const feedback = {
id: `test_feedback_${Date.now()}`,
source: 'test',
type: 'success',
action: 'test_action',
outcome: { result: 'success' },
expected: { result: 'success' },
surprise: 0.2,
utility: 0.8,
timestamp: Date.now(),
context: { test: true }
};
const adaptations = await feedbackSystem.processFeedback(feedback);
const hasAdaptation = adaptations.length > 0;
return {
scenario: 'feedback_loops',
success: hasAdaptation,
score: hasAdaptation ? 0.75 : 0.4,
evidence: {
feedbackProcessed: true,
adaptationsGenerated: adaptations.length,
behaviorModified: hasAdaptation
},
duration: Date.now() - startTime
};
}
async testEmergentCapabilitiesFixed() {
const startTime = Date.now();
const detector = this.emergenceSystem.getEmergentCapabilityDetector();
const metrics = await detector.measureEmergenceMetrics();
const hasCapabilities = metrics.emergenceRate > 0 || metrics.diversityScore > 0;
return {
scenario: 'emergent_capabilities',
success: hasCapabilities,
score: metrics.emergenceRate || 0.5,
evidence: {
emergenceRate: metrics.emergenceRate,
stabilityIndex: metrics.stabilityIndex,
complexityGrowth: metrics.complexityGrowth
},
duration: Date.now() - startTime
};
}
}
+110
View File
@@ -0,0 +1,110 @@
/**
* MCP Tools for graph algorithms using sublinear solvers
*/
import { Matrix, Vector, PageRankParams, EffectiveResistanceParams } from '../../core/types.js';
export declare class GraphTools {
/**
* Compute PageRank using sublinear solver
*/
static pageRank(params: PageRankParams): Promise<{
pageRankVector: Vector;
topNodes: {
node: number;
score: number;
}[];
bottomNodes: {
node: number;
score: number;
}[];
statistics: {
totalScore: number;
maxScore: number;
minScore: number;
mean: number;
standardDeviation: number;
entropy: number;
convergenceInfo: {
damping: number;
personalized: boolean;
};
};
distribution: {
quantiles: Record<string, number>;
concentrationRatio: number;
};
}>;
/**
* Compute personalized PageRank for specific nodes
*/
static personalizedPageRank(adjacency: Matrix, personalizeNodes: number[], params?: Partial<PageRankParams>): Promise<{
personalizedFor: number[];
influence: {
directInfluence: number[];
totalInfluence: number;
};
pageRankVector: Vector;
topNodes: {
node: number;
score: number;
}[];
bottomNodes: {
node: number;
score: number;
}[];
statistics: {
totalScore: number;
maxScore: number;
minScore: number;
mean: number;
standardDeviation: number;
entropy: number;
convergenceInfo: {
damping: number;
personalized: boolean;
};
};
distribution: {
quantiles: Record<string, number>;
concentrationRatio: number;
};
}>;
/**
* Compute effective resistance between nodes
*/
static effectiveResistance(params: EffectiveResistanceParams): Promise<{
effectiveResistance: number;
voltage: number[];
source: number;
target: number;
convergenceInfo: {
iterations: number;
residual: number;
converged: boolean;
};
}>;
/**
* Compute centrality measures using sublinear methods
*/
static computeCentralities(adjacency: Matrix, measures?: string[]): Promise<Record<string, any>>;
/**
* Detect communities using spectral methods
*/
static detectCommunities(adjacency: Matrix, numCommunities?: number): Promise<{
communities: number[][];
assignments: any[];
modularity: number;
quality: {
numCommunities: number;
largestCommunity: number;
smallestCommunity: number;
};
}>;
private static computeQuantiles;
private static createGroundedLaplacian;
private static createNormalizedLaplacian;
private static closenessCentrality;
private static betweennessCentrality;
private static computeModularity;
private static countEdges;
private static getNodeDegree;
}
+330
View File
@@ -0,0 +1,330 @@
/**
* MCP Tools for graph algorithms using sublinear solvers
*/
import { SublinearSolver } from '../../core/solver.js';
import { MatrixOperations } from '../../core/matrix.js';
import { VectorOperations } from '../../core/utils.js';
import { SolverError, ErrorCodes } from '../../core/types.js';
export class GraphTools {
/**
* Compute PageRank using sublinear solver
*/
static async pageRank(params) {
MatrixOperations.validateMatrix(params.adjacency);
if (params.adjacency.rows !== params.adjacency.cols) {
throw new SolverError('Adjacency matrix must be square', ErrorCodes.INVALID_DIMENSIONS);
}
const config = {
method: 'neumann',
epsilon: params.epsilon || 1e-6,
maxIterations: params.maxIterations || 1000,
enableProgress: false
};
const solver = new SublinearSolver(config);
const pageRankConfig = {
damping: params.damping || 0.85,
personalized: params.personalized,
epsilon: params.epsilon || 1e-6,
maxIterations: params.maxIterations || 1000
};
const pageRankVector = await solver.computePageRank(params.adjacency, pageRankConfig);
// Analyze results
const ranked = pageRankVector
.map((score, index) => ({ node: index, score }))
.sort((a, b) => b.score - a.score);
const totalScore = pageRankVector.reduce((sum, score) => sum + score, 0);
const maxScore = Math.max(...pageRankVector);
const minScore = Math.min(...pageRankVector);
// Compute distribution statistics
const mean = totalScore / pageRankVector.length;
const variance = pageRankVector.reduce((sum, score) => sum + (score - mean) ** 2, 0) / pageRankVector.length;
const entropy = -pageRankVector.reduce((sum, score) => {
if (score > 0) {
return sum + score * Math.log(score);
}
return sum;
}, 0);
return {
pageRankVector,
topNodes: ranked.slice(0, Math.min(10, ranked.length)),
bottomNodes: ranked.slice(-Math.min(10, ranked.length)).reverse(),
statistics: {
totalScore,
maxScore,
minScore,
mean,
standardDeviation: Math.sqrt(variance),
entropy,
convergenceInfo: {
damping: pageRankConfig.damping,
personalized: !!params.personalized
}
},
distribution: {
quantiles: this.computeQuantiles(pageRankVector, [0.1, 0.25, 0.5, 0.75, 0.9]),
concentrationRatio: ranked.slice(0, Math.ceil(ranked.length * 0.1))
.reduce((sum, item) => sum + item.score, 0) / totalScore
}
};
}
/**
* Compute personalized PageRank for specific nodes
*/
static async personalizedPageRank(adjacency, personalizeNodes, params = {}) {
const n = adjacency.rows;
const personalized = VectorOperations.zeros(n);
// Set personalization vector
const weight = 1.0 / personalizeNodes.length;
for (const node of personalizeNodes) {
if (node < 0 || node >= n) {
throw new SolverError(`Node ${node} out of bounds`, ErrorCodes.INVALID_PARAMETERS);
}
personalized[node] = weight;
}
const result = await this.pageRank({
adjacency,
personalized,
...params
});
return {
...result,
personalizedFor: personalizeNodes,
influence: {
directInfluence: personalizeNodes.map(node => result.pageRankVector[node]),
totalInfluence: personalizeNodes.reduce((sum, node) => sum + result.pageRankVector[node], 0)
}
};
}
/**
* Compute effective resistance between nodes
*/
static async effectiveResistance(params) {
MatrixOperations.validateMatrix(params.laplacian);
if (params.source < 0 || params.source >= params.laplacian.rows) {
throw new SolverError(`Source node ${params.source} out of bounds`, ErrorCodes.INVALID_PARAMETERS);
}
if (params.target < 0 || params.target >= params.laplacian.rows) {
throw new SolverError(`Target node ${params.target} out of bounds`, ErrorCodes.INVALID_PARAMETERS);
}
const n = params.laplacian.rows;
// Create indicator vector e_s - e_t
const indicator = VectorOperations.zeros(n);
indicator[params.source] = 1;
indicator[params.target] = -1;
// We need to solve the pseudoinverse, which requires handling the null space
// For a connected graph, we can use the grounded Laplacian (remove one row/column)
const groundedLaplacian = this.createGroundedLaplacian(params.laplacian);
const config = {
method: 'neumann',
epsilon: params.epsilon || 1e-6,
maxIterations: 1000,
enableProgress: false
};
const solver = new SublinearSolver(config);
// Remove the grounded node from the indicator vector
const groundedIndicator = indicator.slice(0, n - 1);
try {
const result = await solver.solve(groundedLaplacian, groundedIndicator);
const voltage = [...result.solution, 0]; // Add back the grounded node
// Effective resistance is the voltage difference
const resistance = voltage[params.source] - voltage[params.target];
return {
effectiveResistance: Math.abs(resistance),
voltage,
source: params.source,
target: params.target,
convergenceInfo: {
iterations: result.iterations,
residual: result.residual,
converged: result.converged
}
};
}
catch (error) {
throw new SolverError(`Failed to compute effective resistance: ${error}`, ErrorCodes.CONVERGENCE_FAILED);
}
}
/**
* Compute centrality measures using sublinear methods
*/
static async computeCentralities(adjacency, measures = ['pagerank', 'closeness']) {
const results = {};
if (measures.includes('pagerank')) {
results.pagerank = await this.pageRank({ adjacency });
}
if (measures.includes('closeness')) {
results.closeness = await this.closenessCentrality(adjacency);
}
if (measures.includes('betweenness')) {
results.betweenness = await this.betweennessCentrality(adjacency);
}
return results;
}
/**
* Detect communities using spectral methods
*/
static async detectCommunities(adjacency, numCommunities = 2) {
// Create normalized Laplacian
const laplacian = this.createNormalizedLaplacian(adjacency);
// This is a simplified approach - in practice would need eigenvector computation
const config = {
method: 'random-walk',
epsilon: 1e-4,
maxIterations: 500,
enableProgress: false
};
const solver = new SublinearSolver(config);
const n = adjacency.rows;
// Use random walk mixing as a proxy for community structure
const communities = Array(numCommunities).fill(null).map(() => []);
const assignments = new Array(n);
// Simplified community assignment based on PageRank clustering
const pageRankResult = await this.pageRank({ adjacency });
const sortedNodes = pageRankResult.topNodes;
// Assign nodes to communities in round-robin fashion (simplified)
for (let i = 0; i < n; i++) {
const community = i % numCommunities;
communities[community].push(sortedNodes[i]?.node ?? i);
assignments[sortedNodes[i]?.node ?? i] = community;
}
return {
communities,
assignments,
modularity: this.computeModularity(adjacency, assignments),
quality: {
numCommunities,
largestCommunity: Math.max(...communities.map(c => c.length)),
smallestCommunity: Math.min(...communities.map(c => c.length))
}
};
}
static computeQuantiles(values, quantiles) {
const sorted = [...values].sort((a, b) => a - b);
const result = {};
for (const q of quantiles) {
const index = Math.floor(q * (sorted.length - 1));
result[`q${(q * 100).toFixed(0)}`] = sorted[index];
}
return result;
}
static createGroundedLaplacian(laplacian) {
const n = laplacian.rows;
if (laplacian.format === 'dense') {
const dense = laplacian;
const groundedData = dense.data.slice(0, n - 1).map((row) => row.slice(0, n - 1));
return {
rows: n - 1,
cols: n - 1,
data: groundedData,
format: 'dense'
};
}
else {
// For sparse matrices, filter out entries in the last row/column
const sparse = laplacian;
const values = [];
const rowIndices = [];
const colIndices = [];
for (let k = 0; k < sparse.values.length; k++) {
if (sparse.rowIndices[k] < n - 1 && sparse.colIndices[k] < n - 1) {
values.push(sparse.values[k]);
rowIndices.push(sparse.rowIndices[k]);
colIndices.push(sparse.colIndices[k]);
}
}
return {
rows: n - 1,
cols: n - 1,
values,
rowIndices,
colIndices,
format: 'coo'
};
}
}
static createNormalizedLaplacian(adjacency) {
const n = adjacency.rows;
const degrees = new Array(n).fill(0);
// Compute degrees
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
degrees[i] += MatrixOperations.getEntry(adjacency, i, j);
}
}
// Create normalized Laplacian: L = I - D^(-1/2) A D^(-1/2)
const data = Array(n).fill(null).map(() => Array(n).fill(0));
for (let i = 0; i < n; i++) {
data[i][i] = 1; // Identity part
for (let j = 0; j < n; j++) {
if (i !== j && degrees[i] > 0 && degrees[j] > 0) {
const normalization = Math.sqrt(degrees[i] * degrees[j]);
data[i][j] = -MatrixOperations.getEntry(adjacency, i, j) / normalization;
}
}
}
return {
rows: n,
cols: n,
data,
format: 'dense'
};
}
static async closenessCentrality(adjacency) {
// Simplified implementation - would need all-pairs shortest paths
const n = adjacency.rows;
const closeness = new Array(n).fill(0);
// This is a placeholder - actual implementation would compute shortest paths
for (let i = 0; i < n; i++) {
closeness[i] = Math.random(); // Placeholder
}
return {
closenessVector: closeness,
normalized: closeness.map(c => c / (n - 1))
};
}
static async betweennessCentrality(adjacency) {
// Simplified implementation - would need shortest path counting
const n = adjacency.rows;
const betweenness = new Array(n).fill(0);
// This is a placeholder - actual implementation would use Brandes' algorithm
for (let i = 0; i < n; i++) {
betweenness[i] = Math.random(); // Placeholder
}
return {
betweennessVector: betweenness,
normalized: betweenness.map(b => b / ((n - 1) * (n - 2) / 2))
};
}
static computeModularity(adjacency, assignments) {
const n = adjacency.rows;
const m = this.countEdges(adjacency);
let modularity = 0;
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (assignments[i] === assignments[j]) {
const aij = MatrixOperations.getEntry(adjacency, i, j);
const ki = this.getNodeDegree(adjacency, i);
const kj = this.getNodeDegree(adjacency, j);
modularity += aij - (ki * kj) / (2 * m);
}
}
}
return modularity / (2 * m);
}
static countEdges(adjacency) {
let edges = 0;
for (let i = 0; i < adjacency.rows; i++) {
for (let j = 0; j < adjacency.cols; j++) {
edges += MatrixOperations.getEntry(adjacency, i, j);
}
}
return edges / 2; // Assuming undirected graph
}
static getNodeDegree(adjacency, node) {
let degree = 0;
for (let j = 0; j < adjacency.cols; j++) {
degree += MatrixOperations.getEntry(adjacency, node, j);
}
return degree;
}
}
+143
View File
@@ -0,0 +1,143 @@
/**
* MCP Tools Export
*
* This module exports all MCP tool classes and provides
* a consolidated tool list for the MCP server
*/
import { SolverTools } from './solver.js';
import { MatrixTools } from './matrix.js';
import { EmergenceTools } from './emergence-tools.js';
import { ConsciousnessTools } from './consciousness.js';
import { SchedulerTools } from './scheduler.js';
import { PsychoSymbolicTools } from './psycho-symbolic.js';
export { SolverTools } from './solver.js';
export { MatrixTools } from './matrix.js';
export { EmergenceTools } from './emergence-tools.js';
export { ConsciousnessTools } from './consciousness.js';
export { SchedulerTools } from './scheduler.js';
export { PsychoSymbolicTools } from './psycho-symbolic.js';
export { WasmSublinearSolverTools } from './wasm-sublinear-solver.js';
export { temporalAttractorHandlers } from './temporal-attractor-handlers.js';
export declare const solverTools: any;
export declare const matrixTools: any;
export declare const emergenceTools: any;
export declare const consciousnessTools: any;
export declare const schedulerTools: any;
export declare const psychoSymbolicTools: any;
export { temporalAttractorTools } from './temporal-attractor.js';
export declare const allTools: any[];
declare const _default: {
solver: SolverTools;
matrix: MatrixTools;
emergence: EmergenceTools;
consciousness: ConsciousnessTools;
scheduler: SchedulerTools;
psychoSymbolic: PsychoSymbolicTools;
temporalAttractor: {
chaos_analyze: (args: any) => Promise<{
lambda: any;
is_chaotic: any;
chaos_level: any;
lyapunov_time: any;
doubling_time: any;
safe_prediction_steps: any;
pairs_found: any;
interpretation: string;
}>;
temporal_delay_embed: (args: any) => Promise<{
original_length: any;
embedded_vectors: number;
embedding_dim: any;
tau: any;
data: any;
}>;
temporal_predict: (args: any) => Promise<{
initialized: boolean;
reservoir_size: any;
training_complete?: undefined;
mse?: undefined;
n_samples?: undefined;
input?: undefined;
prediction?: undefined;
trajectory?: undefined;
n_steps?: undefined;
} | {
training_complete: boolean;
mse: any;
n_samples: any;
initialized?: undefined;
reservoir_size?: undefined;
input?: undefined;
prediction?: undefined;
trajectory?: undefined;
n_steps?: undefined;
} | {
input: any;
prediction: any;
initialized?: undefined;
reservoir_size?: undefined;
training_complete?: undefined;
mse?: undefined;
n_samples?: undefined;
trajectory?: undefined;
n_steps?: undefined;
} | {
input: any;
trajectory: any;
n_steps: any;
initialized?: undefined;
reservoir_size?: undefined;
training_complete?: undefined;
mse?: undefined;
n_samples?: undefined;
prediction?: undefined;
}>;
temporal_fractal_dimension: (args: any) => Promise<{
fractal_dimension: any;
interpretation: string;
}>;
temporal_regime_changes: (args: any) => Promise<{
n_windows: any;
lyapunov_values: any;
changes_detected: boolean;
max_lambda: number;
min_lambda: number;
variance: number;
}>;
temporal_generate_attractor: (args: any) => Promise<{
system: any;
n_points: any;
dimensions: any;
dt: any;
data: any;
}>;
temporal_interpret_chaos: (args: any) => Promise<any>;
temporal_recommend_parameters: (args: any) => Promise<any>;
temporal_attractor_pullback: (args: any) => Promise<{
ensemble_size: any;
evolution_time: any;
snapshots: any[];
drift: any[];
convergence_rate: number;
}>;
temporal_kaplan_yorke_dimension: (args: any) => Promise<{
kaplan_yorke_dimension: number;
lyapunov_spectrum: any;
interpretation: string;
}>;
};
SolverTools: typeof SolverTools;
MatrixTools: typeof MatrixTools;
EmergenceTools: typeof EmergenceTools;
ConsciousnessTools: typeof ConsciousnessTools;
SchedulerTools: typeof SchedulerTools;
PsychoSymbolicTools: typeof PsychoSymbolicTools;
solverTools: any;
matrixTools: any;
emergenceTools: any;
consciousnessTools: any;
schedulerTools: any;
psychoSymbolicTools: any;
allTools: any[];
};
export default _default;
+79
View File
@@ -0,0 +1,79 @@
/**
* MCP Tools Export
*
* This module exports all MCP tool classes and provides
* a consolidated tool list for the MCP server
*/
// Import all tool classes
import { SolverTools } from './solver.js';
import { MatrixTools } from './matrix.js';
import { EmergenceTools } from './emergence-tools.js';
import { ConsciousnessTools } from './consciousness.js';
import { SchedulerTools } from './scheduler.js';
import { PsychoSymbolicTools } from './psycho-symbolic.js';
import { WasmSublinearSolverTools } from './wasm-sublinear-solver.js';
import { temporalAttractorTools } from './temporal-attractor.js';
import { temporalAttractorHandlers } from './temporal-attractor-handlers.js';
// Export classes for direct usage
export { SolverTools } from './solver.js';
export { MatrixTools } from './matrix.js';
export { EmergenceTools } from './emergence-tools.js';
export { ConsciousnessTools } from './consciousness.js';
export { SchedulerTools } from './scheduler.js';
export { PsychoSymbolicTools } from './psycho-symbolic.js';
export { WasmSublinearSolverTools } from './wasm-sublinear-solver.js';
export { temporalAttractorHandlers } from './temporal-attractor-handlers.js';
// Create instances for getting tool definitions
const solverToolsInstance = new SolverTools();
const matrixToolsInstance = new MatrixTools();
const emergenceToolsInstance = new EmergenceTools();
const consciousnessToolsInstance = new ConsciousnessTools();
const schedulerToolsInstance = new SchedulerTools();
const psychoSymbolicToolsInstance = new PsychoSymbolicTools();
const wasmSolverToolsInstance = new WasmSublinearSolverTools();
// Export tool arrays (if classes have getTools method, otherwise empty)
export const solverTools = solverToolsInstance.getTools?.() || [];
export const matrixTools = matrixToolsInstance.getTools?.() || [];
export const emergenceTools = emergenceToolsInstance.getTools?.() || [];
export const consciousnessTools = consciousnessToolsInstance.getTools?.() || [];
export const schedulerTools = schedulerToolsInstance.getTools?.() || [];
export const psychoSymbolicTools = psychoSymbolicToolsInstance.getTools?.() || [];
// Temporal attractor tools are exported directly from the file
export { temporalAttractorTools } from './temporal-attractor.js';
// For backward compatibility - if getTools doesn't exist,
// we'll assume the tools are defined in the MCP server itself
export const allTools = [
...solverTools,
...matrixTools,
...emergenceTools,
...consciousnessTools,
...schedulerTools,
...psychoSymbolicTools,
...temporalAttractorTools
];
// Default export with both instances and classes
export default {
// Instances (for calling methods)
solver: solverToolsInstance,
matrix: matrixToolsInstance,
emergence: emergenceToolsInstance,
consciousness: consciousnessToolsInstance,
scheduler: schedulerToolsInstance,
psychoSymbolic: psychoSymbolicToolsInstance,
temporalAttractor: temporalAttractorHandlers,
// Classes (for creating new instances)
SolverTools,
MatrixTools,
EmergenceTools,
ConsciousnessTools,
SchedulerTools,
PsychoSymbolicTools,
// Tool arrays (may be empty if getTools doesn't exist)
solverTools,
matrixTools,
emergenceTools,
consciousnessTools,
schedulerTools,
psychoSymbolicTools,
allTools
};
+50
View File
@@ -0,0 +1,50 @@
/**
* MCP Tools for matrix analysis and operations
*/
import { Matrix, AnalyzeMatrixParams, MatrixAnalysis } from '../../core/types.js';
export declare class MatrixTools {
/**
* Analyze matrix properties
*/
static analyzeMatrix(params: AnalyzeMatrixParams): MatrixAnalysis & {
recommendations: string[];
performance: {
expectedComplexity: string;
memoryUsage: string;
recommendedMethod: string;
};
visualMetrics: {
bandwidth: number;
profileMetric: number;
fillRatio: number;
};
};
/**
* Check matrix conditioning and stability
*/
static checkConditioning(matrix: Matrix): {
isWellConditioned: boolean;
conditionEstimate?: number;
stabilityRating: 'excellent' | 'good' | 'fair' | 'poor';
warnings: string[];
};
/**
* Convert between matrix formats
*/
static convertFormat(matrix: Matrix, targetFormat: 'dense' | 'coo'): Matrix;
/**
* Generate test matrices for benchmarking
*/
static generateTestMatrix(type: string, size: number, params?: any): Matrix;
private static computeBandwidth;
private static computeProfile;
private static predictComplexity;
private static estimateMemoryUsage;
private static recommendSolverMethod;
private static generateDetailedRecommendations;
private static estimateConditionNumber;
private static generateDiagonallyDominantMatrix;
private static generateLaplacianMatrix;
private static generateRandomSparseMatrix;
private static generateTridiagonalMatrix;
}
+350
View File
@@ -0,0 +1,350 @@
/**
* MCP Tools for matrix analysis and operations
*/
import { MatrixOperations } from '../../core/matrix.js';
import { SolverError, ErrorCodes } from '../../core/types.js';
export class MatrixTools {
/**
* Analyze matrix properties
*/
static analyzeMatrix(params) {
MatrixOperations.validateMatrix(params.matrix);
const analysis = MatrixOperations.analyzeMatrix(params.matrix);
const matrix = params.matrix;
// Enhanced analysis
const bandwidth = this.computeBandwidth(matrix);
const profileMetric = this.computeProfile(matrix);
const fillRatio = 1 - analysis.sparsity;
// Generate performance predictions
const expectedComplexity = this.predictComplexity(analysis, matrix);
const memoryUsage = this.estimateMemoryUsage(matrix);
const recommendedMethod = this.recommendSolverMethod(analysis);
// Generate recommendations
const recommendations = this.generateDetailedRecommendations(analysis, {
bandwidth,
profileMetric,
fillRatio,
size: matrix.rows
});
return {
...analysis,
recommendations,
performance: {
expectedComplexity,
memoryUsage,
recommendedMethod
},
visualMetrics: {
bandwidth,
profileMetric,
fillRatio
}
};
}
/**
* Check matrix conditioning and stability
*/
static checkConditioning(matrix) {
const analysis = MatrixOperations.analyzeMatrix(matrix);
const warnings = [];
// Check diagonal dominance strength
let stabilityRating = 'excellent';
if (!analysis.isDiagonallyDominant) {
warnings.push('Matrix is not diagonally dominant');
stabilityRating = 'poor';
}
else if (analysis.dominanceStrength < 0.1) {
warnings.push('Weak diagonal dominance - may converge slowly');
stabilityRating = 'fair';
}
else if (analysis.dominanceStrength < 0.5) {
stabilityRating = 'good';
}
// Check for zero or near-zero diagonals
const diagonals = MatrixOperations.getDiagonalVector(matrix);
const nearZeroDiagonals = diagonals.filter(d => Math.abs(d) < 1e-12);
if (nearZeroDiagonals.length > 0) {
warnings.push(`${nearZeroDiagonals.length} near-zero diagonal elements detected`);
stabilityRating = 'poor';
}
// Rough condition number estimate for small matrices
let conditionEstimate;
if (matrix.rows <= 100 && matrix.format === 'dense') {
conditionEstimate = this.estimateConditionNumber(matrix);
if (conditionEstimate > 1e12) {
warnings.push('Very high condition number - matrix is nearly singular');
stabilityRating = 'poor';
}
else if (conditionEstimate > 1e6) {
warnings.push('High condition number - may have numerical issues');
if (stabilityRating === 'excellent')
stabilityRating = 'fair';
}
}
return {
isWellConditioned: warnings.length === 0 && analysis.isDiagonallyDominant,
conditionEstimate,
stabilityRating,
warnings
};
}
/**
* Convert between matrix formats
*/
static convertFormat(matrix, targetFormat) {
MatrixOperations.validateMatrix(matrix);
if (matrix.format === targetFormat) {
return matrix;
}
if (targetFormat === 'dense') {
return MatrixOperations.sparseToDense(matrix);
}
else {
return MatrixOperations.denseToSparse(matrix);
}
}
/**
* Generate test matrices for benchmarking
*/
static generateTestMatrix(type, size, params = {}) {
switch (type) {
case 'diagonally-dominant':
return this.generateDiagonallyDominantMatrix(size, params.strength || 2.0);
case 'laplacian':
return this.generateLaplacianMatrix(size, params.connectivity || 0.1);
case 'random-sparse':
return this.generateRandomSparseMatrix(size, params.density || 0.1, params.dominance || true);
case 'tridiagonal':
return this.generateTridiagonalMatrix(size, params.offDiagonal || -1);
default:
throw new SolverError(`Unknown test matrix type: ${type}`, ErrorCodes.INVALID_PARAMETERS);
}
}
static computeBandwidth(matrix) {
if (matrix.format === 'dense') {
let maxBandwidth = 0;
for (let i = 0; i < matrix.rows; i++) {
for (let j = 0; j < matrix.cols; j++) {
if (Math.abs(MatrixOperations.getEntry(matrix, i, j)) > 1e-15) {
maxBandwidth = Math.max(maxBandwidth, Math.abs(i - j));
}
}
}
return maxBandwidth;
}
else {
const sparse = matrix;
let maxBandwidth = 0;
for (let k = 0; k < sparse.values.length; k++) {
const bandwidth = Math.abs(sparse.rowIndices[k] - sparse.colIndices[k]);
maxBandwidth = Math.max(maxBandwidth, bandwidth);
}
return maxBandwidth;
}
}
static computeProfile(matrix) {
let profile = 0;
for (let i = 0; i < matrix.rows; i++) {
let firstNonZero = matrix.cols;
for (let j = 0; j <= i; j++) {
if (Math.abs(MatrixOperations.getEntry(matrix, i, j)) > 1e-15) {
firstNonZero = j;
break;
}
}
profile += (i - firstNonZero + 1);
}
return profile;
}
static predictComplexity(analysis, matrix) {
const n = matrix.rows;
const nnz = Math.round((1 - analysis.sparsity) * n * n);
if (analysis.isDiagonallyDominant) {
if (analysis.dominanceStrength > 0.5) {
return `O(nnz * log n) ≈ O(${nnz} * ${Math.ceil(Math.log2(n))})`;
}
else {
return `O(nnz * n^0.5) ≈ O(${nnz} * ${Math.ceil(Math.sqrt(n))})`;
}
}
else {
return `O(n^3) ≈ O(${n}^3) - not suitable for sublinear methods`;
}
}
static estimateMemoryUsage(matrix) {
const n = matrix.rows;
const elementSize = 8; // 64-bit floats
if (matrix.format === 'dense') {
const mb = (n * n * elementSize) / (1024 * 1024);
return `${mb.toFixed(1)} MB (dense)`;
}
else {
const sparse = matrix;
const mb = (sparse.values.length * 3 * elementSize) / (1024 * 1024); // values + 2 index arrays
return `${mb.toFixed(1)} MB (sparse)`;
}
}
static recommendSolverMethod(analysis) {
if (!analysis.isDiagonallyDominant) {
return 'Direct solver (LU/Cholesky) - matrix not suitable for sublinear methods';
}
if (analysis.isSymmetric) {
return 'Neumann series or Forward Push (symmetric case)';
}
else {
if (analysis.dominanceStrength > 0.3) {
return 'Random Walk or Bidirectional Push';
}
else {
return 'Forward Push with preconditioning';
}
}
}
static generateDetailedRecommendations(analysis, metrics) {
const recommendations = [];
if (!analysis.isDiagonallyDominant) {
recommendations.push('Matrix is not diagonally dominant. Consider matrix preconditioning or regularization.');
recommendations.push('Use direct solvers (LU, QR) instead of iterative methods.');
}
else {
if (analysis.dominanceStrength < 0.1) {
recommendations.push('Weak diagonal dominance. Consider diagonal scaling or row equilibration.');
}
if (analysis.sparsity > 0.95) {
recommendations.push('Extremely sparse matrix. Use sparse storage formats and specialized algorithms.');
}
if (metrics.bandwidth > analysis.size.rows * 0.1) {
recommendations.push('Large bandwidth detected. Consider matrix reordering (RCM, AMD).');
}
if (metrics.size > 10000) {
recommendations.push('Large matrix. Consider sublinear estimation for specific entries rather than full solve.');
recommendations.push('Use random walk sampling for single coordinate queries.');
}
if (!analysis.isSymmetric) {
recommendations.push('Asymmetric matrix. Random walk methods may be most effective.');
recommendations.push('Consider bidirectional push for better convergence.');
}
}
if (metrics.fillRatio > 0.5) {
recommendations.push('Dense matrix. Memory usage may be significant for large sizes.');
}
return recommendations;
}
static estimateConditionNumber(matrix) {
// Very rough estimate using diagonal dominance
if (matrix.format !== 'dense' || matrix.rows > 100) {
return NaN;
}
const diagonals = MatrixOperations.getDiagonalVector(matrix);
const maxDiag = Math.max(...diagonals.map(Math.abs));
const minDiag = Math.min(...diagonals.map(Math.abs));
if (minDiag === 0) {
return Infinity;
}
return maxDiag / minDiag; // Very rough approximation
}
static generateDiagonallyDominantMatrix(size, strength) {
const data = Array(size).fill(null).map(() => Array(size).fill(0));
for (let i = 0; i < size; i++) {
let offDiagSum = 0;
// Fill off-diagonal entries
for (let j = 0; j < size; j++) {
if (i !== j && Math.random() < 0.3) { // 30% sparsity
const value = (Math.random() - 0.5) * 2;
data[i][j] = value;
offDiagSum += Math.abs(value);
}
}
// Set diagonal to ensure dominance
data[i][i] = strength * offDiagSum + 1;
}
return {
rows: size,
cols: size,
data,
format: 'dense'
};
}
static generateLaplacianMatrix(size, connectivity) {
const data = Array(size).fill(null).map(() => Array(size).fill(0));
for (let i = 0; i < size; i++) {
let degree = 0;
for (let j = 0; j < size; j++) {
if (i !== j && Math.random() < connectivity) {
data[i][j] = -1;
degree++;
}
}
data[i][i] = degree;
}
return {
rows: size,
cols: size,
data,
format: 'dense'
};
}
static generateRandomSparseMatrix(size, density, ensureDominance) {
const values = [];
const rowIndices = [];
const colIndices = [];
const rowSums = new Array(size).fill(0);
// Generate off-diagonal entries
for (let i = 0; i < size; i++) {
for (let j = 0; j < size; j++) {
if (i !== j && Math.random() < density) {
const value = (Math.random() - 0.5) * 2;
values.push(value);
rowIndices.push(i);
colIndices.push(j);
rowSums[i] += Math.abs(value);
}
}
}
// Add diagonal entries
for (let i = 0; i < size; i++) {
const diagValue = ensureDominance ? rowSums[i] * 1.5 + 1 : Math.random() * 5 + 1;
values.push(diagValue);
rowIndices.push(i);
colIndices.push(i);
}
return {
rows: size,
cols: size,
values,
rowIndices,
colIndices,
format: 'coo'
};
}
static generateTridiagonalMatrix(size, offDiagonal) {
const values = [];
const rowIndices = [];
const colIndices = [];
for (let i = 0; i < size; i++) {
// Diagonal
values.push(2);
rowIndices.push(i);
colIndices.push(i);
// Off-diagonal
if (i > 0) {
values.push(offDiagonal);
rowIndices.push(i);
colIndices.push(i - 1);
}
if (i < size - 1) {
values.push(offDiagonal);
rowIndices.push(i);
colIndices.push(i + 1);
}
}
return {
rows: size,
cols: size,
values,
rowIndices,
colIndices,
format: 'coo'
};
}
}
@@ -0,0 +1,25 @@
/**
* Complete Enhanced Psycho-Symbolic Reasoning with Full Learning Integration
* Includes: Domain Adaptation, Creative Reasoning, Enhanced Knowledge Base, Analogical Reasoning
*/
import { Tool } from '@modelcontextprotocol/sdk/types.js';
export declare class CompletePsychoSymbolicTools {
private knowledgeBase;
private domainEngine;
private creativeEngine;
private analogicalEngine;
private performanceCache;
private toolLearningHooks;
constructor();
getTools(): Tool[];
handleToolCall(name: string, args: any): Promise<any>;
private performCompleteReasoning;
private extractAdvancedEntities;
private enhancedKnowledgeTraversal;
private synthesizeAdvancedAnswer;
private advancedKnowledgeQuery;
private addEnhancedKnowledge;
private registerToolInteraction;
private getCrossToolInsights;
private getLearningStatus;
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,26 @@
/**
* Enhanced Psycho-Symbolic Tools with Dynamic Domain Support
* Extends existing functionality while preserving all current capabilities
*/
import { Tool } from '@modelcontextprotocol/sdk/types.js';
import { PsychoSymbolicTools } from './psycho-symbolic.js';
import { DomainRegistry } from './domain-registry.js';
export declare class DynamicPsychoSymbolicTools extends PsychoSymbolicTools {
private domainRegistry;
constructor(domainRegistry?: DomainRegistry);
private initializeDynamicDomainIntegration;
getTools(): Tool[];
handleToolCall(name: string, args: any): Promise<any>;
private performEnhancedReasoning;
private testDomainDetection;
private advancedKnowledgeQueryDynamic;
private buildDomainFilters;
private performEnhancedDomainDetection;
private updateDomainEngine;
private getDynamicDomainsCount;
private getBuiltinDomainsCount;
private updateDynamicDomainUsage;
private testDomainDetectionSingle;
private applyDomainWeighting;
getDomainRegistry(): DomainRegistry;
}
@@ -0,0 +1,395 @@
/**
* Enhanced Psycho-Symbolic Tools with Dynamic Domain Support
* Extends existing functionality while preserving all current capabilities
*/
import { PsychoSymbolicTools } from './psycho-symbolic.js';
import { DomainRegistry } from './domain-registry.js';
export class DynamicPsychoSymbolicTools extends PsychoSymbolicTools {
domainRegistry;
constructor(domainRegistry) {
super();
this.domainRegistry = domainRegistry || new DomainRegistry();
this.initializeDynamicDomainIntegration();
}
initializeDynamicDomainIntegration() {
// Listen for domain registry events to update domain engine
this.domainRegistry.on('domainRegistered', (event) => {
this.updateDomainEngine();
});
this.domainRegistry.on('domainUpdated', (event) => {
this.updateDomainEngine();
});
this.domainRegistry.on('domainUnregistered', (event) => {
this.updateDomainEngine();
});
this.domainRegistry.on('domainEnabled', (event) => {
this.updateDomainEngine();
});
this.domainRegistry.on('domainDisabled', (event) => {
this.updateDomainEngine();
});
}
getTools() {
// Get all existing tools from parent class
const baseTools = super.getTools();
// Add enhanced tools with dynamic domain support
const enhancedTools = [
{
name: 'psycho_symbolic_reason_with_dynamic_domains',
description: 'Enhanced psycho-symbolic reasoning with dynamic domain support and control',
inputSchema: {
type: 'object',
properties: {
query: { type: 'string', description: 'The reasoning query' },
context: { type: 'object', description: 'Additional context', default: {} },
depth: { type: 'number', description: 'Maximum reasoning depth', default: 7 },
use_cache: { type: 'boolean', description: 'Enable intelligent caching', default: true },
enable_learning: { type: 'boolean', description: 'Enable learning from this interaction', default: true },
creative_mode: { type: 'boolean', description: 'Enable creative reasoning for novel concepts', default: true },
domain_adaptation: { type: 'boolean', description: 'Enable automatic domain detection and adaptation', default: true },
analogical_reasoning: { type: 'boolean', description: 'Enable analogical reasoning across domains', default: true },
// Dynamic domain extensions
force_domains: {
type: 'array',
items: { type: 'string' },
description: 'Force specific domains to be considered (overrides detection)'
},
exclude_domains: {
type: 'array',
items: { type: 'string' },
description: 'Exclude specific domains from consideration'
},
domain_priority_override: {
type: 'object',
additionalProperties: { type: 'number' },
description: 'Override domain priorities for this query (domain_name: priority)'
},
use_experimental_domains: {
type: 'boolean',
default: false,
description: 'Include experimental/beta domains in reasoning'
},
min_domain_confidence: {
type: 'number',
minimum: 0,
maximum: 1,
default: 0.1,
description: 'Minimum confidence threshold for domain detection'
},
max_domains: {
type: 'integer',
minimum: 1,
maximum: 10,
default: 3,
description: 'Maximum number of domains to use in reasoning'
}
},
required: ['query']
}
},
{
name: 'domain_detection_test',
description: 'Test domain detection for a given query with detailed analysis',
inputSchema: {
type: 'object',
properties: {
query: { type: 'string', description: 'Query to test domain detection on' },
include_scores: {
type: 'boolean',
default: true,
description: 'Include detailed detection scores and matching details'
},
include_debug: {
type: 'boolean',
default: false,
description: 'Include debug information about detection process'
},
test_all_domains: {
type: 'boolean',
default: false,
description: 'Test against all domains including disabled ones'
},
show_keyword_matches: {
type: 'boolean',
default: true,
description: 'Show which keywords matched for each domain'
}
},
required: ['query']
}
},
{
name: 'knowledge_graph_query_dynamic',
description: 'Knowledge graph query with dynamic domain filtering and boosting',
inputSchema: {
type: 'object',
properties: {
query: { type: 'string', description: 'Natural language query' },
domains: {
type: 'array',
items: { type: 'string' },
description: 'Domain filters (supports both built-in and dynamic domains)',
default: []
},
include_analogies: {
type: 'boolean',
description: 'Include analogical connections',
default: true
},
limit: { type: 'number', description: 'Max results', default: 20 },
cross_domain_boost: {
type: 'number',
minimum: 0,
maximum: 2,
default: 1.0,
description: 'Boost relevance for cross-domain results'
},
dynamic_domain_weight: {
type: 'number',
minimum: 0,
maximum: 2,
default: 1.0,
description: 'Weight multiplier for results from dynamic domains'
},
builtin_domain_weight: {
type: 'number',
minimum: 0,
maximum: 2,
default: 1.0,
description: 'Weight multiplier for results from built-in domains'
},
require_domain_match: {
type: 'boolean',
default: false,
description: 'Only return results that match specified domains'
}
},
required: ['query']
}
}
];
return [...baseTools, ...enhancedTools];
}
async handleToolCall(name, args) {
try {
switch (name) {
case 'psycho_symbolic_reason_with_dynamic_domains':
return await this.performEnhancedReasoning(args);
case 'domain_detection_test':
return await this.testDomainDetection(args);
case 'knowledge_graph_query_dynamic':
return await this.advancedKnowledgeQueryDynamic(args);
default:
// Delegate to parent class for existing tools
return await super.handleToolCall(name, args);
}
}
catch (error) {
return {
success: false,
error: error instanceof Error ? error.message : String(error),
timestamp: new Date().toISOString()
};
}
}
async performEnhancedReasoning(args) {
const startTime = performance.now();
// Apply domain filtering and priority overrides
const domainFilters = this.buildDomainFilters(args);
// Get enhanced domain detection with dynamic domains
const enhancedDetection = await this.performEnhancedDomainDetection(args.query, domainFilters);
// Enhance the reasoning context with dynamic domain information
const enhancedContext = {
...args.context,
domain_filters: domainFilters,
dynamic_domains_available: this.getDynamicDomainsCount(),
enhanced_detection: enhancedDetection
};
// Call the parent reasoning method with enhanced context via public interface
const baseResult = await super.handleToolCall('psycho_symbolic_reason', {
...args,
context: enhancedContext
});
// Enhance the result with dynamic domain information
const enhancedResult = {
...baseResult,
dynamic_domain_info: {
filters_applied: domainFilters,
dynamic_domains_used: enhancedDetection.dynamic_domains_detected,
builtin_domains_used: enhancedDetection.builtin_domains_detected,
domain_synergies: enhancedDetection.synergies,
detection_performance: {
total_domains_checked: enhancedDetection.total_domains_checked,
detection_time_ms: enhancedDetection.detection_time_ms
}
},
enhanced_reasoning_time: performance.now() - startTime
};
// Update usage statistics for dynamic domains
this.updateDynamicDomainUsage(enhancedDetection.domains_used);
return enhancedResult;
}
async testDomainDetection(args) {
const startTime = performance.now();
const query = args.query;
// Get all domains to test (including disabled if requested)
const domainsToTest = args.test_all_domains ?
this.domainRegistry.getAllDomains() :
this.domainRegistry.getEnabledDomains();
const detectionResults = [];
// Test detection against each domain
for (const domain of domainsToTest) {
const domainResult = await this.testDomainDetectionSingle(query, domain, args.show_keyword_matches);
detectionResults.push(domainResult);
}
// Sort by detection score
detectionResults.sort((a, b) => b.score - a.score);
// Get top detected domains
const topDomains = detectionResults
.filter(r => r.score > 0)
.slice(0, args.max_results || 10);
const detectionTime = performance.now() - startTime;
const result = {
query,
detected_domains: topDomains,
detection_summary: {
total_domains_tested: detectionResults.length,
domains_with_matches: detectionResults.filter(r => r.score > 0).length,
highest_score: detectionResults[0]?.score || 0,
detection_time_ms: detectionTime
},
system_info: {
total_domains_available: this.domainRegistry.getAllDomains().length,
builtin_domains_count: this.getBuiltinDomainsCount(),
dynamic_domains_count: this.getDynamicDomainsCount(),
enabled_domains_count: this.domainRegistry.getEnabledDomains().length
}
};
if (args.include_debug) {
result.debug_info = {
all_domain_results: detectionResults,
domain_registry_status: this.domainRegistry.getSystemStatus(),
detection_algorithm_info: {
scoring_method: 'keyword_matching_with_semantic_boost',
confidence_threshold: 0.1,
max_domains_returned: args.max_results || 10
}
};
}
return result;
}
async advancedKnowledgeQueryDynamic(args) {
// Enhance the base knowledge query with dynamic domain support via public interface
const baseResult = await super.handleToolCall('knowledge_graph_query', args);
// Apply dynamic domain weighting
if (args.dynamic_domain_weight !== 1.0 || args.builtin_domain_weight !== 1.0) {
baseResult.results = this.applyDomainWeighting(baseResult.results, args.dynamic_domain_weight, args.builtin_domain_weight);
}
// Filter by domain requirements if specified
if (args.require_domain_match && args.domains?.length > 0) {
baseResult.results = baseResult.results.filter(result => result.domain_tags?.some(tag => args.domains.includes(tag)));
}
// Add dynamic domain information
const enhancedResult = {
...baseResult,
dynamic_domain_info: {
dynamic_domains_available: this.getDynamicDomainsCount(),
builtin_domains_available: this.getBuiltinDomainsCount(),
weighting_applied: {
dynamic_domain_weight: args.dynamic_domain_weight,
builtin_domain_weight: args.builtin_domain_weight,
cross_domain_boost: args.cross_domain_boost
},
filtering_applied: {
require_domain_match: args.require_domain_match,
domains_filter: args.domains
}
}
};
return enhancedResult;
}
// Helper methods
buildDomainFilters(args) {
return {
force_domains: args.force_domains || [],
exclude_domains: args.exclude_domains || [],
domain_priority_override: args.domain_priority_override || {},
use_experimental_domains: args.use_experimental_domains || false,
min_domain_confidence: args.min_domain_confidence || 0.1,
max_domains: args.max_domains || 3
};
}
async performEnhancedDomainDetection(query, filters) {
const startTime = performance.now();
const allDomains = this.domainRegistry.getEnabledDomains();
// Apply filtering
let domainsToCheck = allDomains;
if (filters.exclude_domains.length > 0) {
domainsToCheck = domainsToCheck.filter(d => !filters.exclude_domains.includes(d.config.name));
}
if (!filters.use_experimental_domains) {
domainsToCheck = domainsToCheck.filter(d => !d.config.metadata?.experimental);
}
const detectionResults = {
domains_used: [],
dynamic_domains_detected: [],
builtin_domains_detected: [],
synergies: [],
total_domains_checked: domainsToCheck.length,
detection_time_ms: performance.now() - startTime
};
return detectionResults;
}
updateDomainEngine() {
// Update the parent class's domain engine with dynamic domains
// This would integrate with the existing DomainAdaptationEngine
console.log('Updating domain engine with dynamic domains...');
}
getDynamicDomainsCount() {
return this.domainRegistry.getAllDomains().filter(d => !this.domainRegistry.isBuiltinDomain(d.config.name)).length;
}
getBuiltinDomainsCount() {
return this.domainRegistry.getAllDomains().filter(d => this.domainRegistry.isBuiltinDomain(d.config.name)).length;
}
updateDynamicDomainUsage(domainsUsed) {
for (const domainName of domainsUsed) {
this.domainRegistry.incrementUsage(domainName);
}
}
async testDomainDetectionSingle(query, domain, showKeywordMatches) {
// Simplified domain detection test
const queryLower = query.toLowerCase();
const matchedKeywords = domain.config.keywords.filter(keyword => queryLower.includes(keyword.toLowerCase()));
const score = matchedKeywords.length > 0 ? matchedKeywords.length * 2.0 : 0;
const result = {
domain: domain.config.name,
score,
enabled: domain.enabled,
builtin: this.domainRegistry.isBuiltinDomain(domain.config.name),
reasoning_style: domain.config.reasoning_style,
priority: domain.config.priority
};
if (showKeywordMatches) {
result.matched_keywords = matchedKeywords;
result.total_keywords = domain.config.keywords.length;
result.match_ratio = matchedKeywords.length / domain.config.keywords.length;
}
return result;
}
applyDomainWeighting(results, dynamicWeight, builtinWeight) {
return results.map(result => {
const isDynamic = result.domain_tags?.some(tag => !this.domainRegistry.isBuiltinDomain(tag));
const weight = isDynamic ? dynamicWeight : builtinWeight;
return {
...result,
relevance: result.relevance * weight,
weighted: true,
weight_applied: weight
};
}).sort((a, b) => b.relevance - a.relevance);
}
// Expose domain registry for other tools
getDomainRegistry() {
return this.domainRegistry;
}
}
@@ -0,0 +1,26 @@
/**
* Enhanced Psycho-Symbolic Reasoning MCP Tools
* Full implementation with real reasoning, knowledge graph, and inference engine
*/
import { Tool } from '@modelcontextprotocol/sdk/types.js';
export declare class EnhancedPsychoSymbolicTools {
private knowledgeBase;
private reasoningCache;
constructor();
getTools(): Tool[];
handleToolCall(name: string, args: any): Promise<any>;
private performDeepReasoning;
private identifyCognitivePatterns;
private extractEntitiesAndConcepts;
private extractLogicalComponents;
private traverseKnowledgeGraph;
private buildInferenceChain;
private findTransitiveChains;
private generateHypotheses;
private detectContradictions;
private resolveContradictions;
private synthesizeCompleteAnswer;
private queryKnowledgeGraph;
private addKnowledge;
}
export default EnhancedPsychoSymbolicTools;
@@ -0,0 +1,660 @@
/**
* Enhanced Psycho-Symbolic Reasoning MCP Tools
* Full implementation with real reasoning, knowledge graph, and inference engine
*/
import * as crypto from 'crypto';
// Initialize with base knowledge
class KnowledgeBase {
triples = new Map();
concepts = new Map(); // concept -> related triple IDs
predicateIndex = new Map(); // predicate -> triple IDs
constructor() {
this.initializeBaseKnowledge();
}
initializeBaseKnowledge() {
// Core AI/consciousness knowledge
this.addTriple('consciousness', 'emerges_from', 'neural_networks', 0.85);
this.addTriple('consciousness', 'requires', 'integration', 0.9);
this.addTriple('consciousness', 'exhibits', 'phi_value', 0.95);
this.addTriple('neural_networks', 'process', 'information', 1.0);
this.addTriple('neural_networks', 'contain', 'neurons', 1.0);
this.addTriple('neurons', 'connect_via', 'synapses', 1.0);
this.addTriple('synapses', 'enable', 'plasticity', 0.9);
this.addTriple('plasticity', 'allows', 'learning', 0.95);
this.addTriple('learning', 'modifies', 'weights', 1.0);
this.addTriple('phi_value', 'measures', 'integrated_information', 1.0);
this.addTriple('integrated_information', 'indicates', 'consciousness_level', 0.8);
// Temporal/computational knowledge
this.addTriple('temporal_processing', 'enables', 'prediction', 0.9);
this.addTriple('prediction', 'requires', 'pattern_recognition', 0.85);
this.addTriple('pattern_recognition', 'uses', 'neural_networks', 0.9);
this.addTriple('sublinear_algorithms', 'achieve', 'logarithmic_complexity', 1.0);
this.addTriple('logarithmic_complexity', 'beats', 'polynomial_complexity', 1.0);
this.addTriple('nanosecond_scheduling', 'enables', 'temporal_advantage', 0.95);
this.addTriple('temporal_advantage', 'allows', 'faster_than_light_computation', 0.9);
// Reasoning patterns
this.addTriple('causal_reasoning', 'identifies', 'cause_effect', 1.0);
this.addTriple('procedural_reasoning', 'describes', 'processes', 1.0);
this.addTriple('hypothetical_reasoning', 'explores', 'possibilities', 1.0);
this.addTriple('comparative_reasoning', 'analyzes', 'differences', 1.0);
this.addTriple('abstract_reasoning', 'generalizes', 'concepts', 0.95);
// Logic rules
this.addTriple('modus_ponens', 'validates', 'implications', 1.0);
this.addTriple('universal_instantiation', 'applies_to', 'specific_cases', 1.0);
this.addTriple('existential_generalization', 'proves', 'existence', 0.9);
}
addTriple(subject, predicate, object, confidence = 1.0, metadata) {
const id = crypto.randomBytes(8).toString('hex');
const triple = {
subject: subject.toLowerCase(),
predicate: predicate.toLowerCase(),
object: object.toLowerCase(),
confidence,
metadata,
timestamp: Date.now()
};
this.triples.set(id, triple);
// Update indices
this.addToConceptIndex(triple.subject, id);
this.addToConceptIndex(triple.object, id);
this.addToPredicateIndex(triple.predicate, id);
return id;
}
addToConceptIndex(concept, tripleId) {
if (!this.concepts.has(concept)) {
this.concepts.set(concept, new Set());
}
this.concepts.get(concept).add(tripleId);
}
addToPredicateIndex(predicate, tripleId) {
if (!this.predicateIndex.has(predicate)) {
this.predicateIndex.set(predicate, new Set());
}
this.predicateIndex.get(predicate).add(tripleId);
}
findRelated(concept) {
const conceptLower = concept.toLowerCase();
const relatedIds = this.concepts.get(conceptLower) || new Set();
return Array.from(relatedIds).map(id => this.triples.get(id)).filter(Boolean);
}
findByPredicate(predicate) {
const predicateLower = predicate.toLowerCase();
const ids = this.predicateIndex.get(predicateLower) || new Set();
return Array.from(ids).map(id => this.triples.get(id)).filter(Boolean);
}
getAllTriples() {
return Array.from(this.triples.values());
}
query(sparqlLike) {
// Simple SPARQL-like query support
const results = [];
const queryLower = sparqlLike.toLowerCase();
for (const triple of this.triples.values()) {
if (queryLower.includes(triple.subject) ||
queryLower.includes(triple.predicate) ||
queryLower.includes(triple.object)) {
results.push(triple);
}
}
return results;
}
}
export class EnhancedPsychoSymbolicTools {
knowledgeBase;
reasoningCache = new Map();
constructor() {
this.knowledgeBase = new KnowledgeBase();
}
getTools() {
return [
{
name: 'psycho_symbolic_reason',
description: 'Perform deep psycho-symbolic reasoning with full inference',
inputSchema: {
type: 'object',
properties: {
query: { type: 'string', description: 'The reasoning query' },
context: { type: 'object', description: 'Additional context', default: {} },
depth: { type: 'number', description: 'Reasoning depth', default: 5 }
},
required: ['query']
}
},
{
name: 'knowledge_graph_query',
description: 'Query the knowledge graph with semantic search',
inputSchema: {
type: 'object',
properties: {
query: { type: 'string', description: 'Natural language or SPARQL-like query' },
filters: { type: 'object', description: 'Filters', default: {} },
limit: { type: 'number', description: 'Max results', default: 10 }
},
required: ['query']
}
},
{
name: 'add_knowledge',
description: 'Add knowledge triple to the graph',
inputSchema: {
type: 'object',
properties: {
subject: { type: 'string' },
predicate: { type: 'string' },
object: { type: 'string' },
confidence: { type: 'number', default: 1.0 },
metadata: { type: 'object', default: {} }
},
required: ['subject', 'predicate', 'object']
}
}
];
}
async handleToolCall(name, args) {
switch (name) {
case 'psycho_symbolic_reason':
return this.performDeepReasoning(args.query, args.context || {}, args.depth || 5);
case 'knowledge_graph_query':
return this.queryKnowledgeGraph(args.query, args.filters || {}, args.limit || 10);
case 'add_knowledge':
return this.addKnowledge(args.subject, args.predicate, args.object, args.confidence, args.metadata);
default:
throw new Error(`Unknown tool: ${name}`);
}
}
async performDeepReasoning(query, context, maxDepth) {
// Check cache
const cacheKey = `${query}_${JSON.stringify(context)}_${maxDepth}`;
if (this.reasoningCache.has(cacheKey)) {
return this.reasoningCache.get(cacheKey);
}
const reasoningSteps = [];
const insights = new Set();
// Step 1: Cognitive Pattern Analysis
const patterns = this.identifyCognitivePatterns(query);
reasoningSteps.push({
type: 'pattern_identification',
patterns,
confidence: 0.9,
description: `Identified ${patterns.join(', ')} reasoning patterns`
});
// Step 2: Entity and Concept Extraction
const entities = this.extractEntitiesAndConcepts(query);
reasoningSteps.push({
type: 'entity_extraction',
entities: entities.entities,
concepts: entities.concepts,
relationships: entities.relationships,
confidence: 0.85
});
// Step 3: Logical Component Analysis
const logicalComponents = this.extractLogicalComponents(query);
reasoningSteps.push({
type: 'logical_decomposition',
components: logicalComponents,
depth: 1,
description: 'Decomposed query into logical primitives'
});
// Step 4: Knowledge Graph Traversal
const graphInsights = await this.traverseKnowledgeGraph(entities.concepts, maxDepth);
reasoningSteps.push({
type: 'knowledge_traversal',
paths: graphInsights.paths,
discoveries: graphInsights.discoveries,
confidence: graphInsights.confidence
});
graphInsights.discoveries.forEach(d => insights.add(d));
// Step 5: Inference Chain Building
const inferences = this.buildInferenceChain(logicalComponents, graphInsights.triples, patterns);
reasoningSteps.push({
type: 'inference',
rules: inferences.rules,
conclusions: inferences.conclusions,
confidence: inferences.confidence
});
inferences.conclusions.forEach(c => insights.add(c));
// Step 6: Hypothesis Generation
if (patterns.includes('hypothetical') || patterns.includes('exploratory')) {
const hypotheses = this.generateHypotheses(entities.concepts, inferences.conclusions);
reasoningSteps.push({
type: 'hypothesis_generation',
hypotheses,
confidence: 0.7
});
hypotheses.forEach(h => insights.add(h));
}
// Step 7: Contradiction Detection and Resolution
const contradictions = this.detectContradictions(Array.from(insights));
if (contradictions.length > 0) {
const resolutions = this.resolveContradictions(contradictions, context);
reasoningSteps.push({
type: 'contradiction_resolution',
contradictions,
resolutions,
confidence: 0.8
});
}
// Step 8: Synthesis
const synthesis = this.synthesizeCompleteAnswer(query, Array.from(insights), reasoningSteps, patterns);
const result = {
answer: synthesis.answer,
confidence: synthesis.confidence,
reasoning: reasoningSteps,
insights: Array.from(insights),
patterns,
depth: graphInsights.maxDepth,
entities: entities.entities,
concepts: entities.concepts,
triples_examined: graphInsights.triples.length,
inference_rules_applied: inferences.rules.length
};
// Cache result
this.reasoningCache.set(cacheKey, result);
return result;
}
identifyCognitivePatterns(query) {
const patterns = [];
const lowerQuery = query.toLowerCase();
const patternMap = {
'causal': ['why', 'cause', 'because', 'result', 'effect', 'lead to'],
'procedural': ['how', 'process', 'step', 'method', 'way', 'approach'],
'hypothetical': ['what if', 'suppose', 'imagine', 'could', 'would', 'might'],
'comparative': ['compare', 'difference', 'similar', 'versus', 'than', 'like'],
'definitional': ['what is', 'define', 'meaning', 'definition'],
'evaluative': ['best', 'worst', 'better', 'optimal', 'evaluate'],
'temporal': ['when', 'time', 'before', 'after', 'during', 'temporal'],
'spatial': ['where', 'location', 'position', 'space'],
'quantitative': ['how many', 'how much', 'count', 'measure', 'amount'],
'existential': ['exist', 'there is', 'there are', 'presence'],
'universal': ['all', 'every', 'always', 'never', 'none']
};
for (const [pattern, keywords] of Object.entries(patternMap)) {
if (keywords.some(keyword => lowerQuery.includes(keyword))) {
patterns.push(pattern);
}
}
if (patterns.length === 0) {
patterns.push('exploratory');
}
return patterns;
}
extractEntitiesAndConcepts(query) {
const words = query.split(/\s+/);
const entities = [];
const concepts = [];
const relationships = [];
// Extract named entities (capitalized words not at sentence start)
for (let i = 1; i < words.length; i++) {
if (/^[A-Z]/.test(words[i]) && !['The', 'A', 'An'].includes(words[i])) {
entities.push(words[i].toLowerCase());
}
}
// Extract key concepts from knowledge base
const queryLower = query.toLowerCase();
for (const concept of this.knowledgeBase.getAllTriples().map(t => [t.subject, t.object]).flat()) {
if (queryLower.includes(concept)) {
concepts.push(concept);
}
}
// Extract relationships (verbs and prepositions)
const relationshipPatterns = [
'is', 'are', 'was', 'were', 'has', 'have', 'had',
'can', 'could', 'will', 'would', 'should',
'emerges', 'requires', 'enables', 'causes', 'prevents',
'increases', 'decreases', 'affects', 'influences'
];
for (const word of words) {
const wordLower = word.toLowerCase();
if (relationshipPatterns.includes(wordLower)) {
relationships.push(wordLower);
}
}
// Add query-specific concepts
if (queryLower.includes('consciousness'))
concepts.push('consciousness');
if (queryLower.includes('neural'))
concepts.push('neural_networks');
if (queryLower.includes('temporal'))
concepts.push('temporal_processing');
if (queryLower.includes('phi') || queryLower.includes('φ'))
concepts.push('phi_value');
return {
entities: [...new Set(entities)],
concepts: [...new Set(concepts)],
relationships: [...new Set(relationships)]
};
}
extractLogicalComponents(query) {
const components = {
predicates: [],
quantifiers: [],
operators: [],
modals: [],
negations: []
};
const lowerQuery = query.toLowerCase();
// Extract predicates (subject-verb-object patterns)
const predicateMatches = lowerQuery.match(/(\w+)\s+(is|are|was|were|has|have|had)\s+(\w+)/g);
if (predicateMatches) {
components.predicates = predicateMatches.map(p => p.trim());
}
// Extract quantifiers
const quantifierPattern = /\b(all|every|some|any|no|none|many|few|most|several)\b/gi;
const quantifierMatches = lowerQuery.match(quantifierPattern);
if (quantifierMatches) {
components.quantifiers = quantifierMatches;
}
// Extract logical operators
const operatorPattern = /\b(and|or|not|if|then|implies|therefore|because|but|however)\b/gi;
const operatorMatches = lowerQuery.match(operatorPattern);
if (operatorMatches) {
components.operators = operatorMatches;
}
// Extract modal verbs
const modalPattern = /\b(can|could|may|might|must|shall|should|will|would)\b/gi;
const modalMatches = lowerQuery.match(modalPattern);
if (modalMatches) {
components.modals = modalMatches;
}
// Extract negations
const negationPattern = /\b(not|no|never|neither|nor|nothing|nobody|nowhere)\b/gi;
const negationMatches = lowerQuery.match(negationPattern);
if (negationMatches) {
components.negations = negationMatches;
}
return components;
}
async traverseKnowledgeGraph(concepts, maxDepth) {
const visited = new Set();
const paths = [];
const discoveries = [];
const triples = [];
let currentDepth = 0;
let maxConfidence = 0;
// BFS traversal
const queue = concepts.map(c => ({
concept: c,
depth: 0,
confidence: 1.0,
path: [c],
inferences: []
}));
while (queue.length > 0 && currentDepth < maxDepth) {
const node = queue.shift();
if (visited.has(node.concept))
continue;
visited.add(node.concept);
currentDepth = Math.max(currentDepth, node.depth);
paths.push(node.path);
// Find related triples
const related = this.knowledgeBase.findRelated(node.concept);
triples.push(...related);
for (const triple of related) {
// Generate discoveries
const discovery = `${triple.subject} ${triple.predicate} ${triple.object}`;
discoveries.push(discovery);
maxConfidence = Math.max(maxConfidence, triple.confidence * node.confidence);
// Add connected concepts to queue
const nextConcept = triple.subject === node.concept ? triple.object : triple.subject;
if (!visited.has(nextConcept) && node.depth < maxDepth - 1) {
queue.push({
concept: nextConcept,
depth: node.depth + 1,
confidence: node.confidence * triple.confidence,
path: [...node.path, nextConcept],
inferences: [...node.inferences, discovery]
});
}
}
}
return {
paths,
discoveries: discoveries.slice(0, 20), // Limit discoveries
triples,
maxDepth: currentDepth,
confidence: maxConfidence
};
}
buildInferenceChain(logicalComponents, triples, patterns) {
const rules = [];
const conclusions = [];
let confidence = 0.5;
// Apply Modus Ponens
if (logicalComponents.operators.includes('if') || logicalComponents.operators.includes('then')) {
rules.push('modus_ponens');
// Find implications in triples
for (const triple of triples) {
if (triple.predicate === 'implies' || triple.predicate === 'causes' || triple.predicate === 'enables') {
conclusions.push(`${triple.subject} leads to ${triple.object}`);
confidence = Math.max(confidence, triple.confidence * 0.9);
}
}
}
// Apply Universal Instantiation
if (logicalComponents.quantifiers.some((q) => ['all', 'every'].includes(q))) {
rules.push('universal_instantiation');
conclusions.push('universal property applies to specific instances');
confidence = Math.max(confidence, 0.85);
}
// Apply Existential Generalization
if (logicalComponents.quantifiers.some((q) => ['some', 'exist'].includes(q))) {
rules.push('existential_generalization');
conclusions.push('at least one instance exists with the property');
confidence = Math.max(confidence, 0.8);
}
// Apply Transitive Property
const transitivePredicates = ['causes', 'enables', 'requires', 'leads_to'];
const transitiveChains = this.findTransitiveChains(triples, transitivePredicates);
if (transitiveChains.length > 0) {
rules.push('transitive_property');
transitiveChains.forEach(chain => {
conclusions.push(`${chain.start} transitively ${chain.predicate} ${chain.end}`);
});
confidence = Math.max(confidence, 0.75);
}
// Apply Pattern-Specific Rules
if (patterns.includes('causal')) {
rules.push('causal_chain_analysis');
const causalChains = triples.filter(t => ['causes', 'results_in', 'leads_to', 'produces'].includes(t.predicate));
causalChains.forEach(chain => {
conclusions.push(`causal relationship: ${chain.subject}${chain.object}`);
});
}
if (patterns.includes('temporal')) {
rules.push('temporal_ordering');
conclusions.push('events ordered by temporal precedence');
}
// Generate domain-specific conclusions
if (triples.some(t => t.subject.includes('consciousness') || t.object.includes('consciousness'))) {
conclusions.push('consciousness emerges from integrated information processing');
conclusions.push('phi value indicates level of consciousness');
confidence = Math.max(confidence, 0.85);
}
if (triples.some(t => t.subject.includes('neural') || t.object.includes('neural'))) {
conclusions.push('neural networks enable learning through weight modification');
conclusions.push('plasticity allows adaptive behavior');
confidence = Math.max(confidence, 0.9);
}
return {
rules,
conclusions,
confidence
};
}
findTransitiveChains(triples, predicates) {
const chains = [];
for (const predicate of predicates) {
const relevantTriples = triples.filter(t => t.predicate === predicate);
for (let i = 0; i < relevantTriples.length; i++) {
for (let j = 0; j < relevantTriples.length; j++) {
if (relevantTriples[i].object === relevantTriples[j].subject) {
chains.push({
start: relevantTriples[i].subject,
middle: relevantTriples[i].object,
end: relevantTriples[j].object,
predicate
});
}
}
}
}
return chains;
}
generateHypotheses(concepts, conclusions) {
const hypotheses = [];
// Generate hypotheses based on concept combinations
for (let i = 0; i < concepts.length; i++) {
for (let j = i + 1; j < concepts.length; j++) {
hypotheses.push(`hypothesis: ${concepts[i]} might be related to ${concepts[j]}`);
}
}
// Generate hypotheses from conclusions
for (const conclusion of conclusions) {
if (conclusion.includes('leads to') || conclusion.includes('causes')) {
hypotheses.push(`hypothesis: reversing ${conclusion} might have opposite effect`);
}
}
// Domain-specific hypotheses
if (concepts.includes('consciousness')) {
hypotheses.push('hypothesis: higher phi values correlate with greater self-awareness');
hypotheses.push('hypothesis: consciousness requires minimum integration threshold');
}
if (concepts.includes('temporal_processing')) {
hypotheses.push('hypothesis: temporal advantage enables predictive processing');
hypotheses.push('hypothesis: nanosecond precision allows quantum-like effects');
}
return hypotheses.slice(0, 5); // Limit hypotheses
}
detectContradictions(statements) {
const contradictions = [];
for (let i = 0; i < statements.length; i++) {
for (let j = i + 1; j < statements.length; j++) {
// Check for direct negation
if (statements[i].includes('not') && statements[j] === statements[i].replace('not ', '')) {
contradictions.push({
type: 'direct_negation',
statement1: statements[i],
statement2: statements[j]
});
}
// Check for semantic opposition
const opposites = [
['increases', 'decreases'],
['enables', 'prevents'],
['causes', 'prevents'],
['always', 'never'],
['all', 'none']
];
for (const [word1, word2] of opposites) {
if ((statements[i].includes(word1) && statements[j].includes(word2)) ||
(statements[i].includes(word2) && statements[j].includes(word1))) {
contradictions.push({
type: 'semantic_opposition',
statement1: statements[i],
statement2: statements[j],
conflict: [word1, word2]
});
}
}
}
}
return contradictions;
}
resolveContradictions(contradictions, context) {
return contradictions.map(c => ({
original: c,
resolution: 'resolved through context disambiguation',
method: c.type === 'direct_negation' ? 'logical_priority' : 'semantic_analysis',
confidence: 0.7
}));
}
synthesizeCompleteAnswer(query, insights, steps, patterns) {
let confidence = 0.5;
const keyInsights = insights.slice(0, 5);
// Calculate confidence from reasoning steps
for (const step of steps) {
if (step.confidence) {
confidence = Math.max(confidence, step.confidence * 0.9);
}
}
// Build comprehensive answer
let answer = '';
if (patterns.includes('causal')) {
answer = `Based on causal analysis: ${keyInsights.join(' → ')}. `;
}
else if (patterns.includes('procedural')) {
answer = `The process involves: ${keyInsights.join(', then ')}. `;
}
else if (patterns.includes('comparative')) {
answer = `Comparison reveals: ${keyInsights.join(' versus ')}. `;
}
else if (patterns.includes('hypothetical')) {
answer = `Hypothetically: ${keyInsights.join(', additionally ')}. `;
}
else {
answer = `Analysis shows: ${keyInsights.join('. ')}. `;
}
// Add reasoning depth
answer += `This conclusion is based on ${steps.length} reasoning steps`;
// Add confidence qualifier
if (confidence > 0.9) {
answer += ' with very high confidence';
}
else if (confidence > 0.7) {
answer += ' with high confidence';
}
else if (confidence > 0.5) {
answer += ' with moderate confidence';
}
else {
answer += ' with exploratory confidence';
}
answer += '.';
return {
answer,
confidence,
keyInsights
};
}
async queryKnowledgeGraph(query, filters, limit) {
const results = this.knowledgeBase.query(query);
// Apply filters
let filtered = results;
if (filters.confidence) {
filtered = filtered.filter(t => t.confidence >= filters.confidence);
}
if (filters.predicate) {
filtered = filtered.filter(t => t.predicate === filters.predicate.toLowerCase());
}
// Sort by confidence
filtered.sort((a, b) => b.confidence - a.confidence);
// Limit results
const limited = filtered.slice(0, limit);
return {
query,
results: limited.map(t => ({
subject: t.subject,
predicate: t.predicate,
object: t.object,
confidence: t.confidence,
metadata: t.metadata
})),
total: limited.length,
totalAvailable: filtered.length
};
}
async addKnowledge(subject, predicate, object, confidence = 1.0, metadata = {}) {
const id = this.knowledgeBase.addTriple(subject, predicate, object, confidence, metadata);
return {
id,
status: 'added',
triple: {
subject: subject.toLowerCase(),
predicate: predicate.toLowerCase(),
object: object.toLowerCase(),
confidence
}
};
}
}
export default EnhancedPsychoSymbolicTools;
@@ -0,0 +1,30 @@
/**
* Enhanced Psycho-Symbolic Reasoning MCP Tools
* Full implementation with domain-agnostic reasoning and fallback mechanisms
*/
import { Tool } from '@modelcontextprotocol/sdk/types.js';
export declare class PsychoSymbolicTools {
private knowledgeBase;
private reasoningCache;
constructor();
getTools(): Tool[];
handleToolCall(name: string, args: any): Promise<any>;
private performDeepReasoning;
private generateDomainInsights;
private applyContextualReasoning;
private analyzeEdgeCases;
private identifyCognitivePatterns;
private extractEntitiesAndConcepts;
private extractLogicalComponents;
private traverseKnowledgeGraph;
private buildInferenceChain;
private findTransitiveChains;
private generateHypotheses;
private detectContradictions;
private resolveContradictions;
private synthesizeCompleteAnswer;
private generateDefaultInsights;
private queryKnowledgeGraph;
private addKnowledge;
}
export default PsychoSymbolicTools;
@@ -0,0 +1,872 @@
/**
* Enhanced Psycho-Symbolic Reasoning MCP Tools
* Full implementation with domain-agnostic reasoning and fallback mechanisms
*/
import * as crypto from 'crypto';
// Initialize with base knowledge
class KnowledgeBase {
triples = new Map();
concepts = new Map(); // concept -> related triple IDs
predicateIndex = new Map(); // predicate -> triple IDs
constructor() {
this.initializeBaseKnowledge();
}
initializeBaseKnowledge() {
// Core AI/consciousness knowledge
this.addTriple('consciousness', 'emerges_from', 'neural_networks', 0.85);
this.addTriple('consciousness', 'requires', 'integration', 0.9);
this.addTriple('consciousness', 'exhibits', 'phi_value', 0.95);
this.addTriple('neural_networks', 'process', 'information', 1.0);
this.addTriple('neural_networks', 'contain', 'neurons', 1.0);
this.addTriple('neurons', 'connect_via', 'synapses', 1.0);
this.addTriple('synapses', 'enable', 'plasticity', 0.9);
this.addTriple('plasticity', 'allows', 'learning', 0.95);
this.addTriple('learning', 'modifies', 'weights', 1.0);
this.addTriple('phi_value', 'measures', 'integrated_information', 1.0);
this.addTriple('integrated_information', 'indicates', 'consciousness_level', 0.8);
// Temporal/computational knowledge
this.addTriple('temporal_processing', 'enables', 'prediction', 0.9);
this.addTriple('prediction', 'requires', 'pattern_recognition', 0.85);
this.addTriple('pattern_recognition', 'uses', 'neural_networks', 0.9);
this.addTriple('sublinear_algorithms', 'achieve', 'logarithmic_complexity', 1.0);
this.addTriple('logarithmic_complexity', 'beats', 'polynomial_complexity', 1.0);
this.addTriple('nanosecond_scheduling', 'enables', 'temporal_advantage', 0.95);
this.addTriple('temporal_advantage', 'allows', 'faster_than_light_computation', 0.9);
// Software engineering principles
this.addTriple('api_design', 'requires', 'consistency', 0.95);
this.addTriple('api_design', 'benefits_from', 'versioning', 0.9);
this.addTriple('rest_api', 'uses', 'http_methods', 1.0);
this.addTriple('rest_api', 'follows', 'stateless_principle', 0.95);
this.addTriple('user_management', 'requires', 'authentication', 1.0);
this.addTriple('user_management', 'requires', 'authorization', 1.0);
this.addTriple('authentication', 'validates', 'identity', 1.0);
this.addTriple('authorization', 'controls', 'access', 1.0);
this.addTriple('security', 'prevents', 'vulnerabilities', 0.9);
this.addTriple('rate_limiting', 'prevents', 'abuse', 0.95);
this.addTriple('caching', 'improves', 'performance', 0.9);
this.addTriple('pagination', 'handles', 'large_datasets', 0.95);
// System design principles
this.addTriple('distributed_systems', 'face', 'consistency_challenges', 0.95);
this.addTriple('microservices', 'require', 'service_discovery', 0.9);
this.addTriple('scalability', 'requires', 'horizontal_scaling', 0.85);
this.addTriple('reliability', 'requires', 'redundancy', 0.9);
this.addTriple('monitoring', 'enables', 'observability', 0.95);
// Reasoning patterns
this.addTriple('causal_reasoning', 'identifies', 'cause_effect', 1.0);
this.addTriple('procedural_reasoning', 'describes', 'processes', 1.0);
this.addTriple('hypothetical_reasoning', 'explores', 'possibilities', 1.0);
this.addTriple('comparative_reasoning', 'analyzes', 'differences', 1.0);
this.addTriple('abstract_reasoning', 'generalizes', 'concepts', 0.95);
this.addTriple('lateral_thinking', 'finds', 'unconventional_solutions', 0.9);
this.addTriple('systems_thinking', 'considers', 'interactions', 0.95);
// Logic rules
this.addTriple('modus_ponens', 'validates', 'implications', 1.0);
this.addTriple('universal_instantiation', 'applies_to', 'specific_cases', 1.0);
this.addTriple('existential_generalization', 'proves', 'existence', 0.9);
}
addTriple(subject, predicate, object, confidence = 1.0, metadata) {
const id = crypto.randomBytes(8).toString('hex');
const triple = {
subject: subject.toLowerCase(),
predicate: predicate.toLowerCase(),
object: object.toLowerCase(),
confidence,
metadata,
timestamp: Date.now()
};
this.triples.set(id, triple);
// Update indices
this.addToConceptIndex(triple.subject, id);
this.addToConceptIndex(triple.object, id);
this.addToPredicateIndex(triple.predicate, id);
return id;
}
addToConceptIndex(concept, tripleId) {
if (!this.concepts.has(concept)) {
this.concepts.set(concept, new Set());
}
this.concepts.get(concept).add(tripleId);
}
addToPredicateIndex(predicate, tripleId) {
if (!this.predicateIndex.has(predicate)) {
this.predicateIndex.set(predicate, new Set());
}
this.predicateIndex.get(predicate).add(tripleId);
}
findRelated(concept) {
const conceptLower = concept.toLowerCase();
const relatedIds = this.concepts.get(conceptLower) || new Set();
return Array.from(relatedIds).map(id => this.triples.get(id)).filter(Boolean);
}
findByPredicate(predicate) {
const predicateLower = predicate.toLowerCase();
const ids = this.predicateIndex.get(predicateLower) || new Set();
return Array.from(ids).map(id => this.triples.get(id)).filter(Boolean);
}
getAllTriples() {
return Array.from(this.triples.values());
}
query(sparqlLike) {
// Simple SPARQL-like query support
const results = [];
const queryLower = sparqlLike.toLowerCase();
for (const triple of this.triples.values()) {
if (queryLower.includes(triple.subject) ||
queryLower.includes(triple.predicate) ||
queryLower.includes(triple.object)) {
results.push(triple);
}
}
return results;
}
}
export class PsychoSymbolicTools {
knowledgeBase;
reasoningCache = new Map();
constructor() {
this.knowledgeBase = new KnowledgeBase();
}
getTools() {
return [
{
name: 'psycho_symbolic_reason',
description: 'Perform deep psycho-symbolic reasoning with full inference',
inputSchema: {
type: 'object',
properties: {
query: { type: 'string', description: 'The reasoning query' },
context: { type: 'object', description: 'Additional context', default: {} },
depth: { type: 'number', description: 'Reasoning depth', default: 5 }
},
required: ['query']
}
},
{
name: 'knowledge_graph_query',
description: 'Query the knowledge graph with semantic search',
inputSchema: {
type: 'object',
properties: {
query: { type: 'string', description: 'Natural language or SPARQL-like query' },
filters: { type: 'object', description: 'Filters', default: {} },
limit: { type: 'number', description: 'Max results', default: 10 }
},
required: ['query']
}
},
{
name: 'add_knowledge',
description: 'Add knowledge triple to the graph',
inputSchema: {
type: 'object',
properties: {
subject: { type: 'string' },
predicate: { type: 'string' },
object: { type: 'string' },
confidence: { type: 'number', default: 1.0 },
metadata: { type: 'object', default: {} }
},
required: ['subject', 'predicate', 'object']
}
}
];
}
async handleToolCall(name, args) {
switch (name) {
case 'psycho_symbolic_reason':
return this.performDeepReasoning(args.query, args.context || {}, args.depth || 5);
case 'knowledge_graph_query':
return this.queryKnowledgeGraph(args.query, args.filters || {}, args.limit || 10);
case 'add_knowledge':
return this.addKnowledge(args.subject, args.predicate, args.object, args.confidence, args.metadata);
default:
throw new Error(`Unknown tool: ${name}`);
}
}
async performDeepReasoning(query, context, maxDepth) {
// Check cache
const cacheKey = `${query}_${JSON.stringify(context)}_${maxDepth}`;
if (this.reasoningCache.has(cacheKey)) {
return this.reasoningCache.get(cacheKey);
}
const reasoningSteps = [];
const insights = new Set();
// Step 1: Cognitive Pattern Analysis
const patterns = this.identifyCognitivePatterns(query);
reasoningSteps.push({
type: 'pattern_identification',
patterns,
confidence: 0.9,
description: `Identified ${patterns.join(', ')} reasoning patterns`
});
// Step 2: Entity and Concept Extraction
const entities = this.extractEntitiesAndConcepts(query);
reasoningSteps.push({
type: 'entity_extraction',
entities: entities.entities,
concepts: entities.concepts,
relationships: entities.relationships,
confidence: 0.85
});
// Step 3: Domain-Specific Insight Generation
const domainInsights = this.generateDomainInsights(query, patterns, context);
domainInsights.forEach(insight => insights.add(insight));
reasoningSteps.push({
type: 'domain_analysis',
insights: domainInsights,
confidence: 0.8,
description: 'Generated domain-specific insights'
});
// Step 4: Logical Component Analysis
const logicalComponents = this.extractLogicalComponents(query);
reasoningSteps.push({
type: 'logical_decomposition',
components: logicalComponents,
depth: 1,
description: 'Decomposed query into logical primitives'
});
// Step 5: Knowledge Graph Traversal
const graphInsights = await this.traverseKnowledgeGraph(entities.concepts, maxDepth);
reasoningSteps.push({
type: 'knowledge_traversal',
paths: graphInsights.paths,
discoveries: graphInsights.discoveries,
confidence: graphInsights.confidence
});
graphInsights.discoveries.forEach(d => insights.add(d));
// Step 6: Inference Chain Building
const inferences = this.buildInferenceChain(logicalComponents, graphInsights.triples, patterns);
reasoningSteps.push({
type: 'inference',
rules: inferences.rules,
conclusions: inferences.conclusions,
confidence: inferences.confidence
});
inferences.conclusions.forEach(c => insights.add(c));
// Step 7: Context-Aware Reasoning
if (context && Object.keys(context).length > 0) {
const contextInsights = this.applyContextualReasoning(query, context, patterns);
contextInsights.forEach(ci => insights.add(ci));
reasoningSteps.push({
type: 'contextual_reasoning',
insights: contextInsights,
confidence: 0.75
});
}
// Step 8: Hypothesis Generation
if (patterns.includes('hypothetical') || patterns.includes('exploratory') || patterns.includes('lateral')) {
const hypotheses = this.generateHypotheses(entities.concepts, inferences.conclusions);
reasoningSteps.push({
type: 'hypothesis_generation',
hypotheses,
confidence: 0.7
});
hypotheses.forEach(h => insights.add(h));
}
// Step 9: Edge Case Analysis (for API/system design queries)
if (query.toLowerCase().includes('edge case') || query.toLowerCase().includes('hidden') ||
context.focus === 'hidden_complexities') {
const edgeCases = this.analyzeEdgeCases(query, entities.concepts);
edgeCases.forEach(ec => insights.add(ec));
reasoningSteps.push({
type: 'edge_case_analysis',
cases: edgeCases,
confidence: 0.8
});
}
// Step 10: Contradiction Detection and Resolution
const contradictions = this.detectContradictions(Array.from(insights));
if (contradictions.length > 0) {
const resolutions = this.resolveContradictions(contradictions, context);
reasoningSteps.push({
type: 'contradiction_resolution',
contradictions,
resolutions,
confidence: 0.8
});
}
// Step 11: Synthesis
const synthesis = this.synthesizeCompleteAnswer(query, Array.from(insights), reasoningSteps, patterns, context);
const result = {
answer: synthesis.answer,
confidence: synthesis.confidence,
reasoning: reasoningSteps,
insights: Array.from(insights),
patterns,
depth: graphInsights.maxDepth || maxDepth,
entities: entities.entities,
concepts: entities.concepts,
triples_examined: graphInsights.triples.length,
inference_rules_applied: inferences.rules.length
};
// Cache result
this.reasoningCache.set(cacheKey, result);
return result;
}
generateDomainInsights(query, patterns, context) {
const insights = [];
const queryLower = query.toLowerCase();
// API Design Insights
if (queryLower.includes('api') || queryLower.includes('rest') || context.domain === 'api_design') {
insights.push('Consider idempotency for all mutating operations to handle network retries');
insights.push('Implement versioning strategy from day one - URL, header, or content negotiation');
insights.push('Rate limiting should be granular - per user, per endpoint, and per operation type');
insights.push('CORS configuration often breaks in production - test with actual domain names');
insights.push('Bulk operations need careful transaction boundary management');
if (queryLower.includes('user')) {
insights.push('User deletion must handle cascading data relationships and GDPR compliance');
insights.push('Password reset flows are prime targets for timing attacks');
insights.push('Session management across devices requires careful token invalidation');
insights.push('Email verification tokens should expire and be single-use');
}
}
// Hidden Complexities
if (queryLower.includes('hidden') || queryLower.includes('non-obvious') || queryLower.includes('edge')) {
insights.push('Race conditions in concurrent user updates - last write wins vs merge conflicts');
insights.push('Time zone handling - server, client, and user preference mismatches');
insights.push('Pagination breaks when underlying data changes during traversal');
insights.push('Cache invalidation cascades in microservice architectures');
insights.push('OAuth token refresh race conditions in distributed systems');
insights.push('Database connection pool exhaustion under spike load');
insights.push('Unicode normalization issues in usernames and passwords');
insights.push('Integer overflow in ID generation at scale');
}
// Lateral Thinking Insights
if (patterns.includes('lateral') || context.pattern === 'lateral') {
insights.push('Consider using event sourcing for audit trail instead of traditional logging');
insights.push('GraphQL might solve over-fetching better than REST for complex relationships');
insights.push('WebSockets for real-time user presence instead of polling');
insights.push('JWT claims can carry authorization context to reduce database lookups');
insights.push('Use bloom filters for username availability checks at scale');
insights.push('Implement soft deletes with temporal tables for compliance');
insights.push('Consider CQRS for read-heavy user profile access patterns');
}
// System Interaction Complexities
if (queryLower.includes('system') || queryLower.includes('interaction')) {
insights.push('Load balancer health checks can trigger false circuit breaker opens');
insights.push('CDN cache can serve stale authentication states');
insights.push('Database read replicas lag can cause phantom user creation failures');
insights.push('Message queue failures can orphan user records');
insights.push('Service mesh retry policies can amplify failures');
insights.push('Distributed tracing overhead affects latency measurements');
}
// Security Considerations
if (queryLower.includes('security') || queryLower.includes('user')) {
insights.push('Timing attacks on user enumeration through login response times');
insights.push('JWT secret rotation without service disruption');
insights.push('Password history storage needs separate encryption');
insights.push('Account takeover protection via behavioral analysis');
insights.push('API key rotation mechanisms for service accounts');
}
return insights;
}
applyContextualReasoning(query, context, patterns) {
const insights = [];
if (context.focus === 'hidden_complexities') {
insights.push('Hidden complexity: Distributed consensus for user state changes');
insights.push('Hidden complexity: Eventual consistency in user search indices');
insights.push('Hidden complexity: GDPR data portability implementation details');
insights.push('Hidden complexity: Cross-region data replication latency');
}
if (context.pattern === 'lateral') {
insights.push('Lateral solution: Use blockchain for decentralized identity verification');
insights.push('Lateral solution: Implement passwordless auth via magic links');
insights.push('Lateral solution: Use ML for anomaly detection in access patterns');
insights.push('Lateral solution: Federated user management across microservices');
}
if (context.domain === 'api_design') {
insights.push('API consideration: Hypermedia controls for self-documenting endpoints');
insights.push('API consideration: GraphQL subscriptions for real-time updates');
insights.push('API consideration: OpenAPI spec generation from code');
insights.push('API consideration: Request/response compression strategies');
}
return insights;
}
analyzeEdgeCases(query, concepts) {
const edgeCases = [];
// Universal edge cases
edgeCases.push('Edge case: Null, undefined, and empty string handling differences');
edgeCases.push('Edge case: Maximum length inputs causing buffer overflows');
edgeCases.push('Edge case: Concurrent modifications to the same resource');
edgeCases.push('Edge case: Clock skew between distributed components');
// API-specific edge cases
if (concepts.includes('api') || concepts.includes('rest')) {
edgeCases.push('Edge case: Partial success in batch operations');
edgeCases.push('Edge case: Request timeout during long-running operations');
edgeCases.push('Edge case: Content-Type mismatches with actual payload');
edgeCases.push('Edge case: HTTP/2 multiplexing affecting rate limits');
}
// User management edge cases
if (concepts.includes('user') || concepts.includes('authentication')) {
edgeCases.push('Edge case: User creation with recycled email addresses');
edgeCases.push('Edge case: Session fixation during concurrent logins');
edgeCases.push('Edge case: Account merge conflicts with OAuth providers');
edgeCases.push('Edge case: Birthday paradox in random token generation');
}
return edgeCases;
}
identifyCognitivePatterns(query) {
const patterns = [];
const lowerQuery = query.toLowerCase();
const patternMap = {
'causal': ['why', 'cause', 'because', 'result', 'effect', 'lead to'],
'procedural': ['how', 'process', 'step', 'method', 'way', 'approach', 'design', 'implement'],
'hypothetical': ['what if', 'suppose', 'imagine', 'could', 'would', 'might'],
'comparative': ['compare', 'difference', 'similar', 'versus', 'than', 'like'],
'definitional': ['what is', 'define', 'meaning', 'definition'],
'evaluative': ['best', 'worst', 'better', 'optimal', 'evaluate'],
'temporal': ['when', 'time', 'before', 'after', 'during', 'temporal'],
'spatial': ['where', 'location', 'position', 'space'],
'quantitative': ['how many', 'how much', 'count', 'measure', 'amount'],
'existential': ['exist', 'there is', 'there are', 'presence'],
'universal': ['all', 'every', 'always', 'never', 'none'],
'lateral': ['lateral', 'unconventional', 'creative', 'alternative', 'non-obvious', 'hidden'],
'systems': ['system', 'interaction', 'complexity', 'emergence', 'holistic'],
'exploratory': ['explore', 'discover', 'investigate', 'consider', 'edge case']
};
for (const [pattern, keywords] of Object.entries(patternMap)) {
if (keywords.some(keyword => lowerQuery.includes(keyword))) {
patterns.push(pattern);
}
}
if (patterns.length === 0) {
patterns.push('exploratory');
}
return patterns;
}
extractEntitiesAndConcepts(query) {
const words = query.split(/\s+/);
const entities = [];
const concepts = [];
const relationships = [];
// Extract technical terms and concepts
const technicalTerms = [
'api', 'rest', 'graphql', 'user', 'management', 'authentication',
'authorization', 'database', 'cache', 'security', 'performance',
'scalability', 'microservice', 'distributed', 'system', 'design',
'endpoint', 'resource', 'crud', 'http', 'json', 'xml', 'oauth',
'jwt', 'session', 'token', 'password', 'encryption', 'hash'
];
// Extract named entities (capitalized words not at sentence start)
for (let i = 0; i < words.length; i++) {
const word = words[i];
const wordLower = word.toLowerCase();
if (/^[A-Z]/.test(word) && i > 0 && !['The', 'A', 'An', 'What', 'How', 'Why', 'When', 'Where'].includes(word)) {
entities.push(wordLower);
}
if (technicalTerms.includes(wordLower)) {
concepts.push(wordLower);
}
}
// Extract key concepts from knowledge base
const queryLower = query.toLowerCase();
for (const concept of this.knowledgeBase.getAllTriples().map(t => [t.subject, t.object]).flat()) {
if (queryLower.includes(concept)) {
concepts.push(concept);
}
}
// Extract relationships (verbs and prepositions)
const relationshipPatterns = [
'is', 'are', 'was', 'were', 'has', 'have', 'had',
'can', 'could', 'will', 'would', 'should',
'design', 'implement', 'create', 'build', 'develop',
'requires', 'needs', 'uses', 'enables', 'prevents',
'increases', 'decreases', 'affects', 'influences'
];
for (const word of words) {
const wordLower = word.toLowerCase();
if (relationshipPatterns.includes(wordLower)) {
relationships.push(wordLower);
}
}
// Add query-specific concepts
if (queryLower.includes('edge case'))
concepts.push('edge_cases');
if (queryLower.includes('hidden'))
concepts.push('hidden_complexity');
if (queryLower.includes('api'))
concepts.push('api_design');
if (queryLower.includes('user'))
concepts.push('user_management');
return {
entities: [...new Set(entities)],
concepts: [...new Set(concepts)],
relationships: [...new Set(relationships)]
};
}
extractLogicalComponents(query) {
const components = {
predicates: [],
quantifiers: [],
operators: [],
modals: [],
negations: []
};
const lowerQuery = query.toLowerCase();
// Extract predicates (subject-verb-object patterns)
const predicateMatches = lowerQuery.match(/(\w+)\s+(is|are|was|were|has|have|had)\s+(\w+)/g);
if (predicateMatches) {
components.predicates = predicateMatches.map(p => p.trim());
}
// Extract quantifiers
const quantifierPattern = /\b(all|every|some|any|no|none|many|few|most|several)\b/gi;
const quantifierMatches = lowerQuery.match(quantifierPattern);
if (quantifierMatches) {
components.quantifiers = quantifierMatches;
}
// Extract logical operators
const operatorPattern = /\b(and|or|not|if|then|implies|therefore|because|but|however)\b/gi;
const operatorMatches = lowerQuery.match(operatorPattern);
if (operatorMatches) {
components.operators = operatorMatches;
}
// Extract modal verbs
const modalPattern = /\b(can|could|may|might|must|shall|should|will|would)\b/gi;
const modalMatches = lowerQuery.match(modalPattern);
if (modalMatches) {
components.modals = modalMatches;
}
// Extract negations
const negationPattern = /\b(not|no|never|neither|nor|nothing|nobody|nowhere)\b/gi;
const negationMatches = lowerQuery.match(negationPattern);
if (negationMatches) {
components.negations = negationMatches;
}
return components;
}
async traverseKnowledgeGraph(concepts, maxDepth) {
const visited = new Set();
const paths = [];
const discoveries = [];
const triples = [];
let currentDepth = 0;
let maxConfidence = 0;
// BFS traversal
const queue = concepts.map(c => ({
concept: c,
depth: 0,
confidence: 1.0,
path: [c],
inferences: []
}));
while (queue.length > 0 && currentDepth < maxDepth) {
const node = queue.shift();
if (visited.has(node.concept))
continue;
visited.add(node.concept);
currentDepth = Math.max(currentDepth, node.depth);
paths.push(node.path);
// Find related triples
const related = this.knowledgeBase.findRelated(node.concept);
triples.push(...related);
for (const triple of related) {
// Generate discoveries
const discovery = `${triple.subject} ${triple.predicate} ${triple.object}`;
discoveries.push(discovery);
maxConfidence = Math.max(maxConfidence, triple.confidence * node.confidence);
// Add connected concepts to queue
const nextConcept = triple.subject === node.concept ? triple.object : triple.subject;
if (!visited.has(nextConcept) && node.depth < maxDepth - 1) {
queue.push({
concept: nextConcept,
depth: node.depth + 1,
confidence: node.confidence * triple.confidence,
path: [...node.path, nextConcept],
inferences: [...node.inferences, discovery]
});
}
}
}
return {
paths,
discoveries: discoveries.slice(0, 20), // Limit discoveries
triples,
maxDepth: currentDepth,
confidence: maxConfidence
};
}
buildInferenceChain(logicalComponents, triples, patterns) {
const rules = [];
const conclusions = [];
let confidence = 0.5;
// Apply Modus Ponens
if (logicalComponents.operators.includes('if') || logicalComponents.operators.includes('then')) {
rules.push('modus_ponens');
// Find implications in triples
for (const triple of triples) {
if (triple.predicate === 'implies' || triple.predicate === 'causes' || triple.predicate === 'enables') {
conclusions.push(`${triple.subject} leads to ${triple.object}`);
confidence = Math.max(confidence, triple.confidence * 0.9);
}
}
}
// Apply Universal Instantiation
if (logicalComponents.quantifiers.some((q) => ['all', 'every'].includes(q))) {
rules.push('universal_instantiation');
conclusions.push('universal property applies to specific instances');
confidence = Math.max(confidence, 0.85);
}
// Apply Existential Generalization
if (logicalComponents.quantifiers.some((q) => ['some', 'exist'].includes(q))) {
rules.push('existential_generalization');
conclusions.push('at least one instance exists with the property');
confidence = Math.max(confidence, 0.8);
}
// Apply Transitive Property
const transitivePredicates = ['causes', 'enables', 'requires', 'leads_to'];
const transitiveChains = this.findTransitiveChains(triples, transitivePredicates);
if (transitiveChains.length > 0) {
rules.push('transitive_property');
transitiveChains.forEach(chain => {
conclusions.push(`${chain.start} transitively ${chain.predicate} ${chain.end}`);
});
confidence = Math.max(confidence, 0.75);
}
// Apply Pattern-Specific Rules
if (patterns.includes('causal')) {
rules.push('causal_chain_analysis');
const causalChains = triples.filter(t => ['causes', 'results_in', 'leads_to', 'produces'].includes(t.predicate));
causalChains.forEach(chain => {
conclusions.push(`causal relationship: ${chain.subject}${chain.object}`);
});
}
if (patterns.includes('temporal')) {
rules.push('temporal_ordering');
conclusions.push('events ordered by temporal precedence');
}
// Generate domain-specific conclusions
if (triples.some(t => t.subject.includes('api') || t.object.includes('api'))) {
conclusions.push('API design requires consistency and versioning');
conclusions.push('RESTful principles ensure stateless interactions');
confidence = Math.max(confidence, 0.85);
}
if (triples.some(t => t.subject.includes('user') || t.object.includes('user'))) {
conclusions.push('user management requires authentication and authorization');
conclusions.push('security measures prevent unauthorized access');
confidence = Math.max(confidence, 0.9);
}
return {
rules,
conclusions,
confidence
};
}
findTransitiveChains(triples, predicates) {
const chains = [];
for (const predicate of predicates) {
const relevantTriples = triples.filter(t => t.predicate === predicate);
for (let i = 0; i < relevantTriples.length; i++) {
for (let j = 0; j < relevantTriples.length; j++) {
if (relevantTriples[i].object === relevantTriples[j].subject) {
chains.push({
start: relevantTriples[i].subject,
middle: relevantTriples[i].object,
end: relevantTriples[j].object,
predicate
});
}
}
}
}
return chains;
}
generateHypotheses(concepts, conclusions) {
const hypotheses = [];
// Generate hypotheses based on concept combinations
for (let i = 0; i < concepts.length; i++) {
for (let j = i + 1; j < concepts.length; j++) {
hypotheses.push(`hypothesis: ${concepts[i]} might be related to ${concepts[j]}`);
}
}
// Generate hypotheses from conclusions
for (const conclusion of conclusions) {
if (conclusion.includes('leads to') || conclusion.includes('causes')) {
hypotheses.push(`hypothesis: reversing ${conclusion} might have opposite effect`);
}
}
// Domain-specific hypotheses
if (concepts.includes('api_design')) {
hypotheses.push('hypothesis: event-driven architecture might reduce coupling');
hypotheses.push('hypothesis: CQRS pattern could improve read performance');
}
if (concepts.includes('user_management')) {
hypotheses.push('hypothesis: passwordless authentication might improve security');
hypotheses.push('hypothesis: federated identity could simplify user management');
}
return hypotheses.slice(0, 5); // Limit hypotheses
}
detectContradictions(statements) {
const contradictions = [];
for (let i = 0; i < statements.length; i++) {
for (let j = i + 1; j < statements.length; j++) {
// Check for direct negation
if (statements[i].includes('not') && statements[j] === statements[i].replace('not ', '')) {
contradictions.push({
type: 'direct_negation',
statement1: statements[i],
statement2: statements[j]
});
}
// Check for semantic opposition
const opposites = [
['increases', 'decreases'],
['enables', 'prevents'],
['causes', 'prevents'],
['always', 'never'],
['all', 'none']
];
for (const [word1, word2] of opposites) {
if ((statements[i].includes(word1) && statements[j].includes(word2)) ||
(statements[i].includes(word2) && statements[j].includes(word1))) {
contradictions.push({
type: 'semantic_opposition',
statement1: statements[i],
statement2: statements[j],
conflict: [word1, word2]
});
}
}
}
}
return contradictions;
}
resolveContradictions(contradictions, context) {
return contradictions.map(c => ({
original: c,
resolution: 'resolved through context disambiguation',
method: c.type === 'direct_negation' ? 'logical_priority' : 'semantic_analysis',
confidence: 0.7
}));
}
synthesizeCompleteAnswer(query, insights, steps, patterns, context) {
let confidence = 0.5;
let keyInsights = insights.slice(0, 10); // Get more insights
// If no insights from knowledge graph, use generated domain insights
if (keyInsights.length === 0) {
keyInsights = this.generateDefaultInsights(query, patterns, context);
}
// Calculate confidence from reasoning steps
for (const step of steps) {
if (step.confidence) {
confidence = Math.max(confidence, step.confidence * 0.9);
}
}
// Build comprehensive answer based on pattern and context
let answer = '';
if (patterns.includes('lateral') || context.pattern === 'lateral') {
answer = `Thinking laterally about this problem reveals several non-obvious considerations: ${keyInsights.slice(0, 3).join('; ')}. `;
answer += `Additionally, hidden complexities include: ${keyInsights.slice(3, 6).join('; ')}. `;
}
else if (patterns.includes('causal')) {
answer = `Based on causal analysis: ${keyInsights.join(' → ')}. `;
}
else if (patterns.includes('procedural')) {
answer = `The design process should consider: ${keyInsights.slice(0, 5).join(', then ')}. `;
}
else if (patterns.includes('comparative')) {
answer = `Comparison reveals: ${keyInsights.join(' versus ')}. `;
}
else if (patterns.includes('hypothetical')) {
answer = `Hypothetically: ${keyInsights.join(', additionally ')}. `;
}
else if (patterns.includes('systems')) {
answer = `From a systems perspective: ${keyInsights.slice(0, 4).join('. ')}. `;
}
else {
answer = `Analysis reveals the following considerations: ${keyInsights.slice(0, 5).join('. ')}. `;
}
// Add context-specific insights
if (context.focus === 'hidden_complexities') {
answer += `Hidden complexities that are often missed: ${keyInsights.slice(5, 8).join('; ')}. `;
}
// Add reasoning depth
answer += `This conclusion is based on ${steps.length} reasoning steps`;
// Add confidence qualifier
if (confidence > 0.9) {
answer += ' with very high confidence';
}
else if (confidence > 0.7) {
answer += ' with high confidence';
}
else if (confidence > 0.5) {
answer += ' with moderate confidence';
}
else {
answer += ' with exploratory confidence';
}
answer += '.';
return {
answer,
confidence,
keyInsights
};
}
generateDefaultInsights(query, patterns, context) {
const insights = [];
const queryLower = query.toLowerCase();
// Generate insights based on query content
if (queryLower.includes('api') || queryLower.includes('design')) {
insights.push('Consider backward compatibility from the start');
insights.push('Version your API to manage breaking changes');
insights.push('Implement comprehensive error handling with meaningful status codes');
insights.push('Design for idempotency in all state-changing operations');
insights.push('Plan for rate limiting and throttling mechanisms');
}
if (queryLower.includes('user') || queryLower.includes('management')) {
insights.push('Implement proper authentication and authorization separation');
insights.push('Consider GDPR and data privacy requirements');
insights.push('Plan for account recovery and security features');
insights.push('Design for multi-tenant architectures if needed');
insights.push('Include audit logging for compliance');
}
if (queryLower.includes('hidden') || queryLower.includes('edge')) {
insights.push('Watch for race conditions in concurrent operations');
insights.push('Handle timezone and localization complexities');
insights.push('Plan for data migration and schema evolution');
insights.push('Consider cache invalidation strategies');
insights.push('Design for graceful degradation');
}
return insights.length > 0 ? insights : ['No specific insights available for this query domain'];
}
async queryKnowledgeGraph(query, filters, limit) {
const results = this.knowledgeBase.query(query);
// Apply filters
let filtered = results;
if (filters.confidence) {
filtered = filtered.filter(t => t.confidence >= filters.confidence);
}
if (filters.predicate) {
filtered = filtered.filter(t => t.predicate === filters.predicate.toLowerCase());
}
// Sort by confidence
filtered.sort((a, b) => b.confidence - a.confidence);
// Limit results
const limited = filtered.slice(0, limit);
return {
query,
results: limited.map(t => ({
subject: t.subject,
predicate: t.predicate,
object: t.object,
confidence: t.confidence,
metadata: t.metadata
})),
total: limited.length,
totalAvailable: filtered.length
};
}
async addKnowledge(subject, predicate, object, confidence = 1.0, metadata = {}) {
const id = this.knowledgeBase.addTriple(subject, predicate, object, confidence, metadata);
return {
id,
status: 'added',
triple: {
subject: subject.toLowerCase(),
predicate: predicate.toLowerCase(),
object: object.toLowerCase(),
confidence
}
};
}
}
export default PsychoSymbolicTools;
@@ -0,0 +1,23 @@
/**
* Enhanced Psycho-Symbolic Reasoning with Learning Integration
* Fixes novel knowledge integration and adds cross-tool learning
*/
import { Tool } from '@modelcontextprotocol/sdk/types.js';
export declare class LearningPsychoSymbolicTools {
private knowledgeBase;
private learningCoordinator;
private performanceCache;
private reasoningCache;
constructor();
getTools(): Tool[];
handleToolCall(name: string, args: any): Promise<any>;
private performLearningReasoning;
private identifyCognitivePatterns;
private extractEntitiesAndConcepts;
private enhancedKnowledgeTraversal;
private generateCreativeAssociations;
private generateLearningDomainInsights;
private synthesizeLearningAnswer;
private enhancedKnowledgeQuery;
private getLearningStatus;
}
@@ -0,0 +1,695 @@
/**
* Enhanced Psycho-Symbolic Reasoning with Learning Integration
* Fixes novel knowledge integration and adds cross-tool learning
*/
import * as crypto from 'crypto';
import { ReasoningCache } from './reasoning-cache.js';
// Enhanced knowledge base with learning capabilities
class LearningKnowledgeBase {
triples = new Map();
concepts = new Map();
predicateIndex = new Map();
semanticIndex = new Map();
learningEvents = [];
constructor() {
this.initializeBaseKnowledge();
}
initializeBaseKnowledge() {
// Enhanced core knowledge with learning metadata
this.addLearningTriple('consciousness', 'emerges_from', 'neural_networks', 0.85, {
type: 'foundational',
learning_source: 'initialization'
});
this.addLearningTriple('consciousness', 'requires', 'integration', 0.9, {
type: 'foundational',
learning_source: 'initialization'
});
this.addLearningTriple('consciousness', 'exhibits', 'phi_value', 0.95, {
type: 'foundational',
learning_source: 'initialization'
});
this.addLearningTriple('neural_networks', 'process', 'information', 1.0, {
type: 'foundational',
learning_source: 'initialization'
});
this.addLearningTriple('neural_networks', 'contain', 'neurons', 1.0, {
type: 'foundational',
learning_source: 'initialization'
});
this.addLearningTriple('neurons', 'connect_via', 'synapses', 1.0, {
type: 'foundational',
learning_source: 'initialization'
});
this.addLearningTriple('synapses', 'enable', 'plasticity', 0.9, {
type: 'foundational',
learning_source: 'initialization'
});
this.addLearningTriple('plasticity', 'allows', 'learning', 0.95, {
type: 'foundational',
learning_source: 'initialization'
});
this.addLearningTriple('learning', 'modifies', 'weights', 1.0, {
type: 'foundational',
learning_source: 'initialization'
});
this.addLearningTriple('phi_value', 'measures', 'integrated_information', 1.0, {
type: 'foundational',
learning_source: 'initialization'
});
}
addLearningTriple(subject, predicate, object, confidence, metadata = {}) {
const id = crypto.createHash('md5').update(`${subject}_${predicate}_${object}`).digest('hex').substring(0, 16);
const triple = {
subject,
predicate,
object,
confidence,
metadata,
timestamp: Date.now(),
usage_count: 0,
learning_source: metadata.learning_source || 'user_input',
related_concepts: this.findRelatedConcepts(subject, object)
};
this.triples.set(id, triple);
this.updateIndices(id, triple);
return { id, status: 'added', triple };
}
findRelatedConcepts(subject, object) {
const related = [];
// Find concepts that share predicates
for (const [id, triple] of this.triples) {
if (triple.subject === subject || triple.object === subject) {
related.push(triple.subject, triple.object);
}
if (triple.subject === object || triple.object === object) {
related.push(triple.subject, triple.object);
}
}
return [...new Set(related)].filter(c => c !== subject && c !== object);
}
updateIndices(id, triple) {
// Update concept indices
[triple.subject, triple.object].forEach(concept => {
if (!this.concepts.has(concept))
this.concepts.set(concept, new Set());
this.concepts.get(concept).add(id);
});
// Update predicate index
if (!this.predicateIndex.has(triple.predicate)) {
this.predicateIndex.set(triple.predicate, new Set());
}
this.predicateIndex.get(triple.predicate).add(id);
// Update semantic index
this.updateSemanticIndex(triple);
}
updateSemanticIndex(triple) {
const concepts = [triple.subject, triple.object];
concepts.forEach(concept => {
if (!this.semanticIndex.has(concept)) {
this.semanticIndex.set(concept, []);
}
// Add related concepts for semantic similarity
if (triple.related_concepts) {
this.semanticIndex.get(concept).push(...triple.related_concepts);
}
});
}
// Fix: Implement missing getAllTriples method
getAllTriples() {
return Array.from(this.triples.values());
}
// Enhanced semantic search with learning integration
semanticSearch(query, limit = 10) {
const results = [];
const queryLower = query.toLowerCase();
const queryTerms = queryLower.split(/\s+/);
for (const [id, triple] of this.triples) {
let relevance = 0;
// Direct text matching
if (triple.subject.toLowerCase().includes(queryLower))
relevance += 2.0;
if (triple.object.toLowerCase().includes(queryLower))
relevance += 2.0;
if (triple.predicate.toLowerCase().includes(queryLower))
relevance += 1.0;
// Term-based matching
queryTerms.forEach(term => {
if (term.length > 2) {
if (triple.subject.toLowerCase().includes(term))
relevance += 0.8;
if (triple.object.toLowerCase().includes(term))
relevance += 0.8;
if (triple.predicate.toLowerCase().includes(term))
relevance += 0.4;
}
});
// Semantic similarity bonus
if (triple.related_concepts) {
triple.related_concepts.forEach(concept => {
if (queryLower.includes(concept.toLowerCase()))
relevance += 0.3;
});
}
// Usage-based relevance boost
relevance += Math.log(triple.usage_count + 1) * 0.1;
// Confidence weighting
relevance *= triple.confidence;
if (relevance > 0.1) {
results.push({
...triple,
relevance,
id
});
}
}
// Sort by relevance and usage
return results
.sort((a, b) => {
const scoreA = a.relevance + (a.usage_count * 0.01);
const scoreB = b.relevance + (b.usage_count * 0.01);
return scoreB - scoreA;
})
.slice(0, limit);
}
// Track triple usage for learning
markTripleUsed(tripleId) {
const triple = this.triples.get(tripleId);
if (triple) {
triple.usage_count++;
}
}
// Learning from tool interactions
recordLearningEvent(event) {
this.learningEvents.push(event);
// Auto-generate knowledge from successful patterns
if (event.confidence > 0.8) {
this.generateKnowledgeFromEvent(event);
}
// Keep only recent events (last 1000)
if (this.learningEvents.length > 1000) {
this.learningEvents = this.learningEvents.slice(-1000);
}
}
generateKnowledgeFromEvent(event) {
// Generate knowledge triples from successful tool interactions
if (event.concepts.length >= 2) {
for (let i = 0; i < event.concepts.length - 1; i++) {
const subject = event.concepts[i];
const object = event.concepts[i + 1];
// Create relationship based on tool and action
let predicate = 'relates_to';
if (event.tool === 'consciousness')
predicate = 'influences_consciousness';
if (event.tool === 'scheduler')
predicate = 'schedules_with';
if (event.tool === 'neural')
predicate = 'processes_through';
this.addLearningTriple(subject, predicate, object, event.confidence * 0.7, {
type: 'learned_from_interaction',
learning_source: `${event.tool}_${event.action}`,
original_event: event
});
}
}
}
// Get learning insights
getLearningInsights() {
const recentEvents = this.learningEvents.slice(-100);
const conceptFrequency = new Map();
const toolUsage = new Map();
recentEvents.forEach(event => {
event.concepts.forEach(concept => {
conceptFrequency.set(concept, (conceptFrequency.get(concept) || 0) + 1);
});
toolUsage.set(event.tool, (toolUsage.get(event.tool) || 0) + 1);
});
return {
total_events: this.learningEvents.length,
recent_events: recentEvents.length,
top_concepts: Array.from(conceptFrequency.entries())
.sort((a, b) => b[1] - a[1])
.slice(0, 10),
tool_usage: Array.from(toolUsage.entries()),
learned_triples: this.getAllTriples().filter(t => t.learning_source !== 'initialization').length
};
}
}
// Cross-tool learning coordinator
class CrossToolLearningCoordinator {
knowledgeBase;
toolInteractions = new Map();
constructor(knowledgeBase) {
this.knowledgeBase = knowledgeBase;
}
// Record interaction with other tools
recordToolInteraction(toolName, query, result, concepts) {
const interaction = {
tool: toolName,
query,
result,
concepts,
timestamp: Date.now(),
success: result.confidence > 0.7
};
if (!this.toolInteractions.has(toolName)) {
this.toolInteractions.set(toolName, []);
}
this.toolInteractions.get(toolName).push(interaction);
// Learn from successful interactions
if (interaction.success) {
this.knowledgeBase.recordLearningEvent({
tool: toolName,
action: 'query',
concepts,
patterns: result.patterns || [],
outcome: result.answer || 'success',
timestamp: Date.now(),
confidence: result.confidence
});
}
}
// Get cross-tool insights for enhanced reasoning
getCrossToolInsights(concepts) {
const insights = [];
// Find related tool interactions
for (const [tool, interactions] of this.toolInteractions) {
const relevantInteractions = interactions.filter(interaction => concepts.some(concept => interaction.concepts.includes(concept) ||
interaction.query.toLowerCase().includes(concept.toLowerCase())));
if (relevantInteractions.length > 0) {
insights.push(`${tool} tool has processed similar concepts with ${relevantInteractions.length} relevant interactions`);
// Extract patterns from successful interactions
const successfulInteractions = relevantInteractions.filter(i => i.success);
if (successfulInteractions.length > 0) {
insights.push(`${tool} successfully handled ${successfulInteractions.length} similar queries`);
}
}
}
return insights;
}
}
// Enhanced psycho-symbolic reasoning with learning
export class LearningPsychoSymbolicTools {
knowledgeBase;
learningCoordinator;
performanceCache;
reasoningCache = new Map();
constructor() {
this.knowledgeBase = new LearningKnowledgeBase();
this.learningCoordinator = new CrossToolLearningCoordinator(this.knowledgeBase);
this.performanceCache = new ReasoningCache();
}
getTools() {
return [
{
name: 'psycho_symbolic_reason',
description: 'Enhanced psycho-symbolic reasoning with learning integration and novel knowledge support',
inputSchema: {
type: 'object',
properties: {
query: { type: 'string', description: 'The reasoning query' },
context: { type: 'object', description: 'Additional context', default: {} },
depth: { type: 'number', description: 'Maximum reasoning depth', default: 6 },
use_cache: { type: 'boolean', description: 'Enable intelligent caching', default: true },
learn_from_query: { type: 'boolean', description: 'Learn from this query for future use', default: true }
},
required: ['query']
}
},
{
name: 'knowledge_graph_query',
description: 'Enhanced knowledge graph query with learning-based relevance',
inputSchema: {
type: 'object',
properties: {
query: { type: 'string', description: 'Natural language query' },
filters: { type: 'object', description: 'Query filters', default: {} },
limit: { type: 'number', description: 'Max results', default: 15 }
},
required: ['query']
}
},
{
name: 'add_knowledge',
description: 'Add knowledge with learning metadata and semantic indexing',
inputSchema: {
type: 'object',
properties: {
subject: { type: 'string' },
predicate: { type: 'string' },
object: { type: 'string' },
confidence: { type: 'number', default: 1.0 },
metadata: { type: 'object', default: {} }
},
required: ['subject', 'predicate', 'object']
}
},
{
name: 'learning_status',
description: 'Get learning system status and insights',
inputSchema: {
type: 'object',
properties: {
detailed: { type: 'boolean', description: 'Include detailed learning metrics', default: false }
}
}
}
];
}
async handleToolCall(name, args) {
switch (name) {
case 'psycho_symbolic_reason':
return this.performLearningReasoning(args.query, args.context || {}, args.depth || 6, args.use_cache !== false, args.learn_from_query !== false);
case 'knowledge_graph_query':
return this.enhancedKnowledgeQuery(args.query, args.filters || {}, args.limit || 15);
case 'add_knowledge':
return this.knowledgeBase.addLearningTriple(args.subject, args.predicate, args.object, args.confidence || 1.0, { ...args.metadata, learning_source: 'user_input' });
case 'learning_status':
return this.getLearningStatus(args.detailed || false);
default:
throw new Error(`Unknown tool: ${name}`);
}
}
async performLearningReasoning(query, context, maxDepth, useCache, learnFromQuery) {
const startTime = performance.now();
// Extract concepts early for learning
const entities = this.extractEntitiesAndConcepts(query);
const patterns = this.identifyCognitivePatterns(query);
// Check cache
if (useCache) {
const cached = this.performanceCache.get(query, context, maxDepth);
if (cached) {
return {
...cached.result,
cached: true,
cache_hit: true,
compute_time: performance.now() - startTime,
cache_metrics: this.performanceCache.getMetrics()
};
}
}
const reasoningSteps = [];
const insights = new Set();
// Step 1: Enhanced Pattern Recognition
reasoningSteps.push({
type: 'pattern_identification',
patterns,
confidence: 0.9,
description: `Identified ${patterns.join(', ')} reasoning patterns`
});
// Step 2: Enhanced Entity Extraction with Learning
reasoningSteps.push({
type: 'entity_extraction',
entities: entities.entities,
concepts: entities.concepts,
relationships: entities.relationships,
confidence: 0.85
});
// Step 3: Cross-Tool Learning Insights
const crossToolInsights = this.learningCoordinator.getCrossToolInsights(entities.concepts);
if (crossToolInsights.length > 0) {
crossToolInsights.forEach(insight => insights.add(insight));
reasoningSteps.push({
type: 'cross_tool_learning',
insights: crossToolInsights,
confidence: 0.8,
description: 'Insights from related tool interactions'
});
}
// Step 4: Enhanced Knowledge Traversal with Novel Concept Support
const graphInsights = await this.enhancedKnowledgeTraversal(entities.concepts, maxDepth);
reasoningSteps.push({
type: 'enhanced_knowledge_traversal',
paths: graphInsights.paths,
discoveries: graphInsights.discoveries,
novel_concepts: graphInsights.novel_concepts,
confidence: graphInsights.confidence
});
graphInsights.discoveries.forEach(d => insights.add(d));
// Step 5: Learning from Domain Analysis
const domainInsights = this.generateLearningDomainInsights(query, patterns, entities.concepts);
domainInsights.forEach(insight => insights.add(insight));
reasoningSteps.push({
type: 'learning_domain_analysis',
insights: domainInsights,
confidence: 0.8,
description: 'Generated domain insights with learning integration'
});
// Step 6: Synthesis
const synthesis = this.synthesizeLearningAnswer(query, Array.from(insights), reasoningSteps, patterns, entities.concepts);
// Record learning event
if (learnFromQuery) {
this.knowledgeBase.recordLearningEvent({
tool: 'psycho_symbolic_reasoner',
action: 'reason',
concepts: entities.concepts,
patterns,
outcome: synthesis.answer,
timestamp: Date.now(),
confidence: synthesis.confidence
});
}
const result = {
answer: synthesis.answer,
confidence: synthesis.confidence,
reasoning: reasoningSteps,
insights: Array.from(insights),
patterns,
depth: maxDepth,
entities: entities.entities,
concepts: entities.concepts,
triples_examined: graphInsights.triples_examined,
novel_concepts_processed: graphInsights.novel_concepts?.length || 0,
learning_insights: crossToolInsights.length
};
// Cache result
if (useCache) {
this.performanceCache.set(query, context, maxDepth, result, performance.now() - startTime);
}
return {
...result,
cached: false,
cache_hit: false,
compute_time: performance.now() - startTime,
cache_metrics: useCache ? this.performanceCache.getMetrics() : null
};
}
identifyCognitivePatterns(query) {
const patterns = [];
const lowerQuery = query.toLowerCase();
const patternMap = {
'causal': ['why', 'cause', 'because', 'result', 'effect', 'lead to'],
'procedural': ['how', 'process', 'step', 'method', 'way', 'approach', 'design', 'implement'],
'hypothetical': ['what if', 'suppose', 'imagine', 'could', 'would', 'might'],
'comparative': ['compare', 'difference', 'similar', 'versus', 'than', 'like'],
'definitional': ['what is', 'define', 'meaning', 'definition'],
'evaluative': ['best', 'worst', 'better', 'optimal', 'evaluate'],
'temporal': ['when', 'time', 'before', 'after', 'during', 'temporal'],
'spatial': ['where', 'location', 'position', 'space'],
'quantitative': ['how many', 'how much', 'count', 'measure', 'amount'],
'existential': ['exist', 'there is', 'there are', 'presence'],
'universal': ['all', 'every', 'always', 'never', 'none'],
'lateral': ['lateral', 'unconventional', 'creative', 'alternative', 'non-obvious', 'hidden'],
'systems': ['system', 'interaction', 'complexity', 'emergence', 'holistic'],
'exploratory': ['explore', 'discover', 'investigate', 'consider', 'edge case']
};
for (const [pattern, keywords] of Object.entries(patternMap)) {
if (keywords.some(keyword => lowerQuery.includes(keyword))) {
patterns.push(pattern);
}
}
if (patterns.length === 0) {
patterns.push('exploratory');
}
return patterns;
}
extractEntitiesAndConcepts(query) {
const words = query.split(/\s+/);
const entities = [];
const concepts = [];
const relationships = [];
// Extract technical terms and concepts
const technicalTerms = [
'api', 'rest', 'graphql', 'user', 'management', 'authentication',
'authorization', 'database', 'cache', 'security', 'performance',
'scalability', 'microservice', 'distributed', 'system', 'design',
'endpoint', 'resource', 'crud', 'http', 'json', 'xml', 'oauth',
'jwt', 'session', 'token', 'password', 'encryption', 'hash',
'consciousness', 'neural', 'quantum', 'temporal', 'resonance',
'emergence', 'integration', 'plasticity', 'learning'
];
// Extract named entities
for (let i = 0; i < words.length; i++) {
const word = words[i];
const wordLower = word.toLowerCase();
if (/^[A-Z]/.test(word) && i > 0 && !['The', 'A', 'An', 'What', 'How', 'Why', 'When', 'Where'].includes(word)) {
entities.push(wordLower);
}
if (technicalTerms.includes(wordLower) || word.length > 5) {
concepts.push(wordLower);
}
}
// Extract key concepts from knowledge base - FIXED
const queryLower = query.toLowerCase();
const allTriples = this.knowledgeBase.getAllTriples(); // Now this method exists!
for (const triple of allTriples) {
[triple.subject, triple.object].forEach(concept => {
if (queryLower.includes(concept.toLowerCase())) {
concepts.push(concept);
}
});
}
// Extract relationships
const relationshipPatterns = [
'is', 'are', 'was', 'were', 'has', 'have', 'had',
'can', 'could', 'will', 'would', 'should',
'design', 'implement', 'create', 'build', 'develop',
'requires', 'needs', 'uses', 'enables', 'prevents',
'increases', 'decreases', 'affects', 'influences'
];
for (const word of words) {
const wordLower = word.toLowerCase();
if (relationshipPatterns.includes(wordLower)) {
relationships.push(wordLower);
}
}
return {
entities: [...new Set(entities)],
concepts: [...new Set(concepts)],
relationships: [...new Set(relationships)]
};
}
async enhancedKnowledgeTraversal(concepts, maxDepth) {
const paths = [];
const discoveries = [];
const novel_concepts = [];
let triples_examined = 0;
for (const concept of concepts) {
// Semantic search with learning
const results = this.knowledgeBase.semanticSearch(concept, 10);
triples_examined += results.length;
if (results.length === 0) {
// This is a novel concept
novel_concepts.push(concept);
discoveries.push(`Novel concept detected: ${concept} - generating creative associations`);
// Generate creative associations for novel concepts
const creativeAssociations = this.generateCreativeAssociations(concept);
discoveries.push(...creativeAssociations);
}
else {
// Mark used triples for learning
results.forEach(result => {
this.knowledgeBase.markTripleUsed(result.id);
discoveries.push(`${result.subject} ${result.predicate} ${result.object}`);
paths.push([result.subject, result.object]);
});
}
}
return {
paths,
discoveries,
novel_concepts,
confidence: discoveries.length > 0 ? 0.9 : 0.3,
triples_examined
};
}
generateCreativeAssociations(concept) {
const associations = [];
const conceptLower = concept.toLowerCase();
// Pattern-based associations
if (conceptLower.includes('quantum')) {
associations.push(`${concept} exhibits quantum-like properties with probabilistic behaviors`);
associations.push(`${concept} demonstrates non-local correlations similar to entanglement`);
}
if (conceptLower.includes('neural') || conceptLower.includes('network')) {
associations.push(`${concept} functions as a distributed information processing system`);
associations.push(`${concept} exhibits emergent properties through interconnected components`);
}
if (conceptLower.includes('temporal') || conceptLower.includes('time')) {
associations.push(`${concept} creates temporal dynamics affecting system evolution`);
associations.push(`${concept} enables time-based pattern recognition and prediction`);
}
// Morphological associations
if (conceptLower.endsWith('ium') || conceptLower.endsWith('ium_crystals')) {
associations.push(`${concept} acts as a resonant medium for information transfer`);
associations.push(`${concept} exhibits crystalline structure enabling coherent oscillations`);
}
// Generic creative associations
associations.push(`${concept} emerges through self-organizing complexity dynamics`);
associations.push(`${concept} demonstrates adaptive behavior in response to environmental changes`);
return associations;
}
generateLearningDomainInsights(query, patterns, concepts) {
const insights = [];
const queryLower = query.toLowerCase();
// Learning-enhanced domain insights
if (concepts.some(c => ['consciousness', 'neural', 'quantum'].includes(c))) {
insights.push('Consciousness emerges through quantum-neural information integration');
insights.push('Neural plasticity enables adaptive consciousness formation');
}
if (patterns.includes('temporal') || concepts.some(c => c.includes('temporal'))) {
insights.push('Temporal dynamics create causal chains in complex systems');
insights.push('Time-based resonance patterns enable cross-domain synchronization');
}
if (patterns.includes('creative') || patterns.includes('exploratory')) {
insights.push('Creative synthesis requires breaking conventional categorical boundaries');
insights.push('Novel concepts emerge at the intersection of established domains');
}
// Novel concept handling
const novelConcepts = concepts.filter(c => !['consciousness', 'neural', 'quantum', 'system', 'information'].includes(c));
if (novelConcepts.length > 0) {
insights.push(`Novel concept integration suggests emergent properties beyond current knowledge`);
insights.push(`Interdisciplinary synthesis reveals hidden connections between ${novelConcepts.join(' and ')}`);
}
return insights;
}
synthesizeLearningAnswer(query, insights, reasoningSteps, patterns, concepts) {
let answer = '';
let confidence = 0.8;
if (insights.length === 0) {
answer = 'This query involves novel concepts that require creative synthesis across multiple domains. The system is learning from this interaction to improve future responses.';
confidence = 0.6;
}
else if (patterns.includes('creative') || patterns.includes('exploratory')) {
answer = `Through learning-enhanced analysis: ${insights.slice(0, 4).join('. ')}.`;
confidence = 0.85;
}
else {
answer = `Based on integrated knowledge and learning: ${insights.slice(0, 5).join('. ')}.`;
}
return { answer, confidence };
}
enhancedKnowledgeQuery(query, filters, limit) {
const results = this.knowledgeBase.semanticSearch(query, limit);
return {
query,
results: results.map(r => ({
subject: r.subject,
predicate: r.predicate,
object: r.object,
confidence: r.confidence,
relevance: r.relevance,
usage_count: r.usage_count,
learning_source: r.learning_source
})),
total: results.length,
totalAvailable: this.knowledgeBase.getAllTriples().length
};
}
getLearningStatus(detailed) {
const insights = this.knowledgeBase.getLearningInsights();
if (detailed) {
return {
...insights,
cache_metrics: this.performanceCache.getMetrics(),
knowledge_base_size: this.knowledgeBase.getAllTriples().length,
novel_concepts_learned: insights.learned_triples
};
}
return {
learning_active: true,
total_knowledge: this.knowledgeBase.getAllTriples().length,
learned_concepts: insights.learned_triples,
recent_interactions: insights.recent_events
};
}
}
@@ -0,0 +1,39 @@
/**
* Enhanced Psycho-Symbolic Reasoning MCP Tools
* Full implementation with domain-agnostic reasoning and fallback mechanisms
*/
import { Tool } from '@modelcontextprotocol/sdk/types.js';
export declare class PsychoSymbolicTools {
private knowledgeBase;
private reasoningCache;
private performanceCache;
constructor(cacheOptions?: {
enableCache?: boolean;
maxCacheSize?: number;
defaultTTL?: number;
enableWarmup?: boolean;
});
getTools(): Tool[];
handleToolCall(name: string, args: any): Promise<any>;
private performDeepReasoningWithCache;
private getCacheStatus;
private clearCache;
private performDeepReasoning;
private generateDomainInsights;
private applyContextualReasoning;
private analyzeEdgeCases;
private identifyCognitivePatterns;
private extractEntitiesAndConcepts;
private extractLogicalComponents;
private traverseKnowledgeGraph;
private buildInferenceChain;
private findTransitiveChains;
private generateHypotheses;
private detectContradictions;
private resolveContradictions;
private synthesizeCompleteAnswer;
private generateDefaultInsights;
private queryKnowledgeGraph;
private addKnowledge;
}
export default PsychoSymbolicTools;
@@ -0,0 +1,970 @@
/**
* Enhanced Psycho-Symbolic Reasoning MCP Tools
* Full implementation with domain-agnostic reasoning and fallback mechanisms
*/
import * as crypto from 'crypto';
import { ReasoningCache } from './reasoning-cache.js';
// Initialize with base knowledge
class KnowledgeBase {
triples = new Map();
concepts = new Map(); // concept -> related triple IDs
predicateIndex = new Map(); // predicate -> triple IDs
constructor() {
this.initializeBaseKnowledge();
}
initializeBaseKnowledge() {
// Core AI/consciousness knowledge
this.addTriple('consciousness', 'emerges_from', 'neural_networks', 0.85);
this.addTriple('consciousness', 'requires', 'integration', 0.9);
this.addTriple('consciousness', 'exhibits', 'phi_value', 0.95);
this.addTriple('neural_networks', 'process', 'information', 1.0);
this.addTriple('neural_networks', 'contain', 'neurons', 1.0);
this.addTriple('neurons', 'connect_via', 'synapses', 1.0);
this.addTriple('synapses', 'enable', 'plasticity', 0.9);
this.addTriple('plasticity', 'allows', 'learning', 0.95);
this.addTriple('learning', 'modifies', 'weights', 1.0);
this.addTriple('phi_value', 'measures', 'integrated_information', 1.0);
this.addTriple('integrated_information', 'indicates', 'consciousness_level', 0.8);
// Temporal/computational knowledge
this.addTriple('temporal_processing', 'enables', 'prediction', 0.9);
this.addTriple('prediction', 'requires', 'pattern_recognition', 0.85);
this.addTriple('pattern_recognition', 'uses', 'neural_networks', 0.9);
this.addTriple('sublinear_algorithms', 'achieve', 'logarithmic_complexity', 1.0);
this.addTriple('logarithmic_complexity', 'beats', 'polynomial_complexity', 1.0);
this.addTriple('nanosecond_scheduling', 'enables', 'temporal_advantage', 0.95);
this.addTriple('temporal_advantage', 'allows', 'faster_than_light_computation', 0.9);
// Software engineering principles
this.addTriple('api_design', 'requires', 'consistency', 0.95);
this.addTriple('api_design', 'benefits_from', 'versioning', 0.9);
this.addTriple('rest_api', 'uses', 'http_methods', 1.0);
this.addTriple('rest_api', 'follows', 'stateless_principle', 0.95);
this.addTriple('user_management', 'requires', 'authentication', 1.0);
this.addTriple('user_management', 'requires', 'authorization', 1.0);
this.addTriple('authentication', 'validates', 'identity', 1.0);
this.addTriple('authorization', 'controls', 'access', 1.0);
this.addTriple('security', 'prevents', 'vulnerabilities', 0.9);
this.addTriple('rate_limiting', 'prevents', 'abuse', 0.95);
this.addTriple('caching', 'improves', 'performance', 0.9);
this.addTriple('pagination', 'handles', 'large_datasets', 0.95);
// System design principles
this.addTriple('distributed_systems', 'face', 'consistency_challenges', 0.95);
this.addTriple('microservices', 'require', 'service_discovery', 0.9);
this.addTriple('scalability', 'requires', 'horizontal_scaling', 0.85);
this.addTriple('reliability', 'requires', 'redundancy', 0.9);
this.addTriple('monitoring', 'enables', 'observability', 0.95);
// Reasoning patterns
this.addTriple('causal_reasoning', 'identifies', 'cause_effect', 1.0);
this.addTriple('procedural_reasoning', 'describes', 'processes', 1.0);
this.addTriple('hypothetical_reasoning', 'explores', 'possibilities', 1.0);
this.addTriple('comparative_reasoning', 'analyzes', 'differences', 1.0);
this.addTriple('abstract_reasoning', 'generalizes', 'concepts', 0.95);
this.addTriple('lateral_thinking', 'finds', 'unconventional_solutions', 0.9);
this.addTriple('systems_thinking', 'considers', 'interactions', 0.95);
// Logic rules
this.addTriple('modus_ponens', 'validates', 'implications', 1.0);
this.addTriple('universal_instantiation', 'applies_to', 'specific_cases', 1.0);
this.addTriple('existential_generalization', 'proves', 'existence', 0.9);
}
addTriple(subject, predicate, object, confidence = 1.0, metadata) {
const id = crypto.randomBytes(8).toString('hex');
const triple = {
subject: subject.toLowerCase(),
predicate: predicate.toLowerCase(),
object: object.toLowerCase(),
confidence,
metadata,
timestamp: Date.now()
};
this.triples.set(id, triple);
// Update indices
this.addToConceptIndex(triple.subject, id);
this.addToConceptIndex(triple.object, id);
this.addToPredicateIndex(triple.predicate, id);
return id;
}
addToConceptIndex(concept, tripleId) {
if (!this.concepts.has(concept)) {
this.concepts.set(concept, new Set());
}
this.concepts.get(concept).add(tripleId);
}
addToPredicateIndex(predicate, tripleId) {
if (!this.predicateIndex.has(predicate)) {
this.predicateIndex.set(predicate, new Set());
}
this.predicateIndex.get(predicate).add(tripleId);
}
findRelated(concept) {
const conceptLower = concept.toLowerCase();
const relatedIds = this.concepts.get(conceptLower) || new Set();
return Array.from(relatedIds).map(id => this.triples.get(id)).filter(Boolean);
}
findByPredicate(predicate) {
const predicateLower = predicate.toLowerCase();
const ids = this.predicateIndex.get(predicateLower) || new Set();
return Array.from(ids).map(id => this.triples.get(id)).filter(Boolean);
}
getAllTriples() {
return Array.from(this.triples.values());
}
query(sparqlLike) {
// Simple SPARQL-like query support
const results = [];
const queryLower = sparqlLike.toLowerCase();
for (const triple of this.triples.values()) {
if (queryLower.includes(triple.subject) ||
queryLower.includes(triple.predicate) ||
queryLower.includes(triple.object)) {
results.push(triple);
}
}
return results;
}
}
export class PsychoSymbolicTools {
knowledgeBase;
reasoningCache = new Map();
performanceCache;
constructor(cacheOptions) {
this.knowledgeBase = new KnowledgeBase();
// Initialize high-performance cache
this.performanceCache = new ReasoningCache({
maxSize: cacheOptions?.maxCacheSize || 10000,
defaultTTL: cacheOptions?.defaultTTL || 3600000,
enableWarmup: cacheOptions?.enableWarmup ?? true
});
}
getTools() {
return [
{
name: 'psycho_symbolic_reason',
description: 'Perform deep psycho-symbolic reasoning with full inference and intelligent caching',
inputSchema: {
type: 'object',
properties: {
query: { type: 'string', description: 'The reasoning query' },
context: { type: 'object', description: 'Additional context', default: {} },
depth: { type: 'number', description: 'Reasoning depth', default: 5 },
use_cache: { type: 'boolean', description: 'Enable high-performance caching (reduces overhead to <10%)', default: true },
cache_priority: { type: 'string', description: 'Cache priority level', enum: ['low', 'normal', 'high'], default: 'normal' }
},
required: ['query']
}
},
{
name: 'knowledge_graph_query',
description: 'Query the knowledge graph with semantic search',
inputSchema: {
type: 'object',
properties: {
query: { type: 'string', description: 'Natural language or SPARQL-like query' },
filters: { type: 'object', description: 'Filters', default: {} },
limit: { type: 'number', description: 'Max results', default: 10 }
},
required: ['query']
}
},
{
name: 'add_knowledge',
description: 'Add knowledge triple to the graph',
inputSchema: {
type: 'object',
properties: {
subject: { type: 'string' },
predicate: { type: 'string' },
object: { type: 'string' },
confidence: { type: 'number', default: 1.0 },
metadata: { type: 'object', default: {} }
},
required: ['subject', 'predicate', 'object']
}
},
{
name: 'reasoning_cache_status',
description: 'Get performance cache metrics and status',
inputSchema: {
type: 'object',
properties: {
detailed: { type: 'boolean', description: 'Include detailed cache statistics', default: false }
}
}
},
{
name: 'reasoning_cache_clear',
description: 'Clear reasoning cache (for testing/maintenance)',
inputSchema: {
type: 'object',
properties: {
confirm: { type: 'boolean', description: 'Confirm cache clear operation', default: false }
}
}
}
];
}
async handleToolCall(name, args) {
switch (name) {
case 'psycho_symbolic_reason':
return this.performDeepReasoningWithCache(args.query, args.context || {}, args.depth || 5, args.use_cache !== false, args.cache_priority || 'normal');
case 'knowledge_graph_query':
return this.queryKnowledgeGraph(args.query, args.filters || {}, args.limit || 10);
case 'add_knowledge':
return this.addKnowledge(args.subject, args.predicate, args.object, args.confidence, args.metadata);
case 'reasoning_cache_status':
return this.getCacheStatus(args.detailed || false);
case 'reasoning_cache_clear':
return this.clearCache(args.confirm || false);
default:
throw new Error(`Unknown tool: ${name}`);
}
}
async performDeepReasoningWithCache(query, context, maxDepth, useCache = true, priority = 'normal') {
const startTime = performance.now();
// Try cache first if enabled
if (useCache) {
const cached = this.performanceCache.get(query, context, maxDepth);
if (cached) {
return {
...cached.result,
cached: true,
cache_hit: true,
compute_time: performance.now() - startTime,
cache_metrics: this.performanceCache.getMetrics()
};
}
}
// Perform actual reasoning
const result = await this.performDeepReasoning(query, context, maxDepth);
const computeTime = performance.now() - startTime;
// Store in cache if enabled
if (useCache) {
this.performanceCache.set(query, context, maxDepth, result, computeTime);
}
return {
...result,
cached: false,
cache_hit: false,
compute_time: computeTime,
cache_metrics: useCache ? this.performanceCache.getMetrics() : null
};
}
getCacheStatus(detailed = false) {
const status = this.performanceCache.getStatus();
const metrics = this.performanceCache.getMetrics();
if (detailed) {
return {
cache_status: status,
performance_metrics: metrics,
overhead_reduction: `${((1 - metrics.overhead / 100) * 100).toFixed(1)}%`,
hit_ratio: `${(metrics.hitRatio * 100).toFixed(1)}%`,
efficiency_gain: metrics.hitRatio > 0.5 ? 'High' : metrics.hitRatio > 0.2 ? 'Medium' : 'Low'
};
}
return {
hit_ratio: `${(metrics.hitRatio * 100).toFixed(1)}%`,
cache_size: metrics.cacheSize,
total_queries: metrics.totalQueries,
overhead_reduction: `${((1 - metrics.overhead / 100) * 100).toFixed(1)}%`
};
}
clearCache(confirm = false) {
if (!confirm) {
return {
error: 'Cache clear requires confirmation. Set confirm: true to proceed.',
current_size: this.performanceCache.getMetrics().cacheSize
};
}
const oldSize = this.performanceCache.getMetrics().cacheSize;
this.performanceCache.clear();
return {
message: 'Cache cleared successfully',
entries_removed: oldSize,
new_size: 0
};
}
async performDeepReasoning(query, context, maxDepth) {
// Check cache
const cacheKey = `${query}_${JSON.stringify(context)}_${maxDepth}`;
if (this.reasoningCache.has(cacheKey)) {
return this.reasoningCache.get(cacheKey);
}
const reasoningSteps = [];
const insights = new Set();
// Step 1: Cognitive Pattern Analysis
const patterns = this.identifyCognitivePatterns(query);
reasoningSteps.push({
type: 'pattern_identification',
patterns,
confidence: 0.9,
description: `Identified ${patterns.join(', ')} reasoning patterns`
});
// Step 2: Entity and Concept Extraction
const entities = this.extractEntitiesAndConcepts(query);
reasoningSteps.push({
type: 'entity_extraction',
entities: entities.entities,
concepts: entities.concepts,
relationships: entities.relationships,
confidence: 0.85
});
// Step 3: Domain-Specific Insight Generation
const domainInsights = this.generateDomainInsights(query, patterns, context);
domainInsights.forEach(insight => insights.add(insight));
reasoningSteps.push({
type: 'domain_analysis',
insights: domainInsights,
confidence: 0.8,
description: 'Generated domain-specific insights'
});
// Step 4: Logical Component Analysis
const logicalComponents = this.extractLogicalComponents(query);
reasoningSteps.push({
type: 'logical_decomposition',
components: logicalComponents,
depth: 1,
description: 'Decomposed query into logical primitives'
});
// Step 5: Knowledge Graph Traversal
const graphInsights = await this.traverseKnowledgeGraph(entities.concepts, maxDepth);
reasoningSteps.push({
type: 'knowledge_traversal',
paths: graphInsights.paths,
discoveries: graphInsights.discoveries,
confidence: graphInsights.confidence
});
graphInsights.discoveries.forEach(d => insights.add(d));
// Step 6: Inference Chain Building
const inferences = this.buildInferenceChain(logicalComponents, graphInsights.triples, patterns);
reasoningSteps.push({
type: 'inference',
rules: inferences.rules,
conclusions: inferences.conclusions,
confidence: inferences.confidence
});
inferences.conclusions.forEach(c => insights.add(c));
// Step 7: Context-Aware Reasoning
if (context && Object.keys(context).length > 0) {
const contextInsights = this.applyContextualReasoning(query, context, patterns);
contextInsights.forEach(ci => insights.add(ci));
reasoningSteps.push({
type: 'contextual_reasoning',
insights: contextInsights,
confidence: 0.75
});
}
// Step 8: Hypothesis Generation
if (patterns.includes('hypothetical') || patterns.includes('exploratory') || patterns.includes('lateral')) {
const hypotheses = this.generateHypotheses(entities.concepts, inferences.conclusions);
reasoningSteps.push({
type: 'hypothesis_generation',
hypotheses,
confidence: 0.7
});
hypotheses.forEach(h => insights.add(h));
}
// Step 9: Edge Case Analysis (for API/system design queries)
if (query.toLowerCase().includes('edge case') || query.toLowerCase().includes('hidden') ||
context.focus === 'hidden_complexities') {
const edgeCases = this.analyzeEdgeCases(query, entities.concepts);
edgeCases.forEach(ec => insights.add(ec));
reasoningSteps.push({
type: 'edge_case_analysis',
cases: edgeCases,
confidence: 0.8
});
}
// Step 10: Contradiction Detection and Resolution
const contradictions = this.detectContradictions(Array.from(insights));
if (contradictions.length > 0) {
const resolutions = this.resolveContradictions(contradictions, context);
reasoningSteps.push({
type: 'contradiction_resolution',
contradictions,
resolutions,
confidence: 0.8
});
}
// Step 11: Synthesis
const synthesis = this.synthesizeCompleteAnswer(query, Array.from(insights), reasoningSteps, patterns, context);
const result = {
answer: synthesis.answer,
confidence: synthesis.confidence,
reasoning: reasoningSteps,
insights: Array.from(insights),
patterns,
depth: graphInsights.maxDepth || maxDepth,
entities: entities.entities,
concepts: entities.concepts,
triples_examined: graphInsights.triples.length,
inference_rules_applied: inferences.rules.length
};
// Cache result
this.reasoningCache.set(cacheKey, result);
return result;
}
generateDomainInsights(query, patterns, context) {
const insights = [];
const queryLower = query.toLowerCase();
// API Design Insights
if (queryLower.includes('api') || queryLower.includes('rest') || context.domain === 'api_design') {
insights.push('Consider idempotency for all mutating operations to handle network retries');
insights.push('Implement versioning strategy from day one - URL, header, or content negotiation');
insights.push('Rate limiting should be granular - per user, per endpoint, and per operation type');
insights.push('CORS configuration often breaks in production - test with actual domain names');
insights.push('Bulk operations need careful transaction boundary management');
if (queryLower.includes('user')) {
insights.push('User deletion must handle cascading data relationships and GDPR compliance');
insights.push('Password reset flows are prime targets for timing attacks');
insights.push('Session management across devices requires careful token invalidation');
insights.push('Email verification tokens should expire and be single-use');
}
}
// Hidden Complexities
if (queryLower.includes('hidden') || queryLower.includes('non-obvious') || queryLower.includes('edge')) {
insights.push('Race conditions in concurrent user updates - last write wins vs merge conflicts');
insights.push('Time zone handling - server, client, and user preference mismatches');
insights.push('Pagination breaks when underlying data changes during traversal');
insights.push('Cache invalidation cascades in microservice architectures');
insights.push('OAuth token refresh race conditions in distributed systems');
insights.push('Database connection pool exhaustion under spike load');
insights.push('Unicode normalization issues in usernames and passwords');
insights.push('Integer overflow in ID generation at scale');
}
// Lateral Thinking Insights
if (patterns.includes('lateral') || context.pattern === 'lateral') {
insights.push('Consider using event sourcing for audit trail instead of traditional logging');
insights.push('GraphQL might solve over-fetching better than REST for complex relationships');
insights.push('WebSockets for real-time user presence instead of polling');
insights.push('JWT claims can carry authorization context to reduce database lookups');
insights.push('Use bloom filters for username availability checks at scale');
insights.push('Implement soft deletes with temporal tables for compliance');
insights.push('Consider CQRS for read-heavy user profile access patterns');
}
// System Interaction Complexities
if (queryLower.includes('system') || queryLower.includes('interaction')) {
insights.push('Load balancer health checks can trigger false circuit breaker opens');
insights.push('CDN cache can serve stale authentication states');
insights.push('Database read replicas lag can cause phantom user creation failures');
insights.push('Message queue failures can orphan user records');
insights.push('Service mesh retry policies can amplify failures');
insights.push('Distributed tracing overhead affects latency measurements');
}
// Security Considerations
if (queryLower.includes('security') || queryLower.includes('user')) {
insights.push('Timing attacks on user enumeration through login response times');
insights.push('JWT secret rotation without service disruption');
insights.push('Password history storage needs separate encryption');
insights.push('Account takeover protection via behavioral analysis');
insights.push('API key rotation mechanisms for service accounts');
}
return insights;
}
applyContextualReasoning(query, context, patterns) {
const insights = [];
if (context.focus === 'hidden_complexities') {
insights.push('Hidden complexity: Distributed consensus for user state changes');
insights.push('Hidden complexity: Eventual consistency in user search indices');
insights.push('Hidden complexity: GDPR data portability implementation details');
insights.push('Hidden complexity: Cross-region data replication latency');
}
if (context.pattern === 'lateral') {
insights.push('Lateral solution: Use blockchain for decentralized identity verification');
insights.push('Lateral solution: Implement passwordless auth via magic links');
insights.push('Lateral solution: Use ML for anomaly detection in access patterns');
insights.push('Lateral solution: Federated user management across microservices');
}
if (context.domain === 'api_design') {
insights.push('API consideration: Hypermedia controls for self-documenting endpoints');
insights.push('API consideration: GraphQL subscriptions for real-time updates');
insights.push('API consideration: OpenAPI spec generation from code');
insights.push('API consideration: Request/response compression strategies');
}
return insights;
}
analyzeEdgeCases(query, concepts) {
const edgeCases = [];
// Universal edge cases
edgeCases.push('Edge case: Null, undefined, and empty string handling differences');
edgeCases.push('Edge case: Maximum length inputs causing buffer overflows');
edgeCases.push('Edge case: Concurrent modifications to the same resource');
edgeCases.push('Edge case: Clock skew between distributed components');
// API-specific edge cases
if (concepts.includes('api') || concepts.includes('rest')) {
edgeCases.push('Edge case: Partial success in batch operations');
edgeCases.push('Edge case: Request timeout during long-running operations');
edgeCases.push('Edge case: Content-Type mismatches with actual payload');
edgeCases.push('Edge case: HTTP/2 multiplexing affecting rate limits');
}
// User management edge cases
if (concepts.includes('user') || concepts.includes('authentication')) {
edgeCases.push('Edge case: User creation with recycled email addresses');
edgeCases.push('Edge case: Session fixation during concurrent logins');
edgeCases.push('Edge case: Account merge conflicts with OAuth providers');
edgeCases.push('Edge case: Birthday paradox in random token generation');
}
return edgeCases;
}
identifyCognitivePatterns(query) {
const patterns = [];
const lowerQuery = query.toLowerCase();
const patternMap = {
'causal': ['why', 'cause', 'because', 'result', 'effect', 'lead to'],
'procedural': ['how', 'process', 'step', 'method', 'way', 'approach', 'design', 'implement'],
'hypothetical': ['what if', 'suppose', 'imagine', 'could', 'would', 'might'],
'comparative': ['compare', 'difference', 'similar', 'versus', 'than', 'like'],
'definitional': ['what is', 'define', 'meaning', 'definition'],
'evaluative': ['best', 'worst', 'better', 'optimal', 'evaluate'],
'temporal': ['when', 'time', 'before', 'after', 'during', 'temporal'],
'spatial': ['where', 'location', 'position', 'space'],
'quantitative': ['how many', 'how much', 'count', 'measure', 'amount'],
'existential': ['exist', 'there is', 'there are', 'presence'],
'universal': ['all', 'every', 'always', 'never', 'none'],
'lateral': ['lateral', 'unconventional', 'creative', 'alternative', 'non-obvious', 'hidden'],
'systems': ['system', 'interaction', 'complexity', 'emergence', 'holistic'],
'exploratory': ['explore', 'discover', 'investigate', 'consider', 'edge case']
};
for (const [pattern, keywords] of Object.entries(patternMap)) {
if (keywords.some(keyword => lowerQuery.includes(keyword))) {
patterns.push(pattern);
}
}
if (patterns.length === 0) {
patterns.push('exploratory');
}
return patterns;
}
extractEntitiesAndConcepts(query) {
const words = query.split(/\s+/);
const entities = [];
const concepts = [];
const relationships = [];
// Extract technical terms and concepts
const technicalTerms = [
'api', 'rest', 'graphql', 'user', 'management', 'authentication',
'authorization', 'database', 'cache', 'security', 'performance',
'scalability', 'microservice', 'distributed', 'system', 'design',
'endpoint', 'resource', 'crud', 'http', 'json', 'xml', 'oauth',
'jwt', 'session', 'token', 'password', 'encryption', 'hash'
];
// Extract named entities (capitalized words not at sentence start)
for (let i = 0; i < words.length; i++) {
const word = words[i];
const wordLower = word.toLowerCase();
if (/^[A-Z]/.test(word) && i > 0 && !['The', 'A', 'An', 'What', 'How', 'Why', 'When', 'Where'].includes(word)) {
entities.push(wordLower);
}
if (technicalTerms.includes(wordLower)) {
concepts.push(wordLower);
}
}
// Extract key concepts from knowledge base
const queryLower = query.toLowerCase();
for (const concept of this.knowledgeBase.getAllTriples().map(t => [t.subject, t.object]).flat()) {
if (queryLower.includes(concept)) {
concepts.push(concept);
}
}
// Extract relationships (verbs and prepositions)
const relationshipPatterns = [
'is', 'are', 'was', 'were', 'has', 'have', 'had',
'can', 'could', 'will', 'would', 'should',
'design', 'implement', 'create', 'build', 'develop',
'requires', 'needs', 'uses', 'enables', 'prevents',
'increases', 'decreases', 'affects', 'influences'
];
for (const word of words) {
const wordLower = word.toLowerCase();
if (relationshipPatterns.includes(wordLower)) {
relationships.push(wordLower);
}
}
// Add query-specific concepts
if (queryLower.includes('edge case'))
concepts.push('edge_cases');
if (queryLower.includes('hidden'))
concepts.push('hidden_complexity');
if (queryLower.includes('api'))
concepts.push('api_design');
if (queryLower.includes('user'))
concepts.push('user_management');
return {
entities: [...new Set(entities)],
concepts: [...new Set(concepts)],
relationships: [...new Set(relationships)]
};
}
extractLogicalComponents(query) {
const components = {
predicates: [],
quantifiers: [],
operators: [],
modals: [],
negations: []
};
const lowerQuery = query.toLowerCase();
// Extract predicates (subject-verb-object patterns)
const predicateMatches = lowerQuery.match(/(\w+)\s+(is|are|was|were|has|have|had)\s+(\w+)/g);
if (predicateMatches) {
components.predicates = predicateMatches.map(p => p.trim());
}
// Extract quantifiers
const quantifierPattern = /\b(all|every|some|any|no|none|many|few|most|several)\b/gi;
const quantifierMatches = lowerQuery.match(quantifierPattern);
if (quantifierMatches) {
components.quantifiers = quantifierMatches;
}
// Extract logical operators
const operatorPattern = /\b(and|or|not|if|then|implies|therefore|because|but|however)\b/gi;
const operatorMatches = lowerQuery.match(operatorPattern);
if (operatorMatches) {
components.operators = operatorMatches;
}
// Extract modal verbs
const modalPattern = /\b(can|could|may|might|must|shall|should|will|would)\b/gi;
const modalMatches = lowerQuery.match(modalPattern);
if (modalMatches) {
components.modals = modalMatches;
}
// Extract negations
const negationPattern = /\b(not|no|never|neither|nor|nothing|nobody|nowhere)\b/gi;
const negationMatches = lowerQuery.match(negationPattern);
if (negationMatches) {
components.negations = negationMatches;
}
return components;
}
async traverseKnowledgeGraph(concepts, maxDepth) {
const visited = new Set();
const paths = [];
const discoveries = [];
const triples = [];
let currentDepth = 0;
let maxConfidence = 0;
// BFS traversal
const queue = concepts.map(c => ({
concept: c,
depth: 0,
confidence: 1.0,
path: [c],
inferences: []
}));
while (queue.length > 0 && currentDepth < maxDepth) {
const node = queue.shift();
if (visited.has(node.concept))
continue;
visited.add(node.concept);
currentDepth = Math.max(currentDepth, node.depth);
paths.push(node.path);
// Find related triples
const related = this.knowledgeBase.findRelated(node.concept);
triples.push(...related);
for (const triple of related) {
// Generate discoveries
const discovery = `${triple.subject} ${triple.predicate} ${triple.object}`;
discoveries.push(discovery);
maxConfidence = Math.max(maxConfidence, triple.confidence * node.confidence);
// Add connected concepts to queue
const nextConcept = triple.subject === node.concept ? triple.object : triple.subject;
if (!visited.has(nextConcept) && node.depth < maxDepth - 1) {
queue.push({
concept: nextConcept,
depth: node.depth + 1,
confidence: node.confidence * triple.confidence,
path: [...node.path, nextConcept],
inferences: [...node.inferences, discovery]
});
}
}
}
return {
paths,
discoveries: discoveries.slice(0, 20), // Limit discoveries
triples,
maxDepth: currentDepth,
confidence: maxConfidence
};
}
buildInferenceChain(logicalComponents, triples, patterns) {
const rules = [];
const conclusions = [];
let confidence = 0.5;
// Apply Modus Ponens
if (logicalComponents.operators.includes('if') || logicalComponents.operators.includes('then')) {
rules.push('modus_ponens');
// Find implications in triples
for (const triple of triples) {
if (triple.predicate === 'implies' || triple.predicate === 'causes' || triple.predicate === 'enables') {
conclusions.push(`${triple.subject} leads to ${triple.object}`);
confidence = Math.max(confidence, triple.confidence * 0.9);
}
}
}
// Apply Universal Instantiation
if (logicalComponents.quantifiers.some((q) => ['all', 'every'].includes(q))) {
rules.push('universal_instantiation');
conclusions.push('universal property applies to specific instances');
confidence = Math.max(confidence, 0.85);
}
// Apply Existential Generalization
if (logicalComponents.quantifiers.some((q) => ['some', 'exist'].includes(q))) {
rules.push('existential_generalization');
conclusions.push('at least one instance exists with the property');
confidence = Math.max(confidence, 0.8);
}
// Apply Transitive Property
const transitivePredicates = ['causes', 'enables', 'requires', 'leads_to'];
const transitiveChains = this.findTransitiveChains(triples, transitivePredicates);
if (transitiveChains.length > 0) {
rules.push('transitive_property');
transitiveChains.forEach(chain => {
conclusions.push(`${chain.start} transitively ${chain.predicate} ${chain.end}`);
});
confidence = Math.max(confidence, 0.75);
}
// Apply Pattern-Specific Rules
if (patterns.includes('causal')) {
rules.push('causal_chain_analysis');
const causalChains = triples.filter(t => ['causes', 'results_in', 'leads_to', 'produces'].includes(t.predicate));
causalChains.forEach(chain => {
conclusions.push(`causal relationship: ${chain.subject}${chain.object}`);
});
}
if (patterns.includes('temporal')) {
rules.push('temporal_ordering');
conclusions.push('events ordered by temporal precedence');
}
// Generate domain-specific conclusions
if (triples.some(t => t.subject.includes('api') || t.object.includes('api'))) {
conclusions.push('API design requires consistency and versioning');
conclusions.push('RESTful principles ensure stateless interactions');
confidence = Math.max(confidence, 0.85);
}
if (triples.some(t => t.subject.includes('user') || t.object.includes('user'))) {
conclusions.push('user management requires authentication and authorization');
conclusions.push('security measures prevent unauthorized access');
confidence = Math.max(confidence, 0.9);
}
return {
rules,
conclusions,
confidence
};
}
findTransitiveChains(triples, predicates) {
const chains = [];
for (const predicate of predicates) {
const relevantTriples = triples.filter(t => t.predicate === predicate);
for (let i = 0; i < relevantTriples.length; i++) {
for (let j = 0; j < relevantTriples.length; j++) {
if (relevantTriples[i].object === relevantTriples[j].subject) {
chains.push({
start: relevantTriples[i].subject,
middle: relevantTriples[i].object,
end: relevantTriples[j].object,
predicate
});
}
}
}
}
return chains;
}
generateHypotheses(concepts, conclusions) {
const hypotheses = [];
// Generate hypotheses based on concept combinations
for (let i = 0; i < concepts.length; i++) {
for (let j = i + 1; j < concepts.length; j++) {
hypotheses.push(`hypothesis: ${concepts[i]} might be related to ${concepts[j]}`);
}
}
// Generate hypotheses from conclusions
for (const conclusion of conclusions) {
if (conclusion.includes('leads to') || conclusion.includes('causes')) {
hypotheses.push(`hypothesis: reversing ${conclusion} might have opposite effect`);
}
}
// Domain-specific hypotheses
if (concepts.includes('api_design')) {
hypotheses.push('hypothesis: event-driven architecture might reduce coupling');
hypotheses.push('hypothesis: CQRS pattern could improve read performance');
}
if (concepts.includes('user_management')) {
hypotheses.push('hypothesis: passwordless authentication might improve security');
hypotheses.push('hypothesis: federated identity could simplify user management');
}
return hypotheses.slice(0, 5); // Limit hypotheses
}
detectContradictions(statements) {
const contradictions = [];
for (let i = 0; i < statements.length; i++) {
for (let j = i + 1; j < statements.length; j++) {
// Check for direct negation
if (statements[i].includes('not') && statements[j] === statements[i].replace('not ', '')) {
contradictions.push({
type: 'direct_negation',
statement1: statements[i],
statement2: statements[j]
});
}
// Check for semantic opposition
const opposites = [
['increases', 'decreases'],
['enables', 'prevents'],
['causes', 'prevents'],
['always', 'never'],
['all', 'none']
];
for (const [word1, word2] of opposites) {
if ((statements[i].includes(word1) && statements[j].includes(word2)) ||
(statements[i].includes(word2) && statements[j].includes(word1))) {
contradictions.push({
type: 'semantic_opposition',
statement1: statements[i],
statement2: statements[j],
conflict: [word1, word2]
});
}
}
}
}
return contradictions;
}
resolveContradictions(contradictions, context) {
return contradictions.map(c => ({
original: c,
resolution: 'resolved through context disambiguation',
method: c.type === 'direct_negation' ? 'logical_priority' : 'semantic_analysis',
confidence: 0.7
}));
}
synthesizeCompleteAnswer(query, insights, steps, patterns, context) {
let confidence = 0.5;
let keyInsights = insights.slice(0, 10); // Get more insights
// If no insights from knowledge graph, use generated domain insights
if (keyInsights.length === 0) {
keyInsights = this.generateDefaultInsights(query, patterns, context);
}
// Calculate confidence from reasoning steps
for (const step of steps) {
if (step.confidence) {
confidence = Math.max(confidence, step.confidence * 0.9);
}
}
// Build comprehensive answer based on pattern and context
let answer = '';
if (patterns.includes('lateral') || context.pattern === 'lateral') {
answer = `Thinking laterally about this problem reveals several non-obvious considerations: ${keyInsights.slice(0, 3).join('; ')}. `;
answer += `Additionally, hidden complexities include: ${keyInsights.slice(3, 6).join('; ')}. `;
}
else if (patterns.includes('causal')) {
answer = `Based on causal analysis: ${keyInsights.join(' → ')}. `;
}
else if (patterns.includes('procedural')) {
answer = `The design process should consider: ${keyInsights.slice(0, 5).join(', then ')}. `;
}
else if (patterns.includes('comparative')) {
answer = `Comparison reveals: ${keyInsights.join(' versus ')}. `;
}
else if (patterns.includes('hypothetical')) {
answer = `Hypothetically: ${keyInsights.join(', additionally ')}. `;
}
else if (patterns.includes('systems')) {
answer = `From a systems perspective: ${keyInsights.slice(0, 4).join('. ')}. `;
}
else {
answer = `Analysis reveals the following considerations: ${keyInsights.slice(0, 5).join('. ')}. `;
}
// Add context-specific insights
if (context.focus === 'hidden_complexities') {
answer += `Hidden complexities that are often missed: ${keyInsights.slice(5, 8).join('; ')}. `;
}
// Add reasoning depth
answer += `This conclusion is based on ${steps.length} reasoning steps`;
// Add confidence qualifier
if (confidence > 0.9) {
answer += ' with very high confidence';
}
else if (confidence > 0.7) {
answer += ' with high confidence';
}
else if (confidence > 0.5) {
answer += ' with moderate confidence';
}
else {
answer += ' with exploratory confidence';
}
answer += '.';
return {
answer,
confidence,
keyInsights
};
}
generateDefaultInsights(query, patterns, context) {
const insights = [];
const queryLower = query.toLowerCase();
// Generate insights based on query content
if (queryLower.includes('api') || queryLower.includes('design')) {
insights.push('Consider backward compatibility from the start');
insights.push('Version your API to manage breaking changes');
insights.push('Implement comprehensive error handling with meaningful status codes');
insights.push('Design for idempotency in all state-changing operations');
insights.push('Plan for rate limiting and throttling mechanisms');
}
if (queryLower.includes('user') || queryLower.includes('management')) {
insights.push('Implement proper authentication and authorization separation');
insights.push('Consider GDPR and data privacy requirements');
insights.push('Plan for account recovery and security features');
insights.push('Design for multi-tenant architectures if needed');
insights.push('Include audit logging for compliance');
}
if (queryLower.includes('hidden') || queryLower.includes('edge')) {
insights.push('Watch for race conditions in concurrent operations');
insights.push('Handle timezone and localization complexities');
insights.push('Plan for data migration and schema evolution');
insights.push('Consider cache invalidation strategies');
insights.push('Design for graceful degradation');
}
return insights.length > 0 ? insights : ['No specific insights available for this query domain'];
}
async queryKnowledgeGraph(query, filters, limit) {
const results = this.knowledgeBase.query(query);
// Apply filters
let filtered = results;
if (filters.confidence) {
filtered = filtered.filter(t => t.confidence >= filters.confidence);
}
if (filters.predicate) {
filtered = filtered.filter(t => t.predicate === filters.predicate.toLowerCase());
}
// Sort by confidence
filtered.sort((a, b) => b.confidence - a.confidence);
// Limit results
const limited = filtered.slice(0, limit);
return {
query,
results: limited.map(t => ({
subject: t.subject,
predicate: t.predicate,
object: t.object,
confidence: t.confidence,
metadata: t.metadata
})),
total: limited.length,
totalAvailable: filtered.length
};
}
async addKnowledge(subject, predicate, object, confidence = 1.0, metadata = {}) {
const id = this.knowledgeBase.addTriple(subject, predicate, object, confidence, metadata);
return {
id,
status: 'added',
triple: {
subject: subject.toLowerCase(),
predicate: predicate.toLowerCase(),
object: object.toLowerCase(),
confidence
}
};
}
}
export default PsychoSymbolicTools;
@@ -0,0 +1,25 @@
/**
* Complete Enhanced Psycho-Symbolic Reasoning with Full Learning Integration
* Includes: Domain Adaptation, Creative Reasoning, Enhanced Knowledge Base, Analogical Reasoning
*/
import { Tool } from '@modelcontextprotocol/sdk/types.js';
export declare class PsychoSymbolicTools {
private knowledgeBase;
private domainEngine;
private creativeEngine;
private analogicalEngine;
private performanceCache;
private toolLearningHooks;
constructor();
getTools(): Tool[];
handleToolCall(name: string, args: any): Promise<any>;
private performCompleteReasoning;
private extractAdvancedEntities;
private enhancedKnowledgeTraversal;
private synthesizeAdvancedAnswer;
private advancedKnowledgeQuery;
private addEnhancedKnowledge;
private registerToolInteraction;
private getCrossToolInsights;
private getLearningStatus;
}
File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More