mirror of https://github.com/Qiskit/qiskit.git
Add singledispatchmethod to dependency (#8944)
* add singledispatchmethod to dependency * Fixup release note Co-authored-by: Jake Lishman <jake.lishman@ibm.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
This commit is contained in:
parent
514e383946
commit
b10c2ad296
|
@ -96,6 +96,13 @@ Exceptions
|
|||
ClassicalFunctionCompilerTypeError
|
||||
|
||||
"""
|
||||
|
||||
from qiskit.utils import optionals as _optionals
|
||||
|
||||
_optionals.HAS_TWEEDLEDUM.require_now("classical oracle creation")
|
||||
|
||||
# pylint: disable=wrong-import-position
|
||||
|
||||
from .classicalfunction import ClassicalFunction
|
||||
from .exceptions import (
|
||||
ClassicalFunctionParseError,
|
||||
|
|
|
@ -14,12 +14,12 @@
|
|||
|
||||
"""Translates gates to a target basis using a given equivalence library."""
|
||||
|
||||
import sys
|
||||
import time
|
||||
import logging
|
||||
|
||||
from itertools import zip_longest
|
||||
from collections import defaultdict
|
||||
from functools import singledispatch
|
||||
|
||||
import retworkx
|
||||
|
||||
|
@ -30,6 +30,10 @@ from qiskit.circuit.equivalence import Key
|
|||
from qiskit.transpiler.basepasses import TransformationPass
|
||||
from qiskit.transpiler.exceptions import TranspilerError
|
||||
|
||||
if sys.version_info >= (3, 8):
|
||||
from functools import singledispatchmethod # pylint: disable=no-name-in-module
|
||||
else:
|
||||
from singledispatchmethod import singledispatchmethod
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
@ -123,7 +127,7 @@ class BasisTranslator(TransformationPass):
|
|||
if self._target is None:
|
||||
basic_instrs = ["measure", "reset", "barrier", "snapshot", "delay"]
|
||||
target_basis = set(self._target_basis)
|
||||
source_basis = set(_extract_basis(dag))
|
||||
source_basis = set(self._extract_basis(dag))
|
||||
qargs_local_source_basis = {}
|
||||
else:
|
||||
basic_instrs = ["barrier", "snapshot"]
|
||||
|
@ -294,6 +298,29 @@ class BasisTranslator(TransformationPass):
|
|||
else:
|
||||
dag.substitute_node_with_dag(node, bound_target_dag)
|
||||
|
||||
@singledispatchmethod
|
||||
def _extract_basis(self, circuit):
|
||||
return circuit
|
||||
|
||||
@_extract_basis.register
|
||||
def _(self, dag: DAGCircuit):
|
||||
for node in dag.op_nodes():
|
||||
if not dag.has_calibration_for(node):
|
||||
yield (node.name, node.op.num_qubits)
|
||||
if isinstance(node.op, ControlFlowOp):
|
||||
for block in node.op.blocks:
|
||||
yield from self._extract_basis(block)
|
||||
|
||||
@_extract_basis.register
|
||||
def _(self, circ: QuantumCircuit):
|
||||
for instr_context in circ.data:
|
||||
instr, _, _ = instr_context
|
||||
if not circ.has_calibration_for(instr_context):
|
||||
yield (instr.name, instr.num_qubits)
|
||||
if isinstance(instr, ControlFlowOp):
|
||||
for block in instr.blocks:
|
||||
yield from self._extract_basis(block)
|
||||
|
||||
def _extract_basis_target(
|
||||
self, dag, qarg_indices, source_basis=None, qargs_local_source_basis=None
|
||||
):
|
||||
|
@ -336,34 +363,6 @@ class BasisTranslator(TransformationPass):
|
|||
return source_basis, qargs_local_source_basis
|
||||
|
||||
|
||||
# this could be singledispatchmethod and included in above class when minimum
|
||||
# supported python version=3.8.
|
||||
@singledispatch
|
||||
def _extract_basis(circuit):
|
||||
return circuit
|
||||
|
||||
|
||||
@_extract_basis.register
|
||||
def _(dag: DAGCircuit):
|
||||
for node in dag.op_nodes():
|
||||
if not dag.has_calibration_for(node):
|
||||
yield (node.name, node.op.num_qubits)
|
||||
if isinstance(node.op, ControlFlowOp):
|
||||
for block in node.op.blocks:
|
||||
yield from _extract_basis(block)
|
||||
|
||||
|
||||
@_extract_basis.register
|
||||
def _(circ: QuantumCircuit):
|
||||
for instr_context in circ.data:
|
||||
instr, _, _ = instr_context
|
||||
if not circ.has_calibration_for(instr_context):
|
||||
yield (instr.name, instr.num_qubits)
|
||||
if isinstance(instr, ControlFlowOp):
|
||||
for block in instr.blocks:
|
||||
yield from _extract_basis(block)
|
||||
|
||||
|
||||
class StopIfBasisRewritable(Exception):
|
||||
"""Custom exception that signals `retworkx.dijkstra_search` to stop."""
|
||||
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
---
|
||||
upgrade:
|
||||
- |
|
||||
For Python 3.7 `singledispatchmethod <https://pypi.org/project/singledispatchmethod/>`__
|
||||
is now a dependency. This was added to enable leveraging the method dispatch
|
||||
mechanism in the standard library of newer versions of Python. If you're on
|
||||
Python >= 3.8 there is no extra dependency required.
|
|
@ -10,6 +10,7 @@ stevedore>=3.0.0
|
|||
symengine>=0.9 ; platform_machine == 'x86_64' or platform_machine == 'aarch64' or platform_machine == 'ppc64le' or platform_machine == 'amd64' or platform_machine == 'arm64'
|
||||
shared-memory38;python_version<'3.8'
|
||||
typing-extensions; python_version < '3.8'
|
||||
singledispatchmethod; python_version < '3.8'
|
||||
|
||||
# To be removed as a requirement in Terra 0.23. Tweedledum's wheels are
|
||||
# hopelessly broken on M1 mac, so we skip the waiting period for that.
|
||||
|
|
Loading…
Reference in New Issue