1pub mod scheduler;
47pub mod neural;
48pub mod temporal;
49pub mod plasticity;
50
51use std::sync::{Arc, Mutex, RwLock};
52use std::time::{Duration, Instant};
53
54use ndarray::Array1;
55use serde::{Deserialize, Serialize};
56use thiserror::Error;
57
58#[cfg(target_arch = "wasm32")]
59use wasm_bindgen::prelude::*;
60#[cfg(target_arch = "wasm32")]
61use wasm_bindgen::JsValue;
62
63pub use scheduler::{NanoScheduler, SchedulerConfig, NanoTimestamp, TaskPriority, TaskPayload};
65pub use neural::{ConsciousnessNetwork, ActivationFunction, NetworkStats};
66pub use temporal::{TemporalProcessor, NeuralState, TemporalStats};
67pub use plasticity::{PlasticityManager, STDPConfig, SpikeEvent, PlasticityMetrics};
68
69pub type NanoConsciousnessSystem = ConsciousnessSystem;
71pub type NanoConsciousnessConfig = ConsciousnessConfig;
72pub type TemporalConfig = TemporalStats;
73pub type PhaseConfig = ConsciousnessConfig;
74pub type NetworkAdapter = ConsciousnessNetwork;
75pub type NetworkConfig = ConsciousnessConfig;
76pub type InferenceTask = u64;
77pub type TimePoint = NanoTimestamp;
78
79pub mod emergence {
81 use super::*;
82
83 pub fn detect_emergent_patterns(_system: &ConsciousnessSystem) -> Vec<(String, f64)> {
84 vec![
85 ("coherent_high".to_string(), 0.8),
86 ("coherent_low".to_string(), 0.3),
87 ("oscillatory".to_string(), 0.6),
88 ]
89 }
90}
91
92#[derive(Debug, Clone, Serialize, Deserialize)]
94pub struct ConsciousnessConfig {
95 pub input_size: usize,
97 pub hidden_layers: Vec<usize>,
99 pub output_size: usize,
101 pub network_activations: Vec<ActivationFunction>,
102 pub learning_rate: f64,
103
104 pub temporal_window_size: Duration,
106 pub temporal_overlap_ratio: f64,
107 pub max_temporal_windows: usize,
108
109 pub stdp_config: STDPConfig,
111 pub enable_plasticity: bool,
112
113 pub scheduler_config: SchedulerConfig,
115
116 pub phi_threshold: f64,
118 pub global_workspace_threshold: f64,
119 pub strange_loop_depth: usize,
120 pub attention_decay_rate: f64,
121
122 pub enable_metrics: bool,
124 pub max_processing_threads: usize,
125}
126
127impl Default for ConsciousnessConfig {
128 fn default() -> Self {
129 Self {
130 input_size: 16,
131 hidden_layers: vec![32, 16],
132 output_size: 8,
133 network_activations: vec![
134 ActivationFunction::ReLU,
135 ActivationFunction::Tanh,
136 ActivationFunction::Sigmoid,
137 ],
138 learning_rate: 0.001,
139 temporal_window_size: Duration::from_millis(100),
140 temporal_overlap_ratio: 0.5,
141 max_temporal_windows: 50,
142 stdp_config: plasticity::configs::consciousness_optimized(),
143 enable_plasticity: true,
144 scheduler_config: SchedulerConfig::default(),
145 phi_threshold: 0.3,
146 global_workspace_threshold: 0.5,
147 strange_loop_depth: 3,
148 attention_decay_rate: 0.95,
149 enable_metrics: true,
150 max_processing_threads: 4,
151 }
152 }
153}
154
155#[derive(Debug)]
157pub struct ConsciousnessSystem {
158 config: ConsciousnessConfig,
159 network: Arc<Mutex<ConsciousnessNetwork>>,
160 temporal_processor: Arc<Mutex<TemporalProcessor>>,
161 plasticity_manager: Arc<Mutex<PlasticityManager>>,
162 scheduler: Arc<NanoScheduler>,
163 attention_weights: Arc<RwLock<Array1<f64>>>,
164 current_phi: Arc<RwLock<f64>>,
165 consciousness_level: Arc<RwLock<f64>>,
166 is_running: Arc<Mutex<bool>>,
167 metrics: Arc<RwLock<SystemMetrics>>,
168 start_time: Instant,
169}
170
171impl ConsciousnessSystem {
172 pub fn new(config: ConsciousnessConfig) -> Result<Self, ConsciousnessError> {
174 let mut network_layers = vec![config.input_size];
176 network_layers.extend_from_slice(&config.hidden_layers);
177 network_layers.push(config.output_size);
178
179 if network_layers.len() < 2 {
181 return Err(ConsciousnessError::InvalidConfig(
182 "Network must have at least 2 layers".to_string()
183 ));
184 }
185
186 if network_layers.len() - 1 != config.network_activations.len() {
187 return Err(ConsciousnessError::InvalidConfig(
188 "Number of activations must match layer transitions".to_string()
189 ));
190 }
191
192 let network = ConsciousnessNetwork::new(
194 &network_layers,
195 &config.network_activations,
196 config.learning_rate,
197 );
198
199 let temporal_processor = TemporalProcessor::new(
201 config.temporal_window_size,
202 config.temporal_overlap_ratio,
203 config.max_temporal_windows,
204 config.phi_threshold,
205 );
206
207 let plasticity_manager = PlasticityManager::new(
209 config.stdp_config.clone(),
210 10000, );
212
213 let scheduler = NanoScheduler::new(config.scheduler_config.clone());
215
216 let input_size = config.input_size;
218 let attention_weights = Array1::ones(input_size);
219
220 let system = Self {
221 config,
222 network: Arc::new(Mutex::new(network)),
223 temporal_processor: Arc::new(Mutex::new(temporal_processor)),
224 plasticity_manager: Arc::new(Mutex::new(plasticity_manager)),
225 scheduler: Arc::new(scheduler),
226 attention_weights: Arc::new(RwLock::new(attention_weights)),
227 current_phi: Arc::new(RwLock::new(0.0)),
228 consciousness_level: Arc::new(RwLock::new(0.0)),
229 is_running: Arc::new(Mutex::new(false)),
230 metrics: Arc::new(RwLock::new(SystemMetrics::default())),
231 start_time: Instant::now(),
232 };
233
234 Ok(system)
235 }
236
237 pub fn start(&self) -> Result<(), ConsciousnessError> {
239 let mut running = self.is_running.lock()
240 .map_err(|_| ConsciousnessError::SystemError("Failed to acquire lock".to_string()))?;
241
242 if *running {
243 return Err(ConsciousnessError::AlreadyRunning);
244 }
245
246 *running = true;
247 self.scheduler.start()?;
248
249 self.schedule_consciousness_tasks()?;
251
252 Ok(())
253 }
254
255 pub fn stop(&self) -> Result<(), ConsciousnessError> {
257 let mut running = self.is_running.lock()
258 .map_err(|_| ConsciousnessError::SystemError("Failed to acquire lock".to_string()))?;
259
260 *running = false;
261 self.scheduler.stop();
262
263 Ok(())
264 }
265
266 pub fn process_input(&self, input: &[f64]) -> Result<f64, ConsciousnessError> {
268 if input.len() != self.config.input_size {
269 return Err(ConsciousnessError::InvalidInput(
270 format!("Expected input size {}, got {}", self.config.input_size, input.len())
271 ));
272 }
273
274 let input_array = Array1::from(input.to_vec());
275
276 let attention_weights = self.attention_weights.read()
278 .map_err(|_| ConsciousnessError::SystemError("Failed to read attention weights".to_string()))?;
279 let attended_input = &input_array * &*attention_weights;
280
281 let mut network = self.network.lock()
283 .map_err(|_| ConsciousnessError::SystemError("Failed to acquire network lock".to_string()))?;
284
285 let output = network.forward(&attended_input);
286
287 let phi = network.calculate_phi();
289 *self.current_phi.write()
290 .map_err(|_| ConsciousnessError::SystemError("Failed to write phi".to_string()))? = phi;
291
292 let global_workspace = network.global_workspace_activation(&attended_input);
294
295 let strange_loop_output = network.strange_loop_dynamics(&attended_input, self.config.strange_loop_depth);
297
298 let consciousness_level = self.calculate_consciousness_level(phi, global_workspace, &output, &strange_loop_output)?;
300
301 *self.consciousness_level.write()
303 .map_err(|_| ConsciousnessError::SystemError("Failed to write consciousness level".to_string()))? = consciousness_level;
304
305 let neural_state = NeuralState::new(
307 output.clone(),
308 network.layers[network.layers.len() / 2].last_output.clone().unwrap_or(Array1::zeros(1)),
309 attention_weights.clone(),
310 consciousness_level,
311 phi,
312 );
313
314 let mut temporal = self.temporal_processor.lock()
316 .map_err(|_| ConsciousnessError::SystemError("Failed to acquire temporal lock".to_string()))?;
317 temporal.add_state(neural_state);
318
319 if self.config.enable_plasticity {
321 self.update_plasticity(&output)?;
322 }
323
324 self.update_attention(consciousness_level)?;
326
327 if self.config.enable_metrics {
329 self.update_metrics(consciousness_level, phi, global_workspace)?;
330 }
331
332 Ok(consciousness_level)
333 }
334
335 fn calculate_consciousness_level(
337 &self,
338 phi: f64,
339 global_workspace: f64,
340 output: &Array1<f64>,
341 strange_loop_output: &Array1<f64>,
342 ) -> Result<f64, ConsciousnessError> {
343 let phi_component = if phi > self.config.phi_threshold {
347 phi / (1.0 + phi) } else {
349 0.0
350 };
351
352 let workspace_component = if global_workspace > self.config.global_workspace_threshold {
354 global_workspace
355 } else {
356 0.0
357 };
358
359 let loop_coherence = if output.len() == strange_loop_output.len() {
361 let correlation = output.dot(strange_loop_output) /
362 (output.mapv(|x| x * x).sum().sqrt() * strange_loop_output.mapv(|x| x * x).sum().sqrt());
363 correlation.max(0.0)
364 } else {
365 0.0
366 };
367
368 let temporal = self.temporal_processor.lock()
370 .map_err(|_| ConsciousnessError::SystemError("Failed to acquire temporal lock".to_string()))?;
371 let temporal_coherence = temporal.calculate_stream_continuity();
372
373 let consciousness_level =
375 0.4 * phi_component +
376 0.3 * workspace_component +
377 0.2 * loop_coherence +
378 0.1 * temporal_coherence;
379
380 Ok(consciousness_level.min(1.0).max(0.0))
381 }
382
383 fn update_plasticity(&self, output: &Array1<f64>) -> Result<(), ConsciousnessError> {
385 let mut plasticity = self.plasticity_manager.lock()
386 .map_err(|_| ConsciousnessError::SystemError("Failed to acquire plasticity lock".to_string()))?;
387
388 for (neuron_id, &activation) in output.iter().enumerate() {
390 if activation > 0.5 {
392 let spike = SpikeEvent::new(neuron_id, activation);
393 plasticity.record_spike(spike);
394 }
395 }
396
397 plasticity.apply_homeostatic_scaling();
399
400 Ok(())
401 }
402
403 fn update_attention(&self, consciousness_level: f64) -> Result<(), ConsciousnessError> {
405 let mut attention = self.attention_weights.write()
406 .map_err(|_| ConsciousnessError::SystemError("Failed to write attention weights".to_string()))?;
407
408 *attention = &*attention * self.config.attention_decay_rate;
410
411 let boost_factor = 1.0 + consciousness_level * 0.1;
413 *attention = &*attention * boost_factor;
414
415 let sum = attention.sum();
417 if sum > 0.0 {
418 *attention = &*attention / sum;
419 }
420
421 Ok(())
422 }
423
424 fn update_metrics(&self, consciousness_level: f64, phi: f64, global_workspace: f64) -> Result<(), ConsciousnessError> {
426 let mut metrics = self.metrics.write()
427 .map_err(|_| ConsciousnessError::SystemError("Failed to write metrics".to_string()))?;
428
429 metrics.total_processing_cycles += 1;
430 metrics.average_consciousness_level =
431 (metrics.average_consciousness_level * (metrics.total_processing_cycles - 1) as f64 + consciousness_level)
432 / metrics.total_processing_cycles as f64;
433
434 metrics.average_phi =
435 (metrics.average_phi * (metrics.total_processing_cycles - 1) as f64 + phi)
436 / metrics.total_processing_cycles as f64;
437
438 metrics.average_global_workspace =
439 (metrics.average_global_workspace * (metrics.total_processing_cycles - 1) as f64 + global_workspace)
440 / metrics.total_processing_cycles as f64;
441
442 if consciousness_level > metrics.max_consciousness_level {
443 metrics.max_consciousness_level = consciousness_level;
444 }
445
446 if consciousness_level > 0.7 {
447 metrics.high_consciousness_events += 1;
448 }
449
450 let uptime = self.start_time.elapsed().as_secs_f64();
451 metrics.processing_rate = metrics.total_processing_cycles as f64 / uptime;
452
453 Ok(())
454 }
455
456 fn schedule_consciousness_tasks(&self) -> Result<(), ConsciousnessError> {
458 self.scheduler.schedule_repeating(
460 "phi_update".to_string(),
461 Duration::from_millis(100),
462 Duration::from_millis(50),
463 TaskPriority::High,
464 TaskPayload::ConsciousnessMetric {
465 phi_calculation: true,
466 integration_level: 0.5,
467 },
468 ).map_err(|e| ConsciousnessError::SchedulingError(e.to_string()))?;
469
470 self.scheduler.schedule_repeating(
472 "temporal_processing".to_string(),
473 Duration::from_millis(50),
474 Duration::from_millis(25),
475 TaskPriority::Normal,
476 TaskPayload::TemporalWindow {
477 window_size: 100,
478 overlap: 0.5,
479 },
480 ).map_err(|e| ConsciousnessError::SchedulingError(e.to_string()))?;
481
482 if self.config.enable_plasticity {
484 self.scheduler.schedule_repeating(
485 "plasticity_update".to_string(),
486 Duration::from_millis(200),
487 Duration::from_millis(100),
488 TaskPriority::Normal,
489 TaskPayload::PlasticityUpdate {
490 pre_neuron: 0,
491 post_neuron: 1,
492 strength: 0.01,
493 },
494 ).map_err(|e| ConsciousnessError::SchedulingError(e.to_string()))?;
495 }
496
497 Ok(())
498 }
499
500 pub fn get_consciousness_level(&self) -> Result<f64, ConsciousnessError> {
502 self.consciousness_level.read()
503 .map(|level| *level)
504 .map_err(|_| ConsciousnessError::SystemError("Failed to read consciousness level".to_string()))
505 }
506
507 pub fn get_phi(&self) -> Result<f64, ConsciousnessError> {
509 self.current_phi.read()
510 .map(|phi| *phi)
511 .map_err(|_| ConsciousnessError::SystemError("Failed to read phi".to_string()))
512 }
513
514 pub fn get_attention_weights(&self) -> Result<Array1<f64>, ConsciousnessError> {
516 self.attention_weights.read()
517 .map(|weights| weights.clone())
518 .map_err(|_| ConsciousnessError::SystemError("Failed to read attention weights".to_string()))
519 }
520
521 pub fn get_metrics(&self) -> Result<SystemMetrics, ConsciousnessError> {
523 self.metrics.read()
524 .map(|metrics| metrics.clone())
525 .map_err(|_| ConsciousnessError::SystemError("Failed to read metrics".to_string()))
526 }
527
528 pub fn get_network_stats(&self) -> Result<NetworkStats, ConsciousnessError> {
530 self.network.lock()
531 .map(|network| network.get_network_stats())
532 .map_err(|_| ConsciousnessError::SystemError("Failed to acquire network lock".to_string()))
533 }
534
535 pub fn get_temporal_stats(&self) -> Result<TemporalStats, ConsciousnessError> {
537 self.temporal_processor.lock()
538 .map(|temporal| temporal.get_temporal_stats())
539 .map_err(|_| ConsciousnessError::SystemError("Failed to acquire temporal lock".to_string()))
540 }
541
542 pub fn get_plasticity_metrics(&self) -> Result<PlasticityMetrics, ConsciousnessError> {
544 self.plasticity_manager.lock()
545 .map(|plasticity| plasticity.calculate_plasticity_metrics())
546 .map_err(|_| ConsciousnessError::SystemError("Failed to acquire plasticity lock".to_string()))
547 }
548
549 pub fn benchmark(&self, num_iterations: usize) -> Result<BenchmarkResults, ConsciousnessError> {
551 let start_time = Instant::now();
552 let mut consciousness_levels = Vec::with_capacity(num_iterations);
553 let mut phi_values = Vec::with_capacity(num_iterations);
554
555 let _rng = rand::thread_rng();
557 let input_size = self.config.input_size;
558
559 for i in 0..num_iterations {
560 let input: Vec<f64> = (0..input_size)
562 .map(|j| ((i + j) as f64 / num_iterations as f64).sin())
563 .collect();
564
565 let consciousness_level = self.process_input(&input)?;
566 let phi = self.get_phi()?;
567
568 consciousness_levels.push(consciousness_level);
569 phi_values.push(phi);
570 }
571
572 let duration = start_time.elapsed();
573 let throughput = num_iterations as f64 / duration.as_secs_f64();
574
575 let avg_consciousness: f64 = consciousness_levels.iter().sum::<f64>() / consciousness_levels.len() as f64;
576 let avg_phi: f64 = phi_values.iter().sum::<f64>() / phi_values.len() as f64;
577
578 let max_consciousness = consciousness_levels.iter().fold(0.0f64, |a, &b| a.max(b));
579 let min_consciousness = consciousness_levels.iter().fold(1.0f64, |a, &b| a.min(b));
580
581 Ok(BenchmarkResults {
582 num_iterations,
583 duration,
584 throughput,
585 avg_consciousness_level: avg_consciousness,
586 max_consciousness_level: max_consciousness,
587 min_consciousness_level: min_consciousness,
588 avg_phi: avg_phi,
589 consciousness_variance: {
590 let variance: f64 = consciousness_levels.iter()
591 .map(|&x| (x - avg_consciousness).powi(2))
592 .sum::<f64>() / consciousness_levels.len() as f64;
593 variance
594 },
595 })
596 }
597
598 pub fn is_running(&self) -> Result<bool, ConsciousnessError> {
600 self.is_running.lock()
601 .map(|running| *running)
602 .map_err(|_| ConsciousnessError::SystemError("Failed to check running state".to_string()))
603 }
604
605 pub fn export_state(&self) -> Result<SystemState, ConsciousnessError> {
607 let network_stats = self.get_network_stats()?;
608 let temporal_stats = self.get_temporal_stats()?;
609 let plasticity_metrics = self.get_plasticity_metrics()?;
610 let system_metrics = self.get_metrics()?;
611 let consciousness_level = self.get_consciousness_level()?;
612 let phi = self.get_phi()?;
613 let attention_weights = self.get_attention_weights()?;
614
615 Ok(SystemState {
616 consciousness_level,
617 phi_value: phi,
618 attention_weights: attention_weights.to_vec(),
619 network_stats,
620 temporal_stats,
621 plasticity_metrics,
622 system_metrics,
623 timestamp: NanoTimestamp::now(),
624 })
625 }
626}
627
628#[derive(Debug, Clone, Default, Serialize, Deserialize)]
630pub struct SystemMetrics {
631 pub total_processing_cycles: u64,
632 pub average_consciousness_level: f64,
633 pub max_consciousness_level: f64,
634 pub average_phi: f64,
635 pub average_global_workspace: f64,
636 pub high_consciousness_events: u64,
637 pub processing_rate: f64,
638}
639
640#[derive(Debug, Clone, Serialize, Deserialize)]
642pub struct BenchmarkResults {
643 pub num_iterations: usize,
644 pub duration: Duration,
645 pub throughput: f64,
646 pub avg_consciousness_level: f64,
647 pub max_consciousness_level: f64,
648 pub min_consciousness_level: f64,
649 pub avg_phi: f64,
650 pub consciousness_variance: f64,
651}
652
653#[derive(Debug, Clone, Serialize, Deserialize)]
655pub struct SystemState {
656 pub consciousness_level: f64,
657 pub phi_value: f64,
658 pub attention_weights: Vec<f64>,
659 pub network_stats: NetworkStats,
660 pub temporal_stats: TemporalStats,
661 pub plasticity_metrics: PlasticityMetrics,
662 pub system_metrics: SystemMetrics,
663 pub timestamp: NanoTimestamp,
664}
665
666#[derive(Debug, Error)]
668pub enum ConsciousnessError {
669 #[error("Invalid configuration: {0}")]
670 InvalidConfig(String),
671 #[error("Invalid input: {0}")]
672 InvalidInput(String),
673 #[error("System error: {0}")]
674 SystemError(String),
675 #[error("Scheduling error: {0}")]
676 SchedulingError(String),
677 #[error("System is already running")]
678 AlreadyRunning,
679 #[error("System is not running")]
680 NotRunning,
681 #[error("Network error: {0}")]
682 NetworkError(String),
683 #[error("Temporal processing error: {0}")]
684 TemporalError(String),
685 #[error("Plasticity error: {0}")]
686 PlasticityError(String),
687}
688
689impl From<scheduler::SchedulerError> for ConsciousnessError {
690 fn from(err: scheduler::SchedulerError) -> Self {
691 ConsciousnessError::SchedulingError(err.to_string())
692 }
693}
694
695#[cfg(target_arch = "wasm32")]
697mod wasm {
698 use super::*;
699 use wasm_bindgen::prelude::*;
700
701 #[wasm_bindgen]
702 pub struct WasmConsciousnessSystem {
703 inner: ConsciousnessSystem,
704 }
705
706 #[wasm_bindgen]
707 impl WasmConsciousnessSystem {
708 #[wasm_bindgen(constructor)]
709 pub fn new() -> Result<WasmConsciousnessSystem, JsValue> {
710 let config = ConsciousnessConfig::default();
711 let system = ConsciousnessSystem::new(config)
712 .map_err(|e| JsValue::from_str(&e.to_string()))?;
713
714 Ok(WasmConsciousnessSystem { inner: system })
715 }
716
717 #[wasm_bindgen]
718 pub fn start(&self) -> Result<(), JsValue> {
719 self.inner.start()
720 .map_err(|e| JsValue::from_str(&e.to_string()))
721 }
722
723 pub fn stop(&self) -> Result<(), JsValue> {
724 self.inner.stop()
725 .map_err(|e| JsValue::from_str(&e.to_string()))
726 }
727
728 pub fn process_input(&self, input: &[f64]) -> Result<f64, JsValue> {
729 self.inner.process_input(input)
730 .map_err(|e| JsValue::from_str(&e.to_string()))
731 }
732
733 pub fn get_consciousness_level(&self) -> Result<f64, JsValue> {
734 self.inner.get_consciousness_level()
735 .map_err(|e| JsValue::from_str(&e.to_string()))
736 }
737
738 pub fn get_phi(&self) -> Result<f64, JsValue> {
739 self.inner.get_phi()
740 .map_err(|e| JsValue::from_str(&e.to_string()))
741 }
742
743 pub fn benchmark(&self, iterations: usize) -> Result<JsValue, JsValue> {
744 let results = self.inner.benchmark(iterations)
745 .map_err(|e| JsValue::from_str(&e.to_string()))?;
746
747 #[cfg(target_arch = "wasm32")]
748 {
749 serde_wasm_bindgen::to_value(&results)
750 }
751 #[cfg(not(target_arch = "wasm32"))]
752 {
753 Ok(JsValue::from_str(&format!("{:?}", results)))
754 }
755 .map_err(|e| JsValue::from_str(&e.to_string()))
756 }
757 }
758}
759
760#[cfg(target_arch = "wasm32")]
761pub use wasm::*;
762
763#[cfg(test)]
764mod tests {
765 use super::*;
766 use approx::assert_relative_eq;
767
768 #[test]
769 fn test_consciousness_system_creation() {
770 let config = ConsciousnessConfig::default();
771 let system = ConsciousnessSystem::new(config);
772 assert!(system.is_ok());
773 }
774
775 #[test]
776 fn test_consciousness_system_start_stop() {
777 let config = ConsciousnessConfig::default();
778 let system = ConsciousnessSystem::new(config).unwrap();
779
780 assert!(system.start().is_ok());
781 assert!(system.is_running().unwrap());
782 assert!(system.stop().is_ok());
783 assert!(!system.is_running().unwrap());
784 }
785
786 #[test]
787 fn test_process_input() {
788 let config = ConsciousnessConfig::default();
789 let system = ConsciousnessSystem::new(config).unwrap();
790 system.start().unwrap();
791
792 let input = vec![1.0, 0.5, -0.3, 0.8, 0.2, 0.9, -0.1, 0.4,
793 0.7, -0.2, 0.6, 0.3, -0.5, 0.1, 0.8, -0.4];
794
795 let consciousness_level = system.process_input(&input).unwrap();
796
797 assert!(consciousness_level >= 0.0);
798 assert!(consciousness_level <= 1.0);
799 }
800
801 #[test]
802 fn test_invalid_input_size() {
803 let config = ConsciousnessConfig::default();
804 let system = ConsciousnessSystem::new(config).unwrap();
805
806 let input = vec![1.0, 0.5]; let result = system.process_input(&input);
808
809 assert!(result.is_err());
810 match result.unwrap_err() {
811 ConsciousnessError::InvalidInput(_) => {},
812 _ => panic!("Expected InvalidInput error"),
813 }
814 }
815
816 #[test]
817 fn test_consciousness_metrics() {
818 let config = ConsciousnessConfig::default();
819 let system = ConsciousnessSystem::new(config).unwrap();
820 system.start().unwrap();
821
822 let input = vec![1.0; 16]; system.process_input(&input).unwrap();
824
825 let consciousness_level = system.get_consciousness_level().unwrap();
826 let phi = system.get_phi().unwrap();
827 let attention = system.get_attention_weights().unwrap();
828
829 assert!(consciousness_level >= 0.0 && consciousness_level <= 1.0);
830 assert!(phi >= 0.0);
831 assert_eq!(attention.len(), 16);
832 }
833
834 #[test]
835 fn test_system_metrics() {
836 let config = ConsciousnessConfig::default();
837 let system = ConsciousnessSystem::new(config).unwrap();
838 system.start().unwrap();
839
840 let input = vec![1.0; 16];
841 system.process_input(&input).unwrap();
842
843 let metrics = system.get_metrics().unwrap();
844 assert!(metrics.total_processing_cycles > 0);
845 assert!(metrics.processing_rate >= 0.0);
846 }
847
848 #[test]
849 fn test_benchmark() {
850 let config = ConsciousnessConfig::default();
851 let system = ConsciousnessSystem::new(config).unwrap();
852 system.start().unwrap();
853
854 let results = system.benchmark(10).unwrap();
855
856 assert_eq!(results.num_iterations, 10);
857 assert!(results.throughput > 0.0);
858 assert!(results.avg_consciousness_level >= 0.0);
859 assert!(results.avg_consciousness_level <= 1.0);
860 }
861
862 #[test]
863 fn test_state_export() {
864 let config = ConsciousnessConfig::default();
865 let system = ConsciousnessSystem::new(config).unwrap();
866 system.start().unwrap();
867
868 let input = vec![1.0; 16];
869 system.process_input(&input).unwrap();
870
871 let state = system.export_state().unwrap();
872
873 assert!(state.consciousness_level >= 0.0);
874 assert!(state.consciousness_level <= 1.0);
875 assert!(state.phi_value >= 0.0);
876 assert_eq!(state.attention_weights.len(), 16);
877 }
878
879 #[test]
880 fn test_invalid_config() {
881 let mut config = ConsciousnessConfig::default();
882 config.hidden_layers = vec![]; let result = ConsciousnessSystem::new(config);
885 assert!(result.is_err());
886
887 match result.unwrap_err() {
888 ConsciousnessError::InvalidConfig(_) => {},
889 _ => panic!("Expected InvalidConfig error"),
890 }
891 }
892
893 #[test]
894 fn test_multiple_processing_cycles() {
895 let config = ConsciousnessConfig::default();
896 let system = ConsciousnessSystem::new(config).unwrap();
897 system.start().unwrap();
898
899 let input = vec![1.0; 16];
900
901 for i in 0..5 {
903 let varied_input: Vec<f64> = input.iter()
904 .enumerate()
905 .map(|(j, &x)| x + (i + j) as f64 * 0.1)
906 .collect();
907
908 let consciousness_level = system.process_input(&varied_input).unwrap();
909 assert!(consciousness_level >= 0.0 && consciousness_level <= 1.0);
910 }
911
912 let metrics = system.get_metrics().unwrap();
913 assert_eq!(metrics.total_processing_cycles, 5);
914 }
915}