§
    ¹³Ùgw  ã                  ó~   — d 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mZ ddlmZ  G d	„ d
e¦  «        ZdS )zTwo-qubit ZZ-rotation gate.é    )Úannotations)Úexp)Ú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 )$ÚRZZGateu	  A parametric 2-qubit :math:`Z \otimes Z` interaction (rotation about ZZ).

    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.rzz` method.

    **Circuit Symbol:**

    .. code-block:: text

        q_0: â”€â”€â”€â– â”€â”€â”€â”€
                â”‚zz(Î¸)
        q_1: â”€â”€â”€â– â”€â”€â”€â”€

    **Matrix Representation:**

    .. math::

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

        R_{ZZ}(\theta) = \exp\left(-i \rotationangle Z{\otimes}Z\right) =
            \begin{pmatrix}
                e^{-i \rotationangle} & 0 & 0 & 0 \\
                0 & e^{i \rotationangle} & 0 & 0 \\
                0 & 0 & e^{i \rotationangle} & 0 \\
                0 & 0 & 0 & e^{-i \rotationangle}
            \end{pmatrix}

    This is a direct sum of RZ rotations, so this gate is equivalent to a
    uniformly controlled (multiplexed) RZ gate:

    .. math::

        R_{ZZ}(\theta) =
            \begin{pmatrix}
                RZ(\theta) & 0 \\
                0 & RZ(-\theta)
            \end{pmatrix}

    **Examples:**

        .. math::

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

        .. math::

            R_{ZZ}(\theta = 2\pi) = -I

        .. math::

            R_{ZZ}(\theta = \pi) = - i Z \otimes Z

        .. math::

            R_{ZZ}\left(\theta = \frac{\pi}{2}\right) = \frac{1}{\sqrt{2}}
                                    \begin{pmatrix}
                                        1-i & 0 & 0 & 0 \\
                                        0 & 1+i & 0 & 0 \\
                                        0 & 0 & 1+i & 0 \\
                                        0 & 0 & 0 & 1-i
                                    \end{pmatrix}
    NÚdt)ÚdurationÚunitÚthetar   ÚlabelúOptional[str]c               óX   •— t          ¦   «                              dd|g|||¬¦  «         dS )zCreate new RZZ gate.Úrzzé   )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/rzz.pyr   zRZZGate.__init__]   s3   ø€ õ 	‰Œ×Ò˜  E 7°%À(ÐQUÐÑVÔVÐVÐVÐVó    c                ój  — ddl m} ddlm} ddlm} t          dd¦  «        }| j        d         } ||| j        ¬¦  «        } |¦   «         |d         |d         gg f ||¦  «        |d         gg f |¦   «         |d         |d         gg fg}|D ]\  }}	}
| 	                    ||	|
¦  «         Œ|| _
        d	S )
zI
        gate rzz(theta) a, b { cx a, b; u1(theta) b; cx a, b; }
        r   )ÚQuantumCircuité   )ÚCXGate)ÚRZGater   Úq)ÚnameN)Úqiskit.circuit.quantumcircuitr   Úxr   Úrzr    r   Úparamsr"   Ú_appendÚ
definition)r   r   r   r    r!   r   ÚqcÚrulesÚinstrÚqargsÚcargss              r   Ú_definezRZZGate._definec   s   € ð
 	AÐ@Ð@Ð@Ð@Ð@ØÐÐÐÐÐØÐÐÐÐÐõ ˜A˜sÑ#Ô#ˆØ”˜A”ˆØˆ^˜A D¤IÐ.Ñ.Ô.ˆàˆV‰XŒX˜˜!œ˜a œd�| RÐ(ØˆV�E‰]Œ]˜Q˜qœT˜F BÐ'ØˆV‰XŒX˜˜!œ˜a œd�| RÐ(ð
ˆð
 $)ð 	,ð 	,Ñˆ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-RZZ 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"RZZGate.control.<locals>.<genexpr>”   s-   è è € ÐTÐTÀ1�J qÕ*=Ñ>Ô>ÐTÐTÐTÐTÐTÐTr   )r/   r   r2   r4   )Úanyr&   r   Úcontrol)r   r/   r   r2   r4   Úgater   s         €r   r>   zRZZGate.control}   sX   ø€ ð, ÐÝÐTÐTÈÌÐTÑTÔTÑTÔTˆIå‰wŒw�ŠØ+ØØ!Øð	 ñ 
ô 
ˆð ˆr   FÚboolc                ó8   — t          | j        d          ¦  «        S )aû  Return inverse RZZ 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:`.RZZGate` with an inverted parameter value.

        Returns:
            RZZGate: inverse gate.
        r   )r   r&   )r   r4   s     r   ÚinversezRZZGate.inversež   s   € õ ˜œ Aœ�Ñ'Ô'Ð'r   c                ó2  — ddl }|du rt          d¦  «        ‚dt          | j        d         ¦  «        z  dz  }|                     t          | ¦  «        dddgdt          |¦  «        ddgddt          |¦  «        dgdddt          | ¦  «        gg|¬¦  «        S )z&Return a numpy.array for the RZZ gate.r   NFz9unable to avoid copy while creating an array as requestedy              ð?r   )Údtype)ÚnumpyÚ
ValueErrorÚfloatr&   Úarrayr   )r   rD   ÚcopyrE   Úitheta2s        r   Ú	__array__zRZZGate.__array__¬   s±   € àˆˆˆà�5ˆ=ˆ=ÝÐXÑYÔYÐYØ•u˜Tœ[¨œ^Ñ,Ô,Ñ,¨qÑ0ˆØ�{Š{å�g�X‘”  1 aÐ(Ø•C˜‘L”L ! QÐ'Ø�A•s˜7‘|”| QÐ'Ø�A�q�#˜w˜h™-œ-Ð(ð	ð ð ñ 
ô 
ð 	
r   ÚexponentrG   c                ó8   — | j         \  }t          ||z  ¦  «        S r8   )r&   r   )r   rL   r4   r   s       r   ÚpowerzRZZGate.power½   s   € Ø”;‰ˆÝ�x %Ñ'Ñ(Ô(Ð(r   c                óZ   — t          |t          ¦  «        r|                      |¦  «        S dS )NF)r9   r   Ú_compare_parameters)r   Úothers     r   Ú__eq__zRZZGate.__eq__Á   s-   € Ý�e�WÑ%Ô%ð 	3Ø×+Ò+¨EÑ2Ô2Ð2Øˆur   r8   )r   r   r   r   )r   NNN)r/   r0   r   r1   r2   r3   r4   r5   )F)r4   r@   )NN)rL   rG   r4   r@   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   r   Ú_standard_gater   r.   r>   rB   rK   rN   rR   Ú__classcell__)r   s   @r   r   r      s  ø€ € € € € ð?ð ?ðB "Ô)€Nð AEðWØRVÐ]aðWð Wð Wð Wð Wð Wð Wð Wðð ð ð8  !Ø Ø'+Ø!%ðð ð ð ð ð ð ðB(ð (ð (ð (ð (ð
ð 
ð 
ð 
ð")ð )ð )ð )ð )ðð ð ð ð ð ð r   r   N)rV   Ú
__future__r   Úcmathr   Útypingr   Úqiskit.circuit.gater   Úqiskit.circuit.quantumregisterr   Ú"qiskit.circuit.parameterexpressionr   r	   Úqiskit._accelerate.circuitr
   r   © r   r   ú<module>ra      sÏ   ðð "Ð !à "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ø :Ð :Ð :Ð :Ð :Ð :Ø VÐ VÐ VÐ VÐ VÐ VÐ VÐ VØ 3Ð 3Ð 3Ð 3Ð 3Ð 3ðkð kð kð kð kˆdñ kô kð kð kð kr   