§
    º³Ùgó  ã                  ó’   — d Z ddlmZ ddlZdZdZdeedfd„Zd„ Zeefd	„Z	eefd
„Z
eefd„Zeefd„Zdeefd„Zeefd„Zeefd„ZdS )z
Predicates for operators.
é    )ÚannotationsNg:Œ0âŽyE>gñhãˆµøä>Fc                óô  — d                      t          t          ¦  «         |€t          }|€t          }t          | t          j        ¦  «        st	          j        | ¦  «        } t          |t          j        ¦  «        st	          j        |¦  «        }| j        |j        k    rdS |r¿d}| j        D ]J}t          |¦  «        |k    r5t	          j
        |¦  «        }||z  }t	          j        d|z  ¦  «        | z  }  nŒK|j        D ]\}t          |¦  «        |k    rGt	          j
        |¦  «        }||z  }t	          j        dt	          j
        |¦  «        z  ¦  «        |z  } nŒ]|�||d<   t	          j        | |||¬¦  «        S )NaÄ  Test if two arrays are equal.

    The final comparison is implemented using Numpy.allclose. See its
    documentation for additional information on tolerance parameters.

    If ignore_phase is True both matrices will be multiplied by
    exp(-1j * theta) where `theta` is the first nphase for a
    first non-zero matrix element `|a| * exp(1j * theta)`.

    Args:
        mat1 (matrix_like): a matrix
        mat2 (matrix_like): a matrix
        ignore_phase (bool): ignore complex-phase differences between
            matrices [Default: False]
        rtol (double): the relative tolerance parameter [Default {}].
        atol (double): the absolute tolerance parameter [Default {}].
        props (dict | None): if not ``None`` and ``ignore_phase`` is ``True``
            returns the phase difference between the two matrices under
            ``props['phase_difference']``

    Returns:
        bool: True if the matrices are equal or False otherwise.
    Fr   ù       €      ð¿Úphase_difference©ÚrtolÚatol)ÚformatÚRTOL_DEFAULTÚATOL_DEFAULTÚ
isinstanceÚnpÚndarrayÚarrayÚshapeÚflatÚabsÚangleÚexpÚallclose)	Úmat1Úmat2Úignore_phaser   r	   Úpropsr   Úeltr   s	            ú^/granary/edev/quantum/lib/python3.11/site-packages/qiskit/quantum_info/operators/predicates.pyÚmatrix_equalr      s‰  € ð÷, 	ŠÝ•lñ	ô 	ð 	ð €|ÝˆØ€|Ýˆå�d�BœJÑ'Ô'ð ÝŒx˜‰~Œ~ˆÝ�d�BœJÑ'Ô'ð ÝŒx˜‰~Œ~ˆà„z�T”ZÒÐØˆuàð 9ØÐð ”9ð 	ð 	ˆCÝ�3‰xŒx˜$ŠˆÝœ ™œ�Ø  EÑ)Ð Ý”v˜c E™kÑ*Ô*¨TÑ1�Ø�ð	 ð
 ”9ð 	ð 	ˆCÝ�3‰xŒx˜$ŠˆÝœ ™œ�Ø  EÑ)Ð Ý”v˜c¥B¤H¨S¡M¤MÑ1Ñ2Ô2°TÑ9�Ø�ð	 ð
 ÐØ(8ˆEÐ$Ñ%åŒ;�t˜T¨°4Ð8Ñ8Ô8Ð8ó    c                óv   — t          j        | ¦  «        } | j        dk    rdS | j        }|d         |d         k    S )z$Test if an array is a square matrix.é   Fr   é   )r   r   Úndimr   )Úmatr   s     r   Úis_square_matrixr$   X   s9   € å
Œ(�3‰-Œ-€CØ
„x�1‚}€}ØˆuØŒI€EØ�Œ8�u˜Q”xÒÐr   c                óà   — |€t           }|€t          }t          j        | ¦  «        } | j        dk    rdS t          j        | t          j        t          j        | ¦  «        ¦  «        ||¬¦  «        S )z%Test if an array is a diagonal matrixNr    Fr   )r   r   r   r   r"   r   ÚdiagÚdiagonal©r#   r   r	   s      r   Úis_diagonal_matrixr)   a   s`   € à€|ÝˆØ€|ÝˆÝ
Œ(�3‰-Œ-€CØ
„x�1‚}€}ØˆuÝŒ;�s�BœG¥B¤K°Ñ$4Ô$4Ñ5Ô5¸DÀtÐLÑLÔLÐLr   c                ó¢   — |€t           }|€t          }t          j        | ¦  «        }|j        dk    rdS t          j        ||j        ||¬¦  «        S )z&Test if an array is a symmetric matrixNr    Fr   )r   r   r   r   r"   r   ÚT)Úopr   r	   r#   s       r   Úis_symmetric_matrixr-   m   sN   € à€|ÝˆØ€|ÝˆÝ
Œ(�2‰,Œ,€CØ
„x�1‚}€}ØˆuÝŒ;�s˜CœE¨°4Ð8Ñ8Ô8Ð8r   c                óÆ   — |€t           }|€t          }t          j        | ¦  «        } | j        dk    rdS t          j        | t          j        | j        ¦  «        ||¬¦  «        S )z&Test if an array is a Hermitian matrixNr    Fr   )r   r   r   r   r"   r   Úconjr+   r(   s      r   Úis_hermitian_matrixr0   y   sV   € à€|ÝˆØ€|ÝˆÝ
Œ(�3‰-Œ-€CØ
„x�1‚}€}ØˆuÝŒ;�s�BœG C¤E™NœN°¸DÐAÑAÔAÐAr   c                ó®   — |€t           }|€t          }t          | ||¬¦  «        sdS t          j                             | ¦  «        }|D ]}|| k     r dS ŒdS )z)Test if a matrix is positive semidefiniteNr   FT)r   r   r0   r   ÚlinalgÚeigvalsh)r#   r   r	   ÚvalsÚvs        r   Úis_positive_semidefinite_matrixr6   …   sr   € à€|ÝˆØ€|ÝˆÝ˜s¨°DÐ9Ñ9Ô9ð ØˆuåŒ9×Ò˜cÑ"Ô"€DØð ð ˆØ�ˆuŠ9ˆ9Ø�5�5ð àˆ4r   c                óF  — |€t           }|€t          }t          j        | ¦  «        } | j        dk    rdS |r4t          j        | d         ¦  «        }t          j        d|z  ¦  «        | z  } t          j        t          | ¦  «        ¦  «        }t          j	        | |||¬¦  «        S )z'Test if an array is an identity matrix.Nr    F)r   r   r   r   )
r   r   r   r   r"   r   r   ÚeyeÚlenr   )r#   r   r   r	   ÚthetaÚidens         r   Úis_identity_matrixr<   •   s–   € à€|ÝˆØ€|ÝˆÝ
Œ(�3‰-Œ-€CØ
„x�1‚}€}ØˆuØð (õ ”˜˜TœÑ#Ô#ˆÝŒf�S˜5‘[Ñ!Ô! CÑ'ˆåŒ6•#�c‘(”(ÑÔ€DÝŒ;�s˜D t°$Ð7Ñ7Ô7Ð7r   c                ó¨   — t          j        | ¦  «        } t          j        | j        ¦  «                             | ¦  «        } t          | d||¬¦  «        S )z%Test if an array is a unitary matrix.F)r   r   r	   )r   r   r/   r+   Údotr<   r(   s      r   Úis_unitary_matrixr?   ©   sC   € å
Œ(�3‰-Œ-€Cå
Œ'�#”%‰.Œ.×
Ò
˜SÑ
!Ô
!€CÝ˜c°¸DÀtÐLÑLÔLÐLr   c                óð   — t          j        | ¦  «        } t          j        | j        d         ¦  «        }t          j        | j        ¦  «                             | ¦  «        } t          j        | |||¬¦  «        S )z Test if an array is an isometry.r!   r   )r   r   r8   r   r/   r+   r>   r   )r#   r   r	   r;   s       r   Úis_isometryrA   ±   sZ   € å
Œ(�3‰-Œ-€CåŒ6�#”)˜A”,ÑÔ€DÝ
Œ'�#”%‰.Œ.×
Ò
˜SÑ
!Ô
!€CÝŒ;�s˜D t°$Ð7Ñ7Ô7Ð7r   )Ú__doc__Ú
__future__r   Únumpyr   r   r   r   r$   r)   r-   r0   r6   r<   r?   rA   © r   r   ú<module>rF      s>  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð à€Ø€ð +0°lÈÐ]að =9ð =9ð =9ð =9ð@ ð  ð  ð ".°Lð 	Mð 	Mð 	Mð 	Mð ".°Lð 	9ð 	9ð 	9ð 	9ð #/°\ð 	Bð 	Bð 	Bð 	Bð /;Àð ð ð ð ð  */°\Èð 8ð 8ð 8ð 8ð( !-°<ð Mð Mð Mð Mð '¨\ð 8ð 8ð 8ð 8ð 8ð 8r   