§
    ¹³ÙgÖ'  ã                  ór  — d Z ddlmZ ddl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 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mZ ddgZeeeeeeeef         ef         f         Z 	 ee ef         Z!	  G d„ de¦  «        Z" ed¦  «        dd„¦   «         Z# ed¦  «        dd„¦   «         Z$dS )z5
ND-Array container class for Estimator observables.
é    )ÚannotationsN)Údefaultdict)ÚIterableÚMapping)Ú	lru_cache)ÚUnionr   Úoverload)ÚComplex)Ú	ArrayLike)ÚPauliÚ	PauliListÚSparsePauliOpé   )Úobject_array)ÚShapedMixinÚshape_tupleÚObservableLikeÚObservablesArrayLikec                  óê   ‡ — e Zd ZU dZdZdZded<   	 	 	 d&d'ˆ fd„Zd„ Zd(d„Z	d)d„Z
ed*d„¦   «         Zed+d„¦   «         Zd„ Zd,d„Zd-d„Zed.d „¦   «         Zed/d!„¦   «         Zd"„ Zed0d%„¦   «         Zˆ xZS )1ÚObservablesArrayzJAn ND-array of Hermitian observables for an :class:`.Estimator` primitive.)Ú_arrayÚ_shapez
IXYZ01+-lrÚstrÚALLOWED_BASISTÚobservablesr   ÚcopyÚboolÚvalidatec                óê  •— t          ¦   «                              ¦   «          t          |t          ¦  «        r|j        }t          ||t          f¬¦  «        | _        | j        j        | _        |rƒd}t          j
        | j        ¦  «        D ]i\  }}|                      |¦  «        }t          t          t          |¦  «        ¦  «        ¦  «        }|€|}n||k    rt          d¦  «        ‚|| j        |<   ŒhdS dS )a  Initialize an observables array.

        Args:
            observables: An array-like of basis observable compatible objects.
            copy: Specify the ``copy`` kwarg of the :func:`.object_array` function
                when initializing observables.
            validate: If true, coerce entries into the internal format and validate them. If false,
                the input should already be an array-like.

        Raises:
            ValueError: If ``validate=True`` and the input observables is not valid.
        )r   Ú
list_typesNúSThe number of qubits must be the same for all observables in the observables array.)ÚsuperÚ__init__Ú
isinstancer   r   r   r   Úshaper   ÚnpÚndenumerateÚcoerce_observableÚlenÚnextÚiterÚ
ValueError)
Úselfr   r   r   Ú
num_qubitsÚndiÚobsÚ	basis_obsÚbasis_num_qubitsÚ	__class__s
            €úd/granary/edev/quantum/lib/python3.11/site-packages/qiskit/primitives/containers/observables_array.pyr#   zObservablesArray.__init__9   s	  ø€ õ$ 	‰Œ×ÒÑÔÐÝ�kÕ#3Ñ4Ô4ð 	-Ø%Ô,ˆKÝ" ;°TÅyÀlÐSÑSÔSˆŒØ”kÔ'ˆŒØð 	-ØˆJÝœN¨4¬;Ñ7Ô7ð 
-ð 
-‘��SØ ×2Ò2°3Ñ7Ô7�	Ý#&¥t­D°©O¬OÑ'<Ô'<Ñ#=Ô#=Ð ØÐ%Ø!1�J�JØ%¨Ò3Ð3Ý$ð-ñô ð ð $-�”˜CÑ Ð ð	-ð 	-ð
-ð 
-ó    c                ó�   — t          | ¦  «        j        › d�}d| j        › d�}t          j        | j        ||d¬¦  «        }||z   |z   S )Nú(z, shape=ú)é2   )ÚprefixÚsuffixÚ	threshold)ÚtypeÚ__name__r%   r&   Úarray2stringr   )r-   r:   r;   Úarrays       r4   Ú__repr__zObservablesArray.__repr__^   sU   € Ý˜‘J”JÔ'Ð*Ð*Ð*ˆØ)˜DœJÐ)Ð)Ð)ˆÝ” ¤°FÀ6ÐUWÐXÑXÔXˆØ˜‰~ Ñ&Ð&r5   ÚreturnÚlistc                ó4   — | j                              ¦   «         S )zConvert to a nested list)r   Útolist©r-   s    r4   rE   zObservablesArray.tolistd   s   € àŒ{×!Ò!Ñ#Ô#Ð#r5   Nc                ó~   — |�|t           k    r"|r| j                             ¦   «         n| j        S t          d¦  «        ‚)zConvert to an Numpy.ndarrayNzType must be 'None' or 'object')Úobjectr   r   r,   )r-   Údtyper   s      r4   Ú	__array__zObservablesArray.__array__h   s>   € àˆ=˜E¥VšO˜OØ)-Ð>�4”;×#Ò#Ñ%Ô%Ð%°4´;Ð>ÝÐ:Ñ;Ô;Ð;r5   Úargsúint | tuple[int, ...]úMapping[str, float]c                ó   — d S ©N© ©r-   rK   s     r4   Ú__getitem__zObservablesArray.__getitem__n   s   € ØORÈsr5   Úslicec                ó   — d S rO   rP   rQ   s     r4   rR   zObservablesArray.__getitem__q   s   € Ø<?¸Cr5   c                óx   — | j         |         }t          |t          j        ¦  «        s|S t	          |dd¬¦  «        S )NF©r   r   )r   r$   r&   Úndarrayr   )r-   rK   Úitems      r4   rR   zObservablesArray.__getitem__t   s<   € ØŒ{˜4Ô ˆÝ˜$¥¤
Ñ+Ô+ð 	ØˆKÝ ¨5¸5ÐAÑAÔAÐAr5   r%   úint | Iterable[int]c                óh   — t          |Ž }t          | j                             |¦  «        dd¬¦  «        S )zÙReturn a new array with a different shape.

        This results in a new view of the same arrays.

        Args:
            shape: The shape of the returned array.

        Returns:
            A new array.
        FrV   )r   r   r   Úreshape)r-   r%   s     r4   r[   zObservablesArray.reshapez   s4   € õ ˜UÐ#ˆÝ ¤× 3Ò 3°EÑ :Ô :ÀÐQVÐWÑWÔWÐWr5   c                ó6   — |                       | j        ¦  «        S )zæReturn a new array with one dimension.

        The returned array has a :attr:`shape` given by ``(size, )``, where
        the size is the :attr:`~size` of this array.

        Returns:
            A new flattened array.
        )r[   ÚsizerF   s    r4   ÚravelzObservablesArray.ravelˆ   s   € ð �|Š|˜DœIÑ&Ô&Ð&r5   Ú
observabler   c                óH  — t          |t          ¦  «        rˆ|                     d¬¦  «        }t          j        |j        ¦  «        }t          j        |¦  «        rt          d¦  «        ‚|j         	                    ¦   «         }t          t          ||¦  «        ¦  «        S t          |t          ¦  «        rE|dd…                              ¦   «         |j        }}|dz  rt          d¦  «        ‚|dk    r|din|diS t          |t          ¦  «        r|                      |¦  «         |diS t          |t"          ¦  «        �rIt%          t'          t)          |¦  «        ¦  «        ¦  «        }t+          t,          ¦  «        }|                     ¦   «         D ]è\  }}	t          |t          ¦  «        r@|dd…                              ¦   «         |j        }}|dz  rt          d¦  «        ‚|dk    r|	 }	t          |	t0          ¦  «        r2t3          |	j        ¦  «        d	k    rt7          d
|› d�¦  «        ‚|	j        }	|                      |¦  «         t%          |¦  «        |k    rt          d¦  «        ‚||xx         |	z  cc<   Œét          |¦  «        S t7          dt;          |¦  «        › �¦  «        ‚)ac  Format an observable-like object into the internal format.

        Args:
            observable: The observable-like to format.

        Returns:
            The coerced observable.

        Raises:
            TypeError: If the input cannot be formatted because its type is not valid.
            ValueError: If the input observable is invalid.
        r   )ÚatolzhNon-Hermitian input observable: the input SparsePauliOp has non-zero imaginary part in its coefficients.Né   zGNon-Hermitian input observable: the input Pauli has an imaginary phase.r   éÿÿÿÿgH¯¼šò×z>z Non-Hermitian input observable: z& term has a complex value coefficient.zDNumber of qubits must be the same for all observable basis elements.zInvalid observable type: )r$   r   Úsimplifyr&   Úreal_if_closeÚcoeffsÚiscomplexobjr,   ÚpaulisÚ	to_labelsÚdictÚzipr   Úto_labelÚphaser   Ú_validate_basisÚ_Mappingr)   r*   r+   r   ÚfloatÚitemsr
   ÚabsÚimagÚ	TypeErrorÚrealr=   )
Úclsr_   rf   rh   Úlabelrm   r.   ÚuniqueÚbasisÚcoeffs
             r4   r(   z"ObservablesArray.coerce_observable“   sÏ  € õ �j¥-Ñ0Ô0ð 	-Ø#×,Ò,°!Ð,Ñ4Ô4ˆJåÔ% jÔ&7Ñ8Ô8ˆFÝŒ˜vÑ&Ô&ð Ý ð;ñô ð ð  Ô&×0Ò0Ñ2Ô2ˆFå�˜F FÑ+Ô+Ñ,Ô,Ð,å�j¥%Ñ(Ô(ð 	=Ø% a a aœ=×1Ò1Ñ3Ô3°ZÔ5E�5ˆEØ�q‰yð Ý Ø]ñô ð ð "'¨!¢ �E˜1�:�:°%¸°Ð<õ �j¥#Ñ&Ô&ð 	#Ø×Ò 
Ñ+Ô+Ð+Ø �?Ð"õ �j¥(Ñ+Ô+ñ 	 Ý�T¥$ zÑ"2Ô"2Ñ3Ô3Ñ4Ô4ˆJÝ ¥Ñ'Ô'ˆFØ *× 0Ò 0Ñ 2Ô 2ð 'ð '‘��uÝ˜e¥UÑ+Ô+ð 'Ø#(¨¨¨¤8×#4Ò#4Ñ#6Ô#6¸¼˜5�EØ˜q‘yð Ý(Øeñô ð ð  ’z�zØ!& ˜å˜e¥WÑ-Ô-ð 'Ý˜5œ:‘”¨Ò-Ð-Ý'ð,¸uð ,ð ,ð ,ñô ð ð "œJ�Eð ×#Ò# EÑ*Ô*Ð*Ý�u‘:”: Ò+Ð+Ý$Ø^ñô ð ð �u��” Ñ&��‘�Ý˜‘<”<ÐåÐFµD¸Ñ4DÔ4DÐFÐFÑGÔGÐGr5   c                óF   — t          |t          ¦  «        r|S  | |¦  «        S )zÀCoerce ObservablesArrayLike into ObservableArray.

        Args:
            observables: an object to be observables array.

        Returns:
            A coerced observables array.
        )r$   r   )rv   r   s     r4   ÚcoercezObservablesArray.coerceÝ   s-   € õ �kÕ#3Ñ4Ô4ð 	ØÐØˆs�;ÑÔÐr5   c                óÊ   — d}| j                              d¦  «        D ]E}t          t          t	          |¦  «        ¦  «        ¦  «        }|€|}Œ0||k    rt          d¦  «        ‚ŒFdS )z.Validate the consistency in observables array.Nrc   r!   )r   r[   r)   r*   r+   r,   )r-   r.   r0   r2   s       r4   r   zObservablesArray.validateë   s~   € àˆ
Ø”;×&Ò& rÑ*Ô*ð 	ð 	ˆCÝ"¥4­¨S©	¬	¡?¤?Ñ3Ô3ÐØÐ!Ø-�
�
Ø! ZÒ/Ð/Ý ð)ñô ð ð 0ð		ð 	r5   ry   ÚNonec           
     ó4  — t          | j        ¦  «        }|                     |¦  «        snt          | j        ¦  «        }t	          t          |                     |¦  «        ¦  «        ¦  «        }t          d|› d|› dt	          | j        ¦  «        › d�¦  «        ‚dS )z´Validate a basis string.

        Args:
            basis: a basis string to validate.

        Raises:
            ValueError: If basis string contains invalid characters
        zObservable basis string 'z' contains invalid characters z, allowed characters are ú.N)Ú_regex_matchr   ÚmatchÚ_regex_invalidrC   ÚsetÚfindallr,   )rv   ry   Úallowed_patternÚinvalid_patternÚinvalid_charss        r4   rn   z ObservablesArray._validate_basisø   s¼   € õ ' sÔ'8Ñ9Ô9ˆØ×$Ò$ UÑ+Ô+ð 	Ý,¨SÔ->Ñ?Ô?ˆOÝ ¥ _×%<Ò%<¸UÑ%CÔ%CÑ!DÔ!DÑEÔEˆMÝðF¨Eð Fð FÐQ^ð Fð FÝ+/°Ô0AÑ+BÔ+BðFð Fð Fñô ð ð	ð 	r5   )TT)r   r   r   r   r   r   )rB   rC   )NN)rK   rL   rB   rM   )rK   rS   rB   r   )r%   rY   rB   r   )rB   r   )r_   r   rB   rM   )r   r   rB   r   )ry   r   rB   r~   )r>   Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r   Ú__annotations__r#   rA   rE   rJ   r	   rR   r[   r^   Úclassmethodr(   r|   r   rn   Ú__classcell__)r3   s   @r4   r   r   2   s‡  ø€ € € € € € ØTÐTà$€IØ%€MÐ%Ð%Ð%Ñ%Ø2ð
 Øð	#-ð #-ð #-ð #-ð #-ð #-ð #-ðJ'ð 'ð 'ð$ð $ð $ð $ð<ð <ð <ð <ð ØRÐRÐRñ „XØRàØ?Ð?Ð?ñ „XØ?ðBð Bð BðXð Xð Xð Xð	'ð 	'ð 	'ð 	'ð ðGHð GHð GHñ „[ðGHðR ð ð  ð  ñ „[ð ðð ð ð ðð ð ñ „[ðð ð ð ð r5   r   Úallowed_charsr   rB   ú
re.Patternc                óV   — t          j        dt          j        | ¦  «        › d�¦  «        S )zMReturn pattern for matching if a string contains only the allowed characters.z^[z]*$©ÚreÚcompileÚescape©r�   s    r4   r�   r�     s*   € õ Œ:Ð8�2œ9 ]Ñ3Ô3Ð8Ð8Ð8Ñ9Ô9Ð9r5   c                óV   — t          j        dt          j        | ¦  «        › d�¦  «        S )z,Return pattern for selecting invalid stringsz[^ú]r“   r—   s    r4   rƒ   rƒ     s*   € õ Œ:Ð6�2œ9 ]Ñ3Ô3Ð6Ð6Ð6Ñ7Ô7Ð7r5   )r�   r   rB   r‘   )%r‹   Ú
__future__r   r”   Úcollectionsr   Úcollections.abcr   r   ro   Ú	functoolsr   Útypingr   r	   Únumbersr
   Únumpyr&   Únumpy.typingr   Úqiskit.quantum_infor   r   r   r   r%   r   r   Ú__all__r   rp   r   r   r   r�   rƒ   rP   r5   r4   ú<module>r¤      sá  ððð ð #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø #Ð #Ð #Ð #Ð #Ð #Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø Ð Ð Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ø "Ð "Ð "Ð "Ð "Ð "à ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?à &Ð &Ð &Ð &Ð &Ð &Ø +Ð +Ð +Ð +Ð +Ð +Ð +Ð +ð Ð3Ð
4€àØØ	ØØˆE�#�u�*Ô˜uÐ$Ô%ð'ô€ð Uð ˜^¨YÐ6Ô7Ð Ø ZðYð Yð Yð Yð Y�{ñ Yô Yð Yðx €ˆ1�„ð:ð :ð :ñ „ð:ð
 €ˆ1�„ð8ð 8ð 8ñ „ð8ð 8ð 8r5   