use quantr::{Circuit, Gate, Measurement, Printer};
use std::error::Error;
#[rustfmt::skip]
fn main() -> Result<(), Box<dyn Error>>{
let mut circuit = Circuit::new(3)?;
circuit.add_repeating_gate(Gate::H, &[0, 1, 2])?;
circuit.add_gate(Gate::CZ(1), 0)?;
circuit
.add_repeating_gate(Gate::H, &[0, 1, 2])?
.add_repeating_gate(Gate::X, &[0, 1, 2])?
.add_gate(Gate::H, 2)?
.add_gate(Gate::Toffoli(0, 1), 2)?
.add_gate(Gate::H, 2)?
.add_repeating_gate(Gate::X, &[0, 1, 2])?
.add_repeating_gate(Gate::H, &[0, 1, 2])?;
let mut printer = Printer::new(&circuit);
printer.print_diagram();
circuit.toggle_simulation_progress();
circuit.simulate();
println!("");
if let Ok(Measurement::Observable(bin_count)) = circuit.repeat_measurement(500) {
println!("[Observable] Bin count of observed states.");
for (state, count) in bin_count {
println!("|{}> observed {} times", state, count);
}
}
if let Ok(Measurement::NonObservable(output_super_position)) = circuit.get_superposition()
{
println!("\n[Non-Observable] The amplitudes of each state in the final superposition.");
for (state, amplitude) in output_super_position.into_iter() {
println!("|{}> : {}", state, amplitude);
}
}
Ok(())
}