§
    º³Ù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
mZmZmZ d„ Zd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zdd„ZdS )a‡  
Optimize the synthesis of an n-qubit circuit contains only CX gates for
linear nearest neighbor (LNN) connectivity.
The depth of the circuit is bounded by 5*n, while the gate count is approximately 2.5*n^2

References:
    [1]: Kutin, S., Moulton, D. P., Smithline, L. (2007).
         Computation at a Distance.
         `arXiv:quant-ph/0701194 <https://arxiv.org/abs/quant-ph/0701194>`_.
é    )ÚannotationsN)ÚQiskitError)ÚQuantumCircuit)Úcalc_inverse_matrixÚcheck_invertible_binary_matrixÚcol_opÚrow_opc                óV   — |                       ||f¦  «         t          |||¦  «         d S ©N)Úappendr	   )Úcx_instructionsÚmatÚaÚbs       ú^/granary/edev/quantum/lib/python3.11/site-packages/qiskit/synthesis/linear/linear_depth_lnn.pyÚ_row_op_update_instructionsr   $   s2   € à×Ò˜A˜q˜6Ñ"Ô"Ð"Ý
ˆ3��1ÑÔÐÐÐó    c                óD  — |                      ¦   «         }|                      ¦   «         }|                      ¦   «         }g }t          t          d| ¦  «        ¦  «        D ]‚}d}t          t          d| ¦  «        ¦  «        D ]$}|||f         r|sd}|}	Œt          |||	¦  «         Œ%t          t          d|¦  «        ¦  «        D ]}
||
|	f         rt	          ||||
¦  «         ŒŒƒ|D ]<}t          ||d         |d         ¦  «         t          ||d         |d         ¦  «         Œ=||fS )Nr   FTé   )ÚcopyÚreversedÚranger   r   r	   )Únr   Úmat_invÚmat_tÚ	mat_inv_tÚcx_instructions_rowsÚiÚfound_firstÚjÚfirst_jÚkÚinsts               r   Ú_get_lower_triangularr$   *   sT  € ð �(Š(‰*Œ*€CØ�HŠH‰JŒJ€EØ—’‘”€IàÐõ
 •e˜A˜q‘k”kÑ"Ô"ð Mð MˆØˆõ �%  1™+œ+Ñ&Ô&ð 	,ð 	,ˆAØ�1�a�4Œyð ,Ø"ð ,Ø"&�KØ�G�Gõ ˜3  7Ñ+Ô+Ð+øå�%  1™+œ+Ñ&Ô&ð 	Mð 	MˆAØ�1�g�:Œð MÝ+Ð,@À#ÀqÈ!ÑLÔLÐLøð	Mð
 %ð ,ð ,ˆÝˆu�d˜1”g˜t AœwÑ'Ô'Ð'Ýˆy˜$˜qœ' 4¨¤7Ñ+Ô+Ð+Ð+Ø�)ÐÐr   c                ó¦   — g }t          | ¦  «        D ]>}d}||| dz
  |z
  f         s|dz  }||| dz
  |z
  f         ¯|                     |¦  «         Œ?|S )Nr   r   )r   r   )r   r   Ú	label_arrr   r    s        r   Ú_get_label_arrr'   N   s{   € à€IÝ�1‰XŒXð ð ˆØˆØ˜˜1˜q™5 1™9˜Ô%ð 	Ø�‰FˆAð ˜˜1˜q™5 1™9˜Ô%ð 	à×Ò˜ÑÔÐÐØÐr   c                óÊ   — | |         }t          j        t          |¦  «        t          ¬¦  «        }t	          |¦  «        D ]\  }}||         r|||         z  }Œ||         rdS dS )N)ÚdtypeFT)ÚnpÚzerosÚlenÚboolÚ	enumerate)Úlabel_arr_tr   Úrowr"   Úindx_kÚw_neededÚrow_lÚ_s           r   Ú_in_linear_combinationr5   Y   ss   € à˜Œ^€FÝŒx�˜C™œ­Ð-Ñ-Ô-€Hå˜c‘N”Nð 3ð 3‰ˆˆqØˆuŒ:ð 	3ð   )¨EÔ"2Ñ2ˆHøà�Ôð ØˆuØˆ4r   c                óL   — d g| z  }t          | ¦  «        D ]}||||         <   Œ|S r   )r   )r   r&   r/   r   s       r   Ú_get_label_arr_tr7   i   s9   € à�&˜1‘*€KÝ�1‰XŒXð &ð &ˆØ$%ˆ�I˜a”LÑ!Ð!ØÐr   c           	     óÎ  — t          | ||¦  «        \  }}t          | |¦  «        }t          | |¦  «        }d}d}d}	g }
|	�s%d}t          || dz
  d¦  «        D ]é}||         ||dz            k    rÒd}t	          ||||dz            ||dz            ¦  «        rnŽt	          ||||dz            ||         z  ||dz            ¦  «        rt          |
|||dz   ¦  «         nKt	          ||||         ||dz            ¦  «        r*t          |
||dz   |¦  «         t          |
|||dz   ¦  «         ||dz            ||         c||<   ||dz   <   Œê|s|dz  }|dk    rd}	nd}t          | ¦  «        }|	�¯%|
S ©Nr   Fr   é   T)r$   r'   r7   r   r5   r   Úint)r   r   r   r   r   r&   r/   Úfirst_qubitÚempty_layersÚdoner   Úat_least_one_neededr   s                r   Ú_matrix_to_north_westr@   q   sò  € õ
 -¨Q°°WÑ=Ô=Ñ€Eˆ9õ ˜q %Ñ(Ô(€Iõ # 1 iÑ0Ô0€Kà€KØ€LØ€DØÐàñ !+à#Ðå�{ A¨¡E¨1Ñ-Ô-ð 	Pð 	PˆAð ˜Œ|˜i¨¨A©Ô.Ò.Ð.Ø&*Ð#õ *¨+°yÀ#ÀaÈ!ÁeÄ*ÈiÐXYÐ\]ÑX]ÔN^Ñ_Ô_ð 
UØå+Ø ¨C°°A±¬J¸¸Q¼Ñ,?ÀÈ1ÈqÉ5ÔAQñô ð Uõ 0Ð0DÀcÈ1ÈaÐRSÉeÑTÔTÐTÐTå+¨K¸ÀCÈÄFÈIÐVWÐZ[ÑV[ÔL\Ñ]Ô]ð UÝ/Ð0DÀcÈ1ÈqÉ5ÐRSÑTÔTÐTÝ/Ð0DÀcÈ1ÈaÐRSÉeÑTÔTÐTà1:¸1¸q¹5Ô1AÀ9ÈQÄ<Ð.�	˜!‘˜i¨¨A©Ñ.øà"ð 	Ø˜AÑˆLØ˜aÒÐØ�øàˆLå˜k˜/Ñ*Ô*ˆðC ñ !+ðF  Ðr   c                óò  — t          t          t          | ¦  «        ¦  «        ¦  «        }d}d}d}g }|sÃd}t          || dz
  d¦  «        D ]ˆ}||         ||dz            k    rqd}||||dz            f         st          |||dz   |¦  «         t          ||||dz   ¦  «         t          |||dz   |¦  «         ||dz            ||         c||<   ||dz   <   Œ‰|s|dz  }|dk    rd}nd}t	          | ¦  «        }|¯Ã|S r9   )Úlistr   r   r   r;   )	r   r   r&   r<   r=   r>   r   r?   r   s	            r   Ú_north_west_to_identityrC   ©   s[  € õ •X�e A™hœhÑ'Ô'Ñ(Ô(€IØ€KØ€LØ€DØÐàð +Ø#Ðå�{ A¨¡E¨1Ñ-Ô-ð 	Pð 	PˆAà˜Œ|˜i¨¨A©Ô.Ò.Ð.Ø&*Ð#ð ˜1˜i¨¨A©Ô.Ð.Ô/ð Uå/Ð0DÀcÈ1ÈqÉ5ÐRSÑTÔTÐTå+Ð,@À#ÀqÈ!ÈaÉ%ÑPÔPÐPÝ+Ð,@À#ÀqÈ1ÁuÈaÑPÔPÐPà1:¸1¸q¹5Ô1AÀ9ÈQÄ<Ð.�	˜!‘˜i¨¨A©Ñ.øà"ð 	Ø˜AÑˆLØ˜aÒÐØ�øàˆLå˜k˜/Ñ*Ô*ˆð5 ð +ð8  Ðr   c                óÀ   — |                       t          d¬¦  «        }t          |¦  «        }t          |¦  «        }t	          |||¦  «        }t          ||¦  «        }||fS )NT)r   )Úastyper-   r   r,   r@   rC   )r   r   Úmat_cpyr   Úcx_instructions_rows_m2nwÚcx_instructions_rows_nw2ids         r   Ú_optimize_cx_circ_depth_5n_linerI   Ò   sc   € ð �jŠj� DˆjÑ)Ô)€GÝ! 'Ñ*Ô*€GåˆG‰Œ€Aõ !6°a¸À'Ñ JÔ JÐõ "9¸¸GÑ!DÔ!DÐà$Ð&@Ð@Ð@r   r   únp.ndarray[bool]Úreturnr   c                óP  — t          | ¦  «        st          d¦  «        ‚t          | ¦  «        }t          | ¦  «        }t	          |¦  «        }|d         D ]$}|                     |d         |d         ¦  «         Œ%|d         D ]$}|                     |d         |d         ¦  «         Œ%|S )a  
    Synthesize linear reversible circuit for linear nearest-neighbor architectures using
    Kutin, Moulton, Smithline method.

    Synthesis algorithm for linear reversible circuits from [1], section 7.
    This algorithm synthesizes any linear reversible circuit of :math:`n` qubits over
    a linear nearest-neighbor architecture using CX gates with depth at most :math:`5n`.

    Args:
        mat: A boolean invertible matrix.

    Returns:
        The synthesized quantum circuit.

    Raises:
        QiskitError: if ``mat`` is not invertible.

    References:
        1. Kutin, S., Moulton, D. P., Smithline, L.,
           *Computation at a distance*, Chicago J. Theor. Comput. Sci., vol. 2007, (2007),
           `arXiv:quant-ph/0701194 <https://arxiv.org/abs/quant-ph/0701194>`_
    z#The input matrix is not invertible.r   r   )r   r   r,   rI   r   Úcx)r   Ú
num_qubitsÚcx_instÚqcÚpairs        r   Úsynth_cnot_depth_line_kmsrR   ñ   s´   € õ. *¨#Ñ.Ô.ð AÝÐ?Ñ@Ô@Ð@õ �S‘”€JÝ-¨cÑ2Ô2€GÝ	˜
Ñ	#Ô	#€BØ˜”
ð  ð  ˆØ
�Šˆd�1Œg�t˜A”wÑÔÐÐØ˜”
ð  ð  ˆØ
�Šˆd�1Œg�t˜A”wÑÔÐÐØ€Ir   )r   rJ   rK   r   )Ú__doc__Ú
__future__r   Únumpyr*   Úqiskit.exceptionsr   Úqiskit.circuitr   Ú+qiskit.synthesis.linear.linear_matrix_utilsr   r   r   r	   r   r$   r'   r5   r7   r@   rC   rI   rR   © r   r   ú<module>rZ      s+  ðð	ð 	ð #Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )Ø )Ð )Ð )Ð )Ð )Ð )ðð ð ð ð ð ð ð ð ð ð ð ðð ð ð!ð !ð !ðHð ð ðð ð ð ð ð ð5 ð 5 ð 5 ðp& ð & ð & ðRAð Að Að>#ð #ð #ð #ð #ð #r   