
    z	iW                    x    S r SSKJr  SSKrSSKJr  SSKJr  SSKJ	r	  SSK
Jr   " S S	\5      r " S
 S\5      rg)zPermutation 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S rSrSr\" SSSS9  S	       S
U 4S jjj5       rSrU =r$ )Permutation   z(An n_qubit circuit that permutes qubits.z2.1zUse PermutationGate instead.zin Qiskit 3.0)sinceadditional_msgremoval_timelinec                
  > UbC  [        U5      [        [        U5      5      :w  a  [        S5      e[        R
                  " U5      nOF[        R                  R                  U5      n[        R                  " U5      nUR                  U5        S[        R                  " U5      R                  SS5      -   n[        T	U ]5  XS9  SSKJn  U" U5      nXWl        U R"                  nU R%                  UR'                  5       U5        g)	a  
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())
NGPermutation 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)
self
num_qubitspatternseedrngr   r   circuit
all_qubits	__class__s
            n/home/james-whalen/.local/lib/python3.13/site-packages/qiskit/circuit/library/generalized_gates/permutation.pyr"   Permutation.__init__   s    ` g$uZ'8"99"]  hhw'G))''-Cii
+GKK W 5 = =c3 GG/ 	I)'2[[
GOO%z2     NN)r(   intr)   zlist[int] | np.ndarray | Noner*   z
int | NonereturnNone)	__name__
__module____qualname____firstlineno____doc__r   r"   __static_attributes____classcell__r.   s   @r/   r	   r	      sZ    25( 26	A3A3 /A3 	A3
 
A3
A3r1   r	   c                  p   ^  \ rS rSrSr    S
U 4S jjrSS jrS r\SS j5       r	SSS jjr
S rS	rU =r$ )PermutationGateh   zA gate that permutes qubits.c                   > [        U5      n[        U5      [        [        U5      5      :w  a  [	        S5      e[
        R                  " U[
        R                  S9n[        TU ]%  SX!/S9  g)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(   r.   s      r/   r"   PermutationGate.__init__k   s_    V \
'?d5#455Y  ((7"((3m
9Ur1   c                   USL a  [        S5      e[        U R                  5      n[        R                  " SU-  SU-  4US9n[        SU-  5       Hl  n[        U5      SS R                  U5      SSS2   nSR                  U R                   Vs/ s H  ovU   PM	     sn5      n[        USSS2   S5      n	SXIU4'   Mn     U$ s  snf )	z.Return a numpy.array for the Permutation gate.Fz9unable to avoid copy while creating an array as requested   rC   N    )

ValueErrorrG   r)   r   zerosr   binzfilljoinr4   )
r'   rD   copynqmatrbitjpermuted_bitprs
             r/   	__array__PermutationGate.__array__   s    5=XYYhh2q"u~U3q"uA a&*""2&tt,C77DLL#ALqFL#ABL\$B$'+BCAJ  
	 $Bs   C
c                    U$ )zParameter validation.r2   )r'   	parameters     r/   validate_parameter"PermutationGate.validate_parameter   s    r1   c                     U R                   S   $ )z:Returns the permutation pattern defining this permutation.r   )rF   )r'   s    r/   r)   PermutationGate.pattern   s     {{1~r1   c                @    SSK Jn  [        U" U R                  5      S9$ )z'Returns the inverse of the permutation.r   )_inverse_pattern)r)   ).qiskit.synthesis.permutation.permutation_utilsre   r@   r)   )r'   	annotatedre   s      r/   inversePermutationGate.inverse   s     	T'7'EFFr1   c                    SSK Jn  SSR                  S U R                   5       5       S3nU" U R                  5      nX#l        UR                  5       $ )Nr   r   permutation___c              3  8   #    U  H  n[        U5      v   M     g 7f)N)str).0ns     r/   	<genexpr>6PermutationGate._qasm_decomposition.<locals>.<genexpr>   s     'E1As   )r#   r   rS   r)   r   r&   )r'   r   r   outs       r/   _qasm_decomposition#PermutationGate._qasm_decomposition   sF    Hsxx'E'EEFaH%dll3{{}r1   r2   )r)   z	list[int]r5   r6   r3   )r5   znp.ndarray[bool])F)rg   boolr5   r@   )r7   r8   r9   r:   r;   r"   r\   r`   propertyr)   rh   rt   r<   r=   r>   s   @r/   r@   r@   h   sO    &2V2V 
2Vh$  G	 	r1   r@   )r;   
__future__r   numpyr   qiskit.circuit.quantumcircuitr   r   qiskit.circuit.exceptionsr   qiskit.utils.deprecationr   r	   r@   r2   r1   r/   <module>r}      s;   
 #  8 . 2 3I3. I3Xcd cr1   