§
    ¹³ÙgÌ  ã                  ó‚   — d 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
 ddlmZmZ  G d„ d	e¦  «        Zdd„Z	 ddd„ZdS )z)Instantaneous quantum polynomial circuit.é    )Úannotations)ÚSequenceN)ÚQuantumCircuit)Údeprecate_func)Úpy_iqpÚpy_random_iqpc                  óL   ‡ — e Zd ZdZ eddd¬¦  «        dˆ fd
„¦   «         Zˆ xZS )ÚIQPa­  Instantaneous quantum polynomial (IQP) circuit.

    The circuit consists of a column of Hadamard gates,
    a column of powers of T gates,
    a sequence of powers of CS gates (up to
    :math:`\frac{n^2-n}{2}` of them),
    and a final column of Hadamard gates, as introduced in [1].

    The circuit is parameterized by an n x n interactions matrix.
    The powers of each T gate are given by the diagonal elements
    of the interactions matrix. The powers of the CS gates are
    given by the upper triangle of the interactions matrix.

    **Reference Circuit:**

    .. plot::
       :alt: Diagram illustrating the previously described circuit.

       from qiskit.circuit.library import IQP
       A = [[6, 5, 3], [5, 4, 5], [3, 5, 1]]
       circuit = IQP(A)
       circuit.draw('mpl')

    **Expanded Circuit:**

        .. plot::
           :alt: Diagram illustrating the previously described circuit.

           from qiskit.circuit.library import IQP
           from qiskit.visualization.library import _generate_circuit_library_visualization
           A = [[6, 5, 3], [5, 4, 5], [3, 5, 1]]
           circuit = IQP(A)
           _generate_circuit_library_visualization(circuit.decompose())

    **References:**

    [1] M. J. Bremner et al. Average-case complexity versus approximate
    simulation of commuting quantum computations,
    Phys. Rev. Lett. 117, 080501 (2016).
    `arXiv:1504.07999 <https://arxiv.org/abs/1504.07999>`_
    z1.3z4Use the qiskit.circuit.library.iqp function instead.T)ÚsinceÚadditional_msgÚpendingÚinteractionsúlist | np.ndarrayÚreturnÚNonec                óÊ   •— t          |¦  «        } t          ¦   «         j        |j        d|j        iŽ |                      |                     ¦   «         | j        d¬¦  «         dS )z¹Create IQP circuit.

        Args:
            interactions: input n-by-n symmetric matrix.

        Raises:
            CircuitError: if the inputs is not as symmetric matrix.
        ÚnameT)ÚqubitsÚinplaceN)ÚiqpÚsuperÚ__init__Úqregsr   ÚcomposeÚto_gater   )Úselfr   ÚcircuitÚ	__class__s      €úP/granary/edev/quantum/lib/python3.11/site-packages/qiskit/circuit/library/iqp.pyr   zIQP.__init__C   s\   ø€ õ �lÑ#Ô#ˆØ�‰ŒÔ˜'œ-Ð;¨g¬lÐ;Ð;Ð;Ø�Š�W—_’_Ñ&Ô&¨t¬{ÀDˆÑIÔIÐIÐIÐIó    )r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ú__classcell__)r   s   @r   r
   r
      s{   ø€ € € € € ð(ð (ðT €^ØØMØðñ ô ð
Jð Jð Jð Jð Jñô ð
Jð Jð Jð Jð Jr    r
   r   úSequence[Sequence[int]]r   r   c                óJ  — t          | ¦  «        }t          j        | ¦  «                             t          j        ¦  «        } |dk     r0| �.t          j        | ¦  «        }d|                     dd¦  «        z   }nd}t          j        t          | ¦  «        d¬¦  «        }||_
        |S )	a�  Instantaneous quantum polynomial time (IQP) circuit.

    The circuit consists of a column of Hadamard gates, a column of powers of T gates,
    a sequence of powers of CS gates (up to :math:`\frac{n^2-n}{2}` of them), and a final column of
    Hadamard gates, as introduced in [1].

    The circuit is parameterized by an :math:`n \times n` interactions matrix. The powers of each
    T gate are given by the diagonal elements of the interactions matrix. The powers of the CS gates
    are given by the upper triangle of the interactions matrix.

    **Reference Circuit:**

    .. plot::
       :alt: Diagram illustrating the previously described circuit.

       from qiskit.circuit.library import iqp
       A = [[6, 5, 3], [5, 4, 5], [3, 5, 1]]
       circuit = iqp(A)
       circuit.draw("mpl")

    **Expanded Circuit:**

        .. plot::
           :alt: Diagram illustrating the previously described circuit.

           from qiskit.circuit.library import iqp
           from qiskit.visualization.library import _generate_circuit_library_visualization
           A = [[6, 5, 3], [5, 4, 5], [3, 5, 1]]
           circuit = iqp(A)
           _generate_circuit_library_visualization(circuit)

    **References:**

    [1] M. J. Bremner et al. Average-case complexity versus approximate
    simulation of commuting quantum computations,
    Phys. Rev. Lett. 117, 080501 (2016).
    `arXiv:1504.07999 <https://arxiv.org/abs/1504.07999>`_

    Args:
        interactions: The interactions as symmetric square matrix. If ``None``, then the
            ``num_qubits`` argument must be set and a random IQP circuit will be generated.

    Returns:
        An IQP circuit.
    é   Nziqp:ú
ú;r   T©Úadd_regs)ÚlenÚnpÚasarrayÚastypeÚint64Ú	array_strÚreplacer   Ú_from_circuit_datar   r   )r   Ú
num_qubitsÚlabelr   r   s        r   r   r   V   s˜   € õb �\Ñ"Ô"€JÝ”:˜lÑ+Ô+×2Ò2µ2´8Ñ<Ô<€Lð �A‚~€~˜,Ð2Ý”˜\Ñ*Ô*ˆØ˜Ÿš d¨CÑ0Ô0Ñ0ˆˆàˆåÔ/µ°|Ñ0DÔ0DÈtÐTÑTÔT€GØ€G„LØ€Nr    r5   ÚintÚseedú
int | Nonec                ó\   — t          j        t          | |¦  «        d¬¦  «        }d|_        |S )a?  A random instantaneous quantum polynomial time (IQP) circuit.

    See :func:`iqp` for more details on the IQP circuit.

    Example:

    .. plot::
       :alt: Circuit diagram output by the previous code.
       :include-source:

       from qiskit.circuit.library import random_iqp

       circuit = random_iqp(3)
       circuit.draw("mpl")

    Args:
        num_qubits: The number of qubits in the circuit.
        seed: A seed for the random number generator, in case the interactions matrix is
            randomly generated.

    Returns:
        An IQP circuit.
    Tr+   r   )r   r4   r   r   )r5   r8   r   s      r   Ú
random_iqpr;   –   s0   € õ8 Ô/µ¸jÈ$Ñ0OÔ0OÐZ^Ð_Ñ_Ô_€GØ€G„LØ€Nr    )r   r&   r   r   )N)r5   r7   r8   r9   r   r   )r$   Ú
__future__r   Úcollections.abcr   Únumpyr.   Úqiskit.circuitr   Úqiskit.utils.deprecationr   Ú"qiskit._accelerate.circuit_libraryr   r   r
   r   r;   © r    r   ú<module>rC      sé   ðð 0Ð /à "Ð "Ð "Ð "Ð "Ð "Ø $Ð $Ð $Ð $Ð $Ð $à Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø DÐ DÐ DÐ DÐ DÐ DÐ DÐ Dð;Jð ;Jð ;Jð ;Jð ;Jˆ.ñ ;Jô ;Jð ;Jð|=ð =ð =ð =ðD ðð ð ð ð ð ð r    