|
2 | 2 | use std::{cmp::Reverse, collections::BinaryHeap, iter}; |
3 | 3 |
|
4 | 4 | use hugr_core::{ |
5 | | - hugr::{ |
6 | | - hugrmut::HugrMut, |
7 | | - views::{HierarchyView, SiblingGraph}, |
8 | | - HugrError, |
9 | | - }, |
| 5 | + hugr::{hugrmut::HugrMut, HugrError}, |
10 | 6 | ops::{OpTag, OpTrait}, |
11 | 7 | types::EdgeKind, |
12 | 8 | HugrView as _, Node, |
@@ -58,26 +54,33 @@ pub fn force_order_by_key<H: HugrMut<Node = Node>, K: Ord>( |
58 | 54 | for dp in dataflow_parents { |
59 | 55 | // we filter out the input and output nodes from the topological sort |
60 | 56 | let [i, o] = hugr.get_io(dp).unwrap(); |
61 | | - let rank = |n| rank(hugr, n); |
62 | | - let sg = SiblingGraph::<Node>::try_new(hugr, dp)?; |
63 | | - let petgraph = NodeFiltered::from_fn(sg.as_petgraph(), |x| x != dp && x != i && x != o); |
64 | | - let ordered_nodes = ForceOrder::new(&petgraph, &rank) |
65 | | - .iter(&petgraph) |
66 | | - .filter(|&x| { |
67 | | - let expected_edge = Some(EdgeKind::StateOrder); |
68 | | - let optype = hugr.get_optype(x); |
69 | | - if optype.other_input() == expected_edge || optype.other_output() == expected_edge { |
70 | | - assert_eq!( |
71 | | - optype.other_input(), |
72 | | - optype.other_output(), |
73 | | - "Optype does not have both input and output order edge: {optype}" |
74 | | - ); |
75 | | - true |
76 | | - } else { |
77 | | - false |
78 | | - } |
79 | | - }) |
80 | | - .collect_vec(); |
| 57 | + let ordered_nodes = { |
| 58 | + let i_pg = hugr.to_portgraph_node(i); |
| 59 | + let o_pg = hugr.to_portgraph_node(o); |
| 60 | + let rank = |n| rank(hugr, hugr.from_portgraph_node(n)); |
| 61 | + let region = hugr.region_portgraph(dp); |
| 62 | + let petgraph = NodeFiltered::from_fn(®ion, |x| x != i_pg && x != o_pg); |
| 63 | + ForceOrder::<_, portgraph::NodeIndex, _, _>::new(&petgraph, &rank) |
| 64 | + .iter(&petgraph) |
| 65 | + .filter_map(|x| { |
| 66 | + let x = hugr.from_portgraph_node(x); |
| 67 | + let expected_edge = Some(EdgeKind::StateOrder); |
| 68 | + let optype = hugr.get_optype(x); |
| 69 | + if optype.other_input() == expected_edge |
| 70 | + || optype.other_output() == expected_edge |
| 71 | + { |
| 72 | + assert_eq!( |
| 73 | + optype.other_input(), |
| 74 | + optype.other_output(), |
| 75 | + "Optype does not have both input and output order edge: {optype}" |
| 76 | + ); |
| 77 | + Some(x) |
| 78 | + } else { |
| 79 | + None |
| 80 | + } |
| 81 | + }) |
| 82 | + .collect_vec() |
| 83 | + }; |
81 | 84 |
|
82 | 85 | // we iterate over the topologically sorted nodes, prepending the input |
83 | 86 | // node and suffixing the output node. |
|
0 commit comments