§
    ²Ûgän  ã                   ó<  — d Z ddlZddlZddlZddlZddlZddlZddlmZ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 d	dlmZmZ d	dlmZ ddl m!Z!m"Z"m#Z# ddl$m%Z%m&Z& ddl'm(Z( ddl)m*Z*  ej+        e,¦  «        Z- G d„ dee¦  «        Z.dS )z
Aer qasm simulator backend.
é    N)ÚABCÚabstractmethod)ÚQuantumCircuitÚParameterExpressionÚDelay)Ú	BackendV2)ÚResult)ÚCouplingMap)ÚTargeté   )ÚAerError)ÚAerJob)Ú
NoiseModelÚQuantumErrorLocation)ÚQuantumChannelInstructioné   )Úcompile_circuitÚassemble_circuitsÚgenerate_aer_config)Úformat_save_typeÚcircuit_optypes)ÚNAME_MAPPING)Ú	AerConfigc                   óì   ‡ — e Zd ZdZ	 dˆ fd„	Zd„ Zdd„Zdd„Zd„ Zd„ Z	d	„ Z
ed
„ ¦   «         Zed„ ¦   «         Zd„ Zd„ Z	 dd„Zed„ ¦   «         Zd„ Zd„ Zd„ Zed„ ¦   «         Zd„ Zd„ Zd„ Zd„ Zd„ Zˆ xZS )Ú
AerBackendzAer Backend class.Nc                 óš  •— t          ¦   «                              ||j        |j        |j        ¬¦  «         || _        || _        i | _        i | _        || _	        t          | _        |�d| _        nd| _        |� | j        di |¤Ž |                      ¦   «         j        �-t!          |                      ¦   «         j        ¦  «        | _        dS dS )a›  Aer class for backends.

        This method should initialize the module and its configuration, and
        raise an exception if a component of the module is
        not available.

        Args:
            configuration (AerBackendConfiguration): backend configuration.
            properties (AerBackendProperties or None): Optional, backend properties.
            provider (Provider): Optional, provider responsible for this backend.
            target (Target):  initial target for backend
            backend_options (dict or None): Optional set custom backend options.

        Raises:
            AerError: if there is no name in the configuration
        )ÚproviderÚnameÚdescriptionÚbackend_versionNTF© )ÚsuperÚ__init__Úbackend_namer   r    Ú_propertiesÚ_configurationÚ_options_configurationÚ_options_propertiesÚ_targetr   Ú_mappingÚ_from_backendÚset_optionsÚconfigurationÚcoupling_mapr
   Ú_coupling_map)Úselfr-   Ú
propertiesr   ÚtargetÚbackend_optionsÚ	__class__s         €úT/granary/edev/quantum/lib/python3.11/site-packages/qiskit_aer/backends/aerbackend.pyr#   zAerBackend.__init__/   së   ø€ õ( 	‰Œ×ÒØØÔ+Ø%Ô1Ø)Ô9ð	 	ñ 	
ô 	
ð 	
ð &ˆÔØ+ˆÔð ')ˆÔ#Ø#%ˆÔ ØˆŒÝ$ˆŒØÐØ!%ˆDÔÐà!&ˆDÔð Ð&ØˆDÔÐ/Ð/˜Ð/Ð/Ð/ð ×ÒÑÔÔ,Ð8Ý!,¨T×-?Ò-?Ñ-AÔ-AÔ-NÑ!OÔ!OˆDÔÐÐð 9Ð8ó    c                 ó$  ‡‡	— g Š	ˆˆ	fd„} |t           j        d|j        ¦  «         t          |j        ¦  «        D ]T\  }}|j                             ¦   «         r6t          |j        j        ¦  «        D ]\  }} ||r||         n|||¦  «         ŒŒU‰	S )Nc                 ó²  •‡— ‰‰v r!‰                      | |f‰‰         g¦  «         d S t          ‰t          ¦  «        rš‰j        sd S ‰st	          d¦  «        ‚t          t          t          ‰                     ¦   «         ¦  «        ¦  «        ¦  «        }ˆˆfd„t          |¦  «        D ¦   «         }ˆfd„|D ¦   «         }‰                      | |f|g¦  «         d S d S )Nz(The element of parameter_binds is empty.c                 ód   •‡— g | ]+Šˆˆfd „‰j         ‰                     ¦   «         z  D ¦   «         ‘Œ,S )c                 ó.   •— i | ]}|‰|         ‰         “ŒS r!   r!   )Ú.0Ú	parameterÚbindsÚis     €€r5   ú
<dictcomp>z]AerBackend._convert_circuit_binds.<locals>.append_param_values.<locals>.<listcomp>.<dictcomp>o   s5   ø€ ð ð ð à%ð " 5¨Ô#3°AÔ#6ðð ð r6   )Ú
parametersÚkeys)r;   r>   r=   Úparams    @€€r5   ú
<listcomp>zRAerBackend._convert_circuit_binds.<locals>.append_param_values.<locals>.<listcomp>n   sb   øø€ ð ð ð ð
 ð	ð ð ð ð à).Ô)9¸E¿JºJ¹L¼LÑ)Hðñ ô ðð ð r6   c                 óT   •— g | ]$}t          ‰                     |¦  «        ¦  «        ‘Œ%S r!   )ÚfloatÚbind)r;   ÚxrB   s     €r5   rC   zRAerBackend._convert_circuit_binds.<locals>.append_param_values.<locals>.<listcomp>u   s+   ø€ ÐHÐHÐH¸¥ e§j¢j°¡m¤mÑ 4Ô 4ÐHÐHÐHr6   )
ÚappendÚ
isinstancer   r@   r   ÚlenÚnextÚiterÚvaluesÚrange)ÚindexÚbind_posrB   Úlen_valsÚ	bind_listÚbound_valuesr=   Úparameterizationss     `   €€r5   Úappend_param_valuesz>AerBackend._convert_circuit_binds.<locals>.append_param_valuesc   s  øø€ Ø˜ˆ~ˆ~Ø!×(Ò(¨5°(Ð*;¸UÀ5¼\Ð)JÑKÔKÐKÐKÐKÝ˜EÕ#6Ñ7Ô7ð Lð Ô'ð Ø�FØð OÝ"Ð#MÑNÔNÐNÝ�t¥D¨¯ª©¬Ñ$8Ô$8Ñ9Ô9Ñ:Ô:�ðð ð ð ð õ
 # 8™_œ_ðñ ô �	ð  IÐHÐHÐH¸iÐHÑHÔH�Ø!×(Ò(¨5°(Ð*;¸\Ð)JÑKÔKÐKÐKÐKð!Lð Lr6   éÿÿÿÿ)r   ÚGLOBAL_PHASE_POSÚglobal_phaseÚ	enumerateÚdataÚ	operationÚis_parameterizedÚparams)
r0   Úcircuitr=   Úidx_maprU   rO   ÚinstructionrP   rB   rT   s
     `      @r5   Ú_convert_circuit_bindsz!AerBackend._convert_circuit_binds`   sÓ   øø€ ØÐð	Lð 	Lð 	Lð 	Lð 	Lð 	Lð* 	Ð�IÔ6¸¸GÔ<PÑQÔQÐQå"+¨G¬LÑ"9Ô"9ð 	_ð 	_ÑˆE�;ØÔ$×5Ò5Ñ7Ô7ð _Ý'0°Ô1FÔ1MÑ'NÔ'Nð _ð _‘O�H˜eØ'Ð'¸'Ð(L¨°¬¨ÀuÈhÐX]Ñ^Ô^Ð^Ð^øØ Ð r6   c                 óN  ‡ ‡‡— t          |t          ¦  «        r@t          ‰¦  «        dk    rt          d¦  «        ‚‰                      |‰d         d ¦  «        gS t          ‰¦  «        t          |¦  «        k    rt          d¦  «        ‚ˆˆˆ fd„t          |¦  «        D ¦   «         }|S )Nr   z9More than 1 parameter table provided for a single circuitr   zSNumber of input circuits does not match number of input parameter bind dictionariesc                 ó\   •— g | ](\  }}‰                      |‰|         ‰|         ¦  «        ‘Œ)S r!   )ra   )r;   Úidxr^   Úidx_mapsÚparameter_bindsr0   s      €€€r5   rC   z-AerBackend._convert_binds.<locals>.<listcomp>‹   sI   ø€ ð 
ð 
ð 
á��Wð ×'Ò'¨°ÀÔ1EÀxÐPSÄ}ÑUÔUð
ð 
ð 
r6   )rI   r   rJ   r   ra   rY   )r0   Úcircuitsrf   re   rT   s   ` `` r5   Ú_convert_bindszAerBackend._convert_binds€   sÌ   øøø€ Ý�h¥Ñ/Ô/ð 		Ý�?Ñ#Ô# aÒ'Ð'ÝÐZÑ[Ô[Ð[à×/Ò/°¸/È!Ô:LÈdÑSÔSÐTÐTÝ�Ñ!Ô!¥S¨¡]¤]Ò2Ð2Ýð.ñô ð ð
ð 
ð 
ð 
ð 
ð 
å )¨(Ñ 3Ô 3ð
ñ 
ô 
Ðð !Ð r6   c                 óP   — t          |t          ¦  «        r|g} | j        ||fi |¤ŽS )a‰  Run circuits on the backend.

        Args:
            circuits (QuantumCircuit or list): The QuantumCircuit (or list
                of QuantumCircuit objects) to run
            parameter_binds (list): A list of parameter binding dictionaries.
                                    See additional information (default: None).
            run_options (kwargs): additional run time backend options.

        Returns:
            AerJob: The simulation job.

        Raises:
            TypeError: If ``parameter_binds`` is specified with an input or
                has a length mismatch with the number of circuits.

        Additional Information:
            * Each parameter binding dictionary is of the form::

                {
                    param_a: [val_1, val_2],
                    param_b: [val_3, val_1],
                }

              for all parameters in that circuit. The length of the value
              list must be the same for all parameters, and the number of
              parameter dictionaries in the list must match the length of
              ``circuits`` (if ``circuits`` is a single ``QuantumCircuit``
              object it should a list of length 1).
            * kwarg options specified in ``run_options`` will temporarily override
              any set options of the same name for the current run.

        Raises:
            ValueError: if run is not implemented
        )rI   r   Ú_run_circuits)r0   rg   rf   Úrun_optionss       r5   ÚrunzAerBackend.run’   s;   € õH �h¥Ñ/Ô/ð 	"Ø �zˆHà!ˆtÔ! (¨OÐKÐK¸{ÐKÐKÐKr6   c                 ó¢   — t          t          j        ¦   «         ¦  «        }t          | || j        |||¬¦  «        }|                     ¦   «          |S )z+Run circuits by generating native circuits.)rf   rg   rk   )ÚstrÚuuidÚuuid4r   Ú_execute_circuits_jobÚsubmit)r0   rg   rf   rk   Újob_idÚaer_jobs         r5   rj   zAerBackend._run_circuits»   sW   € õ •T”Z‘\”\Ñ"Ô"ˆÝØØØÔ&Ø+ØØ#ð
ñ 
ô 
ˆð 	�ŠÑÔÐàˆr6   c                 óà   — t          j         | j        ¦  «        }| j                             ¦   «         D ]\  }}t	          |||¦  «         Œt          |d¦  «        r|j        |j        z   |_        |S )z‹Return the simulator backend configuration.

        Returns:
            BackendConfiguration: the configuration for the backend.
        Úcustom_instructions)Úcopyr&   r'   ÚitemsÚsetattrÚhasattrÚbasis_gatesrv   )r0   ÚconfigÚkeyÚvals       r5   r-   zAerBackend.configurationË   s{   € õ ”˜4Ô.Ñ/Ô/ˆØÔ3×9Ò9Ñ;Ô;ð 	&ð 	&‰HˆC�Ý�F˜C Ñ%Ô%Ð%Ð%õ �6Ð0Ñ1Ô1ð 	QØ!'Ô!3°fÔ6PÑ!PˆFÔØˆr6   c                 ó˜   — t          j         | j        ¦  «        }| j                             ¦   «         D ]\  }}t	          |||¦  «         Œ|S )zØReturn the simulator backend properties if set.

        Returns:
            BackendProperties: The backend properties or ``None`` if the
                               backend does not have properties set.
        )rw   r%   r(   rx   ry   )r0   r1   r}   r~   s       r5   r1   zAerBackend.propertiesÚ   sS   € õ ”Y˜tÔ/Ñ0Ô0ˆ
ØÔ0×6Ò6Ñ8Ô8ð 	*ð 	*‰HˆC�Ý�J  SÑ)Ô)Ð)Ð)ØÐr6   c                 ó|   — t          |                      ¦   «         d¦  «        r|                      ¦   «         j        S d S )NÚmax_experiments)rz   r-   r�   ©r0   s    r5   Úmax_circuitszAerBackend.max_circuitsæ   s;   € å�4×%Ò%Ñ'Ô'Ð):Ñ;Ô;ð 	Ø×%Ò%Ñ'Ô'Ô7Ð7à�4r6   c                 ó  ‡&‡'— | j         r| j        S ddlm} ddlm}m}m}m} ddl	m
} ddlm} ddlm} ddlm}	 ddlm}
 d	d
g}|                      ¦   «         }|                      ¦   «         Š' |¦   «         }|                     t*          ¦  «         ||||dœ}d|j        i}t/          |d¦  «        r
|j        |d<   t/          |d¦  «        r|                     |j        ¦  «         t5          t7          |dg ¦  «        ¦  «        }t5          t7          |dg ¦  «        ¦  «        }d„ |j        D ¦   «         }t4                               |t5          |¦  «        |                     |	¦  «        ¦  «        }i }t5          ¦   «         }t5          ¦   «         Š&g }|D ]¼}||v rŒ||v r||         ||<   Œ||v rn||         }t?          tA          |t7          |dg ¦  «        ¦  «        ¦  «        }t7          |dg ¦  «        } |||rtC          |d         ¦  «        nd|¬¦  «        ||<   Œ‰tE          j#        d|› d�tH          ¦  «         | %                    |¦  «         Œ½|D ]}| &                    |¦  «         ŒtN           (                    |¦  «        }|D ]O}||v rIt7          ||         dd ¦  «        x}r0tN           (                    tA          tR          |¦  «        ¦  «        ||<   ŒP‰'�rpd„ }ˆ'fd„tU          |j        ¦  «        D ¦   «         Š&g }tU          d|j        ¦  «        D ]™}	 ‰' +                    |¬¦  «        }n# tX          $ r Y Œ&w xY w| %                     |
| -                    dd¦  «        d         | -                    dd¦  «        d         | -                    dd¦  «        d         ¬¦  «        ¦  «         Œš||d<   |D �]2}‰' .                    |¦  «         /                    ¦   «         D ] \  } }t4                               ‰&| ¦  «        s‰' 0                    || ¦  «        s3	 ||         | = n# tX          $ r Y nw xY w| 1                    || f¦  «         Œi||         €i ||<    | ||d ¦  «         ||d!¦  «        ¬"¦  «        ||         | <   Œ¡te          ||         tN          ¦  «        rLtg          d#„ ||          4                    ¦   «         D ¦   «         ¦  «        rtj           6                    d$|¦  «         �Œ4i |d	<   tU          |j        ¦  «        D ]G}!|!‰&v rŒ‰' +                    |!¦  «        }" | ||"d%¦  «         ||"d&¦  «        ¬"¦  «        |d	         |!f<   ŒH|D ]-}#||#         €#ˆ&fd'„tU          |j        ¦  «        D ¦   «         ||#<   Œ.to          d*i |¤Ž}$|D ]V}%|%|v r|$ 8                    ||%         |%¬(¦  «         Œ$|$ 8                    ||%         | -                    |%d ¦  «        |%¬)¦  «         ŒW| j9        �#| j9        j:         ;                    ¦   «         |$_<        |$S )+Nr   )ÚInstructionProperties)Ú	ForLoopOpÚIfElseOpÚSwitchCaseOpÚWhileLoopOp)Úget_standard_gate_name_mapping)Ú	Parameter)ÚGate)ÚCONTROL_FLOW_OP_NAMES)ÚQubitPropertiesÚmeasureÚdelay)Úif_elseÚ
while_loopÚfor_loopÚswitch_caseÚ
num_qubitsÚdtÚtiming_constraintsr{   Úsupported_instructionsc                 ó   — i | ]
}|j         |“ŒS r!   )r   )r;   Úgates     r5   r?   z%AerBackend.target.<locals>.<dictcomp>  s   € ÐHÐHÐH¨D˜œ	 4ÐHÐHÐHr6   r@   r.   )r   r•   r]   zNo gate definition for z> can be found and is being excluded from the generated target.c                 óF   — |                       |d ¦  «        x}r|d         S d S )Nr   )Úget)Ú	prop_dictÚ	prop_nameÚndvals      r5   Ú
_get_valuez%AerBackend.target.<locals>._get_valueN  s+   € Ø%ŸMšM¨)°TÑ:Ô:Ð:�5ð $Ø  œ8�OØ�tr6   c                 ó>   •— h | ]}‰                      |¦  «        °|’ŒS r!   )Úis_qubit_operational)r;   Úqr1   s     €r5   ú	<setcomp>z$AerBackend.target.<locals>.<setcomp>T  s=   ø€ ð ð ð ØÀ*×BaÒBaÐbcÑBdÔBdðØðð ð r6   )ÚqubitÚT1)NNÚT2Ú	frequency)Út1Út2r¨   Úqubit_propertiesÚ
gate_errorÚgate_length)ÚerrorÚdurationc              3   ó   K  — | ]}|d u V — Œ	d S ©Nr!   )r;   Úvs     r5   ú	<genexpr>z$AerBackend.target.<locals>.<genexpr>|  s?   è è € ð Að AØ"#�A˜�IðAð Að Að Að Að Ar6   zÏGate properties of instruction %s are not provided for every qubits. This gate is ideal for some qubits and the rest is with finite error. Created backend target may confuse error-aware circuit optimization.Úreadout_errorÚreadout_lengthc                 ó    •— i | ]
}|‰v¯|fd “ŒS r±   r!   )r;   r£   Úfaulty_qubitss     €r5   r?   z%AerBackend.target.<locals>.<dictcomp>—  s/   ø€ ð %ð %ð %Ø#$È1ÐTaÐKaÐKa�Q�D˜$ÐKaÐKaÐKar6   )r`   r   )r`   r1   r   r!   )=r+   r)   Úqiskit.transpiler.targetr…   Úqiskit.circuit.controlflowr†   r‡   rˆ   r‰   Ú%qiskit.circuit.library.standard_gatesrŠ   Úqiskit.circuit.parameterr‹   Úqiskit.circuit.gaterŒ   r�   Úqiskit.providers.backendrŽ   r-   r1   Úupdater   r•   rz   r–   r—   ÚsetÚgetattrÚgatesÚunionÚintersectionÚlistÚmaprJ   ÚwarningsÚwarnÚRuntimeWarningrH   ÚremoveÚdictÚfromkeysÚtuplerN   Úqubit_propertyÚKeyErrorrœ   Úgate_propertyrx   Úis_gate_operationalÚaddrI   ÚanyrM   ÚloggerÚinfor   Úadd_instructionr/   Úgraphrw   Ú_coupling_graph)(r0   r…   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r�   rŽ   Úrequiredr-   Úqiskit_inst_mappingÚqiskit_control_flow_mappingÚin_datar{   r˜   Úgate_configsÚall_instructionsÚinst_name_mapÚ
faulty_opsÚunsupported_instructionsr   Úthis_configr]   r.   Úprop_name_mapr    r«   Úqir�   ÚqubitsÚ	qubit_idxÚ
qubit_propÚopr2   Ú	inst_namer·   r1   s(                                         @@r5   r2   zAerBackend.targetí   s  øø€ àÔð 	 Ø”<Ðð 	CÐBÐBÐBÐBÐBØ]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]ØXÐXÐXÐXÐXÐXØ6Ð6Ð6Ð6Ð6Ð6Ø,Ð,Ð,Ð,Ð,Ð,ØDÐDÐDÐDÐDÐDØ<Ð<Ð<Ð<Ð<Ð<à˜wÐ'ˆà×*Ò*Ñ,Ô,ˆØ—_’_Ñ&Ô&ˆ
ð =Ð<Ñ>Ô>ÐØ×"Ò"¥<Ñ0Ô0Ð0ð  Ø%Ø!Ø'ð	'
ð '
Ð#ð   Ô!9Ð:ˆõ �= $Ñ'Ô'ð 	-Ø)Ô,ˆG�D‰MÝ�=Ð"6Ñ7Ô7ð 	=Ø�NŠN˜=Ô;Ñ<Ô<Ð<õ �' -°ÀÑCÔCÑDÔDˆÝ!$¥W¨]Ð<TÐVXÑ%YÔ%YÑ!ZÔ!ZÐØHÐH°MÔ4GÐHÑHÔHˆÝŸ9š9Ø�˜X™œÐ(>×(KÒ(KÐLaÑ(bÔ(bñ
ô 
Ðð ˆå‘U”Uˆ
Ý™œˆØ#%Ð ð %ð 	6ð 	6ˆDØÐ2Ð2Ð2ØØÐ*Ð*Ð*Ø&9¸$Ô&?�˜dÑ#Ð#Ø˜Ð%Ð%Ø*¨4Ô0�Ý�c )­W°[À,ÐPRÑ-SÔ-SÑTÔTÑUÔU�Ý& {°NÀBÑGÔG�Ø&* dØØ7CÐJ�s <°¤?Ñ3Ô3Ð3ÈØ!ð'ñ 'ô '�˜dÑ#Ð#õ ”ð1¨dð 1ð 1ð 1å"ñô ð ð
 )×/Ò/°Ñ5Ô5Ð5Ð5à,ð 	*ð 	*ˆDØ×#Ò# DÑ)Ô)Ð)Ð)õ ŸšÐ&6Ñ7Ô7ˆØ$ð 	Rð 	RˆDØ�|Ð#Ð#Ý#*¨<¸Ô+=¸~ÈtÑ#TÔ#TÐT�<ð Rõ
 +/¯-ª-½½EÀ<Ñ8PÔ8PÑ*QÔ*Q�M $Ñ'øð ñ F	ðð ð ðð ð ð Ý  Ô!9Ñ:Ô:ðñ ô ˆMð  "ÐÝ˜A˜}Ô7Ñ8Ô8ð ð �ðØ *× 9Ò 9ÀÐ 9Ñ CÔ C�I�IøÝð ð ð Ø�Hðøøøà ×'Ò'Ø#�OØ$Ÿ=š=¨¨|Ñ<Ô<¸QÔ?Ø$Ÿ=š=¨¨|Ñ<Ô<¸QÔ?Ø"+§-¢-°¸\Ñ"JÔ"JÈ1Ô"Mðñ ô ñô ð ð ð +;ˆGÐ&Ñ'à(ð ñ �Ø&0×&>Ò&>¸tÑ&DÔ&D×&JÒ&JÑ&LÔ&Lð ð ‘N�F˜FÝ×'Ò'Ø% vñô ð 
!à'×;Ò;¸DÀ&ÑIÔIð
!ð!ð !.¨dÔ 3°FÐ ;Ð ;øÝ'ð !ð !ð !Ø ˜Dð!øøøà"Ÿš¨¨f ~Ñ6Ô6Ð6Ø Ø$ TÔ*Ð2Ø.0˜ dÑ+Ø2GÐ2GØ(˜j¨°Ñ>Ô>Ø!+ ¨F°MÑ!BÔ!Bð3ñ 3ô 3�M $Ô'¨Ñ/Ð/õ ˜m¨DÔ1µ4Ñ8Ô8ð 
½Sð Að AØ'4°TÔ':×'AÒ'AÑ'CÔ'CðAñ Aô Añ >ô >ð 
õ
 —K’Kð_ð ñ	ô ð ùð (*ˆM˜)Ñ$å" =Ô#;Ñ<Ô<ð ð �	Ø Ð-Ð-ØØ'×6Ò6°yÑAÔA�
Ø9NÐ9NØ$˜* Z°ÑAÔAØ'˜Z¨
Ð4DÑEÔEð:ñ :ô :�˜iÔ(¨)¨Ñ6Ð6ð
 ð 	ð 	ˆBà˜RÔ Ð(ð%ð %ð %ð %Ý(-¨mÔ.FÑ(GÔ(Gð%ñ %ô %�˜bÑ!øõ
 Ð"Ð"˜'Ð"Ð"ˆØ)ð 	ð 	ˆIØÐ7Ð7Ð7à×&Ò&Ø ;¸IÔ FØ"ð 'ñ ô ð ð ð
 ×&Ò&Ø -¨iÔ 8Ø,×0Ò0°¸DÑAÔAØ"ð 'ñ ô ð ð ð ÔÐ)Ø%)Ô%7Ô%=×%BÒ%BÑ%DÔ%DˆFÔ"Øˆs$   ÌL*Ì*
L7Ì6L7Ð	PÐ
P)Ð(P)c                 ó\   — | j         s$|| j        _        |                      d|¦  «         dS dS )z9Set maximun number of qubits to be used for this backend.Ún_qubitsN)r+   r&   rê   Ú_set_configuration_option)r0   Ú
max_qubitss     r5   Úset_max_qubitszAerBackend.set_max_qubits¯  sA   € àÔ!ð 	CØ+5ˆDÔÔ(Ø×*Ò*¨:°zÑBÔBÐBÐBÐBð	Cð 	Cr6   c                 óT   — |                       ¦   «         | _        i | _        i | _        dS )z.Reset the simulator options to default values.N)Ú_default_optionsÚ_optionsr'   r(   r‚   s    r5   Úclear_optionszAerBackend.clear_optionsµ  s+   € à×-Ò-Ñ/Ô/ˆŒØ&(ˆÔ#Ø#%ˆÔ Ð Ð r6   Ú Tc                 óî  — t          j         ¦   «         } | j        |fi |¤Ž\  }}| j        �+t          ||                      ¦   «         j        ¦  «        \  }}	nt          |¦  «        \  }}	|r|                      |||	¦  «        |d<   n(t          d„ |D ¦   «         ¦  «        st          d¦  «        ‚t          |¦  «        D ]\  }
}|
|_
        Œt          || j        fi |¤Ž}d„ t          ||¦  «        D ¦   «         }|                      |||¦  «        }t          |t           ¦  «        sLt"                               d| j        ¦  «         |rt"                               d|¦  «         t          d¦  «        ‚||d	<   t(          j                             ¦   «                              ¦   «         |d
<   | j        |d<   |                      ¦   «         j        |d<   |d         D ]+}d|vrŒ||                     d¦  «                 |d         d<   Œ,t          j         ¦   «         |z
  |d<   |                     dd¦  «        s.d}d|v r|d|d         › �z  }t"                               |¦  «         |r|                      |¦  «        S |S )z	Run a jobNrT   c              3   óF   K  — | ]}t          |j        ¦  «        d k    V — ŒdS )r   N)rJ   r@   )r;   r^   s     r5   r³   z3AerBackend._execute_circuits_job.<locals>.<genexpr>Í  s2   è è € ÐJÐJ°g•S˜Ô+Ñ,Ô,°Ò1ÐJÐJÐJÐJÐJÐJr6   z>circuits have parameters but parameter_binds is not specified.c                 ó.   — i | ]\  }}|j         |j        “ŒS r!   )Úcirc_idÚmetadata)r;   Úaer_circuitr^   s      r5   r?   z4AerBackend._execute_circuits_job.<locals>.<dictcomp>Ö  s4   € ð 
ð 
ð 
á$�˜Wð Ô Ô!1ð
ð 
ð 
r6   z%s: simulation failed.z
Output: %sz5simulation terminated without returning valid output.rs   Údater$   r    ÚresultsÚheaderrö   r÷   Ú
time_takenÚsuccessFzSimulation failedÚstatusz+ and returned the following error message:
)ÚtimeÚ_compiler)   r   r-   r{   rh   Úallr   rY   rö   r   ÚoptionsÚzipÚ_execute_circuitsrI   rÊ   rÓ   r®   r   ÚdatetimeÚnowÚ	isoformatr    Úpoprœ   ÚwarningÚ_format_results)r0   rg   rf   rk   rs   Úformat_resultÚstartÚnoise_modelÚaer_circuitsre   rö   rø   r|   Úmetadata_mapÚoutputÚresultÚmsgs                    r5   rq   z AerBackend._execute_circuits_job»  sÎ  € õ
 ”	‘”ˆð !. ¤¨hÐ FÐ F¸+Ð FÐ FÑˆ�+àŒ<Ð#Ý%6°xÀ×ASÒASÑAUÔAUÔAaÑ%bÔ%bÑ"ˆL˜(˜(å%6°xÑ%@Ô%@Ñ"ˆL˜(Øð 	]Ø/3×/BÒ/BØ˜/¨8ñ0ô 0ˆKÐ+Ñ,Ð,õ ÐJÐJÀÐJÑJÔJÑJÔJð 	]ÝÐ[Ñ\Ô\Ð\å$-¨lÑ$;Ô$;ð 	*ð 	*Ñ ˆG�[Ø")ˆKÔÐå$ X¨t¬|ÐKÐK¸{ÐKÐKˆð
ð 
å(+¨L¸(Ñ(CÔ(Cð
ñ 
ô 
ˆð ×'Ò'¨°kÀ6ÑJÔJˆõ ˜&¥$Ñ'Ô'ð 	TÝ�LŠLÐ1°4´9Ñ=Ô=Ð=Øð 3Ý—’˜\¨6Ñ2Ô2Ð2ÝÐRÑSÔSÐSð "ˆˆxÑÝ!Ô*×.Ò.Ñ0Ô0×:Ò:Ñ<Ô<ˆˆv‰Ø!%¤ˆˆ~ÑØ$(×$6Ò$6Ñ$8Ô$8Ô$HˆÐ Ñ!ð ˜YÔ'ð 	Oð 	OˆFØ˜vÐ%Ð%ØØ+7¸¿
º
À9Ñ8MÔ8MÔ+NˆF�8Ô˜ZÑ(Ð(õ  $œy™{œ{¨UÑ2ˆˆ|Ñð �zŠz˜) UÑ+Ô+ð 	 Ø%ˆCØ˜6Ð!Ð!ØÐXÀfÈXÔFVÐXÐXÑX�Ý�NŠN˜3ÑÔÐØð 	0Ø×'Ò'¨Ñ/Ô/Ð/Øˆr6   c                 ól  — | d         D ]˜}|                      di ¦  «        }|                      di ¦  «        }|                      di ¦  «        }|                      di ¦  «        }|                     ¦   «         D ])\  }}||v r t          |||         ||         ¦  «        ||<   Œ*Œ™t          j        | ¦  «        S )z3Format C++ simulator output for constructing Resultrú   rZ   r÷   Úresult_typesÚresult_subtypes)rœ   rx   r   r	   Ú	from_dict)r  r  rZ   r÷   Ú
save_typesÚsave_subtypesr}   r~   s           r5   r
  zAerBackend._format_resultsü  sÈ   € ð ˜YÔ'ð 	[ð 	[ˆFØ—:’:˜f bÑ)Ô)ˆDØ—z’z *¨bÑ1Ô1ˆHØ!Ÿš n°bÑ9Ô9ˆJØ$ŸLšLÐ):¸BÑ?Ô?ˆMØ ŸJšJ™LœLð [ð [‘��SØ˜*Ð$Ð$Ý 0°°jÀ´oÀ}ÐUXÔGYÑ ZÔ Z�D˜‘Iøð[õ Ô Ñ'Ô'Ð'r6   c                 ó    — t          |t          ¦  «        r|g}d„ |D ¦   «         }t          ||¬¦  «        \  }} | j        ||fi |¤Ž\  }}}||fS )z Compile circuits and noise modelc                 ó,   — g | ]}t          |¦  «        ‘ŒS r!   )r   ©r;   Úcircs     r5   rC   z'AerBackend._compile.<locals>.<listcomp>  s    € Ð>Ð>Ð>¨T•? 4Ñ(Ô(Ð>Ð>Ð>r6   )Úoptypes)rI   r   r   Ú_assemble_noise_model)r0   rg   rk   r  r  s        r5   r   zAerBackend._compile	  s„   € å�h¥Ñ/Ô/ð 	"Ø �zˆHØ>Ð>°XÐ>Ñ>Ô>ˆõ ,¨H¸gÐFÑFÔFÑˆ�'ð .H¨TÔ-GØ�gð.
ð .
Ø!,ð.
ð .
Ñ*ˆ�+˜{ð ˜Ð$Ð$r6   c                 ó¦  ‡— t          j         |¦  «        Šd}|                     dt          | j        dd¦  «        ¦  «        }|r®t	          d„ ‰D ¦   «         ¦  «        r•|                     ¦   «         }|�d„ t          |¦  «        D ¦   «         }|                     ˆfd„|D ¦   «         ¦  «        }t          |t          ¦  «        r|g}t          ||¦  «        D ]\  }	}
|
‰|	<   t          |
¦  «        ||	<   Œt          ‰¦  «        D �]K\  }	}
t          ||	         v �r5d}g }|
j        D ]ç}|j        |j        |j        }}}t          |t          ¦  «        r£d}|s'|€t#          ¦   «         }nt          j        |¦  «        }d}|j        }t)          |¦  «        }|                     |||f¦  «         ||	                              t(          ¦  «         |j        |j        vr|                     ||j        ¦  «         ŒÏ|                     |||f¦  «         Œè|r@|
                      ¦   «         }||_        |‰|	<   ||	                              t          ¦  «         �ŒM‰||fS )z<Move quantum error instructions from circuits to noise modelFr  Nc              3   ó@   K  — | ]}t          |t          ¦  «        V — Œd S r±   )rI   r   r  s     r5   r³   z3AerBackend._assemble_noise_model.<locals>.<genexpr>'  s,   è è € ÐYÐYÀD�z¨$µÑ?Ô?ÐYÐYÐYÐYÐYÐYr6   c                 ó*   — g | ]\  }}t           |v ¯|‘ŒS r!   )r   )r;   rd   Úoptypes      r5   rC   z4AerBackend._assemble_noise_model.<locals>.<listcomp>+  s"   € Ð!_Ð!_Ð!_©+¨#¨vÍuÐX^ÈÈ #ÈÈÈr6   c                 ó    •— g | ]
}‰|         ‘ŒS r!   r!   )r;   r>   Úrun_circuitss     €r5   rC   z4AerBackend._assemble_noise_model.<locals>.<listcomp>.  s   ø€ Ð.WÐ.WÐ.WÀ1¨|¸A¬Ð.WÐ.WÐ.Wr6   T)rw   rœ   rÀ   r  r  Ú_pass_managerrY   rl   rI   r   r  r   r   rZ   r[   rä   Úclbitsr   ÚdeepcopyÚ_quantum_errorr   rH   rÑ   ÚidÚ_default_quantum_errorsÚadd_all_qubit_quantum_errorÚdiscard)r0   rg   r  rk   Úupdated_noiser  ÚnpmÚtranspile_idxsÚtranspiled_circuitsrd   r  Úupdated_circÚnew_dataÚdatumÚinstÚqargsÚcargsÚqerrorÚ
qerror_locÚnew_circr$  s                       @r5   r  z AerBackend._assemble_noise_model  s–  ø€ õ ”y Ñ*Ô*ˆð
 ˆØ!—o’o mµW¸T¼\È=ÐZ^Ñ5_Ô5_Ñ`Ô`ˆð
 ð 	9�3ÐYÐYÈLÐYÑYÔYÑYÔYð 	9Ø×+Ò+Ñ-Ô-ˆCØˆà!_Ð!_½À7Ñ9KÔ9KÐ!_Ñ!_Ô!_�ð '*§g¢gÐ.WÐ.WÐ.WÐ.WÈÐ.WÑ.WÔ.WÑ&XÔ&XÐ#ÝÐ1µ>ÑBÔBð @Ø+>Ð*?Ð'õ "% ^Ð5HÑ!IÔ!Ið 9ð 9‘I�C˜Ø(,�L Ñ%Ý#2°4Ñ#8Ô#8�G˜C‘L�Lõ # <Ñ0Ô0ð 	Dñ 	D‰IˆC�Ý(¨G°C¬LÐ8Ñ8Ø$�Ø�Ø!œYð >ð >�EØ).¬¸%¼,ÈÌ ˜%�DÝ! $Õ(AÑBÔBð >Ø'+˜Ø,ð 1à*Ð2Ý.8©l¬l  å.2¬m¸KÑ.HÔ.H Ø,0˜Mà!%Ô!4˜Ý%9¸&Ñ%AÔ%A˜
Ø Ÿš¨°U¸EÐ(BÑCÔCÐCØ œ×(Ò(Õ)=Ñ>Ô>Ð>à!œ9¨KÔ,OÐOÐOØ'×CÒCÀFÈFÌIÑVÔVÐVøà Ÿš¨¨u°eÐ(<Ñ=Ô=Ð=Ð=Øð DØ#Ÿyšy™{œ{�HØ$,�H”MØ(0�L Ñ%Ø˜C”L×(Ò(Õ)BÑCÔCÐCùð ˜[¨+Ð5Ð5r6   c                 óF   — d|v r|d         S t          | j        dd¦  «        S )zGet the executorÚexecutorN)rÀ   rð   )r0   rk   s     r5   Ú_get_executorzAerBackend._get_executorZ  s,   € à˜Ð$Ð$Ø˜zÔ*Ð*å˜4œ=¨*°dÑ;Ô;Ð;r6   c                 ó   — dS )a*  Execute aer circuits on the backend.

        Args:
            aer_circuits (List of AerCircuit): simulator input.
            noise_model (NoiseModel): noise model
            config (Dict): configuration for simulation

        Returns:
            dict: return a dictionary of results.
        Nr!   )r0   r  r  r|   s       r5   r  zAerBackend._execute_circuitsa  s	   € ð 	ˆr6   c                 ó¨  — t          | j        |¦  «        r|                      ||¦  «         dS t          | j        |¦  «        r|                      ||¦  «         dS t          | j        |¦  «        st          d|› �¦  «        ‚|�t          | j        ||¦  «         dS t          | j        |t          |  	                    ¦   «         |¦  «        ¦  «         dS )aR  Special handling for setting backend options.

        This method should be extended by sub classes to
        update special option values.

        Args:
            key (str): key to update
            value (any): value to update.

        Raises:
            AerError: if key is 'method' and val isn't in available methods.
        zInvalid option N)
rz   r&   rë   r%   Ú_set_properties_optionrð   r   ry   rÀ   rï   ©r0   r}   Úvalues      r5   Ú
set_optionzAerBackend.set_optiono  så   € õ" �4Ô&¨Ñ,Ô,ð 	SØ×*Ò*¨3°Ñ6Ô6Ð6Ð6Ð6Ý�TÔ% sÑ+Ô+ð 	SØ×'Ò'¨¨UÑ3Ô3Ð3Ð3Ð3å˜4œ=¨#Ñ.Ô.ð 8ÝÐ6°Ð6Ð6Ñ7Ô7Ð7ØÐ å˜œ s¨EÑ2Ô2Ð2Ð2Ð2õ
 ˜œ s­G°D×4IÒ4IÑ4KÔ4KÈSÑ,QÔ,QÑRÔRÐRÐRÐRr6   c                 óf   — |                      ¦   «         D ]\  }}|                      ||¦  «         ŒdS )zSet the simulator optionsN)rx   rB  )r0   Úfieldsr}   rA  s       r5   r,   zAerBackend.set_options�  s>   € à Ÿ,š,™.œ.ð 	(ð 	(‰JˆC�Ø�OŠO˜C Ñ'Ô'Ð'Ð'ð	(ð 	(r6   c                 ól   — |�|| j         |<   dS || j         v r| j                              |¦  «         dS dS )z;Special handling for setting backend configuration options.N)r'   r  r@  s      r5   rë   z$AerBackend._set_configuration_option•  sN   € àÐØ/4ˆDÔ'¨Ñ,Ð,Ð,Ø�DÔ/Ð/Ð/ØÔ'×+Ò+¨CÑ0Ô0Ð0Ð0Ð0ð 0Ð/r6   c                 ól   — |�|| j         |<   dS || j         v r| j                              |¦  «         dS dS )z8Special handling for setting backend properties options.N)r(   r  r@  s      r5   r?  z!AerBackend._set_properties_optionœ  sN   € àÐØ,1ˆDÔ$ SÑ)Ð)Ð)Ø�DÔ,Ð,Ð,ØÔ$×(Ò(¨Ñ-Ô-Ð-Ð-Ð-ð -Ð,r6   c                 ó@   — | j         j        }d| j        › d�}|› d|› d�S )z'String representation of an AerBackend.ú'ú(ú))r4   Ú__name__r   )r0   r   Údisplays      r5   Ú__repr__zAerBackend.__repr__£  s5   € àŒ~Ô&ˆØ"�d”iÐ"Ð"Ð"ˆØÐ#Ð#˜Ð#Ð#Ð#Ð#r6   )NNNNr±   )rò   T)rK  Ú
__module__Ú__qualname__Ú__doc__r#   ra   rh   rl   rj   r-   r1   Úpropertyrƒ   r2   rí   rñ   rq   Ústaticmethodr
  r   r  r<  r   r  rB  r,   rë   r?  rM  Ú__classcell__)r4   s   @r5   r   r   ,   så  ø€ € € € € ØÐð [_ð/Pð /Pð /Pð /Pð /Pð /Pðb!ð !ð !ð@!ð !ð !ð !ð$'Lð 'Lð 'Lð 'LðRð ð ð ð ð ð
ð 
ð 
ð ðð ñ „Xðð ðð ñ „XððBCð Cð Cð&ð &ð &ð PTð?ð ?ð ?ð ?ðB ð
(ð 
(ñ „\ð
(ð%ð %ð %ð ?6ð ?6ð ?6ðB<ð <ð <ð ðð ñ „^ððSð Sð SðB(ð (ð (ð
1ð 1ð 1ð.ð .ð .ð$ð $ð $ð $ð $ð $ð $r6   r   )/rP  rw   r  Úloggingrÿ   ro   rÆ   Úabcr   r   Úqiskit.circuitr   r   r   Úqiskit.providersr   ÚBackendÚqiskit.resultr	   Úqiskit.transpilerr
   r¸   r   Úaererrorr   Újobsr   Únoise.noise_modelr   r   Únoise.errors.base_quantum_errorr   Úaer_compilerr   r   r   Úbackend_utilsr   r   Úname_mappingr   Úcontroller_wrappersr   Ú	getLoggerrK  rÓ   r   r!   r6   r5   ú<module>rd     sÃ  ððð ð €€€Ø €€€Ø €€€Ø €€€Ø €€€Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ð #Ð #à EÐ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EØ 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø  Ð  Ð  Ð  Ð  Ð  Ø )Ð )Ð )Ð )Ð )Ð )Ø +Ð +Ð +Ð +Ð +Ð +Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ø GÐ GÐ GÐ GÐ GÐ GØ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QØ <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ø &Ð &Ð &Ð &Ð &Ð &ð +Ð *Ð *Ð *Ð *Ð *ð 
ˆÔ	˜8Ñ	$Ô	$€ð{	$ð {	$ð {	$ð {	$ð {	$�˜#ñ {	$ô {	$ð {	$ð {	$ð {	$r6   