use quizx::circuit::*;
use quizx::decompose::BssTOnlyDriver;
use quizx::graph::*;
use std::time::Instant;
use quizx::decompose::Decomposer;
use quizx::vec_graph::Graph;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let qs = 40;
let c = Circuit::random()
.qubits(qs)
.depth(400)
.seed(1337)
.p_t(0.4)
.with_cliffords()
.build();
println!("Circuit:\n{}", c.stats());
let mut g: Graph = c.to_graph();
g.plug_inputs(&vec![BasisElem::Z0; qs]);
g.plug_outputs(&vec![BasisElem::Z0; qs]);
quizx::simplify::full_simp(&mut g);
println!("Decomposing g with (reduced) T-count: {}", g.tcount());
let time = Instant::now();
let mut d = Decomposer::new(&g);
let mut driver = BssTOnlyDriver { random_t: true };
d.with_full_simp();
let mut max = d.max_terms();
let mut best_d = d.clone();
for _ in 0..100 {
let mut d1 = d.clone();
d1.decompose_until_depth(1, &driver);
driver.random_t = false;
d1.decompose_until_depth(3, &driver);
if d1.max_terms() < max {
max = d1.max_terms();
println!("lower max: {}", max);
best_d = d1;
}
}
d = best_d;
d.decompose(&driver);
println!("Finished in {:.2?}", time.elapsed());
println!(
"got {} terms for T-count {} (naive {} terms)",
d.nterms,
g.tcount(),
max
);
Ok(())
}