§
    º³ÙgÁ$  ã                  óþ   — d Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
 ddlZddlZddlm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lmZ  ed¦  «        Z d%d„Z!d&d„Z"d'd„Z#d(d)d"„Z$d*d#„Z%d+d$„Z&dS ),z=This module contains common utils for disjoint coupling maps.é    )Úannotations)Údefaultdict)ÚListÚCallableÚTypeVarÚDictÚUnionN)Ú	DAGOpNode)ÚQubitÚBarrierÚClbit)Ú
DAGCircuit)Ú
DAGOutNode)ÚCouplingMap)ÚTarget)ÚTranspilerError)Ú	vf2_utilsÚTÚdagr   Úcomponents_sourceúUnion[Target, CouplingMap]Úrun_funcú&Callable[[DAGCircuit, CouplingMap], T]ÚreturnúList[T]c                ó˜  ‡— t          |t          ¦  «        r|                     d¬¦  «        }n|}|                     ¦   «         }t	          |¦  «        dk    rR|                      ¦   «         |d                              ¦   «         k    rt          d¦  «        ‚ ‰| |d         ¦  «        gS t          | ¦  «        }t          ||¦  «        }g }| 
                    ¦   «         D ]Ý\  }}	||	                     ¦   «                  }
|	D ]ž}||         } |
                     | j        ¦  «         |
                     | j        ¦  «         | j        D ]}|
                     |¦  «         Œ| j        D ]}|
                     |¦  «         Œ|
                     | | j        | j        ¬¦  «         ŒŸ|                     |
||         f¦  «         ŒÞˆfd„|D ¦   «         }|S )z<Run a transpiler pass inner function over mapped components.T©Úfilter_idle_qubitsé   r   úmA connected component of the DAGCircuit is too large for any of the connected components in the coupling map.)ÚqubitsÚclbitsc                ó.   •— g | ]\  }} ‰||¦  «        ‘ŒS © r$   )Ú.0Úout_dagÚcmapr   s      €úd/granary/edev/quantum/lib/python3.11/site-packages/qiskit/transpiler/passes/layout/disjoint_utils.pyú
<listcomp>z6run_pass_over_connected_components.<locals>.<listcomp>H   s)   ø€ Ð
LÐ
LÐ
L¡} w°ˆ8ˆ8�G˜TÑ"Ô"Ð
LÐ
LÐ
Ló    )Ú
isinstancer   Úbuild_coupling_mapÚconnected_componentsÚlenÚ
num_qubitsÚsizer   Úseparate_dagÚmap_componentsÚitemsÚpopÚ
add_qubitsr!   Ú
add_clbitsr"   ÚqregsÚadd_qregÚcregsÚadd_cregÚcomposeÚappend)r   r   r   Úcoupling_mapÚcmap_componentsÚdag_componentsÚmapped_componentsÚout_component_pairsÚ
cmap_indexÚdagsr&   Ú	dag_indexÚqregÚcregÚress     `            r(   Ú"run_pass_over_connected_componentsrH   !   s  ø€ õ Ð#¥VÑ,Ô,ð )Ø(×;Ò;ÈtÐ;ÑTÔTˆˆà(ˆØ"×7Ò7Ñ9Ô9€Oå
ˆ?ÑÔ˜qÒ Ð Ø�>Š>ÑÔ˜o¨aÔ0×5Ò5Ñ7Ô7Ò7Ð7Ý!ð2ñô ð ð �˜˜o¨aÔ0Ñ1Ô1Ð2Ð2Ý! #Ñ&Ô&€NÝ& ~°ÑGÔGÐØÐØ-×3Ò3Ñ5Ô5ð Kð KÑˆ
�Dð ! §¢¡¤Ô,ˆØð 	Gð 	GˆIØ  Ô+ˆCØ×Ò˜sœzÑ*Ô*Ð*Ø×Ò˜sœzÑ*Ô*Ð*Øœ	ð 'ð '�Ø× Ò  Ñ&Ô&Ð&Ð&Øœ	ð 'ð '�Ø× Ò  Ñ&Ô&Ð&Ð&Ø�OŠO˜C¨¬
¸3¼:ˆOÑFÔFÐFÐFØ×"Ò" G¨_¸ZÔ-HÐ#IÑJÔJÐJÐJØ
LÐ
LÐ
LÐ
LÐ8KÐ
LÑ
LÔ
L€CØ€Jr*   r?   úList[DAGCircuit]r>   úList[CouplingMap]úDict[int, List[int]]c                óê  ‡— d„ t          |¦  «        D ¦   «         Št          t          ¦  «        }t          t          | ¦  «        d„ d¬¦  «        D ]£\  }}t          t	          t          |¦  «        ¦  «        ˆfd„d¬¦  «        D ]_}|                     ¦   «         ‰|         k    r?||                              |¦  «         ‰|xx         |                     ¦   «         z  cc<    nŒ`t          d¦  «        ‚Œ¤|S )z²Returns a map where the key is the index of each connected component in cmap_components and
    the value is a list of indices from dag_components which should be placed onto it.c                ó>   — i | ]\  }}|t          |j        ¦  «        “ŒS r$   )r.   Úgraph)r%   Úindexr'   s      r(   ú
<dictcomp>z"map_components.<locals>.<dictcomp>Q   s&   € ÐXÐXÐX©k¨e°T�5�#˜dœj™/œ/ÐXÐXÐXr*   c                ó6   — | d                               ¦   «         S )Nr   )r/   )Úxs    r(   ú<lambda>z map_components.<locals>.<lambda>U   s   € °°1´·²Ñ1BÔ1B€ r*   T)ÚkeyÚreversec                ó   •— ‰|          S )Nr$   )rO   Úfree_qubitss    €r(   rS   z map_components.<locals>.<lambda>X   s   ø€ ¸;ÀuÔ;M€ r*   r    )	Ú	enumerater   ÚlistÚsortedÚranger.   r/   r<   r   )r?   r>   Úout_mappingrD   r   rB   rW   s         @r(   r2   r2   L   s0  ø€ ð
 YÐX½YÀÑ=WÔ=WÐXÑXÔX€KÝ�dÑ#Ô#€Kå Ý�.Ñ!Ô!Ð'BÐ'BÈDðñ ô ð ð ‰ˆ	�3õ !Ý•#�oÑ&Ô&Ñ'Ô'Ð-MÐ-MÐ-MÐ-MÐW[ð
ñ 
ô 
ð 	ð 	ˆJð
 �~Š~ÑÔ ;¨zÔ#:Ò:Ð:Ø˜JÔ'×.Ò.¨yÑ9Ô9Ð9Ø˜JÐ'Ð'Ô'¨3¯>ª>Ñ+;Ô+;Ñ;Ð'Ð'Ñ'Ø�ð ;õ
 "ð2ñô ð ð ð Ðr*   c                ó   — |                       t          ¦  «        D ]ò}t          |j        ¦  «        }|dk    rŒ|j        r#|j        j        › dt          j        ¦   «         › �}ndt          j        ¦   «         › �}t          ¦   «         }| 	                    d„ t          |¦  «        D ¦   «         ¦  «         t          |¦  «        D ]5}|                     t          d|¬¦  «        |j        |         fd¬¦  «         Œ6|                      ||¦  «         ŒódS )	zAMutate an input dag to split barriers into single qubit barriers.r   ú_uuid=ú_none_uuid=c                ó*   — g | ]}t          ¦   «         ‘ŒS r$   )r   )r%   Ú_s     r(   r)   z"split_barriers.<locals>.<listcomp>s   s   € ÐAÐAÐA¨!�e™gœgÐAÐAÐAr*   ©ÚlabelF)ÚqargsÚcheckN)Úop_nodesr   r.   rd   rc   ÚopÚuuidÚuuid4r   r5   r[   Úapply_operation_backr!   Úsubstitute_node_with_dag)r   Únoder/   Úbarrier_uuidÚ	split_dagÚis         r(   Úsplit_barriersrp   h   s%  € à—’�WÑ%Ô%ð 6ð 6ˆÝ˜œ‘_”_ˆ
Ø˜Š?ˆ?ØØŒ:ð 	8Ø"œgœmÐAÐAµ4´:±<´<ÐAÐAˆLˆLà7­¬©¬Ð7Ð7ˆLÝ‘L”Lˆ	Ø×ÒÐAÐA­u°ZÑ/@Ô/@ÐAÑAÔAÑBÔBÐBÝ�zÑ"Ô"ð 	ð 	ˆAØ×*Ò*Ý˜ Ð.Ñ.Ô.Ø Ô'¨Ô*Ð,Øð +ñ ô ð ð ð
 	×$Ò$ T¨9Ñ5Ô5Ð5Ð5ð!6ð 6r*   TÚretain_uuidÚboolc                ó¼  — d„ t          | j        ¦  «        D ¦   «         }i }|                      t          ¦  «        D �]}|j        �rd|j        v r|j        }nŒ||v rù||         }t          |j        ¦  «        t          |j        ¦  «        z   }|s“t          |j        t          ¦  «        r|j         	                    d¦  «        rd}n^t          |j        t          ¦  «        r?d|j        v r6d 
                    |j                             d¦  «        dd…         ¦  «        }n|}n|}t          ||¬¦  «        }	|                      ||g|	|¦  «        }
|
||<   �Œ|||<   �Œ!dS )zLMutate input dag to combine barriers with UUID labels into a single barrier.c                ó   — i | ]\  }}||“Œ	S r$   r$   )r%   rO   Úbits      r(   rP   z$combine_barriers.<locals>.<dictcomp>   s   € ÐHÐHÐH¡J E¨3�S˜%ÐHÐHÐHr*   r^   r_   Néÿÿÿÿrb   )rX   r!   rf   r   rc   r.   rd   r+   ÚstrÚ
startswithÚjoinÚsplitÚreplace_block_with_op)r   rq   Úqubit_indicesÚuuid_maprl   rm   Ú
other_noder/   rc   Únew_opÚnew_nodes              r(   Úcombine_barriersr�   }   sw  € àHÐHµ)¸C¼JÑ2GÔ2GÐHÑHÔH€MØ%'€HØ—’�WÑ%Ô%ð .ñ .ˆØŒ:ñ 	.Ø˜4œ:Ð%Ð%Ø#œz��àØ˜xÐ'Ð'Ø% lÔ3�
Ý  Ô!1Ñ2Ô2µS¸¼±_´_ÑD�
Ø"ð )Ý! $¤*­cÑ2Ô2ð -°t´z×7LÒ7LÈ]Ñ7[Ô7[ð -Ø $˜˜Ý# D¤JµÑ4Ô4ð -¸ÀTÄZÐ9OÐ9OØ (§¢¨d¬j×.>Ò.>¸xÑ.HÔ.HÈÈ"ÈÔ.MÑ NÔ N˜˜à ,˜˜à(�EÝ  °5Ð9Ñ9Ô9�Ø×4Ò4°d¸JÐ5GÈÐQ^Ñ_Ô_�Ø)1�˜Ñ&Ñ&à)-�˜Ñ&ùð-.ð .r*   c           
     ób  — t          |t          ¦  «        r|                     d¬¦  «        }n|}d„ |                     ¦   «         D ¦   «         }|                      ¦   «         D ]Í}d}t          |¦  «        D ]0\  }}|                      |j        d         ¦  «        j        |v r|} nŒ1|                      |j        d         ¦  «        j        ||         vr\t          d|                      |j        d         ¦  «        j        › d|                      |j        d         ¦  «        j        › d	�¦  «        ‚ŒÎdS )
aC  
    Check that the layout of the dag does not require connectivity across connected components
    in the CouplingMap

    Args:
        dag: DAGCircuit to check.
        components_source: Target to check against.

    Raises:
        TranspilerError: Chosen layout is not valid for the target disjoint connectivity.
    Tr   c                óZ   — g | ](}t          |j                             ¦   «         ¦  «        ‘Œ)S r$   )ÚsetrN   Únodes)r%   rR   s     r(   r)   z8require_layout_isolated_to_component.<locals>.<listcomp>¬   s*   € ÐXÐXÐX¨q•c˜!œ'Ÿ-š-™/œ/Ñ*Ô*ÐXÐXÐXr*   Nr   r   z„The circuit has an invalid layout as two qubits need to interact in disconnected components of the coupling map. The physical qubit z" needs to interact with the qubit z( and they belong to different components)
r+   r   r,   r-   Útwo_qubit_opsrX   Úfind_bitrd   rO   r   )r   r   r=   Úcomponent_setsÚinstÚcomponent_indexro   Úcomponent_sets           r(   Ú$require_layout_isolated_to_componentrŒ   š   s^  € õ Ð#¥VÑ,Ô,ð )Ø(×;Ò;ÈtÐ;ÑTÔTˆˆà(ˆØXÐX°L×4UÒ4UÑ4WÔ4WÐXÑXÔX€NØ×!Ò!Ñ#Ô#ð ð ˆØˆÝ )¨.Ñ 9Ô 9ð 	ð 	ÑˆAˆ}Ø�|Š|˜DœJ qœMÑ*Ô*Ô0°MÐAÐAØ"#�Ø�ð Bð �<Š<˜œ
 1œÑ&Ô&Ô,°NÀ?Ô4SÐSÐSÝ!ðeà—<’< ¤
¨1¤Ñ.Ô.Ô4ðeð eð Ÿš d¤j°¤mÑ4Ô4Ô:ðeð eð eñô ð ð Tðð r*   c                ó˜  ‡— t          | ¦  «         t          j        | ¦  «        \  }}Š}t          j        |¦  «        }g }|D ]#}|                     ˆfd„|D ¦   «         ¦  «         Œ$t          | j        ¦  «        }g }|D �]9}	|                      ¦   «         }
 |
j	        ||	z
  Ž  d|
_
        |                      ¦   «         D ]D}|	                     |j        ¦  «        r(|
                     |j        |j        |j        d¬¦  «         ŒEg }|
j                             ¦   «         D ]k\  }}t'          |
                     |¦  «        ¦  «        }t+          |t,          ¦  «        r/t+          |j        t0          ¦  «        r|                     |¦  «         Œl |
j        |Ž  t5          |
¦  «         |                     |
¦  «         �Œ;t5          | d¬¦  «         |S )z6Separate a dag circuit into it's connected components.c                ó    •— h | ]
}‰|         ’ŒS r$   r$   )r%   rR   Ú	qubit_maps     €r(   ú	<setcomp>zseparate_dag.<locals>.<setcomp>Ä   s   ø€ Ð AÐ AÐ A°! ¨1¤Ð AÐ AÐ Ar*   r   F)re   )rq   )rp   r   Úbuild_interaction_graphÚrxÚweakly_connected_componentsr<   r„   r!   Úcopy_empty_likeÚremove_qubitsÚglobal_phaseÚtopological_op_nodesÚ
issupersetrd   rj   rg   ÚcargsÚ	input_mapr3   ÚnextÚ
successorsr+   r   Úwirer   Úremove_clbitsr�   )r   Úim_graphra   Ú__r-   Úcomponent_qubitsÚ	componentr!   Údecomposed_dagsÚ
dag_qubitsÚnew_dagrl   Úidle_clbitsru   Ú	succ_noder�   s                  @r(   r1   r1   ¼   s÷  ø€ õ �3ÑÔÐÝ!*Ô!BÀ3Ñ!GÔ!GÑ€Hˆa�˜BÝÔ9¸(ÑCÔCÐØÐØ)ð Cð Cˆ	Ø×ÒÐ AÐ AÐ AÐ A°yÐ AÑ AÔ AÑBÔBÐBÐBå�”‰_Œ_€Fà€OØ&ð (ñ (ˆ
Ø×%Ò%Ñ'Ô'ˆØˆÔ˜v¨
Ñ2Ð3Ð3Ø ˆÔØ×,Ò,Ñ.Ô.ð 	[ð 	[ˆDØ×$Ò$ T¤ZÑ0Ô0ð [Ø×,Ò,¨T¬W°d´jÀ$Ä*ÐTYÐ,ÑZÔZÐZøØˆØ Ô*×0Ò0Ñ2Ô2ð 	(ð 	(‰IˆC�Ý˜W×/Ò/°Ñ5Ô5Ñ6Ô6ˆIÝ˜)¥ZÑ0Ô0ð (µZÀ	ÄÕPUÑ5VÔ5Vð (Ø×"Ò" 3Ñ'Ô'Ð'øØˆÔ˜{Ð+Ð+Ý˜Ñ!Ô!Ð!Ø×Ò˜wÑ'Ô'Ð'Ñ'õ �S eÐ,Ñ,Ô,Ð,ØÐr*   )r   r   r   r   r   r   r   r   )r?   rI   r>   rJ   r   rK   )r   r   )T)r   r   rq   rr   )r   r   r   r   )r   r   r   rI   )'Ú__doc__Ú
__future__r   Úcollectionsr   Útypingr   r   r   r   r	   rh   Ú	rustworkxr’   Úqiskit.dagcircuitr
   Úqiskit.circuitr   r   r   Úqiskit.dagcircuit.dagcircuitr   Úqiskit.dagcircuit.dagnoder   Úqiskit.transpiler.couplingr   Úqiskit.transpiler.targetr   Úqiskit.transpiler.exceptionsr   Úqiskit.transpiler.passes.layoutr   r   rH   r2   rp   r�   rŒ   r1   r$   r*   r(   ú<module>rµ      s£  ðð DÐ CØ "Ð "Ð "Ð "Ð "Ð "Ø #Ð #Ð #Ð #Ð #Ð #Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø €€€à Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'à 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø +Ð +Ð +Ð +Ð +Ð +Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5à€GˆC�L„L€ð(ð (ð (ð (ðVð ð ð ð86ð 6ð 6ð 6ð*.ð .ð .ð .ð .ð:ð ð ð ðDð ð ð ð ð r*   