use std::f64::consts::PI;
use qnect::builder::BackendType;
use qnect::network::network::{BlindComputationPattern, LinkType, QuantumNetwork};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut network = QuantumNetwork::new_distributed();
network.add_distributed_node("ClientA", 8, BackendType::StateVector)?;
network.add_distributed_node("Router1", 12, BackendType::StateVector)?;
network.add_distributed_node("Router2", 12, BackendType::StateVector)?;
network.add_distributed_node("ServerB", 16, BackendType::StateVector)?;
network.add_quantum_link(
"ClientA",
"Router1",
LinkType::Fiber {
length_km: 50.0,
loss_db_per_km: 0.2,
},
0.95,
1000.0,
)?;
network.add_quantum_link(
"Router1",
"Router2",
LinkType::Fiber {
length_km: 100.0,
loss_db_per_km: 0.2,
},
0.90,
800.0,
)?;
network.add_quantum_link(
"Router2",
"ServerB",
LinkType::Fiber {
length_km: 50.0,
loss_db_per_km: 0.2,
},
0.95,
1000.0,
)?;
println!("{}", network.visualize_network());
let (q1, q2) = network.create_epr_pair("ClientA", "Router1")?;
println!(
"Created EPR pair between ClientA (q{}) and Router1 (q{})",
q1, q2
);
let (end1, end2) = network
.establish_end_to_end_entanglement("ClientA", "ServerB")
.await?;
println!(
"Established end-to-end entanglement: ClientA (q{}) <-> ServerB (q{})",
end1, end2
);
let ghz_qubits = network
.create_distributed_ghz(vec!["ClientA", "Router1", "ServerB"])
.await?;
println!(
"Created distributed GHZ state across network: {:?}",
ghz_qubits
);
let pattern = BlindComputationPattern {
computation_graph: vec![(0, 1)],
measurement_angles: vec![PI / 4.0, PI / 3.0],
flow: vec![0, 1], };
let results = network
.blind_computation_ubqc("ClientA", "ServerB", pattern)
.await?;
println!("Blind computation results: {:?}", results);
let programs = network.generate_netqasm();
for (node, program) in programs {
println!("\n=== NetQASM for {} ===\n{}", node, program);
}
Ok(())
}