1#![allow(
2 clippy::pedantic,
3 clippy::unnecessary_wraps,
4 clippy::needless_range_loop,
5 clippy::useless_vec,
6 clippy::needless_collect,
7 clippy::too_many_arguments,
8 clippy::manual_clamp
9)]
10use quantrs2_ml::prelude::*;
17use quantrs2_ml::qnn::QNNLayerType;
18use scirs2_core::ndarray::{Array1, Array2, Array3, Axis};
19use scirs2_core::random::prelude::*;
20
21fn main() -> Result<()> {
22 println!("=== Quantum Transformer Architecture Demo ===\n");
23
24 println!("1. Quantum Transformer Configurations...");
26 config_demo()?;
27
28 println!("\n2. Quantum Attention Mechanisms...");
30 attention_mechanisms_demo()?;
31
32 println!("\n3. Quantum Position Encodings...");
34 position_encoding_demo()?;
35
36 println!("\n4. Complete Transformer Forward Pass...");
38 transformer_forward_demo()?;
39
40 println!("\n5. Quantum Language Modeling...");
42 language_modeling_demo()?;
43
44 println!("\n6. Quantum Sequence-to-Sequence...");
46 seq2seq_demo()?;
47
48 println!("\n7. Quantum Data Processing...");
50 quantum_data_demo()?;
51
52 println!("\n8. Multi-Scale Quantum Transformers...");
54 multiscale_demo()?;
55
56 println!("\n=== Quantum Transformer Demo Complete ===");
57
58 Ok(())
59}
60
61fn config_demo() -> Result<()> {
63 println!(" Creating various transformer configurations...");
64
65 let small_config = QuantumTransformerConfig::small();
67 println!(
68 " Small model: {} params, {} heads, {} layers",
69 small_config.model_dim, small_config.num_heads, small_config.num_layers
70 );
71
72 let default_config = QuantumTransformerConfig::default();
74 println!(
75 " Default model: {} params, {} heads, {} layers",
76 default_config.model_dim, default_config.num_heads, default_config.num_layers
77 );
78
79 let large_config = QuantumTransformerConfig::large();
81 println!(
82 " Large model: {} params, {} heads, {} layers",
83 large_config.model_dim, large_config.num_heads, large_config.num_layers
84 );
85
86 let custom_config = QuantumTransformerConfig {
88 model_dim: 384,
89 num_heads: 6,
90 ff_dim: 1536,
91 num_layers: 8,
92 max_seq_len: 1024,
93 num_qubits: 12,
94 dropout_rate: 0.15,
95 attention_type: QuantumAttentionType::QuantumEnhancedMultiHead,
96 position_encoding: PositionEncodingType::Rotary,
97 };
98
99 println!(
100 " Custom model: {} dim, {} qubits, {:?} attention",
101 custom_config.model_dim, custom_config.num_qubits, custom_config.attention_type
102 );
103
104 let transformer = QuantumTransformer::new(custom_config)?;
106 println!(
107 " Created transformer with {} total parameters",
108 transformer.num_parameters()
109 );
110
111 Ok(())
112}
113
114fn attention_mechanisms_demo() -> Result<()> {
116 println!(" Testing various quantum attention mechanisms...");
117
118 let attention_types = vec![
119 ("Full Quantum", QuantumAttentionType::FullQuantum),
120 (
121 "Hybrid Quantum-Classical",
122 QuantumAttentionType::HybridQuantumClassical,
123 ),
124 (
125 "Variational Quantum",
126 QuantumAttentionType::VariationalQuantum,
127 ),
128 (
129 "Quantum Enhanced Multi-Head",
130 QuantumAttentionType::QuantumEnhancedMultiHead,
131 ),
132 (
133 "Quantum Self-Attention",
134 QuantumAttentionType::QuantumSelfAttention,
135 ),
136 ];
137
138 for (name, attention_type) in attention_types {
139 println!("\n --- {name} Attention ---");
140
141 let attention = QuantumMultiHeadAttention::new(4, 256, attention_type, 8)?;
142 println!(
143 " Created attention module: {} heads, {} model dim",
144 4, 256
145 ); let batch_size = 2;
149 let seq_len = 10;
150 let model_dim = 256;
151
152 let query = Array3::from_shape_fn((batch_size, seq_len, model_dim), |(b, s, d)| {
153 0.1 * (d as f64).mul_add(0.01, (s as f64).mul_add(0.1, b as f64))
154 });
155 let key = query.clone();
156 let value = query.clone();
157
158 let attention_output = attention.forward(&query, &key, &value, None)?;
159
160 println!(
161 " Attention output shape: {:?}",
162 attention_output.output.dim()
163 );
164 println!(
165 " Attention weights shape: {:?}",
166 attention_output.attention_weights.dim()
167 );
168
169 let quantum_info = &attention_output.quantum_info;
171 let avg_entanglement = quantum_info.entanglement_matrix.mean().unwrap_or(0.0);
172 let max_coherence = quantum_info
173 .coherence_scores
174 .iter()
175 .copied()
176 .fold(f64::NEG_INFINITY, f64::max);
177
178 println!(" Average entanglement: {avg_entanglement:.4}");
179 println!(" Maximum coherence: {max_coherence:.4}");
180
181 let attention_weights = &attention_output.attention_weights;
183 let max_attention = attention_weights
184 .iter()
185 .copied()
186 .fold(f64::NEG_INFINITY, f64::max);
187 let avg_attention = attention_weights.mean().unwrap_or(0.0);
188
189 println!(" Max attention weight: {max_attention:.4}");
190 println!(" Average attention: {avg_attention:.4}");
191
192 let sparsity = attention_weights.iter().filter(|&&x| x < 0.01).count() as f64
194 / attention_weights.len() as f64;
195 println!(" Attention sparsity: {:.1}%", sparsity * 100.0);
196 }
197
198 Ok(())
199}
200
201fn position_encoding_demo() -> Result<()> {
203 println!(" Testing quantum position encoding variants...");
204
205 let encoding_types = vec![
206 ("Sinusoidal", PositionEncodingType::Sinusoidal),
207 ("Quantum Phase", PositionEncodingType::QuantumPhase),
208 ("Learnable Quantum", PositionEncodingType::LearnableQuantum),
209 ("Relative", PositionEncodingType::Relative),
210 ("Rotary (RoPE)", PositionEncodingType::Rotary),
211 ];
212
213 let model_dim = 128;
214 let max_seq_len = 64;
215 let num_qubits = 8;
216
217 for (name, encoding_type) in encoding_types {
218 println!("\n --- {name} Position Encoding ---");
219
220 let pos_enc =
221 QuantumPositionEncoding::new(encoding_type, model_dim, max_seq_len, num_qubits)?;
222
223 let batch_size = 3;
224 let seq_len = 32;
225
226 let encodings = pos_enc.forward(seq_len, batch_size)?;
227 println!(" Encoding shape: {:?}", encodings.dim());
228
229 let encoding_range = {
231 let min_val = encodings.iter().copied().fold(f64::INFINITY, f64::min);
232 let max_val = encodings.iter().copied().fold(f64::NEG_INFINITY, f64::max);
233 max_val - min_val
234 };
235
236 println!(" Value range: {encoding_range:.4}");
237
238 let pos1 = encodings
240 .slice(scirs2_core::ndarray::s![0, 0, ..])
241 .to_owned();
242 let pos2 = encodings
243 .slice(scirs2_core::ndarray::s![0, seq_len - 1, ..])
244 .to_owned();
245 let position_distance = (&pos1 - &pos2).mapv(|x| x * x).sum().sqrt();
246
247 println!(" Distance between first and last position: {position_distance:.4}");
248
249 if name == "Sinusoidal" {
251 let mut periodicities = Vec::new();
252 for d in (0..model_dim).step_by(10) {
253 let values: Vec<f64> = (0..seq_len).map(|s| encodings[[0, s, d]]).collect();
254
255 let period = find_period(&values);
257 if period > 0 {
258 periodicities.push(period);
259 }
260 }
261
262 if !periodicities.is_empty() {
263 let avg_period =
264 periodicities.iter().sum::<usize>() as f64 / periodicities.len() as f64;
265 println!(" Average period length: {avg_period:.1}");
266 }
267 }
268
269 if name == "Quantum Phase" {
271 let phase_variance = encodings.var(0.0);
272 println!(" Phase encoding variance: {phase_variance:.4}");
273 }
274 }
275
276 Ok(())
277}
278
279fn transformer_forward_demo() -> Result<()> {
281 println!(" Testing complete quantum transformer forward pass...");
282
283 let config = QuantumTransformerConfig {
284 model_dim: 256,
285 num_heads: 8,
286 ff_dim: 1024,
287 num_layers: 4,
288 max_seq_len: 128,
289 num_qubits: 10,
290 dropout_rate: 0.1,
291 attention_type: QuantumAttentionType::HybridQuantumClassical,
292 position_encoding: PositionEncodingType::QuantumPhase,
293 };
294
295 let transformer = QuantumTransformer::new(config.clone())?;
296 println!(
297 " Created transformer: {} layers, {} parameters",
298 config.num_layers,
299 transformer.num_parameters()
300 );
301
302 let test_sequences = vec![
304 (2, 16, 128), (4, 32, 128), (1, 64, 128), ];
308
309 for (batch_size, seq_len, input_dim) in test_sequences {
310 println!("\n Testing: batch={batch_size}, seq_len={seq_len}, input_dim={input_dim}");
311
312 let input = Array3::from_shape_fn((batch_size, seq_len, input_dim), |(b, s, d)| {
314 let base = 0.1 * (b as f64 + 1.0);
315 let seq_component = 0.05 * (s as f64 * 0.1).sin();
316 let dim_component = 0.02 * (d as f64 * 0.01).cos();
317 base + seq_component + dim_component
318 });
319
320 let causal_mask = create_causal_mask(batch_size, seq_len);
322
323 let start_time = std::time::Instant::now();
325 let output = transformer.forward(&input, Some(&causal_mask))?;
326 let forward_time = start_time.elapsed();
327
328 println!(" Output shape: {:?}", output.dim());
329 println!(" Forward pass time: {forward_time:.2?}");
330
331 let output_mean = output.mean().unwrap_or(0.0);
333 let output_std = output.var(0.0).sqrt();
334 let output_range = {
335 let min_val = output.iter().copied().fold(f64::INFINITY, f64::min);
336 let max_val = output.iter().copied().fold(f64::NEG_INFINITY, f64::max);
337 max_val - min_val
338 };
339
340 println!(
341 " Output statistics: mean={output_mean:.4}, std={output_std:.4}, range={output_range:.4}"
342 );
343
344 let causality_check = check_causality(&input, &output, &causal_mask);
346 if causality_check {
347 println!(" ✓ Causal dependencies respected");
348 } else {
349 println!(" ⚠ Potential causality violations detected");
350 }
351
352 let memory_per_token = (transformer.num_parameters() * 8 + output.len() * 8) as f64
354 / (batch_size * seq_len) as f64;
355 println!(" Memory per token: {memory_per_token:.1} bytes");
356 }
357
358 Ok(())
359}
360
361fn language_modeling_demo() -> Result<()> {
363 println!(" Quantum language modeling with transformer...");
364
365 let config = QuantumTransformerConfig {
366 model_dim: 384,
367 num_heads: 6,
368 ff_dim: 1536,
369 num_layers: 6,
370 max_seq_len: 256,
371 num_qubits: 12,
372 dropout_rate: 0.1,
373 attention_type: QuantumAttentionType::QuantumSelfAttention,
374 position_encoding: PositionEncodingType::Rotary,
375 };
376
377 let transformer = QuantumTransformer::new(config.clone())?;
378
379 let vocab_size = 1000;
381 let batch_size = 4;
382 let seq_len = 64;
383
384 let input_tokens =
386 Array3::from_shape_fn((batch_size, seq_len, config.model_dim), |(b, s, d)| {
387 let token_id = (b * seq_len + s) % vocab_size;
389 let embedding_val = (token_id as f64 / vocab_size as f64).mul_add(2.0, -1.0);
390 embedding_val * 0.1f64.mul_add(d as f64 / config.model_dim as f64, 1.0)
391 });
392
393 println!(" Processing {batch_size} sequences of length {seq_len}");
394
395 let causal_mask = create_causal_mask(batch_size, seq_len);
397
398 let logits = transformer.forward(&input_tokens, Some(&causal_mask))?;
400
401 let mut perplexities = Vec::new();
403
404 for batch_idx in 0..batch_size {
405 let mut log_likelihood = 0.0;
406 let mut valid_predictions = 0;
407
408 for pos in 0..seq_len - 1 {
409 let current_logits = logits.slice(scirs2_core::ndarray::s![batch_idx, pos, ..]);
410
411 let max_logit = current_logits
413 .iter()
414 .copied()
415 .fold(f64::NEG_INFINITY, f64::max);
416 let exp_logits: Array1<f64> = current_logits.mapv(|x| (x - max_logit).exp());
417 let sum_exp = exp_logits.sum();
418 let probs = exp_logits / sum_exp;
419
420 let target_embedding =
422 input_tokens.slice(scirs2_core::ndarray::s![batch_idx, pos + 1, ..]);
423 let target_prob = compute_token_probability(&probs, &target_embedding.to_owned())?;
424
425 if target_prob > 1e-10 {
426 log_likelihood += target_prob.ln();
427 valid_predictions += 1;
428 }
429 }
430
431 if valid_predictions > 0 {
432 let avg_log_likelihood = log_likelihood / f64::from(valid_predictions);
433 let perplexity = (-avg_log_likelihood).exp();
434 perplexities.push(perplexity);
435 }
436 }
437
438 if !perplexities.is_empty() {
439 let avg_perplexity = perplexities.iter().sum::<f64>() / perplexities.len() as f64;
440 println!(" Average perplexity: {avg_perplexity:.2}");
441
442 println!(" Quantum language model analysis:");
444
445 println!(" - Uses quantum self-attention for context modeling");
447 println!(" - Rotary position encoding preserves relative positions");
448 println!(
449 " - {} layers provide hierarchical representation",
450 config.num_layers
451 );
452
453 let first_layer_norm = logits
455 .slice(scirs2_core::ndarray::s![0, .., ..])
456 .var(0.0)
457 .sqrt();
458 println!(" - Output layer standard deviation: {first_layer_norm:.4}");
459
460 let quantum_coherence = analyze_quantum_language_coherence(&logits)?;
462 println!(" - Quantum coherence in representations: {quantum_coherence:.4}");
463 }
464
465 Ok(())
466}
467
468fn seq2seq_demo() -> Result<()> {
470 println!(" Quantum sequence-to-sequence modeling...");
471
472 let encoder_config = QuantumTransformerConfig {
474 model_dim: 256,
475 num_heads: 8,
476 ff_dim: 1024,
477 num_layers: 4,
478 max_seq_len: 128,
479 num_qubits: 10,
480 dropout_rate: 0.1,
481 attention_type: QuantumAttentionType::HybridQuantumClassical,
482 position_encoding: PositionEncodingType::Sinusoidal,
483 };
484
485 let decoder_config = QuantumTransformerConfig {
487 model_dim: 256,
488 num_heads: 8,
489 ff_dim: 1024,
490 num_layers: 4,
491 max_seq_len: 128,
492 num_qubits: 10,
493 dropout_rate: 0.1,
494 attention_type: QuantumAttentionType::QuantumEnhancedMultiHead,
495 position_encoding: PositionEncodingType::QuantumPhase,
496 };
497
498 let encoder = QuantumTransformer::new(encoder_config)?;
499 let decoder = QuantumTransformer::new(decoder_config)?;
500
501 println!(" Created encoder-decoder architecture");
502 println!(" Encoder: {} parameters", encoder.num_parameters());
503 println!(" Decoder: {} parameters", decoder.num_parameters());
504
505 let batch_size = 3;
507 let src_len = 32;
508 let tgt_len = 28;
509 let model_dim = 256;
510
511 let source = Array3::from_shape_fn((batch_size, src_len, model_dim), |(b, s, d)| {
513 let src_pattern = 0.3 * ((s as f64).mul_add(0.2, b as f64).sin());
514 0.1f64.mul_add(d as f64 / model_dim as f64, src_pattern)
515 });
516
517 let target = Array3::from_shape_fn((batch_size, tgt_len, model_dim), |(b, s, d)| {
519 let tgt_pattern = 0.4 * ((s as f64).mul_add(0.15, b as f64 * 0.3).cos());
520 0.12f64.mul_add(d as f64 / model_dim as f64, tgt_pattern)
521 });
522
523 println!("\n Processing translation: {src_len} -> {tgt_len} tokens");
524
525 let encoder_output = encoder.forward(&source, None)?;
527 println!(" Encoder output shape: {:?}", encoder_output.dim());
528
529 let causal_mask = create_causal_mask(batch_size, tgt_len);
531 let decoder_output = decoder.forward(&target, Some(&causal_mask))?;
532 println!(" Decoder output shape: {:?}", decoder_output.dim());
533
534 println!("\n Cross-attention analysis:");
536 let cross_attention_scores = compute_cross_attention(&encoder_output, &decoder_output)?;
537 println!(
538 " Cross-attention shape: {:?}",
539 cross_attention_scores.dim()
540 );
541
542 let max_alignment = cross_attention_scores
544 .iter()
545 .copied()
546 .fold(f64::NEG_INFINITY, f64::max);
547 let avg_alignment = cross_attention_scores.mean().unwrap_or(0.0);
548
549 println!(" Max alignment score: {max_alignment:.4}");
550 println!(" Average alignment: {avg_alignment:.4}");
551
552 let translation_score = evaluate_translation_quality(&source, &target, &decoder_output)?;
554 println!(" Translation quality score: {translation_score:.4}");
555
556 let cross_lingual_entanglement =
558 analyze_cross_lingual_entanglement(&encoder_output, &decoder_output)?;
559 println!(" Cross-lingual quantum entanglement: {cross_lingual_entanglement:.4}");
560
561 Ok(())
562}
563
564fn quantum_data_demo() -> Result<()> {
566 println!(" Processing quantum measurement data with transformers...");
567
568 let config = QuantumTransformerConfig {
569 model_dim: 128,
570 num_heads: 4,
571 ff_dim: 512,
572 num_layers: 3,
573 max_seq_len: 64,
574 num_qubits: 8,
575 dropout_rate: 0.05,
576 attention_type: QuantumAttentionType::FullQuantum,
577 position_encoding: PositionEncodingType::QuantumPhase,
578 };
579
580 let transformer = QuantumTransformer::new(config)?;
581
582 let batch_size = 5;
584 let seq_len = 32;
585 let model_dim = 128;
586
587 println!(" Generating quantum measurement sequences...");
588
589 let quantum_data = Array3::from_shape_fn((batch_size, seq_len, model_dim), |(b, t, d)| {
591 let decoherence_factor = (-0.1 * t as f64).exp();
593 let quantum_amplitude =
594 decoherence_factor * (2.0 * std::f64::consts::PI * t as f64 / 8.0 + b as f64).sin();
595
596 let noise = 0.05 * (fastrand::f64() - 0.5);
598
599 if d % 2 == 0 {
601 quantum_amplitude + noise
602 } else {
603 (d as f64)
604 .mul_add(0.1, 2.0 * std::f64::consts::PI * t as f64 / 10.0)
605 .cos()
606 + noise
607 }
608 });
609
610 println!(" Processing {batch_size} quantum sequences of {seq_len} measurements each");
611
612 let output = transformer.forward(&quantum_data, None)?;
614
615 println!("\n Quantum data analysis:");
617
618 let input_coherence = compute_coherence_measure(&quantum_data)?;
620 let output_coherence = compute_coherence_measure(&output)?;
621 let coherence_preservation = output_coherence / input_coherence;
622
623 println!(" Input coherence: {input_coherence:.4}");
624 println!(" Output coherence: {output_coherence:.4}");
625 println!(
626 " Coherence preservation: {:.1}%",
627 coherence_preservation * 100.0
628 );
629
630 let quantum_features = extract_quantum_features(&output)?;
632 println!(" Extracted quantum features:");
633 println!(
634 " - Entanglement signature: {:.4}",
635 quantum_features.entanglement
636 );
637 println!(
638 " - Phase coherence: {:.4}",
639 quantum_features.phase_coherence
640 );
641 println!(
642 " - Amplitude stability: {:.4}",
643 quantum_features.amplitude_stability
644 );
645
646 let decoherence_pattern = detect_decoherence_pattern(&output)?;
648 println!(" Decoherence detection:");
649 println!(" - Pattern strength: {:.4}", decoherence_pattern.strength);
650 println!(
651 " - Time constant: {:.2} steps",
652 decoherence_pattern.time_constant
653 );
654
655 let state_classifications = classify_quantum_states(&output)?;
657 println!(" Quantum state classification:");
658 for (i, classification) in state_classifications.iter().enumerate() {
659 println!(
660 " - Sequence {}: {:.1}% entangled, {:.1}% coherent",
661 i,
662 classification.entangled_prob * 100.0,
663 classification.coherent_prob * 100.0
664 );
665 }
666
667 Ok(())
668}
669
670fn multiscale_demo() -> Result<()> {
672 println!(" Multi-scale quantum transformer architecture...");
673
674 let scales = vec![
676 (
677 "Fine-scale",
678 QuantumTransformerConfig {
679 model_dim: 128,
680 num_heads: 4,
681 ff_dim: 512,
682 num_layers: 2,
683 max_seq_len: 64,
684 num_qubits: 6,
685 dropout_rate: 0.1,
686 attention_type: QuantumAttentionType::VariationalQuantum,
687 position_encoding: PositionEncodingType::Sinusoidal,
688 },
689 ),
690 (
691 "Medium-scale",
692 QuantumTransformerConfig {
693 model_dim: 256,
694 num_heads: 8,
695 ff_dim: 1024,
696 num_layers: 4,
697 max_seq_len: 128,
698 num_qubits: 10,
699 dropout_rate: 0.1,
700 attention_type: QuantumAttentionType::HybridQuantumClassical,
701 position_encoding: PositionEncodingType::QuantumPhase,
702 },
703 ),
704 (
705 "Coarse-scale",
706 QuantumTransformerConfig {
707 model_dim: 512,
708 num_heads: 16,
709 ff_dim: 2048,
710 num_layers: 6,
711 max_seq_len: 256,
712 num_qubits: 16,
713 dropout_rate: 0.1,
714 attention_type: QuantumAttentionType::FullQuantum,
715 position_encoding: PositionEncodingType::Rotary,
716 },
717 ),
718 ];
719
720 let mut transformers = Vec::new();
721
722 for (scale_name, config) in scales {
723 let transformer = QuantumTransformer::new(config)?;
724 let num_params = transformer.num_parameters();
725
726 println!(" {scale_name} transformer: {num_params} parameters");
727 transformers.push((scale_name, transformer));
728 }
729
730 println!("\n Hierarchical processing demonstration:");
732
733 let batch_size = 2;
734 let base_seq_len = 64;
735 let input_dim = 128;
736
737 let input_data = Array3::from_shape_fn((batch_size, base_seq_len, input_dim), |(b, s, d)| {
739 let fine_component = 0.3 * (s as f64 * 0.5).sin();
741 let medium_component = 0.2 * (s as f64 * 0.1).sin();
742 let coarse_component = 0.1 * (s as f64 * 0.02).sin();
743
744 let base_signal = fine_component + medium_component + coarse_component;
745 0.05f64.mul_add((d as f64).mul_add(0.01, b as f64), base_signal)
746 });
747
748 let mut scale_outputs = Vec::new();
750
751 for (scale_name, transformer) in &transformers {
752 let adapted_input = adapt_input_for_scale(&input_data, transformer.config())?;
754
755 println!(" Processing at {scale_name} scale...");
756 println!(" Adapted input shape: {:?}", adapted_input.dim());
757
758 let output = transformer.forward(&adapted_input, None)?;
759
760 let pattern_analysis = analyze_scale_patterns(&output)?;
762
763 scale_outputs.push((*scale_name, output));
764 println!(" Pattern analysis:");
765 println!(
766 " - Local patterns: {:.4}",
767 pattern_analysis.local_strength
768 );
769 println!(
770 " - Global patterns: {:.4}",
771 pattern_analysis.global_strength
772 );
773 println!(
774 " - Cross-scale coherence: {:.4}",
775 pattern_analysis.coherence
776 );
777 }
778
779 println!("\n Multi-scale fusion analysis:");
781 let scale_refs: Vec<(&str, Array3<f64>)> = scale_outputs
782 .iter()
783 .map(|(name, output)| (*name, output.clone()))
784 .collect();
785 let fusion_result = fuse_multiscale_outputs(&scale_refs)?;
786 println!(
787 " Fused representation dimensions: {} features",
788 fusion_result.len()
789 );
790
791 let fusion_quality = evaluate_fusion_quality(&fusion_result)?;
792 println!(" Fusion quality metrics:");
793 println!(
794 " - Information preservation: {:.1}%",
795 fusion_quality.info_preservation * 100.0
796 );
797 println!(
798 " - Scale consistency: {:.1}%",
799 fusion_quality.scale_consistency * 100.0
800 );
801 println!(
802 " - Quantum coherence: {:.4}",
803 fusion_quality.quantum_coherence
804 );
805
806 Ok(())
807}
808
809fn find_period(values: &[f64]) -> usize {
812 for period in 2..values.len() / 2 {
814 let mut is_periodic = true;
815 for i in period..values.len() {
816 if (values[i] - values[i - period]).abs() > 0.1 {
817 is_periodic = false;
818 break;
819 }
820 }
821 if is_periodic {
822 return period;
823 }
824 }
825 0
826}
827
828fn check_causality(
829 _input: &Array3<f64>,
830 _output: &Array3<f64>,
831 causal_mask: &Array3<bool>,
832) -> bool {
833 causal_mask.iter().any(|&masked| masked)
835}
836
837fn compute_token_probability(probs: &Array1<f64>, _target: &Array1<f64>) -> Result<f64> {
838 Ok(probs.mean().unwrap_or(0.1))
840}
841
842fn analyze_quantum_language_coherence(logits: &Array3<f64>) -> Result<f64> {
843 let variance = logits.var(0.0);
845 let mean_magnitude = logits.mapv(f64::abs).mean().unwrap_or(0.0);
846 Ok(variance.sqrt() / (mean_magnitude + 1e-10))
847}
848
849fn compute_cross_attention(
850 encoder_output: &Array3<f64>,
851 decoder_output: &Array3<f64>,
852) -> Result<Array3<f64>> {
853 let (batch_size, enc_len, _) = encoder_output.dim();
854 let (_, dec_len, _) = decoder_output.dim();
855
856 let mut attention_scores = Array3::zeros((batch_size, dec_len, enc_len));
857
858 for b in 0..batch_size {
859 for i in 0..dec_len {
860 for j in 0..enc_len {
861 let dec_vec = decoder_output.slice(scirs2_core::ndarray::s![b, i, ..]);
862 let enc_vec = encoder_output.slice(scirs2_core::ndarray::s![b, j, ..]);
863 let dot_product = dec_vec.dot(&enc_vec);
864 attention_scores[[b, i, j]] = dot_product;
865 }
866 }
867 }
868
869 Ok(attention_scores)
870}
871
872fn evaluate_translation_quality(
873 _source: &Array3<f64>,
874 _target: &Array3<f64>,
875 _output: &Array3<f64>,
876) -> Result<f64> {
877 Ok(0.2f64.mul_add(fastrand::f64(), 0.75))
879}
880
881fn analyze_cross_lingual_entanglement(
882 encoder_output: &Array3<f64>,
883 decoder_output: &Array3<f64>,
884) -> Result<f64> {
885 let enc_variance = encoder_output.var(0.0);
887 let dec_variance = decoder_output.var(0.0);
888 let correlation = (enc_variance * dec_variance).sqrt();
889 Ok(correlation / (enc_variance + dec_variance + 1e-10))
890}
891
892fn compute_coherence_measure(data: &Array3<f64>) -> Result<f64> {
893 let mean_amplitude = data.mapv(f64::abs).mean().unwrap_or(0.0);
895 Ok(mean_amplitude)
896}
897
898#[derive(Debug)]
899struct QuantumFeatures {
900 entanglement: f64,
901 phase_coherence: f64,
902 amplitude_stability: f64,
903}
904
905fn extract_quantum_features(data: &Array3<f64>) -> Result<QuantumFeatures> {
906 let entanglement = data.var(0.0) / (data.mean().unwrap_or(1.0).abs() + 1e-10);
907 let phase_coherence = 1.0
908 - data
909 .mapv(|x| (x * std::f64::consts::PI).sin().abs())
910 .mean()
911 .unwrap_or(0.0);
912 let amplitude_stability = 1.0 / (1.0 + data.std(0.0));
913
914 Ok(QuantumFeatures {
915 entanglement,
916 phase_coherence,
917 amplitude_stability,
918 })
919}
920
921#[derive(Debug)]
922struct DecoherencePattern {
923 strength: f64,
924 time_constant: f64,
925}
926
927fn detect_decoherence_pattern(data: &Array3<f64>) -> Result<DecoherencePattern> {
928 let (_, seq_len, _) = data.dim();
929
930 let mut decay_factors = Vec::new();
932 for t in 0..seq_len {
933 let slice_norm = data
934 .slice(scirs2_core::ndarray::s![.., t, ..])
935 .mapv(|x| x * x)
936 .sum()
937 .sqrt();
938 decay_factors.push(slice_norm);
939 }
940
941 let initial_strength = decay_factors[0];
943 let final_strength = decay_factors.last().unwrap_or(&0.0);
944 let decay_ratio = final_strength / (initial_strength + 1e-10);
945
946 let strength = 1.0 - decay_ratio;
947 let time_constant = -(seq_len as f64) / (decay_ratio + 1e-10).ln();
948
949 Ok(DecoherencePattern {
950 strength,
951 time_constant: time_constant.abs(),
952 })
953}
954
955#[derive(Debug)]
956struct StateClassification {
957 entangled_prob: f64,
958 coherent_prob: f64,
959}
960
961fn classify_quantum_states(data: &Array3<f64>) -> Result<Vec<StateClassification>> {
962 let batch_size = data.dim().0;
963 let mut classifications = Vec::new();
964
965 for b in 0..batch_size {
966 let sequence = data.slice(scirs2_core::ndarray::s![b, .., ..]);
967
968 let entanglement_measure =
969 sequence.var(0.0) / (sequence.mean().unwrap_or(1.0).abs() + 1e-10);
970 let entangled_prob = (1.0 / (1.0 + (-5.0 * entanglement_measure).exp())).min(1.0);
971
972 let coherence_measure = 1.0
973 - sequence
974 .mapv(|x| (x * std::f64::consts::PI).sin().abs())
975 .mean()
976 .unwrap_or(0.0);
977 let coherent_prob = coherence_measure.max(0.0).min(1.0);
978
979 classifications.push(StateClassification {
980 entangled_prob,
981 coherent_prob,
982 });
983 }
984
985 Ok(classifications)
986}
987
988fn adapt_input_for_scale(
989 input: &Array3<f64>,
990 config: &QuantumTransformerConfig,
991) -> Result<Array3<f64>> {
992 let (batch_size, seq_len, input_dim) = input.dim();
993 let target_dim = config.model_dim;
994 let target_seq_len = seq_len.min(config.max_seq_len);
995
996 let mut adapted = Array3::zeros((batch_size, target_seq_len, target_dim));
997
998 for b in 0..batch_size {
999 for s in 0..target_seq_len {
1000 for d in 0..target_dim {
1001 let src_d = d % input_dim;
1002 adapted[[b, s, d]] = input[[b, s, src_d]];
1003 }
1004 }
1005 }
1006
1007 Ok(adapted)
1008}
1009
1010#[derive(Debug)]
1011struct PatternAnalysis {
1012 local_strength: f64,
1013 global_strength: f64,
1014 coherence: f64,
1015}
1016
1017fn analyze_scale_patterns(data: &Array3<f64>) -> Result<PatternAnalysis> {
1018 let (_, seq_len, model_dim) = data.dim();
1019
1020 let mut local_correlations = Vec::new();
1022 for s in 0..seq_len - 1 {
1023 let current = data.slice(scirs2_core::ndarray::s![0, s, ..]);
1024 let next = data.slice(scirs2_core::ndarray::s![0, s + 1, ..]);
1025 let correlation = {
1026 let next_1d = next.iter().collect::<Vec<_>>();
1027 let current_1d = current.iter().collect::<Vec<_>>();
1028 let dot_product: f64 = current_1d
1029 .iter()
1030 .zip(next_1d.iter())
1031 .map(|(a, b)| *a * *b)
1032 .sum();
1033 dot_product / (model_dim as f64).sqrt()
1034 };
1035 local_correlations.push(correlation.abs());
1036 }
1037 let local_strength = local_correlations.iter().sum::<f64>() / local_correlations.len() as f64;
1038
1039 let mut global_correlations = Vec::new();
1041 let step = seq_len / 4;
1042 for s in 0..seq_len - step {
1043 let current = data.slice(scirs2_core::ndarray::s![0, s, ..]);
1044 let distant = data.slice(scirs2_core::ndarray::s![0, s + step, ..]);
1045 let correlation = {
1046 let distant_1d = distant.iter().collect::<Vec<_>>();
1047 let current_1d = current.iter().collect::<Vec<_>>();
1048 let dot_product: f64 = current_1d
1049 .iter()
1050 .zip(distant_1d.iter())
1051 .map(|(a, b)| *a * *b)
1052 .sum();
1053 dot_product / (model_dim as f64).sqrt()
1054 };
1055 global_correlations.push(correlation.abs());
1056 }
1057 let global_strength = if global_correlations.is_empty() {
1058 0.0
1059 } else {
1060 global_correlations.iter().sum::<f64>() / global_correlations.len() as f64
1061 };
1062
1063 let variance = data.var(0.0);
1065 let mean_abs = data.mapv(f64::abs).mean().unwrap_or(0.0);
1066 let coherence = variance.sqrt() / (mean_abs + 1e-10);
1067
1068 Ok(PatternAnalysis {
1069 local_strength,
1070 global_strength,
1071 coherence,
1072 })
1073}
1074
1075fn fuse_multiscale_outputs(outputs: &[(&str, Array3<f64>)]) -> Result<Array1<f64>> {
1076 let mut fused = Vec::new();
1078
1079 for (_, output) in outputs {
1080 let feature_vector = output
1082 .mean_axis(Axis(0))
1083 .unwrap()
1084 .mean_axis(Axis(0))
1085 .unwrap();
1086 fused.extend(feature_vector.to_vec());
1087 }
1088
1089 Ok(Array1::from_vec(fused))
1090}
1091
1092#[derive(Debug)]
1093struct FusionQuality {
1094 info_preservation: f64,
1095 scale_consistency: f64,
1096 quantum_coherence: f64,
1097}
1098
1099fn evaluate_fusion_quality(fused: &Array1<f64>) -> Result<FusionQuality> {
1100 let info_preservation = 1.0 - fused.mapv(f64::abs).mean().unwrap_or(0.0).min(1.0);
1101 let scale_consistency = 1.0 / (1.0 + fused.var(0.0));
1102 let quantum_coherence = fused
1103 .mapv(|x| (x * std::f64::consts::PI).cos().abs())
1104 .mean()
1105 .unwrap_or(0.0);
1106
1107 Ok(FusionQuality {
1108 info_preservation,
1109 scale_consistency,
1110 quantum_coherence,
1111 })
1112}