
    z	i                          S r SSK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KJr  SSKJr   " S	 S
\5      rSS jrg)z?Choose a Layout by finding the most connected subset of qubits.    N)Layout)AnalysisPass)TranspilerError)Target)disjoint_utils)best_subsetc                   B   ^  \ rS rSrSrSU 4S jjrS rS rS rSr	U =r
$ )	DenseLayout   aY  Choose a Layout by finding the most connected subset of qubits.

This pass associates a physical qubit (int) to each virtual qubit
of the circuit (Qubit).

Note:
    Even though a ``'layout'`` is not strictly a property of the DAG,
    in the transpiler architecture it is best passed around between passes
    by being set in ``property_set``.
c                 z   > [         TU ]  5         Xl        X l        SU l        Ub  UR                  5       U l        gg)zDenseLayout initializer.

Args:
    coupling_map (Coupling): directed graph representing a coupling map.
    target (Target): A target representing the target backend.
N)super__init__coupling_maptargetadjacency_matrixbuild_coupling_map)selfr   r   	__class__s      f/home/james-whalen/.local/lib/python3.13/site-packages/qiskit/transpiler/passes/layout/dense_layout.pyr   DenseLayout.__init__(   s?     	( $ & 9 9 ;D     c                    U R                   c  [        S5      eU R                  bs  [        R                  " UU R                  U R
                  5      nUcC  [        R                  " SS/U R                   S9n[        R                  " UUU R
                  5      nOC[        R                  " SS/U R                   S9n[        R                  " UUU R
                  5      n0 nU H  nUR                  U5        M     [        U5      nUR                  R                  5        H  nUR                  U5        M     X`R                  S'   g)a  Run the DenseLayout pass on `dag`.

Pick a convenient layout depending on the best matching
qubit connectivity, and set the property `layout`.

Args:
    dag (DAGCircuit): DAG to find layout for.

Raises:
    TranspilerError: if dag wider than self.coupling_map
NzMA coupling_map or target with constrained qargs is necessary to run the pass.ucx)basis_gatesr   layout)r   r   r   r   "run_pass_over_connected_components
_inner_runr   from_configurationupdater   qregsvaluesadd_registerproperty_set)r   daglayout_componentsr   layout_mapping	componentr   qregs           r   runDenseLayout.run6   s3    $!_  ;;" . Q Q!
 !(22!$d$:K:K %3$U$UOO%! .. $Kd6G6GF !/ Q Q!
 *I!!), +'II$$&D% '&,(#r   c           
         [        UR                  5      nX2R                  5       :  a  [        S5      eSnSnU R                  b  SnSnOAUR                  SS9nSUR                  5       ;   a  US   nSUR                  5       ;   a  US   nU R                  X5XB5      n[        UR                  5       VV	s0 s H  u  pXR                  [        Xx   5         _M!     n
nn	U
$ s  sn	nf )Nz%Number of qubits greater than device.r      T)recurser   measure)lenqubitssizer   r   	count_opskeys_best_subset	enumerategraphint)r   r%   r   num_dag_qubitsnum_cxnum_measopsbest_subiqubitr'   s              r   r   DenseLayout._inner_runf   s    SZZ--//!"IJJ;;"FH ----Csxxz!TCHHJ&y>$$^vTHQRUR\R\H]
H]HAE%%c(+&677H] 	 
 
s   5&C c           	         SSK JnJn  US:X  a  [        R                  " S/5      $ US:X  a  / $ [
        R                  " UR                  5      n[        UR                  R                  5       5       VV	s0 s H  u  pX_M	     n
nn	[        UR                  5       U
U R                  S9u  p[        UUUUUUR                  U5      u  pnS/[        U5      -  nU" UX44X4S9R!                  5       nUR#                  U5      nUU   nU$ s  sn	nf )zComputes the qubit mapping with the best connectivity.

Args:
    num_qubits (int): Number of subset qubits to consider.

Returns:
    ndarray: Array of qubits to use for best connectivity mapping.
r   )
coo_matrixcsgraphr-   )r   )shape)scipy.sparserB   rC   nparray	rustworkxr   r7   r6   nodes_build_error_matrixr2   r   r   is_symmetricr0   tocsrreverse_cuthill_mckee)r   
num_qubitsr;   r:   r   rB   rC   r   kvreverse_index_map	error_mat	use_errorrowscolsbest_mapdatasp_sub_graphperms                      r   r5   DenseLayout._best_subset~   s    	5?88QC= ?I$55l6H6HI.78J8J8P8P8R.ST.SdaQT.ST2;; 
	  +%% 
H sSY!4$"6z>VW]]_,,\:D>+ Us   4D)r   r   r   )NN)__name__
__module____qualname____firstlineno____doc__r   r*   r   r5   __static_attributes____classcell__)r   s   @r   r
   r
      s"    	<.-`0& &r   r
   c                 "  ^ [         R                  " X 45      nSnUb  UR                  b  UR                   H  n[        U5      S:  a  M  SnUR	                  U5      nU H@  nX(   R                  US 5      n	U	c  M  U	R                  c  M+  [        XiR                  5      nMB     Un
[        U4S jU 5       5      (       a  M  [        U5      S:X  a  TUS      nXU   U'   SnM  [        U5      S:X  d  M  XTUS         TUS      '   SnM     X44$ )NF   g        c              3   ,   >#    U  H	  oT;  v   M     g 7fN ).0r?   	qubit_maps     r   	<genexpr>&_build_error_matrix.<locals>.<genexpr>   s     =ue	)us   r-   r   T)	rF   zerosqargsr0   operation_names_for_qargsgeterrormaxany)rN   rh   r   rR   rS   rl   ro   r<   opprops	max_errorr?   s    `          r   rJ   rJ      s   *12IIfll6\\E5zA~E2259C
ud3$)@  {{3E  I=u===5zQ!%(+*3% ' 	UqFO)E!H-.yq/BC 	3 "4 r   re   )r_   numpyrF   rH   qiskit.transpiler.layoutr   qiskit.transpiler.basepassesr   qiskit.transpiler.exceptionsr   qiskit.transpiler.targetr   qiskit._accelerater   qiskit._accelerate.dense_layoutr   r
   rJ   rf   r   r   <module>r|      s9    F   + 5 8 + - 7H, HV r   