§
    º³Ùgð  ã                   ó†   — d Z ddl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 ddlmZ ddlmZ  G d	„ d
e¦  «        Zdd„ZdS )z?Choose a Layout by finding the most connected subset of qubits.é    N)ÚLayout)ÚAnalysisPass)ÚTranspilerError)Údisjoint_utils)Údeprecate_arg)Úbest_subsetc                   ób   ‡ — e Zd ZdZ eddddd¬¦  «        dˆ fd	„	¦   «         Zd
„ Zd„ Zd„ Zˆ xZ	S )ÚDenseLayoutau  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``.
    Úbackend_propz1.4ÚQiskitzin Qiskit 2.0a  The BackendProperties data structure has been deprecated and will be removed in Qiskit 2.0. The `target` input argument should be used instead. You can use Target.from_configuration() to build the target from the properties object, but in 2.0 you will need to generate a target directly.)ÚnameÚsinceÚpackage_nameÚremoval_timelineÚadditional_msgNc                 óº   •— t          ¦   «                              ¦   «          || _        || _        || _        d| _        |�|                     ¦   «         | _        dS dS )a  DenseLayout initializer.

        Args:
            coupling_map (Coupling): directed graph representing a coupling map.
            backend_prop (BackendProperties): backend properties object
            target (Target): A target representing the target backend.
        N)ÚsuperÚ__init__Úcoupling_mapr   ÚtargetÚadjacency_matrixÚbuild_coupling_map)Úselfr   r   r   Ú	__class__s       €úb/granary/edev/quantum/lib/python3.11/site-packages/qiskit/transpiler/passes/layout/dense_layout.pyr   zDenseLayout.__init__)   sb   ø€ õ$ 	‰Œ×ÒÑÔÐØ(ˆÔØ(ˆÔØˆŒØ $ˆÔØÐØ &× 9Ò 9Ñ ;Ô ;ˆDÔÐÐð Ðó    c                 óZ  — | j         €t          d¦  «        ‚t          j        || j        €| j         n| j        | j        ¦  «        }i }|D ]}|                     |¦  «         Œt          |¦  «        }|j         	                    ¦   «         D ]}| 
                    |¦  «         Œ|| j        d<   dS )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.Úlayout)r   r   r   Ú"run_pass_over_connected_componentsr   Ú
_inner_runÚupdater   ÚqregsÚvaluesÚadd_registerÚproperty_set)r   ÚdagÚlayout_componentsÚlayout_mappingÚ	componentr   Úqregs          r   ÚrunzDenseLayout.runC   sÔ   € ð ÔÐ$Ý!Ø_ñô ð õ +ÔMØØ!%¤Ð!4ˆDÔÐ¸$¼+ØŒOñ
ô 
Ðð
 ˆØ*ð 	-ð 	-ˆIØ×!Ò! )Ñ,Ô,Ð,Ð,Ý˜Ñ'Ô'ˆØ”I×$Ò$Ñ&Ô&ð 	&ð 	&ˆDØ×Ò Ñ%Ô%Ð%Ð%Ø&,ˆÔ˜(Ñ#Ð#Ð#r   c                 ó¶  ‡‡— t          |j        ¦  «        }|‰                     ¦   «         k    rt          d¦  «        ‚d}d}| j        �d}d}nR|                     d¬¦  «        }d|                     ¦   «         v r|d         }d|                     ¦   «         v r|d         }|                      |||‰¦  «        Šˆˆfd„t          |j        ¦  «        D ¦   «         }|S )	Nz%Number of qubits greater than device.r   é   T)ÚrecurseÚcxÚmeasurec                 óX   •— i | ]&\  }}|‰j         t          ‰|         ¦  «                 “Œ'S © )ÚgraphÚint)Ú.0ÚiÚqubitÚbest_subr   s      €€r   ú
<dictcomp>z*DenseLayout._inner_run.<locals>.<dictcomp>s   s@   ø€ ð 
ð 
ð 
Ù<D¸A¸uˆE�<Ô%¥c¨(°1¬+Ñ&6Ô&6Ô7ð
ð 
ð 
r   )	ÚlenÚqubitsÚsizer   r   Ú	count_opsÚkeysÚ_best_subsetÚ	enumerate)	r   r&   r   Únum_dag_qubitsÚnum_cxÚnum_measÚopsr(   r8   s	     `     @r   r    zDenseLayout._inner_run`   sü   øø€ Ý˜SœZ™œˆØ˜L×-Ò-Ñ/Ô/Ò/Ð/Ý!Ð"IÑJÔJÐJØˆØˆàŒ;Ð"ØˆFØˆHˆHð —-’-¨�-Ñ-Ô-ˆCØ�s—x’x‘z”zÐ!Ð!Ø˜Tœ�Ø˜CŸHšH™JœJÐ&Ð&Ø˜yœ>�à×$Ò$ ^°X¸vÀ|ÑTÔTˆð
ð 
ð 
ð 
ð 
ÝHQÐRUÔR\ÑH]ÔH]ð
ñ 
ô 
ˆð Ðr   c           	      óD  — ddl m}m} |dk    rt          j        dg¦  «        S |dk    rg S t          j        |j        ¦  «        }d„ t          |j         	                    ¦   «         ¦  «        D ¦   «         }t          |                     ¦   «         || j        | j        | j        ¬¦  «        \  }	}
t          |||||
|j        |	¦  «        \  }}}dgt#          |¦  «        z  } ||||ff||f¬¦  «                             ¦   «         }|                     |¦  «        }||         }|S )zîComputes 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-   c                 ó   — i | ]\  }}||“Œ	S r2   r2   )r5   ÚkÚvs      r   r9   z,DenseLayout._best_subset.<locals>.<dictcomp>‰   s   € ÐTÐTÐT¡d a¨˜Q ÐTÐTÐTr   )r   r   r   )Úshape)Úscipy.sparserF   rG   ÚnpÚarrayÚ	rustworkxr   r3   r@   ÚnodesÚ_build_error_matrixr<   r   r   r   r   Úis_symmetricr:   ÚtocsrÚreverse_cuthill_mckee)r   Ú
num_qubitsrC   rB   r   rF   rG   r   Úreverse_index_mapÚ	error_matÚ	use_errorÚrowsÚcolsÚbest_mapÚdataÚsp_sub_graphÚperms                    r   r?   zDenseLayout._best_subsetx   sP  € ð 	5Ð4Ð4Ð4Ð4Ð4Ð4Ð4à˜Š?ˆ?Ý”8˜Q˜C‘=”=Ð Ø˜Š?ˆ?ØˆIå$Ô5°lÔ6HÑIÔIÐØTÐT­i¸Ô8J×8PÒ8PÑ8RÔ8RÑ.SÔ.SÐTÑTÔTÐå2Ø×ÒÑÔØØÔ*ØÔ*Ø”;ð 
ñ  
ô  
Ñˆ	�9õ  +ØØØØØØÔ%Øñ 
ô  
Ñˆˆd�Hð ˆs•S˜‘Y”Y‰ˆØ!�z 4¨$°¨Ð"6¸zÈ:Ð>VÐWÑWÔW×]Ò]Ñ_Ô_ˆØ×,Ò,¨\Ñ:Ô:ˆØ˜D”>ˆØˆr   ©NNN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r+   r    r?   Ú__classcell__)r   s   @r   r
   r
      s¦   ø€ € € € € ð	ð 	ð €]ØØØØ(ðJð	ñ 	ô 	ð<ð <ð <ð <ð <ñ	ô 	ð<ð -ð -ð -ð:ð ð ð0(ð (ð (ð (ð (ð (ð (r   r
   c                 óÐ  ‡— t          j        | | f¦  «        }d}|��|j        �ú|j        D ]ñ}t          |¦  «        dk    rŒd}|                     |¦  «        }	|	D ]<}
||
                              |d ¦  «        }|�|j        �t          ||j        ¦  «        }Œ=|}t          ˆfd„|D ¦   «         ¦  «        rŒŠt          |¦  «        dk    r‰|d                  }|||         |<   d}Œ¹t          |¦  «        dk    r%||‰|d                           ‰|d                  <   d}ŒònÆ|rÄ|rÂd„ |j	        D ¦   «         }| 
                    ¦   «         D ]S}|                     |¦  «        }|�:|d         ‰vs
|d         ‰vrŒ.||‰|d                           ‰|d                  <   d}ŒTt          |j        ¦  «        D ]4\  }}|‰vrŒ
|D ]'}|j        d	k    r‰|         }|j        ||         |<   d}Œ(Œ5||fS )
NFé   g        c              3   ó    •K  — | ]}|‰vV — Œ	d S )Nr2   )r5   r7   Ú	qubit_maps     €r   ú	<genexpr>z&_build_error_matrix.<locals>.<genexpr>·   s(   øè è € Ð=Ð=¨e�5 	Ð)Ð=Ð=Ð=Ð=Ð=Ð=r   r-   r   Tc                 óˆ   — i | ]?}t          |j        ¦  «        d k    ¯t          |j        ¦  «        |j        d         j        “Œ@S )rf   r   )r:   r;   ÚtupleÚ
parametersÚvalue)r5   Úgates     r   r9   z'_build_error_matrix.<locals>.<dictcomp>Â   sM   € ð 
ð 
ð 
àÝ�4”;ÑÔ 1Ò$Ð$õ �$”+ÑÔ ¤°Ô 2Ô 8à$Ð$Ð$r   Úreadout_error)rM   ÚzerosÚqargsr:   Úoperation_names_for_qargsÚgetÚerrorÚmaxÚanyÚgatesÚ	get_edgesr@   r;   r   rm   )rU   rh   r   r   r   rW   rX   rq   rt   rD   ÚopÚpropsÚ	max_errorr7   Ú
error_dictÚedgeÚ
gate_errorÚindexÚ
qubit_dataÚitemÚmapped_indexs    `                   r   rQ   rQ   £   so  ø€ Ý”˜* jÐ1Ñ2Ô2€IØ€IØÑ˜fœlÐ6Ø”\ð 	!ð 	!ˆEå�5‰zŒz˜AŠ~ˆ~ØØˆEØ×2Ò2°5Ñ9Ô9ˆCØð 4ð 4�Ø˜rœ
Ÿš u¨dÑ3Ô3�ØÐ$¨¬Ð)@õ    u¤{Ñ3Ô3�EøØˆIÝÐ=Ð=Ð=Ð=°uÐ=Ñ=Ô=Ñ=Ô=ð Øå�5‰zŒz˜QŠˆØ! %¨¤(Ô+�Ø*3�	˜%Ô  Ñ'Ø �	�	Ý�U‘”˜q’�ØFO�	˜) E¨!¤HÔ-Ô.¨y¸¸q¼Ô/BÑCØ �	øð3	!ð4 
ð %˜,ð %ð
ð 
à$Ô*ð
ñ 
ô 
ˆ
ð
 !×*Ò*Ñ,Ô,ð 	!ð 	!ˆDØ#Ÿš¨Ñ-Ô-ˆJØÐ%Ø˜”7 )Ð+Ð+¨t°A¬w¸iÐ/GÐ/GØØDN�	˜) D¨¤GÔ,Ô-¨i¸¸Q¼Ô.@ÑAØ �	øÝ!*¨<Ô+>Ñ!?Ô!?ð 	%ð 	%ÑˆE�:Ø˜IÐ%Ð%ØØ"ð %ð %�Ø”9 Ò/Ð/Ø#,¨UÔ#3�LØ<@¼J�I˜lÔ+¨LÑ9Ø $�Iøð	%ð
 �iÐÐr   r_   )rc   ÚnumpyrM   rO   Úqiskit.transpiler.layoutr   Úqiskit.transpiler.basepassesr   Úqiskit.transpiler.exceptionsr   Úqiskit.transpiler.passes.layoutr   Úqiskit.utilsr   Úqiskit._accelerate.dense_layoutr   r
   rQ   r2   r   r   ú<module>rŠ      så   ðð FÐ Eð Ð Ð Ð Ø Ð Ð Ð à +Ð +Ð +Ð +Ð +Ð +Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø :Ð :Ð :Ð :Ð :Ð :à &Ð &Ð &Ð &Ð &Ð &à 7Ð 7Ð 7Ð 7Ð 7Ð 7ðCð Cð Cð Cð C�,ñ Cô Cð CðL3 ð 3 ð 3 ð 3 ð 3 ð 3 r   