From 629428f55ace57fd918a77ff402c7843bc3941f1 Mon Sep 17 00:00:00 2001 From: Seyon Sivarajah Date: Wed, 4 Sep 2024 11:40:05 +0100 Subject: [PATCH] use hugr lowering functions and can't lower rz directly any more (mismatched angle types) --- Cargo.lock | 25 +++++++++---- Cargo.toml | 4 +-- tket2-hseries/src/extension/hseries.rs | 31 +++++++--------- tket2/src/passes.rs | 50 -------------------------- 4 files changed, 33 insertions(+), 77 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ae20698a..f81d3bec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -473,6 +473,17 @@ dependencies = [ "syn 2.0.71", ] +[[package]] +name = "delegate" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5060bb0febb73fa907273f8a7ed17ab4bf831d585eac835b28ec24a1e2460956" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + [[package]] name = "deranged" version = "0.3.11" @@ -741,9 +752,9 @@ dependencies = [ [[package]] name = "hugr" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41def210e277099199acba8a9f5d74938612607a0309cf695dc147b0f5870c74" +checksum = "34ee4f66c9add4abc4b1ed5895b8f4ca1ee3727a0aacbb011696bb0a5946be01" dependencies = [ "hugr-core", "hugr-passes", @@ -751,14 +762,14 @@ dependencies = [ [[package]] name = "hugr-core" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce2072c663e82ec9cc43282ff555c90fa139f3e5396a693f2b2a14d72e694e0" +checksum = "b9cadea7900319ff43c7ee211a28e7de26a3d3f3b1d1bdd4c3de3dfee1199d3e" dependencies = [ "bitvec", "cgmath", "context-iterators", - "delegate 0.12.0", + "delegate 0.13.0", "derive_more 1.0.0", "downcast-rs", "enum_dispatch", @@ -782,9 +793,9 @@ dependencies = [ [[package]] name = "hugr-passes" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c47d41300b40e1dfd53f17382b2fe4dc815c9707d7507dc68846562ea7ee78b9" +checksum = "6636bd4e828751880354ea8000bcc0be0d753aed9062783b72c78b668b813aa8" dependencies = [ "hugr-core", "itertools 0.13.0", diff --git a/Cargo.toml b/Cargo.toml index dc4a5db4..f1a178fd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,8 +26,8 @@ missing_docs = "warn" [workspace.dependencies] # Make sure to run `just recompile-eccs` if the hugr serialisation format changes. -hugr = "0.12.0" -hugr-core = "0.9.0" +hugr = "0.12.1" +hugr-core = "0.9.1" portgraph = "0.12" pyo3 = "0.21.2" itertools = "0.13.0" diff --git a/tket2-hseries/src/extension/hseries.rs b/tket2-hseries/src/extension/hseries.rs index 8ea2cacb..2a926cd6 100644 --- a/tket2-hseries/src/extension/hseries.rs +++ b/tket2-hseries/src/extension/hseries.rs @@ -206,24 +206,27 @@ impl HSeriesOpBuilder for D {} /// Lower `Tk2Op` operations to `HSeriesOp` operations. pub fn lower_tk2_op( mut hugr: impl hugr::hugr::hugrmut::HugrMut, -) -> Result<(), Box> { - tket2::passes::replace_ops(&mut hugr, |op| { +) -> Result, Box> { + let replaced_nodes = hugr::algorithms::replace_many_ops(&mut hugr, |op| { let op: Tk2Op = op.cast()?; Some(match op { Tk2Op::QAlloc => HSeriesOp::QAlloc, Tk2Op::QFree => HSeriesOp::QFree, Tk2Op::Reset => HSeriesOp::Reset, Tk2Op::Measure => HSeriesOp::Measure, - Tk2Op::Rz => HSeriesOp::Rz, _ => return None, }) - })?; + })? + .into_iter() + .map(|(node, _)| node) + .collect::>(); fn pi_mul(builder: &mut impl Dataflow, multiplier: f64) -> Wire { builder.add_load_const(ops::Const::new( ConstF64::new(multiplier * std::f64::consts::PI).into(), )) } - tket2::passes::lower_ops(&mut hugr, |op| { + + let lowered_nodes = hugr::algorithms::lower_ops(&mut hugr, |op| { let sig = op.dataflow_signature()?; let sig = Signature::new(sig.input, sig.output); // ignore extension delta let op = op.cast()?; @@ -245,7 +248,7 @@ pub fn lower_tk2_op( }) })?; - Ok(()) + Ok([replaced_nodes, lowered_nodes].concat()) } #[cfg(test)] @@ -318,18 +321,9 @@ mod test { #[test] fn test_lower_direct() { - let mut b = FunctionBuilder::new( - "circuit", - Signature::new(type_row![FLOAT64_TYPE], type_row![]), - ) - .unwrap(); - let [angle] = b.input_wires_arr(); + let mut b = FunctionBuilder::new("circuit", Signature::new_endo(type_row![])).unwrap(); let [q] = b.add_dataflow_op(Tk2Op::QAlloc, []).unwrap().outputs_arr(); let [q] = b.add_dataflow_op(Tk2Op::Reset, [q]).unwrap().outputs_arr(); - let [q] = b - .add_dataflow_op(Tk2Op::Rz, [q, angle]) - .unwrap() - .outputs_arr(); let [q, _] = b .add_dataflow_op(Tk2Op::Measure, [q]) .unwrap() @@ -337,7 +331,9 @@ mod test { b.add_dataflow_op(Tk2Op::QFree, [q]).unwrap(); // TODO remaining ops let mut h = b.finish_hugr_with_outputs([], ®ISTRY).unwrap(); - lower_tk2_op(&mut h).unwrap(); + + let lowered = lower_tk2_op(&mut h).unwrap(); + assert_eq!(lowered.len(), 4); let circ = Circuit::new(&h, h.root()); let ops: Vec = circ .commands() @@ -348,7 +344,6 @@ mod test { vec![ HSeriesOp::QAlloc, HSeriesOp::Reset, - HSeriesOp::Rz, HSeriesOp::Measure, HSeriesOp::QFree ] diff --git a/tket2/src/passes.rs b/tket2/src/passes.rs index 97debec2..f560fc26 100644 --- a/tket2/src/passes.rs +++ b/tket2/src/passes.rs @@ -1,7 +1,6 @@ //! Optimisation passes and related utilities for circuits. mod commutation; -use std::error::Error; pub use commutation::{apply_greedy_commutation, PullForwardError}; @@ -9,56 +8,7 @@ pub mod chunks; pub use chunks::CircuitChunks; pub mod pytket; -use hugr::{ - hugr::{hugrmut::HugrMut, views::SiblingSubgraph, HugrError}, - ops::OpType, - Hugr, -}; pub use pytket::lower_to_pytket; pub mod tuple_unpack; pub use tuple_unpack::find_tuple_unpack_rewrites; - -// TODO use HUGR versions once they are available - -/// Replace all operations in a HUGR according to a mapping. -pub fn replace_ops>( - hugr: &mut impl HugrMut, - mapping: impl Fn(&OpType) -> Option, -) -> Result<(), HugrError> { - let replacements = hugr - .nodes() - .filter_map(|node| { - let new_op = mapping(hugr.get_optype(node))?; - Some((node, new_op)) - }) - .collect::>(); - - for (node, new_op) in replacements { - hugr.replace_op(node, new_op)?; - } - - Ok(()) -} - -/// Lower operations in a circuit according to a mapping to a new HUGR. -pub fn lower_ops( - hugr: &mut impl HugrMut, - lowering: impl Fn(&OpType) -> Option, -) -> Result<(), Box> { - let replacements = hugr - .nodes() - .filter_map(|node| { - let hugr = lowering(hugr.get_optype(node))?; - Some((node, hugr)) - }) - .collect::>(); - - for (node, replacement) in replacements { - let subcirc = SiblingSubgraph::try_from_nodes([node], hugr)?; - let rw = subcirc.create_simple_replacement(hugr, replacement)?; - hugr.apply_rewrite(rw)?; - } - - Ok(()) -}