§
    º³ÙgÜ  ã                   óŠ  — d Z ddlZddlZddlmZ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  ej        e¦  «        Z ed	d
dd¬¦  «        efd„¦   «         Z ed	d
dd¬¦  «        de	j        de	j        dedeeef         fd„¦   «         Z ed	d
dd¬¦  «        d„ ¦   «         Z ed	d
dd¬¦  «        d„ ¦   «         Z ed	d
dd¬¦  «        dededee	j        ef         fd„¦   «         Z ed	d
dd¬¦  «        	 d de	j        dedeee                  de	j        fd„¦   «         Z ed	d
dd¬¦  «        	 	 d!dedeeef         deee                  deee                  de	j        f
d„¦   «         Z ed	d
dd¬¦  «        	 	 d!dedeeef         deee                  deee                  dee	j        ef         f
d„¦   «         ZdS )"z(
Readout mitigation data handling utils
é    N)ÚOptionalÚListÚTupleÚDict)ÚQiskitError)Údeprecate_funcé   )Úmarginal_counts)ÚCountsz1.3ÚQiskitzin Qiskit 2.0zzThe `qiskit.result.mitigation` module is deprecated in favor of the https://github.com/Qiskit/qiskit-addon-mthree package.)ÚsinceÚpackage_nameÚremoval_timelineÚadditional_msgc                 óÜ   — t          j        | |¬¦  «        }t          | ¦  «        D ]/}t          |¦  «        dd…                              d¦  «        ||<   Œ0dt          j        |d¦  «        z  S )z8Return the diagonal for the operator :math:`Z^\otimes n`©Údtyper	   NÚ1éÿÿÿÿ)ÚnpÚzerosÚrangeÚbinÚcountÚmod)Údimr   ÚparityÚis       úT/granary/edev/quantum/lib/python3.11/site-packages/qiskit/result/mitigation/utils.pyÚ
z_diagonalr       sk   € õ ŒX�c Ð'Ñ'Ô'€FÝ�3‰ZŒZð *ð *ˆÝ˜‘F”F˜1˜2˜2”J×$Ò$ SÑ)Ô)ˆˆq‰	ˆ	Ø•2”6˜& !Ñ$Ô$Ñ$Ð$ó    ÚcoeffsÚprobsÚshotsÚreturnc                 ó  — |                       |¦  «        }| dz                        |¦  «        }||dz  z
  |z  }|dk     r0t          j        |d¦  «        st                               d|¦  «         |dk    rt          j        |¦  «        nd}||gS )aA  Compute expectation value and standard deviation.
    Args:
        coeffs: array of diagonal operator coefficients.
        probs: array of measurement probabilities.
        shots: total number of shots to obtain probabilities.
    Returns:
        tuple: (expval, stddev) expectation value and standard deviation.
    r	   r   zqEncountered a negative variance in expectation value calculation.(%f). Setting standard deviation of result to 0.g        )Údotr   ÚiscloseÚloggerÚwarningÚmathÚsqrt)r"   r#   r$   ÚexpvalÚ	sq_expvalÚvarianceÚcalc_stddevs          r   Úexpval_with_stddevr1   ,   s¡   € ð" �ZŠZ˜ÑÔ€Fð ˜‘—’ Ñ&Ô&€IØ˜F A™IÑ%¨Ñ.€Hð �!‚|€|�BœJ x°Ñ3Ô3€|Ý�Šð?àñ	
ô 	
ð 	
ð
 *2°Aª¨•$”)˜HÑ%Ô%Ð%¸3€KØ�KÐ Ð r!   c                 ó‚   — i }|                       ¦   «         D ]'\  }}t          j        |d|z
  z  |z  ¦  «        }|||<   Œ(|S )zCalculate stddev dicté   )Úitemsr+   r,   )r#   r$   ÚretÚkeyÚprobÚstd_errs         r   Ústddevr9   N   sQ   € ð €CØ—[’[‘]”]ð ð ‰	ˆˆTÝ”)˜D A¨¡HÑ-°Ñ5Ñ6Ô6ˆØˆˆC‰ˆØ€Jr!   c                 óª  — t          j        ddgt          ¬¦  «        t          j        ddgt          ¬¦  «        t          j        ddgt          ¬¦  «        t          j        ddgt          ¬¦  «        dœ}t          j        dgt          ¬¦  «        }t          | ¦  «        D ]3}||vrt	          d|› �¦  «        ‚t          j        ||         |¦  «        }Œ4|S )z1Transform diagonal from a string to a numpy arrayr3   r   r   r   )ÚIÚZÚ0r   z"Invalid diagonal string character )r   ÚarrayÚfloatÚreversedr   Úkron)ÚstringÚcharsr5   r   s       r   Ústr2diagrD   ^   sÓ   € õ ŒX�q˜!�f¥EÐ*Ñ*Ô*ÝŒX�q˜"�g¥UÐ+Ñ+Ô+ÝŒX�q˜!�f¥EÐ*Ñ*Ô*ÝŒX�q˜!�f¥EÐ*Ñ*Ô*ð	ð €Eõ Œ(�A�3�eÐ
$Ñ
$Ô
$€CÝ�fÑÔð %ð %ˆØ�Eˆ>ˆ>ÝÐFÀ1ÐFÐFÑGÔGÐGÝŒg�e˜A”h Ñ$Ô$ˆˆØ€Jr!   ÚcountsÚ
num_qubitsc                 ó¸   — t          j        d|z  t          ¬¦  «        }d}|                      ¦   «         D ]\  }}||z  }||t	          |d¦  «        <   Œ||z  }||fS )z)Transforms Counts to a probability vectorr	   r   r   )r   r   r?   r4   Úint)rE   rF   Úvecr$   r6   Úvals         r   Úcounts_to_vectorrK   u   sm   € õ Œ(�1�j‘=­Ð
.Ñ
.Ô
.€CØ€EØ—L’L‘N”Nð ð ‰ˆˆSØ�‰ˆØˆ�C��Q‰KŒKÑÐØˆ5�L€CØ�ˆ:Ðr!   rI   Úqubitsc                 ó2  ‡— |�“t          |¦  «        ‰k    rt          d¦  «        ‚ˆfd„t          t          j        |¦  «        ¦  «        D ¦   «         }t          j        | ‰dgz  ¦  «                             |¦  «                             | j        ¦  «        } | S )zRemapping the qubitsNz(Num qubits does not match vector length.c                 ó    •— g | ]
}‰d z
  |z
  ‘ŒS )r3   © )Ú.0r   rF   s     €r   ú
<listcomp>z remap_qubits.<locals>.<listcomp>•   s"   ø€ ÐIÐIÐI q�
˜Q‘ Ñ"ÐIÐIÐIr!   r	   )Úlenr   r@   r   ÚargsortÚreshapeÚ	transposeÚshape)rI   rF   rL   Úaxess    `  r   Úremap_qubitsrX   ‡   s‘   ø€ ð ÐÝˆv‰;Œ;˜*Ò$Ð$ÝÐHÑIÔIÐIØIÐIÐIÐI­HµR´ZÀÑ5GÔ5GÑ,HÔ,HÐIÑIÔIˆÝŒj˜˜j¨A¨3Ñ.Ñ/Ô/×9Ò9¸$Ñ?Ô?×GÒGÈÌ	ÑRÔRˆØ€Jr!   Úqubit_indexÚclbitsc                 óô   ‡— |�R|�t          |¦  «        nd}|�t          |¦  «        nd}|d|fvrt          d|› d|› d�¦  «        ‚t          | |¦  «        } |€ |�ˆfd„|D ¦   «         }t          | |¦  «        } | S )z[Marginalization of the Counts. Verify that number of clbits equals to the number of qubits.Nr   zNum qubits (z#) does not match number of clbits (z).c                 ó    •— g | ]
}‰|         ‘ŒS rO   rO   )rP   ÚqubitrY   s     €r   rQ   z&marganalize_counts.<locals>.<listcomp>±   s   ø€ Ð9Ð9Ð9¨�+˜eÔ$Ð9Ð9Ð9r!   )rR   r   r
   )rE   rY   rL   rZ   Ú
qubits_lenÚ
clbits_lens    `    r   Úmarganalize_countsr`   š   s°   ø€ ð ÐØ(.¨•S˜‘[”[�[¸Aˆ
Ø(.¨•S˜‘[”[�[¸Aˆ
Ø˜a ˜_Ð,Ð,ÝØ\˜zÐ\Ð\ÈjÐ\Ð\Ð\ñô ð õ ! ¨Ñ0Ô0ˆØ€~˜&Ð,Ø9Ð9Ð9Ð9°&Ð9Ñ9Ô9ˆÝ  ¨Ñ0Ô0ˆØ€Mr!   c                 óÜ   — t          | |||¦  «        } |�t          |¦  «        }n!t          |                     ¦   «         ¦  «        }t          | |¦  «        \  }}t	          |||¦  «        }||fS )añ  Compute a probability vector for all count outcomes.

    Args:
        counts: counts object
        qubit_index: For each qubit, its index in the mitigator qubits list
        qubits: qubits the count bitstrings correspond to.
        clbits: Optional, marginalize counts to just these bits.

    Raises:
        QiskitError: if qubits and clbits kwargs are not valid.

    Returns:
        np.ndarray: a probability vector for all count outcomes.
        int: Number of shots in the counts
    )r`   rR   ÚkeysrK   rX   )rE   rY   rL   rZ   rF   rI   r$   s          r   Úcounts_probability_vectorrc   ¶   sq   € õ8   ¨°V¸VÑDÔD€FØÐÝ˜‘[”[ˆ
ˆ
å˜×)Ò)Ñ+Ô+Ñ,Ô,ˆ
Ý! &¨*Ñ5Ô5�J€CˆÝ
�s˜J¨Ñ
/Ô
/€CØ�ˆ:Ðr!   )N)NN) Ú__doc__Úloggingr+   Útypingr   r   r   r   Únumpyr   Úqiskit.exceptionsr   Úqiskit.utils.deprecationr   Úutilsr
   rE   r   Ú	getLoggerÚ__name__r)   r?   r    ÚndarrayrH   r1   r9   rD   rK   rX   r`   rc   rO   r!   r   ú<module>rn      s  ððð ð €€€Ø €€€Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø Ð Ð Ð à )Ð )Ð )Ð )Ð )Ð )Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð à	ˆÔ	˜8Ñ	$Ô	$€ð €Ø
ØØ$ðAð	ñ ô ð  ð %ð %ð %ñô ð%ð €Ø
ØØ$ðAð	ñ ô ð!˜rœzð !°"´*ð !ÀSð !ÈUÐSXÐZ_ÐS_ÔM`ð !ð !ð !ñô ð!ð6 €Ø
ØØ$ðAð	ñ ô ðð ñô ðð €Ø
ØØ$ðAð	ñ ô ðð ñô ðð  €Ø
ØØ$ðAð	ñ ô ð˜Vð °ð ¸¸r¼zÈ3¸Ô9Oð ð ð ñô ðð €Ø
ØØ$ðAð	ñ ô ð EIð	ð 	Ø	Œð	Ø!$ð	Ø.6°t¸C´yÔ.Að	à„Zð	ð 	ð 	ñô ð	ð €Ø
ØØ$ðAð	ñ ô ð #'Ø"&ð	ð Øðà�c˜3�h”ðð �T˜#”YÔðð �T˜#”YÔð	ð
 „Zðð ð ñô ðð* €Ø
ØØ$ðAð	ñ ô ð #'Ø"&ð	ð Øðà�c˜3�h”ðð �T˜#”YÔðð �T˜#”YÔð	ð
 ˆ2Œ:�sˆ?Ôðð ð ñô ðð ð r!   