Skip to content

Commit 48ddda0

Browse files
authored
refactor(hseries): use array unpack operation (#913)
Handles a test failure induced by update to hugr 0.20.2 (bug in release)
1 parent 58f3f44 commit 48ddda0

File tree

9 files changed

+96
-78
lines changed

9 files changed

+96
-78
lines changed

.github/change-filters.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@ python:
2121
- "uv.lock"
2222

2323
extensions:
24-
- "tket2-exts/src/tket2_exts/data/tket2/**"
24+
- "tket2-exts/src/tket2_exts/data/tket2/**"

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,5 @@ lcov.info
2525
# local cargo config
2626
/.cargo/config.toml
2727
.envrc
28+
29+
.DS_Store

Cargo.lock

Lines changed: 62 additions & 20 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,19 @@ large_enum_variant = "allow"
3737
[patch.crates-io]
3838

3939
# Uncomment to use unreleased versions of hugr
40-
#hugr = { git = "https://github.com/CQCL/hugr", rev = "42ce05d" }
41-
#hugr-core = { git = "https://github.com/CQCL/hugr", rev = "42ce05d" }
42-
#hugr-passes = { git = "https://github.com/CQCL/hugr", rev = "42ce05d" }
43-
#hugr-cli = { git = "https://github.com/CQCL/hugr", rev = "42ce05d" }
40+
# hugr = { git = "https://github.com/CQCL/hugr", branch = "ss/push-xvxtzqlwkvux" }
41+
# hugr-core = { git = "https://github.com/CQCL/hugr", branch = "ss/push-xvxtzqlwkvux" }
42+
# hugr-passes = { git = "https://github.com/CQCL/hugr", branch = "ss/push-xvxtzqlwkvux" }
43+
# hugr-cli = { git = "https://github.com/CQCL/hugr", branch = "ss/push-xvxtzqlwkvux" }
44+
45+
4446
# portgraph = { git = "https://github.com/CQCL/portgraph", rev = "68b96ac737e0c285d8c543b2d74a7aa80a18202c" }
4547
[workspace.dependencies]
4648

4749
# Make sure to run `just recompile-eccs` if the hugr serialisation format changes.
48-
hugr = "0.20.1"
49-
hugr-core = "0.20.1"
50-
hugr-cli = "0.20.1"
50+
hugr = "0.20.2"
51+
hugr-core = "0.20.2"
52+
hugr-cli = "0.20.2"
5153
portgraph = "0.14.1"
5254
pyo3 = ">= 0.23.4, < 0.26"
5355
itertools = "0.14.0"

tket2-hseries/src/extension/qsystem.rs

Lines changed: 2 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use hugr::{
2222
float_ops::FloatOps,
2323
float_types::{float64_type, ConstF64, EXTENSION as FLOAT_TYPES},
2424
},
25-
collections::array::{array_type, array_type_parametric, ArrayOpBuilder},
25+
collections::array::{array_type_parametric, ArrayOpBuilder},
2626
},
2727
type_row,
2828
types::{type_param::TypeParam, PolyFuncType, Signature, Type, TypeArg, TypeRow},
@@ -511,7 +511,7 @@ pub trait QSystemOpBuilder: Dataflow + UnwrapBuilder + ArrayOpBuilder {
511511
let q_arr = self.add_new_array(qb_t(), qbs)?;
512512
let q_arr = self.add_runtime_barrier(q_arr, size)?;
513513

514-
pop_all(self, q_arr, size, qb_t())
514+
self.add_array_unpack(qb_t(), size, q_arr)
515515
}
516516
}
517517

@@ -525,40 +525,6 @@ pub(crate) fn runtime_barrier_ext_op(
525525
)
526526
}
527527

528-
/// Build a pop left operation on an array and unwrap the resulting option.
529-
pub(crate) fn pop_unwrap<T: ArrayOpBuilder>(
530-
builder: &mut T,
531-
q_arr: Wire,
532-
size: u64,
533-
elem_ty: Type,
534-
) -> Result<[Wire; 2], BuildError> {
535-
debug_assert!(size > 0);
536-
let r = builder
537-
.add_array_pop_right(elem_ty.clone(), size, q_arr)
538-
.unwrap();
539-
builder.build_unwrap_sum(
540-
1,
541-
option_type(vec![elem_ty.clone(), array_type(size - 1, elem_ty)]),
542-
r,
543-
)
544-
}
545-
/// Unpack all elements of an array and discard the empty array.
546-
pub(crate) fn pop_all<T: ArrayOpBuilder>(
547-
builder: &mut T,
548-
mut arr: Wire,
549-
size: u64,
550-
elem_ty: Type,
551-
) -> Result<Vec<Wire>, BuildError> {
552-
// TODO use unwrap op when available https://github.com/CQCL/hugr/issues/1947
553-
let mut result = Vec::with_capacity(size as usize);
554-
for ar_size in (1..size + 1).rev() {
555-
let [qb, new_arr] = pop_unwrap(builder, arr, ar_size, elem_ty.clone())?;
556-
result.push(qb);
557-
arr = new_arr;
558-
}
559-
builder.add_array_discard_empty(elem_ty, arr)?;
560-
Ok(result)
561-
}
562528
impl<D: Dataflow> QSystemOpBuilder for D {}
563529

564530
#[cfg(test)]

tket2-hseries/src/extension/qsystem/barrier/barrier_ops.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ impl BarrierOperationFactory {
325325
[array_wire],
326326
|slf, func_b| {
327327
let w = func_b.input().out_wire(0);
328-
let elems = crate::extension::qsystem::pop_all(func_b, w, size, elem_ty.clone())?;
328+
let elems = func_b.add_array_unpack(elem_ty.clone(), size, w)?;
329329
let unpacked: Vec<_> = elems
330330
.into_iter()
331331
.map(|wire| slf.unpack_container(func_b, elem_ty, wire))

tket2-hseries/src/extension/qsystem/lower.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -383,8 +383,8 @@ mod test {
383383
// dfg, input, output, alloc + (10 for unwrap), phasedx, rz, toturns, fmul, phasedx, free +
384384
// 5x(float + load), measure_reset, conditional, case(input, output) * 2, flip
385385
// (phasedx + 2*(float + load)), tket2.read
386-
// + 19 for the barrier array wrapping, popping and option unwrapping
387-
assert_eq!(h.descendants(h.module_root()).count(), 83);
386+
// + 10 for the barrier array wrapping, unwrapping and option unwrapping
387+
assert_eq!(h.descendants(h.module_root()).count(), 72);
388388
assert_eq!(check_lowered(&h), Ok(()));
389389
if let Err(e) = h.validate() {
390390
panic!("{}", e);

tket2-hseries/src/lib.rs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ impl QSystemPass {
218218
#[cfg(test)]
219219
mod test {
220220
use hugr::{
221-
builder::{Container, DFGBuilder, Dataflow, DataflowHugr, DataflowSubContainer},
221+
builder::{Container, Dataflow, DataflowSubContainer, HugrBuilder},
222222
extension::prelude::qb_t,
223223
ops::handle::NodeHandle,
224224
std_extensions::arithmetic::float_types::ConstF64,
@@ -238,13 +238,19 @@ mod test {
238238

239239
#[test]
240240
fn qsystem_pass() {
241+
let mut mb = hugr::builder::ModuleBuilder::new();
242+
let func = mb
243+
.define_function("func", Signature::new_endo(type_row![]))
244+
.unwrap()
245+
.finish_with_outputs([])
246+
.unwrap();
247+
241248
let (mut hugr, [call_node, h_node, f_node, rx_node]) = {
242-
let mut builder =
243-
DFGBuilder::new(Signature::new(qb_t(), vec![bool_type(), bool_type()])).unwrap();
244-
let func = builder
245-
.define_function("func", Signature::new_endo(type_row![]))
246-
.unwrap()
247-
.finish_with_outputs([])
249+
let mut builder = mb
250+
.define_function(
251+
"main",
252+
Signature::new(qb_t(), vec![bool_type(), bool_type()]),
253+
)
248254
.unwrap();
249255
let [qb] = builder.input_wires_arr();
250256

@@ -278,12 +284,12 @@ mod test {
278284
.unwrap()
279285
.outputs_arr();
280286

281-
let hugr = builder
282-
.finish_hugr_with_outputs([measure_result, measure_result])
287+
let _main_n = builder
288+
.finish_with_outputs([measure_result, measure_result])
283289
.unwrap();
290+
let hugr = mb.finish_hugr().unwrap();
284291
(hugr, [call_node, h_node, f_node, rx_node])
285292
};
286-
287293
QSystemPass::default().run(&mut hugr).unwrap();
288294

289295
let topo_sorted = Topo::new(&hugr.as_petgraph())

tket2/src/rewrite.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ pub use ecc_rewriter::ECCRewriter;
1212
use derive_more::{From, Into};
1313
use hugr::core::HugrNode;
1414
use hugr::hugr::hugrmut::HugrMut;
15-
use hugr::hugr::patch::{simple_replace, PatchVerification};
15+
use hugr::hugr::patch::simple_replace;
1616
use hugr::hugr::views::sibling_subgraph::{InvalidReplacement, InvalidSubgraph};
1717
use hugr::hugr::Patch;
1818
use hugr::types::Signature;

0 commit comments

Comments
 (0)