§
    º³Ùg1*  ã                   ó¶   — d Z ddlmZ ddlZddlZddlZddlmZm	Z	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 dd„Zd„ Zd„ Z	 	 	 	 dd„Zd„ Zdd„Zd„ ZdS )z8This module contains common utils for vf2 layout passes.é    )ÚdefaultdictN)Ú	PyDiGraphÚPyGraphÚconnected_components)Ú	ForLoopOp)Úcircuit_to_dag)Ú
vf2_layout)ÚNLayout)ÚErrorMapTc                 ó®  ‡‡‡‡	‡
— |rt          d¬¦  «        nt          d¬¦  «        Ši Š	i Š
 G d„ dt          ¦  «        Šˆˆˆˆ	ˆ
fd„Š	  ‰| dd„ | j        D ¦   «         ¦  «         n# ‰$ r Y dS w xY wi }|s[t	          ‰¦  «        }|D ]I}t          |¦  «        dk    r4|                     ¦   «         }‰|         ||<   ‰                     |¦  «         ŒJ‰‰	‰
|fS )	z&Build an interaction graph from a dag.F©Ú
multigraphc                   ó   — e Zd ZdZdS )ú2build_interaction_graph.<locals>.MultiQEncounteredz;Used to singal an error-status return from the DAG visitor.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    ú_/granary/edev/quantum/lib/python3.11/site-packages/qiskit/transpiler/passes/layout/vf2_utils.pyÚMultiQEncounteredr   #   s   € € € € € ØIÐIÐIÐIr   r   c                 ój  •‡— |                       d¬¦  «        D �]˜}|                     ¦   «         r�t          |j        t          ¦  «        r#t          |j        j        d         ¦  «        |z  }n|}|j        j        D ]B}ˆfd„t          |j	        |j
        ¦  «        D ¦   «         } ‰t          |¦  «        ||¦  «         ŒCŒ¦t          |j	        ¦  «        }ˆfd„|j	        D ¦   «         }|dk    r�|d         ‰vr_t          t          ¦  «        }	|	|j        xx         |z  cc<   ‰                     |	¦  «        ‰|d         <   |d         ‰‰|d                  <   n'‰‰|d                           |j        xx         |z  cc<   |dk    �r|d         ‰vrG‰                     t          t          ¦  «        ¦  «        ‰|d         <   |d         ‰‰|d                  <   |d         ‰vrG‰                     t          t          ¦  «        ¦  «        ‰|d         <   |d         ‰‰|d                  <   ‰|d                  ‰|d                  f}
 ‰j        |
Ž r ‰j        |
Ž |j        xx         |z  cc<   n8t          t          ¦  «        }	|	|j        xx         |z  cc<    ‰j        g |
¢|	‘R Ž  |dk    r
 ‰¦   «         ‚�Œšd S )NF)Úinclude_directivesr   c                 ó(   •— i | ]\  }}|‰|         “ŒS r   r   )Ú.0ÚouterÚinnerÚwire_maps      €r   ú
<dictcomp>z;build_interaction_graph.<locals>._visit.<locals>.<dictcomp>.   s0   ø€ ð &ð &ð &Ù3?°5¸%˜˜x¨œð&ð &ð &r   c                 ó    •— g | ]
}‰|         ‘ŒS r   r   )r   Úqr   s     €r   ú
<listcomp>z;build_interaction_graph.<locals>._visit.<locals>.<listcomp>4   s   ø€ Ð5Ð5Ð5 Q�X˜a”[Ð5Ð5Ð5r   é   é   )Úop_nodesÚis_control_flowÚ
isinstanceÚopr   ÚlenÚparamsÚblocksÚzipÚqargsÚqubitsr   r   ÚintÚnameÚadd_nodeÚhas_edgeÚget_edge_dataÚadd_edge)ÚdagÚweightr   ÚnodeÚinner_weightÚblockÚinner_wire_mapÚlen_argsr.   ÚweightsÚedger   Ú_visitÚim_graphÚim_graph_node_mapÚreverse_im_graph_node_maps     `        €€€€€r   r?   z'build_interaction_graph.<locals>._visit&   s#  øø€ Ø—L’L°E�LÑ:Ô:ð %	*ñ %	*ˆDØ×#Ò#Ñ%Ô%ð 
Ý˜dœg¥yÑ1Ô1ð *Ý#& t¤w¤~°aÔ'8Ñ#9Ô#9¸FÑ#B�L�Là#)�LØ!œWœ^ð Pð P�Eð&ð &ð &ð &ÝCFÀtÄzÐSXÔS_ÑC`ÔC`ð&ñ &ô &�Nð �F�>¨%Ñ0Ô0°,ÀÑOÔOÐOÐOØÝ˜4œ:‘”ˆHØ5Ð5Ð5Ð5¨$¬*Ð5Ñ5Ô5ˆEØ˜1Š}ˆ}Ø˜”8Ð#4Ð4Ð4Ý)­#Ñ.Ô.�GØ˜DœIÐ&Ð&Ô&¨&Ñ0Ð&Ð&Ñ&Ø2:×2CÒ2CÀGÑ2LÔ2LÐ% e¨A¤hÑ/ØMRÐSTÌXÐ-Ð.?ÀÀaÄÔ.IÑJÐJàÐ.¨u°Q¬xÔ8Ô9¸$¼)ÐDÐDÔDÈÑNÐDÐDÑDØ˜1Š}‰}Ø˜”8Ð#4Ð4Ð4Ø2:×2CÒ2CÅKÕPSÑDTÔDTÑ2UÔ2UÐ% e¨A¤hÑ/ØMRÐSTÌXÐ-Ð.?ÀÀaÄÔ.IÑJØ˜”8Ð#4Ð4Ð4Ø2:×2CÒ2CÅKÕPSÑDTÔDTÑ2UÔ2UÐ% e¨A¤hÑ/ØMRÐSTÌXÐ-Ð.?ÀÀaÄÔ.IÑJØ)¨%°¬(Ô3Ð5FÀuÈQÄxÔ5PÐQ�Ø$�8Ô$ dÐ+ð 6Ø*�HÔ*¨DÐ1°$´)Ð<Ð<Ô<ÀÑFÐ<Ð<Ñ<Ð<å)­#Ñ.Ô.�GØ˜DœIÐ&Ð&Ô&¨&Ñ0Ð&Ð&Ñ&Ø%�HÔ%Ð5 tÐ5¨WÐ5Ð5Ð5Ð5Ø˜!Š|ˆ|Ø'Ð'Ñ)Ô)Ð)ñ ðI%	*ð %	*r   r$   c                 ó   — i | ]}||“ŒS r   r   )r   Úbits     r   r    z+build_interaction_graph.<locals>.<dictcomp>O   s   € Ð7Ð7Ð7 S˜˜SÐ7Ð7Ð7r   N)r   r   Ú	Exceptionr/   r   r*   ÚpopÚremove_node)r6   Ústrict_directionÚ
free_nodesÚ	conn_compÚcompÚindexr   r?   r@   rA   rB   s         @@@@@r   Úbuild_interaction_graphrM      sc  øøøøø€ à.>Ð]�y EÐ*Ñ*Ô*Ð*ÅGÐW\ÐD]ÑD]ÔD]€HØÐØ "ÐðJð Jð Jð Jð J�Iñ Jô Jð Jð&*ð &*ð &*ð &*ð &*ð &*ð &*ð &*ð &*ðPØˆˆs�AÐ7Ð7¨C¬JÐ7Ñ7Ô7Ñ8Ô8Ð8Ð8øØð ð ð Øˆtˆtðøøøð €JØð ,Ý(¨Ñ2Ô2ˆ	Øð 	,ð 	,ˆDÝ�4‰yŒy˜AŠ~ˆ~ØŸš™
œ
�Ø$,¨U¤O�
˜5Ñ!Ø×$Ò$ UÑ+Ô+Ð+øàÐ&Ð(AÀ:ÐMÐMs   Á	A& Á&A/Á.A/c                 ó†   — t          j        d„ |                      ¦   «                              ¦   «         D ¦   «         ¦  «        S )z"Generate an edge list for scoring.c                 ó|   — g | ]9}|d          |d         ft          |d                              ¦   «         ¦  «        f‘Œ:S )r   r$   r%   ©ÚsumÚvalues)r   r>   s     r   r#   z#build_edge_list.<locals>.<listcomp>e   s@   € ÐdÐdÐd¸ˆ4�Œ7�D˜”GÐ
�c $ q¤'§.¢.Ñ"2Ô"2Ñ3Ô3Ð	4ÐdÐdÐdr   )r	   ÚEdgeListÚedge_index_maprR   )r@   s    r   Úbuild_edge_listrU   b   s@   € åÔØdÐdÀ×AXÒAXÑAZÔAZ×AaÒAaÑAcÔAcÐdÑdÔdñô ð r   c                 ó  — t          j        t          | ¦  «        t           j        ¬¦  «        }|                     ¦   «         D ]=}	 t          | |                              ¦   «         ¦  «        ||<   Œ.# t          $ r Y Œ:w xY w|S )z Generate a bit list for scoring.)Údtype)ÚnpÚzerosr*   Úint32rR   rQ   Ú
IndexError)r@   Úbit_mapÚbit_listÚ
node_indexs       r   Úbuild_bit_listr_   i   s‰   € åŒx�˜H™œ­R¬XÐ6Ñ6Ô6€HØ—n’nÑ&Ô&ð ð ˆ
ð	Ý#& x°
Ô';×'BÒ'BÑ'DÔ'DÑ#EÔ#EˆH�ZÑ Ð øõ ð 	ð 	ð 	ØˆDð	øøøà€Os   Á*A0Á0
A=Á<A=Fc	                 ó*  — |r=t          t          |¦  «        t          |                     ¦   «         ¦  «        ¦  «        }	nd}	t          ||	dz   |	dz   ¦  «        }
|€t          ||¦  «        }|€t	          |¦  «        }t          j        ||| |
||¦  «        S )z*Score a layout given an average error map.r   r$   )ÚmaxrR   r
   r_   rU   r	   Úscore_layout)Úavg_error_mapÚlayout_mappingr\   Ú_reverse_bit_mapr@   rH   Úrun_in_parallelÚ	edge_listr]   ÚsizeÚnlayouts              r   rb   rb   w   s¢   € ð ð Ý•3�~Ñ&Ô&­¨N×,AÒ,AÑ,CÔ,CÑ(DÔ(DÑEÔEˆˆàˆÝ�n d¨Q¡h°°q±Ñ9Ô9€GØÐÝ! (¨GÑ4Ô4ˆØÐÝ# HÑ-Ô-ˆ	ÝÔ"Ø�)˜]¨GÐ5EÀñô ð r   c           	      ó°  — d}| �0| j         �)| j        }t          t          | j         ¦  «        ¦  «        }nO|�>|                     ¦   «         }t          ||j                             ¦   «         z   ¦  «        }nt          d¦  «        }d}| �ª| j         �£| j         D ]™}|€Œd}d}|                      |¦  «        D ]6}	| |	                              |d¦  «        }
|
�|
j	        �|dz  }||
j	        z  }Œ7|dk    r>t          |¦  «        dk    r|d         |d         f}| 
                    |||z  ¦  «         d}Œš�n@|��=t          t          ¦  «        }t          t          |j        ¦  «        ¦  «        D ]1}||f                              |                     |¦  «        ¦  «         Œ2|j        D ]K}t%          |j        ¦  «        }|j        D ]-}|j        dk    r ||                              |j        ¦  «         Œ.ŒL|                     ¦   «         D ]n\  }}t          |¦  «        dk    r|d         |d         f}n|}|d         |k    s|d         |k    rŒD| 
                    |t/          j        |¦  «        ¦  «         d}Œo|s| �|€|                      ¦   «         }|sÄ|�Ât          |¦  «        D ]P}| 
                    ||f|j                             |¦  «        |j                             |¦  «        z   |z  ¦  «         ŒQ|j                             ¦   «         D ]H}| 
                    |||d         |d         f         ||d         |d         f         z   dz  ¦  «         d}ŒI|r|S dS )	zJBuild an average error map used for scoring layouts pre-basis translation.r   NFg        r$   TÚ
gate_errorr%   )r.   Ú
num_qubitsr   r*   rh   ÚgraphÚ	num_edgesÚoperation_names_for_qargsÚgetÚerrorÚ	add_errorr   ÚlistÚranger/   ÚappendÚreadout_errorÚgatesÚtupleÚ
parametersr1   ÚvalueÚitemsÚ
statisticsÚmeanÚbuild_coupling_mapÚ
out_degreeÚ	in_degreerg   )ÚtargetÚ
propertiesÚcoupling_maprl   Úavg_mapÚbuiltr.   Ú
qarg_errorÚcountr)   Ú
inst_propsÚerrorsÚqubitÚgater/   ÚparamÚkÚvr>   s                      r   Úbuild_average_error_mapr�   ‘   sÌ  € à€JØÐ˜fœlÐ6ØÔ&ˆ
Ý�3˜vœ|Ñ,Ô,Ñ-Ô-ˆˆØ	Ð	!Ø!×&Ò&Ñ(Ô(ˆ
Ý˜:¨Ô(:×(DÒ(DÑ(FÔ(FÑFÑGÔGˆˆõ
 ˜1‘+”+ˆØ€EØÐ˜fœlÐ6Ø”\ð 	ð 	ˆEØˆ}ØØˆJØˆEØ×6Ò6°uÑ=Ô=ð 3ð 3�Ø# BœZŸ^š^¨E°4Ñ8Ô8�
ØÐ)¨jÔ.>Ð.JØ˜Q‘J�EØ *Ô"2Ñ2�JøØ�qŠyˆyÝ�u‘:”: ’?�?Ø" 1œX u¨Q¤xÐ0�EØ×!Ò! %¨°eÑ);Ñ<Ô<Ð<Ø�øñ	ð 
Ñ	Ý�TÑ"Ô"ˆÝ�3˜zÔ0Ñ1Ô1Ñ2Ô2ð 	Eð 	EˆEØ�E�8Ô×#Ò# J×$<Ò$<¸UÑ$CÔ$CÑDÔDÐDÐDØÔ$ð 	7ð 	7ˆDÝ˜4œ;Ñ'Ô'ˆFØœð 7ð 7�Ø”: Ò-Ð-Ø˜6”N×)Ò)¨%¬+Ñ6Ô6Ð6øð7ð —L’L‘N”Nð 	ð 	‰DˆAˆqÝ�1‰vŒv˜Š{ˆ{Ø˜1œ˜q œt˜��à�ð �QŒx˜:Ò%Ð%¨¨q¬°ZÒ)?Ð)?ØØ×Ò˜e¥Z¤_°QÑ%7Ô%7Ñ8Ô8Ð8ØˆEˆEð ð 3�VÐ'¨LÐ,@Ø×0Ò0Ñ2Ô2ˆØð 	�\Ð-Ý˜:Ñ&Ô&ð 	ð 	ˆEØ×ÒØ˜�ØÔ#×.Ò.¨uÑ5Ô5¸Ô8J×8TÒ8TÐUZÑ8[Ô8[Ñ[Øññô ð ð ð
 !Ô&×0Ò0Ñ2Ô2ð 	ð 	ˆDØ×Ò˜d W¨T°!¬W°d¸1´gÐ-=Ô%>ÀÈÈaÌÐRVÐWXÔRYÐIYÔAZÑ%ZÐ^_Ñ$_Ñ`Ô`Ð`ØˆEˆEØð Øˆàˆtr   c                 ó
  ‡— |r| j         }n| j                              d¬¦  «        }t          |                     ¦   «         ¦  «        Š|dk    r³t	          j        |¦  «                             ‰¦  «          t          |¦  «        ¦   «         }|                     ‰¦  «         ˆfd„| 	                    ¦   «         D ¦   «         }| 
                    |¦  «         d„ t          t          ‰¦  «        d„ ¬¦  «        D ¦   «         Š|}|‰fS )z5Create a shuffled coupling graph from a coupling map.Fr   éÿÿÿÿc                 óH   •— g | ]}‰|d                   ‰|d                  f‘ŒS )r   r$   r   )r   r>   Úcm_nodess     €r   r#   z*shuffle_coupling_graph.<locals>.<listcomp>ç   s0   ø€ Ð]Ð]Ð]À�h˜t AœwÔ'¨°$°q´'Ô):Ð;Ð]Ð]Ð]r   c                 ó   — g | ]\  }}|‘ŒS r   r   )r   r�   rŽ   s      r   r#   z*shuffle_coupling_graph.<locals>.<listcomp>é   s   € ÐXÐXÐX™$˜!˜Q�AÐXÐXÐXr   c                 ó   — | d         S )Nr$   r   )Úitems    r   ú<lambda>z(shuffle_coupling_graph.<locals>.<lambda>é   s   € ÈtÐTUÌw€ r   ©Úkey)rm   Úto_undirectedrs   Únode_indexesÚrandomÚRandomÚshuffleÚtypeÚadd_nodes_fromrg   Úadd_edges_from_no_dataÚsortedÚ	enumerate)rƒ   ÚseedrH   Úcm_graphÚshuffled_cm_graphÚ	new_edgesr“   s         @r   Úshuffle_coupling_graphr¨   Ü   s  ø€ àð FØÔ%ˆˆàÔ%×3Ò3¸uÐ3ÑEÔEˆÝ�H×)Ò)Ñ+Ô+Ñ,Ô,€HØˆr‚z€zÝŒ�dÑÔ×#Ò# HÑ-Ô-Ð-Ø*�D ™NœNÑ,Ô,ÐØ×(Ò(¨Ñ2Ô2Ð2Ø]Ð]Ð]Ð]È×HZÒHZÑH\ÔH\Ð]Ñ]Ô]ˆ	Ø×0Ò0°Ñ;Ô;Ð;ØXÐX¥&­°8Ñ)<Ô)<ÐBVÐBVÐ"WÑ"WÔ"WÐXÑXÔXˆØ$ˆØ�XÐÐr   c                 óü  ‡ ‡— ‰ s|S ‰�Vt          t          t          |¦  «        ¦  «        |                     ¦   «                              ¦   «         z
  ˆfd„¬¦  «        }nPt          t          t          |¦  «        ¦  «        |                     ¦   «                              ¦   «         z
  ¦  «        }t          ‰ ˆ fd„¬¦  «        D ]8}|s dS |                     d¦  «        }|                     ||         |¦  «         Œ9|S )zAdd any free nodes to a layout.Nc                 ó4   •— ‰                      | | fd¦  «        S )Ng      ð?)rp   )rD   rc   s    €r   r—   z!map_free_qubits.<locals>.<lambda>÷   s   ø€ ˜M×-Ò-¨s°C¨j¸#Ñ>Ô>€ r   r˜   c                 óR   •— t          ‰|                               ¦   «         ¦  «        S )NrP   )ÚxrI   s    €r   r—   z!map_free_qubits.<locals>.<lambda>ÿ   s   ø€ µS¸ÀA¼×9MÒ9MÑ9OÔ9OÑ5PÔ5P€ r   r   )r¢   Úsetrt   Úget_physical_bitsÚkeysrs   rF   Úadd)rI   Úpartial_layoutÚnum_physical_qubitsÚreverse_bit_maprc   Úfree_qubitsÚim_indexÚselected_qubits   `   `   r   Úmap_free_qubitsr·   î   s  øø€ ð ð ØÐØÐ ÝÝ•Ð)Ñ*Ô*Ñ+Ô+¨n×.NÒ.NÑ.PÔ.P×.UÒ.UÑ.WÔ.WÑWØ>Ð>Ð>Ð>ð
ñ 
ô 
ˆˆõ Ý•Ð)Ñ*Ô*Ñ+Ô+¨n×.NÒ.NÑ.PÔ.P×.UÒ.UÑ.WÔ.WÑWñ
ô 
ˆõ ˜:Ð+PÐ+PÐ+PÐ+PÐQÑQÔQð Fð FˆØð 	Ø�4�4Ø$Ÿš¨Ñ+Ô+ˆØ×Ò˜?¨8Ô4°nÑEÔEÐEÐEØÐr   )T)FFNN)r   Úcollectionsr   r|   rœ   ÚnumpyrX   Ú	rustworkxr   r   r   Úqiskit.circuitr   Úqiskit.convertersr   Úqiskit._accelerater	   Úqiskit._accelerate.nlayoutr
   Úqiskit._accelerate.error_mapr   rM   rU   r_   rb   r�   r¨   r·   r   r   r   ú<module>rÀ      sU  ðð ?Ð >à #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ø €€€à Ð Ð Ð Ø >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >à $Ð $Ð $Ð $Ð $Ð $Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø )Ð )Ð )Ð )Ð )Ð )Ø .Ð .Ð .Ð .Ð .Ð .Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1ðBNð BNð BNð BNðJð ð ðð ð ð( ØØØðð ð ð ð4Hð Hð HðVð ð ð ð$ð ð ð ð r   