§
    ¹³ÙgP   ã                  óò   — d 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 ddlmZ dd	lmZmZ dd
lmZ ddlmZ ddlmZmZ ddlmZmZ ddlmZ ddlmZ  G d„ deee                  ¦  «        Z dS )z:Sampler V1 implementation for an arbitrary Backend object.é    )ÚannotationsN)ÚSequence)ÚAny)ÚQuantumCircuit)Ú	BackendV1Ú	BackendV2)ÚOptions)ÚQuasiDistributionÚResult)ÚPassManager)Údeprecate_funcé   )Ú_prepare_countsÚ_run_circuits)ÚBaseSamplerÚSamplerResult)ÚPrimitiveJob)Ú_circuit_keyc                  óÜ   ‡ — e Zd ZdZ edd¬¦  «        	 	 	 d&d'ˆ fd„¦   «         Zed(d„¦   «         Zed(d„¦   «         Zed)d„¦   «         Z	ed*d„¦   «         Z
d„ Zd+d„Zd,d „Zd!„ Zd"„ Zd-d%„Zˆ xZS ).ÚBackendSamplera†  A :class:`~.BaseSampler` (V1) implementation that provides a wrapper for
    leveraging the Sampler V1 interface from any backend.

    This class provides a sampler interface from any backend and doesn't do
    any measurement mitigation, it just computes the probability distribution
    from the counts. It facilitates using backends that do not provide a
    native :class:`~.BaseSampler` V1 implementation in places that work with
    :class:`~.BaseSampler` V1.
    However, if you're using a provider that has a native implementation of
    :class:`~.BaseSamplerV1` ( :class:`~.BaseSampler`) or
    :class:`~.BaseESamplerV2`, it is a better
    choice to leverage that native implementation as it will likely include
    additional optimizations and be a more efficient implementation.
    The generic nature of this class precludes doing any provider- or
    backend-specific optimizations.
    z1.2zµAll implementations of the `BaseSamplerV1` interface have been deprecated in favor of their V2 counterparts. The V2 alternative for the `BackendSampler` class is `BackendSamplerV2`.)ÚsinceÚadditional_msgNFÚbackendúBackendV1 | BackendV2Úoptionsúdict | NoneÚbound_pass_managerúPassManager | NoneÚskip_transpilationÚboolc                óâ   •— t          ¦   «                              |¬¦  «         g | _        g | _        || _        t          ¦   «         | _        || _        d| _        g | _	        || _
        i | _        dS )aD  Initialize a new BackendSampler (V1) instance

        Args:
            backend: (required) the backend to run the sampler primitive on
            options: Default options.
            bound_pass_manager: An optional pass manager to run after
                parameter binding.
            skip_transpilation: If this is set to True the internal compilation
                of the input circuits is skipped and the circuit objects
                will be directly executed when this objected is called.
        Raises:
            ValueError: If backend is not provided
        )r   N)ÚsuperÚ__init__Ú	_circuitsÚ_parametersÚ_backendr	   Ú_transpile_optionsÚ_bound_pass_managerÚ_preprocessed_circuitsÚ_transpiled_circuitsÚ_skip_transpilationÚ_circuit_ids)Úselfr   r   r   r   Ú	__class__s        €úW/granary/edev/quantum/lib/python3.11/site-packages/qiskit/primitives/backend_sampler.pyr#   zBackendSampler.__init__4   sp   ø€ õ6 	‰Œ×Ò ÐÑ)Ô)Ð)ØˆŒØˆÔØˆŒÝ")¡)¤)ˆÔØ#5ˆÔ ØCGˆÔ#Ø:<ˆÔ!Ø#5ˆÔ ØˆÔÐÐó    Úreturnúlist[QuantumCircuit]c                ó*   — t          | j        ¦  «        S )z×
        Preprocessed quantum circuits produced by preprocessing
        Returns:
            List of the transpiled quantum circuit
        Raises:
            QiskitError: if the instance has been closed.
        )Úlistr$   ©r-   s    r/   Úpreprocessed_circuitsz$BackendSampler.preprocessed_circuitsZ   s   € õ �D”NÑ#Ô#Ð#r0   c                óÎ   — | j         rt          | j        ¦  «        | _        n>t	          | j        ¦  «        t	          | j        ¦  «        k     r|                      ¦   «          | j        S )z¼
        Transpiled quantum circuits.
        Returns:
            List of the transpiled quantum circuit
        Raises:
            QiskitError: if the instance has been closed.
        )r+   r4   r$   r*   ÚlenÚ
_transpiler5   s    r/   Útranspiled_circuitsz"BackendSampler.transpiled_circuitse   s]   € ð Ô#ð 	Ý(,¨T¬^Ñ(<Ô(<ˆDÔ%Ð%Ý�Ô*Ñ+Ô+­c°$´.Ñ.AÔ.AÒAÐAà�OŠOÑÔÐØÔ(Ð(r0   c                ó   — | j         S )zU
        Returns:
            The backend which this sampler object based on
        )r&   r5   s    r/   r   zBackendSampler.backendu   s   € ð Œ}Ðr0   r	   c                ó   — | j         S )z;Return the transpiler options for transpiling the circuits.)r'   r5   s    r/   Útranspile_optionsz BackendSampler.transpile_options}   s   € ð Ô&Ð&r0   c                ó*   —  | j         j        di |¤Ž dS )zæSet the transpiler options for transpiler.
        Args:
            **fields: The fields to update the options.
        Returns:
            self.
        Raises:
            QiskitError: if the instance has been closed.
        N© )r'   Úupdate_options)r-   Úfieldss     r/   Úset_transpile_optionsz$BackendSampler.set_transpile_options‚   s&   € ð 	/ˆÔÔ.Ð8Ð8°Ð8Ð8Ð8Ð8Ð8r0   ÚcircuitsúSequence[int]Úparameter_valuesúSequence[Sequence[float]]r   c                óÐ   ‡ ‡— ‰ j         Šˆ ˆfd„t          ||¦  «        D ¦   «         }‰                      |¦  «        }t          |‰ j        fi |¤Ž\  }}‰                      ||¦  «        S )Nc           
     óÎ   •— g | ]a\  }}t          |¦  «        d k    r‰|         n@‰|                              t          t          ‰j        |         |¦  «        ¦  «        ¦  «        ‘ŒbS )r   )r8   Úassign_parametersÚdictÚzipr%   )Ú.0ÚiÚvaluer-   r:   s      €€r/   ú
<listcomp>z(BackendSampler._call.<locals>.<listcomp>–   s}   ø€ ð 	
ð 	
ð 	
ñ ��5õ �u‘:”: ’?�?ð $ AÔ&Ð&à(¨Ô+×=Ò=Ý�#˜dÔ.¨qÔ1°5Ñ9Ô9Ñ:Ô:ñô ð		
ð 	
ð 	
r0   )r:   rK   Ú_bound_pass_manager_runr   r&   Ú_postprocessing)r-   rC   rE   Úrun_optionsÚbound_circuitsÚresultÚ	_metadatar:   s   `      @r/   Ú_callzBackendSampler._call�   s’   øø€ ð #Ô6Ðð	
ð 	
ð 	
ð 	
ð 	
õ   Ð*:Ñ;Ô;ð	
ñ 	
ô 	
ˆð ×5Ò5°nÑEÔEˆå)¨.¸$¼-ÐWÐWÈ;ÐWÐWÑˆ�	Ø×#Ò# F¨NÑ;Ô;Ð;r0   rT   úlist[Result]c                ó²  ‡	— t          |¦  «        }t          |d                              ¦   «         ¦  «        Š	g }d„ t          t	          |¦  «        ¦  «        D ¦   «         }|D ]f}ˆ	fd„|                     ¦   «         D ¦   «         }|                     t          |‰	t          j	        d‰	z  ¦  «        ¬¦  «        ¦  «         |D ]}‰	|d<   ŒŒgt          ||¦  «        S )Nr   c                ó   — g | ]}i ‘ŒS r?   r?   )rL   Ú_s     r/   rO   z2BackendSampler._postprocessing.<locals>.<listcomp>¬   s   € Ð)KÐ)KÐ)K°¨"Ð)KÐ)KÐ)Kr0   c                ó"   •— i | ]\  }}||‰z  “ŒS r?   r?   )rL   ÚkÚvÚshotss      €r/   ú
<dictcomp>z2BackendSampler._postprocessing.<locals>.<dictcomp>®   s#   ø€ Ð@Ð@Ð@©$¨!¨Q˜˜A ™IÐ@Ð@Ð@r0   r   )r^   Ústddev_upper_boundr^   )r   ÚsumÚvaluesÚranger8   ÚitemsÚappendr
   ÚmathÚsqrtr   )
r-   rT   rC   ÚcountsÚprobabilitiesÚmetadataÚcountÚ	prob_distÚ	metadatumr^   s
            @r/   rQ   zBackendSampler._postprocessing¥   sõ   ø€ õ ! Ñ(Ô(ˆÝ�F˜1”I×$Ò$Ñ&Ô&Ñ'Ô'ˆàˆØ)KÐ)Kµe½CÀ¹M¼MÑ6JÔ6JÐ)KÑ)KÔ)KˆØð 	+ð 	+ˆEØ@Ð@Ð@Ð@°%·+²+±-´-Ð@Ñ@Ô@ˆIØ× Ò Ý! )°5ÍTÌYÐWXÐ[`ÑW`ÑMaÔMaÐbÑbÔbñô ð ð &ð +ð +�	Ø%*�	˜'Ñ"Ð"ð+õ ˜]¨HÑ5Ô5Ð5r0   c                ó¶   — ddl m} t          | j        ¦  «        }| j                              || j        |d …         | j        fi | j        j        ¤Ž¦  «         d S )Nr   )Ú	transpile)	Úqiskit.compilerro   r8   r*   Úextendr6   r   r=   Ú__dict__)r-   ro   Ústarts      r/   r9   zBackendSampler._transpile·   s�   € Ø-Ð-Ð-Ð-Ð-Ð-å�DÔ-Ñ.Ô.ˆØÔ!×(Ò(ØˆIØÔ*¨5¨6¨6Ô2Ø”ðð ð Ô(Ô1ðð ñ	
ô 	
ð 	
ð 	
ð 	
r0   c                ó|   — | j         €|S | j                              |¦  «        }t          |t          ¦  «        s|g}|S ©N)r(   ÚrunÚ
isinstancer4   )r-   rC   Úoutputs      r/   rP   z&BackendSampler._bound_pass_manager_runÃ   sD   € ØÔ#Ð+ØˆOàÔ-×1Ò1°(Ñ;Ô;ˆFÝ˜f¥dÑ+Ô+ð "Ø ˜�ØˆMr0   útuple[QuantumCircuit, ...]útuple[tuple[float, ...], ...]c                óô  — g }|D ]Ê}| j                              t          |¦  «        ¦  «        }|�|                     |¦  «         ŒA|                     t	          | j        ¦  «        ¦  «         t	          | j        ¦  «        | j         t          |¦  «        <   | j                             |¦  «         | j                             |j        ¦  «         ŒËt          | j	        ||fi |¤Ž}| 
                    ¦   «          |S ru   )r,   Úgetr   re   r8   r$   r%   Ú
parametersr   rV   Ú_submit)r-   rC   rE   rR   Úcircuit_indicesÚcircuitÚindexÚjobs           r/   Ú_runzBackendSampler._runÌ   sñ   € ð ˆØð 	<ð 	<ˆGØÔ%×)Ò)­,°wÑ*?Ô*?Ñ@Ô@ˆEØÐ Ø×&Ò& uÑ-Ô-Ð-Ð-à×&Ò&¥s¨4¬>Ñ':Ô':Ñ;Ô;Ð;Ý;>¸t¼~Ñ;NÔ;N�Ô!¥,¨wÑ"7Ô"7Ñ8Ø”×%Ò% gÑ.Ô.Ð.ØÔ ×'Ò'¨Ô(:Ñ;Ô;Ð;Ð;Ý˜4œ: Ð8HÐXÐXÈKÐXÐXˆØ�Š‰ŒˆØˆ
r0   )NNF)r   r   r   r   r   r   r   r    )r1   r2   )r1   r   )r1   r	   )rC   rD   rE   rF   r1   r   )rT   rW   rC   r2   r1   r   )rC   ry   rE   rz   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r#   Úpropertyr6   r:   r   r=   rB   rV   rQ   r9   rP   rƒ   Ú__classcell__)r.   s   @r/   r   r   "   sj  ø€ € € € € ðð ð" €^ØðSðñ ô ð  $Ø15Ø#(ðð ð ð ð ð ñô ðð@ ð$ð $ð $ñ „Xð$ð ð)ð )ð )ñ „Xð)ð ðð ð ñ „Xðð ð'ð 'ð 'ñ „Xð'ð	9ð 	9ð 	9ð<ð <ð <ð <ð06ð 6ð 6ð 6ð$

ð 

ð 

ðð ð ðð ð ð ð ð ð ð r0   r   )!r‡   Ú
__future__r   rf   Úcollections.abcr   Útypingr   Úqiskit.circuit.quantumcircuitr   Úqiskit.providers.backendr   r   Úqiskit.providers.optionsr	   Úqiskit.resultr
   r   Úqiskit.transpiler.passmanagerr   Úqiskit.utils.deprecationr   Úbackend_estimatorr   r   Úbaser   r   Úprimitive_jobr   Úutilsr   r   r?   r0   r/   ú<module>r—      sa  ðð AÐ @à "Ð "Ð "Ð "Ð "Ð "à €€€Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð à 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3à =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø Ð Ð Ð Ð Ð ð|ð |ð |ð |ð |�[ ¨mÔ!<Ô=ñ |ô |ð |ð |ð |r0   