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:
Naoki Kanazawa 2022-10-20 03:36:07 +09:00 committed by GitHub
parent 514e383946
commit b10c2ad296
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 44 additions and 30 deletions

View File

@ -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,

View File

@ -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."""

View File

@ -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.

View File

@ -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.