
    z	i                    8    S r SSKJr  SSKrSSKr " S S5      rg)z!
A module for using quaternions.
    )annotationsNc                      \ rS rSrSrS rS rS rS rS r	S r
SSS	 jjrSS
 jrSS jr\SS j5       r\SSS jj5       rSrg)
Quaternion   z"A class representing a Quaternion.c                @    [         R                  " U[        S9U l        g )Ndtype)npasarrayfloatdata)selfr   s     X/home/james-whalen/.local/lib/python3.13/site-packages/qiskit/quantum_info/quaternion.py__init__Quaternion.__init__   s    JJt51	    c                     U R                   U   $ Nr   )r   idxs     r   __call__Quaternion.__call__   s    yy~r   c                B    [         R                  " U R                  5      $ r   r
   	array_strr   r   s    r   __repr__Quaternion.__repr__       ||DII&&r   c                B    [         R                  " U R                  5      $ r   r   r   s    r   __str__Quaternion.__str__!   r   r   c                   [        U[        5      (       GaN  U n[        R                  " S[        S9nU" S5      U" S5      -  U" S5      U" S5      -  -
  U" S5      U" S5      -  -
  U" S5      U" S5      -  -
  US'   U" S5      U" S5      -  U" S5      U" S5      -  -   U" S5      U" S5      -  -
  U" S5      U" S5      -  -   US'   U" S5      U" S5      -  U" S5      U" S5      -  -   U" S5      U" S5      -  -   U" S5      U" S5      -  -
  US'   U" S5      U" S5      -  U" S5      U" S5      -  -
  U" S5      U" S5      -  -   U" S5      U" S5      -  -   US'   [        U5      $ [
        $ )N   r   r            )
isinstancer   r
   zerosr   NotImplemented)r   rqout_datas       r   __mul__Quaternion.__mul__$   sU   a$$Axx/HA$1+!qt3adQqTkAAaD1Q4KOHQKA$1+!qt3adQqTkAAaD1Q4KOHQKA$1+!qt3adQqTkAAaD1Q4KOHQKA$1+!qt3adQqTkAAaD1Q4KOHQKh''!!r   c                D    SSK Jn  UR                  U R                  5      $ )zNorm of quaternion.r   N)scipy.linalglinalgnormr   )r   las     r   r3   Quaternion.norm0   s    !wwtyy!!r   c                    U(       a&  U R                  5       nU =R                  U-  sl        gU R                  5       n[        R                  " U R                  SS9nX2-  n[	        U5      $ )zNormalizes 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)r3   r   r
   arrayr   )r   inplacenrm	data_copys       r   	normalizeQuaternion.normalize6   sU     ))+CIIIiikHHTYYT2		)$$r   c           
        U R                  5       R                  u  pp4[        R                  " SSUS-  -  -
  SUS-  -  -
  SU-  U-  SU-  U-  -
  SU-  U-  SU-  U-  -   /SU-  U-  SU-  U-  -   SSUS-  -  -
  SUS-  -  -
  SU-  U-  SU-  U-  -
  /SU-  U-  SU-  U-  -
  SU-  U-  SU-  U-  -   SSUS-  -  -
  SUS-  -  -
  //[        S9nU$ )z`Converts a unit-length quaternion to a rotation matrix.

Returns:
    ndarray: Rotation matrix.
r%   r&   r   )r<   r   r
   r8   r   )r   wxyzmats         r   	to_matrixQuaternion.to_matrixI   s'    ^^%**
ahhQAXAqD(!a%!)a!eai*?QQQRUUVYAVWQQUQY&A1Hq1a4x(?QQQRUUVYAVWQQUQY&A	AEAI(=q1q!t8|aRSUVRVh?VW
 
 
r   c                   U R                  5       n[        R                  " S[        S9nUS   S:  a  US   S:  a_  [        R
                  " US   US   5      US'   [        R                  " US   5      US'   [        R
                  " US	   US
   * 5      US'   U$ [        R
                  " US   US   5      * US'   [        R                  US'    U$ [        R
                  " US   US   5      US'   U$ )zsConverts 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%   )rD   r
   r)   r   mathatan2acospi)r   rC   eulers      r   to_zyzQuaternion.to_zyzZ   s     nn%(t9q=4y2~::c$iT;a99SY/a::c$i#d)<a 	 !JJs4y#d)<<a55a  zz#d)SY7E!Hr   c                   [         R                  " S[        S9nUS:X  a  SUS'   O#US:X  a  SUS'   OUS:X  a  SUS'   O[        S	5      eU[        R
                  " US
-  5      -  n[        R                  " US
-  5      US'   U " U5      $ )zReturn 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%   rA   r&   rB   r'   zInvalid axis input.g       @r   )r
   r)   r   
ValueErrorrH   sincos)clsangleaxisouts       r   from_axis_rotationQuaternion.from_axis_rotationo   s     hhq&3;CFS[CFS[CF233txx$$%#+&A3xr   c                    [         R                  " U[        S9nU R                  US   US   5      U R                  US   US   5      -  U R                  US   US   5      -  nUR	                  SS9  U$ )zGenerate 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)r9   )r
   r   r   rW   r<   )rS   anglesorderquats       r   
from_eulerQuaternion.from_euler   s     F%0""6!9eAh7$$VAYa9:$$VAYa9: 	
 	t$r   r   N)F)r9   boolreturnr   )r`   z
np.ndarray)rT   r   rU   strr`   r   )yzy)rZ   zlist | np.ndarrayr[   ra   r`   r   )__name__
__module____qualname____firstlineno____doc__r   r   r   r!   r.   r3   r<   rD   rM   classmethodrW   r]   __static_attributes__ r   r   r   r      sZ    ,2''
""%&"*  4  r   r   )rg   
__future__r   rH   numpyr
   r   rj   r   r   <module>rm      s!    #  G Gr   