
    z	i*                         S r SSKJr  SSKrSSKrSSKJrJrJ	r	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
KJr  S rSS jrS rS r    SS jrS\4S jrS rSS jrS rg)z8This module contains common utils for vf2 layout passes.    )defaultdictN)	PyDiGraphPyGraphconnected_componentsweakly_connected_components)	ForLoopOp)circuit_to_dag)Target)
vf2_layout)NLayout)ErrorMapc                    ^ [        UR                  5       5      mU4S j[        UR                  5       5       nU R                   H  nXB;  d  M
  [        U5      X$'   M     U$ )zOAllocate the idle virtual qubits in the input DAG to arbitrary physical qubits.c              3   6   >#    U  H  oT;  d  M
  Uv   M     g 7fN ).0qused_physicals     c/home/james-whalen/.local/lib/python3.13/site-packages/qiskit/transpiler/passes/layout/vf2_utils.py	<genexpr>'allocate_idle_qubits.<locals>.<genexpr>!   s     V#;a?U#;s   		)setget_physical_bitsrange
num_qubitsqubitsnext)dagtargetlayoutunused_physicalsbitr   s        @r   allocate_idle_qubitsr#      sV     0023MV5):):#;Vzz/0FK  M    c           	        ^^^	^
^ U(       a	  [        SS9O[        SS9m	0 m
0 m " S S[        5      mUUU	U
U4S jm T" U SU R                   Vs0 s H  o"U_M     sn5        0 nU(       d  [	        T	5      nO[        T	5      nU HE  n[        U5      S:X  d  M  UR                  5       nT	U   X6'   U(       a  M4  T	R                  U5        MG     T	T
TU4$ s  snf ! T a     gf = f)z&Build an interaction graph from a dag.F
multigraphc                       \ rS rSrSrSrg)2build_interaction_graph.<locals>.MultiQEncountered.   z;Used to singal an error-status return from the DAG visitor.r   N)__name__
__module____qualname____firstlineno____doc____static_attributes__r   r$   r   MultiQEncounteredr)   .   s    Ir$   r1   c           	      D  > U R                  SS9 GH  nUR                  5       (       a  [        UR                  [        5      (       a&  [        UR                  R                  S   5      U-  nOUnUR                  R                   HL  n[        UR                  UR                  5       VVs0 s H
  u  pgXrU   _M     nnnT" [        U5      XH5        MN     M  [        UR                  5      n	UR                   V
s/ s H  oU
   PM	     nn
U	S:X  at  US   T;  aK  [        [        5      nXR                  ==   U-  ss'   TR                  U5      TUS   '   US   TTUS      '   O TTUS         UR                  ==   U-  ss'   U	S:X  a  US   T;  a2  TR                  [        [        5      5      TUS   '   US   TTUS      '   US   T;  a2  TR                  [        [        5      5      TUS   '   US   TTUS      '   TUS      TUS      4nTR                   " U6 (       a%  TR"                  " U6 UR                  ==   U-  ss'   O9[        [        5      nXR                  ==   U-  ss'   TR$                  " / UQUP76   U	S:  d  GM|  T" 5       e   g s  snnf s  sn
f )NF)include_directivesr         )op_nodesis_control_flow
isinstanceopr   lenparamsblockszipqargsr   r	   r   intnameadd_nodehas_edgeget_edge_dataadd_edge)r   weightwire_mapnodeinner_weightblockouterinnerinner_wire_maplen_argsr   r>   weightsedger1   _visitim_graphim_graph_node_mapreverse_im_graph_node_maps                 r   rP   'build_interaction_graph.<locals>._visit1   s   LLEL:D##%%dggy11#&tww~~a'8#9F#BL#)L!WW^^ECFtzzSXS_S_C`&C`<5.C` # & >%0,O	 ,
 4::H*.**5*Qa[*E51}8#44)#.GII&&0&2:2C2CG2L%eAh/MRSTX-.?a.IJ.uQx89$))DND1}8#442:2C2CKPSDT2U%eAh/MRSTX-.?a.IJ8#442:2C2CKPSDT2U%eAh/MRSTX-.?a.IJ)%(35FuQx5PQ$$d+**D1$))<F<)#.GII&&0&%%5t5W5!|'))K ;& 6s   -J
<Jr4   N)	r   r   	Exceptionr   r   r   r:   popremove_node)r   strict_directionr"   
free_nodes	conn_compcompindexr1   rP   rQ   rR   rS   s          @@@@@r   build_interaction_graphr]   (   s    .>yE*GW\D]H "JI J&* &*PsACJJ7JSSJ78 J(2	/9	t9>HHJE (J##$$U+  &(A:MM' 8 s#   C CC C C! C!c           
          [         R                  " U R                  5       R                  5        Vs/ s H(  oS   US   4[	        US   R                  5       5      4PM*     sn5      $ s  snf )z"Generate an edge list for scoring.r   r4   r5   )r   EdgeListedge_index_mapvaluessum)rQ   rO   s     r   build_edge_listrc   p   s^    AIAXAXAZAaAaAcdAc7DG
c$q'.."23	4Acd ds   /A'c                     [         R                  " [        U 5      [         R                  S9nUR	                  5        H!  n [        X   R	                  5       5      X#'   M#     U$ ! [         a     M4  f = f)z Generate a bit list for scoring.)dtype)npzerosr:   int32ra   rb   
IndexError)rQ   bit_mapbit_list
node_indexs       r   build_bit_listrm   w   sd    xxHRXX6Hnn&
	#&x';'B'B'D#EH  ' O  		s   A$$
A21A2c	                     U(       a-  [        [        U5      [        UR                  5       5      5      n	OSn	[        XS-   U	S-   5      n
Uc  [        XB5      nUc  [	        U5      n[
        R                  " XX
XV5      $ )z*Score a layout given an average error map.r   r4   )maxra   r   rm   rc   r   score_layout)avg_error_maplayout_mappingrj   _reverse_bit_maprQ   rX   run_in_parallel	edge_listrk   sizenlayouts              r   rp   rp      sz     3~&N,A,A,C(DEnQhq9G!(4#H-	""]5E r$   returnc                 N    [         R                  " SS/U R                  5       U S9$ )zZBuild a dummy target with no error rates that represents the coupling in ``coupling_map``.ucx)basis_gatesr   coupling_map)r
   from_configurationrv   )r}   s    r   build_dummy_targetr      s+     $$$KL,=,=,?l r$   c           	      z   SnU b8  U R                   b+  U R                  n[        [        U R                   5      5      nODUb6  UR	                  5       n[        X!R
                  R                  5       -   5      nO[        S5      nSnU b  U R                   b  U R                    H  nUc  M  SnSnU R                  U5       H>  nX   R                  US5      n	U	c  M  U	R                  c  M+  US-  nXiR                  -  nM@     US:  d  Mg  [        U5      S:X  a
  US   US   4nUR                  XVU-  5        SnM     U(       d  U b  Uc  U R                  5       nU(       d  Ub  Ub  [        U5       Hq  n
[        UR
                  R                  U
5      5      nUR                  UR
                  R!                  U
5      5        [        U5      nUR                  X4X-  5        Ms     UR
                  R#                  5        H1  nUR                  XUS   US   4   X=S   US   4   -   S-  5        SnM3     U(       a  U$ g)zJBuild an average error map used for scoring layouts pre-basis translation.r   NFg        r4   Tr5   )r>   r   r   r:   rv   graph	num_edgesoperation_names_for_qargsgeterror	add_errorbuild_coupling_mapr   r   successor_indicesupdatepredecessor_indicesru   )r   r}   r   avg_mapbuiltr>   
qarg_errorcountr9   
inst_propsqubitneighbor_setdegreerO   s                 r   build_average_error_mapr      s-   Jfll6&&
3v||,-		!!&&(
:(:(:(D(D(FFG
 1+Efll6\\E}JE66u=#Z^^E48
)j.>.>.JQJE"2"22J	 >
 qyu:?"1XuQx0E!!%e);< "$ V'L,@002\-*2H:&E|11CCEJKL 2 2 F Fu MN&Funf.AB	 '
 !&&002DdT!Wd1g-=%>aRVWXRYIYAZ%Z^_$_`E 3 r$   c                    U(       a  U R                   nOU R                   R                  SS9n[        UR                  5       5      nUS:w  a  [        R
                  " U5      R                  U5        [        U5      " 5       nUR                  U5        UR                  5        Vs/ s H  odUS      XFS      4PM     nnUR                  U5        [        [        U5      S S9 VV	s/ s H  u  pUPM	     nnn	UnX44$ s  snf s  sn	nf )z5Create a shuffled coupling graph from a coupling map.Fr&   r   r4   c                     U S   $ )Nr4   r   )items    r   <lambda>(shuffle_coupling_graph.<locals>.<lambda>   s	    tTUwr$   key)r   to_undirectedlistnode_indexesrandomRandomshuffletypeadd_nodes_fromru   add_edges_from_no_datasorted	enumerate)
r}   seedrX   cm_graphcm_nodesshuffled_cm_graphrO   	new_edgeskvs
             r   shuffle_coupling_graphr      s    %%%%33u3EH))+,Hrzd##H- N,((2HPHZHZH\]H\tAw'q'):;H\	]00;"(8)<BV"WX"W$!A"WX$	 ^Xs   %C='Dc                   ^ ^ T (       d  U$ Tb@  [        [        [        U5      5      UR                  5       R	                  5       -
  U4S jS9nO<[        [        [        U5      5      UR                  5       R	                  5       -
  5      n[        T U 4S jS9 H1  nU(       d    gUR                  S5      nUR                  X6   U5        M3     U$ )zAdd any free nodes to a layout.Nc                 *   > TR                  X 4S5      $ )Ng      ?)r   )r"   rq   s    r   r   !map_free_qubits.<locals>.<lambda>   s    M--sj#>r$   r   c                 <   > [        TU    R                  5       5      $ r   )rb   ra   )xrY   s    r   r   r      s    SA9M9M9O5Pr$   r   )r   r   r   r   keysr   rV   add)rY   partial_layoutnum_physical_qubitsreverse_bit_maprq   free_qubitsim_indexselected_qubits   `   `   r   map_free_qubitsr      s      )*+n.N.N.P.U.U.WW>
 )*+n.N.N.P.U.U.WW
 :+PQ$+?4nE	 R
 r$   )T)FFNN) r/   collectionsr   r   numpyrf   	rustworkxr   r   r   r   qiskit.circuitr   qiskit.convertersr	   qiskit.transpiler.targetr
   qiskit._accelerater   qiskit._accelerate.nlayoutr   qiskit._accelerate.error_mapr   r#   r]   rc   rm   rp   r   r   r   r   r   r$   r   <module>r      sq    ? #   [ [ $ , + ) . 1ENP( 4 0f$r$   