§
    º³Ùg  ã                  ó@   — d Z ddlmZ ddlZddlZ G d„ d¦  «        ZdS )z!
A module for using quaternions.
é    )ÚannotationsNc                  ó‚   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	ddd„Z
dd„Zdd„Zedd„¦   «         Zedd d„¦   «         ZdS )!Ú
Quaternionz"A class representing a Quaternion.c                óF   — t          j        |t          ¬¦  «        | _        d S )N©Údtype)ÚnpÚasarrayÚfloatÚdata)Úselfr   s     úT/granary/edev/quantum/lib/python3.11/site-packages/qiskit/quantum_info/quaternion.pyÚ__init__zQuaternion.__init__   s   € Ý”J˜t­5Ð1Ñ1Ô1ˆŒ	ˆ	ˆ	ó    c                ó   — | j         |         S ©N)r   )r   Úidxs     r   Ú__call__zQuaternion.__call__   s   € ØŒy˜Œ~Ðr   c                ó4   — t          j        | j        ¦  «        S r   ©r	   Ú	array_strr   ©r   s    r   Ú__repr__zQuaternion.__repr__   ó   € ÝŒ|˜DœIÑ&Ô&Ð&r   c                ó4   — t          j        | j        ¦  «        S r   r   r   s    r   Ú__str__zQuaternion.__str__!   r   r   c                ó¤  — t          |t          ¦  «        �r´| }t          j        dt          ¬¦  «        } |d¦  «         |d¦  «        z   |d¦  «         |d¦  «        z  z
   |d¦  «         |d¦  «        z  z
   |d¦  «         |d¦  «        z  z
  |d<    |d¦  «         |d¦  «        z   |d¦  «         |d¦  «        z  z    |d¦  «         |d¦  «        z  z
   |d¦  «         |d¦  «        z  z   |d<    |d¦  «         |d¦  «        z   |d¦  «         |d¦  «        z  z    |d¦  «         |d¦  «        z  z    |d¦  «         |d¦  «        z  z
  |d<    |d¦  «         |d¦  «        z   |d¦  «         |d¦  «        z  z
   |d¦  «         |d¦  «        z  z    |d¦  «         |d¦  «        z  z   |d<   t          |¦  «        S t
          S )Né   r   r   é   é   é   )Ú
isinstancer   r	   Úzerosr   ÚNotImplemented)r   ÚrÚqÚout_datas       r   Ú__mul__zQuaternion.__mul__$   sá  € Ý�a�Ñ$Ô$ñ 		"ØˆAÝ”x ­Ð/Ñ/Ô/ˆHØ˜!˜A™$œ$   1¡¤™+¨¨¨!©¬¨q¨q°©t¬t©Ñ3°a°a¸±d´d¸Q¸Q¸q¹T¼T±kÑAÀAÀAÀaÁDÄDÈ1È1ÈQÉ4Ì4ÁKÑOˆH�Q‰KØ˜!˜A™$œ$   1¡¤™+¨¨¨!©¬¨q¨q°©t¬t©Ñ3°a°a¸±d´d¸Q¸Q¸q¹T¼T±kÑAÀAÀAÀaÁDÄDÈ1È1ÈQÉ4Ì4ÁKÑOˆH�Q‰KØ˜!˜A™$œ$   1¡¤™+¨¨¨!©¬¨q¨q°©t¬t©Ñ3°a°a¸±d´d¸Q¸Q¸q¹T¼T±kÑAÀAÀAÀaÁDÄDÈ1È1ÈQÉ4Ì4ÁKÑOˆH�Q‰KØ˜!˜A™$œ$   1¡¤™+¨¨¨!©¬¨q¨q°©t¬t©Ñ3°a°a¸±d´d¸Q¸Q¸q¹T¼T±kÑAÀAÀAÀaÁDÄDÈ1È1ÈQÉ4Ì4ÁKÑOˆH�Q‰KÝ˜hÑ'Ô'Ð'å!Ð!r   c                óB   — ddl m} |                     | j        ¦  «        S )zNorm of quaternion.r   N)Úscipy.linalgÚlinalgÚnormr   )r   Úlas     r   r,   zQuaternion.norm0   s(   € à!Ð!Ð!Ð!Ð!Ð!à�wŠw�t”yÑ!Ô!Ð!r   FÚinplaceÚboolÚreturnc                óØ   — |r&|                       ¦   «         }| xj        |z  c_        dS |                       ¦   «         }t          j        | j        d¬¦  «        }||z  }t	          |¦  «        S )zèNormalizes a Quaternion to unit length
        so that it represents a valid rotation.

        Args:
            inplace (bool): Do an inplace normalization.

        Returns:
            Quaternion: Normalized quaternion.
        NT)Úcopy)r,   r   r	   Úarrayr   )r   r.   ÚnrmÚ	data_copys       r   Ú	normalizezQuaternion.normalize6   si   € ð ð 	Ø—)’)‘+”+ˆCØˆIŒI˜ÑˆIŒIØ�4Ø�iŠi‰kŒkˆÝ”H˜TœY¨TÐ2Ñ2Ô2ˆ	Ø�SÑˆ	Ý˜)Ñ$Ô$Ð$r   ú
np.ndarrayc           
     ó°  — |                       ¦   «         j        \  }}}}t          j        dd|dz  z  z
  d|dz  z  z
  d|z  |z  d|z  |z  z
  d|z  |z  d|z  |z  z   gd|z  |z  d|z  |z  z   dd|dz  z  z
  d|dz  z  z
  d|z  |z  d|z  |z  z
  gd|z  |z  d|z  |z  z
  d|z  |z  d|z  |z  z   dd|dz  z  z
  d|dz  z  z
  ggt          ¬¦  «        }|S )zxConverts a unit-length quaternion to a rotation matrix.

        Returns:
            ndarray: Rotation matrix.
        r   r    r   )r6   r   r	   r3   r   )r   ÚwÚxÚyÚzÚmats         r   Ú	to_matrixzQuaternion.to_matrixI   s3  € ð —^’^Ñ%Ô%Ô*‰
ˆˆ1ˆa�ÝŒhà�Q˜˜A™‘X‘  A q¡D¡Ñ(¨!¨a©%°!©)°a¸!±e¸a±iÑ*?ÀÀQÁÈÁÈQÐQRÉUÐUVÉYÑAVÐWØ�Q‘˜‘˜Q ™U Q™YÑ&¨¨A°°1±©H©°q¸1¸a¹4±xÑ(?ÀÀQÁÈÁÈQÐQRÉUÐUVÉYÑAVÐWØ�Q‘˜‘˜Q ™U Q™YÑ&¨¨A©°©	°A¸±E¸A±IÑ(=¸qÀ1ÀqÈ!ÁtÁ8¹|ÈaÐRSÐUVÑRVÉhÑ?VÐWðõ
 ð
ñ 
ô 
ˆð ˆ
r   c                ó  — |                       ¦   «         }t          j        dt          ¬¦  «        }|d         dk     r¨|d         dk    rgt	          j        |d         |d         ¦  «        |d<   t	          j        |d         ¦  «        |d<   t	          j        |d	         |d
          ¦  «        |d<   nYt	          j        |d         |d         ¦  «         |d<   t          j        |d<   n$t	          j        |d         |d         ¦  «        |d<   |S )z“Converts a unit-length quaternion to a sequence
        of ZYZ Euler angles.

        Returns:
            ndarray: Array of Euler angles.
        r!   r   )r    r    r   éÿÿÿÿ)r   r    )r   r    r   )r    r   )r    r   r    )r   r   )r   r   )r>   r	   r#   r   ÚmathÚatan2ÚacosÚpi)r   r=   Úeulers      r   Úto_zyzzQuaternion.to_zyzZ   så   € ð �nŠnÑÔˆÝ”˜¥%Ð(Ñ(Ô(ˆØˆtŒ9�qŠ=ˆ=Ø�4Œy˜2Š~ˆ~Ýœ: c¨$¤i°°T´Ñ;Ô;��a‘Ýœ9 S¨¤YÑ/Ô/��a‘Ýœ: c¨$¤i°#°d´)°Ñ<Ô<��a‘�å œJ s¨4¤y°#°d´)Ñ<Ô<Ð<��a‘Ýœ5��a‘�å”z # d¤)¨S°¬YÑ7Ô7ˆE�!‰HØˆr   Úangler   ÚaxisÚstrc                ó  — t          j        dt          ¬¦  «        }|dk    rd|d<   n'|dk    rd|d<   n|dk    rd|d<   nt          d	¦  «        ‚|t	          j        |d
z  ¦  «        z  }t	          j        |d
z  ¦  «        |d<    | |¦  «        S )a$  Return quaternion for rotation about given axis.

        Args:
            angle (float): Angle in radians.
            axis (str): Axis for rotation

        Returns:
            Quaternion: Quaternion for axis rotation.

        Raises:
            ValueError: Invalid input axis.
        r   r   r:   r   r;   r    r<   r!   zInvalid axis input.g       @r   )r	   r#   r   Ú
ValueErrorrA   ÚsinÚcos)ÚclsrG   rH   Úouts       r   Úfrom_axis_rotationzQuaternion.from_axis_rotationo   sŸ   € õ Œh�q¥Ð&Ñ&Ô&ˆØ�3Š;ˆ;ØˆC�‰FˆFØ�SŠ[ˆ[ØˆC�‰FˆFØ�SŠ[ˆ[ØˆC�‰FˆFåÐ2Ñ3Ô3Ð3Ø�tŒx˜ ™Ñ$Ô$Ñ$ˆÝ”˜% #™+Ñ&Ô&ˆˆA‰Øˆs�3‰xŒxˆr   ÚyzyÚanglesúlist | np.ndarrayÚorderc                ó8  — t          j        |t          ¬¦  «        }|                      |d         |d         ¦  «        |                      |d         |d         ¦  «        z  |                      |d         |d         ¦  «        z  }|                     d¬¦  «         |S )a  Generate a quaternion from a set of Euler angles.

        Args:
            angles (array_like): Array of Euler angles.
            order (str): Order of Euler rotations.  'yzy' is default.

        Returns:
            Quaternion: Quaternion representation of Euler rotation.
        r   r   r   r    T)r.   )r	   r
   r   rP   r6   )rN   rR   rT   Úquats       r   Ú
from_eulerzQuaternion.from_eulerŠ   s“   € õ ”˜F­%Ð0Ñ0Ô0ˆà×"Ò" 6¨!¤9¨e°A¬hÑ7Ô7Ø×$Ò$ V¨A¤Y°°a´Ñ9Ô9ñ:à×$Ò$ V¨A¤Y°°a´Ñ9Ô9ñ:ð 	ð
 	�Š˜tˆÑ$Ô$Ð$Øˆr   N)F)r.   r/   r0   r   )r0   r7   )rG   r   rH   rI   r0   r   )rQ   )rR   rS   rT   rI   r0   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r(   r,   r6   r>   rF   ÚclassmethodrP   rW   © r   r   r   r      sú   € € € € € Ø,Ð,ð2ð 2ð 2ðð ð ð'ð 'ð 'ð'ð 'ð 'ð
"ð 
"ð 
"ð"ð "ð "ð%ð %ð %ð %ð %ð&ð ð ð ð"ð ð ð ð* ðð ð ñ „[ðð4 ðð ð ð ñ „[ðð ð r   r   )r[   Ú
__future__r   rA   Únumpyr	   r   r]   r   r   ú<module>r`      st   ððð ð #Ð "Ð "Ð "Ð "Ð "Ø €€€Ø Ð Ð Ð ðGð Gð Gð Gð Gñ Gô Gð Gð Gð Gr   