diff --git a/test_files/guppy_optimization/angles/angles.flat.hugr b/test_files/guppy_optimization/angles/angles.flat.hugr index e7207da5e..ce74274a8 100644 Binary files a/test_files/guppy_optimization/angles/angles.flat.hugr and b/test_files/guppy_optimization/angles/angles.flat.hugr differ diff --git a/test_files/guppy_optimization/angles/angles.flat.py b/test_files/guppy_optimization/angles/angles.flat.py index 33c0daf66..701cfbc72 100644 --- a/test_files/guppy_optimization/angles/angles.flat.py +++ b/test_files/guppy_optimization/angles/angles.flat.py @@ -1,7 +1,7 @@ # /// script # requires-python = ">=3.13" # dependencies = [ -# "guppylang >=0.21.3", +# "guppylang >=0.21.6", # ] # /// diff --git a/test_files/guppy_optimization/angles/angles.hugr b/test_files/guppy_optimization/angles/angles.hugr index dde9b4652..2a143ab61 100644 Binary files a/test_files/guppy_optimization/angles/angles.hugr and b/test_files/guppy_optimization/angles/angles.hugr differ diff --git a/test_files/guppy_optimization/angles/angles.opt.hugr b/test_files/guppy_optimization/angles/angles.opt.hugr index 7b6a1f144..cd925f38d 100644 Binary files a/test_files/guppy_optimization/angles/angles.opt.hugr and b/test_files/guppy_optimization/angles/angles.opt.hugr differ diff --git a/test_files/guppy_optimization/angles/angles.opt.py b/test_files/guppy_optimization/angles/angles.opt.py index 678b3f20f..65f27cac0 100644 --- a/test_files/guppy_optimization/angles/angles.opt.py +++ b/test_files/guppy_optimization/angles/angles.opt.py @@ -1,7 +1,7 @@ # /// script # requires-python = ">=3.13" # dependencies = [ -# "guppylang >=0.21.3", +# "guppylang >=0.21.6", # ] # /// diff --git a/test_files/guppy_optimization/angles/angles.py b/test_files/guppy_optimization/angles/angles.py index d7e5540f2..0a8824423 100644 --- a/test_files/guppy_optimization/angles/angles.py +++ b/test_files/guppy_optimization/angles/angles.py @@ -1,7 +1,7 @@ # /// script # requires-python = ">=3.13" # dependencies = [ -# "guppylang >=0.21.3", +# "guppylang >=0.21.6", # ] # /// diff --git a/test_files/guppy_optimization/false_branch/false_branch.hugr b/test_files/guppy_optimization/false_branch/false_branch.hugr index fe5287546..36c5d0e70 100644 Binary files a/test_files/guppy_optimization/false_branch/false_branch.hugr and b/test_files/guppy_optimization/false_branch/false_branch.hugr differ diff --git a/test_files/guppy_optimization/false_branch/false_branch.opt.hugr b/test_files/guppy_optimization/false_branch/false_branch.opt.hugr index 7b6a1f144..cd925f38d 100644 Binary files a/test_files/guppy_optimization/false_branch/false_branch.opt.hugr and b/test_files/guppy_optimization/false_branch/false_branch.opt.hugr differ diff --git a/test_files/guppy_optimization/false_branch/false_branch.opt.py b/test_files/guppy_optimization/false_branch/false_branch.opt.py index 678b3f20f..65f27cac0 100644 --- a/test_files/guppy_optimization/false_branch/false_branch.opt.py +++ b/test_files/guppy_optimization/false_branch/false_branch.opt.py @@ -1,7 +1,7 @@ # /// script # requires-python = ">=3.13" # dependencies = [ -# "guppylang >=0.21.3", +# "guppylang >=0.21.6", # ] # /// diff --git a/test_files/guppy_optimization/false_branch/false_branch.py b/test_files/guppy_optimization/false_branch/false_branch.py index 4479dae8b..c1b4bac85 100644 --- a/test_files/guppy_optimization/false_branch/false_branch.py +++ b/test_files/guppy_optimization/false_branch/false_branch.py @@ -1,7 +1,7 @@ # /// script # requires-python = ">=3.13" # dependencies = [ -# "guppylang >=0.21.3", +# "guppylang >=0.21.6", # ] # /// diff --git a/test_files/guppy_optimization/nested/nested.flat.hugr b/test_files/guppy_optimization/nested/nested.flat.hugr index 5c8eb3a8e..b5356bd1d 100644 Binary files a/test_files/guppy_optimization/nested/nested.flat.hugr and b/test_files/guppy_optimization/nested/nested.flat.hugr differ diff --git a/test_files/guppy_optimization/nested/nested.flat.py b/test_files/guppy_optimization/nested/nested.flat.py index d2f602cde..81bccc182 100644 --- a/test_files/guppy_optimization/nested/nested.flat.py +++ b/test_files/guppy_optimization/nested/nested.flat.py @@ -1,7 +1,7 @@ # /// script # requires-python = ">=3.13" # dependencies = [ -# "guppylang >=0.21.3", +# "guppylang >=0.21.6", # ] # /// diff --git a/test_files/guppy_optimization/nested/nested.hugr b/test_files/guppy_optimization/nested/nested.hugr index 09784e2ae..f5ec927c2 100644 Binary files a/test_files/guppy_optimization/nested/nested.hugr and b/test_files/guppy_optimization/nested/nested.hugr differ diff --git a/test_files/guppy_optimization/nested/nested.opt.hugr b/test_files/guppy_optimization/nested/nested.opt.hugr index c951fcaf6..2407e5276 100644 Binary files a/test_files/guppy_optimization/nested/nested.opt.hugr and b/test_files/guppy_optimization/nested/nested.opt.hugr differ diff --git a/test_files/guppy_optimization/nested/nested.opt.py b/test_files/guppy_optimization/nested/nested.opt.py index e495268e3..337f797b7 100644 --- a/test_files/guppy_optimization/nested/nested.opt.py +++ b/test_files/guppy_optimization/nested/nested.opt.py @@ -1,7 +1,7 @@ # /// script # requires-python = ">=3.13" # dependencies = [ -# "guppylang >=0.21.3", +# "guppylang >=0.21.6", # ] # /// diff --git a/test_files/guppy_optimization/nested/nested.py b/test_files/guppy_optimization/nested/nested.py index 7cbb2d509..b937f292b 100644 --- a/test_files/guppy_optimization/nested/nested.py +++ b/test_files/guppy_optimization/nested/nested.py @@ -1,7 +1,7 @@ # /// script # requires-python = ">=3.13" # dependencies = [ -# "guppylang >=0.21.3", +# "guppylang >=0.21.6", # ] # /// diff --git a/test_files/guppy_optimization/ranges/ranges.flat.hugr b/test_files/guppy_optimization/ranges/ranges.flat.hugr index a9692f206..d1926fe03 100644 Binary files a/test_files/guppy_optimization/ranges/ranges.flat.hugr and b/test_files/guppy_optimization/ranges/ranges.flat.hugr differ diff --git a/test_files/guppy_optimization/ranges/ranges.flat.py b/test_files/guppy_optimization/ranges/ranges.flat.py index 917484737..16bfd960a 100644 --- a/test_files/guppy_optimization/ranges/ranges.flat.py +++ b/test_files/guppy_optimization/ranges/ranges.flat.py @@ -1,7 +1,7 @@ # /// script # requires-python = ">=3.13" # dependencies = [ -# "guppylang >=0.21.3", +# "guppylang >=0.21.6", # ] # /// diff --git a/test_files/guppy_optimization/ranges/ranges.hugr b/test_files/guppy_optimization/ranges/ranges.hugr index 58030688f..1108b73c8 100644 Binary files a/test_files/guppy_optimization/ranges/ranges.hugr and b/test_files/guppy_optimization/ranges/ranges.hugr differ diff --git a/test_files/guppy_optimization/ranges/ranges.opt.hugr b/test_files/guppy_optimization/ranges/ranges.opt.hugr index 1a1eb62a1..3e6feab4f 100644 Binary files a/test_files/guppy_optimization/ranges/ranges.opt.hugr and b/test_files/guppy_optimization/ranges/ranges.opt.hugr differ diff --git a/test_files/guppy_optimization/ranges/ranges.opt.py b/test_files/guppy_optimization/ranges/ranges.opt.py index a0b00774c..1f3a5cdd4 100644 --- a/test_files/guppy_optimization/ranges/ranges.opt.py +++ b/test_files/guppy_optimization/ranges/ranges.opt.py @@ -1,7 +1,7 @@ # /// script # requires-python = ">=3.13" # dependencies = [ -# "guppylang >=0.21.3", +# "guppylang >=0.21.6", # ] # /// diff --git a/test_files/guppy_optimization/ranges/ranges.py b/test_files/guppy_optimization/ranges/ranges.py index e7e9b6a58..8cfa2183c 100644 --- a/test_files/guppy_optimization/ranges/ranges.py +++ b/test_files/guppy_optimization/ranges/ranges.py @@ -1,7 +1,7 @@ # /// script # requires-python = ">=3.13" # dependencies = [ -# "guppylang >=0.21.3", +# "guppylang >=0.21.6", # ] # /// diff --git a/test_files/guppy_optimization/simple_cx/simple_cx.hugr b/test_files/guppy_optimization/simple_cx/simple_cx.hugr index 5acd2626e..71cadce8f 100644 Binary files a/test_files/guppy_optimization/simple_cx/simple_cx.hugr and b/test_files/guppy_optimization/simple_cx/simple_cx.hugr differ diff --git a/test_files/guppy_optimization/simple_cx/simple_cx.opt.hugr b/test_files/guppy_optimization/simple_cx/simple_cx.opt.hugr index 39984359d..1793f4081 100644 Binary files a/test_files/guppy_optimization/simple_cx/simple_cx.opt.hugr and b/test_files/guppy_optimization/simple_cx/simple_cx.opt.hugr differ diff --git a/test_files/guppy_optimization/simple_cx/simple_cx.opt.py b/test_files/guppy_optimization/simple_cx/simple_cx.opt.py index 3ec99a025..bdad0cb28 100644 --- a/test_files/guppy_optimization/simple_cx/simple_cx.opt.py +++ b/test_files/guppy_optimization/simple_cx/simple_cx.opt.py @@ -1,7 +1,7 @@ # /// script # requires-python = ">=3.13" # dependencies = [ -# "guppylang >=0.21.3", +# "guppylang >=0.21.6", # ] # /// diff --git a/test_files/guppy_optimization/simple_cx/simple_cx.py b/test_files/guppy_optimization/simple_cx/simple_cx.py index 0cfd75940..0bd517bbe 100644 --- a/test_files/guppy_optimization/simple_cx/simple_cx.py +++ b/test_files/guppy_optimization/simple_cx/simple_cx.py @@ -1,7 +1,7 @@ # /// script # requires-python = ">=3.13" # dependencies = [ -# "guppylang >=0.21.3", +# "guppylang >=0.21.6", # ] # /// diff --git a/tket-qsystem/tests/guppy_opt.rs b/tket-qsystem/tests/guppy_opt.rs index 440c524ae..5ee016a57 100644 --- a/tket-qsystem/tests/guppy_opt.rs +++ b/tket-qsystem/tests/guppy_opt.rs @@ -1,8 +1,11 @@ //! Tests optimizing Guppy-generated programs. +use smol_str::SmolStr; +use std::collections::HashMap; use std::fs; use std::io::BufReader; use std::path::Path; +use tket::extension::{TKET1_EXTENSION_ID, TKET_EXTENSION_ID}; use hugr::algorithms::ComposablePass; use hugr::{Hugr, HugrView}; @@ -44,19 +47,46 @@ fn guppy_simple_cx() -> Hugr { load_guppy_circuit("simple_cx") } +fn count_gates(h: &impl HugrView) -> HashMap { + let mut counts = HashMap::new(); + for n in h.nodes() { + if let Some(eop) = h.get_optype(n).as_extension_op() { + if [TKET_EXTENSION_ID, TKET1_EXTENSION_ID].contains(eop.extension_id()) { + *counts.entry(eop.qualified_id()).or_default() += 1; + } + } + } + counts +} + /// Run some simple optimization passes on the guppy-generated HUGRs and validate the result. /// /// This test is intended to check the current status of the Guppy optimization passes. /// #[rstest] -#[case::angles(guppy_angles())] -#[case::false_branch(guppy_false_branch())] -#[case::nested(guppy_nested())] -#[case::ranges(guppy_ranges())] -#[case::simple_cx(guppy_simple_cx())] +#[case::angles(guppy_angles(), [ + ("tket.quantum.H", 2), ("tket.quantum.QAlloc", 1), ("tket.quantum.Rz", 2), ("tket.quantum.MeasureFree", 1) +])] +#[case::false_branch(guppy_false_branch(), [ + ("tket.quantum.H", 2), ("tket.quantum.QAlloc", 1), ("tket.quantum.MeasureFree", 1) +])] +#[case::nested(guppy_nested(), [ + ("tket.quantum.CZ", 1), ("tket.quantum.H", 2), ("tket.quantum.QAlloc", 3), ("tket.quantum.MeasureFree", 3) +])] +#[case::ranges(guppy_ranges(), [ + ("tket.quantum.QAlloc", 4), ("tket.quantum.MeasureFree", 4), ("tket.quantum.H", 2), ("tket.quantum.CX", 2) +])] +#[case::simple_cx(guppy_simple_cx(), [ + ("tket.quantum.QAlloc", 2), ("tket.quantum.CX", 2), ("tket.quantum.MeasureFree", 2) +])] #[cfg_attr(miri, ignore)] // Opening files is not supported in (isolated) miri -fn optimise_guppy(#[case] mut hugr: Hugr) { +fn optimise_guppy<'a>( + #[case] mut hugr: Hugr, + #[case] before: impl IntoIterator, +) { NormalizeGuppy::default().run(&mut hugr).unwrap(); + let before = before.into_iter().map(|(k, v)| (k.into(), v)).collect(); + assert_eq!(count_gates(&hugr), before); // TODO: Run pytket passes here, and check that the circuit is as optimized as possible at this point. //