§
    ²Ûgª2  ã                   ó¾  — d Z ddlZddlmZ ddlm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mZmZmZmZ dd
lmZ  ej        ¦   «         j        dz  Z e eedz  dz  ¦  «        ¦  «        Zej                             e¦  «        Z ee¦  «         ddddddddddœ	Z eg d¢¦  «         eg d¢¦  «         eg d¢¦  «         eg d¢¦  «         eg d¢¦  «         eg d¢¦  «         eg d¢¦  «         eg d¢¦  «        dœZ  e e!e d          ¦  «         "                    e d!         ¦  «         "                    e d"         ¦  «         "                    e d#         ¦  «         "                    e d$         ¦  «         "                    e d%         ¦  «         "                    e d&         ¦  «        ¦  «        xe d<   e d'<   d(„ Z#d)„ Z$d*„ Z%d+„ Z&d,„ Z'd-„ Z(d.„ Z) G d/„ d0e¦  «        Z*dS )1z
Aer simulator backend utils
é    N)Úlog2)ÚSimpleNamespace)ÚQuantumCircuit)ÚProbDistribution)ÚCliffordé   )ÚStatevectorÚDensityMatrixÚStabilizerStateÚOperatorÚSuperOp)Úaer_initialize_librariesi   @é   )ÚstatevectorÚCPU)r   ÚGPU)r   ÚThrust)Údensity_matrixr   )r   r   )r   r   )Úunitaryr   )r   r   )r   r   )	Ústatevector_cpuÚstatevector_gpuÚstatevector_thrustÚdensity_matrix_cpuÚdensity_matrix_gpuÚdensity_matrix_thrustÚunitary_cpuÚunitary_gpuÚunitary_thrust)>Úu1Úu2Úu3ÚuÚpÚrÚrxÚryÚrzÚidÚxÚyÚzÚhÚsÚsdgÚsxÚsxdgÚtÚtdgÚswapÚcxÚcyÚczÚcsxÚcpÚcuÚcu1Úcu2Úcu3ÚrxxÚryyÚrzzÚrzxÚccxÚcczÚcrxÚcryÚcrzÚcswapÚmcxÚmcyÚmczÚmcsxÚmcpÚmcphaseÚmcuÚmcu1Úmcu2Úmcu3ÚmcrxÚmcryÚmcrzÚmcrÚmcswapr   ÚdiagonalÚmultiplexerÚpauliÚmcx_grayÚecrÚstore)#r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r8   r:   r=   r>   r?   r@   rA   r   rV   rX   rZ   )&r   r    r!   r"   r#   r8   r4   r5   r6   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   rA   r   ÚroerrorrX   r$   r%   r&   r'   r=   r>   r?   r@   r7   rF   rV   rZ   r[   )r(   r)   r*   r+   r,   r-   r.   r/   r0   r4   r5   r6   r3   rX   rZ   r'   r[   )r4   r6   r(   r)   r*   r+   r,   r-   r.   r/   r0   r3   Úu0r1   r2   r   r#   rA   rB   rX   rZ   r'   r[   )=r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rF   rC   rD   rE   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   r   rV   rW   rX   rZ   r[   )#r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r8   r:   r=   r>   r?   r@   rA   r   rV   rX   r[   )>r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rF   rC   rD   rE   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   r   rV   rW   rX   rY   rZ   r[   )r   r   Úmatrix_product_stateÚ
stabilizerÚextended_stabilizerr   ÚsuperopÚtensor_networkr   r_   r   r^   r   ra   rb   Ú	automaticc                 ó|   — t           |_        |r|                     d¬¦  «        ni }|                      |||¦  «        S )z.Execute aer circuits on C++ controller wrapperT)Úserializable)ÚLIBRARY_DIRÚlibrary_dirÚto_dictÚexecute)Ú
controllerÚaer_circuitsÚnoise_modelÚconfigs       úW/granary/edev/quantum/lib/python3.11/site-packages/qiskit_aer/backends/backend_utils.pyÚcpp_execute_circuitsro   µ  sD   € õ
 %€FÔà<GÐO�+×%Ò%°4Ð%Ñ8Ô8Ð8ÈR€Kà×Ò˜l¨K¸Ñ@Ô@Ð@ó    c                 ó˜   — g }| D ]7}|dk    rd|v r|                      |¦  «         Œ"|                      |¦  «         Œ8t          |¦  «        S )z"Check available simulation methodsrb   r   )ÚappendÚtuple)ÚmethodsÚdevicesÚvalid_methodsÚmethods       rn   Úavailable_methodsrx   Á  si   € ð €MØð )ð )ˆØÐ%Ò%Ð%Ø˜ÐÐØ×$Ò$ VÑ,Ô,Ð,øà× Ò  Ñ(Ô(Ð(Ð(Ý�ÑÔÐrp   c                 óH   — |                       ¦   «         }t          |¦  «        S )z#return available simulation devices)Úavailable_devicesrs   )rj   Údevs     rn   rz   rz   Î  s   € à
×
&Ò
&Ñ
(Ô
(€CÝ�‰:Œ:Ðrp   c                 óˆ   — | D ]>}|j         }|                     t          t          |¦  «        ¦  «        d|› �d|¦  «         Œ?| S )z5Add final save state op to all experiments in a qobj.Úsave_Úsingle)Ú
num_qubitsÚ
save_stateÚlistÚrange)rk   ÚstateÚaer_circuitr   s       rn   Úadd_final_save_opr…   Ô  sW   € ð $ð Zð ZˆØ Ô+ˆ
Ø×Ò�t¥E¨*Ñ$5Ô$5Ñ6Ô6¸À¸¸ÈÐSXÑYÔYÐYÐYàÐrp   c                 óZ   — | j         }|t          v rt          |         \  | _         | _        | S )zBMap legacy method names of qasm simulator to aer simulator options)rw   ÚLEGACY_METHOD_MAPÚdevice)rm   rw   s     rn   Úmap_legacy_method_configr‰   Þ  s-   € àŒ]€FØÕ"Ð"Ð"Ý'8¸Ô'@Ñ$ˆŒ�v”}Ø€Mrp   c                 ó  ‡‡‡— t           t          t          t          d„ t          j        t          dœŠ‰‰vr| S |dv rˆˆfd„Šn‰‰         Š|dd…         dk    r ˆfd„|                      ¦   «         D ¦   «         S  ‰| ¦  «        S )	z4Format raw simulator result data based on save type.c                 óD   — t          t          j        | ¦  «        ¦  «        S )N)r   r   Ú	from_dict)Údatas    rn   ú<lambda>z"format_save_type.<locals>.<lambda>í  s   € ­½Ô9KÈDÑ9QÔ9QÑ)RÔ)R€ rp   )Úsave_statevectorÚsave_density_matrixÚsave_unitaryÚsave_superopÚsave_stabilizerÚsave_cliffordÚsave_probabilities_dict)r�   Úc_listc                 ó2   •‡— ‰‰         Šˆfd„| D ¦   «         S )Nc                 ó&   •— g | ]} ‰|¦  «        ‘ŒS © r™   )Ú.0ÚiÚinit_fns     €rn   ú
<listcomp>z2format_save_type.<locals>.func.<locals>.<listcomp>ú  s!   ø€ Ð-Ð-Ð- 1�G�G˜A‘J”JÐ-Ð-Ð-rp   r™   )r�   rœ   Úinit_fnsÚ	save_types    @€€rn   Úfunczformat_save_type.<locals>.funcø  s(   øø€ Ø˜yÔ)ˆGØ-Ð-Ð-Ð-¨Ð-Ñ-Ô-Ð-rp   Né   Úc_c                 ó.   •— i | ]\  }}| ‰|¦  «        “ŒS r™   r™   )rš   ÚkeyÚvalr    s      €rn   ú
<dictcomp>z$format_save_type.<locals>.<dictcomp>  s'   ø€ Ð<Ð<Ð<¡8 3¨��T�T˜#‘Y”YÐ<Ð<Ð<rp   )r	   r
   r   r   r   rŒ   r   Úitems)r�   rŸ   Úsave_subtyper    rž   s    ` @@rn   Úformat_save_typer©   æ  sÁ   øøø€ õ (Ý,Ý ÝØRÐRÝ!Ô+Ý#3ðð €Hð ˜Ð Ð ØˆàÐ)Ð)Ð)ð	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð
 ˜	Ô"ˆð �B�Q�BÔ˜4ÒÐØ<Ð<Ð<Ð<¨t¯zªz©|¬|Ð<Ñ<Ô<Ð<àˆ4�‰:Œ:Ðrp   c                 ó"  — t          | t          ¦  «        st          ¦   «         S t          ¦   «         }| j        D ];}|                     t          |j        ¦  «                             ¦   «         ¦  «         Œ<|                     t          ¦  «         |S )z@Return set of all operation types and parent types in a circuit.)
Ú
isinstancer   Úsetr�   ÚupdateÚtypeÚ	operationÚmroÚdiscardÚobject)ÚcircuitÚoptypesÚinstructions      rn   Úcircuit_optypesr¶     sz   € å�g�~Ñ.Ô.ð Ý‰uŒuˆÝ‰eŒe€GØ”|ð :ð :ˆØ�Š•t˜KÔ1Ñ2Ô2×6Ò6Ñ8Ô8Ñ9Ô9Ð9Ð9Ø‡O‚O•FÑÔÐØ€Nrp   c                   ó:   — e Zd ZdZd„ Zd„ Zed„ ¦   «         Zd„ ZdS )ÚCircuitHeaderzAA class used to represent a dictionary header in circuit objects.c                 ó:   — | j                              |¦  «         dS )z¶Instantiate a new circuit dict field object.

        Args:
            kwargs: arbitrary keyword arguments that can be accessed as
                attributes of the object.
        N)Ú__dict__r­   )ÚselfÚkwargss     rn   Ú__init__zCircuitHeader.__init__  s    € ð 	Œ×Ò˜VÑ$Ô$Ð$Ð$Ð$rp   c                 ó   — | j         S )z�Return a dictionary format representation of the circuit.

        Returns:
            dict: The dictionary form of the CircuitHeader.
        )rº   )r»   s    rn   rh   zCircuitHeader.to_dict  s   € ð Œ}Ðrp   c                 ó   —  | di |¤ŽS )a4  Create a new header object from a dictionary.

        Args:
            data (dict): A dictionary representing the header to create. It
                will be in the same format as output by :func:`to_dict`.

        Returns:
            CircuitHeader: The CircuitHeader from the input dictionary.
        r™   r™   )Úclsr�   s     rn   rŒ   zCircuitHeader.from_dict%  s   € ð ˆsˆ{ˆ{�Tˆ{ˆ{Ðrp   c                 óT   — t          || j        ¦  «        r| j        |j        k    rdS dS )NTF)r«   Ú	__class__rº   )r»   Úothers     rn   Ú__eq__zCircuitHeader.__eq__3  s/   € Ý�e˜Tœ^Ñ,Ô,ð 	ØŒ} ¤Ò.Ð.Ø�tØˆurp   N)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r½   rh   ÚclassmethodrŒ   rÄ   r™   rp   rn   r¸   r¸     sb   € € € € € ØKÐKð%ð %ð %ðð ð ð ðð ñ „[ððð ð ð ð rp   r¸   )+rÈ   ÚosÚmathr   Útypesr   ÚpsutilÚqiskit.circuitr   Úqiskit.resultr   Úqiskit.quantum_infor   Úcompatibilityr	   r
   r   r   r   Úcontroller_wrappersr   Úvirtual_memoryÚtotalÚSYSTEM_MEMORY_GBÚintÚMAX_QUBITS_STATEVECTORÚpathÚdirnameÚ__file__rf   r‡   ÚsortedÚBASIS_GATESr¬   Úunionro   rx   rz   r…   r‰   r©   r¶   r¸   r™   rp   rn   ú<module>rÞ      s®  ððð ð 
€	€	€	Ø Ð Ð Ð Ð Ð à !Ð !Ð !Ð !Ð !Ð !à €€€Ø )Ð )Ð )Ð )Ð )Ð )Ø *Ð *Ð *Ð *Ð *Ð *Ø (Ð (Ð (Ð (Ð (Ð (à YÐ YÐ YÐ YÐ YÐ YÐ YÐ YÐ YÐ YÐ YÐ YÐ YÐ Yð :Ð 9Ð 9Ð 9Ð 9Ð 9ð )�6Ô(Ñ*Ô*Ô0°GÑ<Ð ð ˜˜T˜TÐ"2°gÑ">ÀÑ"CÑDÔDÑEÔEÐ ð Œg�oŠo˜hÑ'Ô'€Ø Ð ˜Ñ %Ô %Ð %ð .Ø-Ø3Ø3Ø3Ø9Ø%Ø%Ø+ð
ð 
Ð ð �6ð?	
ð ?	
ð ?	
ñAô AðD �fð$	
ð $	
ð $	
ñ&ô &ðN #˜Fð'	
ð '	
ð '	
ñ)ô )ðT �&ð	
ð 	
ð 	
ñô ð* "˜6ð	
ð 	
ð 	
ñô ð6 ˆvð>	
ð >	
ð >	
ñ@ô @ðB ˆvð$	
ð $	
ð $	
ñ&ô &ðN �fð?	
ð ?	
ð ?	
ñAô AðY	nð n€ðd 06¨vØ€Cˆ�MÔ"Ñ#Ô#ß
‚Uˆ;�|Ô$Ñ%Ô%ß
‚Uˆ;Ð'Ô(Ñ)Ô)ß
‚Uˆ;Ð-Ô.Ñ/Ô/ß
‚Uˆ;�yÔ!Ñ"Ô"ß
‚Uˆ;�yÔ!Ñ"Ô"ß
‚Uˆ;Ð'Ô(Ñ)Ô)ñ0ô 0ð €ˆDÑ �K Ñ,ð	Að 	Að 	Að
 ð 
 ð 
 ðð ð ðð ð ðð ð ðð ð ð@ð ð ð&ð &ð &ð &ð &�Oñ &ô &ð &ð &ð &rp   