§
    ¹³ÙgŠ  ã                  ó†   — d 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	 ddl
mZ  G d„ d	e¦  «        Z G d
„ de¦  «        ZdS )züPermutation circuit (the old way to specify permutations, which is required for
backward compatibility and which will be eventually deprecated) and the permutation
gate (the new way to specify permutations, allowing a variety of synthesis algorithms).
é    )ÚannotationsN)ÚQuantumCircuit)ÚGate)ÚCircuitError)Údeprecate_funcc                  óR   ‡ — e Zd ZdZ eddd¬¦  «        	 	 ddˆ fd„¦   «         Zˆ xZS )ÚPermutationz(An n_qubit circuit that permutes qubits.z1.3TzUse PermutationGate instead.)ÚsinceÚpendingÚadditional_msgNÚ
num_qubitsÚintÚpatternúlist[int] | np.ndarray | NoneÚseedú
int | NoneÚreturnÚNonec                óh  •— |�Qt          |¦  «        t          t          |¦  «        ¦  «        k    rt          d¦  «        ‚t	          j        |¦  «        }nHt          j                             |¦  «        }t	          j        |¦  «        }| 	                    |¦  «         dt	          j
        |¦  «                             dd¦  «        z   }t          ¦   «                              ||¬¦  «         ddlm}  ||¦  «        }||_        | j        }|                      |                     ¦   «         |¦  «         dS )	a+  Return an n_qubit permutation circuit implemented using SWAPs.

        Args:
            num_qubits: circuit width.
            pattern: permutation pattern, describing which qubits occupy the
                positions 0, 1, 2, etc. after applying the permutation, that
                is ``pattern[k] = m`` when the permutation maps qubit ``m``
                to position ``k``. As an example, the pattern ``[2, 4, 3, 0, 1]``
                means that qubit ``2`` goes to position ``0``, qubit ``4``
                goes to the position ``1``, etc. The pattern can also be ``None``,
                in which case a random permutation over ``num_qubits`` is
                created.
            seed: random seed in case a random permutation is requested.

        Raises:
            CircuitError: if permutation pattern is malformed.

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

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

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

               from qiskit.circuit.library import Permutation
               from qiskit.visualization.library import _generate_circuit_library_visualization
               A = [2,4,3,0,1]
               circuit = Permutation(5, A)
               _generate_circuit_library_visualization(circuit.decompose())
        NúGPermutation pattern must be some ordering of 0..num_qubits-1 in a list.Úpermutation_ú ú,)Únamer   ©Úsynth_permutation_basic)ÚsortedÚlistÚranger   ÚnpÚarrayÚrandomÚdefault_rngÚarangeÚshuffleÚ	array_strÚreplaceÚsuperÚ__init__Úqiskit.synthesis.permutationr   r   ÚqubitsÚappendÚto_gate)
Úselfr   r   r   Úrngr   r   ÚcircuitÚ
all_qubitsÚ	__class__s
            €új/granary/edev/quantum/lib/python3.11/site-packages/qiskit/circuit/library/generalized_gates/permutation.pyr)   zPermutation.__init__   s#  ø€ ðV ÐÝ�g‰Œ¥$¥u¨ZÑ'8Ô'8Ñ"9Ô"9Ò9Ð9Ý"Ø]ñô ð õ ”h˜wÑ'Ô'ˆGˆGå”)×'Ò'¨Ñ-Ô-ˆCÝ”i 
Ñ+Ô+ˆGØ�KŠK˜Ñ Ô Ð à¥¤¨WÑ 5Ô 5× =Ò =¸cÀ3Ñ GÔ GÑGˆå‰Œ×Ò˜¨$ÐÑ/Ô/Ð/ð 	IÐHÐHÐHÐHÐHà)Ð)¨'Ñ2Ô2ˆØˆŒà”[ˆ
Ø�Š�G—O’OÑ%Ô% zÑ2Ô2Ð2Ð2Ð2ó    ©NN)r   r   r   r   r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r)   Ú__classcell__©r2   s   @r3   r	   r	      sy   ø€ € € € € Ø2Ð2à€^˜%¨Ð>\Ð]Ñ]Ô]ð 26Øð	@3ð @3ð @3ð @3ð @3ð @3ñ ^Ô]ð@3ð @3ð @3ð @3ð @3r4   r	   c                  óZ   ‡ — e Zd ZdZdˆ fd„Zdd„Zd	„ Zedd„¦   «         Zddd„Z	d„ Z
ˆ xZS )ÚPermutationGatezA gate that permutes qubits.r   ú	list[int]r   r   c                ó(  •— t          |¦  «        }t          |¦  «        t          t          |¦  «        ¦  «        k    rt	          d¦  «        ‚t          j        |t
          j        ¬¦  «        }t          ¦   «          	                    d||g¬¦  «         dS )aš  Return a permutation gate.

        Args:
            pattern: permutation pattern, describing which qubits occupy the
                positions 0, 1, 2, etc. after applying the permutation, that
                is ``pattern[k] = m`` when the permutation maps qubit ``m``
                to position ``k``. As an example, the pattern ``[2, 4, 3, 0, 1]``
                means that qubit ``2`` goes to position ``0``, qubit ``4``
                goes to the position ``1``, etc.

        Raises:
            CircuitError: if permutation pattern is malformed.

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

                from qiskit.circuit.quantumcircuit import QuantumCircuit
                from qiskit.circuit.library import PermutationGate
                A = [2, 4, 3, 0, 1]
                permutation = PermutationGate(A)
                circuit = QuantumCircuit(5)
                circuit.append(permutation, [0, 1, 2, 3, 4])
                circuit.draw("mpl")

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

                from qiskit.circuit.quantumcircuit import QuantumCircuit
                from qiskit.circuit.library import PermutationGate
                from qiskit.visualization.library import _generate_circuit_library_visualization
                A = [2, 4, 3, 0, 1]
                permutation = PermutationGate(A)
                circuit = QuantumCircuit(5)
                circuit.append(permutation, [0, 1, 2, 3, 4])

                _generate_circuit_library_visualization(circuit.decompose())
        r   ©ÚdtypeÚpermutation)r   r   ÚparamsN)
Úlenr   r   r   r   r    r!   Úint32r(   r)   )r.   r   r   r2   s      €r3   r)   zPermutationGate.__init__f   s†   ø€ õV ˜‘\”\ˆ
Ý�'‰?Œ?�d¥5¨Ñ#4Ô#4Ñ5Ô5Ò5Ð5ÝØYñô ð õ ”(˜7­"¬(Ð3Ñ3Ô3ˆå‰Œ×Ò˜m¸
ÈGÈ9ÐÑUÔUÐUÐUÐUr4   Nc                ó®  ‡— |du rt          d¦  «        ‚t          | j        ¦  «        }t          j        d|z  d|z  f|¬¦  «        }t          d|z  ¦  «        D ]{}t          |¦  «        dd…                              |¦  «        ddd…         Šd                     ˆfd„| j        D ¦   «         ¦  «        }t          |ddd…         d¦  «        }d	|||f<   Œ||S )
z.Return a numpy.array for the Permutation gate.Fz9unable to avoid copy while creating an array as requestedé   r@   NéÿÿÿÿÚ c                ó    •— g | ]
}‰|         ‘ŒS © rK   )Ú.0ÚjÚbits     €r3   ú
<listcomp>z-PermutationGate.__array__.<locals>.<listcomp>¦   s   ø€ Ð#AÐ#AÐ#A¨q C¨¤FÐ#AÐ#AÐ#Ar4   é   )
Ú
ValueErrorrD   r   r    Úzerosr   ÚbinÚzfillÚjoinr   )	r.   rA   ÚcopyÚnqÚmatÚrÚpermuted_bitÚprrN   s	           @r3   Ú	__array__zPermutationGate.__array__š   sç   ø€ à�5ˆ=ˆ=ÝÐXÑYÔYÐYå�”ÑÔˆÝŒh˜˜2™˜q "™u�~¨UÐ3Ñ3Ô3ˆå�q˜"‘u‘”ð 	ð 	ˆAõ �a‘&”&˜˜˜”*×"Ò" 2Ñ&Ô& t t¨ tÔ,ˆCØŸ7š7Ð#AÐ#AÐ#AÐ#A°D´LÐ#AÑ#AÔ#AÑBÔBˆLÝ�\ $ $ B $Ô'¨Ñ+Ô+ˆBØˆC��A�‰JˆJàˆ
r4   c                ó   — |S )zParameter validation.rK   )r.   Ú	parameters     r3   Úvalidate_parameterz"PermutationGate.validate_parameter¬   s   € àÐr4   únp.ndarray[bool]c                ó   — | j         d         S )z:Returns the permutation pattern defining this permutation.r   )rC   )r.   s    r3   r   zPermutationGate.pattern°   s   € ð Œ{˜1Œ~Ðr4   FÚ	annotatedÚboolc                óJ   — ddl m} t           || j        ¦  «        ¬¦  «        S )z'Returns the inverse of the permutation.r   )Ú_inverse_pattern)r   )Ú.qiskit.synthesis.permutation.permutation_utilsre   r=   r   )r.   rb   re   s      r3   ÚinversezPermutationGate.inverseµ   s6   € ð 	TÐSÐSÐSÐSÐSåÐ'7Ð'7¸¼Ñ'EÔ'EÐFÑFÔFÐFr4   c                ó´   — ddl m} dd                     d„ | j        D ¦   «         ¦  «        › d�} || j        ¦  «        }||_        |                     ¦   «         S )Nr   r   Úpermutation__Ú_c              3  ó4   K  — | ]}t          |¦  «        V — Œd S )N)Ústr)rL   Úns     r3   ú	<genexpr>z6PermutationGate._qasm_decomposition.<locals>.<genexpr>Á   s(   è è € Ð'EÐ'E°1­¨A©¬Ð'EÐ'EÐ'EÐ'EÐ'EÐ'Er4   )r*   r   rU   r   r   r-   )r.   r   r   Úouts       r3   Ú_qasm_decompositionz#PermutationGate._qasm_decomposition½   sh   € àHÐHÐHÐHÐHÐHàH˜sŸxšxÐ'EÐ'E¸¼Ð'EÑ'EÔ'EÑEÔEÐHÐHÐHˆà%Ð% d¤lÑ3Ô3ˆØˆŒà�{Š{‰}Œ}Ðr4   )r   r>   r   r   r5   )r   r`   )F)rb   rc   r   r=   )r6   r7   r8   r9   r)   r\   r_   Úpropertyr   rg   rp   r:   r;   s   @r3   r=   r=   c   sº   ø€ € € € € Ø&Ð&ð2Vð 2Vð 2Vð 2Vð 2Vð 2Vðhð ð ð ð$ð ð ð ðð ð ñ „XððGð Gð Gð Gð Gð	ð 	ð 	ð 	ð 	ð 	ð 	r4   r=   )r9   Ú
__future__r   Únumpyr    Úqiskit.circuit.quantumcircuitr   r   Úqiskit.circuit.exceptionsr   Úqiskit.utils.deprecationr   r	   r=   rK   r4   r3   ú<module>rw      sè   ððð ð
 #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð à 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø .Ð .Ð .Ð .Ð .Ð .Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3ðD3ð D3ð D3ð D3ð D3�.ñ D3ô D3ð D3ðNcð cð cð cð c�dñ cô cð cð cð cr4   