§
    ¹³Ùgð   ã                  óø   — d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	 ddl
mZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ej        rddlm Z   G d„ de	¦  «        Z!dS )z&Arbitrary unitary circuit instruction.é    )ÚannotationsN)Ú_numpy_compat)ÚGate)ÚControlledGate)ÚAnnotatedOperationÚControlModifier)ÚQuantumCircuit)ÚQuantumRegister)ÚCircuitError)Ú_compute_control_matrix)ÚUGate)Úmatrix_equal)Úis_unitary_matrixé   )ÚIsometry)ÚBaseOperatorc                  óŒ   ‡ — e Zd ZdZ	 	 d#ddœd$ˆ fd„Zd„ Zdej        fd„Zd%d&d„Z	d„ Z
d„ Zd„ Zd„ Z	 	 	 	 d'd(d „Zd!„ Zd"„ Zˆ xZS ))ÚUnitaryGatea¬  Class quantum gates specified by a unitary matrix.

    Example:

        We can create a unitary gate from a unitary matrix then add it to a
        quantum circuit. The matrix can also be directly applied to the quantum
        circuit, see :meth:`.QuantumCircuit.unitary`.

        .. code-block:: python

            from qiskit import QuantumCircuit
            from qiskit.circuit.library import UnitaryGate

            matrix = [[0, 0, 0, 1],
                      [0, 0, 1, 0],
                      [1, 0, 0, 0],
                      [0, 1, 0, 0]]
            gate = UnitaryGate(matrix)

            circuit = QuantumCircuit(2)
            circuit.append(gate, [0, 1])
    NT)Ú
num_qubitsÚdataú#numpy.ndarray | Gate | BaseOperatorÚlabelú
str | NoneÚcheck_inputÚboolr   ú
int | NoneÚreturnÚNonec               ó   •— t          |d¦  «        r|                     ¦   «         }n)t          |d¦  «        r|                     ¦   «         j        }t	          j        |t          ¬¦  «        }|j        \  }}|�|n t          t          j
        |¦  «        ¦  «        }|r<t          |¦  «        st          d¦  «        ‚||k    s	d|z  |k    rt          d¦  «        ‚t          ¦   «                              d||g|¬	¦  «         dS )
aá  Create a gate from a numeric unitary matrix.

        Args:
            data: Unitary operator.
            label: Unitary name for backend [Default: ``None``].
            check_input: If set to ``False`` this asserts the input
                is known to be unitary and the checking to validate this will
                be skipped. This should only ever be used if you know the
                input is unitary, setting this to ``False`` and passing in
                a non-unitary matrix will result unexpected behavior and errors.
            num_qubits: If given, the number of qubits in the matrix.  If not given, it is inferred.

        Raises:
            ValueError: If input data is not an N-qubit unitary operator.
        Ú	to_matrixÚto_operator)ÚdtypeNzInput matrix is not unitary.é   z(Input matrix is not an N-qubit operator.Úunitary)r   )Úhasattrr    r!   r   ÚnumpyÚasarrayÚcomplexÚshapeÚintÚmathÚlog2r   Ú
ValueErrorÚsuperÚ__init__)Úselfr   r   r   r   Ú	input_dimÚ
output_dimÚ	__class__s          €úf/granary/edev/quantum/lib/python3.11/site-packages/qiskit/circuit/library/generalized_gates/unitary.pyr/   zUnitaryGate.__init__?   s  ø€ õ. �4˜Ñ%Ô%ð 	+ð —>’>Ñ#Ô#ˆDˆDÝ�T˜=Ñ)Ô)ð 	+ð ×#Ò#Ñ%Ô%Ô*ˆDåŒ}˜T­Ð1Ñ1Ô1ˆØ $¤
Ñˆ	�:Ø#-Ð#9�Z�Z½sÅ4Ä9ÈYÑCWÔCWÑ?XÔ?Xˆ
Øð 	Må$ TÑ*Ô*ð AÝ Ð!?Ñ@Ô@Ð@à˜JÒ&Ð&¨!¨Z©-¸9Ò*DÐ*DÝ Ð!KÑLÔLÐLå‰Œ×Ò˜ J°°¸eÐÑDÔDÐDÐDÐDó    c                ó    — t          |t          ¦  «        sdS | j        |j        k    rdS t          | j        d         |j        d         ¦  «        S )NFr   )Ú
isinstancer   r   r   Úparams)r0   Úothers     r4   Ú__eq__zUnitaryGate.__eq__m   sI   € Ý˜%¥Ñ-Ô-ð 	Ø�5ØŒ:˜œÒ$Ð$Ø�5Ý˜DœK¨œN¨E¬L¸¬OÑ<Ô<Ð<r5   c                ór   — |€| j         d         j        n|}t          j        | j         d         ||¬¦  «        S )zReturn matrix for the unitary.Nr   )r"   Úcopy)r8   r"   r&   Úarray)r0   r"   r<   s      r4   Ú	__array__zUnitaryGate.__array__t   s6   € à(-¨�”˜A”Ô$Ð$¸5ˆÝŒ{˜4œ; qœ>°¸TÐBÑBÔBÐBr5   FÚ	annotatedc                ó*   — |                       ¦   «         S ©z"Return the adjoint of the unitary.)Úadjoint)r0   r?   s     r4   ÚinversezUnitaryGate.inversey   s   € à�|Š|‰~Œ~Ðr5   c                óh   — t          t          j        |                      ¦   «         ¦  «        ¦  «        S )z$Return the conjugate of the unitary.)r   r&   Úconjr    ©r0   s    r4   Ú	conjugatezUnitaryGate.conjugate}   s$   € å�5œ: d§n¢nÑ&6Ô&6Ñ7Ô7Ñ8Ô8Ð8r5   c                óN   — |                       ¦   «                              ¦   «         S rA   )Ú	transposerG   rF   s    r4   rB   zUnitaryGate.adjoint�   s   € à�~Š~ÑÔ×)Ò)Ñ+Ô+Ð+r5   c                óh   — t          t          j        |                      ¦   «         ¦  «        ¦  «        S )z$Return the transpose of the unitary.)r   r&   rI   r    rF   s    r4   rI   zUnitaryGate.transpose…   s$   € å�5œ?¨4¯>ª>Ñ+;Ô+;Ñ<Ô<Ñ=Ô=Ð=r5   c                ó  — | j         dk    ržddlm} t          dd¦  «        }t	          || j        ¬¦  «        } |d¦  «                             |                      ¦   «         ¦  «        \  }}}}|                     t          |||¦  «        |d         gg ¦  «         ||_
        || _        d
S | j         dk    r*ddlm}  ||                      ¦   «         ¦  «        | _        d
S dd	lm}	  |	|                      ¦   «         ¦  «        | _        d
S )z4Calculate a subcircuit that implements this unitary.r   r   )ÚOneQubitEulerDecomposerÚq)ÚnameÚUr#   )Útwo_qubit_cnot_decompose)Úqs_decompositionN)r   Ú.qiskit.synthesis.one_qubit.one_qubit_decomposerL   r
   r	   rN   Úangles_and_phaser    Ú_appendr   Úglobal_phaseÚ
definitionÚ.qiskit.synthesis.two_qubit.two_qubit_decomposerP   Úqiskit.synthesis.unitary.qsdrQ   )
r0   rL   rM   ÚqcÚthetaÚphiÚlamrU   rP   rQ   s
             r4   Ú_definezUnitaryGate._define‰   sC  € àŒ?˜aÒÐØ^Ð^Ð^Ð^Ð^Ð^å  3Ñ'Ô'ˆAÝ ¨¬	Ð2Ñ2Ô2ˆBØ,CÐ,CÀCÑ,HÔ,H×,YÒ,YØ—’Ñ Ô ñ-ô -Ñ)ˆE�3˜˜\ð �JŠJ•u˜U C¨Ñ-Ô-°°!´¨v°rÑ:Ô:Ð:Ø*ˆBŒOØ ˆDŒOˆOˆOØŒ_ Ò!Ð!ðð ð ð ð ð ð 7Ð6°t·~²~Ñ7GÔ7GÑHÔHˆDŒOˆOˆOðð ð ð ð ð ð /Ð.¨t¯~ª~Ñ/?Ô/?Ñ@Ô@ˆDŒOˆOˆOr5   r   Únum_ctrl_qubitsr*   Ú
ctrl_stateúint | str | Noneúbool | Noneú#ControlledGate | AnnotatedOperationc                ó&  — |so|                       ¦   «         }t          ||d¬¦  «        }t          |dd¦  «        }t          d| j        |z   |g|||j        ||                      ¦   «         ¬¦  «        }nt          | t          ||¬¦  «        ¦  «        }|S )a'  Return controlled version of gate.

        Args:
            num_ctrl_qubits: Number of controls to add to gate (default is 1).
            label: Optional gate label.
            ctrl_state: The control state in decimal or as a bit string (e.g. ``"1011"``).
                If ``None``, use ``2**num_ctrl_qubits - 1``.
            annotated: indicates whether the controlled gate should be implemented
                as an annotated gate. If ``None``, this is handled as ``False``.

        Returns:
            Controlled version of gate.
        N)r_   r   z	c-unitary)r   r8   r   r^   rV   r_   Ú	base_gate)r^   r_   )	r    r   r   r   r   rV   r<   r   r   )	r0   r^   r   r_   r?   ÚmatÚcmatÚisoÚgates	            r4   ÚcontrolzUnitaryGate.control£   s¬   € ð( ð 	Ø—.’.Ñ"Ô"ˆCÝ*¨3°ÈDÐQÑQÔQˆDÝ˜4  AÑ&Ô&ˆCÝ!ØØœ?¨_Ñ<Ø�uØØ /Øœ>Ø%ØŸ)š)™+œ+ð	ñ 	ô 	ˆDˆDõ &Ø•o°oÐR\Ð]Ñ]Ô]ñô ˆDð ˆr5   c                óP   — | j                              ¦   «         }| j        |_        |S )z‹Return an unparameterized version of ourselves, so the OQ2 exporter doesn't choke on the
        non-standard things in our `params` field.)rV   Úto_gaterN   )r0   Úouts     r4   Ú_qasm_decompositionzUnitaryGate._qasm_decompositionË   s%   € ð Œo×%Ò%Ñ'Ô'ˆØ”9ˆŒØˆ
r5   c                óˆ   — t          |t          j        ¦  «        r|S t          dt	          |¦  «        › d| j        › �¦  «        ‚)z,Unitary gate parameter has to be an ndarray.zinvalid param type z	 in gate )r7   r&   Úndarrayr   ÚtyperN   )r0   Ú	parameters     r4   Úvalidate_parameterzUnitaryGate.validate_parameterÒ   sD   € å�i¥¤Ñ/Ô/ð 	\ØÐåÐZµT¸)±_´_ÐZÐZÈtÌyÐZÐZÑ[Ô[Ð[r5   )NT)
r   r   r   r   r   r   r   r   r   r   )F)r?   r   )r   NNN)
r^   r*   r   r   r_   r`   r?   ra   r   rb   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r/   r:   r   ÚCOPY_ONLY_IF_NEEDEDr>   rC   rG   rB   rI   r]   ri   rm   rr   Ú__classcell__)r3   s   @r4   r   r   '   sC  ø€ € € € € ðð ð4 !Ø ð	,Eð "&ð,Eð ,Eð ,Eð ,Eð ,Eð ,Eð ,Eð ,Eð\=ð =ð =ð #¨Ô)Jð Cð Cð Cð Cð
ð ð ð ð ð9ð 9ð 9ð,ð ,ð ,ð>ð >ð >ðAð Að Að8  !Ø Ø'+Ø!%ð&ð &ð &ð &ð &ðPð ð ð\ð \ð \ð \ð \ð \ð \r5   r   )"rv   Ú
__future__r   r+   Útypingr&   Úqiskitr   Úqiskit.circuit.gater   Úqiskit.circuit.controlledgater   Ú"qiskit.circuit.annotated_operationr   r   Úqiskit.circuit.quantumcircuitr	   Úqiskit.circuit.quantumregisterr
   Úqiskit.circuit.exceptionsr   Úqiskit.circuit._utilsr   Ú'qiskit.circuit.library.standard_gates.ur   Ú(qiskit.quantum_info.operators.predicatesr   r   Úisometryr   ÚTYPE_CHECKINGÚ+qiskit.quantum_info.operators.base_operatorr   r   © r5   r4   ú<module>r‰      s~  ðð -Ð ,à "Ð "Ð "Ð "Ð "Ð "Ø €€€à €€€Ø €€€à  Ð  Ð  Ð  Ð  Ð  Ø $Ð $Ð $Ð $Ð $Ð $Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø RÐ RÐ RÐ RÐ RÐ RÐ RÐ RØ 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø :Ð :Ð :Ð :Ð :Ð :Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø AÐ AÐ AÐ AÐ AÐ AØ FÐ FÐ FÐ FÐ FÐ Fà Ð Ð Ð Ð Ð à	Ôð IØHÐHÐHÐHÐHÐHðp\ð p\ð p\ð p\ð p\�$ñ p\ô p\ð p\ð p\ð p\r5   