§
    ¹³Ùgš   ã                  óP  — d Z ddlmZ ddlmZ ddlZddl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mZ dd
lmZ ddlmZ ddlmZ  edd¬¦  «        d.d„¦   «         Z edd¬¦  «        d/d„¦   «         Z edd¬¦  «        d0d„¦   «         Zd1d!„Zd"„ Zd2d3d&„Zd4d'„Z d5d)„Z!d6d-„Z"dS )7z"
Utility functions for primitives
é    )Úannotations)ÚIterableN)ÚInstructionÚQuantumCircuit)ÚBit)Ú
Initialize)ÚQiskitError)Ú	PauliListÚSparsePauliOpÚStatevector)ÚBaseOperator)Ú	BasePauli)Údeprecate_funcz1.2zcTo initialize a circuit from a ``Statevector`` instance, use ``QuantumCircuit.initialize`` instead.)ÚsinceÚadditional_msgÚstateúQuantumCircuit | StatevectorÚreturnr   c                ó  — t          | t          ¦  «        r| S t          | t          ¦  «        st          | ¦  «        } t          | j        ¦  «        }|                     t          | ¦  «        t          | j        ¦  «        ¬¦  «         |S )z¾Initialize state by converting the input to a quantum circuit.

    Args:
        state: The state as quantum circuit or statevector.

    Returns:
        The state as quantum circuit.
    )Úqargs)Ú
isinstancer   r   Ú
num_qubitsÚappendr   Úrange)r   Úqcs     úM/granary/edev/quantum/lib/python3.11/site-packages/qiskit/primitives/utils.pyÚinit_circuitr      sx   € õ �%�Ñ(Ô(ð ØˆÝ�e�[Ñ)Ô)ð #Ý˜EÑ"Ô"ˆÝ	˜Ô(Ñ	)Ô	)€BØ‡I‚I�j˜ÑÔ¥u¨UÔ-=Ñ'>Ô'>€IÑ?Ô?Ð?Ø€Ió    z1Use the constructor of ``SparsePauliOp`` instead.Ú
observableúBaseOperator | strr   c                óH  — t          | t          ¦  «        r| S t          | t          ¦  «        r4t          | t          ¦  «        st	          dt          | ¦  «        › �¦  «        ‚t          | t          ¦  «        rt	          dt          | ¦  «        › �¦  «        ‚t          | ¦  «        S )aE  Initialize observable by converting the input to a :class:`~qiskit.quantum_info.SparsePauliOp`.

    Args:
        observable: The observable.

    Returns:
        The observable as :class:`~qiskit.quantum_info.SparsePauliOp`.

    Raises:
        QiskitError: when observable type cannot be converted to SparsePauliOp.
    zobservable type not supported: )r   r   r   r   r	   Útyper
   ©r   s    r   Úinit_observabler$   6   sž   € õ" �*�mÑ,Ô,ð )ØÐÝ	�J¥Ñ	-Ô	-ð )µjÀÍYÑ6WÔ6Wð )ÝÐN½DÀÑ<LÔ<LÐNÐNÑOÔOÐOå�j¥)Ñ,Ô,ð 	TÝÐRÅÀZÑ@PÔ@PÐRÐRÑSÔSÐSÝ˜ZÑ(Ô(Ð(r   zíUse ``QuantumCircuit.layout`` and ``SparsePauliOp.apply_layout`` to adjust an operator for a layout. Otherwise, use ``mthree.utils.final_measurement_mapping``. See <https://qiskit.github.io/qiskit-addon-mthree/apidocs/utils> for details.Úcircuitúdict[int, int]c                óÜ  — t          t          | j        ¦  «        ¦  «        }t          t          | j        ¦  «        ¦  «        }i }| j        ddd…         D ]å}|j        j        dk    r‚|                      |j        d         ¦  «        j	        }|                      |j
        d         ¦  «        j	        }||v r3||v r/|||<   |                     |¦  «         |                     |¦  «         nK|j        j        dvr=|j
        D ]5}|                      |¦  «        j	        }||v r|                     |¦  «         Œ6|r|s nŒæt          t          |                     ¦   «         d„ ¬¦  «        ¦  «        }|S )aR  Return the final measurement mapping for the circuit.

    Dict keys label measured qubits, whereas the values indicate the
    classical bit onto which that qubits measurement result is stored.

    Parameters:
        circuit: Input quantum circuit.

    Returns:
        Mapping of qubits to classical bits for final measurements.
    NéÿÿÿÿÚmeasurer   )ÚbarrierÚdelayc                ó   — | d         S )Né   © )Úitems    r   ú<lambda>z+final_measurement_mapping.<locals>.<lambda>z   s
   € ¸DÀ¼G€ r   )Úkey)Úlistr   r   Ú
num_clbitsÚ_dataÚ	operationÚnameÚfind_bitÚclbitsÚindexÚqubitsÚremoveÚdictÚsortedÚitems)	r%   Úactive_qubitsÚactive_cbitsÚmappingr/   ÚcbitÚqbitÚqqÚ_temp_qubits	            r   Úfinal_measurement_mappingrF   Q   s„  € õ$ �˜wÔ1Ñ2Ô2Ñ3Ô3€MÝ�˜gÔ0Ñ1Ô1Ñ2Ô2€Lð €GØ”˜d˜d ˜dÔ#ð ð ˆØŒ>Ô )Ò+Ð+Ø×#Ò# D¤K°¤NÑ3Ô3Ô9ˆDØ×#Ò# D¤K°¤NÑ3Ô3Ô9ˆDØ�|Ð#Ð#¨°Ð(=Ð(=Ø $�˜‘Ø×#Ò# DÑ)Ô)Ð)Ø×$Ò$ TÑ*Ô*Ð*øØŒ^Ô Ð(<Ð<Ð<Ø”kð 6ð 6�Ø%×.Ò.¨rÑ2Ô2Ô8�Ø -Ð/Ð/Ø!×(Ò(¨Ñ5Ô5Ð5øàð 	 =ð 	ØˆEð	õ •6˜'Ÿ-š-™/œ/Ð/CÐ/CÐDÑDÔDÑEÔE€GØ€Nr   Úbitsútuple[Bit, ...]Útuplec                ó:   ‡— t          ˆfd„| D ¦   «         ¦  «        S )Nc              3  ó®   •K  — | ]O}‰                      |¦  «        j        t          d „ ‰                      |¦  «        j        D ¦   «         ¦  «        fV — ŒPdS )c              3  óX   K  — | ]%}|d          j         |d          j        |d         fV — Œ&dS )r   r-   N)Úsizer6   )Ú.0Úregs     r   ú	<genexpr>z&_bits_key.<locals>.<genexpr>.<genexpr>‚   s9   è è € Ð`Ð`¸�3�q”6”;  A¤¤¨S°¬VÐ4Ð`Ð`Ð`Ð`Ð`Ð`r   N)r7   r9   rI   Ú	registers)rN   Úbitr%   s     €r   rP   z_bits_key.<locals>.<genexpr>   s{   øè è € ð ð ð
 ð ×Ò˜SÑ!Ô!Ô'ÝÐ`Ð`À×@PÒ@PÐQTÑ@UÔ@UÔ@_Ð`Ñ`Ô`Ñ`Ô`ð	
ðð ð ð ð ð r   )rI   )rG   r%   s    `r   Ú	_bits_keyrS   ~   s=   ø€ Ýð ð ð ð ð
 ðñ ô ñ ô ð r   c                óü   — t          | t          j        ¦  «        r| j                             ¦   «         S t          | t
          ¦  «        rt          | ¦  «        S t          | t          ¦  «        rt          | ¦  «        S | S ©N)	r   ÚnpÚndarrayÚdataÚtobytesr   Ú_circuit_keyr   rI   )Úparams    r   Ú_format_paramsr\   ˆ   sm   € Ý�%�œÑ$Ô$ð ØŒz×!Ò!Ñ#Ô#Ð#Ý	�E�>Ñ	*Ô	*ð Ý˜EÑ"Ô"Ð"Ý	�E�8Ñ	$Ô	$ð Ý�U‰|Œ|ÐØ€Lr   TÚ
functionalÚboolc                óÀ   ‡ — ‰ j         ‰ j        ‰ j        t          ˆ fd„‰ j        D ¦   «         ¦  «        ‰ j        €dnt          ‰ j        ¦  «        f}|r|S ‰ j        g|¢R S )a�  Private key function for QuantumCircuit.

    This is the workaround until :meth:`QuantumCircuit.__hash__` will be introduced.
    If key collision is found, please add elements to avoid it.

    Args:
        circuit: Input quantum circuit.
        functional: If True, the returned key only includes functional data (i.e. execution related).

    Returns:
        Composite key for circuit.
    c              3  óÆ   •K  — | ][}t          |j        ‰¦  «        t          |j        ‰¦  «        |j        j        t          d „ |j        j        D ¦   «         ¦  «        fV — Œ\dS )c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rU   )r\   )rN   r[   s     r   rP   z)_circuit_key.<locals>.<genexpr>.<genexpr>¨   s*   è è € ÐOÐO°•n UÑ+Ô+ÐOÐOÐOÐOÐOÐOr   N)rS   r:   r8   r5   r6   rI   Úparams)rN   rX   r%   s     €r   rP   z_circuit_key.<locals>.<genexpr>£   s€   øè è € ð 
ð 
ð õ ˜$œ+ wÑ/Ô/Ý˜$œ+ wÑ/Ô/Ø”Ô#ÝÐOÐO¸¼Ô9NÐOÑOÔOÑOÔOð	ð
ð 
ð 
ð 
ð 
ð 
r   N)r   r3   Únum_parametersrI   rX   Ú_op_start_timesr6   )r%   r]   Úfunctional_keys   `  r   rZ   rZ   ’   s�   ø€ ð 	ÔØÔØÔÝð 
ð 
ð 
ð 
ð  œð
ñ 
ô 
ñ 	
ô 	
ð Ô'Ð/ˆˆµU¸7Ô;RÑ5SÔ5Sð€Nð ð ØÐàŒðà	ðð ð r   c                óä   — | j         j                             ¦   «         | j         j                             ¦   «         | j         j                             ¦   «         | j                             ¦   «         fS )z…Private key function for SparsePauliOp.
    Args:
        observable: Input operator.

    Returns:
        Key for observables.
    )ÚpaulisÚzrY   ÚxÚphaseÚcoeffsr#   s    r   Ú_observable_keyrl   ¶   s_   € ð 	ÔÔ×#Ò#Ñ%Ô%ØÔÔ×#Ò#Ñ%Ô%ØÔÔ×'Ò'Ñ)Ô)ØÔ×!Ò!Ñ#Ô#ð	ð r   r   c                ó°   — t          | j        ¦  «        dk    r|                      ¦   «         S t          | j        | j        | j        g ¬¦  «        }| |_        |S )aƒ  Build an :class:`~qiskit.circuit.Instruction` object from
    a :class:`~qiskit.circuit.QuantumCircuit`

    This is a specialized version of :func:`~qiskit.converters.circuit_to_instruction`
    to avoid deep copy. This requires a quantum circuit whose parameters are all bound.
    Because this does not take a copy of the input circuit, this assumes that the input
    circuit won't be modified.

    If https://github.com/Qiskit/qiskit-terra/issues/7983 is resolved,
    we can remove this function.

    Args:
        circuit(QuantumCircuit): Input quantum circuit

    Returns:
        An :class:`~qiskit.circuit.Instruction` object
    r-   )r6   r   r3   rb   )ÚlenÚqregsÚto_instructionr   r6   r   r3   Ú
definition)r%   Úinsts     r   Úbound_circuit_to_instructionrs   Æ   sc   € õ$ ˆ7Œ=ÑÔ˜AÒÐØ×%Ò%Ñ'Ô'Ð'õ ØŒ\ØÔ%ØÔ%Øð	ñ ô €Dð €D„OØ€Kr   Úrngúnp.random.Generator | Noner   c                óª   — t          j        dd| j        z  ¦  «        }|                     |¦  «         |                     t          | ¦  «        ¦  «        S )a£  Generate a statevector from a circuit

    If the input circuit includes any resets for a some subsystem,
    :meth:`.Statevector.reset` behaves in a stochastic way in :meth:`.Statevector.evolve`.
    This function sets a random number generator to be reproducible.

    See :meth:`.Statevector.reset` for details.

    Args:
        circuit: The quantum circuit.
        seed: The random number generator or None.
    r   é   )r   Úfrom_intr   ÚseedÚevolvers   )r%   rt   Úsvs      r   Ú_statevector_from_circuitr|   æ   sH   € õ 
Ô	˜a  GÔ$6Ñ!6Ñ	7Ô	7€BØ‡G‚GˆC�L„L€LØ�9Š9Õ1°'Ñ:Ô:Ñ;Ô;Ð;r   )r   r   r   r   )r   r    r   r   )r%   r   r   r&   )rG   rH   r%   r   r   rI   )T)r%   r   r]   r^   r   rI   )r   r   r   rI   )r%   r   r   r   )r%   r   rt   ru   r   r   )#Ú__doc__Ú
__future__r   Úcollections.abcr   ÚnumpyrV   Úqiskit.circuitr   r   Úqiskit.circuit.bitr   Ú'qiskit.circuit.library.data_preparationr   Úqiskit.exceptionsr	   Úqiskit.quantum_infor
   r   r   Ú+qiskit.quantum_info.operators.base_operatorr   Ú3qiskit.quantum_info.operators.symplectic.base_paulir   Úqiskit.utils.deprecationr   r   r$   rF   rS   r\   rZ   rl   rs   r|   r.   r   r   ú<module>r‰      s  ððð ð #Ð "Ð "Ð "Ð "Ð "à $Ð $Ð $Ð $Ð $Ð $à Ð Ð Ð à 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø "Ð "Ð "Ð "Ð "Ð "Ø >Ð >Ð >Ð >Ð >Ð >Ø )Ð )Ð )Ð )Ð )Ð )Ø EÐ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EØ DÐ DÐ DÐ DÐ DÐ DØ IÐ IÐ IÐ IÐ IÐ IØ 3Ð 3Ð 3Ð 3Ð 3Ð 3ð €Ø
ð3ðñ ô ð
ð ð ñô ð
ð$ €Ø
ØFðñ ô ð)ð )ð )ñ	ô ð)ð. €Ø
ðVðñ ô ð$ð $ð $ñô ð$ðNð ð ð ðð ð ð!ð !ð !ð !ð !ðHð ð ð ð ð ð ð ð@<ð <ð <ð <ð <ð <r   