§
    ¹³ÙgÒ  ã                  ó‚   — d Z ddlmZ ddlZddlmZ ddlZddlm	Z	 ddl
mZ ddlmZmZ ddlmZ  G d	„ d
e	¦  «        ZdS )zTwo-qubit YY-rotation gate.é    )ÚannotationsN)ÚOptional)ÚGate)ÚQuantumRegister)ÚParameterValueTypeÚParameterExpression)ÚStandardGatec                  ó|   ‡ — e Zd ZdZej        Z	 ddddœdˆ fd	„Zd
„ Z	 	 	 	 ddˆ fd„Z	d d!d„Z
d"d„Zd d#d„Zd„ Zˆ xZS )$ÚRYYGateu£  A parametric 2-qubit :math:`Y \otimes Y` interaction (rotation about YY).

    This gate is symmetric, and is maximally entangling at :math:`\theta = \pi/2`.

    Can be applied to a :class:`~qiskit.circuit.QuantumCircuit`
    with the :meth:`~qiskit.circuit.QuantumCircuit.ryy` method.

    **Circuit Symbol:**

    .. code-block:: text

             â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
        q_0: â”¤1        â”œ
             â”‚  Ryy(Ï´) â”‚
        q_1: â”¤0        â”œ
             â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜

    **Matrix Representation:**

    .. math::

        \newcommand{\rotationangle}{\frac{\theta}{2}}

        R_{YY}(\theta) = \exp\left(-i \rotationangle Y{\otimes}Y\right) =
            \begin{pmatrix}
                \cos\left(\rotationangle\right) & 0 & 0 & i\sin\left(\rotationangle\right) \\
                0 & \cos\left(\rotationangle\right) & -i\sin\left(\rotationangle\right) & 0 \\
                0 & -i\sin\left(\rotationangle\right) & \cos\left(\rotationangle\right) & 0 \\
                i\sin\left(\rotationangle\right) & 0 & 0 & \cos\left(\rotationangle\right)
            \end{pmatrix}

    **Examples:**

        .. math::

            R_{YY}(\theta = 0) = I

        .. math::

            R_{YY}(\theta = \pi) = -i Y \otimes Y

        .. math::

            R_{YY}\left(\theta = \frac{\pi}{2}\right) = \frac{1}{\sqrt{2}}
                                    \begin{pmatrix}
                                        1 & 0 & 0 & i \\
                                        0 & 1 & -i & 0 \\
                                        0 & -i & 1 & 0 \\
                                        i & 0 & 0 & 1
                                    \end{pmatrix}
    NÚdt)ÚdurationÚunitÚthetar   ÚlabelúOptional[str]c               óX   •— t          ¦   «                              dd|g|||¬¦  «         dS )zCreate new RYY gate.Úryyé   )r   r   r   N)ÚsuperÚ__init__)Úselfr   r   r   r   Ú	__class__s        €ú_/granary/edev/quantum/lib/python3.11/site-packages/qiskit/circuit/library/standard_gates/ryy.pyr   zRYYGate.__init__Q   s3   ø€ õ 	‰Œ×Ò˜  E 7°%À(ÐQUÐÑVÔVÐVÐVÐVó    c           
     ó‚  — ddl m} ddlm} ddlm} ddlm} t          dd¦  «        }| j	        d         } ||| j
        ¬	¦  «        } |t          j        dz  ¦  «        |d         gg f |t          j        dz  ¦  «        |d         gg f |¦   «         |d         |d         gg f ||¦  «        |d         gg f |¦   «         |d         |d         gg f |t          j         dz  ¦  «        |d         gg f |t          j         dz  ¦  «        |d         gg fg}|D ]\  }	}
}|                     |	|
|¦  «         Œ|| _        d
S )z4Calculate a subcircuit that implements this unitary.r   )ÚQuantumCircuité   )ÚCXGate)ÚRXGate)ÚRZGater   Úq)ÚnameN)Úqiskit.circuit.quantumcircuitr   Úxr   Úrxr   Úrzr    r   Úparamsr"   ÚnpÚpiÚ_appendÚ
definition)r   r   r   r   r    r!   r   ÚqcÚrulesÚinstrÚqargsÚcargss               r   Ú_definezRYYGate._defineW   s–  € ð 	AÐ@Ð@Ð@Ð@Ð@ØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐõ ˜A˜sÑ#Ô#ˆØ”˜A”ˆØˆ^˜A D¤IÐ.Ñ.Ô.ˆàˆV•B”E˜A‘IÑÔ  1¤ ¨Ð+ØˆV•B”E˜A‘IÑÔ  1¤ ¨Ð+ØˆV‰XŒX˜˜!œ˜a œd�| RÐ(ØˆV�E‰]Œ]˜Q˜qœT˜F BÐ'ØˆV‰XŒX˜˜!œ˜a œd�| RÐ(ØˆV•R”U�F˜Q‘JÑÔ ! A¤$ ¨Ð,ØˆV•R”U�F˜Q‘JÑÔ ! A¤$ ¨Ð,ð
ˆð $)ð 	,ð 	,ÑˆE�5˜%Ø�JŠJ�u˜e UÑ+Ô+Ð+Ð+àˆŒˆˆr   r   Únum_ctrl_qubitsÚintú
str | NoneÚ
ctrl_stateústr | int | NoneÚ	annotatedúbool | Nonec                ó’   •— |€t          d„ | j        D ¦   «         ¦  «        }t          ¦   «                              ||||¬¦  «        }|S )a¢  Return a (multi-)controlled-YY gate.

        Args:
            num_ctrl_qubits: number of control qubits.
            label: An optional label for the gate [Default: ``None``]
            ctrl_state: control state expressed as integer,
                string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
            annotated: indicates whether the controlled gate should be implemented
                as an annotated gate. If ``None``, this is set to ``True`` if
                the gate contains free parameters, in which case it cannot
                yet be synthesized.

        Returns:
            ControlledGate: controlled version of this gate.
        Nc              3  ó@   K  — | ]}t          |t          ¦  «        V — Œd S ©N)Ú
isinstancer   )Ú.0Úps     r   ú	<genexpr>z"RYYGate.control.<locals>.<genexpr>Œ   s-   è è € ÐTÐTÀ1�J qÕ*=Ñ>Ô>ÐTÐTÐTÐTÐTÐTr   )r2   r   r5   r7   )Úanyr'   r   Úcontrol)r   r2   r   r5   r7   Úgater   s         €r   rA   zRYYGate.controlu   sX   ø€ ð, ÐÝÐTÐTÈÌÐTÑTÔTÑTÔTˆIå‰wŒw�ŠØ+ØØ!Øð	 ñ 
ô 
ˆð ˆr   FÚboolc                ó8   — t          | j        d          ¦  «        S )aû  Return inverse RYY gate (i.e. with the negative rotation angle).

        Args:
            annotated: when set to ``True``, this is typically used to return an
                :class:`.AnnotatedOperation` with an inverse modifier set instead of a concrete
                :class:`.Gate`. However, for this class this argument is ignored as the inverse
                of this gate is always a :class:`.RYYGate` with an inverted parameter value.

        Returns:
            RYYGate: inverse gate.
        r   )r   r'   )r   r7   s     r   ÚinversezRYYGate.inverse–   s   € õ ˜œ Aœ�Ñ'Ô'Ð'r   c           	     ó  — |du rt          d¦  «        ‚t          | j        d         ¦  «        }t          j        |dz  ¦  «        }dt          j        |dz  ¦  «        z  }t          j        |dd|gd|| dgd| |dg|dd|gg|¬¦  «        S )z&Return a numpy.array for the RYY gate.Fz9unable to avoid copy while creating an array as requestedr   r   y              ð?)Údtype)Ú
ValueErrorÚfloatr'   ÚmathÚcosÚsinr(   Úarray)r   rG   Úcopyr   rK   Úisins         r   Ú	__array__zRYYGate.__array__¤   sª   € à�5ˆ=ˆ=ÝÐXÑYÔYÐYÝ�d”k !”nÑ%Ô%ˆÝŒh�u˜q‘yÑ!Ô!ˆØ•D”H˜U Q™YÑ'Ô'Ñ'ˆÝŒxØ�1�a˜Ð  C¨$¨°Ð 2°Q¸¸¸sÀAÐ4FÈÈqÐRSÐUXÐHYÐZØð
ñ 
ô 
ð 	
r   ÚexponentrI   c                ó8   — | j         \  }t          ||z  ¦  «        S r;   )r'   r   )r   rQ   r7   r   s       r   ÚpowerzRYYGate.power°   s   € Ø”;‰ˆÝ�x %Ñ'Ñ(Ô(Ð(r   c                óZ   — t          |t          ¦  «        r|                      |¦  «        S dS )NF)r<   r   Ú_compare_parameters)r   Úothers     r   Ú__eq__zRYYGate.__eq__´   s-   € Ý�e�WÑ%Ô%ð 	3Ø×+Ò+¨EÑ2Ô2Ð2Øˆur   r;   )r   r   r   r   )r   NNN)r2   r3   r   r4   r5   r6   r7   r8   )F)r7   rC   )NN)rQ   rI   r7   rC   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r   Ú_standard_gater   r1   rA   rE   rP   rS   rW   Ú__classcell__)r   s   @r   r   r      s  ø€ € € € € ð2ð 2ðh "Ô)€Nð AEðWØRVÐ]aðWð Wð Wð Wð Wð Wð Wð Wðð ð ð@  !Ø Ø'+Ø!%ðð ð ð ð ð ð ðB(ð (ð (ð (ð (ð

ð 

ð 

ð 

ð)ð )ð )ð )ð )ðð ð ð ð ð ð r   r   )r[   Ú
__future__r   rJ   Útypingr   Únumpyr(   Úqiskit.circuit.gater   Úqiskit.circuit.quantumregisterr   Ú"qiskit.circuit.parameterexpressionr   r   Úqiskit._accelerate.circuitr	   r   © r   r   ú<module>rf      sÒ   ðð "Ð !à "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ø :Ð :Ð :Ð :Ð :Ð :Ø VÐ VÐ VÐ VÐ VÐ VÐ VÐ VØ 3Ð 3Ð 3Ð 3Ð 3Ð 3ð]ð ]ð ]ð ]ð ]ˆdñ ]ô ]ð ]ð ]ð ]r   