§
    º³Ùgƒ´  ã                  óp  — d Z ddlmZ ddlmZmZmZ ddlmZ ddl	m
Z
 ddlmZ ddlZddlmZ dd	lmZmZmZ dd
lmZ ddlmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( ddl)m*Z*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9m:Z: ddl;m<Z<m=Z= ddl>m?Z? ddl@mAZA ddlBmCZC ddlDmEZEmFZF ddlGmHZH ddlImJZJ ddlKmLZL ddlMmNZN ejO        ejO        ejO        e jO        e!jO        e"jO        e#jO        e$jO        e%jO        e&jO        e'jO        e(jO        dœZP e¦   «          e¦   «          e¦   «          eedz  ¦  «         e¦   «          eedz  ¦  «        d œZQ e¦   «         ZRd!„ ZSd"„ ZTd#„ ZUd0d$„ZVd1d%„ZWd1d&„ZX	 d2d'„ZY G d(„ d)e?¦  «        ZZd1d*„Z[d1d+„Z\d1d,„Z]d1d-„Z^ G d.„ d/eHj_        ¦  «        Z`dS )3aT  
=========================================================================================
Unitary Synthesis Plugin (in :mod:`qiskit.transpiler.passes.synthesis.unitary_synthesis`)
=========================================================================================

.. autosummary::
   :toctree: ../stubs/

   DefaultUnitarySynthesis
é    )Úannotations)ÚpiÚinfÚisclose)ÚAny)Úproduct)ÚpartialN)ÚCONTROL_FLOW_OP_NAMES)ÚGateÚ	ParameterÚCircuitInstruction)Úget_standard_gate_name_mapping)Ú	iSwapGateÚCXGateÚCZGateÚRXXGateÚRZXGateÚRZZGateÚECRGateÚRXGateÚSXGateÚXGateÚRZGateÚUGateÚ	PhaseGateÚU1GateÚU2GateÚU3GateÚRYGateÚRGate)Úcircuit_to_dagÚdag_to_circuit)Ú
DAGCircuit)Ú	DAGOpNode)ÚQiskitError)ÚBackendProperties)ÚOperator)Úone_qubit_decompose)ÚXXDecomposerÚXXEmbodiments)ÚTwoQubitBasisDecomposerÚTwoQubitWeylDecomposition)ÚTransformationPass)ÚCouplingMap)ÚTranspilerError)ÚOptimize1qGatesDecompositionÚ_possible_decomposers)Úplugin)ÚTarget)Údeprecate_arg)Úrun_default_main_loop)ÚcxÚrxÚsxÚxÚrzÚuÚpÚu1Úu2Úu3ÚryÚré   é   )r6   ÚczÚiswapÚrxxÚecrÚrzxc                óÂ   — d}t          | pg ¦  «                             t                               ¦   «         ¦  «        }|rt          |                     ¦   «                  }|S )zCChoose the first available 2q gate to use in the KAK decomposition.N)ÚsetÚintersectionÚKAK_GATE_NAMESÚkeysÚpop)Úbasis_gatesÚkak_gateÚ	kak_gatess      új/granary/edev/quantum/lib/python3.11/site-packages/qiskit/transpiler/passes/synthesis/unitary_synthesis.pyÚ_choose_kak_gaterS   k   sR   € à€HÝ�KÐ% 2Ñ&Ô&×3Ò3µN×4GÒ4GÑ4IÔ4IÑJÔJ€IØð 3Ý! )§-¢-¡/¤/Ô2ˆà€Oó    c                óZ   — t          | pg ¦  «        }t          |¦  «        }|r|d         S dS )zFChoose the first available 1q basis to use in the Euler decomposition.r   ÚU)rJ   r1   )rO   Ú	basis_setÚdecomposerss      rR   Ú_choose_euler_basisrY   u   s8   € å�KÐ% 2Ñ&Ô&€IÝ'¨	Ñ2Ô2€KØð Ø˜1Œ~ÐØˆ3rT   c                óL   — |                       |f¦  «        }t          |¦  «        S )zCFind matching available 1q basis to use in the Euler decomposition.)Úoperation_names_for_qargsr1   )ÚtargetÚqubitrW   s      rR   Ú_find_matching_euler_basesr^   ~   s%   € à×0Ò0°%°Ñ:Ô:€IÝ  Ñ+Ô+Ð+rT   c                ó  — | €t          ¦   «         }nt          | ¦  «        }|€t          j        }g }|                     ¦   «         D ]<\  }}t          |¦  «                             |¦  «        r|                     |¦  «         Œ=|S )zRFind the matching basis string keys from the list of basis gates from the backend.)rJ   r(   ÚONE_QUBIT_EULER_BASIS_GATESÚitemsÚissubsetÚappend)rO   Ú
basis_dictrW   Ú	out_basisÚbasisÚgatess         rR   Ú_choose_basesrh   „   s‰   € àÐÝ‘E”Eˆ	ˆ	å˜Ñ$Ô$ˆ	àÐÝ(ÔDˆ
à€IØ"×(Ò(Ñ*Ô*ð $ð $‰ˆˆuÝˆu‰:Œ:×Ò˜yÑ)Ô)ð 	$Ø×Ò˜UÑ#Ô#Ð#øàÐrT   c                ó  — d }t          | ¦  «        }t          | ¦  «        }|pd}t          |t          ¦  «        r1t	          t          ¦   «         |||¬¦  «        }t          ||¬¦  «        }n|�t	          ||||¬¦  «        }|S )Nç      ð?)Úbasis_fidelityÚeuler_basisÚpulse_optimize)rl   Úbackup_optimizer)rS   rY   Ú
isinstancer   r+   r   r)   )rO   rm   Úapproximation_degreeÚdecomposer2qrP   rl   rk   rn   s           rR   Ú_decomposer_2q_from_basis_gatesrr   –   s§   € Ø€LÝ Ñ,Ô,€HÝ% kÑ2Ô2€KØ)Ð0¨S€NÝ�(�GÑ$Ô$ð 
Ý2Ý‰HŒHØ)Ø#Ø)ð	
ñ 
ô 
Ðõ $°ÐN^Ð_Ñ_Ô_ˆˆØ	Ð	Ý.ØØ)Ø#Ø)ð	
ñ 
ô 
ˆð ÐrT   c                óú  ‡ ‡‡‡‡— ‰€Et          ‰ t          ¦  «        r!t          ‰                      ¦   «         ¦  «        S t          ‰ ¦  «        S g Šg Šˆ ˆˆˆˆfd„}t          ‰ t          ¦  «        rE‰                      ¦   «         D ]/}t          ˆ ˆfd„|j        D ¦   «         ¦  «        } |||¦  «         Œ0n2‰ D ]/}t          ˆ ˆfd„|j        D ¦   «         ¦  «        } |||¦  «         Œ0dt          j	        ‰¦  «        z
  S )zÐ
    Calculate a rough error for a `circuit` that runs on specific
    `qubits` of `target`.

    Use basis errors from target if available, otherwise use length
    of circuit as a weak proxy for error.
    Nc                óJ  •— 	 ‰                      |¦  «        }|D �]5}‰                     |¦  «        }t          ‰	t          ¦  «        r| j        }n| j        }t          ||j        ¦  «        rä|                     ¦   «         s1t          d„ t          |j
        |j
        ¦  «        D ¦   «         ¦  «        rŸ‰|                              |d ¦  «        }|�Tt          |dd¦  «        pd}t          |dd¦  «        pd}‰                     d|z
  ¦  «         ‰
                     |¦  «         n*‰                     d¦  «         ‰
                     d¦  «          d S �Œ7t          ‚# t          $ r@}t          ‰	t          ¦  «        r| j        }n| j        }t          d|› d‰› d	�¦  «        |‚d }~ww xY w)
Nc              3  óp   K  — | ]1\  }}t          t          |¦  «        t          |¦  «        ¦  «        V — Œ2d S ©N)r   Úfloat)Ú.0Úp1Úp2s      rR   ú	<genexpr>z4_error.<locals>.score_instruction.<locals>.<genexpr>È   sM   è è € ð ð Ù:@¸"¸b�¥ b¡	¤	­5°©9¬9Ñ5Ô5ðð ð ð ð ð rT   Úerrorç        Údurationé   rj   z+Encountered a bad synthesis. Target has no z on qubits ú.)r[   Úoperation_from_namero   r#   ÚopÚ	operationÚ
base_classÚis_parameterizedÚallÚzipÚparamsÚgetÚgetattrrc   ÚKeyErrorr/   )ÚinstÚinst_qubitsrM   ÚkeyÚ	target_opr‚   Ú
inst_propsr|   r~   ÚcircuitÚgate_durationsÚgate_fidelitiesÚqubitsr\   s            €€€€€rR   Úscore_instructionz!_error.<locals>.score_instruction½   sâ  ø€ ð"	Ø×3Ò3°KÑ@Ô@ˆDØð ñ �Ø"×6Ò6°sÑ;Ô;�	Ý˜g¥zÑ2Ô2ð (Øœ�B�Bàœ�BÝ˜i¨¬Ñ7Ô7ð Ø×.Ò.Ñ0Ô0ðåð ð ÝDGÈ	ÔHXÐZ\ÔZcÑDdÔDdðñ ô ñ ô ðð "(¨¤§¢°¸dÑ!CÔ!C�JØ!Ð-Ý '¨
°G¸SÑ AÔ AÐ HÀS˜Ý#*¨:°zÀ3Ñ#GÔ#GÐ#NÈ3˜Ø'×.Ò.¨q°5©yÑ9Ô9Ð9Ø&×-Ò-¨hÑ7Ô7Ð7Ð7à'×.Ò.¨sÑ3Ô3Ð3Ø&×-Ò-¨cÑ2Ô2Ð2à�E�Eùå�øÝð 	ð 	ð 	Ý˜'¥:Ñ.Ô.ð $Ø”W��à”^�Ý!ØZÀ"ÐZÐZÐQWÐZÐZÐZñô àðøøøøð	øøøs   ƒE
E Å	E Å
F"Å";FÆF"c              3  óX   •K  — | ]$}‰‰                      |¦  «        j                 V — Œ%d S rv   ©Úfind_bitÚindex©rx   Úqr‘   r”   s     €€rR   r{   z_error.<locals>.<genexpr>ä   s9   øè è € ÐVÐVÀa  w×'7Ò'7¸Ñ':Ô':Ô'@Ô AÐVÐVÐVÐVÐVÐVrT   c              3  óX   •K  — | ]$}‰‰                      |¦  «        j                 V — Œ%d S rv   r—   rš   s     €€rR   r{   z_error.<locals>.<genexpr>è   s9   øè è € ÐWÐWÀa  w×'7Ò'7¸Ñ':Ô':Ô'@Ô AÐWÐWÐWÐWÐWÐWrT   r   )
ro   r#   ÚlenÚop_nodesÚtopological_op_nodesÚtupleÚqargsr”   ÚnpÚprod)r‘   r\   r”   r•   rŒ   r�   r’   r“   s   ```   @@rR   Ú_errorr¤   ­   sR  øøøøø€ ð €~Ý�g�zÑ*Ô*ð 	 Ý�w×'Ò'Ñ)Ô)Ñ*Ô*Ð*å�w‘<”<ÐØ€OØ€Nð#ð #ð #ð #ð #ð #ð #ð #ð #õJ �'�:Ñ&Ô&ð 1Ø×0Ò0Ñ2Ô2ð 	1ð 	1ˆDÝÐVÐVÐVÐVÐVÈ4Ì:ÐVÑVÔVÑVÔVˆKØÐ˜d KÑ0Ô0Ð0Ð0ð	1ð ð 	1ð 	1ˆDÝÐWÐWÐWÐWÐWÈ4Ì;ÐWÑWÔWÑWÔWˆKØÐ˜d KÑ0Ô0Ð0Ð0à�rŒw�Ñ'Ô'Ñ'Ð'rT   c                ó¾  ‡ — t          |¦  «        }|ddd…         }d}|dv �r¡|�Z|                     |d         ¦  «        }	|d         |	v }
|                     |d         ¦  «        }|d         |v }|
r|sddg}|r|
sddg}|�€B|s|�r=t          }t          }	 t          ˆ fd„|                     |g ¦  «        D ¦   «         ¦  «        }n# t
          $ r Y nw xY w	 t          ˆ fd„|                     |g ¦  «        D ¦   «         ¦  «        }n# t
          $ r Y nw xY w|t          k     s�|t          k     s‚	 t          ˆ fd„|                     |g ¦  «        D ¦   «         ¦  «        }n# t
          $ r Y nw xY w	 t          ˆ fd	„|                     |g ¦  «        D ¦   «         ¦  «        }n# t
          $ r Y nw xY w||k     rddg}n
||k     rddg}|d
u r|€t          d|› d�¦  «        ‚|S )a#  
    `decomposer2q` decomposes an SU(4) over `qubits`. A user sets `natural_direction`
    to indicate whether they prefer synthesis in a hardware-native direction.
    If yes, we return the `preferred_direction` here. If no hardware direction is
    preferred, we raise an error (unless natural_direction is None).
    We infer this from `coupling_map`, `gate_lengths`, `gate_errors`.

    Returns [0, 1] if qubits are correct in the hardware-native direction.
    Returns [1, 0] if qubits must be flipped to match hardware-native direction.
    Néÿÿÿÿ>   NTr   r   c              3  ó8   •K  — | ]\  }}|‰j         k    ¯|V — Œd S rv   ©Úgate©rx   r©   r~   rq   s      €rR   r{   z'_preferred_direction.<locals>.<genexpr>  óA   øè è € ð  ð  á&˜˜hØ˜|Ô0Ò0Ð0ð à0Ð0Ð0Ð0ð ð  rT   c              3  ó8   •K  — | ]\  }}|‰j         k    ¯|V — Œd S rv   r¨   rª   s      €rR   r{   z'_preferred_direction.<locals>.<genexpr>  r«   rT   c              3  ó8   •K  — | ]\  }}|‰j         k    ¯|V — Œd S rv   r¨   ©rx   r©   r|   rq   s      €rR   r{   z'_preferred_direction.<locals>.<genexpr>   óA   øè è € ð $ð $á'˜D %Ø <Ô#4Ò4Ð4ð à4Ð4Ð4Ð4ð$ð $rT   c              3  ó8   •K  — | ]\  }}|‰j         k    ¯|V — Œd S rv   r¨   r®   s      €rR   r{   z'_preferred_direction.<locals>.<genexpr>(  r¯   rT   Tz)No preferred direction of gate on qubits zE could be determined from coupling map or gate lengths / gate errors.)r    Ú	neighborsr   Únextr‰   ÚStopIterationr/   )rq   r”   Únatural_directionÚcoupling_mapÚgate_lengthsÚgate_errorsÚqubits_tupleÚreverse_tupleÚpreferred_directionÚ
neighbors0Úzero_oneÚ
neighbors1Úone_zeroÚcost_0_1Úcost_1_0s   `              rR   Ú_preferred_directionrÁ   î   s   ø€ õ ˜‘=”=€LØ    2 Ô&€MàÐØ˜LÐ(Ñ(àÐ#Ø%×/Ò/°°q´	Ñ:Ô:ˆJØ˜a”y JÐ.ˆHØ%×/Ò/°°q´	Ñ:Ô:ˆJØ˜a”y JÐ.ˆHØð - ð -Ø'(¨! fÐ#Øð - ð -Ø'(¨! fÐ#àÑ&¨LÐ&¸KÑ&ÝˆHÝˆHðÝð  ð  ð  ð  à*6×*:Ò*:¸<ÈÑ*LÔ*Lð ñ  ô  ñ ô ��øõ
 !ð ð ð Ø�ðøøøðÝð  ð  ð  ð  à*6×*:Ò*:¸=È"Ñ*MÔ*Mð ñ  ô  ñ ô ��øõ
 !ð ð ð Ø�ðøøøà�s’N�N hµ¢n nðÝ#ð $ð $ð $ð $à+6¯?ª?¸<ÈÑ+LÔ+Lð$ñ $ô $ñ  ô  �H�Høõ
 %ð ð ð Ø�DðøøøðÝ#ð $ð $ð $ð $à+6¯?ª?¸=È"Ñ+MÔ+Mð$ñ $ô $ñ  ô  �H�Høõ
 %ð ð ð Ø�Dðøøøà˜(Ò"Ð"Ø'(¨! fÐ#Ð#Ø˜HÒ$Ð$Ø'(¨! fÐ#Ø˜DÐ Ð Ð%8Ð%@Ýð*¸ð *ð *ð *ñ
ô 
ð 	
ð
 ÐsH   Â/C Ã
CÃCÃ/D Ä
DÄDÄ./E Å
E+Å*E+Å//F Æ
F,Æ+F,c                  óv   ‡ — e Zd ZdZ eddddd¬¦  «        	 	 	 	 	 	 	 	 	 	 	 d&d'ˆ fd „¦   «         Zd(d$„Zd%„ Zˆ xZS ))ÚUnitarySynthesisz0Synthesize gates according to their basis gates.Úbackend_propsz1.4ÚQiskitzin Qiskit 2.0a  The BackendProperties data structure has been deprecated and will be removed in Qiskit 2.0. The `target` input argument should be used instead. You can use Target.from_configuration() to build the target from the properties object, but in 2.0 you will need to generate a target directly.)ÚnameÚsinceÚpackage_nameÚremoval_timelineÚadditional_msgNrj   Údefaultr   rO   ú	list[str]rp   úfloat | Nonerµ   r.   r&   rm   úbool | Noner´   Úsynth_gatesúlist[str] | NoneÚmethodÚstrÚ
min_qubitsÚintÚplugin_configÚdictr\   r3   c                ój  •— t          ¦   «                              ¦   «          t          |pd¦  «        | _        || _        |	| _        || _        d| _        |dk    rt          j	        ¦   «         | _        || _
        || _        || _        || _        |
| _        || _        |�| j                             ¦   «         | _
        |r|| _        n|r
ddg| _        ndg| _        t          | j        ¦  «        | j        z
  | _        | j        dk    r+| j        | j        j        vrt'          d| j        › d�¦  «        ‚dS dS )aw  Synthesize unitaries over some basis gates.

        This pass can approximate 2-qubit unitaries given some
        gate fidelities (either via ``backend_props`` or ``target``).
        More approximation can be forced by setting a heuristic dial
        ``approximation_degree``.

        Args:
            basis_gates (list[str]): List of gate names to target. If this is
                not specified the ``target`` argument must be used. If both this
                and the ``target`` are specified the value of ``target`` will
                be used and this will be ignored.
            approximation_degree (float): heuristic dial used for circuit approximation
                (1.0=no approximation, 0.0=maximal approximation). Approximation can
                make the synthesized circuit cheaper at the cost of straying from
                the original unitary. If None, approximation is done based on gate fidelities.
            coupling_map (CouplingMap): the coupling map of the backend
                in case synthesis is done on a physical circuit. The
                directionality of the coupling_map will be taken into
                account if ``pulse_optimize`` is ``True``/``None`` and ``natural_direction``
                is ``True``/``None``.
            backend_props (BackendProperties): Properties of a backend to
                synthesize for (e.g. gate fidelities).
            pulse_optimize (bool): Whether to optimize pulses during
                synthesis. A value of ``None`` will attempt it but fall
                back if it does not succeed. A value of ``True`` will raise
                an error if pulse-optimized synthesis does not succeed.
            natural_direction (bool): Whether to apply synthesis considering
                directionality of 2-qubit gates. Only applies when
                ``pulse_optimize`` is ``True`` or ``None``. The natural direction is
                determined by first checking to see whether the
                coupling map is unidirectional.  If there is no
                coupling map or the coupling map is bidirectional,
                the gate direction with the shorter
                duration from the backend properties will be used. If
                set to True, and a natural direction can not be
                determined, raises :class:`.TranspilerError`. If set to None, no
                exception will be raised if a natural direction can
                not be determined.
            synth_gates (list[str]): List of gates to synthesize. If None and
                ``pulse_optimize`` is False or None, default to
                ``['unitary']``. If ``None`` and ``pulse_optimize == True``,
                default to ``['unitary', 'swap']``
            method (str): The unitary synthesis method plugin to use.
            min_qubits: The minimum number of qubits in the unitary to synthesize. If this is set
                and the unitary is less than the specified number of qubits it will not be
                synthesized.
            plugin_config: Optional extra configuration arguments (as a ``dict``)
                which are passed directly to the specified unitary synthesis
                plugin. By default, this will have no effect as the default
                plugin has no extra arguments. Refer to the documentation of
                your unitary synthesis plugin on how to use this.
            target: The optional :class:`~.Target` for the target device the pass
                is compiling for. If specified this will supersede the values
                set for ``basis_gates``, ``coupling_map``, and ``backend_props``.

        Raises:
            TranspilerError: if ``method`` was specified but is not found in the
                installed plugins list. The list of installed plugins can be queried with
                :func:`~qiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names`
        © NrË   ÚunitaryÚswapzSpecified method 'z' not found in plugin list)ÚsuperÚ__init__rJ   Ú_basis_gatesÚ_approximation_degreeÚ_min_qubitsrÑ   Úpluginsr2   ÚUnitarySynthesisPluginManagerÚ_coupling_mapÚ_backend_propsÚ_pulse_optimizeÚ_natural_directionÚ_plugin_configÚ_targetÚbuild_coupling_mapÚ_synth_gatesÚext_pluginsr/   )ÚselfrO   rp   rµ   rÄ   rm   r´   rÏ   rÑ   rÓ   rÕ   r\   Ú	__class__s               €rR   rÜ   zUnitarySynthesis.__init__?  sM  ø€ õj 	‰Œ×ÒÑÔÐÝ Ð 1¨rÑ2Ô2ˆÔØ%9ˆÔ"Ø%ˆÔØˆŒØˆŒØ�YÒÐÝ!Ô?ÑAÔAˆDŒLØ)ˆÔØ+ˆÔØ-ˆÔØ"3ˆÔØ+ˆÔØˆŒØÐØ!%¤×!@Ò!@Ñ!BÔ!BˆDÔØð 	0Ø +ˆDÔÐàð 0Ø%.°Ð$7�Ô!Ð!à%. K�Ô!å Ô 1Ñ2Ô2°TÔ5FÑFˆÔàŒ;˜)Ò#Ð#¨¬¸4¼<Ô;SÐ(SÐ(SÝ!Ð"^°t´{Ð"^Ð"^Ð"^Ñ_Ô_Ð_ð $Ð#Ð(SÐ(SrT   Údagr#   Úreturnc           	     ó�  — t          | j        ¦  «                             |                     ¦   «         ¦  «        s|S | j        r| j        j        | j                 j        }nt          ¦   «         }d| j	        i}dx}}dx}}| j        dk    r
|}|}	||fg}
n!| j        j        d         j        }i }	||f||	fg}
| j
        |_
        | j        dk    r| j
        |_
        |j        s|j        rd„ t          |j        ¦  «        D ¦   «         ni }| j        dk    rŒ| j        �…| j        �&t          | j                             ¦   «         ¦  «        nt          ¦   «         }t#          |t%          |                     ¦   «         ¦  «        | j        | j        || j
        | j        ¦  «        }|S |
D �]\  }}|j        r
| j        |d<   |j        r
| j        |d<   |j        r
| j        |d<   |j        r!|pt9          | j        | j        ¦  «        }||d<   |j        r!|pt?          | j        | j        ¦  «        }||d	<   |j         r!|ptC          | j        | j        ¦  «        }||d
<   |j"        r!|ptG          | j        | j        ¦  «        }||d<   |j$        }|�tK          | j        |¦  «        |d<   |j&        r
| j        |d<   �Œ|  '                    ||||||	¦  «        }|S )zµRun the UnitarySynthesis pass on ``dag``.

        Args:
            dag: input dag.

        Returns:
            Output dag with UnitaryGates synthesized to target basis.
        ÚconfigNrË   c                ó   — i | ]\  }}||“Œ	S rØ   rØ   )rx   ÚiÚbits      rR   ú
<dictcomp>z(UnitarySynthesis.run.<locals>.<dictcomp>á  s   € Ð8Ð8Ð8™˜˜3ˆS�!Ð8Ð8Ð8rT   rO   r´   rm   r¶   r·   Úgate_lengths_by_qubitÚgate_errors_by_qubitÚmatched_basisr\   )(rJ   ré   rK   Ú	count_opsrà   rê   rÑ   ÚobjÚDefaultUnitarySynthesisræ   rÞ   Úsupports_coupling_mapÚ	enumerater”   rç   râ   Ú	get_edgesr5   ÚlistÚvaluesrß   rå   Úsupports_basis_gatesrÝ   Úsupports_natural_directionÚsupports_pulse_optimizerä   Úsupports_gate_lengthsÚ_build_gate_lengthsrã   Úsupports_gate_errorsÚ_build_gate_errorsÚsupports_gate_lengths_by_qubitÚ_build_gate_lengths_by_qubitÚsupports_gate_errors_by_qubitÚ_build_gate_errors_by_qubitÚsupported_basesrh   Úsupports_targetÚ_run_main_loop)rë   rí   Úplugin_methodÚplugin_kwargsÚ_gate_lengthsÚ_gate_errorsÚ_gate_lengths_by_qubitÚ_gate_errors_by_qubitÚdefault_methodÚdefault_kwargsÚmethod_listÚqubit_indicesÚ_coupling_edgesÚoutrÑ   Úkwargsr  s                    rR   ÚrunzUnitarySynthesis.run±  s  € õ �4Ô$Ñ%Ô%×2Ò2°3·=²=±?´?ÑCÔCð 	ØˆJàŒ<ð 	6Ø œLÔ4°T´[ÔAÔEˆMˆMå3Ñ5Ô5ˆMØ)1°4Ô3FÐ(GˆØ'+Ð+ˆ˜Ø9=Ð=ÐÐ!6àŒ;˜)Ò#Ð#ð
 +ˆNØ*ˆNØ)¨=Ð9Ð:ˆKˆKð "œ\Ô5°iÔ@ÔDˆNØˆNØ)¨=Ð9¸NÈNÐ;[Ð\ˆKð 04Ô/IˆÔ,ØŒ;˜)Ò#Ð#à26Ô2LˆMÔ/ð Ô2ðØ6DÔ6ZðÐ8Ð8¥)¨C¬JÑ"7Ô"7Ð8Ñ8Ô8Ð8àð 	ð Œ;˜)Ò#Ð#¨¬Ð(@à7;Ô7IÐ7U•�DÔ&×0Ò0Ñ2Ô2Ñ3Ô3Ð3Õ[^Ñ[`Ô[`ð õ (ØÝ�]×)Ò)Ñ+Ô+Ñ,Ô,ØÔ Ø”ØØÔ*ØÔ'ñô ˆCð ˆJà"-ð 4ñ 4‘�˜ØÔ.ð >Ø,0Ô,=�F˜=Ñ)ØÔ4ð JØ26Ô2I�FÐ.Ñ/ØÔ1ð DØ/3Ô/C�FÐ+Ñ,ØÔ/ð ;Ø$1ð %Õ5HØÔ+¨T¬\ñ6ô 6�Mð .;�F˜>Ñ*ØÔ.ð 9Ø#/ð $Õ3EØÔ+¨T¬\ñ4ô 4�Lð -9�F˜=Ñ)ØÔ8ð MØ-Cð .ÕGcØÔ+¨T¬\ñHô HÐ*ð 7M�FÐ2Ñ3ØÔ7ð KØ,Að -ÕE`ØÔ+¨T¬\ñFô FÐ)ð 6K�FÐ1Ñ2Ø"(Ô"8�Ø"Ð.Ý.;¸DÔ<MÈÑ._Ô._�F˜?Ñ+ØÔ)ð 4Ø'+¤|�F˜8Ñ$ùà×%Ò%Ø�] M°=À.ÐR`ñô ˆCð ˆJrT   c                ó  ‡ ‡‡‡‡‡‡‡‡— |                      ¦   «         D ]_Š‰j        t          vrŒ‰j                             ˆˆˆˆˆˆˆ fd„‰j        j        D ¦   «         ¦  «        }|                     ‰|d¬¦  «         Œ`|                     ¦   «         }|                     ¦   «         D �]cŠ‰j        dk    �r?t          ‰j
        ¦  «        ‰ j        k    �r!d}	‰j        }
t          ‰j
        ¦  «        }‰j        �|‰j        k    s‰j        �|‰j        k     r‰‰}}n‰‰}}|j        r‰ j        ˆfd„‰j
        D ¦   «         f|d<    |j        |
fi |¤Ž}	|	€|                     ‰¦  «         ŒÁt'          |	t(          ¦  «        r�t+          t-          |	j        ‰j
        ¦  «        ¦  «        Š|	                     ¦   «         D ]<Št1          ˆfd„‰j
        D ¦   «         ¦  «        ‰_
        |                     ‰¦  «         Œ=|xj        |	j        z  c_        �Œe|	\  }}}‰j
        Št5          |¦  «        }|D ]¸\  }}}|€Zt5          j        |                     ¦   «                              |j        t1          ˆfd	„|D ¦   «         ¦  «        ¬
¦  «        ¦  «        ŠnAt5          j        t?          j         |t1          ˆfd„|D ¦   «         ¦  «        |¦  «        ¦  «        Š|                     ‰¦  «         Œ¹|xj        |z  c_        �ŒN|                     ‰¦  «         �Œe|S )zRInner loop for the optimizer, after all DAG-independent set-up has been completed.c                óÄ   •— g | ]\}t          ‰                     t          |¦  «        ˆfd „t          |j        ‰j        ¦  «        D ¦   «         ‰‰‰‰¦  «        d¬¦  «        ‘Œ]S )c                ó(   •— i | ]\  }}|‰|         “ŒS rØ   rØ   )rx   ÚinnerÚouterr  s      €rR   rô   z>UnitarySynthesis._run_main_loop.<locals>.<listcomp>.<dictcomp>(  s4   ø€ ð ð ð á$0 E¨5ð !& }°UÔ';ðð ð rT   F)Úcopy_operations)r"   r  r!   r‡   r”   r¡   )	rx   Úblockr  r  Únoder  r  r  rë   s	     €€€€€€€rR   ú
<listcomp>z3UnitarySynthesis._run_main_loop.<locals>.<listcomp>$  sŸ   ø€ ð ð ð ð õ #Ø×+Ò+Ý*¨5Ñ1Ô1ðð ð ð å47¸¼ÀdÄjÑ4QÔ4Qðñ ô ð *Ø)Ø*Ø*ñ
ô 
ð ).ðñ ô ðð ð rT   F)Úpropagate_conditionrÙ   Nc                ó    •— g | ]
}‰|         ‘ŒS rØ   rØ   )rx   r9   r  s     €rR   r$  z3UnitarySynthesis._run_main_loop.<locals>.<listcomp>G  s   ø€ Ð>Ð>Ð>¨a˜ qÔ)Ð>Ð>Ð>rT   rµ   c              3  ó(   •K  — | ]}‰|         V — Œd S rv   rØ   )rx   r9   Ú	qubit_maps     €rR   r{   z2UnitarySynthesis._run_main_loop.<locals>.<genexpr>P  s'   øè è € Ð*LÐ*L¸A¨9°Q¬<Ð*LÐ*LÐ*LÐ*LÐ*LÐ*LrT   c              3  ó(   •K  — | ]}‰|         V — Œd S rv   rØ   ©rx   r9   r”   s     €rR   r{   z2UnitarySynthesis._run_main_loop.<locals>.<genexpr>`  s'   øè è € Ð0JÐ0J¸q°¸´Ð0JÐ0JÐ0JÐ0JÐ0JÐ0JrT   )rˆ   r”   c              3  ó(   •K  — | ]}‰|         V — Œd S rv   rØ   r*  s     €rR   r{   z2UnitarySynthesis._run_main_loop.<locals>.<genexpr>f  s'   øè è € Ð/IÐ/I¸a°°q´	Ð/IÐ/IÐ/IÐ/IÐ/IÐ/IrT   )!rž   rÆ   r
   r‚   Úreplace_blocksÚblocksÚsubstitute_nodeÚcopy_empty_likerŸ   r�   r¡   rß   ÚmatrixÚ
max_qubitsrÓ   rû   râ   r  Ú_apply_op_node_backro   r#   rÖ   r‡   r”   r    Úglobal_phaser$   Úfrom_instructionÚ_to_circuit_instructionÚreplacerˆ   r   Úfrom_standard)rë   rí   r  r  r  r  r  Únew_opÚout_dagÚ	synth_dagrÙ   Ún_qubitsrÑ   r  Ú	node_listr3  r©   Úuser_gate_noderˆ   r¡   r#  r(  r”   s   ` `````             @@@rR   r  zUnitarySynthesis._run_main_loop  s   øøøøøøøøø€ ð —L’L‘N”Nð 	Ið 	IˆDØŒyÕ 5Ð5Ð5ØØ”W×+Ò+ðð ð ð ð ð ð ð ð ð ð "&¤¤ðñ ô ñô ˆFð& ×Ò  fÀ%ÐÑHÔHÐHÐHà×%Ò%Ñ'Ô'ˆØ×,Ò,Ñ.Ô.ð 3	2ñ 3	2ˆDØŒy˜IÒ%Ñ%­#¨d¬j©/¬/¸TÔ=MÒ*MÑ*MØ �	Øœ+�Ý˜tœz™?œ?�à!Ô,Ð8¸XÈÔH`Ò=`Ð=`Ø#Ô.Ð:¸xÈ-ÔJbÒ?bÐ?bØ%3°^˜F�F�Fà%2°M˜F�FØÔ/ð àÔ*Ø>Ð>Ð>Ð>°4´:Ð>Ñ>Ô>ð.�F˜>Ñ*ð '˜FœJ wÐ9Ð9°&Ð9Ð9�	ØÐ$Ø×/Ò/°Ñ5Ô5Ð5ØÝ˜i­Ñ4Ô4ð 9Ý $¥S¨Ô)9¸4¼:Ñ%FÔ%FÑ GÔ G�IØ )× >Ò >Ñ @Ô @ð :ð :˜Ý%*Ð*LÐ*LÐ*LÐ*LÀÄÐ*LÑ*LÔ*LÑ%LÔ%L˜œ
Ø×3Ò3°DÑ9Ô9Ð9Ð9ØÐ(Ô(¨IÔ,BÑBÐ(Ô(Ñ(à4=Ñ1�I˜|¨TØ!œZ�FÝ%.¨t¡_¤_�Nð
 #ð	:ð :ñ ØØØà˜<Ý#,Ô#=Ø .× FÒ FÑ HÔ H× PÒ PØ+9Ô+@Ý+0Ð0JÐ0JÐ0JÐ0JÀEÐ0JÑ0JÔ0JÑ+JÔ+Jð !Qñ !"ô !"ñ$ô $˜D˜Dõ $-Ô#=Ý 2Ô @Ø$(­%Ð/IÐ/IÐ/IÐ/IÀ5Ð/IÑ/IÔ/IÑ*IÔ*IÈ6ñ!"ô !"ñ$ô $˜Dð
  ×3Ò3°DÑ9Ô9Ð9Ð9ØÐ(Ô(¨LÑ8Ð(Ô(Ñ(à×+Ò+¨DÑ1Ô1Ð1Ñ1ØˆrT   )Nrj   NNNNNrË   r   NN)rO   rÌ   rp   rÍ   rµ   r.   rÄ   r&   rm   rÎ   r´   rÎ   rÏ   rÐ   rÑ   rÒ   rÓ   rÔ   rÕ   rÖ   r\   r3   )rí   r#   rî   r#   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r4   rÜ   r  r  Ú__classcell__©rì   s   @rR   rÃ   rÃ   <  sÙ   ø€ € € € € Ø:Ð:à€]ØØØØ(ðJð	ñ 	ô 	ð "&Ø-0Ø$(Ø+/Ø&*Ø)-Ø(,ØØØ"Øðf`ð f`ð f`ð f`ð f`ð f`ñ	ô 	ðf`ðPið ið ið iðVQð Qð Qð Qð Qð Qð QrT   rÃ   c                ó†  — i }|�S|                      ¦   «         D ]=\  }}i ||<   |                      ¦   «         D ]\  }}|�|j        �|j        ||         |<   ŒŒ>ni| �g| j        D ]_}i ||<   | j        |                               ¦   «         D ]-\  }}|                     d¦  «        }	|	r|	d         ||         |<   Œ.||         s||= Œ`|S )z³Builds a ``gate_lengths`` dictionary from either ``props`` (BackendV1)
    or ``target`` (BackendV2).

    The dictionary has the form:
    {gate_name: {(qubits,): duration}}
    NÚgate_lengthr   )ra   r~   Ú_gatesr‰   )
Úpropsr\   r¶   r©   Ú	prop_dictr]   Ú
gate_propsÚkÚvÚlengths
             rR   r  r  p  s  € ð €LØÐØ%Ÿ|š|™~œ~ð 	Dð 	D‰OˆD�)Ø!#ˆL˜ÑØ%.§_¢_Ñ%6Ô%6ð Dð DÑ!��zØÐ)¨jÔ.AÐ.MØ0:Ô0C�L Ô& uÑ-øðDð	Dð
 
Ð	Ø”Lð 	'ð 	'ˆDØ!#ˆL˜ÑØœ TÔ*×0Ò0Ñ2Ô2ð 6ð 6‘��1ØŸš˜}Ñ-Ô-�Øð 6Ø,2°1¬I�L Ô& qÑ)øØ Ô%ð 'Ø  Ð&øØÐrT   c                ó„  — i }|�R|                      ¦   «         D ]=\  }}i ||<   |                      ¦   «         D ]\  }}|�|j        �|j        ||         |<   ŒŒ>| �g| j        D ]_}i ||<   | j        |                               ¦   «         D ]-\  }}|                     d¦  «        }	|	r|	d         ||         |<   Œ.||         s||= Œ`|S )z³Builds a ``gate_error`` dictionary from either ``props`` (BackendV1)
    or ``target`` (BackendV2).

    The dictionary has the form:
    {gate_name: {(qubits,): error_rate}}
    NÚ
gate_errorr   )ra   r|   rF  r‰   )
rG  r\   r·   r©   rH  r]   rI  rJ  rK  r|   s
             rR   r  r  Š  s  € ð €KØÐØ%Ÿ|š|™~œ~ð 	@ð 	@‰OˆD�)Ø "ˆK˜ÑØ%.§_¢_Ñ%6Ô%6ð @ð @Ñ!��zØÐ)¨jÔ.>Ð.JØ/9Ô/?�K Ô% eÑ,øð@ð ÐØ”Lð 	&ð 	&ˆDØ "ˆK˜ÑØœ TÔ*×0Ò0Ñ2Ô2ð 4ð 4‘��1ØŸš˜lÑ+Ô+�Øð 4Ø+0°¬8�K Ô% aÑ(øØ˜tÔ$ð &Ø Ð%øØÐrT   c                óH  — i }|�Ž|j         �‡|j         D ]~}|                     |¦  «        }g }|D ][}|                     |¦  «        }t          ||                              |d¦  «        dd¦  «        }|r|                     ||f¦  «         Œ\|r|||<   Œn�| ��| j                             ¦   «         D ]s\  }	}
t          |	         }|
                     ¦   «         D ]L\  }}|                     ddg¦  «        d         }||f}||v r||                              |¦  «         ŒF|g||<   ŒMŒt|S )z¬
    Builds a `gate_lengths` dictionary from either `props` (BackendV1)
    or `target (BackendV2)`.

    The dictionary has the form:
    {(qubits): [Gate, duration]}
    Nr~   rE  r}   r   ©	r¡   r[   r�   rŠ   r‰   rc   rF  ra   ÚGateNameToGate)rG  r\   r¶   r”   ÚnamesÚoperation_and_durationsrÆ   rƒ   r~   Ú	gate_namerI  r©   Ú
propertiess                rR   r  r  ¤  s‡  € ð €LØÐ˜fœlÐ6Ø”lð 		?ð 		?ˆFØ×4Ò4°VÑ<Ô<ˆEØ&(Ð#Øð Jð J�Ø"×6Ò6°tÑ<Ô<�	Ý" 6¨$¤<×#3Ò#3°F¸DÑ#AÔ#AÀ:ÈtÑTÔT�Øð JØ+×2Ò2°I¸xÐ3HÑIÔIÐIøØ&ð ?Ø'>�˜VÑ$øð		?ð 
Ð	Ø%*¤\×%7Ò%7Ñ%9Ô%9ð 	Eð 	EÑ!ˆI�zÝ! )Ô,ˆDØ&0×&6Ò&6Ñ&8Ô&8ð Eð EÑ"�˜
Ø%Ÿ>š>¨-¸#¸Ñ?Ô?ÀÔB�Ø+/°Ð*:Ð'Ø˜\Ð)Ð)Ø  Ô(×/Ò/Ð0GÑHÔHÐHÐHà,CÐ+D�L Ñ(Ð(ðEð ÐrT   c                óH  — i }|�Ž|j         �‡|j         D ]~}|                     |¦  «        }g }|D ][}|                     |¦  «        }t          ||                              |d¦  «        dd¦  «        }|r|                     ||f¦  «         Œ\|r|||<   Œn�| ��| j                             ¦   «         D ]s\  }	}
t          |	         }|
                     ¦   «         D ]L\  }}|                     ddg¦  «        d         }||f}||v r||                              |¦  «         ŒF|g||<   ŒMŒt|S )z§
    Builds a `gate_error` dictionary from either `props` (BackendV1)
    or `target (BackendV2)`.

    The dictionary has the form:
    {(qubits): [Gate, error]}
    Nr|   rN  r}   r   rP  )rG  r\   r·   r”   rR  Úoperation_and_errorsrÆ   rƒ   r|   rT  rI  r©   rU  s                rR   r
  r
  Å  s†  € ð €KØÐ˜fœlÐ6Ø”lð 		;ð 		;ˆFØ×4Ò4°VÑ<Ô<ˆEØ#%Ð Øð Dð D�Ø"×6Ò6°tÑ<Ô<�	Ý  t¤× 0Ò 0°¸Ñ >Ô >ÀÈÑNÔN�Øð DØ(×/Ò/°¸EÐ0BÑCÔCÐCøØ#ð ;Ø&:�˜FÑ#øð		;ð 
Ð	Ø%*¤\×%7Ò%7Ñ%9Ô%9ð 	Að 	AÑ!ˆI�zÝ! )Ô,ˆDØ&0×&6Ò&6Ñ&8Ô&8ð Að AÑ"�˜
Ø"Ÿš |°c°UÑ;Ô;¸AÔ>�Ø(,¨e }Ð$Ø˜[Ð(Ð(Ø Ô'×.Ò.Ð/CÑDÔDÐDÐDà+?Ð*@�K Ñ'Ð'ðAð ÐrT   c                  óH  ‡ — e Zd ZdZed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Z	ed„ ¦   «         Z
ed„ ¦   «         Zed	„ ¦   «         Zed
„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zˆ fd„Zd„ Zd„ Zd„ Zd„ Zd„ Zˆ xZS )rú   z%The default unitary synthesis plugin.c                ó   — dS ©NTrØ   ©rë   s    rR   r   z,DefaultUnitarySynthesis.supports_basis_gatesé  ó   € àˆtrT   c                ó   — dS rZ  rØ   r[  s    rR   rû   z-DefaultUnitarySynthesis.supports_coupling_mapí  r\  rT   c                ó   — dS rZ  rØ   r[  s    rR   r  z2DefaultUnitarySynthesis.supports_natural_directionñ  r\  rT   c                ó   — dS rZ  rØ   r[  s    rR   r  z/DefaultUnitarySynthesis.supports_pulse_optimizeõ  r\  rT   c                ó   — dS ©NFrØ   r[  s    rR   r  z-DefaultUnitarySynthesis.supports_gate_lengthsù  ó   € àˆurT   c                ó   — dS ra  rØ   r[  s    rR   r  z,DefaultUnitarySynthesis.supports_gate_errorsý  rb  rT   c                ó   — dS rZ  rØ   r[  s    rR   r  z6DefaultUnitarySynthesis.supports_gate_lengths_by_qubit  r\  rT   c                ó   — dS rZ  rØ   r[  s    rR   r	  z5DefaultUnitarySynthesis.supports_gate_errors_by_qubit  r\  rT   c                ó   — d S rv   rØ   r[  s    rR   r1  z"DefaultUnitarySynthesis.max_qubits	  r\  rT   c                ó   — d S rv   rØ   r[  s    rR   rÓ   z"DefaultUnitarySynthesis.min_qubits  r\  rT   c                ó   — d S rv   rØ   r[  s    rR   r  z'DefaultUnitarySynthesis.supported_bases  r\  rT   c                ó   — dS rZ  rØ   r[  s    rR   r  z'DefaultUnitarySynthesis.supports_target  r\  rT   c                óV   •— t          ¦   «                              ¦   «          i | _        d S rv   )rÛ   rÜ   Ú_decomposer_cache)rë   rì   s    €rR   rÜ   z DefaultUnitarySynthesis.__init__  s'   ø€ Ý‰Œ×ÒÑÔÐØ!#ˆÔÐÐrT   c                ó†  ‡‡‡— t          t          |¦  «        ¦  «        }|d d d…         }|| j        v r| j        |         S i }i }d„ }	 |                     |¦  «        }	|	D ]L}
|                     |
¦  «        }t          |t          ¦  «        sŒ- ||¦  «        ||
<   ||
         |         ||
<   ŒMn# t          $ r Y nw xY w	 |                     |¦  «        }	|	D ]P}
|
|vrJ|                     |
¦  «        }t          |t          ¦  «        sŒ1 ||¦  «        ||
<   ||
         |         ||
<   ŒQn# t          $ r Y nw xY w|st          d|› d�¦  «        ‚t          ||d         ¦  «        }g }d„ Šd„ Šˆfd„| 
                    ¦   «         D ¦   «         }t          ||                     ¦   «         ¦  «        D ]m\  }}|                     |¦  «        }|€d	}nt          |d
d¦  «        }|€d}d|z
  }‰�|‰z  }t          ||         ||¬¦  «        }|                     |¦  «         Œnh d£                     |¦  «        r|| j        |<   |S ˆfd„| 
                    ¦   «         D ¦   «         }i }i }d }| 
                    ¦   «         D ]Ï\  }}dt%          t'          |¦  «        j        ¦  «        j        z  }|                     |¦  «        }|€d	||<   nt          |d
d¦  «        }|€d}d|z
  ||<   t,          |j                 }t1          |j        ¦  «        dk    r|                     |g¦  «        ||<   n|||<   t7          |t8          dz  ¦  «        r||v r|}ŒÐ‰� ˆfd„| 
                    ¦   «         D ¦   «         }|rË|D ]È}t          |t:          ¦  «        r‡|dk    r�‰€5|d                              |¦  «        }|�d	t          |d
d¦  «        z
  }nd	}n‰}t          |||d¬¦  «        }|                     t8          dz  t,          |j        j                 i¦  «         nd }tA          ||||¬¦  «        }|                     |¦  «         ŒÉ|| j        |<   |S )Nr¦   c                óÒ  — t          | t          ¦  «        r8t          | j        d         t          ¦  «        rt          t          dz  ¦  «        } n™t          | t
          ¦  «        r8t          | j        d         t          ¦  «        rt          t          dz  ¦  «        } nLt          | t          ¦  «        r7t          | j        d         t          ¦  «        rt          t          dz  ¦  «        } | S )Nr   rB   rC   )ro   r   rˆ   r   r   r   r   )r‚   s    rR   Ú_replace_parameterized_gatezWDefaultUnitarySynthesis._decomposer_2q_from_target.<locals>._replace_parameterized_gate,  s³   € Ý˜"�gÑ&Ô&ð %­:°b´iÀ´lÅIÑ+NÔ+Nð %Ý�R !™V‘_”_��Ý˜B¥Ñ(Ô(ð %­Z¸¼	À!¼ÅiÑ-PÔ-Pð %Ý�R !™V‘_”_��Ý˜B¥Ñ(Ô(ð %­Z¸¼	À!¼ÅiÑ-PÔ-Pð %Ý�R !™V‘_”_�ØˆIrT   z(Target has no gates available on qubits z to synthesize over.r   c                óÒ   — 	 t          | ¦  «        }n# t          $ r Y dS w xY wt          |j        ¦  «        }t	          |j        t          dz  ¦  «        ot	          |j        d¦  «        S )NFrC   r}   )r'   r%   r,   Údatar   Úar   Úc©r©   ÚoperatorÚkaks      rR   Úis_supercontrolledzNDefaultUnitarySynthesis._decomposer_2q_from_target.<locals>.is_supercontrolledV  sl   € ðÝ# D™>œ>��øÝð ð ð Ø�u�uðøøøå+¨H¬MÑ:Ô:ˆCÝ˜3œ5¥" q¡&Ñ)Ô)ÐA­g°c´e¸SÑ.AÔ.AÐAó   ‚ ’
 Ÿ c                óÂ   — 	 t          | ¦  «        }n# t          $ r Y dS w xY wt          |j        ¦  «        }t	          |j        d¦  «        ot	          |j        d¦  «        S )NFr}   )r'   r%   r,   rp  r   Úbrr  rs  s      rR   Úis_controlledzIDefaultUnitarySynthesis._decomposer_2q_from_target.<locals>.is_controlled^  sh   € ðÝ# D™>œ>��øÝð ð ð Ø�u�uðøøøå+¨H¬MÑ:Ô:ˆCÝ˜3œ5 #Ñ&Ô&Ð>­7°3´5¸#Ñ+>Ô+>Ð>rw  c                ó2   •— i | ]\  }} ‰|¦  «        ¯||“ŒS rØ   rØ   )rx   rJ  rK  rv  s      €rR   rô   zFDefaultUnitarySynthesis._decomposer_2q_from_target.<locals>.<dictcomp>g  s@   ø€ ð !
ð !
ð !
Ù�Q˜Ð;MÐ;MÈaÑ;PÔ;Pð!
Øˆqð!
ð !
ð !
rT   rj   r|   r}   r   )rl   rk   >   r6   rD   rG   c                ó2   •— i | ]\  }} ‰|¦  «        ¯||“ŒS rØ   rØ   )rx   rJ  rK  rz  s      €rR   rô   zFDefaultUnitarySynthesis._decomposer_2q_from_target.<locals>.<dictcomp>„  s/   ø€ Ð\Ð\Ð\¡T Q¨È=È=ÐYZÑK[ÔK[Ð\˜A˜qÐ\Ð\Ð\rT   rB   c                ó"   •— i | ]\  }}||‰z  “ŒS rØ   rØ   )rx   rJ  rK  rp   s      €rR   rô   zFDefaultUnitarySynthesis._decomposer_2q_from_target.<locals>.<dictcomp>ž  s%   ø€ Ð cÐ cÐ cÁÀÀA  AÐ(<Ñ$<Ð cÐ cÐ crT   ÚZSXr6   T)rl   rk   rm   )rk   rl   Úembodimentsrn   )!r    Úsortedrk  r[   r�   ro   r   r‹   r/   r^   ra   r   rM   r‰   rŠ   r+   rc   Ú
issupersetr,   r'   rp  rq  r*   r„   r�   Ú
parametersÚassign_parametersr   r   r   Úupdater©   r)   ) rë   r\   r”   rp   r¸   r¹   Úavailable_2q_basisÚavailable_2q_propsrn  rM   rŽ   r‚   Úavailable_1q_basisrX   Úsupercontrolled_basisÚbasis_1qÚbasis_2qrG  Úbasis_2q_fidelityr|   Ú
decomposerÚcontrolled_basisr  Ú	pi2_basisrJ  rK  ÚstrengthÚ
embodimentÚfidelityÚpi2_decomposerrz  rv  s       `                          @@rR   Ú_decomposer_2q_from_targetz2DefaultUnitarySynthesis._decomposer_2q_from_target  sÆ  øøø€ õ �V F™^œ^Ñ,Ô,ˆØ$ T T r TÔ*ˆØ˜4Ô1Ð1Ð1ØÔ)¨,Ô7Ð7ð  ÐØÐð
	ð 	ð 	ð		Ø×3Ò3°LÑAÔAˆDØð Dð D�Ø×/Ò/°Ñ4Ô4�Ý! "¥dÑ+Ô+ð ØØ*EÐ*EÀbÑ*IÔ*IÐ" 3Ñ'Ø*0°¬+°lÔ*CÐ" 3Ñ'Ð'ðDøõ ð 	ð 	ð 	ØˆDð	øøøð
	Ø×3Ò3°MÑBÔBˆDØð Ið I�ØÐ0Ð0Ð0Ø×3Ò3°CÑ8Ô8�BÝ% b­$Ñ/Ô/ð !Ø Ø.IÐ.IÈ"Ñ.MÔ.MÐ& sÑ+Ø.4°S¬k¸-Ô.HÐ& sÑ+øðIøõ ð 	ð 	ð 	ØˆDð	øøøà!ð 	Ý!ØW¸6ÐWÐWÐWñô ð õ
 8¸ÀÈQÄÑPÔPÐð ˆð	Bð 	Bð 	Bð	?ð 	?ð 	?ð!
ð !
ð !
ð !
Ø/×5Ò5Ñ7Ô7ð!
ñ !
ô !
Ðõ #*Ð*<Ð>S×>XÒ>XÑ>ZÔ>ZÑ"[Ô"[ð 	+ð 	+ÑˆH�hØ&×*Ò*¨8Ñ4Ô4ˆEØˆ}Ø$'Ð!Ð!å  w°Ñ4Ô4�Ø�=Ø�EØ$%¨¡IÐ!Ø#Ð/Ø!Ð%9Ñ9Ð!Ý0Ø% hÔ/Ø$Ø0ðñ ô ˆJð
 ×Ò˜zÑ*Ô*Ð*Ð*ð
 ÐÐ×)Ò)Ð*<Ñ=Ô=ð 	Ø3>ˆDÔ" <Ñ0ØÐð ]Ð\Ð\Ð\Ð-?×-EÒ-EÑ-GÔ-GÐ\Ñ\Ô\ÐØÐØˆØˆ	Ø$×*Ò*Ñ,Ô,ð 	ð 	‰DˆAˆqØÕ4µX¸a±[´[Ô5EÑFÔFÔHÑHˆHà&×*Ò*¨1Ñ-Ô-ˆEØˆ}Ø.1Ð! (Ñ+Ð+å  w°Ñ4Ô4�Ø�=Ø�EØ./°%©iÐ! (Ñ+å& q¤|Ô4ˆJÝ�:Ô(Ñ)Ô)¨QÒ.Ð.Ø(2×(DÒ(DÀhÀZÑ(PÔ(P�˜HÑ%Ð%à(2�˜HÑ%å�x¥ a¡Ñ(Ô(ð ¨QÐ2GÐ-GÐ-GØ�	øàÐ+Ø cÐ cÐ cÐ cÐIZ×I`ÒI`ÑIbÔIbÐ cÑ cÔ cÐØð 	/Ø.ð /ð /�Ý˜i­Ñ0Ô0ð *°XÀÒ5FÐ5Fð ,Ð3Ø & t¤× 0Ò 0°Ñ >Ô >˜Ø Ð,Ø'*­W°U¸GÀSÑ-IÔ-IÑ'I˜H˜Hà'*˜H˜Hà#7˜Ý%<Ø!Ø$,Ø'/Ø'+ð	&ñ &ô &�Nð  ×&Ò&­¨Q©µ¸nÔ>QÔ>\Ô0]Ð'^Ñ_Ô_Ð_Ð_à%)�NÝ)Ø#4Ø (Ø +Ø%3ð	ñ ô �
ð ×"Ò" :Ñ.Ô.Ð.Ð.à/:ˆÔ˜|Ñ,ØÐs&   Á	A$B. Â.
B;Â:B;Â?A(D( Ä(
D5Ä4D5c           
     ó   — t          | dd¦  «        }|d         }|d         d         }|d         }|d         }|d         }|d	         }	|d         d
         }
|d         }|j        dk    rEt          ||¦  «        }|                     ||
d         ¦  «        }|€d S |                     |¦  «        S |j        dk    �r|�|                      ||
|¦  «        }nt          |||¦  «        }|�|gng }g }t          |¦  «        d
k    rSt          |d         t          ¦  «        r8t          |d         |
||||	¦  «        }|                      ||d         ||¦  «        S |D ]C}t          ||
||||	¦  «        }|                      ||||¦  «        }|                     |¦  «         ŒDt          |t          t           |t#          |
¦  «        ¬¦  «        d ¬¦  «        }nddlm} |s|r ||¦  «        nd }|€d S t          |t(          ¦  «        r|S t+          |¦  «        S )NrÞ   rj   rO   rµ   r   r´   rm   rõ   rö   r   r\   )rB   rB   )rC   rC   )r\   r”   )rŽ   rË   )Úqs_decomposition)rŠ   Úshaper0   Ú_resynthesize_runÚ_gate_sequence_to_dagr“  rr   r�   ro   r+   rÁ   Ú_synth_su4_no_dagÚ
_synth_su4rc   Úminr	   r¤   r    Úqiskit.synthesis.unitary.qsdr•  r#   r!   )rë   rÙ   Úoptionsrp   rO   rµ   r´   rm   r¶   r·   r”   r\   Ú_decomposer1qÚsequenceÚdecomposers2qrq   Úsynth_circuitsrº   Úsynth_circuitr•  s                       rR   r  zDefaultUnitarySynthesis.runÃ  s¸  € õ
  ' tÐ-DÀcÑJÔJÐØ˜mÔ,ˆØ˜~Ô.¨qÔ1ˆØ#Ð$7Ô8ÐØ Ð!1Ô2ˆØÐ6Ô7ˆØÐ4Ô5ˆØ˜Ô(¨Ô+ˆØ˜Ô"ˆàŒ=˜FÒ"Ð"Ý8¸ÀfÑMÔMˆMØ$×6Ò6°wÀÀqÄ	ÑJÔJˆHØÐØ�tØ ×6Ò6°xÑ@Ô@Ð@ØŒ]˜fÒ$Ñ$àÐ!Ø $× ?Ò ?Ø˜FÐ$8ñ!ô !��õ  ?Ø Ð1Eñ ô  �ð 3?Ð2J   ÐPR�àˆNõ �=Ñ!Ô! QÒ&Ð&­:°mÀAÔ6FÕH_Ñ+`Ô+`Ð&Ý&:Ø! !Ô$ØØ%Ø Ø Øñ'ô 'Ð#ð ×-Ò-Ø˜]¨1Ô-Ð/BÐDXñô ð ð !.ð 5ð 5�Ý&:Ø  &Ð*;¸\È<ÐYdñ'ô 'Ð#ð !%§¢Ø˜\Ð+>Ð@Tñ!ô !�ð ×%Ò% mÑ4Ô4Ð4Ð4ÝØÝ�F¨6½%À¹-¼-ÐHÑHÔHØðñ ô ˆMˆMðð ð ð ð ð ð
 ;FÐZÈÐZÐ,Ð,¨WÑ5Ô5Ð5ÐVZˆMØÐ Ø�4Ý�m¥ZÑ0Ô0ð 	!Ø Ð Ý˜mÑ,Ô,Ð,rT   c                óú   — |dk     }|                      ||¬¦  «        }|s||j        |j        fS d }|D ]\  }}	}
|�|t          j        k    r|
}Œ|�||k    r|                      |||¦  «        S ||j        |j        fS )Nrj   )Úapproximate)Ú_inner_decomposerr3  r©   r   Ú_standard_gateÚ_reversed_synth_su4)rë   rÙ   rq   rº   rp   r¤  Ú
synth_circÚsynth_directionr©   Ú_paramsr”   s              rR   r™  z)DefaultUnitarySynthesis._synth_su4_no_dag  sµ   € Ø.°#Ò5Ð5ˆØ!×3Ò3°GÈÐ3ÑUÔUˆ
Ø"ð 	LØ 
Ô 7¸Ô9JÐKÐKàˆð &0ð 	)ð 	)Ñ!ˆD�'˜6Øˆ|˜t¥vÔ'<Ò<Ð<Ø"(�øØÐ&¨?Ð>QÒ+QÐ+Qà×+Ò+¨G°\ÐCWÑXÔXÐXØ˜JÔ3°\Ô5FÐGÐGrT   c                óð   ‡— |dk     } |||d¬¦  «        Š|s‰S d }‰                      ¦   «         D ]%}|j        j        dk    rˆfd„|j        D ¦   «         }Œ&|�||k    r|                      |||¦  «        S ‰S )Nrj   T©r¤  Úuse_dagrB   c                óD   •— g | ]}‰                      |¦  «        j        ‘ŒS rØ   r—   )rx   r›   r¨  s     €rR   r$  z6DefaultUnitarySynthesis._synth_su4.<locals>.<listcomp>*  s*   ø€ Ð"TÐ"TÐ"TÀA :×#6Ò#6°qÑ#9Ô#9Ô#?Ð"TÐ"TÐ"TrT   )rŸ   r‚   Ú
num_qubitsr¡   r§  )	rë   Úsu4_matrq   rº   rp   r¤  r©  rŒ   r¨  s	           @rR   rš  z"DefaultUnitarySynthesis._synth_su4  s´   ø€ Ø.°#Ò5Ð5ˆØ!�\ '°{ÈDÐQÑQÔQˆ
Ø"ð 	ØÐØˆð ×3Ò3Ñ5Ô5ð 	Uð 	UˆDØŒwÔ! QÒ&Ð&Ø"TÐ"TÐ"TÐ"TÈÌÐ"TÑ"TÔ"T�øØÐ&¨?Ð>QÒ+QÐ+QØ×+Ò+¨G°\ÐCWÑXÔXÐXØÐrT   c                ó~  ‡	‡
— |dk     }|                      ¦   «         }|ddg         |ddg<   |d d …ddgf         |d d …ddgf<    |||d¬¦  «        Š
t          ¦   «         }‰
j        |_        |                     t	          t          ‰
j        ¦  «        ¦  «        ¦  «         |j        d d d…         Š	‰
                     ¦   «         D ]x}t          ˆ	ˆ
fd„|j	        D ¦   «         ¦  «        }t          j        |                     ¦   «                              ||j        ¬¦  «        ¦  «        }|                     |¦  «         Œy|S )	Nrj   rB   r   Tr¬  r¦   c              3  óX   •K  — | ]$}‰‰                      |¦  «        j                 V — Œ%d S rv   r—   )rx   r9   Ú	flip_bitsr¨  s     €€rR   r{   z>DefaultUnitarySynthesis._reversed_synth_su4.<locals>.<genexpr>:  s9   øè è € ÐWÐWÀq˜9 Z×%8Ò%8¸Ñ%;Ô%;Ô%AÔBÐWÐWÐWÐWÐWÐWrT   )r”   rˆ   )Úcopyr#   r3  Ú
add_qubitsrþ   Úreversedr”   rŸ   r    r¡   r$   r4  r5  r6  rˆ   r2  )rë   r°  rq   rp   r¤  Ú
su4_mat_mmr9  r#  r”   r³  r¨  s            @@rR   r§  z+DefaultUnitarySynthesis._reversed_synth_su4/  sU  øø€ Ø.°#Ò5Ð5ˆØ—\’\‘^”^ˆ
Ø'¨¨A¨Ô/ˆ
�A�q�6ÑØ *¨1¨1¨1¨q°!¨f¨9Ô 5ˆ
�1�1�1�q˜!�f�9ÑØ!�\ *¸+ÈtÐTÑTÔTˆ
Ý‘,”,ˆØ)Ô6ˆÔØ×Ò�4¥¨Ô):Ñ ;Ô ;Ñ<Ô<Ñ=Ô=Ð=Ø”N 4 4 R 4Ô(ˆ	Ø×3Ò3Ñ5Ô5ð 	.ð 	.ˆDÝÐWÐWÐWÐWÐWÈDÌJÐWÑWÔWÑWÔWˆFÝÔ-Ø×,Ò,Ñ.Ô.×6Ò6¸fÈTÌ[Ð6ÑYÔYñô ˆDð ×'Ò'¨Ñ-Ô-Ð-Ð-ØˆrT   )r>  r?  r@  rA  Úpropertyr   rû   r  r  r  r  r  r	  r1  rÓ   r  r  rÜ   r“  r  r™  rš  r§  rB  rC  s   @rR   rú   rú   æ  sÖ  ø€ € € € € Ø/Ð/àðð ñ „Xðð ðð ñ „Xðð ðð ñ „Xðð ðð ñ „Xðð ðð ñ „Xðð ðð ñ „Xðð ðð ñ „Xðð ðð ñ „Xðð ðð ñ „Xðð ðð ñ „Xðð ðð ñ „Xðð ðð ñ „Xðð$ð $ð $ð $ð $ðdð dð dðLH-ð H-ð H-ðTHð Hð Hð$ð ð ð ð ð ð ð ð ð rT   rú   rv   )NN)NNN)arA  Ú
__future__r   Úmathr   r   r   Útypingr   Ú	itertoolsr   Ú	functoolsr	   Únumpyr¢   Úqiskit.circuit.controlflowr
   Úqiskit.circuitr   r   r   Ú%qiskit.circuit.library.standard_gatesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    Úqiskit.convertersr!   r"   Úqiskit.dagcircuit.dagcircuitr#   Úqiskit.dagcircuit.dagnoder$   Úqiskit.exceptionsr%   Ú)qiskit.providers.models.backendpropertiesr&   Úqiskit.quantum_infor'   Úqiskit.synthesis.one_qubitr(   Ú'qiskit.synthesis.two_qubit.xx_decomposer)   r*   Ú.qiskit.synthesis.two_qubit.two_qubit_decomposer+   r,   Úqiskit.transpiler.basepassesr-   Úqiskit.transpiler.couplingr.   Úqiskit.transpiler.exceptionsr/   Ú?qiskit.transpiler.passes.optimization.optimize_1q_decompositionr0   r1   Ú"qiskit.transpiler.passes.synthesisr2   Úqiskit.transpiler.targetr3   Úqiskit.utils.deprecationr4   Ú$qiskit._accelerate.unitary_synthesisr5   r¦  ÚGATE_NAME_MAPrL   rQ  rS   rY   r^   rh   rr   r¤   rÁ   rÃ   r  r  r  r
  ÚUnitarySynthesisPluginrú   rØ   rT   rR   ú<module>rÕ     s  ðð	ð 	ð #Ð "Ð "Ð "Ð "Ð "Ø !Ð !Ð !Ð !Ð !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð à <Ð <Ð <Ð <Ð <Ð <Ø >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ø PÐ PÐ PÐ PÐ PÐ Pðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð( =Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø /Ð /Ð /Ð /Ð /Ð /Ø )Ð )Ð )Ð )Ð )Ð )Ø GÐ GÐ GÐ GÐ GÐ GØ (Ð (Ð (Ð (Ð (Ð (Ø :Ð :Ð :Ð :Ð :Ð :Ø OÐ OÐ OÐ OÐ OÐ OÐ OÐ Oðð ð ð ð ð ð ð ð <Ð ;Ð ;Ð ;Ð ;Ð ;Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8ðð ð ð ð ð ð ð ð 6Ð 5Ð 5Ð 5Ð 5Ð 5Ø +Ð +Ð +Ð +Ð +Ð +à 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø FÐ FÐ FÐ FÐ FÐ Fð Ô
Ø
Ô
Ø
Ô
Ø	Ô	Ø
Ô
Ø	Ô	Ø	Ô	!Ø
Ô
Ø
Ô
Ø
Ô
Ø
Ô
Ø	Ô	ðð €ð" ˆ&‰(Œ(Ø
ˆ&‰(Œ(ØˆY‰[Œ[Øˆ7�2˜‘6‰?Œ?Øˆ7‰9Œ9Øˆ7�2˜‘6‰?Œ?ðð €ð 0Ð/Ñ1Ô1€ðð ð ðð ð ð,ð ,ð ,ðð ð ð ð$ð ð ð ð.>(ð >(ð >(ð >(ðD `dðKð Kð Kð Kð\qð qð qð qð qÐ)ñ qô qð qðh	ð ð ð ð4ð ð ð ð4ð ð ð ðBð ð ð ðBYð Yð Yð Yð Y˜fÔ;ñ Yô Yð Yð Yð YrT   