"""The main entry point for the QCEC package."""from__future__importannotationsfromtypingimportTYPE_CHECKINGifTYPE_CHECKING:fromqiskitimportQuantumCircuitfromtyping_extensionsimportUnpackfrom.configurationimportConfigurationOptionsfrom.importConfiguration,EquivalenceCheckingManagerfrom.configurationimportaugment_config_from_kwargsfrom.parameterizedimport__is_parameterized,check_parameterized
[docs]defverify(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. """ifconfigurationisNone:configuration=Configuration()# prepare the configurationaugment_config_from_kwargs(configuration,kwargs)if__is_parameterized(circ1)or__is_parameterized(circ2):returncheck_parameterized(circ1,circ2,configuration)# create the equivalence checker from configurationecm=EquivalenceCheckingManager(circ1,circ2,configuration)# execute the checkecm.run()# obtain the resultreturnecm.get_results()