use strange_loop::{
quantum_container::{QuantumContainer, HybridOperation, Gate, TwoQubitGate, PauliOperator},
error::Result,
};
use num_complex::Complex64;
fn main() -> Result<()> {
println!("⚛️ Quantum-Classical Hybrid Computing Example");
println!("==============================================");
let mut quantum = QuantumContainer::new(3);
println!("Created quantum container with 3 qubits");
println!("State space size: {} states", 1 << 3);
println!();
initialize_quantum_state(&mut quantum)?;
demonstrate_quantum_gates(&mut quantum)?;
demonstrate_hybrid_operations(&mut quantum)?;
demonstrate_entanglement(&mut quantum)?;
demonstrate_quantum_measurements(&mut quantum)?;
demonstrate_quantum_feedback(&mut quantum)?;
Ok(())
}
fn initialize_quantum_state(quantum: &mut QuantumContainer) -> Result<()> {
println!("🔧 Quantum State Initialization");
println!("-------------------------------");
println!("Initial state: |000⟩");
for i in 0..8 {
let prob = quantum.get_probability(i);
if prob > 1e-10 {
println!(" |{:03b}⟩: {:.6}", i, prob);
}
}
println!();
println!("Creating custom superposition...");
let probabilities = vec![
0.4, 0.0, 0.2, 0.0, 0.1, 0.0, 0.3, 0.0, ];
quantum.create_superposition_from_classical(&probabilities)?;
println!("After superposition creation:");
for i in 0..8 {
let prob = quantum.get_probability(i);
if prob > 1e-10 {
println!(" |{:03b}⟩: {:.6}", i, prob);
}
}
println!();
Ok(())
}
fn demonstrate_quantum_gates(quantum: &mut QuantumContainer) -> Result<()> {
println!("🚪 Quantum Gate Operations");
println!("--------------------------");
println!("Applying Hadamard gate to qubit 0...");
quantum.apply_gate(0, Gate::H)?;
println!("State after H(0):");
for i in 0..8 {
let prob = quantum.get_probability(i);
if prob > 1e-10 {
println!(" |{:03b}⟩: {:.6}", i, prob);
}
}
println!();
println!("Applying Pauli-X gate to qubit 1...");
quantum.apply_gate(1, Gate::X)?;
println!("State after X(1):");
for i in 0..8 {
let prob = quantum.get_probability(i);
if prob > 1e-10 {
println!(" |{:03b}⟩: {:.6}", i, prob);
}
}
println!();
println!("Applying RZ(π/4) gate to qubit 2...");
quantum.apply_gate(2, Gate::RZ(std::f64::consts::PI / 4.0))?;
println!("State after RZ(2):");
for i in 0..8 {
let prob = quantum.get_probability(i);
if prob > 1e-10 {
println!(" |{:03b}⟩: {:.6}", i, prob);
}
}
println!();
Ok(())
}
fn demonstrate_hybrid_operations(quantum: &mut QuantumContainer) -> Result<()> {
println!("🔄 Quantum-Classical Hybrid Operations");
println!("--------------------------------------");
quantum.store_classical("temperature".to_string(), 298.15); quantum.store_classical("magnetic_field".to_string(), 0.5); quantum.store_classical("control_voltage".to_string(), 3.3);
println!("Stored classical data:");
println!(" Temperature: {:.2} K", quantum.get_classical("temperature").unwrap());
println!(" Magnetic field: {:.1} T", quantum.get_classical("magnetic_field").unwrap());
println!(" Control voltage: {:.1} V", quantum.get_classical("control_voltage").unwrap());
println!();
println!("Using temperature to control quantum rotation...");
let result = quantum.hybrid_operation(HybridOperation::ClassicalToQuantum {
source_key: "temperature".to_string(),
qubit: 0,
gate_type: "RZ".to_string(),
})?;
println!("Applied rotation angle: {:.6} radians", result);
println!();
println!("Measuring qubit 1 and storing result...");
let measurement = quantum.hybrid_operation(HybridOperation::QuantumToClassical {
qubit: 1,
target_key: "measurement_result".to_string(),
})?;
println!("Measurement result: {} (stored as 'measurement_result')", measurement);
println!("Retrieved value: {}", quantum.get_classical("measurement_result").unwrap());
println!();
Ok(())
}
fn demonstrate_entanglement(quantum: &mut QuantumContainer) -> Result<()> {
println!("🔗 Quantum Entanglement");
println!("-----------------------");
println!("Creating Bell state |Φ+⟩ = (|00⟩ + |11⟩)/√2...");
*quantum = QuantumContainer::new(2);
quantum.apply_gate(0, Gate::H)?;
println!("After H(0): equal superposition on qubit 0");
quantum.apply_two_qubit_gate(0, 1, TwoQubitGate::CNOT)?;
println!("After CNOT(0,1): Bell state created");
println!();
println!("Bell state probabilities:");
for i in 0..4 {
let prob = quantum.get_probability(i);
if prob > 1e-10 {
println!(" |{:02b}⟩: {:.6}", i, prob);
}
}
println!();
let entanglement = quantum.hybrid_operation(HybridOperation::EntanglementCheck {
qubit_a: 0,
qubit_b: 1,
})?;
println!("Entanglement entropy: {:.6}", entanglement);
println!("(Higher values indicate more entanglement)");
println!();
println!("Measuring qubit 0...");
let quantum_state = quantum.quantum_state_mut();
let result = quantum_state.measure_qubit(0)?;
println!("Qubit 0 measured as: {}", result);
println!("State after measurement:");
for i in 0..4 {
let prob = quantum.get_probability(i);
if prob > 1e-10 {
println!(" |{:02b}⟩: {:.6}", i, prob);
}
}
println!("Notice: Qubit 1 is now correlated with qubit 0!");
println!();
Ok(())
}
fn demonstrate_quantum_measurements(quantum: &mut QuantumContainer) -> Result<()> {
println!("📏 Quantum Measurements");
println!("-----------------------");
*quantum = QuantumContainer::new(2);
quantum.apply_gate(0, Gate::H)?;
quantum.apply_gate(1, Gate::H)?;
println!("Created 2-qubit superposition state:");
for i in 0..4 {
let prob = quantum.get_probability(i);
println!(" |{:02b}⟩: {:.6}", i, prob);
}
println!();
println!("Performing 20 measurements:");
let mut measurement_counts = std::collections::HashMap::new();
for i in 0..20 {
*quantum = QuantumContainer::new(2);
quantum.apply_gate(0, Gate::H)?;
quantum.apply_gate(1, Gate::H)?;
let result = quantum.measure();
*measurement_counts.entry(result).or_insert(0) += 1;
print!("{:02b} ", result);
if (i + 1) % 10 == 0 {
println!();
}
}
if 20 % 10 != 0 {
println!();
}
println!();
println!("Measurement statistics:");
for state in 0..4 {
let count = measurement_counts.get(&state).unwrap_or(&0);
let percentage = (*count as f64 / 20.0) * 100.0;
println!(" |{:02b}⟩: {} times ({:.1}%)", state, count, percentage);
}
println!("(Expected: ~25% each for uniform superposition)");
println!();
Ok(())
}
fn demonstrate_quantum_feedback(quantum: &mut QuantumContainer) -> Result<()> {
println!("🔄 Quantum Feedback Loops");
println!("-------------------------");
*quantum = QuantumContainer::new(2);
println!("Implementing adaptive quantum control:");
println!("1. Quantum measurement → Classical parameter");
println!("2. Classical parameter → Quantum gate angle");
println!("3. Repeat with feedback");
println!();
let mut adaptation_history = Vec::new();
let target_expectation = 0.5;
for iteration in 0..10 {
quantum.apply_gate(0, Gate::H)?;
let z_expectation = quantum.quantum_state().expectation_pauli(0, PauliOperator::Z)?;
let error = target_expectation - z_expectation;
let adaptation_rate = 0.1;
let rotation_angle = adaptation_rate * error;
quantum.store_classical("feedback_angle".to_string(), rotation_angle);
if rotation_angle.abs() > 1e-6 {
quantum.apply_gate(0, Gate::RZ(rotation_angle))?;
}
adaptation_history.push((z_expectation, error, rotation_angle));
println!("Iteration {}: <Z>={:.4}, error={:.4}, rotation={:.4}",
iteration, z_expectation, error, rotation_angle);
*quantum = QuantumContainer::new(2);
}
println!();
println!("Feedback analysis:");
let initial_error = adaptation_history[0].1.abs();
let final_error = adaptation_history.last().unwrap().1.abs();
let improvement = ((initial_error - final_error) / initial_error) * 100.0;
println!(" Initial error: {:.6}", initial_error);
println!(" Final error: {:.6}", final_error);
println!(" Improvement: {:.1}%", improvement);
println!();
quantum.store_classical("final_z_expectation".to_string(),
adaptation_history.last().unwrap().0);
let correlation = quantum.quantum_classical_correlation(0, "final_z_expectation")?;
println!("Quantum-classical correlation: {:.6}", correlation);
println!("(Measure of how quantum and classical states influence each other)");
Ok(())
}
#[allow(dead_code)]
fn quantum_algorithm_example() -> Result<()> {
println!("\n🧮 Quantum Algorithm Example");
println!("============================");
let mut quantum = QuantumContainer::new(3);
println!("Implementing quantum random walk:");
println!("1. Initialize walker at center position");
println!("2. Apply coin flip (Hadamard) operations");
println!("3. Apply conditional shift operations");
println!("4. Measure final position");
quantum.apply_gate(0, Gate::H)?;
for step in 0..5 {
quantum.apply_gate(0, Gate::H)?;
println!(" Step {}: Applied coin flip and position shift", step);
}
let final_state = quantum.measure();
println!("Final state: |{:03b}⟩", final_state);
Ok(())
}