pub mod scheduler;
pub mod temporal_window;
pub mod strange_loop;
pub mod identity;
pub use scheduler::NanosecondScheduler;
pub use temporal_window::{TemporalWindow, WindowOverlapManager};
pub use strange_loop::{StrangeLoopOperator, ContractionMetrics};
pub use identity::{IdentityContinuityTracker, ContinuityMetrics};
#[derive(Debug, Clone)]
pub struct TemporalConfig {
pub window_overlap_percent: f64,
pub max_scheduling_overhead_ns: u64,
pub lipschitz_bound: f64,
pub max_contraction_iterations: usize,
pub tsc_frequency_hz: u64,
}
impl Default for TemporalConfig {
fn default() -> Self {
Self {
window_overlap_percent: 75.0,
max_scheduling_overhead_ns: 1_000, lipschitz_bound: 0.95,
max_contraction_iterations: 10,
tsc_frequency_hz: 3_000_000_000, }
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum ConsciousnessTask {
Perception { priority: u8, data: Vec<u8> },
MemoryIntegration { session_id: String, state: Vec<u8> },
IdentityPreservation { continuity_check: bool },
StrangeLoopProcessing { iteration: usize, state: Vec<f64> },
WindowManagement { window_id: u64, overlap_target: f64 },
}
#[derive(Debug, thiserror::Error)]
pub enum TemporalError {
#[error("Scheduling overhead exceeded limit: {actual_ns}ns > {limit_ns}ns")]
SchedulingOverhead { actual_ns: u64, limit_ns: u64 },
#[error("Window overlap below threshold: {actual}% < {required}%")]
WindowOverlapTooLow { actual: f64, required: f64 },
#[error("Contraction failed to converge in {iterations} iterations")]
ContractionNoConvergence { iterations: usize },
#[error("Identity continuity broken: gap = {gap_ns}ns")]
IdentityContinuityBreak { gap_ns: u64 },
#[error("TSC timing error: {message}")]
TscTimingError { message: String },
#[error("Task queue overflow: {current_size}/{max_size}")]
TaskQueueOverflow { current_size: usize, max_size: usize },
}
pub type TemporalResult<T> = Result<T, TemporalError>;
#[cfg(any(
not(any(target_arch = "x86_64", target_arch = "aarch64")),
all(target_arch = "aarch64", not(target_feature = "neon")),
))]
fn generic_now_ns() -> u64 {
use std::sync::OnceLock;
use std::time::Instant;
static START: OnceLock<Instant> = OnceLock::new();
let start = START.get_or_init(Instant::now);
start.elapsed().as_nanos() as u64
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub struct TscTimestamp(pub u64);
impl TscTimestamp {
#[inline]
pub fn now() -> Self {
#[cfg(target_arch = "x86_64")]
unsafe {
Self(core::arch::x86_64::_rdtsc())
}
#[cfg(all(target_arch = "aarch64", target_feature = "neon"))]
unsafe {
let val: u64;
core::arch::asm!("mrs {0}, cntvct_el0", out(reg) val);
Self(val)
}
#[cfg(all(target_arch = "aarch64", not(target_feature = "neon")))]
unsafe {
Self(generic_now_ns())
}
#[cfg(not(any(target_arch = "x86_64", target_arch = "aarch64")))]
{
Self(generic_now_ns())
}
}
pub fn nanos_since(&self, other: TscTimestamp, tsc_freq_hz: u64) -> u64 {
let tsc_diff = self.0.saturating_sub(other.0);
(tsc_diff * 1_000_000_000) / tsc_freq_hz
}
pub fn add_nanos(&self, nanos: u64, tsc_freq_hz: u64) -> Self {
let tsc_increment = (nanos * tsc_freq_hz) / 1_000_000_000;
Self(self.0 + tsc_increment)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_temporal_config_default() {
let config = TemporalConfig::default();
assert!(config.window_overlap_percent >= 50.0);
assert!(config.window_overlap_percent <= 100.0);
assert!(config.lipschitz_bound < 1.0);
assert!(config.max_scheduling_overhead_ns <= 1_000);
}
#[test]
fn test_tsc_timestamp() {
let ts1 = TscTimestamp::now();
std::thread::sleep(std::time::Duration::from_nanos(1000));
let ts2 = TscTimestamp::now();
assert!(ts2 > ts1);
let nanos = ts2.nanos_since(ts1, 3_000_000_000);
assert!(nanos > 0);
}
}