§
    ¹³Ùgñ*  ã                  ó@  — d Z ddlm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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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% e G d„ d¦  «        ¦   «         Z& G d„ de¦  «        Z'd%d„Z(d&d „Z)d'd"„Z*d(d$„Z+dS ))z
Statevector Sampler V2 class
é    )ÚannotationsN)Ú	dataclass)ÚIterable)ÚNDArray)ÚClassicalRegisterÚQiskitErrorÚQuantumCircuit)ÚControlFlowOp)ÚStatevectoré   )ÚBaseSamplerV2)Ú_has_measure)ÚBitArrayÚDataBinÚPrimitiveResultÚSamplerPubResultÚSamplerPubLike)Ú
SamplerPub)Ú_min_num_bytes)ÚPrimitiveJob)Úbound_circuit_to_instructionc                  ó8   — e Zd ZU ded<   ded<   ded<   ded<   dS )	Ú_MeasureInfoÚstrÚ	creg_nameÚintÚnum_bitsÚ	num_bytesú	list[int]Úqreg_indicesN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    ú[/granary/edev/quantum/lib/python3.11/site-packages/qiskit/primitives/statevector_sampler.pyr   r   ,   s9   € € € € € € à€N€N�NØ€M€M�MØ€N€N�NØÐÐÑÐÐr&   r   c                  óp   — e Zd ZdZd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S )!ÚStatevectorSamplerav  
    Simple implementation of :class:`BaseSamplerV2` using full state vector simulation.

    This class is implemented via :class:`~.Statevector` which turns provided circuits into
    pure state vectors, and is therefore incompatible with mid-circuit measurements (although
    other implementations may be).

    As seen in the example below, this sampler supports providing arrays of parameter value sets to
    bind against a single circuit.

    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.

    .. code-block:: python

        from qiskit.circuit import (
            Parameter, QuantumCircuit, ClassicalRegister, QuantumRegister
        )
        from qiskit.primitives import StatevectorSampler

        import matplotlib.pyplot as plt
        import numpy as np

        # Define our circuit registers, including classical registers
        # called 'alpha' and 'beta'.
        qreg = QuantumRegister(3)
        alpha = ClassicalRegister(2, "alpha")
        beta = ClassicalRegister(1, "beta")

        # Define a quantum circuit with two parameters.
        circuit = QuantumCircuit(qreg, alpha, beta)
        circuit.h(0)
        circuit.cx(0, 1)
        circuit.cx(1, 2)
        circuit.ry(Parameter("a"), 0)
        circuit.rz(Parameter("b"), 0)
        circuit.cx(1, 2)
        circuit.cx(0, 1)
        circuit.h(0)
        circuit.measure([0, 1], alpha)
        circuit.measure([2], beta)

        # Define a sweep over parameter values, where the second axis is over.
        # the two parameters in the circuit.
        params = np.vstack([
            np.linspace(-np.pi, np.pi, 100),
            np.linspace(-4 * np.pi, 4 * np.pi, 100)
        ]).T

        # Instantiate a new statevector simulation based sampler object.
        sampler = StatevectorSampler()

        # Start a job that will return shots for all 100 parameter value sets.
        pub = (circuit, params)
        job = sampler.run([pub], shots=256)

        # Extract the result for the 0th pub (this example only has one pub).
        result = job.result()[0]

        # There is one BitArray object for each ClassicalRegister in the
        # circuit. Here, we can see that the BitArray for alpha contains data
        # for all 100 sweep points, and that it is indeed storing data for 2
        # bits over 256 shots.
        assert result.data.alpha.shape == (100,)
        assert result.data.alpha.num_bits == 2
        assert result.data.alpha.num_shots == 256

        # We can work directly with a binary array in performant applications.
        raw = result.data.alpha.array

        # For small registers where it is anticipated to have many counts
        # associated with the same bitstrings, we can turn the data from,
        # for example, the 22nd sweep index into a dictionary of counts.
        counts = result.data.alpha.get_counts(22)

        # Or, convert into a list of bitstrings that preserve shot order.
        bitstrings = result.data.alpha.get_bitstrings(22)
        print(bitstrings)

    i   N)Údefault_shotsÚseedr*   r   r+   ú np.random.Generator | int | Nonec               ó"   — || _         || _        dS )a  
        Args:
            default_shots: The default shots for the sampler if not specified during run.
            seed: The seed or Generator object for random number generation.
                If None, a random seeded default RNG will be used.
        N)Ú_default_shotsÚ_seed)Úselfr*   r+   s      r'   Ú__init__zStatevectorSampler.__init__‡   s   € ð ,ˆÔØˆŒ
ˆ
ˆ
r&   Úreturnc                ó   — | j         S )zReturn the default shots)r.   ©r0   s    r'   r*   z StatevectorSampler.default_shots‘   s   € ð Ô"Ð"r&   c                ó   — | j         S )zAReturn the seed or Generator object for random number generation.)r/   r4   s    r'   r+   zStatevectorSampler.seed–   s   € ð ŒzÐr&   )ÚshotsÚpubsúIterable[SamplerPubLike]r6   ú
int | Noneú/PrimitiveJob[PrimitiveResult[SamplerPubResult]]c               óî   ‡— ‰€| j         Šˆfd„|D ¦   «         }t          d„ |D ¦   «         ¦  «        rt          j        dt          ¦  «         t          | j        |¦  «        }|                     ¦   «          |S )Nc                ó:   •— g | ]}t          j        |‰¦  «        ‘ŒS r%   )r   Úcoerce)Ú.0Úpubr6   s     €r'   ú
<listcomp>z*StatevectorSampler.run.<locals>.<listcomp>    s&   ø€ ÐFÐFÐF¸#�
Ô)¨#¨uÑ5Ô5ÐFÐFÐFr&   c              3  óP   K  — | ]!}t          |j        j        ¦  «        d k    V — Œ"dS )r   N)ÚlenÚcircuitÚcregs)r>   r?   s     r'   ú	<genexpr>z)StatevectorSampler.run.<locals>.<genexpr>¡   s4   è è € ÐCÐC¨s�s�3”;Ô$Ñ%Ô%¨Ò*ÐCÐCÐCÐCÐCÐCr&   z…One of your circuits has no output classical registers and so the result will be empty. Did you mean to add measurement instructions?)r.   ÚanyÚwarningsÚwarnÚUserWarningr   Ú_runÚ_submit)r0   r7   r6   Úcoerced_pubsÚjobs     `  r'   ÚrunzStatevectorSampler.run›   sŒ   ø€ ð ˆ=ØÔ'ˆEØFÐFÐFÐFÀÐFÑFÔFˆÝÐCÐC°lÐCÑCÔCÑCÔCð 	ÝŒMðOåñô ð õ ˜4œ9 lÑ3Ô3ˆØ�Š‰ŒˆØˆ
r&   úIterable[SamplerPub]ú!PrimitiveResult[SamplerPubResult]c                óF   ‡ — ˆ fd„|D ¦   «         }t          |ddi¬¦  «        S )Nc                ó:   •— g | ]}‰                      |¦  «        ‘ŒS r%   )Ú_run_pub)r>   r?   r0   s     €r'   r@   z+StatevectorSampler._run.<locals>.<listcomp>­   s%   ø€ Ð6Ð6Ð6¨#�4—=’= Ñ%Ô%Ð6Ð6Ð6r&   Úversioné   ©Úmetadata)r   )r0   r7   Úresultss   `  r'   rJ   zStatevectorSampler._run¬   s3   ø€ Ø6Ð6Ð6Ð6°Ð6Ñ6Ô6ˆÝ˜w°)¸Q°Ð@Ñ@Ô@Ð@r&   r?   r   r   c                ó¢  ‡‡‡— t          ‰j        ¦  «        \  }}}‰j                             |¦  «        Šˆˆfd„|D ¦   «         Št	          j        ‰¦  «        D ]³\  }}t          t          |¦  «        ¦  «        }|                     | j	        ¦  «         |r| 
                    ‰j        |¬¦  «        }ndg‰j        z  }t	          j        d„ |D ¦   «         ¦  «        }	|D ]-}
t          |	|
j        |
j        ¦  «        }|‰|
j                 |<   Œ.Œ´ˆfd„|D ¦   «         }t#          t%          d	i |¤d‰j        i¤Ž‰j        ‰j        j        dœ¬¦  «        S )
Nc                ó„   •— i | ]<}|j         t          j        ‰j        ‰j        |j        fz   t          j        ¬ ¦  «        “Œ=S ©)Údtype)r   ÚnpÚzerosÚshaper6   r   Úuint8)r>   ÚitemÚbound_circuitsr?   s     €€r'   ú
<dictcomp>z/StatevectorSampler._run_pub.<locals>.<dictcomp>³   sX   ø€ ð 
ð 
ð 
ð ð ŒN�BœHØÔ$¨¬	°4´>Ð'BÑBÍ"Ì(ðñ ô ð
ð 
ð 
r&   )r6   ÚqargsÚ c                óN   — g | ]"}t          j        |t           j        ¬ ¦  «        ‘Œ#S r[   )r]   Úfromiterr`   )r>   Úsamples     r'   r@   z/StatevectorSampler._run_pub.<locals>.<listcomp>À   s)   € Ð%`Ð%`Ð%`Èf¥b¤k°&ÅÄÐ&IÑ&IÔ&IÐ%`Ð%`Ð%`r&   c                ó\   •— i | ](}|j         t          ‰|j                  |j        ¦  «        “Œ)S r%   )r   r   r   )r>   ra   Úarrayss     €r'   rc   z/StatevectorSampler._run_pub.<locals>.<dictcomp>Å   s=   ø€ ð 
ð 
ð 
ØPTˆDŒN�H V¨D¬NÔ%;¸T¼]ÑKÔKð
ð 
ð 
r&   r_   )r6   Úcircuit_metadatarV   r%   )Ú_preprocess_circuitrC   Úparameter_valuesÚbind_allr]   Úndenumerater   r   r+   r/   Úsample_memoryr6   ÚarrayÚ_samples_to_packed_arrayr   r    r   r   r   r_   rW   )r0   r?   rC   rd   Ú	meas_infoÚindexÚbound_circuitÚfinal_stateÚsamplesÚsamples_arrayra   ÚaryÚmeasrj   rb   s    `           @@r'   rS   zStatevectorSampler._run_pub°   s¬  øøø€ Ý$7¸¼Ñ$DÔ$DÑ!ˆ�˜	ØÔ-×6Ò6°wÑ?Ô?ˆð
ð 
ð 
ð 
ð 
ð "ð	
ñ 
ô 
ˆõ %'¤N°>Ñ$BÔ$Bð 
	4ð 
	4Ñ ˆE�=Ý%Õ&BÀ=Ñ&QÔ&QÑRÔRˆKØ×Ò˜TœZÑ(Ô(Ð(Øð +Ø%×3Ò3¸#¼)È5Ð3ÑQÔQ��à˜$ ¤Ñ*�ÝœHÐ%`Ð%`ÐX_Ð%`Ñ%`Ô%`ÑaÔaˆMØ!ð 4ð 4�Ý.¨}¸d¼mÈTÔM^Ñ_Ô_�Ø03��t”~Ô& uÑ-Ð-ð4ð
ð 
ð 
ð 
ØXað
ñ 
ô 
ˆõ  ÝÐ,Ð,�dÐ,Ð, #¤)Ð,Ð,Ð,Ø"œy¸c¼kÔ>RÐSÐSð
ñ 
ô 
ð 	
r&   )r*   r   r+   r,   )r2   r   )r2   r,   )r7   r8   r6   r9   r2   r:   )r7   rO   r2   rP   )r?   r   r2   r   )r!   r"   r#   Ú__doc__r1   Úpropertyr*   r+   rN   rJ   rS   r%   r&   r'   r)   r)   4   sØ   € € € € € ðPð Pðd 04Ð^bð ð ð ð ð ð ð ð#ð #ð #ñ „Xð#ð ðð ð ñ „Xðð
 FJðð ð ð ð ð ð"Að Að Að Að
ð 
ð 
ð 
ð 
ð 
r&   r)   rC   r	   c                óŠ  ‡
‡— d„ | j         D ¦   «         }t          | ¦  «        }t          t          |                     ¦   «         ¦  «        ¦  «        }d„ t          |¦  «        D ¦   «         }|                      d¬¦  «        } t          | ¦  «        rt          d¦  «        ‚t          | ¦  «        rt          d¦  «        ‚t          |¦  «        Šˆfd„|                     ¦   «         D ¦   «         Š
|                     ¦   «         D ] \  }}|\  }}||         ‰
|j                 |<   Œ!ˆ
fd„|                     ¦   «         D ¦   «         }	| ||	fS )	Nc                ó(   — i | ]}|j         |j        “ŒS r%   )ÚnameÚsize)r>   Úcregs     r'   rc   z'_preprocess_circuit.<locals>.<dictcomp>Ï   s   € ÐDÐDÐD¨d�T”Y ¤	ÐDÐDÐDr&   c                ó   — i | ]\  }}||“Œ	S r%   r%   )r>   ÚkÚvs      r'   rc   z'_preprocess_circuit.<locals>.<dictcomp>Ò   s   € Ð5Ð5Ð5™D˜A˜q�1�aÐ5Ð5Ð5r&   F)Úinplacez7StatevectorSampler cannot handle ControlFlowOp and c_ifz9StatevectorSampler cannot handle mid-circuit measurementsc                ó$   •— i | ]\  }}|‰g|z  “ŒS r%   r%   )r>   ÚkeyÚvalÚsentinels      €r'   rc   z'_preprocess_circuit.<locals>.<dictcomp>Ú   s&   ø€ ÐKÐKÐK©¨¨cˆs�X�J Ñ$ÐKÐKÐKr&   c           	     ób   •— g | ]+\  }}t          ||t          |¦  «        ‰|         ¬ ¦  «        ‘Œ,S ))r   r   r   r    )r   r   )r>   r   r   Úindicess      €r'   r@   z'_preprocess_circuit.<locals>.<listcomp>Þ   sV   ø€ ð ð ð ñ ˆD�(õ 	ØØÝ$ XÑ.Ô.Ø  œð		
ñ 	
ô 	
ðð ð r&   )rD   Ú_final_measurement_mappingÚsortedÚsetÚvaluesÚ	enumerateÚremove_final_measurementsÚ_has_control_flowr   r   rB   Úitemsr   )rC   Únum_bits_dictÚmappingrd   Úqargs_indexr‡   Úqregr�   Úindrs   r‹   r‰   s             @@r'   rl   rl   Î   sh  øø€ ØDÐD°g´mÐDÑDÔD€MÝ(¨Ñ1Ô1€GÝ•3�w—~’~Ñ'Ô'Ñ(Ô(Ñ)Ô)€EØ5Ð5¥I¨eÑ$4Ô$4Ð5Ñ5Ô5€KØ×/Ò/¸Ð/Ñ>Ô>€GÝ˜Ñ!Ô!ð UÝÐSÑTÔTÐTÝ�GÑÔð WÝÐUÑVÔVÐVå�5‰zŒz€HØKÐKÐKÐK°]×5HÒ5HÑ5JÔ5JÐKÑKÔK€GØ—]’]‘_”_ð 4ð 4‰	ˆˆTØ‰	ˆˆcØ"-¨dÔ"3ˆ�”	Ô˜3ÑÐðð ð ð ð ,×1Ò1Ñ3Ô3ðñ ô €Ið �E˜9Ð$Ð$r&   rw   úNDArray[np.uint8]r   r   r‹   r   r2   c                óæ   — t          j        | d d …d d d…f         dd¬¦  «        }|d d …|d d d…         f         }| dz  }t          j        |d|dffd¬¦  «        }t          j        |d¬¦  «        }|S )Néÿÿÿÿ)©r   r   )r   r   r   )Úconstant_valuesé   rœ   )Úaxis)r]   ÚpadÚpackbits)rw   r   r‹   ry   Úpad_sizes        r'   rr   rr   ê   s�   € õ Œ&�˜˜˜˜D˜D˜b˜D˜Ô!Ð#3ÀQÐ
GÑ
GÔ
G€Cà
ˆaˆaˆa�˜˜˜2˜”ÐÔ
€Cð ˆy˜1‰}€HÝ
Œ&��v ¨!˜}Ð-¸qÐ
AÑ
AÔ
A€Cå
Œ+�c Ð
#Ñ
#Ô
#€CØ€Jr&   ú(dict[tuple[ClassicalRegister, int], int]c                ó^  — t          t          | j        ¦  «        ¦  «        }t          t          | j        ¦  «        ¦  «        }i }| ddd…         D ]Ü}|j        j        dk    ry|                      |j        d         ¦  «        }|j        }|                      |j	        d         ¦  «        j        }||v r(||v r$|j
        D ]}|||<   Œ|                     |¦  «         nK|j        j        dvr=|j	        D ]5}	|                      |	¦  «        j        }
|
|v r|                     |
¦  «         Œ6|r|s nŒÝ|S )zÅReturn the final measurement mapping for the circuit.

    Parameters:
        circuit: Input quantum circuit.

    Returns:
        Mapping of classical bits to qubits for final measurements.
    Nr›   Úmeasurer   )ÚbarrierÚdelay)rŽ   ÚrangeÚ
num_qubitsÚ
num_clbitsÚ	operationr   Úfind_bitÚclbitsrt   ÚqubitsÚ	registersÚremove)rC   Úactive_qubitsÚactive_cbitsr•   ra   ÚlocÚcbitÚqbitr�   ÚqqÚ_temp_qubits              r'   rŒ   rŒ   ý   s^  € õ �˜gÔ0Ñ1Ô1Ñ2Ô2€MÝ•u˜WÔ/Ñ0Ô0Ñ1Ô1€Lð €GØ˜˜˜"˜”ð ð ˆØŒ>Ô )Ò+Ð+Ø×"Ò" 4¤;¨q¤>Ñ2Ô2ˆCØ”9ˆDØ×#Ò# D¤K°¤NÑ3Ô3Ô9ˆDØ�|Ð#Ð#¨°Ð(=Ð(=ØœMð )ð )�DØ$(�G˜D‘M�MØ×#Ò# DÑ)Ô)Ð)øØŒ^Ô Ð(<Ð<Ð<Ø”kð 6ð 6�Ø%×.Ò.¨rÑ2Ô2Ô8�Ø -Ð/Ð/Ø!×(Ò(¨Ñ5Ô5Ð5øàð 	 =ð 	ØˆEð	ð €Nr&   Úboolc                ó:   ‡— t          ˆfd„| D ¦   «         ¦  «        S )Nc              3  ó^   •K  — | ]'}t          |j        xŠt          ¦  «        p‰j        V — Œ(d S )N)Ú
isinstancer«   r
   Ú
_condition)r>   ÚinstructionÚops     €r'   rE   z$_has_control_flow.<locals>.<genexpr>!  sP   øè è € ð ð àõ 	˜+Ô/Ð/�Bµ-Ñ@Ô@ÐQÀBÄMðð ð ð ð ð r&   )rF   )rC   r¾   s    @r'   r’   r’      s;   ø€ Ýð ð ð ð à"ðñ ô ñ ô ð r&   )rC   r	   )rw   r™   r   r   r‹   r   r2   r™   )rC   r	   r2   r£   )rC   r	   r2   r¸   ),r{   Ú
__future__r   rG   Údataclassesr   Útypingr   Únumpyr]   Únumpy.typingr   Úqiskitr   r   r	   Úqiskit.circuitr
   Úqiskit.quantum_infor   Úbaser   Úbase.validationr   Ú
containersr   r   r   r   r   Úcontainers.sampler_pubr   Úcontainers.bit_arrayr   Úprimitive_jobr   Úutilsr   r   r)   rl   rr   rŒ   r’   r%   r&   r'   ú<module>rÎ      s&  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  à AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AØ (Ð (Ð (Ð (Ð (Ð (Ø +Ð +Ð +Ð +Ð +Ð +à Ð Ð Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )ðð ð ð ð ð ð ð ð ð ð ð ð ð ð /Ð .Ð .Ð .Ð .Ð .Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø /Ð /Ð /Ð /Ð /Ð /ð ðð ð ð ð ñ ô ñ „ððW
ð W
ð W
ð W
ð W
˜ñ W
ô W
ð W
ðt%ð %ð %ð %ð8ð ð ð ð& ð  ð  ð  ðFð ð ð ð ð r&   