diff --git a/qiskit/dagcircuit/collect_blocks.py b/qiskit/dagcircuit/collect_blocks.py index 99c51d2e3600..55587e0bc34c 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[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] -= 1 - if self._in_degree[suc] == 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) 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.