Source code for mqt.qcec.verify

"""The main entry point for the QCEC package."""

from __future__ import annotations

from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from qiskit import QuantumCircuit
    from typing_extensions import Unpack

    from .configuration import ConfigurationOptions

from . import Configuration, EquivalenceCheckingManager
from .configuration import augment_config_from_kwargs
from .parameterized import __is_parameterized, check_parameterized


[docs] def verify( circ1: QuantumCircuit | str, circ2: QuantumCircuit | str, configuration: Configuration | None = None, **kwargs: Unpack[ConfigurationOptions], ) -> EquivalenceCheckingManager.Results: """Verify that ``circ1`` and ``circ2`` are equivalent. Wraps creating an instance of :class:`EquivalenceCheckingManager <.EquivalenceCheckingManager>`, calling :meth:`EquivalenceCheckingManager.run`, and calling :meth:`EquivalenceCheckingManager.get_results`. There are two (non-exclusive) ways of configuring the equivalence checking process: 1. Pass a :class:`Configuration <.Configuration>` instance as the ``configuration`` argument. 2. Pass keyword arguments to this function. These are directly incorporated into the :class:`Configuration <.Configuration>`. Any existing configuration is overridden by keyword arguments. Args: circ1: The first circuit. circ2: The second circuit. configuration: The configuration to use for the equivalence checking process. **kwargs: Keyword arguments to configure the equivalence checking process. Returns: The results of the equivalence checking process. """ if configuration is None: configuration = Configuration() # prepare the configuration augment_config_from_kwargs(configuration, kwargs) if __is_parameterized(circ1) or __is_parameterized(circ2): return check_parameterized(circ1, circ2, configuration) # create the equivalence checker from configuration ecm = EquivalenceCheckingManager(circ1, circ2, configuration) # execute the check ecm.run() # obtain the result return ecm.get_results()