#![allow(
clippy::pedantic,
clippy::unnecessary_wraps,
clippy::needless_range_loop,
clippy::useless_vec,
clippy::needless_collect,
clippy::too_many_arguments,
clippy::manual_clamp
)]
use quantrs2_ml::prelude::*;
use quantrs2_ml::qnn::QNNLayerType;
use scirs2_core::ndarray::{Array1, Array2, Array3, Axis};
use scirs2_core::random::prelude::*;
fn main() -> Result<()> {
println!("=== Quantum Transformer Architecture Demo ===\n");
println!("1. Quantum Transformer Configurations...");
config_demo()?;
println!("\n2. Quantum Attention Mechanisms...");
attention_mechanisms_demo()?;
println!("\n3. Quantum Position Encodings...");
position_encoding_demo()?;
println!("\n4. Complete Transformer Forward Pass...");
transformer_forward_demo()?;
println!("\n5. Quantum Language Modeling...");
language_modeling_demo()?;
println!("\n6. Quantum Sequence-to-Sequence...");
seq2seq_demo()?;
println!("\n7. Quantum Data Processing...");
quantum_data_demo()?;
println!("\n8. Multi-Scale Quantum Transformers...");
multiscale_demo()?;
println!("\n=== Quantum Transformer Demo Complete ===");
Ok(())
}
fn config_demo() -> Result<()> {
println!(" Creating various transformer configurations...");
let small_config = QuantumTransformerConfig::small();
println!(
" Small model: {} params, {} heads, {} layers",
small_config.model_dim, small_config.num_heads, small_config.num_layers
);
let default_config = QuantumTransformerConfig::default();
println!(
" Default model: {} params, {} heads, {} layers",
default_config.model_dim, default_config.num_heads, default_config.num_layers
);
let large_config = QuantumTransformerConfig::large();
println!(
" Large model: {} params, {} heads, {} layers",
large_config.model_dim, large_config.num_heads, large_config.num_layers
);
let custom_config = QuantumTransformerConfig {
model_dim: 384,
num_heads: 6,
ff_dim: 1536,
num_layers: 8,
max_seq_len: 1024,
num_qubits: 12,
dropout_rate: 0.15,
attention_type: QuantumAttentionType::QuantumEnhancedMultiHead,
position_encoding: PositionEncodingType::Rotary,
};
println!(
" Custom model: {} dim, {} qubits, {:?} attention",
custom_config.model_dim, custom_config.num_qubits, custom_config.attention_type
);
let transformer = QuantumTransformer::new(custom_config)?;
println!(
" Created transformer with {} total parameters",
transformer.num_parameters()
);
Ok(())
}
fn attention_mechanisms_demo() -> Result<()> {
println!(" Testing various quantum attention mechanisms...");
let attention_types = vec![
("Full Quantum", QuantumAttentionType::FullQuantum),
(
"Hybrid Quantum-Classical",
QuantumAttentionType::HybridQuantumClassical,
),
(
"Variational Quantum",
QuantumAttentionType::VariationalQuantum,
),
(
"Quantum Enhanced Multi-Head",
QuantumAttentionType::QuantumEnhancedMultiHead,
),
(
"Quantum Self-Attention",
QuantumAttentionType::QuantumSelfAttention,
),
];
for (name, attention_type) in attention_types {
println!("\n --- {name} Attention ---");
let attention = QuantumMultiHeadAttention::new(4, 256, attention_type, 8)?;
println!(
" Created attention module: {} heads, {} model dim",
4, 256
);
let batch_size = 2;
let seq_len = 10;
let model_dim = 256;
let query = Array3::from_shape_fn((batch_size, seq_len, model_dim), |(b, s, d)| {
0.1 * (d as f64).mul_add(0.01, (s as f64).mul_add(0.1, b as f64))
});
let key = query.clone();
let value = query.clone();
let attention_output = attention.forward(&query, &key, &value, None)?;
println!(
" Attention output shape: {:?}",
attention_output.output.dim()
);
println!(
" Attention weights shape: {:?}",
attention_output.attention_weights.dim()
);
let quantum_info = &attention_output.quantum_info;
let avg_entanglement = quantum_info.entanglement_matrix.mean().unwrap_or(0.0);
let max_coherence = quantum_info
.coherence_scores
.iter()
.copied()
.fold(f64::NEG_INFINITY, f64::max);
println!(" Average entanglement: {avg_entanglement:.4}");
println!(" Maximum coherence: {max_coherence:.4}");
let attention_weights = &attention_output.attention_weights;
let max_attention = attention_weights
.iter()
.copied()
.fold(f64::NEG_INFINITY, f64::max);
let avg_attention = attention_weights.mean().unwrap_or(0.0);
println!(" Max attention weight: {max_attention:.4}");
println!(" Average attention: {avg_attention:.4}");
let sparsity = attention_weights.iter().filter(|&&x| x < 0.01).count() as f64
/ attention_weights.len() as f64;
println!(" Attention sparsity: {:.1}%", sparsity * 100.0);
}
Ok(())
}
fn position_encoding_demo() -> Result<()> {
println!(" Testing quantum position encoding variants...");
let encoding_types = vec![
("Sinusoidal", PositionEncodingType::Sinusoidal),
("Quantum Phase", PositionEncodingType::QuantumPhase),
("Learnable Quantum", PositionEncodingType::LearnableQuantum),
("Relative", PositionEncodingType::Relative),
("Rotary (RoPE)", PositionEncodingType::Rotary),
];
let model_dim = 128;
let max_seq_len = 64;
let num_qubits = 8;
for (name, encoding_type) in encoding_types {
println!("\n --- {name} Position Encoding ---");
let pos_enc =
QuantumPositionEncoding::new(encoding_type, model_dim, max_seq_len, num_qubits)?;
let batch_size = 3;
let seq_len = 32;
let encodings = pos_enc.forward(seq_len, batch_size)?;
println!(" Encoding shape: {:?}", encodings.dim());
let encoding_range = {
let min_val = encodings.iter().copied().fold(f64::INFINITY, f64::min);
let max_val = encodings.iter().copied().fold(f64::NEG_INFINITY, f64::max);
max_val - min_val
};
println!(" Value range: {encoding_range:.4}");
let pos1 = encodings
.slice(scirs2_core::ndarray::s![0, 0, ..])
.to_owned();
let pos2 = encodings
.slice(scirs2_core::ndarray::s![0, seq_len - 1, ..])
.to_owned();
let position_distance = (&pos1 - &pos2).mapv(|x| x * x).sum().sqrt();
println!(" Distance between first and last position: {position_distance:.4}");
if name == "Sinusoidal" {
let mut periodicities = Vec::new();
for d in (0..model_dim).step_by(10) {
let values: Vec<f64> = (0..seq_len).map(|s| encodings[[0, s, d]]).collect();
let period = find_period(&values);
if period > 0 {
periodicities.push(period);
}
}
if !periodicities.is_empty() {
let avg_period =
periodicities.iter().sum::<usize>() as f64 / periodicities.len() as f64;
println!(" Average period length: {avg_period:.1}");
}
}
if name == "Quantum Phase" {
let phase_variance = encodings.var(0.0);
println!(" Phase encoding variance: {phase_variance:.4}");
}
}
Ok(())
}
fn transformer_forward_demo() -> Result<()> {
println!(" Testing complete quantum transformer forward pass...");
let config = QuantumTransformerConfig {
model_dim: 256,
num_heads: 8,
ff_dim: 1024,
num_layers: 4,
max_seq_len: 128,
num_qubits: 10,
dropout_rate: 0.1,
attention_type: QuantumAttentionType::HybridQuantumClassical,
position_encoding: PositionEncodingType::QuantumPhase,
};
let transformer = QuantumTransformer::new(config.clone())?;
println!(
" Created transformer: {} layers, {} parameters",
config.num_layers,
transformer.num_parameters()
);
let test_sequences = vec![
(2, 16, 128), (4, 32, 128), (1, 64, 128), ];
for (batch_size, seq_len, input_dim) in test_sequences {
println!("\n Testing: batch={batch_size}, seq_len={seq_len}, input_dim={input_dim}");
let input = Array3::from_shape_fn((batch_size, seq_len, input_dim), |(b, s, d)| {
let base = 0.1 * (b as f64 + 1.0);
let seq_component = 0.05 * (s as f64 * 0.1).sin();
let dim_component = 0.02 * (d as f64 * 0.01).cos();
base + seq_component + dim_component
});
let causal_mask = create_causal_mask(batch_size, seq_len);
let start_time = std::time::Instant::now();
let output = transformer.forward(&input, Some(&causal_mask))?;
let forward_time = start_time.elapsed();
println!(" Output shape: {:?}", output.dim());
println!(" Forward pass time: {forward_time:.2?}");
let output_mean = output.mean().unwrap_or(0.0);
let output_std = output.var(0.0).sqrt();
let output_range = {
let min_val = output.iter().copied().fold(f64::INFINITY, f64::min);
let max_val = output.iter().copied().fold(f64::NEG_INFINITY, f64::max);
max_val - min_val
};
println!(
" Output statistics: mean={output_mean:.4}, std={output_std:.4}, range={output_range:.4}"
);
let causality_check = check_causality(&input, &output, &causal_mask);
if causality_check {
println!(" ✓ Causal dependencies respected");
} else {
println!(" âš Potential causality violations detected");
}
let memory_per_token = (transformer.num_parameters() * 8 + output.len() * 8) as f64
/ (batch_size * seq_len) as f64;
println!(" Memory per token: {memory_per_token:.1} bytes");
}
Ok(())
}
fn language_modeling_demo() -> Result<()> {
println!(" Quantum language modeling with transformer...");
let config = QuantumTransformerConfig {
model_dim: 384,
num_heads: 6,
ff_dim: 1536,
num_layers: 6,
max_seq_len: 256,
num_qubits: 12,
dropout_rate: 0.1,
attention_type: QuantumAttentionType::QuantumSelfAttention,
position_encoding: PositionEncodingType::Rotary,
};
let transformer = QuantumTransformer::new(config.clone())?;
let vocab_size = 1000;
let batch_size = 4;
let seq_len = 64;
let input_tokens =
Array3::from_shape_fn((batch_size, seq_len, config.model_dim), |(b, s, d)| {
let token_id = (b * seq_len + s) % vocab_size;
let embedding_val = (token_id as f64 / vocab_size as f64).mul_add(2.0, -1.0);
embedding_val * 0.1f64.mul_add(d as f64 / config.model_dim as f64, 1.0)
});
println!(" Processing {batch_size} sequences of length {seq_len}");
let causal_mask = create_causal_mask(batch_size, seq_len);
let logits = transformer.forward(&input_tokens, Some(&causal_mask))?;
let mut perplexities = Vec::new();
for batch_idx in 0..batch_size {
let mut log_likelihood = 0.0;
let mut valid_predictions = 0;
for pos in 0..seq_len - 1 {
let current_logits = logits.slice(scirs2_core::ndarray::s![batch_idx, pos, ..]);
let max_logit = current_logits
.iter()
.copied()
.fold(f64::NEG_INFINITY, f64::max);
let exp_logits: Array1<f64> = current_logits.mapv(|x| (x - max_logit).exp());
let sum_exp = exp_logits.sum();
let probs = exp_logits / sum_exp;
let target_embedding =
input_tokens.slice(scirs2_core::ndarray::s![batch_idx, pos + 1, ..]);
let target_prob = compute_token_probability(&probs, &target_embedding.to_owned())?;
if target_prob > 1e-10 {
log_likelihood += target_prob.ln();
valid_predictions += 1;
}
}
if valid_predictions > 0 {
let avg_log_likelihood = log_likelihood / f64::from(valid_predictions);
let perplexity = (-avg_log_likelihood).exp();
perplexities.push(perplexity);
}
}
if !perplexities.is_empty() {
let avg_perplexity = perplexities.iter().sum::<f64>() / perplexities.len() as f64;
println!(" Average perplexity: {avg_perplexity:.2}");
println!(" Quantum language model analysis:");
println!(" - Uses quantum self-attention for context modeling");
println!(" - Rotary position encoding preserves relative positions");
println!(
" - {} layers provide hierarchical representation",
config.num_layers
);
let first_layer_norm = logits
.slice(scirs2_core::ndarray::s![0, .., ..])
.var(0.0)
.sqrt();
println!(" - Output layer standard deviation: {first_layer_norm:.4}");
let quantum_coherence = analyze_quantum_language_coherence(&logits)?;
println!(" - Quantum coherence in representations: {quantum_coherence:.4}");
}
Ok(())
}
fn seq2seq_demo() -> Result<()> {
println!(" Quantum sequence-to-sequence modeling...");
let encoder_config = QuantumTransformerConfig {
model_dim: 256,
num_heads: 8,
ff_dim: 1024,
num_layers: 4,
max_seq_len: 128,
num_qubits: 10,
dropout_rate: 0.1,
attention_type: QuantumAttentionType::HybridQuantumClassical,
position_encoding: PositionEncodingType::Sinusoidal,
};
let decoder_config = QuantumTransformerConfig {
model_dim: 256,
num_heads: 8,
ff_dim: 1024,
num_layers: 4,
max_seq_len: 128,
num_qubits: 10,
dropout_rate: 0.1,
attention_type: QuantumAttentionType::QuantumEnhancedMultiHead,
position_encoding: PositionEncodingType::QuantumPhase,
};
let encoder = QuantumTransformer::new(encoder_config)?;
let decoder = QuantumTransformer::new(decoder_config)?;
println!(" Created encoder-decoder architecture");
println!(" Encoder: {} parameters", encoder.num_parameters());
println!(" Decoder: {} parameters", decoder.num_parameters());
let batch_size = 3;
let src_len = 32;
let tgt_len = 28;
let model_dim = 256;
let source = Array3::from_shape_fn((batch_size, src_len, model_dim), |(b, s, d)| {
let src_pattern = 0.3 * ((s as f64).mul_add(0.2, b as f64).sin());
0.1f64.mul_add(d as f64 / model_dim as f64, src_pattern)
});
let target = Array3::from_shape_fn((batch_size, tgt_len, model_dim), |(b, s, d)| {
let tgt_pattern = 0.4 * ((s as f64).mul_add(0.15, b as f64 * 0.3).cos());
0.12f64.mul_add(d as f64 / model_dim as f64, tgt_pattern)
});
println!("\n Processing translation: {src_len} -> {tgt_len} tokens");
let encoder_output = encoder.forward(&source, None)?;
println!(" Encoder output shape: {:?}", encoder_output.dim());
let causal_mask = create_causal_mask(batch_size, tgt_len);
let decoder_output = decoder.forward(&target, Some(&causal_mask))?;
println!(" Decoder output shape: {:?}", decoder_output.dim());
println!("\n Cross-attention analysis:");
let cross_attention_scores = compute_cross_attention(&encoder_output, &decoder_output)?;
println!(
" Cross-attention shape: {:?}",
cross_attention_scores.dim()
);
let max_alignment = cross_attention_scores
.iter()
.copied()
.fold(f64::NEG_INFINITY, f64::max);
let avg_alignment = cross_attention_scores.mean().unwrap_or(0.0);
println!(" Max alignment score: {max_alignment:.4}");
println!(" Average alignment: {avg_alignment:.4}");
let translation_score = evaluate_translation_quality(&source, &target, &decoder_output)?;
println!(" Translation quality score: {translation_score:.4}");
let cross_lingual_entanglement =
analyze_cross_lingual_entanglement(&encoder_output, &decoder_output)?;
println!(" Cross-lingual quantum entanglement: {cross_lingual_entanglement:.4}");
Ok(())
}
fn quantum_data_demo() -> Result<()> {
println!(" Processing quantum measurement data with transformers...");
let config = QuantumTransformerConfig {
model_dim: 128,
num_heads: 4,
ff_dim: 512,
num_layers: 3,
max_seq_len: 64,
num_qubits: 8,
dropout_rate: 0.05,
attention_type: QuantumAttentionType::FullQuantum,
position_encoding: PositionEncodingType::QuantumPhase,
};
let transformer = QuantumTransformer::new(config)?;
let batch_size = 5;
let seq_len = 32;
let model_dim = 128;
println!(" Generating quantum measurement sequences...");
let quantum_data = Array3::from_shape_fn((batch_size, seq_len, model_dim), |(b, t, d)| {
let decoherence_factor = (-0.1 * t as f64).exp();
let quantum_amplitude =
decoherence_factor * (2.0 * std::f64::consts::PI * t as f64 / 8.0 + b as f64).sin();
let noise = 0.05 * (fastrand::f64() - 0.5);
if d % 2 == 0 {
quantum_amplitude + noise
} else {
(d as f64)
.mul_add(0.1, 2.0 * std::f64::consts::PI * t as f64 / 10.0)
.cos()
+ noise
}
});
println!(" Processing {batch_size} quantum sequences of {seq_len} measurements each");
let output = transformer.forward(&quantum_data, None)?;
println!("\n Quantum data analysis:");
let input_coherence = compute_coherence_measure(&quantum_data)?;
let output_coherence = compute_coherence_measure(&output)?;
let coherence_preservation = output_coherence / input_coherence;
println!(" Input coherence: {input_coherence:.4}");
println!(" Output coherence: {output_coherence:.4}");
println!(
" Coherence preservation: {:.1}%",
coherence_preservation * 100.0
);
let quantum_features = extract_quantum_features(&output)?;
println!(" Extracted quantum features:");
println!(
" - Entanglement signature: {:.4}",
quantum_features.entanglement
);
println!(
" - Phase coherence: {:.4}",
quantum_features.phase_coherence
);
println!(
" - Amplitude stability: {:.4}",
quantum_features.amplitude_stability
);
let decoherence_pattern = detect_decoherence_pattern(&output)?;
println!(" Decoherence detection:");
println!(" - Pattern strength: {:.4}", decoherence_pattern.strength);
println!(
" - Time constant: {:.2} steps",
decoherence_pattern.time_constant
);
let state_classifications = classify_quantum_states(&output)?;
println!(" Quantum state classification:");
for (i, classification) in state_classifications.iter().enumerate() {
println!(
" - Sequence {}: {:.1}% entangled, {:.1}% coherent",
i,
classification.entangled_prob * 100.0,
classification.coherent_prob * 100.0
);
}
Ok(())
}
fn multiscale_demo() -> Result<()> {
println!(" Multi-scale quantum transformer architecture...");
let scales = vec![
(
"Fine-scale",
QuantumTransformerConfig {
model_dim: 128,
num_heads: 4,
ff_dim: 512,
num_layers: 2,
max_seq_len: 64,
num_qubits: 6,
dropout_rate: 0.1,
attention_type: QuantumAttentionType::VariationalQuantum,
position_encoding: PositionEncodingType::Sinusoidal,
},
),
(
"Medium-scale",
QuantumTransformerConfig {
model_dim: 256,
num_heads: 8,
ff_dim: 1024,
num_layers: 4,
max_seq_len: 128,
num_qubits: 10,
dropout_rate: 0.1,
attention_type: QuantumAttentionType::HybridQuantumClassical,
position_encoding: PositionEncodingType::QuantumPhase,
},
),
(
"Coarse-scale",
QuantumTransformerConfig {
model_dim: 512,
num_heads: 16,
ff_dim: 2048,
num_layers: 6,
max_seq_len: 256,
num_qubits: 16,
dropout_rate: 0.1,
attention_type: QuantumAttentionType::FullQuantum,
position_encoding: PositionEncodingType::Rotary,
},
),
];
let mut transformers = Vec::new();
for (scale_name, config) in scales {
let transformer = QuantumTransformer::new(config)?;
let num_params = transformer.num_parameters();
println!(" {scale_name} transformer: {num_params} parameters");
transformers.push((scale_name, transformer));
}
println!("\n Hierarchical processing demonstration:");
let batch_size = 2;
let base_seq_len = 64;
let input_dim = 128;
let input_data = Array3::from_shape_fn((batch_size, base_seq_len, input_dim), |(b, s, d)| {
let fine_component = 0.3 * (s as f64 * 0.5).sin();
let medium_component = 0.2 * (s as f64 * 0.1).sin();
let coarse_component = 0.1 * (s as f64 * 0.02).sin();
let base_signal = fine_component + medium_component + coarse_component;
0.05f64.mul_add((d as f64).mul_add(0.01, b as f64), base_signal)
});
let mut scale_outputs = Vec::new();
for (scale_name, transformer) in &transformers {
let adapted_input = adapt_input_for_scale(&input_data, transformer.config())?;
println!(" Processing at {scale_name} scale...");
println!(" Adapted input shape: {:?}", adapted_input.dim());
let output = transformer.forward(&adapted_input, None)?;
let pattern_analysis = analyze_scale_patterns(&output)?;
scale_outputs.push((*scale_name, output));
println!(" Pattern analysis:");
println!(
" - Local patterns: {:.4}",
pattern_analysis.local_strength
);
println!(
" - Global patterns: {:.4}",
pattern_analysis.global_strength
);
println!(
" - Cross-scale coherence: {:.4}",
pattern_analysis.coherence
);
}
println!("\n Multi-scale fusion analysis:");
let scale_refs: Vec<(&str, Array3<f64>)> = scale_outputs
.iter()
.map(|(name, output)| (*name, output.clone()))
.collect();
let fusion_result = fuse_multiscale_outputs(&scale_refs)?;
println!(
" Fused representation dimensions: {} features",
fusion_result.len()
);
let fusion_quality = evaluate_fusion_quality(&fusion_result)?;
println!(" Fusion quality metrics:");
println!(
" - Information preservation: {:.1}%",
fusion_quality.info_preservation * 100.0
);
println!(
" - Scale consistency: {:.1}%",
fusion_quality.scale_consistency * 100.0
);
println!(
" - Quantum coherence: {:.4}",
fusion_quality.quantum_coherence
);
Ok(())
}
fn find_period(values: &[f64]) -> usize {
for period in 2..values.len() / 2 {
let mut is_periodic = true;
for i in period..values.len() {
if (values[i] - values[i - period]).abs() > 0.1 {
is_periodic = false;
break;
}
}
if is_periodic {
return period;
}
}
0
}
fn check_causality(
_input: &Array3<f64>,
_output: &Array3<f64>,
causal_mask: &Array3<bool>,
) -> bool {
causal_mask.iter().any(|&masked| masked)
}
fn compute_token_probability(probs: &Array1<f64>, _target: &Array1<f64>) -> Result<f64> {
Ok(probs.mean().unwrap_or(0.1))
}
fn analyze_quantum_language_coherence(logits: &Array3<f64>) -> Result<f64> {
let variance = logits.var(0.0);
let mean_magnitude = logits.mapv(f64::abs).mean().unwrap_or(0.0);
Ok(variance.sqrt() / (mean_magnitude + 1e-10))
}
fn compute_cross_attention(
encoder_output: &Array3<f64>,
decoder_output: &Array3<f64>,
) -> Result<Array3<f64>> {
let (batch_size, enc_len, _) = encoder_output.dim();
let (_, dec_len, _) = decoder_output.dim();
let mut attention_scores = Array3::zeros((batch_size, dec_len, enc_len));
for b in 0..batch_size {
for i in 0..dec_len {
for j in 0..enc_len {
let dec_vec = decoder_output.slice(scirs2_core::ndarray::s![b, i, ..]);
let enc_vec = encoder_output.slice(scirs2_core::ndarray::s![b, j, ..]);
let dot_product = dec_vec.dot(&enc_vec);
attention_scores[[b, i, j]] = dot_product;
}
}
}
Ok(attention_scores)
}
fn evaluate_translation_quality(
_source: &Array3<f64>,
_target: &Array3<f64>,
_output: &Array3<f64>,
) -> Result<f64> {
Ok(0.2f64.mul_add(fastrand::f64(), 0.75))
}
fn analyze_cross_lingual_entanglement(
encoder_output: &Array3<f64>,
decoder_output: &Array3<f64>,
) -> Result<f64> {
let enc_variance = encoder_output.var(0.0);
let dec_variance = decoder_output.var(0.0);
let correlation = (enc_variance * dec_variance).sqrt();
Ok(correlation / (enc_variance + dec_variance + 1e-10))
}
fn compute_coherence_measure(data: &Array3<f64>) -> Result<f64> {
let mean_amplitude = data.mapv(f64::abs).mean().unwrap_or(0.0);
Ok(mean_amplitude)
}
#[derive(Debug)]
struct QuantumFeatures {
entanglement: f64,
phase_coherence: f64,
amplitude_stability: f64,
}
fn extract_quantum_features(data: &Array3<f64>) -> Result<QuantumFeatures> {
let entanglement = data.var(0.0) / (data.mean().unwrap_or(1.0).abs() + 1e-10);
let phase_coherence = 1.0
- data
.mapv(|x| (x * std::f64::consts::PI).sin().abs())
.mean()
.unwrap_or(0.0);
let amplitude_stability = 1.0 / (1.0 + data.std(0.0));
Ok(QuantumFeatures {
entanglement,
phase_coherence,
amplitude_stability,
})
}
#[derive(Debug)]
struct DecoherencePattern {
strength: f64,
time_constant: f64,
}
fn detect_decoherence_pattern(data: &Array3<f64>) -> Result<DecoherencePattern> {
let (_, seq_len, _) = data.dim();
let mut decay_factors = Vec::new();
for t in 0..seq_len {
let slice_norm = data
.slice(scirs2_core::ndarray::s![.., t, ..])
.mapv(|x| x * x)
.sum()
.sqrt();
decay_factors.push(slice_norm);
}
let initial_strength = decay_factors[0];
let final_strength = decay_factors.last().unwrap_or(&0.0);
let decay_ratio = final_strength / (initial_strength + 1e-10);
let strength = 1.0 - decay_ratio;
let time_constant = -(seq_len as f64) / (decay_ratio + 1e-10).ln();
Ok(DecoherencePattern {
strength,
time_constant: time_constant.abs(),
})
}
#[derive(Debug)]
struct StateClassification {
entangled_prob: f64,
coherent_prob: f64,
}
fn classify_quantum_states(data: &Array3<f64>) -> Result<Vec<StateClassification>> {
let batch_size = data.dim().0;
let mut classifications = Vec::new();
for b in 0..batch_size {
let sequence = data.slice(scirs2_core::ndarray::s![b, .., ..]);
let entanglement_measure =
sequence.var(0.0) / (sequence.mean().unwrap_or(1.0).abs() + 1e-10);
let entangled_prob = (1.0 / (1.0 + (-5.0 * entanglement_measure).exp())).min(1.0);
let coherence_measure = 1.0
- sequence
.mapv(|x| (x * std::f64::consts::PI).sin().abs())
.mean()
.unwrap_or(0.0);
let coherent_prob = coherence_measure.max(0.0).min(1.0);
classifications.push(StateClassification {
entangled_prob,
coherent_prob,
});
}
Ok(classifications)
}
fn adapt_input_for_scale(
input: &Array3<f64>,
config: &QuantumTransformerConfig,
) -> Result<Array3<f64>> {
let (batch_size, seq_len, input_dim) = input.dim();
let target_dim = config.model_dim;
let target_seq_len = seq_len.min(config.max_seq_len);
let mut adapted = Array3::zeros((batch_size, target_seq_len, target_dim));
for b in 0..batch_size {
for s in 0..target_seq_len {
for d in 0..target_dim {
let src_d = d % input_dim;
adapted[[b, s, d]] = input[[b, s, src_d]];
}
}
}
Ok(adapted)
}
#[derive(Debug)]
struct PatternAnalysis {
local_strength: f64,
global_strength: f64,
coherence: f64,
}
fn analyze_scale_patterns(data: &Array3<f64>) -> Result<PatternAnalysis> {
let (_, seq_len, model_dim) = data.dim();
let mut local_correlations = Vec::new();
for s in 0..seq_len - 1 {
let current = data.slice(scirs2_core::ndarray::s![0, s, ..]);
let next = data.slice(scirs2_core::ndarray::s![0, s + 1, ..]);
let correlation = {
let next_1d = next.iter().collect::<Vec<_>>();
let current_1d = current.iter().collect::<Vec<_>>();
let dot_product: f64 = current_1d
.iter()
.zip(next_1d.iter())
.map(|(a, b)| *a * *b)
.sum();
dot_product / (model_dim as f64).sqrt()
};
local_correlations.push(correlation.abs());
}
let local_strength = local_correlations.iter().sum::<f64>() / local_correlations.len() as f64;
let mut global_correlations = Vec::new();
let step = seq_len / 4;
for s in 0..seq_len - step {
let current = data.slice(scirs2_core::ndarray::s![0, s, ..]);
let distant = data.slice(scirs2_core::ndarray::s![0, s + step, ..]);
let correlation = {
let distant_1d = distant.iter().collect::<Vec<_>>();
let current_1d = current.iter().collect::<Vec<_>>();
let dot_product: f64 = current_1d
.iter()
.zip(distant_1d.iter())
.map(|(a, b)| *a * *b)
.sum();
dot_product / (model_dim as f64).sqrt()
};
global_correlations.push(correlation.abs());
}
let global_strength = if global_correlations.is_empty() {
0.0
} else {
global_correlations.iter().sum::<f64>() / global_correlations.len() as f64
};
let variance = data.var(0.0);
let mean_abs = data.mapv(f64::abs).mean().unwrap_or(0.0);
let coherence = variance.sqrt() / (mean_abs + 1e-10);
Ok(PatternAnalysis {
local_strength,
global_strength,
coherence,
})
}
fn fuse_multiscale_outputs(outputs: &[(&str, Array3<f64>)]) -> Result<Array1<f64>> {
let mut fused = Vec::new();
for (_, output) in outputs {
let feature_vector = output
.mean_axis(Axis(0))
.unwrap()
.mean_axis(Axis(0))
.unwrap();
fused.extend(feature_vector.to_vec());
}
Ok(Array1::from_vec(fused))
}
#[derive(Debug)]
struct FusionQuality {
info_preservation: f64,
scale_consistency: f64,
quantum_coherence: f64,
}
fn evaluate_fusion_quality(fused: &Array1<f64>) -> Result<FusionQuality> {
let info_preservation = 1.0 - fused.mapv(f64::abs).mean().unwrap_or(0.0).min(1.0);
let scale_consistency = 1.0 / (1.0 + fused.var(0.0));
let quantum_coherence = fused
.mapv(|x| (x * std::f64::consts::PI).cos().abs())
.mean()
.unwrap_or(0.0);
Ok(FusionQuality {
info_preservation,
scale_consistency,
quantum_coherence,
})
}