From c1fc1dd154923abaf84d45ef05a28826c1ac8052 Mon Sep 17 00:00:00 2001 From: Alexander Ivrii Date: Sun, 24 Nov 2024 09:36:55 +0200 Subject: [PATCH 1/3] hashing nodes using node indices --- qiskit/dagcircuit/collect_blocks.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/qiskit/dagcircuit/collect_blocks.py b/qiskit/dagcircuit/collect_blocks.py index 99c51d2e3600..cea99585b43a 100644 --- a/qiskit/dagcircuit/collect_blocks.py +++ b/qiskit/dagcircuit/collect_blocks.py @@ -54,7 +54,7 @@ def __init__(self, dag: DAGCircuit | DAGDependency): self.dag = dag self._pending_nodes: list[DAGOpNode | DAGDepNode] | None = None - self._in_degree: dict[DAGOpNode | DAGDepNode, int] | None = None + self._in_degree: dict[int, int] | None = None self._collect_from_back = False if isinstance(dag, DAGCircuit): @@ -80,7 +80,7 @@ def _setup_in_degrees(self): self._in_degree = {} for node in self._op_nodes(): deg = len(self._direct_preds(node)) - self._in_degree[node] = deg + self._in_degree[node._node_id] = deg if deg == 0: self._pending_nodes.append(node) @@ -165,8 +165,8 @@ def collect_matching_block(self, filter_fn: Callable) -> list[DAGOpNode | DAGDep # update the _in_degree of node's successors for suc in self._direct_succs(node): - self._in_degree[suc] -= 1 - if self._in_degree[suc] == 0: + self._in_degree[suc._node_id] -= 1 + if self._in_degree[suc._node_id] == 0: new_pending_nodes.append(suc) else: self._pending_nodes.append(node) From 305d48a0a3f71a336ac786192acec44cb1a4dca9 Mon Sep 17 00:00:00 2001 From: Alexander Ivrii Date: Sun, 24 Nov 2024 09:41:38 +0200 Subject: [PATCH 2/3] Adding an auxiliary function to return the id of a node. Needed because this field is named differently in DAGOpNode and DAGDepNode. --- qiskit/dagcircuit/collect_blocks.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/qiskit/dagcircuit/collect_blocks.py b/qiskit/dagcircuit/collect_blocks.py index cea99585b43a..55587e0bc34c 100644 --- a/qiskit/dagcircuit/collect_blocks.py +++ b/qiskit/dagcircuit/collect_blocks.py @@ -80,7 +80,7 @@ def _setup_in_degrees(self): self._in_degree = {} for node in self._op_nodes(): deg = len(self._direct_preds(node)) - self._in_degree[node._node_id] = deg + self._in_degree[self._get_node_id(node)] = deg if deg == 0: self._pending_nodes.append(node) @@ -91,6 +91,13 @@ def _op_nodes(self) -> Iterable[DAGOpNode | DAGDepNode]: else: return self.dag.get_nodes() + def _get_node_id(self, node): + """Returns the id of the given node.""" + if not self.is_dag_dependency: + return node._node_id + else: + return node.node_id + def _direct_preds(self, node): """Returns direct predecessors of a node. This function takes into account the direction of collecting blocks, that is node's predecessors when collecting @@ -165,8 +172,8 @@ def collect_matching_block(self, filter_fn: Callable) -> list[DAGOpNode | DAGDep # update the _in_degree of node's successors for suc in self._direct_succs(node): - self._in_degree[suc._node_id] -= 1 - if self._in_degree[suc._node_id] == 0: + self._in_degree[self._get_node_id(suc)] -= 1 + if self._in_degree[self._get_node_id(suc)] == 0: new_pending_nodes.append(suc) else: self._pending_nodes.append(node) From 34d7d080e9338c927a31480516a92f94220d4bca Mon Sep 17 00:00:00 2001 From: Alexander Ivrii Date: Sun, 24 Nov 2024 10:01:58 +0200 Subject: [PATCH 3/3] reno --- .../notes/fix-collect-cliffords-82b8c476e6542b36.yaml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 releasenotes/notes/fix-collect-cliffords-82b8c476e6542b36.yaml diff --git a/releasenotes/notes/fix-collect-cliffords-82b8c476e6542b36.yaml b/releasenotes/notes/fix-collect-cliffords-82b8c476e6542b36.yaml new file mode 100644 index 000000000000..241b6a82ce5d --- /dev/null +++ b/releasenotes/notes/fix-collect-cliffords-82b8c476e6542b36.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + Fixed a problem in :class:`~BlockCollector`, by hashing the nodes using their + integer ids.