use qvm_scheduler::{QvmScheduler, CircuitBuilder, TopologyBuilder};
use std::env;
use std::process;
#[tokio::main]
async fn main() {
let args: Vec<String> = env::args().collect();
if args.len() < 2 {
print_help();
process::exit(0);
}
match args[1].as_str() {
"demo" => run_demo().await,
"schedule" => {
if args.len() < 3 {
eprintln!("Error: Please specify number of circuits to schedule");
process::exit(1);
}
let num_circuits = args[2].parse().unwrap_or(2);
run_schedule(num_circuits).await;
}
"help" | "--help" | "-h" => print_help(),
_ => {
eprintln!("Unknown command: {}", args[1]);
print_help();
process::exit(1);
}
}
}
fn print_help() {
println!("QVM Scheduler - Quantum Virtual Machine CLI");
println!("\nUsage: qvm <command> [options]");
println!("\nCommands:");
println!(" demo Run a demonstration with Bell and GHZ states");
println!(" schedule <n> Schedule n random circuits");
println!(" help Show this help message");
}
async fn run_demo() {
println!("ð QVM Scheduler Demo");
println!("=====================\n");
let topology = TopologyBuilder::grid(5, 5);
println!("â
Created 5x5 grid topology (25 qubits)");
let scheduler = QvmScheduler::new(topology);
println!("â
Initialized QVM scheduler");
let bell = CircuitBuilder::new("bell_state", 2, 2)
.h(0).unwrap()
.cx(0, 1).unwrap()
.measure_all().unwrap()
.build();
println!("â
Created Bell state circuit (2 qubits)");
let ghz = CircuitBuilder::new("ghz_state", 3, 3)
.h(0).unwrap()
.cx(0, 1).unwrap()
.cx(1, 2).unwrap()
.measure_all().unwrap()
.build();
println!("â
Created GHZ state circuit (3 qubits)");
let circuits = vec![bell, ghz];
println!("\nð Scheduling {} circuits...", circuits.len());
match scheduler.schedule(&circuits).await {
Ok(composite) => {
println!("â
Scheduling successful!");
println!("\nSchedule Summary:");
println!(" Total circuits: {}", composite.circuits().len());
println!(" Total duration: {} Ξs", composite.total_duration());
println!(" Total qubits used: {}", composite.total_qubits());
println!(" Total classical bits: {}", composite.total_cbits());
match composite.to_qasm() {
Ok(qasm) => {
println!("\nð Generated OpenQASM 3.0 output:");
println!("------------------------------------");
if qasm.len() > 500 {
println!("{}...\n[Output truncated]", &qasm[..500]);
} else {
println!("{}", qasm);
}
},
Err(e) => eprintln!("â Failed to generate QASM: {}", e),
}
},
Err(e) => eprintln!("â Scheduling failed: {}", e),
}
}
async fn run_schedule(num_circuits: usize) {
println!("ð Scheduling {} random circuits", num_circuits);
let topology = TopologyBuilder::grid(10, 10);
let scheduler = QvmScheduler::new(topology);
let mut circuits = Vec::new();
for i in 0..num_circuits {
let qubits = 2 + (i % 4); let circuit = CircuitBuilder::new(&format!("circuit_{}", i), qubits, qubits)
.h(0).unwrap()
.cx(0, 1 % qubits).unwrap()
.measure_all().unwrap()
.build();
circuits.push(circuit);
}
println!("â
Generated {} circuits", circuits.len());
println!("ð Scheduling...");
let start = std::time::Instant::now();
match scheduler.schedule(&circuits).await {
Ok(composite) => {
let duration = start.elapsed();
println!("\nâ
Scheduling completed in {:.2?}", duration);
println!("\nResults:");
println!(" Circuits scheduled: {}", composite.circuits().len());
println!(" Total duration: {} Ξs", composite.total_duration());
println!(" Qubits used: {}/{}", composite.total_qubits(), 100);
println!(" Utilization: {:.1}%", (composite.total_qubits() as f64 / 100.0) * 100.0);
},
Err(e) => eprintln!("â Scheduling failed: {}", e),
}
}