Squashed 'vendor/ruvector/' content from commit b64c2172
git-subtree-dir: vendor/ruvector git-subtree-split: b64c21726f2bb37286d9ee36a7869fef60cc6900
This commit is contained in:
423
crates/ruvector-dag/examples/exotic/thought_integrity.rs
Normal file
423
crates/ruvector-dag/examples/exotic/thought_integrity.rs
Normal file
@@ -0,0 +1,423 @@
|
||||
//! # Thought Integrity Monitoring
|
||||
//!
|
||||
//! Compute substrates where reasoning integrity is monitored like voltage or temperature.
|
||||
//!
|
||||
//! When coherence drops:
|
||||
//! - Reduce precision
|
||||
//! - Exit early
|
||||
//! - Route to simpler paths
|
||||
//! - Escalate to heavier reasoning only if needed
|
||||
//!
|
||||
//! This is how you get always-on intelligence without runaway cost.
|
||||
|
||||
use std::time::{Duration, Instant};
|
||||
|
||||
/// Reasoning depth levels
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
|
||||
pub enum ReasoningDepth {
|
||||
/// Pattern matching only - instant, near-zero cost
|
||||
Reflexive,
|
||||
/// Simple inference - fast, low cost
|
||||
Shallow,
|
||||
/// Standard reasoning - moderate cost
|
||||
Standard,
|
||||
/// Deep analysis - high cost
|
||||
Deep,
|
||||
/// Full deliberation - maximum cost
|
||||
Deliberative,
|
||||
}
|
||||
|
||||
impl ReasoningDepth {
|
||||
fn cost_multiplier(&self) -> f64 {
|
||||
match self {
|
||||
Self::Reflexive => 0.01,
|
||||
Self::Shallow => 0.1,
|
||||
Self::Standard => 1.0,
|
||||
Self::Deep => 5.0,
|
||||
Self::Deliberative => 20.0,
|
||||
}
|
||||
}
|
||||
|
||||
fn precision(&self) -> f64 {
|
||||
match self {
|
||||
Self::Reflexive => 0.6,
|
||||
Self::Shallow => 0.75,
|
||||
Self::Standard => 0.9,
|
||||
Self::Deep => 0.95,
|
||||
Self::Deliberative => 0.99,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// A reasoning step with integrity monitoring
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct ReasoningStep {
|
||||
pub description: String,
|
||||
pub coherence: f64,
|
||||
pub confidence: f64,
|
||||
pub depth: ReasoningDepth,
|
||||
pub cost: f64,
|
||||
}
|
||||
|
||||
/// Thought integrity monitor - like voltage monitoring for reasoning
|
||||
pub struct ThoughtIntegrityMonitor {
|
||||
/// Current coherence level (0-1)
|
||||
coherence: f64,
|
||||
|
||||
/// Rolling coherence history
|
||||
coherence_history: Vec<f64>,
|
||||
|
||||
/// Current reasoning depth
|
||||
depth: ReasoningDepth,
|
||||
|
||||
/// Thresholds for depth adjustment
|
||||
thresholds: DepthThresholds,
|
||||
|
||||
/// Total reasoning cost accumulated
|
||||
total_cost: f64,
|
||||
|
||||
/// Cost budget per time window
|
||||
cost_budget: f64,
|
||||
|
||||
/// Steps taken at each depth
|
||||
depth_counts: [usize; 5],
|
||||
|
||||
/// Early exits taken
|
||||
early_exits: usize,
|
||||
|
||||
/// Escalations to deeper reasoning
|
||||
escalations: usize,
|
||||
}
|
||||
|
||||
struct DepthThresholds {
|
||||
/// Above this, can use Deliberative
|
||||
deliberative: f64,
|
||||
/// Above this, can use Deep
|
||||
deep: f64,
|
||||
/// Above this, can use Standard
|
||||
standard: f64,
|
||||
/// Above this, can use Shallow
|
||||
shallow: f64,
|
||||
/// Below this, must use Reflexive only
|
||||
reflexive: f64,
|
||||
}
|
||||
|
||||
impl Default for DepthThresholds {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
deliberative: 0.95,
|
||||
deep: 0.85,
|
||||
standard: 0.7,
|
||||
shallow: 0.5,
|
||||
reflexive: 0.3,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Result of a reasoning attempt
|
||||
#[derive(Debug)]
|
||||
pub enum ReasoningResult {
|
||||
/// Successfully completed at given depth
|
||||
Complete {
|
||||
answer: String,
|
||||
confidence: f64,
|
||||
depth_used: ReasoningDepth,
|
||||
cost: f64,
|
||||
},
|
||||
/// Exited early due to coherence drop
|
||||
EarlyExit {
|
||||
partial_answer: String,
|
||||
coherence_at_exit: f64,
|
||||
steps_completed: usize,
|
||||
},
|
||||
/// Escalated to deeper reasoning
|
||||
Escalated {
|
||||
from_depth: ReasoningDepth,
|
||||
to_depth: ReasoningDepth,
|
||||
reason: String,
|
||||
},
|
||||
/// Refused to process - integrity too low
|
||||
Refused { coherence: f64, reason: String },
|
||||
}
|
||||
|
||||
impl ThoughtIntegrityMonitor {
|
||||
pub fn new(cost_budget: f64) -> Self {
|
||||
Self {
|
||||
coherence: 1.0,
|
||||
coherence_history: Vec::with_capacity(100),
|
||||
depth: ReasoningDepth::Standard,
|
||||
thresholds: DepthThresholds::default(),
|
||||
total_cost: 0.0,
|
||||
cost_budget,
|
||||
depth_counts: [0; 5],
|
||||
early_exits: 0,
|
||||
escalations: 0,
|
||||
}
|
||||
}
|
||||
|
||||
/// Process a query with integrity monitoring
|
||||
pub fn process(&mut self, query: &str, required_precision: f64) -> ReasoningResult {
|
||||
// Check if we should refuse
|
||||
if self.coherence < self.thresholds.reflexive {
|
||||
return ReasoningResult::Refused {
|
||||
coherence: self.coherence,
|
||||
reason: "Coherence critically low - refusing to process".into(),
|
||||
};
|
||||
}
|
||||
|
||||
// Determine initial depth based on coherence and required precision
|
||||
let initial_depth = self.select_depth(required_precision);
|
||||
self.depth = initial_depth;
|
||||
|
||||
// Simulate reasoning steps
|
||||
let mut steps: Vec<ReasoningStep> = Vec::new();
|
||||
let mut current_confidence = 0.5;
|
||||
|
||||
for step_num in 0..10 {
|
||||
// Simulate coherence drift during reasoning
|
||||
let step_coherence = self.simulate_step_coherence(step_num, query);
|
||||
self.update_coherence(step_coherence);
|
||||
|
||||
// Check for early exit
|
||||
if self.should_early_exit(current_confidence, required_precision) {
|
||||
self.early_exits += 1;
|
||||
return ReasoningResult::EarlyExit {
|
||||
partial_answer: format!("Partial answer from {} steps", steps.len()),
|
||||
coherence_at_exit: self.coherence,
|
||||
steps_completed: steps.len(),
|
||||
};
|
||||
}
|
||||
|
||||
// Check for escalation need
|
||||
if current_confidence < required_precision * 0.7 && self.can_escalate() && step_num > 3
|
||||
{
|
||||
let old_depth = self.depth;
|
||||
self.depth = self.escalate_depth();
|
||||
self.escalations += 1;
|
||||
return ReasoningResult::Escalated {
|
||||
from_depth: old_depth,
|
||||
to_depth: self.depth,
|
||||
reason: "Confidence too low for required precision".into(),
|
||||
};
|
||||
}
|
||||
|
||||
// Execute step
|
||||
let step_cost = self.depth.cost_multiplier() * 0.1;
|
||||
self.total_cost += step_cost;
|
||||
|
||||
current_confidence += (self.depth.precision() - current_confidence) * 0.2;
|
||||
|
||||
steps.push(ReasoningStep {
|
||||
description: format!("Step {}", step_num + 1),
|
||||
coherence: self.coherence,
|
||||
confidence: current_confidence,
|
||||
depth: self.depth,
|
||||
cost: step_cost,
|
||||
});
|
||||
|
||||
self.depth_counts[self.depth as usize] += 1;
|
||||
|
||||
// Check if we've achieved required precision
|
||||
if current_confidence >= required_precision {
|
||||
break;
|
||||
}
|
||||
|
||||
// Adjust depth based on updated coherence
|
||||
self.depth = self.select_depth(required_precision);
|
||||
}
|
||||
|
||||
let total_step_cost: f64 = steps.iter().map(|s| s.cost).sum();
|
||||
|
||||
ReasoningResult::Complete {
|
||||
answer: format!("Answer from {} steps at {:?}", steps.len(), self.depth),
|
||||
confidence: current_confidence,
|
||||
depth_used: self.depth,
|
||||
cost: total_step_cost,
|
||||
}
|
||||
}
|
||||
|
||||
/// Get current integrity status
|
||||
pub fn status(&self) -> IntegrityStatus {
|
||||
IntegrityStatus {
|
||||
coherence: self.coherence,
|
||||
coherence_trend: self.coherence_trend(),
|
||||
current_depth: self.depth,
|
||||
max_allowed_depth: self.max_allowed_depth(),
|
||||
total_cost: self.total_cost,
|
||||
budget_remaining: (self.cost_budget - self.total_cost).max(0.0),
|
||||
depth_distribution: self.depth_counts,
|
||||
early_exits: self.early_exits,
|
||||
escalations: self.escalations,
|
||||
}
|
||||
}
|
||||
|
||||
fn select_depth(&self, required_precision: f64) -> ReasoningDepth {
|
||||
// Balance coherence-allowed depth with precision requirements
|
||||
let max_depth = self.max_allowed_depth();
|
||||
|
||||
// Find minimum depth that meets precision requirement
|
||||
let min_needed = if required_precision > 0.95 {
|
||||
ReasoningDepth::Deliberative
|
||||
} else if required_precision > 0.9 {
|
||||
ReasoningDepth::Deep
|
||||
} else if required_precision > 0.8 {
|
||||
ReasoningDepth::Standard
|
||||
} else if required_precision > 0.7 {
|
||||
ReasoningDepth::Shallow
|
||||
} else {
|
||||
ReasoningDepth::Reflexive
|
||||
};
|
||||
|
||||
// Use the lesser of max allowed and minimum needed
|
||||
if max_depth < min_needed {
|
||||
max_depth
|
||||
} else {
|
||||
min_needed
|
||||
}
|
||||
}
|
||||
|
||||
fn max_allowed_depth(&self) -> ReasoningDepth {
|
||||
if self.coherence >= self.thresholds.deliberative {
|
||||
ReasoningDepth::Deliberative
|
||||
} else if self.coherence >= self.thresholds.deep {
|
||||
ReasoningDepth::Deep
|
||||
} else if self.coherence >= self.thresholds.standard {
|
||||
ReasoningDepth::Standard
|
||||
} else if self.coherence >= self.thresholds.shallow {
|
||||
ReasoningDepth::Shallow
|
||||
} else {
|
||||
ReasoningDepth::Reflexive
|
||||
}
|
||||
}
|
||||
|
||||
fn can_escalate(&self) -> bool {
|
||||
self.depth < self.max_allowed_depth() && self.total_cost < self.cost_budget * 0.8
|
||||
}
|
||||
|
||||
fn escalate_depth(&self) -> ReasoningDepth {
|
||||
let max = self.max_allowed_depth();
|
||||
match self.depth {
|
||||
ReasoningDepth::Reflexive if max >= ReasoningDepth::Shallow => ReasoningDepth::Shallow,
|
||||
ReasoningDepth::Shallow if max >= ReasoningDepth::Standard => ReasoningDepth::Standard,
|
||||
ReasoningDepth::Standard if max >= ReasoningDepth::Deep => ReasoningDepth::Deep,
|
||||
ReasoningDepth::Deep if max >= ReasoningDepth::Deliberative => {
|
||||
ReasoningDepth::Deliberative
|
||||
}
|
||||
_ => self.depth,
|
||||
}
|
||||
}
|
||||
|
||||
fn should_early_exit(&self, confidence: f64, required: f64) -> bool {
|
||||
// Exit early if:
|
||||
// 1. Coherence dropped significantly
|
||||
// 2. And we've achieved some confidence
|
||||
self.coherence < self.thresholds.shallow && confidence > required * 0.6
|
||||
}
|
||||
|
||||
fn simulate_step_coherence(&self, step: usize, query: &str) -> f64 {
|
||||
// Simulate coherence based on query complexity and step depth
|
||||
let base = 0.9 - (step as f64 * 0.02);
|
||||
let complexity_factor = 1.0 - (query.len() as f64 * 0.001).min(0.3);
|
||||
base * complexity_factor
|
||||
}
|
||||
|
||||
fn update_coherence(&mut self, new_coherence: f64) {
|
||||
// Exponential moving average
|
||||
self.coherence = self.coherence * 0.7 + new_coherence * 0.3;
|
||||
self.coherence_history.push(self.coherence);
|
||||
if self.coherence_history.len() > 50 {
|
||||
self.coherence_history.remove(0);
|
||||
}
|
||||
}
|
||||
|
||||
fn coherence_trend(&self) -> f64 {
|
||||
if self.coherence_history.len() < 10 {
|
||||
return 0.0;
|
||||
}
|
||||
let recent: f64 = self.coherence_history.iter().rev().take(5).sum::<f64>() / 5.0;
|
||||
let older: f64 = self
|
||||
.coherence_history
|
||||
.iter()
|
||||
.rev()
|
||||
.skip(5)
|
||||
.take(5)
|
||||
.sum::<f64>()
|
||||
/ 5.0;
|
||||
recent - older
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct IntegrityStatus {
|
||||
pub coherence: f64,
|
||||
pub coherence_trend: f64,
|
||||
pub current_depth: ReasoningDepth,
|
||||
pub max_allowed_depth: ReasoningDepth,
|
||||
pub total_cost: f64,
|
||||
pub budget_remaining: f64,
|
||||
pub depth_distribution: [usize; 5],
|
||||
pub early_exits: usize,
|
||||
pub escalations: usize,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println!("=== Thought Integrity Monitoring ===\n");
|
||||
println!("Reasoning integrity monitored like voltage or temperature.\n");
|
||||
|
||||
let mut monitor = ThoughtIntegrityMonitor::new(100.0);
|
||||
|
||||
// Various queries with different precision requirements
|
||||
let queries = vec![
|
||||
("Simple lookup", 0.7),
|
||||
("Pattern matching", 0.75),
|
||||
("Basic inference", 0.85),
|
||||
("Complex reasoning", 0.92),
|
||||
("Critical decision", 0.98),
|
||||
("Another simple query", 0.65),
|
||||
("Medium complexity", 0.8),
|
||||
("Deep analysis needed", 0.95),
|
||||
];
|
||||
|
||||
println!("Query | Precision | Result | Depth | Coherence");
|
||||
println!("--------------------|-----------|-----------------|------------|----------");
|
||||
|
||||
for (query, precision) in &queries {
|
||||
let result = monitor.process(query, *precision);
|
||||
let status = monitor.status();
|
||||
|
||||
let result_str = match &result {
|
||||
ReasoningResult::Complete { depth_used, .. } => format!("Complete ({:?})", depth_used),
|
||||
ReasoningResult::EarlyExit {
|
||||
steps_completed, ..
|
||||
} => format!("EarlyExit ({})", steps_completed),
|
||||
ReasoningResult::Escalated { to_depth, .. } => format!("Escalated->{:?}", to_depth),
|
||||
ReasoningResult::Refused { .. } => "REFUSED".into(),
|
||||
};
|
||||
|
||||
println!(
|
||||
"{:19} | {:.2} | {:15} | {:10?} | {:.2}",
|
||||
query, precision, result_str, status.current_depth, status.coherence
|
||||
);
|
||||
}
|
||||
|
||||
let final_status = monitor.status();
|
||||
|
||||
println!("\n=== Integrity Summary ===");
|
||||
println!(
|
||||
"Total cost: {:.2} / {:.2} budget",
|
||||
final_status.total_cost, 100.0
|
||||
);
|
||||
println!("Budget remaining: {:.2}", final_status.budget_remaining);
|
||||
println!("Early exits: {}", final_status.early_exits);
|
||||
println!("Escalations: {}", final_status.escalations);
|
||||
|
||||
println!("\nDepth distribution:");
|
||||
let depth_names = ["Reflexive", "Shallow", "Standard", "Deep", "Deliberative"];
|
||||
for (i, count) in final_status.depth_distribution.iter().enumerate() {
|
||||
if *count > 0 {
|
||||
println!(" {:12}: {} steps", depth_names[i], count);
|
||||
}
|
||||
}
|
||||
|
||||
println!("\n\"Always-on intelligence without runaway cost.\"");
|
||||
}
|
||||
Reference in New Issue
Block a user