1use crate::error::QuantRS2Error;
7
8use ndarray::Array1;
9use num_complex::Complex64;
10use serde::{Deserialize, Serialize};
11use std::collections::HashMap;
12use std::sync::{Arc, Mutex, RwLock};
13use std::time::{Duration, Instant, SystemTime};
14use uuid::Uuid;
15
16#[derive(Debug)]
18pub struct QuantumMemory {
19 pub memory_id: Uuid,
20 pub storage_layers: Vec<Arc<dyn QuantumStorageLayer>>,
21 pub cache: Arc<RwLock<QuantumCache>>,
22 pub error_correction: QuantumMemoryErrorCorrection,
23 pub coherence_manager: CoherenceManager,
24 pub access_controller: MemoryAccessController,
25}
26
27pub trait QuantumStorageLayer: Send + Sync + std::fmt::Debug {
29 fn store_state(&self, state_id: Uuid, state: &QuantumState) -> Result<(), QuantRS2Error>;
30 fn retrieve_state(&self, state_id: Uuid) -> Result<Option<QuantumState>, QuantRS2Error>;
31 fn delete_state(&self, state_id: Uuid) -> Result<(), QuantRS2Error>;
32 fn list_states(&self) -> Result<Vec<Uuid>, QuantRS2Error>;
33 fn get_storage_info(&self) -> StorageLayerInfo;
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize)]
37pub struct QuantumState {
38 pub state_id: Uuid,
39 pub amplitudes: Vec<Complex64>,
40 pub qubit_count: usize,
41 pub creation_time: SystemTime,
42 pub last_access: SystemTime,
43 pub coherence_time: Duration,
44 pub fidelity: f64,
45 pub metadata: StateMetadata,
46}
47
48#[derive(Debug, Clone, Serialize, Deserialize)]
49pub struct StateMetadata {
50 pub name: Option<String>,
51 pub description: Option<String>,
52 pub tags: Vec<String>,
53 pub creator: Option<String>,
54 pub access_count: u64,
55 pub compression_ratio: f64,
56 pub entanglement_entropy: f64,
57}
58
59#[derive(Debug, Clone)]
60pub struct StorageLayerInfo {
61 pub layer_type: StorageLayerType,
62 pub capacity: usize, pub latency: Duration,
64 pub reliability: f64,
65 pub energy_cost: f64, }
67
68#[derive(Debug, Clone)]
69pub enum StorageLayerType {
70 UltraFast, Fast, Persistent, Archive, Distributed, }
76
77impl QuantumMemory {
78 pub fn new() -> Self {
80 let memory_id = Uuid::new_v4();
81 let cache = Arc::new(RwLock::new(QuantumCache::new(1000))); Self {
84 memory_id,
85 storage_layers: Vec::new(),
86 cache,
87 error_correction: QuantumMemoryErrorCorrection::new(),
88 coherence_manager: CoherenceManager::new(),
89 access_controller: MemoryAccessController::new(),
90 }
91 }
92
93 pub fn add_storage_layer(&mut self, layer: Arc<dyn QuantumStorageLayer>) {
95 self.storage_layers.push(layer);
96 self.storage_layers.sort_by(|a, b| {
98 a.get_storage_info()
99 .latency
100 .cmp(&b.get_storage_info().latency)
101 });
102 }
103
104 pub async fn store_state(&self, state: QuantumState) -> Result<Uuid, QuantRS2Error> {
106 self.access_controller.check_write_permission(&state)?;
108
109 let encoded_state = self.error_correction.encode_state(&state)?;
111
112 {
114 let mut cache = self.cache.write().unwrap();
115 cache.insert(state.state_id, encoded_state.clone());
116 }
117
118 let target_layer = self.select_storage_layer(&encoded_state).await?;
120 target_layer.store_state(encoded_state.state_id, &encoded_state)?;
121
122 self.coherence_manager
124 .start_tracking(encoded_state.state_id, encoded_state.coherence_time)
125 .await;
126
127 Ok(encoded_state.state_id)
128 }
129
130 pub async fn retrieve_state(
132 &self,
133 state_id: Uuid,
134 ) -> Result<Option<QuantumState>, QuantRS2Error> {
135 self.access_controller.check_read_permission(state_id)?;
137
138 {
140 let mut cache = self.cache.write().unwrap();
141 if let Some(cached_state) = cache.get(&state_id) {
142 self.update_access_stats(state_id).await;
144 return Ok(Some(self.error_correction.decode_state(cached_state)?));
145 }
146 }
147
148 for layer in &self.storage_layers {
150 if let Some(encoded_state) = layer.retrieve_state(state_id)? {
151 if self.coherence_manager.is_coherent(state_id).await {
153 let decoded_state = self.error_correction.decode_state(&encoded_state)?;
155
156 {
157 let mut cache = self.cache.write().unwrap();
158 cache.insert(state_id, encoded_state);
159 }
160
161 self.update_access_stats(state_id).await;
162 return Ok(Some(decoded_state));
163 } else {
164 layer.delete_state(state_id)?;
166 return Err(QuantRS2Error::QuantumDecoherence(format!(
167 "State {} has decoherent",
168 state_id
169 )));
170 }
171 }
172 }
173
174 Ok(None)
175 }
176
177 pub async fn delete_state(&self, state_id: Uuid) -> Result<(), QuantRS2Error> {
179 self.access_controller.check_delete_permission(state_id)?;
181
182 {
184 let mut cache = self.cache.write().unwrap();
185 cache.remove(&state_id);
186 }
187
188 for layer in &self.storage_layers {
190 let _ = layer.delete_state(state_id); }
192
193 self.coherence_manager.stop_tracking(state_id).await;
195
196 Ok(())
197 }
198
199 async fn select_storage_layer(
201 &self,
202 state: &QuantumState,
203 ) -> Result<Arc<dyn QuantumStorageLayer>, QuantRS2Error> {
204 let access_pattern = self.predict_access_pattern(state).await;
206 let _importance_score = self.calculate_importance_score(state);
207
208 for layer in &self.storage_layers {
210 let info = layer.get_storage_info();
211
212 match (&access_pattern, info.layer_type.clone()) {
213 (&AccessPattern::Frequent, StorageLayerType::UltraFast)
214 | (&AccessPattern::Frequent, StorageLayerType::Fast) => {
215 return Ok(layer.clone());
216 }
217 (&AccessPattern::Moderate, StorageLayerType::Fast)
218 | (&AccessPattern::Moderate, StorageLayerType::Persistent) => {
219 return Ok(layer.clone());
220 }
221 (&AccessPattern::Rare, StorageLayerType::Persistent)
222 | (&AccessPattern::Rare, StorageLayerType::Archive) => {
223 return Ok(layer.clone());
224 }
225 _ => continue,
226 }
227 }
228
229 self.storage_layers.first().cloned().ok_or_else(|| {
231 QuantRS2Error::NoStorageAvailable("No storage layers configured".to_string())
232 })
233 }
234
235 async fn predict_access_pattern(&self, state: &QuantumState) -> AccessPattern {
237 let recency_factor = state
241 .last_access
242 .elapsed()
243 .unwrap_or(Duration::ZERO)
244 .as_secs() as f64
245 / 3600.0; let access_frequency = state.metadata.access_count as f64
248 / state
249 .creation_time
250 .elapsed()
251 .unwrap_or(Duration::from_secs(1))
252 .as_secs() as f64;
253
254 if access_frequency > 0.1 && recency_factor < 1.0 {
255 AccessPattern::Frequent
256 } else if access_frequency > 0.01 && recency_factor < 24.0 {
257 AccessPattern::Moderate
258 } else {
259 AccessPattern::Rare
260 }
261 }
262
263 fn calculate_importance_score(&self, state: &QuantumState) -> f64 {
265 let mut score = 0.0;
266
267 score += state.fidelity * 10.0;
269
270 score += state.metadata.entanglement_entropy * 5.0;
272
273 let hours_since_access = state
275 .last_access
276 .elapsed()
277 .unwrap_or(Duration::ZERO)
278 .as_secs() as f64
279 / 3600.0;
280 score += (24.0 - hours_since_access.min(24.0)) / 24.0 * 3.0;
281
282 score += (state.metadata.access_count as f64).ln().max(0.0);
284
285 score
286 }
287
288 async fn update_access_stats(&self, _state_id: Uuid) {
290 }
293
294 pub async fn garbage_collect(&self) -> Result<GarbageCollectionResult, QuantRS2Error> {
296 let mut collected_states = 0;
297 let mut freed_space = 0;
298 let start_time = Instant::now();
299
300 let mut all_states = Vec::new();
302 for layer in &self.storage_layers {
303 let layer_states = layer.list_states()?;
304 all_states.extend(layer_states);
305 }
306
307 for state_id in all_states {
309 if !self.coherence_manager.is_coherent(state_id).await {
310 self.delete_state(state_id).await?;
312 collected_states += 1;
313 freed_space += 1; }
315 }
316
317 {
319 let mut cache = self.cache.write().unwrap();
320 cache.compact();
321 }
322
323 Ok(GarbageCollectionResult {
324 collected_states,
325 freed_space,
326 execution_time: start_time.elapsed(),
327 })
328 }
329}
330
331#[derive(Debug)]
333pub struct QuantumCache {
334 cache: HashMap<Uuid, QuantumState>,
335 access_order: Vec<Uuid>,
336 max_size: usize,
337}
338
339impl QuantumCache {
340 pub fn new(max_size: usize) -> Self {
341 Self {
342 cache: HashMap::new(),
343 access_order: Vec::new(),
344 max_size,
345 }
346 }
347
348 pub fn insert(&mut self, state_id: Uuid, state: QuantumState) {
349 if self.cache.contains_key(&state_id) {
351 self.remove(&state_id);
352 }
353
354 self.cache.insert(state_id, state);
356 self.access_order.push(state_id);
357
358 while self.cache.len() > self.max_size {
360 if let Some(oldest) = self.access_order.first().cloned() {
361 self.remove(&oldest);
362 }
363 }
364 }
365
366 pub fn get(&mut self, state_id: &Uuid) -> Option<&QuantumState> {
367 if self.cache.contains_key(state_id) {
368 self.access_order.retain(|&id| id != *state_id);
370 self.access_order.push(*state_id);
371 self.cache.get(state_id)
372 } else {
373 None
374 }
375 }
376
377 pub fn remove(&mut self, state_id: &Uuid) {
378 self.cache.remove(state_id);
379 self.access_order.retain(|&id| id != *state_id);
380 }
381
382 pub fn compact(&mut self) {
383 self.access_order.retain(|id| self.cache.contains_key(id));
385 }
386}
387
388#[derive(Debug)]
390pub struct QuantumMemoryErrorCorrection {
391 pub code_type: QuantumErrorCode,
392 pub syndrome_table: HashMap<Vec<bool>, Array1<Complex64>>,
393 pub encoding_overhead: f64,
394}
395
396#[derive(Debug, Clone)]
397pub enum QuantumErrorCode {
398 ShorCode,
399 SteaneCode,
400 SurfaceCode {
401 distance: usize,
402 },
403 ColorCode {
404 distance: usize,
405 },
406 Custom {
407 name: String,
408 parameters: HashMap<String, f64>,
409 },
410}
411
412impl QuantumMemoryErrorCorrection {
413 pub fn new() -> Self {
414 Self {
415 code_type: QuantumErrorCode::SteaneCode,
416 syndrome_table: HashMap::new(),
417 encoding_overhead: 7.0, }
419 }
420
421 pub fn encode_state(&self, state: &QuantumState) -> Result<QuantumState, QuantRS2Error> {
423 match &self.code_type {
424 QuantumErrorCode::SteaneCode => self.encode_steane(state),
425 QuantumErrorCode::ShorCode => self.encode_shor(state),
426 QuantumErrorCode::SurfaceCode { distance } => self.encode_surface(state, *distance),
427 QuantumErrorCode::ColorCode { distance } => self.encode_color(state, *distance),
428 QuantumErrorCode::Custom { .. } => self.encode_custom(state),
429 }
430 }
431
432 pub fn decode_state(
434 &self,
435 encoded_state: &QuantumState,
436 ) -> Result<QuantumState, QuantRS2Error> {
437 match &self.code_type {
438 QuantumErrorCode::SteaneCode => self.decode_steane(encoded_state),
439 QuantumErrorCode::ShorCode => self.decode_shor(encoded_state),
440 QuantumErrorCode::SurfaceCode { distance } => {
441 self.decode_surface(encoded_state, *distance)
442 }
443 QuantumErrorCode::ColorCode { distance } => self.decode_color(encoded_state, *distance),
444 QuantumErrorCode::Custom { .. } => self.decode_custom(encoded_state),
445 }
446 }
447
448 fn encode_steane(&self, state: &QuantumState) -> Result<QuantumState, QuantRS2Error> {
450 let encoded_amplitudes = self.apply_steane_encoding(&state.amplitudes)?;
452
453 Ok(QuantumState {
454 state_id: state.state_id,
455 amplitudes: encoded_amplitudes,
456 qubit_count: state.qubit_count * 7, creation_time: state.creation_time,
458 last_access: SystemTime::now(),
459 coherence_time: state.coherence_time,
460 fidelity: state.fidelity * 0.99, metadata: state.metadata.clone(),
462 })
463 }
464
465 fn apply_steane_encoding(
467 &self,
468 amplitudes: &[Complex64],
469 ) -> Result<Vec<Complex64>, QuantRS2Error> {
470 let mut encoded = Vec::new();
472
473 for amp in amplitudes {
474 for _ in 0..7 {
476 encoded.push(*amp / (7.0_f64.sqrt()));
477 }
478 }
479
480 Ok(encoded)
481 }
482
483 fn decode_steane(&self, encoded_state: &QuantumState) -> Result<QuantumState, QuantRS2Error> {
485 let decoded_amplitudes = self.apply_steane_decoding(&encoded_state.amplitudes)?;
487
488 Ok(QuantumState {
489 state_id: encoded_state.state_id,
490 amplitudes: decoded_amplitudes,
491 qubit_count: encoded_state.qubit_count / 7,
492 creation_time: encoded_state.creation_time,
493 last_access: SystemTime::now(),
494 coherence_time: encoded_state.coherence_time,
495 fidelity: encoded_state.fidelity,
496 metadata: encoded_state.metadata.clone(),
497 })
498 }
499
500 fn apply_steane_decoding(
502 &self,
503 encoded_amplitudes: &[Complex64],
504 ) -> Result<Vec<Complex64>, QuantRS2Error> {
505 let mut decoded = Vec::new();
507
508 for chunk in encoded_amplitudes.chunks(7) {
509 if chunk.len() == 7 {
510 let recovered_amp = chunk.iter().sum::<Complex64>() / Complex64::new(7.0, 0.0)
512 * Complex64::new(7.0_f64.sqrt(), 0.0);
513 decoded.push(recovered_amp);
514 }
515 }
516
517 Ok(decoded)
518 }
519
520 fn encode_shor(&self, state: &QuantumState) -> Result<QuantumState, QuantRS2Error> {
522 let mut encoded_state = state.clone();
524 encoded_state.qubit_count *= 9;
525 Ok(encoded_state)
526 }
527
528 fn decode_shor(&self, encoded_state: &QuantumState) -> Result<QuantumState, QuantRS2Error> {
529 let mut decoded_state = encoded_state.clone();
530 decoded_state.qubit_count /= 9;
531 Ok(decoded_state)
532 }
533
534 fn encode_surface(
535 &self,
536 state: &QuantumState,
537 distance: usize,
538 ) -> Result<QuantumState, QuantRS2Error> {
539 let mut encoded_state = state.clone();
540 encoded_state.qubit_count *= distance * distance;
541 Ok(encoded_state)
542 }
543
544 fn decode_surface(
545 &self,
546 encoded_state: &QuantumState,
547 distance: usize,
548 ) -> Result<QuantumState, QuantRS2Error> {
549 let mut decoded_state = encoded_state.clone();
550 decoded_state.qubit_count /= distance * distance;
551 Ok(decoded_state)
552 }
553
554 fn encode_color(
555 &self,
556 state: &QuantumState,
557 distance: usize,
558 ) -> Result<QuantumState, QuantRS2Error> {
559 let mut encoded_state = state.clone();
560 encoded_state.qubit_count *= distance * distance * 2;
561 Ok(encoded_state)
562 }
563
564 fn decode_color(
565 &self,
566 encoded_state: &QuantumState,
567 distance: usize,
568 ) -> Result<QuantumState, QuantRS2Error> {
569 let mut decoded_state = encoded_state.clone();
570 decoded_state.qubit_count /= distance * distance * 2;
571 Ok(decoded_state)
572 }
573
574 fn encode_custom(&self, state: &QuantumState) -> Result<QuantumState, QuantRS2Error> {
575 Ok(state.clone())
576 }
577
578 fn decode_custom(&self, encoded_state: &QuantumState) -> Result<QuantumState, QuantRS2Error> {
579 Ok(encoded_state.clone())
580 }
581}
582
583#[derive(Debug)]
585pub struct CoherenceManager {
586 coherence_tracking: Arc<Mutex<HashMap<Uuid, CoherenceInfo>>>,
587}
588
589#[derive(Debug, Clone)]
590pub struct CoherenceInfo {
591 pub creation_time: Instant,
592 pub coherence_time: Duration,
593 pub last_check: Instant,
594 pub predicted_fidelity: f64,
595}
596
597impl CoherenceManager {
598 pub fn new() -> Self {
599 Self {
600 coherence_tracking: Arc::new(Mutex::new(HashMap::new())),
601 }
602 }
603
604 pub async fn start_tracking(&self, state_id: Uuid, coherence_time: Duration) {
606 let info = CoherenceInfo {
607 creation_time: Instant::now(),
608 coherence_time,
609 last_check: Instant::now(),
610 predicted_fidelity: 1.0,
611 };
612
613 self.coherence_tracking
614 .lock()
615 .unwrap()
616 .insert(state_id, info);
617 }
618
619 pub async fn stop_tracking(&self, state_id: Uuid) {
621 self.coherence_tracking.lock().unwrap().remove(&state_id);
622 }
623
624 pub async fn is_coherent(&self, state_id: Uuid) -> bool {
626 if let Some(info) = self.coherence_tracking.lock().unwrap().get(&state_id) {
627 let elapsed = info.creation_time.elapsed();
628 elapsed < info.coherence_time
629 } else {
630 false }
632 }
633
634 pub async fn get_predicted_fidelity(&self, state_id: Uuid) -> f64 {
636 if let Some(info) = self.coherence_tracking.lock().unwrap().get(&state_id) {
637 let elapsed = info.creation_time.elapsed();
638 let decay_factor = elapsed.as_secs_f64() / info.coherence_time.as_secs_f64();
639
640 (1.0 - decay_factor).max(0.0)
642 } else {
643 0.0
644 }
645 }
646}
647
648#[derive(Debug)]
650pub struct MemoryAccessController {
651 permissions: Arc<RwLock<HashMap<Uuid, StatePermissions>>>,
652 access_log: Arc<Mutex<Vec<AccessLogEntry>>>,
653}
654
655#[derive(Debug, Clone)]
656pub struct StatePermissions {
657 pub read: bool,
658 pub write: bool,
659 pub delete: bool,
660 pub owner: Option<String>,
661 pub authorized_users: Vec<String>,
662}
663
664#[derive(Debug, Clone)]
665pub struct AccessLogEntry {
666 pub timestamp: SystemTime,
667 pub state_id: Uuid,
668 pub operation: AccessOperation,
669 pub user: Option<String>,
670 pub success: bool,
671}
672
673#[derive(Debug, Clone)]
674pub enum AccessOperation {
675 Read,
676 Write,
677 Delete,
678}
679
680impl MemoryAccessController {
681 pub fn new() -> Self {
682 Self {
683 permissions: Arc::new(RwLock::new(HashMap::new())),
684 access_log: Arc::new(Mutex::new(Vec::new())),
685 }
686 }
687
688 pub fn check_read_permission(&self, state_id: Uuid) -> Result<(), QuantRS2Error> {
690 let permissions = self.permissions.read().unwrap();
691 if let Some(perms) = permissions.get(&state_id) {
692 if perms.read {
693 self.log_access(state_id, AccessOperation::Read, true);
694 Ok(())
695 } else {
696 self.log_access(state_id, AccessOperation::Read, false);
697 Err(QuantRS2Error::AccessDenied(
698 "Read access denied".to_string(),
699 ))
700 }
701 } else {
702 Ok(())
704 }
705 }
706
707 pub fn check_write_permission(&self, state: &QuantumState) -> Result<(), QuantRS2Error> {
709 let permissions = self.permissions.read().unwrap();
710 if let Some(perms) = permissions.get(&state.state_id) {
711 if perms.write {
712 self.log_access(state.state_id, AccessOperation::Write, true);
713 Ok(())
714 } else {
715 self.log_access(state.state_id, AccessOperation::Write, false);
716 Err(QuantRS2Error::AccessDenied(
717 "Write access denied".to_string(),
718 ))
719 }
720 } else {
721 Ok(())
723 }
724 }
725
726 pub fn check_delete_permission(&self, state_id: Uuid) -> Result<(), QuantRS2Error> {
728 let permissions = self.permissions.read().unwrap();
729 if let Some(perms) = permissions.get(&state_id) {
730 if perms.delete {
731 self.log_access(state_id, AccessOperation::Delete, true);
732 Ok(())
733 } else {
734 self.log_access(state_id, AccessOperation::Delete, false);
735 Err(QuantRS2Error::AccessDenied(
736 "Delete access denied".to_string(),
737 ))
738 }
739 } else {
740 Ok(())
742 }
743 }
744
745 fn log_access(&self, state_id: Uuid, operation: AccessOperation, success: bool) {
747 let entry = AccessLogEntry {
748 timestamp: SystemTime::now(),
749 state_id,
750 operation,
751 user: None, success,
753 };
754
755 self.access_log.lock().unwrap().push(entry);
756 }
757}
758
759#[derive(Debug)]
761pub struct InMemoryStorage {
762 states: Arc<RwLock<HashMap<Uuid, QuantumState>>>,
763 info: StorageLayerInfo,
764}
765
766impl InMemoryStorage {
767 pub fn new(capacity: usize) -> Self {
768 Self {
769 states: Arc::new(RwLock::new(HashMap::new())),
770 info: StorageLayerInfo {
771 layer_type: StorageLayerType::UltraFast,
772 capacity,
773 latency: Duration::from_nanos(100),
774 reliability: 0.99999,
775 energy_cost: 1.0,
776 },
777 }
778 }
779}
780
781impl QuantumStorageLayer for InMemoryStorage {
782 fn store_state(&self, state_id: Uuid, state: &QuantumState) -> Result<(), QuantRS2Error> {
783 let mut states = self.states.write().unwrap();
784 if states.len() >= self.info.capacity {
785 return Err(QuantRS2Error::StorageCapacityExceeded(
786 "Memory storage full".to_string(),
787 ));
788 }
789 states.insert(state_id, state.clone());
790 Ok(())
791 }
792
793 fn retrieve_state(&self, state_id: Uuid) -> Result<Option<QuantumState>, QuantRS2Error> {
794 let states = self.states.read().unwrap();
795 Ok(states.get(&state_id).cloned())
796 }
797
798 fn delete_state(&self, state_id: Uuid) -> Result<(), QuantRS2Error> {
799 let mut states = self.states.write().unwrap();
800 states.remove(&state_id);
801 Ok(())
802 }
803
804 fn list_states(&self) -> Result<Vec<Uuid>, QuantRS2Error> {
805 let states = self.states.read().unwrap();
806 Ok(states.keys().cloned().collect())
807 }
808
809 fn get_storage_info(&self) -> StorageLayerInfo {
810 self.info.clone()
811 }
812}
813
814#[derive(Debug, Clone)]
816pub enum AccessPattern {
817 Frequent,
818 Moderate,
819 Rare,
820}
821
822#[derive(Debug)]
823pub struct GarbageCollectionResult {
824 pub collected_states: usize,
825 pub freed_space: usize,
826 pub execution_time: Duration,
827}
828
829#[cfg(test)]
830mod tests {
831 use super::*;
832
833 #[tokio::test]
834 async fn test_quantum_memory_creation() {
835 let memory = QuantumMemory::new();
836 assert_eq!(memory.storage_layers.len(), 0);
837 }
838
839 #[tokio::test]
840 async fn test_in_memory_storage() {
841 let storage = InMemoryStorage::new(100);
842
843 let state = QuantumState {
844 state_id: Uuid::new_v4(),
845 amplitudes: vec![Complex64::new(1.0, 0.0), Complex64::new(0.0, 0.0)],
846 qubit_count: 1,
847 creation_time: SystemTime::now(),
848 last_access: SystemTime::now(),
849 coherence_time: Duration::from_millis(100),
850 fidelity: 0.99,
851 metadata: StateMetadata {
852 name: Some("test_state".to_string()),
853 description: None,
854 tags: vec!["test".to_string()],
855 creator: None,
856 access_count: 0,
857 compression_ratio: 1.0,
858 entanglement_entropy: 0.0,
859 },
860 };
861
862 let state_id = state.state_id;
863 storage.store_state(state_id, &state).unwrap();
864
865 let retrieved = storage.retrieve_state(state_id).unwrap();
866 assert!(retrieved.is_some());
867 assert_eq!(retrieved.unwrap().state_id, state_id);
868 }
869
870 #[tokio::test]
871 async fn test_quantum_cache() {
872 let mut cache = QuantumCache::new(2);
873
874 let state1 = QuantumState {
875 state_id: Uuid::new_v4(),
876 amplitudes: vec![Complex64::new(1.0, 0.0)],
877 qubit_count: 1,
878 creation_time: SystemTime::now(),
879 last_access: SystemTime::now(),
880 coherence_time: Duration::from_millis(100),
881 fidelity: 0.99,
882 metadata: StateMetadata {
883 name: None,
884 description: None,
885 tags: Vec::new(),
886 creator: None,
887 access_count: 0,
888 compression_ratio: 1.0,
889 entanglement_entropy: 0.0,
890 },
891 };
892
893 let state2 = QuantumState {
894 state_id: Uuid::new_v4(),
895 ..state1.clone()
896 };
897
898 let state3 = QuantumState {
899 state_id: Uuid::new_v4(),
900 ..state1.clone()
901 };
902
903 cache.insert(state1.state_id, state1.clone());
904 cache.insert(state2.state_id, state2.clone());
905 assert_eq!(cache.cache.len(), 2);
906
907 cache.insert(state3.state_id, state3.clone());
909 assert_eq!(cache.cache.len(), 2);
910 assert!(!cache.cache.contains_key(&state1.state_id));
911 }
912
913 #[tokio::test]
914 async fn test_coherence_manager() {
915 let manager = CoherenceManager::new();
916 let state_id = Uuid::new_v4();
917
918 manager
919 .start_tracking(state_id, Duration::from_millis(100))
920 .await;
921 assert!(manager.is_coherent(state_id).await);
922
923 tokio::time::sleep(Duration::from_millis(150)).await;
925 assert!(!manager.is_coherent(state_id).await);
926 }
927}