§
    ¹³Ùgµ3  ã                  óÚ  — 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	m
Z
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 ddlmZ ddlmZmZ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%m&Z& ddl'm(Z( e G d„ d¦  «        ¦   «         Z)e G d„ d¦  «        ¦   «         Z*ee+e,         e+e+e-                  e+e+e+e-                           f         Z.	  G d„ de¦  «        Z/d*d„Z0d+d „Z1d,d%„Z2d-d)„Z3dS ).z:Sampler V2 implementation for an arbitrary Backend object.é    )ÚannotationsN)Údefaultdict)Ú	dataclass)ÚAnyÚIterableÚUnion)ÚNDArray)ÚQuantumCircuit)ÚQiskitError)Ú_run_circuits)ÚBaseSamplerV2)ÚBitArrayÚDataBinÚPrimitiveResultÚSamplerPubLikeÚSamplerPubResult)Ú_min_num_bytes)Ú
SamplerPub)ÚPrimitiveJob)Ú	BackendV1Ú	BackendV2)ÚResultc                  óB   — e Zd ZU dZdZded<   	 dZded<   	 dZded	<   dS )
ÚOptionsz'Options for :class:`~.BackendSamplerV2`i   ÚintÚdefault_shotsNú
int | NoneÚseed_simulatorzdict[str, Any] | NoneÚrun_options)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r   r   © ó    úZ/granary/edev/quantum/lib/python3.11/site-packages/qiskit/primitives/backend_sampler_v2.pyr   r   +   s]   € € € € € € à1Ð1à€MÐÐÐÑðð "&€NÐ%Ð%Ð%Ñ%ðð *.€KÐ-Ð-Ð-Ñ-ðð r&   r   c                  ó8   — e Zd ZU ded<   ded<   ded<   ded<   dS )Ú_MeasureInfoÚstrÚ	creg_namer   Únum_bitsÚ	num_bytesÚstartN)r    r!   r"   r$   r%   r&   r'   r)   r)   ?   s4   € € € € € € à€N€N�NØ€M€M�MØ€N€N�NØ€J€J�J€J€Jr&   r)   c                  ó~   — e Zd ZdZddœd'd„Zed(d
„¦   «         Zed)d„¦   «         Zddœd*d„Zd+d„Z	d,d„Z
d-d„Zd.d&„ZdS )/ÚBackendSamplerV2a€  Evaluates bitstrings for provided quantum circuits

    The :class:`~.BackendSamplerV2` class is a generic implementation of the
    :class:`~.BaseSamplerV2` interface that is used to wrap a :class:`~.BackendV2`
    (or :class:`~.BackendV1`) object in the class :class:`~.BaseSamplerV2` API. It
    facilitates using backends that do not provide a native
    :class:`~.BaseSamplerV2` implementation in places that work with
    :class:`~.BaseSamplerV2`. However,
    if you're using a provider that has a native implementation of
    :class:`~.BaseSamplerV2`, 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.

    This class does not perform any measurement or gate mitigation.

    Each tuple of ``(circuit, <optional> parameter values, <optional> shots)``, called a sampler
    primitive unified bloc (PUB), produces its own array-valued result. The :meth:`~run` method can
    be given many pubs at once.

    The options for :class:`~.BackendSamplerV2` consist of the following items.

    * ``default_shots``: The default shots to use if none are specified in :meth:`~run`.
      Default: 1024.

    * ``seed_simulator``: The seed to use in the simulator. If None, a random seed will be used.
      Default: None.

    * ``run_options``: A dictionary of options to pass through to the ``run()``
      method of the wrapped :class:`~.BackendV2` instance.

    .. note::

        This class requires a backend that supports ``memory`` option.

    N)ÚoptionsÚbackendúBackendV1 | BackendV2r1   údict | Nonec               óÀ   — t          |t          ¦  «        s t          j        d|› d�t          d¬¦  «         || _        |rt          di |¤Žnt          ¦   «         | _        dS )a;  
        .. deprecated:: 1.4
            The method ``BackendSamplerV2.__init__`` will stop supporting inputs of type
            :class:`.BackendV1` in the `backend` parameter in a future release no
            earlier than 2.0. :class:`.BackendV1` is deprecated and implementations should
            move to :class:`.BackendV2`.

        Args:
            backend: The backend to run the primitive on.
            options: The options to control the default shots (``default_shots``) and
                the random seed for the simulator (``seed_simulator``).
        zYThe method `BackendSamplerV2.__init__` will stop supporting inputs of type `BackendV1` ( z� ) in the `backend` parameter in a future release no earlier than 2.0. `BackendV1` is deprecated and implementations should move to `BackendV2`.é   )ÚcategoryÚ
stacklevelNr%   )Ú
isinstancer   ÚwarningsÚwarnÚDeprecationWarningÚ_backendr   Ú_options)Úselfr2   r1   s      r'   Ú__init__zBackendSamplerV2.__init__w   s~   € õ$ ˜'¥9Ñ-Ô-ð 	ÝŒMð.Ø&-ð.ð .ð .õ ,Øðñ ô ð ð  ˆŒØ.5ÐD�Ð*Ð* 'Ð*Ð*Ð*½7¹9¼9ˆŒˆˆr&   Úreturnc                ó   — | j         S )z7Returns the backend which this sampler object based on.)r=   ©r?   s    r'   r2   zBackendSamplerV2.backend•   ó   € ð Œ}Ðr&   r   c                ó   — | j         S )zReturn the options)r>   rC   s    r'   r1   zBackendSamplerV2.optionsš   rD   r&   )ÚshotsÚpubsúIterable[SamplerPubLike]rF   r   ú/PrimitiveJob[PrimitiveResult[SamplerPubResult]]c               ó¼   ‡— ‰€| j         j        Šˆfd„|D ¦   «         }|                      |¦  «         t          | j        |¦  «        }|                     ¦   «          |S )Nc                ó:   •— g | ]}t          j        |‰¦  «        ‘ŒS r%   )r   Úcoerce)Ú.0ÚpubrF   s     €r'   ú
<listcomp>z(BackendSamplerV2.run.<locals>.<listcomp>¤   s&   ø€ ÐFÐFÐF¸#�
Ô)¨#¨uÑ5Ô5ÐFÐFÐFr&   )r>   r   Ú_validate_pubsr   Ú_runÚ_submit)r?   rG   rF   Úcoerced_pubsÚjobs     `  r'   ÚrunzBackendSamplerV2.runŸ   sd   ø€ ð ˆ=Ø”MÔ/ˆEØFÐFÐFÐFÀÐFÑFÔFˆØ×Ò˜LÑ)Ô)Ð)Ý˜4œ9 lÑ3Ô3ˆØ�Š‰ŒˆØˆ
r&   úlist[SamplerPub]c                ó¦   — t          |¦  «        D ]@\  }}t          |j        j        ¦  «        dk    rt	          j        d|› d�t          ¦  «         ŒAd S )Nr   zThe z‚-th pub's circuit has no output classical registers and so the result will be empty. Did you mean to add measurement instructions?)Ú	enumerateÚlenÚcircuitÚcregsr:   r;   ÚUserWarning)r?   rG   ÚirN   s       r'   rP   zBackendSamplerV2._validate_pubsª   so   € Ý ‘o”oð 	ð 	‰FˆAˆsÝ�3”;Ô$Ñ%Ô%¨Ò*Ð*Ý”ðS˜1ð Sð Sð Såñô ð øð	ð 	r&   ú!PrimitiveResult[SamplerPubResult]c                ó�  ‡— t          t          ¦  «        }t          ‰¦  «        D ]%\  }}||j                                      |¦  «         Œ&d gt          ‰¦  «        z  }|                     ¦   «         D ]B\  }}|                      ˆfd„|D ¦   «         |¦  «        }t          ||¦  «        D ]
\  }}	|	||<   ŒŒCt          |ddi¬¦  «        S )Nc                ó    •— g | ]
}‰|         ‘ŒS r%   r%   )rM   r]   rG   s     €r'   rO   z)BackendSamplerV2._run.<locals>.<listcomp>¼   s   ø€ Ð)?Ð)?Ð)?°a¨$¨q¬'Ð)?Ð)?Ð)?r&   Úversionr6   ©Úmetadata)
r   ÚlistrX   rF   ÚappendrY   ÚitemsÚ	_run_pubsÚzipr   )
r?   rG   Úpub_dictr]   rN   ÚresultsrF   ÚlstÚpub_resultsÚ
pub_results
    `        r'   rQ   zBackendSamplerV2._run³   sâ   ø€ Ý�tÑ$Ô$ˆå ‘o”oð 	*ð 	*‰FˆAˆsØ�S”YÔ×&Ò& qÑ)Ô)Ð)Ð)à�&�3˜t™9œ9Ñ$ˆØ"Ÿ.š.Ñ*Ô*ð 	(ð 	(‰JˆE�3àŸ.š.Ð)?Ð)?Ð)?Ð)?¸3Ð)?Ñ)?Ô)?ÀÑGÔGˆKå!$ S¨+Ñ!6Ô!6ð (ð (‘��:Ø'�˜‘
�
ð(å˜w°)¸Q°Ð@Ñ@Ô@Ð@r&   r   úlist[SamplerPubResult]c                ó€  — d„ |D ¦   «         }g }|D ];}|                      t          j        |¦  «                             ¦   «         ¦  «         Œ<| j        j        pi }t          || j        fdd|| j        j        dœ|¤Ž\  }}t          |¦  «        }	g }d}
| j        j        €dn| j        j         
                    d¦  «        }t          ||¦  «        D ]m\  }}t          |j        ¦  «        \  }}|
|j        z   }|                     |                      |	|
|…         ||j        |||j        j        |¦  «        ¦  «         |}
Œn|S )zFCompute results for pubs that all require the same value of ``shots``.c                óL   — g | ]!}|j                              |j        ¦  «        ‘Œ"S r%   )Úparameter_valuesÚbind_allrZ   )rM   rN   s     r'   rO   z.BackendSamplerV2._run_pubs.<locals>.<listcomp>Å   s+   € ÐUÐUÐUÈ˜#Ô.×7Ò7¸¼ÑDÔDÐUÐUÐUr&   FT)Úclear_metadataÚmemoryrF   r   r   NÚ
meas_level)ÚextendÚnpÚravelÚtolistr>   r   r   r=   r   Ú_prepare_memoryÚgetrh   Ú_analyze_circuitrZ   Úsizere   Ú_postprocess_pubÚshaperc   )r?   rG   rF   Úbound_circuitsÚflatten_circuitsÚcircuitsÚrun_optsrj   Ú_Úresult_memoryr.   ru   rN   ÚboundÚ	meas_infoÚmax_num_bytesÚends                    r'   rg   zBackendSamplerV2._run_pubsÂ   s“  € ð VÐUÐPTÐUÑUÔUˆØÐØ&ð 	Að 	AˆHØ×#Ò#¥B¤H¨XÑ$6Ô$6×$=Ò$=Ñ$?Ô$?Ñ@Ô@Ð@Ð@à”=Ô,Ð2°ˆå"ØØŒMð
ð !ØØØœ=Ô7ð
ð 
ð ð
ð 
‰
ˆ�õ (¨Ñ0Ô0ˆð ˆØˆð Œ}Ô(Ð0ð ˆDà”Ô*×.Ò.¨|Ñ<Ô<ð 	õ
 ˜d NÑ3Ô3ð 	ð 	‰JˆC�Ý'7¸¼Ñ'DÔ'DÑ$ˆI�}Ø˜%œ*Ñ$ˆCØ�NŠNØ×%Ò%Ø! %¨ )Ô,ØØ”KØØ!Ø”KÔ(Øñô ñ
ô 
ð 
ð ˆEˆEàˆr&   r…   úlist[ResultMemory]r   útuple[int, ...]r‡   úlist[_MeasureInfo]rˆ   Úcircuit_metadataÚdictru   r   c                óJ  ‡‡‡‡— |dk    s|€€ˆˆfd„|D ¦   «         Št          ||¦  «        }t          |t          j        ‰Ž ¦  «        D ]5\  }	}
|D ]-}t	          |	|j        |j        ¦  «        }|‰|j                 |
<   Œ.Œ6ˆfd„|D ¦   «         }nv|dk    r^t          j        |¦  «        }|d         d|d         z  z   Št          j	        ‰g ‰¢‰j
        dd…         ¢R ¦  «        Šˆfd	„|D ¦   «         }nt          d
|› �¦  «        ‚t          t          di |¤d‰i¤Ž‰|dœ¬¦  «        S )zöConverts the memory data into a sampler pub result

        For level 2 data, the memory data are stored in an array of bit arrays
        with the shape of the pub. For level 1 data, the data are stored in a
        complex numpy array.
        r6   Nc                óp   •— i | ]2}|j         t          j        ‰‰|j        fz   t          j        ¬ ¦  «        “Œ3S )©Údtype)r+   rw   Úzerosr-   Úuint8)rM   Úitemr   rF   s     €€r'   ú
<dictcomp>z5BackendSamplerV2._postprocess_pub.<locals>.<dictcomp>  sL   ø€ ð ð ð àð ”¥¤¨°%¸¼Ð1HÑ)HÕPRÔPXÐ YÑ YÔ Yðð ð r&   c                ó\   •— i | ](}|j         t          ‰|j                  |j        ¦  «        “Œ)S r%   )r+   r   r,   )rM   r•   Úarrayss     €r'   r–   z5BackendSamplerV2._postprocess_pub.<locals>.<dictcomp>  s@   ø€ ð ð ð àð ”¥¨°´Ô)?ÀÄÑ OÔ Oðð ð r&   é   ).r   y              ð?).r™   c                ó    •— i | ]
}|j         ‰“ŒS r%   )r+   )rM   r•   Úcplxs     €r'   r–   z5BackendSamplerV2._postprocess_pub.<locals>.<dictcomp>  s   ø€ Ð?Ð?Ð?¨T�D”N DÐ?Ð?Ð?r&   zUnsupported meas_level: r   )rF   r�   rb   r%   )Ú_memory_arrayrh   rw   ÚndindexÚ_samples_to_packed_arrayr,   r.   r+   ÚarrayÚreshaper   r   r   r   )r?   r…   rF   r   r‡   rˆ   r�   ru   Úmemory_arrayÚsamplesÚindexr•   ÚaryÚmeasÚrawr˜   r›   s     ``           @@r'   r~   z!BackendSamplerV2._postprocess_pubñ   sª  øøøø€ ð  ˜Š?ˆ?˜jÐ0ðð ð ð ð à%ðñ ô ˆFõ )¨¸ÑFÔFˆLå"% lµB´JÀÐ4FÑ"GÔ"Gð 8ð 8‘�˜Ø%ð 8ð 8�DÝ2°7¸D¼MÈ4Ì:ÑVÔV�CØ47�F˜4œ>Ô*¨5Ñ1Ð1ð8ðð ð ð à%ðñ ô ˆDˆDð ˜1Š_ˆ_Ý”(˜=Ñ)Ô)ˆCØ�v”;  c¨&¤kÑ!1Ñ1ˆDÝ”:˜dÐ$= eÐ$=¨d¬j¸¸¸¬nÐ$=Ð$=Ñ>Ô>ˆDØ?Ð?Ð?Ð?°YÐ?Ñ?Ô?ˆDˆDåÐE¸ÐEÐEÑFÔFÐFÝÝÐ(Ð(�dÐ(Ð( %Ð(Ð(Ð(Ø$Ð:JÐKÐKð
ñ 
ô 
ð 	
r&   )r2   r3   r1   r4   )rA   r3   )rA   r   )rG   rH   rF   r   rA   rI   )rG   rV   )rG   rV   rA   r^   )rG   rV   rF   r   rA   rn   )r…   rŠ   rF   r   r   r‹   r‡   rŒ   rˆ   r   r�   rŽ   ru   r   rA   r   )r    r!   r"   r#   r@   Úpropertyr2   r1   rU   rP   rQ   rg   r~   r%   r&   r'   r0   r0   Q   s  € € € € € ð#ð #ðR  $ð	Eð Eð Eð Eð Eð Eð< ðð ð ñ „Xðð ðð ð ñ „Xðð
 FJð	ð 	ð 	ð 	ð 	ð 	ðð ð ð ðAð Að Að Að-ð -ð -ð -ð^*
ð *
ð *
ð *
ð *
ð *
r&   r0   rZ   r
   rA   útuple[list[_MeasureInfo], int]c           
     ó:  — g }d}| j         D ]}|j        }|j        }|dk    r!|                      |d         ¦  «        j        }nd}|                     t          ||t          |¦  «        |¬¦  «        ¦  «         t          |||z   ¦  «        }Œ€|t          |¦  «        fS )z4Analyzes the information for each creg in a circuit.r   )r+   r,   r-   r.   )	r[   Únamer}   Úfind_bitr£   re   r)   r   Úmax)rZ   r‡   Úmax_num_bitsÚcregrª   r,   r.   s          r'   r|   r|     s¾   € à€IØ€LØ”ð ;ð ;ˆØŒyˆØ”9ˆØ�qŠ=ˆ=Ø×$Ò$ T¨!¤WÑ-Ô-Ô3ˆEˆEàˆEØ×ÒÝØØ!Ý(¨Ñ2Ô2Øð	ñ ô ñ	
ô 	
ð 	
õ ˜<¨°Ñ)9Ñ:Ô:ˆˆØ•n \Ñ2Ô2Ð2Ð2r&   rj   úlist[Result]rŠ   c                óæ   — g }| D ]k}|j         D ]a}t          |j        d¦  «        r,|j        j        r |                     |j        j        ¦  «         ŒC|                     dg|j        z  ¦  «         ŒbŒl|S )z3Joins splitted results if exceeding max_experimentsrt   Ú0x0)rj   ÚhasattrÚdatart   re   rF   )rj   rk   ÚresÚexps       r'   rz   rz   5  s‹   € à
€CØð 0ð 0ˆØ”;ð 	0ð 	0ˆCÝ�s”x Ñ*Ô*ð 0¨s¬x¬ð 0Ø—
’
˜3œ8œ?Ñ+Ô+Ð+Ð+ð —
’
˜E˜7 S¤YÑ.Ñ/Ô/Ð/Ð/ð	0ð €Jr&   úlist[list[str]]r-   r   úNDArray[np.uint8]c                ó¨  ‡— g }| D ]¢}‰dk    rVd                      ˆfd„|D ¦   «         ¦  «        }t          j        |t          j        ¬¦  «                             d‰¦  «        }n/t          j        t          |¦  «        ‰ft          j        ¬¦  «        }|                     |¦  «         Œ£t          j        |¦  «        }t          j	        |dd¬¦  «        S )z:Converts the memory data into an array in an unpacked way.r   r&   c              3  ó`   •K  — | ](}t          |d ¦  «                             ‰d¦  «        V — Œ)dS )é   ÚbigN)r   Úto_bytes)rM   r]   r-   s     €r'   ú	<genexpr>z _memory_array.<locals>.<genexpr>G  s;   øè è € ÐRÐRÀa�C  2™JœJ×/Ò/°	¸5ÑAÔAÐRÐRÐRÐRÐRÐRr&   r‘   éÿÿÿÿr»   ©ÚaxisÚbitorder)
Újoinrw   Ú
frombufferr”   r    r“   rY   re   ÚasarrayÚ
unpackbits)rj   r-   rk   rt   r³   r¤   s    `    r'   rœ   rœ   B  sÊ   ø€ à
€CØð ð ˆØ�qŠ=ˆ=Ø—8’8ÐRÐRÐRÐRÈ6ÐRÑRÔRÑRÔRˆDÝ”= ­R¬XÐ6Ñ6Ô6×>Ò>¸rÀ9ÑMÔMˆDˆDõ ”8�S ™[œ[¨)Ð4½B¼HÐEÑEÔEˆDØ�
Š
�4ÑÔÐÐÝ
Œ*�S‰/Œ/€CÝŒ=˜ 2°Ð6Ñ6Ô6Ð6r&   r¢   r,   r.   c                óÎ   — |dk    r| dd…| |z
  d…f         }n| dd…| |z
  | …f         }| dz  }t          j        |d|dffd¬¦  «        }t          j        |dd¬¦  «        }|S )	zBConverts an unpacked array of the memory data into a packed array.r   Né   )r   r   )Úconstant_valuesr¾   r»   r¿   )rw   ÚpadÚpackbits)r¢   r,   r.   r¤   Úpad_sizes        r'   rž   rž   Q  s—   € ð �‚z€zØ�a�a�a˜%˜ (Ñ*Ð,Ð,Ð,Ô-ˆˆà�a�a�a˜%˜ (Ñ*¨e¨VÐ3Ð3Ô4ˆð ˆy˜1‰}€HÝ
Œ&��v ¨!˜}Ð-¸qÐ
AÑ
AÔ
A€Cå
Œ+�c ¨UÐ
3Ñ
3Ô
3€CØ€Jr&   )rZ   r
   rA   r¨   )rj   r¯   rA   rŠ   )rj   r¶   r-   r   rA   r·   )r¢   r·   r,   r   r.   r   rA   r·   )4r#   Ú
__future__r   r:   Úcollectionsr   Údataclassesr   Útypingr   r   r   Únumpyrw   Únumpy.typingr	   Úqiskit.circuitr
   Úqiskit.exceptionsr   Ú#qiskit.primitives.backend_estimatorr   Úqiskit.primitives.baser   Úqiskit.primitives.containersr   r   r   r   r   Ú&qiskit.primitives.containers.bit_arrayr   Ú(qiskit.primitives.containers.sampler_pubr   Úqiskit.primitives.primitive_jobr   Úqiskit.providers.backendr   r   Úqiskit.resultr   r   r)   rd   r*   ÚfloatÚResultMemoryr0   r|   rz   rœ   rž   r%   r&   r'   ú<module>rÞ      s¢  ðð AÐ @à "Ð "Ð "Ð "Ð "Ð "à €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø !Ð !Ð !Ð !Ð !Ð !Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'à Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  à )Ð )Ð )Ð )Ð )Ð )Ø )Ð )Ð )Ð )Ð )Ð )Ø =Ð =Ð =Ð =Ð =Ð =Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0ðð ð ð ð ð ð ð ð ð ð ð ð ð ð BÐ AÐ AÐ AÐ AÐ AØ ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø  Ð  Ð  Ð  Ð  Ð  ð ðð ð ð ð ñ ô ñ „ðð& ðð ð ð ð ñ ô ñ „ðð �T˜#”Y  T¨%¤[Ô 1°4¸¸TÀ%¼[Ô8IÔ3JÐJÔK€ððJ
ð J
ð J
ð J
ð J
�}ñ J
ô J
ð J
ðZ3ð 3ð 3ð 3ð.
ð 
ð 
ð 
ð7ð 7ð 7ð 7ðð ð ð ð ð r&   