
    > j*                    1   S SK r S SKrS SKrS SKJr  S SKJrJr  S SK	J
s  Js  Jr  S SKJ
s  Js  Jr  S SKJr  S SKJrJr  S SKJr  S SKrS SKJrJrJrJrJrJrJ r J!r!J"r"J#r#J$r$  S SK%J&s  J'r(  S SK)r)S SK*r*\\/r+\#" \RX                  \RZ                  5      r.S r/S	\4S
 jr0S r1S r2S r3S r4\Rj                  Rm                  S\7" SS5      5      S\84S j5       r9\"" \Rt                  5      S 5       r;S r<S r=S r>\"" \R~                  5      S 5       r@S rAS rB\"" \R                  \R                  5      S 5       rE\Rj                  Rm                  S\7" SS5      5      S\84S j5       rFS rG\"" \Rt                  5      \Rj                  Rm                  S\7" SS5      5      S\84S j5       5       rH\"" \Rt                  5      S 5       rI\"" \Rt                  5      S 5       rJ\"" \R                  5      \Rj                  Rm                  S\7" SS5      5      S\84S  j5       5       rL\"" \R                  5      S! 5       rM\"" \R                  \Rt                  5      S" 5       rN\"" \R                  \Rt                  5      S# 5       rO\"" \R                  \Rt                  5      S$ 5       rP\"" \R                  \Rt                  5      S% 5       rQ\"" \R                  \Rt                  5      S& 5       rRS' rS\"" \R                  5      S( 5       rT\"" \R                  5      \Rj                  Rm                  S\7" SS5      5      S\84S) j5       5       rV\"" \R                  5      S* 5       rW\"" \R                  5      S+ 5       rX\"" \R                  \R                  5      S, 5       rZ\"" \R                  5      S- 5       r[\"" \R                  5      S. 5       r\\"" \R                  5      S/ 5       r]\"" \R                  5      \Rj                  Rm                  S\7" SS5      5      S\84S0 j5       5       r^\"" \R                  5      \Rj                  R                  S1S2S39S4 5       5       r`\"" \R                  5      \Rj                  Rm                  S\7" SS55      5      S\84S6 j5       5       ra\"" \R                  \R                  5      S7 5       rb\"" \R                  \R                  5      S8 5       rc\"" \R                  5      \Rj                  Rm                  S\7" SS55      5      S\84S9 j5       5       reS: rf\"" \R                  5      S; 5       rg\"" \R                  5      S< 5       rh\"" \R                  5      \Rj                  Rm                  S\7" SS55      5      S\84S= j5       5       ri\"" \R                  5      S> 5       rk\"" \R~                  \R                  5      S? 5       rl\"" \R                  5      \Rj                  Rm                  S\7" SS55      5      S\84S@ j5       5       rm\"" \R                  \R                  5      SA 5       rn\"" \R~                  5      SB 5       ro\"" \R~                  5      SC 5       rp\"" \R~                  5      \Rj                  Rm                  S\7" SS55      5      S\84SD j5       5       rq\"" \R~                  \Rt                  5      SE 5       rr\"" \R~                  5      SF 5       rs\"" \R~                  \Rt                  5      SG 5       rt\"" \R~                  \Rt                  5      SH 5       ru\"" \R~                  \Rt                  5      SI 5       rv\"" \R~                  \Rt                  5      SJ 5       rw\"" \R~                  \Rt                  5      SK 5       rxSL rySM rz\"" \R~                  \R                  5      \Rj                  Rm                  SN\" SO5      5      \Rj                  Rm                  SPSQ5      SR 5       5       5       r|\"" \R~                  \R                  5      \Rj                  Rm                  SN\" SO5      5      \Rj                  Rm                  SPSQ5      SS 5       5       5       r}\ST 5       r~\"" \R~                  \Rt                  \R                  5      \Rj                  Rm                  SN\" SO5      5      \Rj                  Rm                  SPSQ5      \Rj                  Rm                  SUSQ5      SV 5       5       5       5       r\"" \R~                  \Rt                  \R                  5      \Rj                  Rm                  SN\" SO5      5      \Rj                  Rm                  SPSQ5      \Rj                  Rm                  SUSQ5      SW 5       5       5       5       r\"" \R~                  \R                  5      \Rj                  Rm                  S\7" SS55      5      S\84SX j5       5       r\"" \Rt                  \R                  5      SY 5       r\"" \R                  \Rt                  5      SZ 5       r\"" \GR                  \R                  5      S[ 5       r\"" \GR                  \R                  5      S\ 5       r\"" \R                  \GR                  5      S] 5       r\"" \R                  \GR                  5      S^ 5       rS_ r\"" \GR                  5      \Rj                  Rm                  S\7" SS55      5      S\84S` j5       5       r\"" \GR                  5      Sa 5       r\"" \R                  \GR                  \GR                  5      Sb 5       r\"" \R                  \GR                  5      Sc 5       r\"" \R                  \GR                  \GR                  5      Sd 5       r\"" \GR                  5      Se 5       r\"" \R                  \GR"                  \GR                  5      \Rj                  Rm                  S\7" SS55      5      S\84Sf j5       5       r\"" \R                  \GR"                  \GR                  5      \Rj                  Rm                  S\7" SSg5      5      S\84Sh j5       5       r\"" \GR"                  \GR                  5      Si 5       r\"" \R                  \GR"                  \R                  \GR                  5      \Rj                  Rm                  S\7" SS55      5      S\84Sj j5       5       r\"" \GR"                  5      Sk 5       r\"" \GR.                  5      Sl 5       r\"" \GR.                  5      Sm 5       r\"" \GR.                  \R                  \GR                  5      Sn 5       r\"" \R                  \GR6                  5      So 5       r\"" \R                  \GR6                  5      \Rj                  Rm                  S\7" SS55      5      S\84Sp j5       5       r\"" \R                  \GR6                  5      \Rj                  Rm                  S\7" SSg5      5      S\84Sq j5       5       r\"" \R                  \GR6                  5      \Rj                  Rm                  S\7" SSg5      5      S\84Sr j5       5       r\"" \GR6                  5      Ss 5       rSt r\"" \GR6                  5      Su 5       r\"" \R                  \Rt                  \GRF                  5      \Rj                  Rm                  S\7" SS55      5      S\84Sv j5       5       r\"" \GRF                  5      Sw 5       r\"" \R                  \GRF                  \Rt                  5      Sx 5       r\"" \GRN                  5      Sy 5       r\"" \GRN                  5      Sz 5       r\"" \GRN                  5      S{ 5       r\"" \GRN                  5      S| 5       r\"" \R                  5      S} 5       rS~ r\"" \GR\                  \Rt                  5      S 5       r\"" \GR6                  \GR\                  5      S 5       r\"" \GR\                  \GR6                  5      S 5       r\"" \GR\                  5      S 5       r\"" \GR\                  \Rt                  5      S 5       r\"" \GR6                  \R                  \GR\                  5      S 5       r\"" \GR\                  5      S 5       r\"" \GR\                  \Rt                  \GR6                  5      S 5       r\"" \GR\                  \Rt                  5      S 5       r\"" \GR\                  \Rt                  5      S 5       r\"" \GR\                  \GR                  \GR6                  \R                  \R                  \Rt                  5      S 5       r\"" \GR\                  \GR6                  5      S 5       rS r\"" \GR6                  \GR\                  5      S 5       rS rS r\"" \GR~                  \GR                  5      S 5       r\"" \GR~                  5      S 5       rSr\"" \GR~                  5      S 5       r\"" \GR~                  5      S 5       r\"" \GR~                  5      S 5       r\"" \GR~                  5      S 5       r\"" \GR~                  5      S 5       r\"" \GR~                  5      S 5       r\"" \GR~                  5      S 5       r\"" \GR~                  5      S 5       r\"" \GR~                  \GR                  5      S 5       r\"" \GR~                  \GR                  5      S 5       r\"" \GR~                  \GR                  \R~                  \R                  \GR                  5      S 5       r\"" \R                  5      S 5       r\"" \R                  5      S 5       r\"" \R                  5      S 5       r\"" \R                  5      S 5       r\"" \R                  \GR                  \R                  \GR                  \R                  \R                  5      \Rj                  Rm                  S\7" SS55      5      S\84S j5       5       r\"" \GR                  5      S 5       rS r\"" \Rt                  5      \Rj                  R                  SSS39S 5       5       r\"" \Rt                  5      \Rj                  R                  SSS39S 5       5       rS r\"" \GR                  5      S 5       r\"" \GR                  5      S 5       r\"" \GR                  5      S 5       r\"" 5       S 5       r\"" \GR                  5      S 5       r\"" \R                  \GR                  5      S 5       r\"" \GR                  5      \Rj                  Rm                  S\7" SS55      5      S\84S j5       5       r\"" \GR                  5      S 5       r\"" \GR                  5      S 5       rS r\"" \GR                  \GR                  5      S 5       r\"" \GR                  \GR                  5      S 5       r\"" \GR                  \GR                  \Rt                  5      \Rj                  Rm                  SUSQ5      S 5       5       r\"" \R~                  \GR                  5      S 5       r\"" \R~                  \R                  \GR                  5      S 5       r\"" \R                  \R~                  \R                  \GR                  \R                  5      S 5       r\"" \Rt                  \R                  \R                  \R                  \GR                  5      S 5       r\"" \GR6                  5      S 5       r\"" \R                  5      S 5       r\"" \GR                  5      S 5       r\"" \GR                  5      S 5       r\"" \R                  5      S 5       r\"" \GR                  5      S 5       r\"" \GR"                  5      S 5       r\"" \GR                  5      S 5       r\Rj                  R                  SSS39\Rj                  R                  S1SS39S 5       5       r\"" \GRF                  5      S 5       r\"" \GR                  5      S 5       r\Rj                  Rm                  S\7" SSg5      5      S\84S j5       rS rg)    N)assert_equal)RotationSlerp)special_ortho_group)permutationsproduct)contextmanager)xp_assert_equalarray_namespaceis_numpyis_lazy_arrayxp_vector_normxp_assert_closeeager_warnsxp_default_dtypemake_xp_test_casemake_xp_pytest_marksxp_device_typec                 @    U S:X  a  / SQ$ U S:X  a  / SQ$ U S:X  a  / SQ$ g )Nx   r   r   yr   r   r   zr   r   r    axiss    |/root/GenerationalWealth/GenerationalWealth/venv/lib/python3.13/site-packages/scipy/spatial/transform/tests/test_rotation.py	basis_vecr!   '   s.    s{		 
    rc                     [         R                  " U5      n[        R                  " UR	                  U R                  5       US95      $ )Ndtype)xpxdefault_dtyper   	from_quatasarrayas_quat)r#   xpr&   s      r    rotation_to_xpr-   0   s6    b!EbjjEjBCCr"   c                  R    [        S5        [        / SQ5        [        / SQ//5        g Nr   r   r   r   )r   r   r"   r    test_init_non_arrayr1   5   s    \\|nr"   c                     [         R                  " [        R                  " / SQ5      5      n U R                  [
        L d   e[         R                  " [        R                  " / SQ/5      5      n U R                  [
        L d   e[         R                  " [        R                  " / SQ//5      5      n U R                  [        L d   eg r/   )r   r)   nparray_backendcython_backend
xp_backendr#   s    r    test_cython_backend_selectionr9   ;   s    288L12A::'''288\N34A::'''288l^$456A::###r"   c                  v    [         R                  " [        R                  " / SQ[        R                  S95        g )Nr   r   r   r   r%   )r   r)   r3   r4   float32r   r"   r    test_numpy_float32_inputsr=   D   s    rxxBJJ?@r"   c                     U R                  / SQ/ SQ/5      n[        R                  " U5      nXR                  S/S//5      -  n[        UR	                  5       U5        g )N      @   r   r   )      r   r         @g      *@r*   r   r)   r   r+   r,   r   r#   expected_quats       r    test_generic_quat_matrixrH   H   sN    


NM23A1A

SED6?33MAIIK/r"   ndimr      c                     U R                  / SQ5      nU R                  USUS-
  -  S-   5      n[        R                  " U5      nUS-  n[	        UR                  5       U5        g )Nr?   r   r   rA   rB   )r*   reshaper   r)   r   r+   )r,   rI   r   r#   rG   s        r    test_from_single_nd_quaternionrO   O   sW    


>"A


1ddQh'$./A1AEMAIIK/r"   c                 l   [         R                  R                  S5      n[        R                  " U R                  / SQ5      SS9n[        UR                  5       U R                  S5      SSS9  U R                  U R                  / SQ5      S	5      n[        R                  " USS9n[        UR                  5       U R                  U R                  S5      S
5      SSS9  U R                  UR                  SS5      5      nU[        USS9S S 2S 4   -  n[        UR                  S   5       HG  nX4S4   n[        R                  " USS9n[        U R                  UR                  5       S5      USS9  MI     [        R                  " USS9n[        U R                  UR                  5       SSS9USS9  g )Nr   r;   Tscalar_first   V瞯<缉ؗҜ<rtolatol
   r   )rZ   r   r   d   rA   r   r   .rW   )r3   randomRandomStater   r)   r*   r   	as_matrixeyetilerandnr   rangeshaperollr+   r,   rngr#   qiqis         r    test_from_quat_scalar_firstrk   X   s]   
))


"C2::l3$GAAKKM266!95uE


<('2A140A	rwwrvvay*5E 	

399S!$%A	"1d7	++A1771:#vYr5		Q/%@ 
 	140ABGGAIIKG3QUCr"   c                     [         R                  R                  S5      n [        R                  " U S9n[        R                  " UR                  5       R                  5       5      nUR                  USS9(       d   e[        R                  " SU S9n[        R                  " UR                  5       R                  5       5      n[         R                  " UR                  USS95      (       d   eU R                  SS9nU[        USS	9S
   -  n[        R                  " U5      n[        R                  " U5      n[         R                  " UR                  USS95      (       d   eg )N{   rg   -q=rX   rS   )rS   rA   rB   rA   sizer   ).N)r3   r]   default_rngr   r)   r+   tolistapprox_equalallnormalr   )rg   
r_expectedr#   rh   s       r    test_from_quat_array_likerz   p   s%   
))


$CS)J:--/6689A""15"111 ,J:--/6689A66*))!%)89999 	


%A	#I	..A##A&J1A66*))!%)89999r"   c                     [         R                  " U R                  / SQ5      5      nUR                  5       R                  [        U 5      :X  d   eg )Nr;   )r   r)   r*   r+   r&   r   r,   r#   s     r    test_from_quat_int_dtyper}      s;    2::l34A99; 0 4444r"   c                 D   U R                  / SQ5      n[        [        R                  " U5      R	                  SS9U* 5        U R                  / SQ5      n[        [        R                  " U5      R	                  SS9U* 5        U R                  / SQ5      n[        [        R                  " U5      R	                  SS9U* 5        U R                  / SQ5      n[        [        R                  " U5      R	                  SS9U* 5        U R                  / SQ5      nU[        U5      -  n[        [        R                  " U5      R	                  SS9U5        U R                  / SQ5      nU[        U5      -  n[        [        R                  " U5      R	                  SS9U5        g )	N        r   r   rs   T	canonical      r   r   r   )r   rs   r   r   )r   r   rs   r   )r   皙r   ?)r   r   r   r   )r*   r   r   r)   r+   r   )r,   rh   s     r    test_quat_canonicalr      sP   


?#AH&&q)11D1AA2F


?#AH&&q)11D1AA2F


?#AH&&q)11D1AA2F


?#AH&&q)11D1AA2F


&'A	N1AH&&q)11D1A1E


()A	N1AH&&q)11D1A1Er"   c           
      "   [         R                  R                  S5      n[        R                  " SU R                  S5      5      n[        UR                  SS9U R                  / SQ5      SSS	9  [        R                  " SU R                  S
5      5      n[        UR                  SS9U R                  U R                  / SQ5      S5      SSS	9  U R                  UR                  SS5      5      nU[        USS9S S 2S 4   -  n[        UR                  S   5       H}  nX4S4   n[        R                  " U5      n[        UR                  SS9U R                  US5      SS9  [        UR                  SSS9U R                  UR                  SS9S5      SS9  M     [        R                  " U5      n[        UR                  SS9U R                  USSS9SS9  [        UR                  SSS9U R                  UR                  SS9SSS9SS9  g )Nr   xyzrS   TrQ   )      ?r   r   r   rT   rU   rV   )rZ   rS   rY   r[   rA   r   r   .r\   )r   rR   r   )r3   r]   r^   r   
from_eulerzerosr   r+   r*   ra   rb   r   rc   rd   r)   re   rf   s         r    test_as_quat_scalar_firstr      s   
))


"CE288A;/AAII4I0"**^2LU, 	E288G#45AAII4I0GGBJJ~6@U, 	

399S!$%A	"1d7	++A1771:#vYr"		t	4bggb!n"	$ 			Dt	D		D	 91="	$  	1AAII4I0"''!QQ'2G  AII4I@GGAIII5qqGAOr"   c           	          U R                  / SQ/ SQ/ SQ/ SQ/ SQ/ SQ/5      n[        R                  " U5      nXR                  S/S/S	/S
/S	/S
//5      -  n[        UR	                  5       U5        g )N)r@   r   r   rA   rB   r   rC   r   r0   )rs   rs   rs   r   r   r   r   rs   rs   rs   rs   rs   rD      r      rE   rF   s       r    test_from_square_quat_matrixr      ss    



 	A 	1A

SEB4!qcA3#DEEMAIIK/r"   c                     U R                  / SQ/ SQ/ SQ/ SQ/ SQ/5      n[        R                  " U5      nU R                  U5      [	        USS9S S 2S 4   -  n[        UR                  SS	9U5        g )
Nr   )r   rs   r   r   )r   r   rs   r   r   r   r   r   Tr   )r*   r   r)   absr   r   r+   rF   s       r    *test_quat_double_to_canonical_single_coverr      sm    



 	A 	1AFF1Iqq 9!T' BBMAIII-}=r"   c                    U R                  / SQ5      n[        R                  " U5      n[        XR	                  SS95        U R                  / SQ5      [
        R                  " S5      -  n[        R                  " U5      nX"-  U-  n[        UR	                  SS9[
        R                  " S5      -  U R                  / SQ5      5        [        UR                  5       R	                  SS9[
        R                  " S5      -  U R                  / SQ5      5        [        UR	                  SS9[
        R                  " S5      -  U R                  / SQ5      5        [        UR                  5       R	                  SS9[
        R                  " S5      -  U R                  / SQ5      5        [        X"R                  5       -  R	                  SS9U R                  / S	Q5      S
S9  [        X3R                  5       -  R	                  SS9U R                  / S	Q5      S
S9  [        X#-  R	                  SS9U R                  / SQ5      S
S9  [        UR                  5       UR                  5       -  R	                  SS9U R                  / SQ5      S
S9  g )Nr   Fr   )r   r   r   r   r   )r   r   r   r   )r   r   r   rs   )r   r   r   rs   r   r   r   r   gؗҬ<rp   )	r*   r   r)   r
   r+   mathsqrtr   inv)r,   rh   r#   r3s       r    test_quat_double_coverr      s   
 	

?#A1AAyy5y12


>"499Q</A1A	
QBAIII.tyy|;JJ~.0AEEGOOeO4TYYq\AJJ/1BJJJ/		!<JJ/1BFFH$$u$5diilBJJ/02 QuuwY''%'8JJ~.U<R[))E):JJ~.U<QTNNUN3JJ/e=QUUWrvvx'0050AJJ/e=r"   c                     U R                  / SU-  QSP75      n[        R                  " [        SS9   [        R
                  " U5        S S S 5        g ! , (       d  f       g = f)NrL   rB   zExpected `quat` to have shapematch)r   pytestraises
ValueErrorr   r)   )r,   rI   quats      r    test_from_quat_wrong_shaper      sI    88'td{'Q'(D	z)H	I4  
J	I	Is   A
A!c                    U R                  / SQ/ SQ/ SQ/5      n[        U5      (       aM  U R                  U R                  [        R
                  " U5      R                  5       S   5      5      (       d   eg [        R                  " [        5         [        R
                  " U5        S S S 5        g ! , (       d  f       g = f)N)rS   rA   r   r   )r   r   r   r   r   r   .)
r*   r   rw   isnanr   r)   r+   r   r   r   )r,   r   s     r    test_zero_norms_from_quatr     s    


 	A
 Qvvbhhx11!4<<>vFGHHHH]]:&q! '&&s   B22
C c                 &   U R                  / SQ5      nU R                  USUS-
  -  S-   5      n[        R                  " U5      R	                  5       nU R                  / SQ/ SQ/ SQ/5      nU R                  USUS-
  -  S-   5      n[        X4S	S
9  g )Nr   r   r   r   rL   r   rM   r   rs   r   r   r   rS   rS   rU   rp   )r*   rN   r   r)   r_   r   )r,   rI   r   matexpected_mats        r    #test_as_matrix_single_nd_quaternionr     s     ::l#D::dDD1H-45D


T
"
,
,
.C::
 L
 ::lDD1H,=,FGLCE2r"   c                    U R                  / SQ/ SQ/ SQ/ SQ/5      n[        R                  " U5      R                  5       n[	        UR
                  S5        U R                  / SQ/ SQ/ SQ/5      n[        US	   US
S9  U R                  / SQ/ SQ/ SQ/5      n[        US   US
S9  [        US   U R                  S5      5        [        US   U R                  S5      5        g )Nr   r   r   r   r   r0   r   )rA   rS   rS   r   r   r   r   .rU   rp   r   r   r   r   rs   r   r   r   r   .rS   rS   .)r*   r   r)   r_   r   rd   r   r`   )r,   quatsr   	expected0	expected1s        r     test_as_matrix_from_square_inputr      s    JJ	 E 

U
#
-
-
/CI&


 I
 CK7


 I
 CK7CK+CK+r"   c                    U R                  / SQ/ SQ/ SQ/5      n[        R                  " U5      R                  5       n[	        UR
                  S5        U R                  / SQ/ SQ/ SQ/5      n[        US   US	S
9  U R                  / SQ/ SQ/ SQ/5      n[        US   US	S
9  U R                  / SQ/ SQ/ SQ/5      S-  n[        US   U5        g )Nr   r   r   r   rS   rA   )rS   rS   rS   r   r   r   r   rU   rp   r   r   r   r   )皙?g@)gffffff@r   r   )rs   r   r   rS   r   )r*   r   r)   r_   r   rd   r   )r,   r   r   r   r   	expected2s         r    !test_as_matrix_from_generic_inputr   <  s    JJ E
 

U
#
-
-
/CI&


 I
 CK7


 I
 CK7


  	I
 CK+r"   c                 &   U R                  / SQ/ SQ/ SQ/5      nU R                  USUS-
  -  S-   5      nU R                  / SQ5      nU R                  USUS-
  -  S-   5      n[        [        R                  " U5      R                  5       U5        g )	Nr   r   r   rL   r   r   )      ?r   r   r   rM   )r*   rN   r   r   from_matrixr+   )r,   rI   r   rG   s       r    test_from_single_nd_matrixr   \  s     ** C
 **S$$(+f4
5CJJ34MJJ}ddQh.?$.FGMH((-557Gr"   c                    SnU R                  / SQ5      [        R                  " S5      -  nU R                  / SQ/ SQ/ SQ/5      n[        [        R
                  " U5      R                  5       X!S9  [        [        R
                  " U R                  US5      5      R                  5       U R                  US	5      US9  g )
N:0yE>)r   r   rJ   r   '   )3~˷g6iпnzo?)r   r   6i?)r   r   g3~˷?rp   r   rS   rS   r   rA   )r*   r   r   r   r   r   r+   rN   )r,   rX   rG   r   s       r    test_from_matrix_calculationr   j  s    DJJ~.2>M
**/.- C
 H((-557RH((C)CDLLNJJ}f5r"   c                     U R                  [        R                  " SSSS95      n[        [        R
                  " U5      R                  5       U5        g )NrS   rZ   r   )rr   random_state)r*   r   rvsr   r   r   r_   r,   r   s     r     test_matrix_calculation_pipeliner   y  s>    
**(,,QRaH
ICH((-7793?r"   c                    [         R                  " U 5      nXR                  :X  a  SOSn[        R                  R                  S5      nU R                  UR                  S5      US9nU R                  R                  U5      n[        UR                  S   5       H<  nXV   S:  d  M  [         R                  " U5      US4   R                  XFS4   * 5      nM>     [        R                  " U5      R!                  5       nU R#                  XpR%                  U5      5      nU R'                  S5      U R)                  S5      -   n	[+        XUS9  g )	Nro   ư>r   )r[   rS   rS   r%   .rS   rp   )r'   r(   float64r3   r]   r^   r*   random_samplelinalgdetrc   rd   atsetr   r   r_   matmulmatrix_transposer   r`   r   )
r,   r&   rX   rndr   detsri   	ortho_matmult_resulteye3ds
             r    test_from_matrix_ortho_outputr     s   b!EZZ'5TD
))


"C
**S&&{35*
AC99==D4::a=!7Q;&&+af%))3#v;,7C " $$S)335I))I':':9'EFKHH[!BFF1I-EKT2r"   c                 f   U R                  / SQ/ SQ/ SQ/5      nU R                  / SQ/ SQ/ SQ/5      n[        [        R                  " U5      R	                  5       USS9  U R                  / S	Q/ S
Q/ SQ/5      nU R                  / SQ/ SQ/ SQ/5      n[        [        R                  " U5      R	                  5       USS9  U R                  XR                  S5      /5      nU R                  X R                  S5      /5      n[        [        R                  " U5      R	                  5       USS9  g )Nr   r   r   r   r   )5_%?gx'?r   )gx'ܿr   r   )r   r   r   r   rp   )r         r   )r   r   r   )r   r   r   r   r   rS   )r*   r   r   r   r_   stackr`   )r,   r   expecteds      r    test_from_matrix_normalizer     s   
** C zz5557 8H H((-7798$O
** C zz<'') *H H((-7798$O ((C#
$Cxx66!9-.HH((-7798$Or"   c                 ~   [         R                  R                  S5      n[        R                  " U 5      nX R
                  :X  a  SOSn[        [        R                  " UR                  SS95      U 5      n[        R                  " UR                  5       SS9nU R                  UR                  XSS95      (       d   eg )	Nr   ro   r   )rZ   rA   rq   T)assume_validrp   )r3   r]   rt   r'   r(   r   r-   r   r)   rx   r   r_   rw   rv   )r,   rg   r&   rX   rotrot_no_norms         r    test_from_matrix_assume_validr     s    
))


"Cb!EZZ'5TD
++CJJGJ,DEr
JC&&s}}TJK66#"";":;;;;r"   c                 R   U R                  S5      n[        R                  " U5      S   R                  S5      n[	        U5      (       aJ  U R                  U R                  [        R                  " U5      R                  5       5      5      (       d   eO8[        R                  " [        SS9   [        R                  " U5        S S S 5        [        R                  " U5      S   R                  S5      n[	        U5      (       aJ  U R                  U R                  [        R                  " U5      R                  5       5      5      (       d   eg [        R                  " [        SS9   [        R                  " U5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)NrS   r   r   r   zNon-positive determinantr   rs   )r`   r'   r   r   r   rw   r   r   r   r_   r   r   r   r   s     r    )test_from_matrix_non_positive_determinantr     s"   
&&)C
&&+d



"CSvvbhhx33C8BBDEFFFF]]:-GH  % I &&+d



#CSvvbhhx33C8BBDEFFFF]]:-GH  % IH IH IHs   -F'F
F
F&c                     [         R                  R                  S5      n [        R                  " U S9n[        R                  " UR                  5       R                  5       5      nUR                  USS9(       d   e[        R                  " SU S9n[        R                  " UR                  5       R                  5       5      n[         R                  " UR                  USS95      (       d   eg Nrm   rn   ro   rp   rS   )	r3   r]   rt   r   r   r_   ru   rv   rw   rg   ry   r#   s      r    test_from_matrix_array_liker     s    
))


$CS)JZ113::<=A""15"111 ,JZ113::<=A66*))!%)89999r"   c                     U R                  / SQ/ SQ/ SQ/5      n[        R                  " U5      nUR                  5       R                  [        U 5      :X  d   eg )Nr   r   r   )r*   r   r   r+   r&   r   r,   r   r#   s      r    test_from_matrix_int_dtyper     sG    
**iI6
7CS!A99; 0 4444r"   c                    SnU R                  / SQ5      nU R                  USUS-
  -  S-   5      nU R                  / SQ5      nU R                  USUS-
  -  S-   5      n[        R                  " U5      n[	        UR                  5       XBS9  g )	NHz>r   rL   r   rS   )gJ?r   r   g<(?rM   rp   )r*   rN   r   from_rotvecr   r+   )r,   rI   rX   rotvecrG   results         r    test_from_nd_single_rotvecr    s     DZZ	"FZZq 1D 89FJJ;<MJJ}ddQh.?$.FGM!!&)FFNN$m?r"   c                     SnU R                  / SQ/ SQ/ SQ/5      nU R                  / SQ/ SQ/ SQ/5      n[        [        R                  " U5      R	                  5       X1S9  g )	Nr   r   r   r   r   rs   r   r   r   r   )g.pG?cU(G?r  gQH?)gNZ]O?gNZ]OݿgNZ]O?g0i?r0   rp   )r*   r   r   r   r+   )r,   rX   r   rG   s       r    test_from_generic_rotvecr    sa    DZZ F JJ45 
 M
 H((088:MUr"   c                 J   U R                  S[        R                  " S5      -  S[        R                  " S5      -  S[        R                  " S5      -  // SQ/ SQ/5      n[        R                  " U5      R                  5       n[        US   U R                  S5      S   5        [        US	S S24   US
   S-  5        [        US   U R                  S5      S   5        [        USS S24   U R                  / SQ5      5        [        US   U R                  / SQ5      5        g )NgMb@?rS   gMb@)皙?g333333?r   r  r   rS   r   r   r   r   r   r   rS   g@w?r   )g>}J?g.e?g>}J?r   r   )r*   r   r   r   r   r+   r   r
   )r,   r   r   s      r    test_from_rotvec_small_angler    s    ZZ			!	ediil2D499Q<4GH
 F '//1DDJ

3 34DBQBK#!56DJ

9 5b 9:DBQBKJJ % &' DL"**^"<=r"   c                     [         R                  R                  S5      n [        R                  " U S9n[        R                  " UR                  5       R                  5       5      nUR                  USS9(       d   e[        R                  " SU S9n[        R                  " UR                  5       R                  5       5      n[         R                  " UR                  USS95      (       d   eg r   )	r3   r]   rt   r   r   	as_rotvecru   rv   rw   r   s      r    test_from_rotvec_array_liker    s    
))


$CS)JZ113::<=A""15"111 ,JZ113::<=A66*))!%)89999r"   c                     U R                  / SQ5      n[        R                  " U5      nUR                  5       R                  [        U 5      :X  d   eg )Nr   )r*   r   r   r+   r&   r   )r,   r   r#   s      r    test_from_rotvec_int_dtyper     s@    ZZ	"FV$A99; 0 4444r"   c                    U R                  S/S-  5      n[        R                  " USS9nUR                  5       nU R                  US-  U R                  -  5      n[        R                  " U5      nUR                  5       n[        X65        g )Ngvô0?rS   Tdegrees   )r*   r   r   r+   pir   )r,   rotvec1rot1quat1rotvec2rot2quat2s          r    test_degrees_from_rotvecr  '  su    jj.)A-.G6DLLNE jj3./G(DLLNEE!r"   c                     [         R                  " [        SS9   [        R                  " U R                  SS/5      5        S S S 5        g ! , (       d  f       g = f)N Expected `rot_vec` to have shaper   r   r   )r   r   r   r   r   r*   r,   s    r    test_malformed_1d_from_rotvecr!  5  s9    	z)K	LRZZA/0 
M	L	Ls   (A
Ac                     SUS-
  -  S-   n[         R                  " [        SS9   [        R                  " U R                  U5      5        S S S 5        g ! , (       d  f       g = f)NrL   r   r   r  r   )r   r   r   r   r   onesr,   rI   rd   s      r    test_malformed_nd_from_rotvecr&  ;  sI     D1H$E	z)K	LRWWU^, 
M	L	L   &A
A"z
dask.arrayz&missing required linalg.cross function)reasonc           	         [         R                  " U 5      nXR                  :X  a  SOSnU R                  / SQ/ SQ/ SQ/5      nU[	        USSS9-  n[
        R                  " U5      R                  5       n[	        USS	9n[        US S 2S
4   U R                  US-  5      5        [        U R                  R                  XCS S 2S S
24   5      U R                  S5      US9  g )NrT   r   r   r   rs   r   r   rs   r   ga2U0*3?r0   rs   T)r   keepdimsr   rS   r   r   rp   )r'   r(   r   r*   r   r   r)   r  r   cosr   crossr   )r,   r&   rX   r   r   angles         r    test_as_generic_rotvecr0  C  s     b!EZZ'5TD:: D
 	N4b488D%//1F6+EDAJuqy 12BIIOOFBQBK8"((6:JQUVr"   rA   c                 Z   U R                  / SQ5      nU R                  USUS-
  -  S-   5      nU R                  / SQ5      nU R                  USUS-
  -  S-   5      n[        R                  " U5      R	                  5       n[        UR                  UR                  5        [        XC5        g )Nr   r   r   rL   r   rM   )gj*0	x?g$x?g:2(r   )r*   rN   r   r)   r  r   rd   r   )r,   rI   r   expected_rotvecactual_rotvecs        r    test_as_rotvec_single_nd_inputr6  W  s     ::m$D::dDD1H-45Djj!CDOjj$$(2Cd2JKO&&t,668M$$o&;&;<M3r"   c                    U R                  / SQ/ SQ/ SQ/5      n[        R                  " U5      nUR                  SS9n[	        USS9n[        X@R                  S5      S	   5        [        US
   US   5        [        US   US   5        g )Nr   r   r   Tr  rs   r   g      ^@r   r   r   r   )r*   r   r   r  r   r   )r,   r   r   r   r/  s        r    test_as_rotvec_degreesr8  d  s     **iI6
7C


s
#C]]4](F6+EE::e,R01F1Ivay)F1Ivay)r"   c                     U R                  / SQ/ SQ/ SQ/5      n[        [        R                  " U5      R	                  5       U5        [        [        R                  " USS9R	                  SS9U5        g )Nr  r   rs   r   )ga2U0*3gǺ6?ga2U0*?Tr  )r*   r   r   r   r  )r,   r   s     r    test_rotvec_calc_pipeliner;  p  si     ZZ
 F
 H((0::<fEH((>HHQUHVr"   c                    U R                  / SQ5      nU R                  USUS-
  -  S-   5      nU R                  / SQ5      nU R                  USUS-
  -  S-   5      n[        R                  " U5      n[	        UR                  5       USS9  [        UR                  [        [        U5      R                  S	5      5      5      (       d   eg )
N)r   r   r   rL   r   r   )r   r   r   r   rM   ro   rp   r   )r*   rN   r   from_mrpr   r+   
isinstance_quattyper   empty)r,   rI   mrprG   r   s        r    test_from_mrp_single_nd_inputrC  }  s     **[
!C
**S$$(+d2
3CJJ~.MJJ}ddQh.?$.FGMs#FFNN$m%@fllD)=)C)CA)F$GHHHHr"   c                     [         R                  R                  S5      n [        R                  " U S9n[        R                  " UR                  5       R                  5       5      nUR                  USS9(       d   e[        R                  " SU S9n[        R                  " UR                  5       R                  5       5      n[         R                  " UR                  USS95      (       d   eg r   )	r3   r]   rt   r   r=  as_mrpru   rv   rw   r   s      r    test_from_mrp_array_likerF    s    
))


$CS)J*++-4467A""15"111 ,J*++-4467A66*))!%)89999r"   c                     U R                  / SQ5      n[        R                  " U5      nUR                  5       R                  [        U 5      :X  d   eg )Nr   )r*   r   r=  r+   r&   r   )r,   rB  r#   s      r    test_from_mrp_int_dtyperH    s@    
**Y
C#A99; 0 4444r"   c                     U R                  / SQ/ SQ/ SQ/5      nU R                  / SQ/ SQ/ SQ/5      n[        [        R                  " U5      R	                  5       U5        g )Nr  r  r  )r	  r   r   g)g}+;?g}+;g}+;?gߨӉؿr0   )r*   r   r   r=  r+   )r,   rB  rG   s      r    test_from_generic_mrprJ    s\    
** C JJ:  M H%%c*224mDr"   c                     SUS-
  -  S-   n[         R                  " [        SS9   [        R                  " U R                  U5      5        S S S 5        g ! , (       d  f       g = f)NrL   r   r#  zExpected `mrp` to have shaper   )r   r   r   r   r=  r$  r%  s      r    test_malformed_nd_from_mrprL    sI     D1H$E	z)G	H"''%.) 
I	H	Hr'  c                     U R                  / SQ/ SQ/ SQ/5      nU[        USS9S S 2S 4   -  nU R                  / SQ/ SQ/ SQ/5      n[        [        R                  " U5      R                  5       U5        g )	Nr*  r+  r0   r   r   )gQUU?gvWUU?QUUտ)uFx?guFxrO  r  )r*   r   r   r   r)   rE  )r,   r   expected_mrps      r    test_as_generic_mrprQ    sv    :: D 	N4a(D11D::-- L H&&t,335|Dr"   c           	          U R                  [        R                  " U R                  S-  S-  5      * SS/5      n[	        [
        R                  " SU R                  / SQ5      SS9R                  5       U5        g )	Nr   rA   r   r   r   )i  r   r   Tr  )r*   r   tanr  r   r   r   rE  )r,   rP  s     r    test_past_180_degree_rotationrT    s`     ::Q 77a@ALE2::k#:DIPPRr"   c                 Z   U R                  / SQ5      nU R                  USUS-
  -  S-   5      nU R                  / SQ5      nU R                  USUS-
  -  S-   5      n[        R                  " U5      R	                  5       n[        UR                  UR                  5        [        XC5        g )Nr2  rL   r   rM   )g?g?gO޿r   )r*   rN   r   r)   rE  r   rd   r   )r,   rI   r   rP  
actual_mrps        r    test_as_mrp_single_nd_inputrW    s     ::m$D::dDD1H-45D::CDL::lDD1H,=,DEL##D)002J!!<#5#56J-r"   c                     U R                  / SQ/ SQ/ SQ/ SQ/5      nU R                  / SQ/ SQ/ SQ/ SQ/5      n[        [        R                  " U5      R	                  5       U5        g )Nr  r:  )gzpy?r   r   )皙?r	  rY  )gK}\UUſgK}\UU?rN  )r*   r   r   r=  rE  )r,   rV  rP  s      r    test_mrp_calc_pipelinerZ    sb    	 J
 ::.	 L
 H%%j188:LIr"   c                     [         R                  " SU R                  S5      SS9R                  5       nU R                  / SQ5      [        R
                  " S5      -  n[        X5        g )Nr   Z   Tr  r   r   r   r   r   )r   r   r*   r+   r   r   r   )r,   r   rG   s      r    test_from_euler_single_rotationr^    sJ    sBJJrNDAIIKDJJ~.1=MD(r"   c                 n   [         R                  " [        SS9   [        R                  " SU R                  SS/5      5        S S S 5        [         R                  " [        SS9   [        R                  " SU R                  S/5      5        S S S 5        g ! , (       d  f       NX= f! , (       d  f       g = f)Nz&Expected last dimension of `angles` tor   Xr   r\  XYZ)r   r   r   r   r   r*   r   s    r     test_from_euler_input_validationrb    s     
z)Q	RCQG!45 
S 
z)Q	RE2::rd#34 
S	R 
S	R 
S	Rs   )B$(B&
B#&
B4c                 D   U R                  U R                  / SQ5      SUS-
  -  S-   5      n[        R                  " SUSS9R	                  5       nU R                  / SQ5      [
        R                  " S	5      -  nU R                  USUS-
  -  S
-   5      n[        X45        g )N)r   r   r\  rL   r   r   r   Tr  r]  r   rM   )rN   r*   r   r   r+   r   r   r   )r,   rI   anglesr   rG   s        r    test_from_euler_nd_rotationre    s     ZZ

:.q0AD0HIFufd;CCEDJJ~.1=MJJ}ddQh.?$.FGMD(r"   c                     [         R                  " SU R                  S5      SS9R                  5       n[         R                  " SU R                  S5      SS9R                  5       n[	        X5        g )Nr   r\  Tr  Zr   r   r*   r_   r   )r,   	extrinsic	intrinsics      r    (test_single_intrinsic_extrinsic_rotationrk    sT    ##CBFPPRI##CBFPPRII)r"   c                 H   [         R                  R                  S5      nU R                  UR	                  SSSS95      nU R                  USS9n[        R                  " SUSS	9R                  5       n[        R                  " S
USS	9R                  5       n[        XE5        g )Nr   r  rJ   rS   lowhighrr   rs   r   r   Tr  ZYX)
r3   r]   r^   r*   randintflipr   r   r+   r   )r,   r   abr   r   s         r    test_from_euler_rotation_orderrv    s     ))


"C


3;;13V;<=A
AE1d3;;=AE1d3;;=AAr"   c                     Sn[         R                  " SU R                  SS/5      SS9R                  5       nU R                  / SQ/ SQ/ SQ/5      n[	        X#US	9  g )
Nro   zxr\  Tr  r   r   r   rs   r   rp   rh  )r,   rX   r   r   s       r    -test_from_euler_elementary_extrinsic_rotationrz    sY    D


dBJJBx$8$
G
Q
Q
SC:: L
 CD1r"   c           	      h   SnU R                  / SQ/ SQ/ SQ/5      n[        R                  " SUSS9R                  5       n[	        US   U R                  / S	Q/ S
Q/ SQ/5      US9  [	        US   U R                  / SQ/ SQ/ SQ/5      US9  [	        US   U R                  / SQ/ SQ/ SQ/5      US9  g )Nr      <   -   r}  r~  r}  r  r}  r~  ZXYTr  r   )g# ?      пgΙ6d?)g$+H?+Pz?Ppƿ)gPpֿ+Pz?gPp?rp   r   )g+a?r  (s=?)r  r  g&(ٿ)r  r  r  r   )ga}@?gF6g^@?)g0	8?gF6?g4?)      r   r  r*   r   r   r_   r   )r,   rX   rd  r   s       r    &test_from_euler_intrinsic_rotation_312r  #  s    DZZ
 F
 

eVT
:
D
D
FCCK***- " 	 CK***- " 	 CK*)*- " 	r"   c           	      j   U R                  / SQ/ SQ/ SQ/5      n[        R                  " SUSS9R                  5       n[	        US   U R                  / SQ/ S	Q/ S
Q/5      5        [	        US   U R                  / SQ/ SQ/ SQ/5      5        [	        US   U R                  / SQ/ SQ/ SQ/5      5        g )Nr|  r  r  ZXZTr  r   )>d?g @r  )l>?^|@r  )X?r  r   r   g      ?g ,r  g ,?g      ?r  r        ?r   r   )r  g4&d'e?)cH?Xӿg'eֿ)r        ?r  r  r,   rd  r   s      r    &test_from_euler_intrinsic_rotation_313r  @  s    ZZ
 F
 

eVT
:
D
D
FCCK,,*- "  CK+*'- "  CK-.*- " r"   c           	      j   U R                  / SQ/ SQ/ SQ/5      n[        R                  " SUSS9R                  5       n[	        US   U R                  / SQ/ S	Q/ S
Q/5      5        [	        US   U R                  / SQ/ S	Q/ SQ/5      5        [	        US   U R                  / SQ/ SQ/ SQ/5      5        g )Nr|  r  r  zxyTr  r   )4&d?gPp?r  )r  r  g+Pz)r  r  r  r   )g
?\2׳r  )r  g ,?r  r   )r  r  r  )r  r  r   )g>dۿ @?r  r  r  s      r    &test_from_euler_extrinsic_rotation_312r  \  s    ZZ
 F
 

eVT
:
D
D
FCCK++-- "  CK+++- "  CK,,,- " r"   c           	      j   U R                  / SQ/ SQ/ SQ/5      n[        R                  " SUSS9R                  5       n[	        US   U R                  / SQ/ S	Q/ S
Q/5      5        [	        US   U R                  / SQ/ SQ/ S
Q/5      5        [	        US   U R                  / SQ/ SQ/ SQ/5      5        g )Nr|  r  r  zxzTr  r   )r  gl>r  )r  r  gXr  r   r  r  r   )r  gcHr  )r  r  r  )r  r  r  r  r  s      r    &test_from_euler_extrinsic_rotation_313r  x  s    ZZ
 F
 

eVT
:
D
D
FCCK-.)- "  CK,+)- "  CK,,+- " r"   c                     [         R                  R                  S5      n Sn[        R                  " U S9n[        R                  " XR                  U5      R                  5       5      nUR                  USS9(       d   e[        R                  " SU S9n[        R                  " XR                  U5      R                  5       5      n[         R                  " UR                  USS95      (       d   eg )Nrm   r   rn   ro   rp   rS   )	r3   r]   rt   r   r   as_eulerru   rv   rw   )rg   orderry   r#   s       r    test_from_euler_array_liker    s    
))


$CES)JE#6#6u#=#D#D#FGA""15"111 ,JE#6#6u#=#D#D#FGA66*))!%)89999r"   c                      [         R                  R                  S5      n U R                  SSS9n[        R
                  " SUSS9n[        R
                  " S[        U5      SS9nUR                  USS	9(       d   eg )
Nrm   Lr  )ro  rp  r   Tr  ro   rp   )r3   r]   rt   uniformr   r   floatrv   )rg   degry   r#   s       r    test_from_euler_scalarr    sm    
))


$C
++$S+
)C$$S#t<JCsT:A""15"111r"   	seq_tupler   rj  )FTc                   ^  U 4S jn[         R                  R                  S5      nSn[         R                  " US45      nUR	                  [         R
                  * [         R
                  U4S9US S 2S4'   UR	                  [         R
                  * S-  [         R
                  S-  U4S9US S 2S4'   UR	                  [         R
                  * [         R
                  U4S9US S 2S4'   T R                  U5      nSR                  U5      nU(       a  UR                  5       n[        R                  " Xv5      nUR                  U5      n	[        XiSS	S
9  U" X-
  SS5        g )Nc                    > TR                  U SS9nTR                  U SS9nTR                  X45      nTR                  TR	                  U5      U:  5      (       d   eTR                  XR:  5      (       d   eg Nr   r   meanstdhypotrw   r   errormean_maxrms_maxr  r  rmsr,   s         r    
test_stats1test_as_euler_asymmetric_axes.<locals>.test_stats  n    wwu1w%ffUf#hht!vvbffTlX-....vvcm$$$$r"   r     rS   rn  r   r    ro   rX   rW   rT   +=r3   r]   r^   rA  r  r  r*   joinupperr   r   r  r   
r,   r  rj  r  r   nrd  seqrotationangles_quats
   `         r    test_as_euler_asymmetric_axesr    s   
% ))


"CAXXq!fF;;BEE6QD;AF1a4L;;BEE6A:BEEAIQD;IF1a4L;;BEE6QD;AF1a4LZZF
'')
C iik""3/H##C(KFae<{#UE2r"   c                   ^  U 4S jn[         R                  R                  S5      nSn[         R                  " US45      nUR	                  [         R
                  * [         R
                  U4S9US S 2S4'   UR	                  S[         R
                  U4S9US S 2S4'   UR	                  [         R
                  * [         R
                  U4S9US S 2S4'   T R                  U5      nSR                  US   US   US   /5      nU(       a  UR                  5       n[        R                  " Xv5      nUR                  U5      n	[        XiSS	S
9  U" X-
  SS5        g )Nc                    > TR                  U SS9nTR                  U SS9nTR                  X45      nTR                  TR	                  U5      U:  5      (       d   eTR                  XR:  5      (       d   eg r  r  r  s         r    r  0test_as_euler_symmetric_axes.<locals>.test_stats  r  r"   r   r  rS   rn  r   r   r  gU>=r  rU   r  r  r  s
   `         r    test_as_euler_symmetric_axesr    s!   
% ))


"CAXXq!fF;;BEE6QD;AF1a4L;;1255t;<F1a4L;;BEE6QD;AF1a4LZZF ''9Q<1y|<
=Ciik""3/H##C(KFag>{#UE2r"   c              #     #    U (       a  [        [        SUS9   S v   S S S 5        g [        R                  " 5          [        R                  " S5        S v   S S S 5        g ! , (       d  f       g = f! , (       d  f       g = f7f)NzGimbal lock)r   r,   r  )r   UserWarningwarningscatch_warningssimplefilter)should_warnr,   s     r    maybe_warn_gimbal_lockr    s[      MbA BA $$&!!'* '&	 BA '&s2   BA BA1	B 
A.*B1
A?;Bsuppress_warningsc                    [         R                  " U 5      nX@R                  :X  a  SOSnU R                  / SQ/ SQ/ SQ/ SQ/5      nSR	                  U5      nU(       a  UR                  5       n[        R                  " XvSS	9nUR                  5       n	[        U(       + U 5         UR                  USUS
9n
S S S 5        [        R                  " UW
SS	9R                  5       n[        XUS9  g ! , (       d  f       N== f)Nro   r   )r  r\  #   )r     )r  r\     )r  r     r  Tr  r  r  rp   r'   r(   r   r*   r  r  r   r   r_   r  r  r   r,   r  rj  r  r&   rX   rd  r  r  mat_expectedangle_estimatesmat_estimateds               r    (test_as_euler_degenerate_asymmetric_axesr    s     b!EZZ'5TD ZZ	 F '')
C iik""3=H%%'L	$5 5r	:"++1B , 
 
; ''_dKUUWMLd; 
;	:s   %C..
C<c                    [         R                  " U 5      nX@R                  :X  a  SOSnU R                  / SQ/ SQ/ SQ/ SQ/5      nSR	                  US   US	   US   /5      nU(       a  UR                  5       n[        R                  " XvS
S9nUR                  5       n	[        U(       + U 5         UR                  US
US9n
S S S 5        [        R                  " UW
S
S9R                  5       n[        XUS9  g ! , (       d  f       N== f)Nro   r   )r  r   r~  )r  r   K   )r~  r  r  )r  r  r  r  r   r   Tr  r  rp   r  r  s               r    'test_as_euler_degenerate_symmetric_axesr    s     b!EZZ'5TD ZZ	 F ''9Q<1y|<
=C iik""3=H%%'L	$5 5r	:"++1B , 
 
; ''_dKUUWMLd; 
;	:s   1C::
Dc                 &   U R                  / SQ/ SQ/ SQ/5      nU R                  USUS-
  -  S-   5      n[        R                  " U5      R	                  SSS	9nU R                  / S
Q5      nU R                  USUS-
  -  S-   5      n[        X4SS9  g )Nr   r   r   rL   r   r   r   Tr  )r   r   g     V@r   ro   rp   )r*   rN   r   r   r  r   )r,   rI   r   rd  expected_angless        r    test_as_euler_nd_rotationr  :  s     ** C
 **S$$(+f4
5C!!#&//t/DFjj.Ojj$$(2Cd2JKOF%8r"   c                    [         R                  " U 5      nXR                  :X  a  SOSn[        R                  R                  S5      nSn[        R                  " XCS9n[        XP5      nUR                  5       nUR                  5       R                  5       nXg-  nXv-  n	U R                  USS45      n
[         R                  " U
5      SS S2S S24   R                  U R                  S5      5      n
[        XUS9  [        XUS9  S	nXR                  :X  a  SOS
nU R                  UR!                  US-   S9US9n[        R"                  " U5      nUR                  5       nUR                  5       R                  5       nXg-  nXv-  n	U R                  US-   5      n[         R                  " U5      SS S2S S24   R                  U R                  S5      5      n[        XUS9  [        XUS9  g )Nro   r   r   rZ   )numr   rS   .rp   )rZ   rS      r   rM   rq   r%   r   )r'   r(   r   r3   r]   r^   r   r-   r_   r   rA  r   r   r`   r   r*   rx   r)   )r,   r&   rX   r   r  pp_matq_matresult1result2r   batch_shaper   r#   eye_nds                  r    test_invr  I  s   b!EZZ'5TD
))


"C
AA0AqAKKMEEEGEmGmGHHaAYEFF5M#rr2A2+&**266!95EG.G. KZZ'5TD::cjjkD&8j9:GD4 AKKMEEEGEmGmGXXkF*+FVVF^C!RaRK(,,RVVAY7FG$/G$/r"   c                    [         R                  " U 5      nXR                  :X  a  SOSn[        R                  R                  S5      n[        [        R                  " US9U 5      nUR                  5       nUR                  5       nUR                  5       nU R                  Xg5      nU R                  Xv5      n	U R                  S5      n
[        XUS9  [        XUS9  [        [        R                  " SUS9U 5      nUR                  5       nUR                  5       nUR                  5       nU R                  R                  X5      nU R                  R                  X5      nU R                  S	5      n[         R                  " U5      S
S S2S S24   R!                  U R                  S5      5      n[        UUUS9  [        UUUS9  g )Nro   r   	   #;h29s+,g0Hn rn   rS   rp   r   )r  rg   r   .)r'   r(   r   r3   r]   rt   r-   r   r   r_   r   r`   r   r   rA  r   r   )r,   r&   rX   rg   r  rh   r  r  res1res2r`   r   r   x_matrixy_matrixr  r  r   s                     r    test_inv_single_rotationr  m  sc   b!EZZ'5TD
))

 G
HCx3/4A	AKKMEKKME99U"D99U"D
&&)CDD)DD)x1#6;A	A{{}H{{}Hiix2Giix2GHHYEFF5M#rr2A2+&**266!95EGU.GU.r"   c                     Sn[        [        R                  " U5      U 5      nU R                  U5      n[	        UR                  5       U5        [	        UR                  5       R                  5       U5        g )NrZ   )r-   r   identityr   r   	magnituder   )r,   r  r#   r   s       r    test_identity_magnituder    sT    
Ax((+R0Axx{HAKKM8,AEEG%%'2r"   c                     [        [        R                  " 5       U 5      nUR                  5       S:X  d   eUR	                  5       R                  5       S:X  d   eg )Nr   )r-   r   r  r  r   r|   s     r    test_single_identity_magnituder    sH    x((*B/A;;=A557!###r"   c                    [         R                  " U 5      nXR                  :X  a  SOSnSn[        [        R
                  " USS9U 5      n[        [        R                  " U5      U 5      nXE-  n[        UR                  5       UR                  5       5        XdR                  5       -  n[        UR                  5       U R                  U5      US9  g Nro   r   rZ   r   rn   rp   r'   r(   r   r-   r   r]   r  r   r+   r   r  r   r,   r&   rX   r  r  rh   r   s          r    test_identity_invariancer    s    b!EZZ'5TD
Axqa0"5Ax((+R0AUFAIIK!12eegFF$$&$?r"   c                    [         R                  " U 5      nXR                  :X  a  SOSnSn[        [        R
                  " USS9U 5      n[        [        R                  " 5       U 5      nXE-  n[        UR                  5       UR                  5       5        XdR                  5       -  n[        UR                  5       U R                  U5      US9  g r  r  r  s          r    test_single_identity_invariancer    s    b!EZZ'5TD
Axqa0"5Ax((*B/AUFAIIK!12eegFF$$&$?r"   c                     [         R                  " SS9n U R                  5       R                  S:X  d   e[         R                  " SS9n U R                  5       R                  S:X  d   e[         R                  " SS9n U R                  5       R                  S:X  d   e[         R                  " SS9n [	        U R                  5       R                  S	S
5      [        R                  " [        R                  " S
5      S	   S5      5        [        R                  " [        SS9   [         R                  " SS9  S S S 5        [        R                  " [        SS9   [         R                  " SSS9  S S S 5        [        R                  " [        SS9   [         R                  " SS5        S S S 5        g ! , (       d  f       N= f! , (       d  f       NY= f! , (       d  f       g = f)Nr   )rd   rM   rB   rB   rA   r   rS   r   rS   rA   r   r   rS   rs   rA   )rC   r   )`shape` must be an int or a tuple of intsr         @#Only one of `num` or `shape` can berS   r   r   )r  rd   z&takes from 0 to 1 positional arguments)r   r  r+   rd   r
   rN   r3   ra   r`   r   r   r   	TypeErrorr8   s    r    test_identity_shaper    sL   #A99;$$$"A99;&&&'A99;	)))	*AAIIK''A.q	"~0VW	z)T	U$ 
V	z)N	Oav. 
P	y(P	Q!Q 
R	Q	 
V	U	O	O	Q	Qs$    F.F?G.
F<?
G
Gc                    SUS-
  -  S-   nU R                  U R                  S5      US-   5      n[        R                  " U5      nUR	                  5       nU R                  U R                  U R                  U R                  S/5      nU R                  Xb5      n[        XV5        [        R                  " U* 5      nUR	                  5       n[        XV5        g )NrL   r   rM   rA   r   )rN   r`   r   r)   r  r*   r  r   )r,   rI   
quat_shaper   r#   r   expected_results          r    test_magnituder    s     "T)J::bffQid!23D4 A[[]Fjj"%%q!9:Ojj=OF,D5!A[[]FF,r"   c                 "   [         R                  " U R                  S5      5      nUS   R                  5       n[	        X R                  U R                  5      S   5        US   R                  5       n[	        X0R                  S5      S   5        g )NrA   r   r   rS   r   )r   r)   r`   r  r   r*   r  )r,   r#   r  r  s       r    test_magnitude_single_rotationr    si    266!9%AdnnGGZZ.r23dnnGGZZ_R01r"   c                    [         R                  R                  S5      n[        R                  " SUS9n[        R                  " SUS9nX#R	                  5       -  R                  5       n[        X 5      n[        X05      nU R                  [         R                  " U5      5      n[        UR                  X55      U R                  U5      U:  5        g )Nr  rZ   rn   )r3   r]   rt   r   r   r  r-   r*   medianr
   rv   )r,   rg   r  rh   r_magrX   s         r    test_approx_equalr    s    
))

 G
HC$A$A[##%EqAqA::bii&'DANN1+bjj.?$.FHr"   c                    [         R                  " U R                  / SQ5      5      n[         R                  " U R	                  S5      5      nUR                  US   5      (       d   eUR                  US   5      (       a   eUR                  US   SS9(       a   eUR                  US   SSS	9(       a   e[        R                  " [        S
S9   UR                  US   SS9(       d   e S S S 5        g ! , (       d  f       g = f)N)r   r   g&.>rA   rS   r   绽|=rp   r   T)rX   r  zatol must be setr   r  )	r   r   r*   r)   r`   rv   r   warnsr  r,   r  rh   s      r    !test_approx_equal_single_rotationr"    s     	RZZ56A266!9%A>>!A$~~ad#### ~~ad~///~~adt~<<<	k);	<~~adD~111 
=	<	<s   C66
Dc                    Sn[         R                  R                  S5      n[        R                  " UR                  US-   S95      n[        R                  " UR                  US-   S95      nX4R                  5       -  R                  5       n[        X05      n[        X@5      nUR                  U:X  d   eU R                  [         R                  " U5      5      n[        UR                  XF5      U R                  U5      U:  5        [        R                  " UR                  US-   S95      n[        R                  " UR                  SS95      nX4R                  5       -  R                  5       n[        X05      n[        X@5      nUR                  U:X  d   eU R                  [         R                  " U5      5      n[        UR                  XF5      U R                  U5      U:  5        [        R                  " UR                  US-   S95      n[        R                  " UR                  SS95      nX4R                  5       -  R                  5       n[        X05      n[        X@5      nUR                  U:X  d   eU R                  [         R                  " U5      5      n[        UR                  XF5      U R                  U5      U:  5        g )N)r   rZ   rS   r   rM   rq   )r   rZ   r   rA   r   rS   rA   )r3   r]   rt   r   r)   rx   r   r  r-   rd   r*   r  r
   rv   )r,   r  rg   r  rh   r  rX   s          r    test_approx_equal_batchedr%    s3    K
))


"C3::;+=:>?A3::;+=:>?A[##%EqAqA;;+%%%::bii&'DANN1+bjj.?$.FH 	3::;+=:>?A3::=:9:A[##%EqAqA;;+%%%::bii&'DANN1+bjj.?$.FH 	3::;+=:>?A3::9:56A[##%EqAqA;;+%%%::bii&'DANN1+bjj.?$.FHr"   c                 <   [         R                  " U R                  S5      5      n[         R                  " U R                  S5      5      n[        R                  " [
        SS9   UR                  U5        S S S 5        [         R                  " U R                  S5      5      n[         R                  " U R                  S5      5      n[        R                  " [
        SS9   UR                  U5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nr  rS   r   rA   zbroadcastable shapesr   r   rA   rS   rA   )r   r)   r$  r   r   r   rv   r!  s      r    *test_approx_equal_batched_input_validationr*  '  s    2779-.A2779-.A	z)?	@	q 
A 	2776?+A2776?+A	z)?	@	q 
A	@ 
A	@
 
A	@s   $C<!D<
D

Dc                    U R                  U R                  S5      * U R                  S5      45      nU R                  USUS-
  -  S-   5      nU R                  SU R                  S-  S5      nU R                  S5      S	   n[        U 5      U R                  L a  S
OSnU HS  n[        R                  " Xb-  5      R                  5       nUR                  S	:X  d   e[        UR                  5       XES9  MU     g )NrS   rL   r   rm  r   r   r[   r   r   r   r  rp   )concatr`   rN   linspacer  r*   r   r<   r   r   r  rd   r   r  )r,   rI   axesthetasdesiredrX   tr_means           r    	test_meanr3  4  s     99rvvayj"&&),-D::dDD1H-67D[[BEEAIs+Fjjob!G#B'2::545D%%ah/446||r!!!((*G? r"   rB   c                    U R                  U R                  U R                  S5      * U R                  S5      45      SUS-
  -  S-   5      nU R                  S-  n[        R
                  " X2-  5      nU R                  UR                  S S S5      nUS:X  a  US   n[        U 5      U R                  L a  S	OS
n[        UR                  SS9R                  5       XVS9  U R                  UR                  SS S5      nUS:  a  US   n[        UR                  SS9R                  5       XVS9  UR                  SS9n[        UR                  SS9UR                  SS9US9  g )NrS   r   r   r   r   rA   r   r   r   r   r  rs   r   rp   )r   rs   Tr   )ra   r,  r`   r  r   r   fullrd   r   r<   r   r  r  r+   )r,   rI   r.  thetar#   r0  rX   r2  s           r    test_mean_axisr8  B  sB    77299rvvayj"&&)45ttax7H67QRDEEAIEU\*A ggdjj"os+Gqy"+#B'2::545DAFFFO--/D ggdjj2&,Gax"+AFFF(224gI VVV_FFNNTN2AIII4Mr"   c           	         [         R                  " U 5      U R                  :X  a  SOSn[        R                  R                  S5      nU R                  UR                  SS9[         R                  " U 5      S9n[        R                  " U5      nUR                  SS9n[        UR                  S   5       H  n[        UR                  S	   5       Hp  n[        R                  " US S 2XgS
4   5      R                  5       n[        XV   U   UR                  5       -  R                  5       U R                  S5      S   US9  Mr     M     UR                  SS9n	[        UR                  S   5       Hi  n[        R                  " X6S
4   5      R                  5       n[        X   UR                  5       -  R                  5       U R                  S5      S   US9  Mk     g )Nr  r   r   )rA   rB   rJ   rA   rq   r%   r   r   r   .r   r   rp   r   r   )r'   r(   r   r3   r]   rt   r*   rx   r   r)   r  rc   rd   r   r   r  )
r,   rX   rg   rh   r#   mean_0ri   j
mean_slicemean_1_2s
             r    test_mean_compare_axisr?  \  s    %%b)RZZ75TD
))


"C


3::<:08I8I"8M
NA1AVVV^F1771:qwwqz"A!++AaslO<AACJVYq\JNN,<<GGIJJsOB/d< # 
 vv6v"H1771:''S&	2779
z~~'77BBD

3+$	8 r"   c           	      b   U R                  SU R                  S-  S5      nU4US-
  -  nU R                  / SQ/ SQ/ SQ/5      nU R                  SS/5      nU R                  XCS-   5      nU R                  XSS-   5      nU R                  S	5      S
   nU H  n[        R
                  " XtSS S2S S 24   -  5      nUR                  US9n	[        R
                  " Xt-  5      n
U
R                  5       nUR                  S
:X  d   e[        XR                  5       -  R                  5       USS9  M     g )Nr   r   r[   r   )r   r   r   r   r5  rL   r   r   .weightsr   rp   )r-  r  r*   ra   r   r   r  rd   r   r   r  )r,   rI   r/  r  r.  rB  r   r1  rwmwr#   ms               r    test_weighted_meanrF  r  s   
 [[BEEAIs+F 'TAX&K::{Iy9:Djj!Q G774v-.DgggT12Gzz#r"H!!!3A:&6"67WWWW%  *FFHww"}}VVX002H4H r"   c                    [         R                  " U R                  S5      5      n[        UR	                  5       5      (       aQ  UR                  U R                  S5      * S9nU R                  U R                  UR                  5      5      (       d   eOA[        R                  " [        SS9   UR                  U R                  S5      * S9  S S S 5        [         R                  " U R                  S5      5      n[        R                  " [        SS9   UR                  U R                  S5      S9  S S S 5        [         R                  " U R                  S5      5      n[        R                  " [        SS9   UR                  U R                  S	5      S9  S S S 5        [        R                  " [        S
S9   UR                  SS9  S S S 5        [        R                  " [        S
S9   UR                  SS9  S S S 5        [        R                  " [        SS9   UR                  SS9  S S S 5        [        R                  " [        S
S9   UR                  SS9  S S S 5        g ! , (       d  f       GN= f! , (       d  f       GNK= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       g = f)NrA   rA  znon-negativer   r)  zExpected `weights` tor#  r  r  zaxis .* is out of boundsrS   r   )rs   r   z+`axis` must be None, int, or tuple of ints.0i)r   r)   r`   r   r+   r  r$  rw   r   r?  r   r   r   )r,   r#   rE  s      r    test_mean_input_validationrI    s   266!9%AQYY[!!FFBGGAJ;F'vvbhhqww'((((]]:^<FFBGGAJ;F' = 	2776?+A	z)@	A	rwwt}% 
B2779-.A	z)@	A	rwwv' 
B 
z)D	E	A 
F	z)D	E	G 
F	z)V	W	C 
X	z)D	E	C 
F	E% =<
 
B	A 
B	A 
F	E	E	E	W	W	E	EsT   . I%I79J	9J*J+J<K%
I47
J	
J
J(+
J9<
K

Kc                     [         R                  " U R                  / SQ5      5      nUR                  SS9n[	        U[         5      (       d   eg )Nr   r   r   r   Freturn_indices)r   r)   r*   reducer>  )r,   r#   r   s      r    test_reduction_no_indicesrO    s?    2::&:;<AXXUX+Ffh''''r"   c                     [         R                  " U R                  / SQ5      5      nUR                  SS9n[	        U5      [
        L d   e[        U5      S:X  d   eUu  p4nUb   eUb   eg )NrK  TrL  rS   )r   r)   r*   rN  r@  tuplelen)r,   r#   r   reduced	left_best
right_bests         r    test_reduction_none_indicesrV    sr    2::&:;<AXXTX*F<5   v;!%+"G
r"   c                 (   [         R                  " U 5      nXR                  :X  a  SOSn[        R                  R                  S5      n[        R                  " SUS9n[        R                  " SUS9n[        R                  " SUS9n[        X@5      n[        XP5      n[        X`5      n	U	R                  XxSS	9u  pn[        R                  " [        U5      [        U5      [        U5      45      n[        U5       Ha  u  p[        U5       HM  u  nn[        U5       H8  u  nn[        R                  " UU-  U-  R                  5       S
   5      XUU4'   M:     MO     Mc     [        R                  " [        R                  " USS5      UR                   S   S45      n[        R"                  " [        R                  " U[        U	5      S45      SS9nU R%                  U[        U5      -  5      nU R%                  U[        U5      -  5      nU R'                  UU:H  5      (       d   eU R'                  UU:H  5      (       d   eUU   U	-  UU   -  nU
R)                  5       U-  R+                  5       n[-        UU R                  [        U	5      5      US9  g )Nro   r   r  rB   rn   rZ   r  TrL  rS   r   r   rs   r   rp   )r'   r(   r   r3   r]   rt   r   r-   rN  r   rR  	enumerater   r+   rN   moveaxisrd   argmaxr*   rw   r   r  r   )r,   r&   rX   rg   l_npr_npp_nplr#   r  rS  rT  rU  scalarsri   lir<  pjkrkmax_indleft_best_checkright_best_checkreduced_checkmags                            r    !test_reduction_scalar_calculationri    s    b!EZZ'5TD
))

 G
HC??1#&D??23'D??1#&Dt At At A%&XXa4X%H"G
 hhD	3t9c$i89G4t_EAr"42#%6627R<*@*@*B1*E#F1a  ) % ! jjWa3gmmA6F5KLGii

7SVRL9BGjjCF!23Ozz'CF"2366).////66* 001111o&*Q/?-@@M;;==(
3
3
5CC#a&)5r"   c                 L   [         R                  " U 5      nU R                  / SQ/ SQ/ SQ/5      n[        R                  " U5      n[        R                  " U R                  USS95      nU R                  / SQUS9nU R                  USS9nU R                  / SQUS9nU R                  USS9n[        UR                  U5      U5        [        UR                  U5      U5        [        UR                  U5      U5        [        UR                  U5      U5        U R                  / S	QUS9n	U R                  U	SS9n
[        UR                  US
S9U	5        [        UR                  US
S9U
5        [        UR                  US
S9U
5        [        UR                  US
S9U
5        g )Nr   rs   r   r   r   r   r   )r   r   rS   r%   g       r   rS   g       @rs   rS   Tinverse)r'   r(   r*   r   r   expand_dimsr   apply)r,   r&   r   r_1dr_2dv_1dv_2dv1d_rotatedv2d_rotatedv1d_inversev2d_inverses              r    'test_apply_single_rotation_single_pointrz    sq   b!E
** C
 $Ds ;<D::k:/D>>$Q>'D**\*7K..1.5KDJJt$k2DJJt$k2DJJt$k2DJJt$k2**\*7K..1.5KDJJtTJ2K@DJJtTJ2K@DJJtTJ2K@DJJtTJ2K@r"   c                    [         R                  " U 5      nU R                  / SQ/ SQ/ SQ/5      n[        R                  " U5      n[        R                  " U R                  USS95      n[        R                  R                  S5      nU4US-
  -  nU R                  UR                  US-   S9US	9nU R                  US
   * US   US   /SS9n	[        UR                  U5      U	5        [        UR                  U5      U	5        U R                  US
   US   * US   /SS9n
[        UR                  USS9U
5        [        UR                  USS9U
5        g )Nrk  r   r   r   r   r   r  rq   r%   .r   .r   ).r   rs   Trn  )r'   r(   r*   r   r   rp  r3   r]   rt   rx   r   r   rq  )r,   rI   r&   r   r1r2rg   r  v	v_rotated	v_inverses              r    *test_apply_single_rotation_multiple_pointsr    sE    b!E
** C
 
		c	"B			bnnSqn9	:B
))


"C'TAX&K


3::;#7:8
FA1V9*ai6;"EIBHHQK+BHHQK+!F)aiZ6;"EIBHHQH-y9BHHQH-y9r"   c                 .   [         R                  " U 5      n[        R                  " S5      n[        R                  " / SQ/ SQ/ SQ/5      US'   [        R                  " / SQ/ SQ/ SQ/5      US'   U R                  X2S	9nU4US-
  -  nU R                  X4S
-   5      n[        R                  " U5      nU R                  / SQ5      nU R                  USS9nU R                  / SQ/ SQ/5      nU R                  XS-   5      n[        UR                  U5      U5        [        UR                  U5      U5        U R                  / SQ/ SQ/5      n	U R                  XS-   5      n	[        UR                  USS9U	5        [        UR                  USS9U	5        g )Nr   rS   rS   rk  r   r   r   ry  r   r   r%   r   r   r   r   r   rS   r   rl  )r   r3  r   r5  rm  )r   rS   r   Trn  )r'   r(   r3   rA  r4   r*   ra   r   r   rp  r   rq  )
r,   rI   r&   r   r  r#   v1v2r  r  s
             r    *test_apply_multiple_rotations_single_pointr    sg    b!E
((9
CXX CF
 XX CF
 **S*
&C'TAX&K
''#Y.
/CS!A	I	B		#B

L*56I	#78IAGGBK+AGGBK+

L*56I	#78IAGGBG-y9AGGBG-y9r"   c                    [         R                  " U 5      n[        R                  " S5      n[        R                  " / SQ/ SQ/ SQ/5      US'   [        R                  " / SQ/ SQ/ SQ/5      US'   U R                  X2S	9nU4US-
  -  nU R                  X4S
-   5      n[        R                  " U5      nU R                  / SQ/ SQ/US	9nU R                  / SQ/ SQ/US	9nU R                  XtS-   5      n[        UR                  U5      U5        U R                  / SQ/ SQ/US	9nU R                  XS-   5      n[        UR                  USS9U5        g )Nr  rk  r   r   r   ry  r   r   r%   r  r  rA   rB   rJ   rl  )rA   irB   r5  rm  )rA   rJ   Trn  )r'   r(   r3   rA  r4   r*   ra   r   r   r   rq  )	r,   rI   r&   r   r  r#   r  r  r  s	            r    -test_apply_multiple_rotations_multiple_pointsr  7  s=    b!E
((9
CXX CF
 XX CF
 **S*
&C'TAX&K
''#Y.
/CS!A


Iy)
7A

L*5U
CI	#78IAGGAJ	*

L*5U
CI	#78IAGGAtG,i8r"   c                    [         R                  R                  S5      n/ SQn/ SQn[        X25       H  u  pEU R	                  UR                  US-   S95      nU R	                  UR                  US-   S95      n[        R                  " U5      n[         R                  " XE5      S-   n	UR                  U5      n
U
R                  U	:X  d   eUR                  USS9n
U
R                  U	:X  a  M   e   g )	Nr   )r   rL   r#  r:  )rB   r   r   )r   rL   r#  r:  )rA   r   )r   rA   r   )rB   rA   r   )rJ   rB   rA   r   r   rq   rM   Trn  )r3   r]   rt   r   r*   rx   r   r)   broadcast_shapesrq  rd   )r,   rg   vector_shapes
rot_shapesq_shapev_shaper  rh   r#   rd   r   s              r    test_apply_shapesr  U  s    
))


"C7MUJ#J>JJszzw~z67JJszzw~z67q!##G5<GGAJww%GGAtG$ww% ?r"   c                     [         R                  R                  S5      n [        R                  " U S9nU R	                  SSSS9nUR                  UR                  5       5      nUR                  U5      n[        X4SS9  U R	                  SSS	S9nUR                  UR                  5       5      nUR                  U5      n[        X4SS9  g )
Nrm   rn   ir[   r   rq   ro   rp   r  )r3   r]   rt   r   r  rq  ru   r   )rg   r#   r1  r  
v_expecteds        r    test_apply_array_liker  g  s    
))


$CC AD#D)A	
AJA.D#F+A	
AJA.r"   c                 |   [         R                  " U R                  S5      5      n[        R                  " [
        SS9   UR                  U R                  S5      5        S S S 5        [        R                  " [
        SS9   UR                  U R                  S5      5        S S S 5        [         R                  " U R                  S5      5      n[        R                  " [
        SS9   UR                  U R                  S5      5        S S S 5        [         R                  " U R                  S	5      5      n[        R                  " [
        SS9   UR                  U R                  S
5      5        S S S 5        g ! , (       d  f       GN = f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       g = f)NrA   zExpected input of shaper   r   r  r(  Cannot broadcastr   )r   r  r   rA   r  )r   r)   r$  r   r   r   rq  r|   s     r    test_apply_input_validationr  v  s   2771:&A	z)B	C	
 
D	z)B	C	  
D2776?+A	z);	<	  
=277<01A	z);	<		"# 
=	< 
D	C	C	C 
=	< 
=	<s/   !E9!F(!F!F-9
F
F
F*-
F;c                    [         R                  R                  S5      nUR                  SU4US-
  -  -   S-   S9nU R	                  [
        R                  " U5      R                  5       5      n[
        R                  " U5      n[        US   R                  5       US   SS9  [        US   R                  5       US	   SS9  [        US S
 R                  5       U R                  US   SS9SS9  g )Nr   r#  r   rM   rq   r   rT   rp   r   rs   r   )r3   r]   rt   rx   r*   r   r)   r_   r   r   rp  )r,   rI   rg   r   r   r#   s         r    test_getitemr    s     ))


"C::5D7dQh#77$>:?D
**X''-779
:CS!AAaDNN$c&k>AaDNN$c&k>AcrF$$&s6{(KRWXr"   c                     [         R                  " [        SS9   [        R                  " U R                  / SQ5      5      S     S S S 5        g ! , (       d  f       g = f)Nnot subscriptabler   r0   r   )r   r   r  r   r)   r*   r   s    r    test_getitem_singler    s9    	y(;	<2::l34Q7 
=	<	<s   +A
Ac                     [         R                  " / SQ/ SQ/ SQ// SQ/ SQ/ SQ//5      n [        R                  " U 5      n[	        US/   R                  5       U S/   SS9  [	        USS	/   R                  5       U SS	/   SS9  g )
Nr   r   r   ry  r   r   rT   rp   r   )r3   r4   r   r   r   r_   )r   r#   s     r    test_getitem_array_liker    s    
((\   ! "C 	S!AAqcF$$&QCu=Aq!fI'')31v;UCr"   c                    [         R                  " U R                  / SQ5      5      n[        R                  " [
        SS9   [         R                  " U R                  / SQ5      5      US'   S S S 5        g ! , (       d  f       g = f)Nr0   r  r   r   )r   r)   r*   r   r   r  r|   s     r    test_setitem_singler    sS    2::l34A	y(;	<!!"**\":;! 
=	<	<s   +A55
Bc                 B   [         R                  R                  S5      n[        [        R                  " SUS9U 5      n[        [        R                  " SUS9U 5      nX2SS& [        USS R                  5       UR                  5       5        [        R                  " U R                  UR                  SS95      5      n[        R                  " U R                  UR                  S	S95      5      nX2SS
& [        USS
 R                  5       UR                  5       5        g )Nr  rZ   rn   rB   r   rJ   rS   rB   rA   rq   )r   rB   rA   rS   
r3   r]   rt   r-   r   r
   r+   r)   r*   rx   r,   rg   r~  r  s       r    test_setitem_slicer    s    
))

 G
HC	4b	9B	s3R	8BqGBqGOO%rzz|4 
		BJJszzyz'AB	CB			BJJszzyz'AB	CBqGBqGOO%rzz|4r"   c                 @   [         R                  R                  S5      n[        [        R                  " SUS9U 5      n[        [        R                  " US9U 5      nX2S'   [        US   R                  5       UR                  5       5        [        R                  " U R                  UR                  SS95      5      n[        R                  " U R                  UR                  SS95      5      nX2S'   [        US   R                  5       UR                  5       5        g )Nr  rZ   rn   r   r  rq   r
  r  r  s       r    test_setitem_integerr    s    
))

 G
HC	4b	9B	C0"	5BqEBqEMMORZZ\2 
		BJJszzyz'AB	CB			BJJszzvz'>?	@BqEBqEMMORZZ\2r"   c                     [        [        R                  " SSS9U 5      n[        R                  " [
        SS9   SUS'   S S S 5        g ! , (       d  f       g = f)NrZ   r   rn   zRotation objectr   r   )r-   r   r]   r   r   r  r|   s     r    test_setitem_wrong_typer    s=    xrq126A	y(9	:! 
;	:	:s   A
Ac                 `   [         R                  " S5      n[         R                  " / SQ/ SQ/ SQ/5      US'   [         R                  " / SQ/ SQ/ SQ/5      US'   U R                  U5      n[        R
                  " U5      n[        [        U5      S	5        [        [        US S
 5      S5        g )Nr  rk  r   r   r   ry  r   r   r   rs   )r3   rA  r4   r*   r   r   r   rR  r   s      r    test_n_rotationsr    s    
((9
CXX CF
 XX CF
 **S/CS!AQQsVa r"   c                  6   [         R                  R                  S5      n [        [        R                  " U S9R                  5       R                  S5        [        [        R                  " S U S9R                  5       R                  S5        [        [        R                  " SU S9R                  5       R                  S5        [        [        R                  " SU S9R                  5       R                  S5        [        [        R                  " U SS	9R                  5       R                  S5        [        [        R                  " U S
S	9R                  5       R                  S5        [        [        R                  " U SS	9R                  5       R                  S5        [         R                  R                  S5      [         R                  R                  S5      p![        R                  " SUS9n[        R                  " USS	9n[        UR                  5       UR                  5       R                  SS5      SS9  [        R                  " [        SS9   [        R                  " SU SS9  S S S 5        [        R                  " [        SS9   [        R                  " U SS	9  S S S 5        [        R                  " [        SS9   [        R                  " SU S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       NZ= f! , (       d  f       g = f)Nr   rn   rM   r   r   rB   r
  r   )rg   rd   r   r)  r  r  *   rJ   rA   ro   rp   r  r   rS   r  )r  rg   rd   r  r  z&takes from 0 to 2 positional arguments)r3   r]   rt   r   r   r+   rd   r   rN   r   r   r   r  )rg   rng1rng2r_numr_shapes        r    test_random_rotationr    s   
))


"CS)113994@3/779??F,446<<fE,446<<fES3;;=CCTJS5==?EEvNS7??AGGS&&r*BII,A,A",E$OOA4(Eoo$f5GEMMOW__%6%>%>q!%D5Q	z)N	OA#V4 
P	z)T	UCs+ 
V	y(P	Q3% 
R	Q	 
P	O	U	U	Q	Qs$   K(K9L
(
K69
L

Lc                 \   [         R                  " U 5      nXR                  :X  a  SOSnU R                  / SQ/ SQ/US9nU R                  USS9n[        R
                  " X45      u  pV[        UR                  5       U R                  S5      US	9  [        X`R                  S
5      S   SSS9  g )Nro   h㈵>r  r  r%   T)copyrS   rp   r   r   Fr   check_shaperX   )	r'   r(   r   r*   r   align_vectorsr   r_   r`   )r,   r&   rX   r   r   r#   rssds          r    test_align_vectors_no_rotationr    s    b!EZZ'5TD


Iy)
7A


14
 A$$Q*GAAKKM266!948D**S/"-5tLr"   c                    [         R                  " U 5      nXR                  :X  a  SOSn[        R                  R                  S5      n[        [        R                  " US9U 5      nU R                  UR                  SS9US9nUR                  U5      n[        R                  " Xe5      u  px[        UR                  5       UR                  5       5        [        XR                  S5      S	   S
US9  g )Nr   gMb`?l	   #t}":xL rn   rB   rS   rq   r%   r   r   Fr  )r'   r(   r   r3   r]   rt   r-   r   r*   rx   rq  r  r   r+   )	r,   r&   rX   rg   cru  rt  estr  s	            r    test_align_vectors_no_noiser  
  s    b!EJJ&4DD
))

 F
GCx3/4A


3::6:*%
8A	
A&&q,ICAIIK/D**S/"-5tLr"   c                 N   [         R                  " U 5      nXR                  :X  a  SOSnU R                  / SQ/ SQ/5      nU R                  / SQ/ SQ/5      n[        R
                  " X45      u  pV[        X5R                  U5      SS9  [        X`R                  S	5      S
   SUS9  g )Nr   gMbP?)gq?gH*fܿgHlB?)gMs^E?g+Obp޿gn^w)g=2)p?g[[VKg?gw7?)gѿgGvgpr   rp   r   r   Fr  )r'   r(   r   r*   r   r  r   rq  )r,   r&   rX   r   r   r  r  s          r    $test_align_vectors_improper_rotationr    s    b!EJJ&4DD


89; 	<A


8:< 	=A &&q,ICAyy|$/D**S/"-5tLr"   c                 $   U R                  S5      S   nU R                  / SQ/ SQ/ SQ/5      nSnU R                  / SQ/ SQ/ SQ/5      nU R                  / S	Q/ S
Q/ SQ/5      n[        R                  " XESS9u  pgn[        XqUS9  [        XUS9  g )NgbQ?r   )r	  r   r   )r         ?r   )r   r   r   r   r   r   r   r   r   )r   g?r   )r   r   r   Treturn_sensitivityrp   )r*   r   r  r   )	r,   rssd_expectedsens_expectedrX   rt  ru  r   r  senss	            r    #test_align_vectors_rssd_sensitivityr  '  s    JJ01"5MJJ . . 0 1M D


Iy)45A


I{K89A,,QdKOCtDd3Dd3r"   c                 6   SnU R                  [        R                  " USS9R                  / SQ5      5      nU R                  [        R                  " USS9R                  / SQ5      5      nSn[        R                  " X#U R                  U5      S5      u  pVn[        R                  " X#X@R                  U5      -  S5      u  pn
[        UR                  5       UR                  5       5        [        [        R                  " U5      U-  U	SS	9  [        Xz5        g )
NrZ   r   rn   r   r   r   Tr   rp   )
r*   r   r]   rq  r  r$  r   r_   r   r   )r,   r  rt  ru  scaleest1rssd1cov1est2rssd2cov2s              r    !test_align_vectors_scaled_weightsr  5  s    
A


8??1!,229=>A


8??1!,229=>AE ..qRWWQZFD ..qUWWQZ5GNDDNN$dnn&67DIIe$u,e$?Dr"   c           	      H   [         R                  " U 5      n[        R                  R	                  S5      nSn[        [        R                  " US9U 5      nU R                  UR                  US4S9US9nUR                  U5      n[        R                  " S5      nSU-  n[        R                  " U R                  UR                  US4US	9US95      n	U	R                  U5      n
[        R                  " XS
S9u  pnXKR                  5       -  R                  5       n[        US   U R                  S5      S   US9  [        US   U R                  S5      S   US9  [        US   U R                  S5      S   US9  XR                  U5      -  n[        US   U R                  S5      S   US9  [        US   U R                  S5      S   US9  [        US   U R                  S5      S   US9  U R!                  XR                  U5      -
  S-  5      S-  n[        XSS9  g )Nr  r[   rn   rS   rq   r%   r   r  )rr   r  Tr  r   r   r   rp   r   r   r5  r  r   F)r  )r'   r(   r3   r]   rt   r-   r   r*   rx   rq  deg2radr   r  r   r  r   sum)r,   r&   rg   	n_vectorsr   vectorsr   sigma	tolerancenoisenoisy_resultr  r  coverror_vector
rssd_checks                   r    test_align_vectors_noiser  D  s   b!E
))

 G
HCI
S12
6Cjj)Q8jFGYYwF JJqMEeI  


3::Iq>:?u
ME ;;v&L++L?CENCs '')O..0LLORZZ_R%8yILORZZ_R%8yILORZZ_R%8yI ::eCCIrzz#r2CCIrzz#r2CCIrzz#r2C		'(::q@ASHJD%8r"   c                 6   [         R                  " [        SS9   U R                  / SQ5      U R                  / SQ5      p![        R
                  " X5        S S S 5        [         R                  " [        SS9   U R                  / SQ5      U R                  / SQ5      p![        R
                  " X5        S S S 5        [         R                  " [        SS9   U R                  / SQ/ SQ/5      U R                  / SQ/5      p![        R
                  " X5        S S S 5        [         R                  " [        SS9   U R                  / SQ/5      U R                  / SQ/5      p!U R                  S	//5      n[        R
                  " XU5        S S S 5        [         R                  " [        S
S9   U R                  / SQ/ SQ/5      U R                  / SQ/ SQ/5      p!U R                  / SQ5      n[        R
                  " XU5        S S S 5        U R                  / SQ/5      U R                  / SQ/5      p!U R                  S/5      n[        U5      (       aq  [        R
                  " XU5      u  pEU R                  U R                  UR                  5       5      5      (       d   S5       eU R                  U5      (       d   S5       eO9[         R                  " [        SS9   [        R
                  " XU5        S S S 5        U R                  / SQ/ SQ/5      U R                  / SQ/ SQ/5      p!U R                  U R                  U R                  /5      n[        U5      (       aq  [        R
                  " XU5      u  pEU R                  U R                  UR                  5       5      5      (       d   S5       eU R                  U5      (       d   S5       eO9[         R                  " [        SS9   [        R
                  " XU5        S S S 5        U R                  / SQ/5      U R                  / SQ/5      p![        U5      (       ap  [        R
                  " X5      u  pEU R                  U R                  UR                  5       5      5      (       d   S5       eU R                  U5      (       d   S5       eO8[         R                  " [        SS9   [        R
                  " X5        S S S 5        U R                  / SQ/ SQ/5      U R                  / SQ/ SQ/5      p!U R                  U R                  S	/5      n[        U5      (       aF  [        R
                  " XUSS9u  pEnU R                  U R                  U5      5      (       d   S5       eO8[         R                  " [        SS9   [        R
                  " XUSS9  S S S 5        U R                  / SQ/5      U R                  / SQ/5      p![        U5      (       aE  [        R
                  " XSS9u  pEnU R                  U R                  U5      5      (       d   S5       eO7[         R                  " [        SS9   [        R
                  " XSS9  S S S 5        U R                  / SQ//5      U R                  / SQ//5      p![         R                  " [        SS9   [        R
                  " X5        S S S 5        g ! , (       d  f       GN= f! , (       d  f       GN<= f! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GN$= f! , (       d  f       GNC= f! , (       d  f       GNG= f! , (       d  f       GNz= f! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       g = f)Nz Expected input `a` to have shaper   r   r  z Expected input `b` to have shapez/Expected inputs `a` and `b` to have same shapesr  z&Expected `weights` to be 1 dimensionalr   z+Expected `weights` to have number of valuesrs   zQuaternion should be nanzRSSD should be nanz)`weights` may not contain negative valuesz#Only one infinite weight is allowedr  z(Cannot align zero length primary vectorsTr  z Sensitivity matrix should be nanz Cannot return sensitivity matrixz)Expected inputs `a` and `b` to have shape)r   r   r   r*   r   r  r   rw   r   r+   inf)r,   rt  ru  rB  r#   r  r  s          r     test_align_vectors_invalid_inputr  k  s   	z)K	Lzz,'I)>1q$ 
M 
z)K	Lzz)$bjj&>1q$ 
M 
z *? 
@zz9i012::yk3J1q$
@
 
zE
Gzz9+&

I;(?1**qcU#qW-	
G 
zJ
Lzz9i012::y)>T3U1**Y'qW-	
L ::yk"BJJ	{$;qjj"GW((w7vvbhhqyy{+,,H.HH,xx~~333~]]:!LN""11N ::y),-rzz9i:P/Qqjj"&&"&&)*GW((w7vvbhhqyy{+,,H.HH,xx~~333~]]:!FH""11H ::yk"BJJ	{$;qQ((.vvbhhqyy{+,,H.HH,xx~~333~]]:!KM""1(M ::y),-rzz9i:P/Qqjj"&&!%GQ ..qWQUVvvbhhtn%%I'II%]]:!CE""1TJE ::yk"BJJ	{$;qQ ..qMvvbhhtn%%I'II%]]:@B ..qMB
 ::	{m$bjj9+&?q	zH
Jq$
J 
J] 
M	L 
M	L
@ 
@

G 
G
L 
LN NH HM ME EB B
J 
Js   <[7<[(A[:6A\)A\\0*]
]"]&]86^

[%(
[7:
\	
\
\-0
\?
]
]#&
]58
^

^c                    [         R                  " U 5      nXR                  :X  a  SOSnU R                  / SQ/ SQ/5      nU R                  / SQ/ SQ/5      nU R                  / SQ/ SQ/ SQ/5      n[        R
                  " XCU R                  U R                  S	/5      S
9u  pg[        UR                  5       XRS9  [        UR                  U5      XBS9  [        XpR                  S5      S   US9  U R                  / SQ/ SQ/5      nSn[        R
                  " XCU R                  U R                  S	/5      S
9u  pg[        UR                  5       XRS9  [        UR                  U5      S   US   US9  [         R                  " XxX S9(       d   eU R                  / SQ/ SQ/5      n	[        UR                  U5      XS9  U R                  / SQ/ SQ/5      nU R                  / SQ/ SQ/5      nSn[        R
                  " XCU R                  U R                  S	/5      S
9u  pg[        UR                  U5      S   US   US9  [         R                  " XxX S9(       d   eg )Nro   r   r   r   r   r   r   r  r   r   r   rA  rp   r   r   )r   r   r   r   r   )rX   r,   r   r   r   r  )r   rS   rs   )r   rS   r   r:  g4i?)r'   r(   r   r*   r   r  r  r   r_   rq  isclose)
r,   r&   rX   ru  rt  
m_expectedRr  r  
a_expecteds
             r    "test_align_vectors_align_constrainr    s    b!EZZ'5TD


Iy)*A


K+,A[&&( )J $$Q2::rvvqk3JKGAAKKM:9AGGAJ-D**S/"-D9 	

Iy)*AM$$Q2::rvvqk3JKGAAKKM:9AGGAJv&&	=;;t===[)45JAGGAJ
6 	

I{+,A


L*-.A&M$$Q2::rvvqk3JKGAAGGAJv&&	=;;t===r"   c           
         [         R                  " U 5      nXR                  :X  a  [        R                  " S5        Sn/ n[        S5       H8  nUR                  [        R                  " USU-   S9R                  5       5        M:     [        U5       H  nU R                  [        R                  " SUS   U   S   -  SUS   U   S   -  /5      US	9nU R                  [        R                  " S
US   U   S   -  SUS
   U   S   -  /5      US	9n[        R                  " XVSS/S9u  px[        R                  " XVU R                  S/S9u  p[        UR                  5       U	R                  5       SS9  M     [        U5       H  nU R                  [        R                  " SUS   U   S   -  SUS   U   S   -  S
US   U   S   -  /5      US	9nU R                  [        R                  " SUS
   U   S   -  SUS   U   S   -  SUS   U   S   -  /5      US	9n[        R                  " XV/ SQS9u  px[        R                  " XVU R                  SS/S9u  p[        UR                  5       U	R                  5       SS9  GM      g )Nz9Align vectors near inf is numerically unstable in float32r[   rJ   rZ   rn   r   r   r   r%   rS   rA       _BrA  -C6?rp   rB   )r  r   r   )r'   r(   r<   r   skiprc   appendr   r]   r_   r*   r3   r4   r  r  r   )
r,   r&   r  matsri   rt  ru  r  _R2s
             r    test_align_vectors_near_infr    sU   
 b!E

OPAD1XHOOA262<<>?  1XJJrxxT!WQZ]!2AQ
14E FGuJUJJrxxT!WQZ]!2AQ
14E FGuJU%%aT1I>&&qbffa[Ar||~DA  1XJJrxx471:a=!DGAJqM/1T!WQZPQ]? ST"  $JJrxx471:a=!DGAJqM/1T!WQZPQ]? ST"  $ %%aLA&&qbffa^Dr||~DA r"   c                 B   SnU R                  / SQ/ SQ/5      nU R                  / SQ/ SQ/5      nU R                  / SQ/ SQ/ SQ/5      n[        R                  " X#U R                  S/S9u  pV[	        UR                  5       XAS	9  [        R                  " US
   US
   5      u  pV[	        UR                  5       XAS	9  [	        UR                  US
   5      US
   US	9  U R                  / SQ/ SQ/5      nU R                  / SQ/ SQ/ SQ/5      n[        R                  " X#U R                  S/S9u  pV[	        UR                  5       XAS	9  [        R                  " US
   US
   5      u  pV[	        UR                  5       XAS	9  [	        UR                  US
   5      US
   US	9  g )Nro   r   r   r   r   r  r   r   r   rA  rp   r   r   )r*   r   r  r  r   r_   rq  )r,   rX   rt  ru  r  r  r  s          r    test_align_vectors_parallelr    sd   D


K+,A


K+,A['&( )J !!!<DAAKKM:9!!!F)QvY7DAAKKM:9AGGAfI&&	=


Iy)*A[&&( )J !!!<DAAKKM:9!!!F)QvY7DAAKKM:9AGGAfI&&	=r"   c           	         [         R                  " U 5      nXR                  :X  a  SOSn[        R                  " / SQ/ SQ// SQ/ SQ// SQ/ SQ//5      n[        R                  " U Vs/ s H  oDS   * US   /PM     sn5      n[        X55       H  u  pFU R                  XAS	9U R                  XaS	9pd[        R                  " XFU R                  S/S
9u  px[        UR                  5       U R                  U R                  5      S   US9  [        UR                  US   5      US   US9  M     [        R                  " SSS9n	[        R                  " U	R!                  5       S-  5      n
/ SQ/ SQ/n/ SQ/ SQ/n/ nU
 H?  nUR#                  [        R                  " UR                  US   5      US   /5      5        MA     [%        U R                  S5      5      S:X  a  SnU H  nU R                  U5      U R                  U5      pd[        R                  " XFU R                  S/S
9u  px[        R                  " XFSS/S
9u  p[        UR'                  5       UR'                  5       US9  M     g s  snf )Nro   r   r  r   r   r   r   r   r%   rA  r   rp   r   r[   rn   r  r   cudar  )r'   r(   r   r3   r4   zipr*   r   r  r  r   r  r  rq  r]   r   r  r  r   r_   )r,   r&   rX   
as_to_testrt  
bs_to_testru  r  r  RsdRsdRr  s                r    test_align_vectors_antiparallelr     s    b!EZZ'5TDK3%y1%y13 4J *=*QqTE1Q4=*=>JJ+zz!z)2::a:+E1%%aRVVQK@rzz"%%'8'<4H&	*AfIDA	 , 
!	$B


r||~d2
3C	YA	YAJ"((BHHQqTNAaD#9:;  bjjm$.zz!}bjjm1%%aRVVQK@&&qdAY?r||~DA	 5 >s   )I.c                    [         R                  " U 5      nXR                  :X  a  SOSn[        R                  " SSS9R                  5       n[        R                  " SSS9R                  5       n[        X45       Hx  u  pVU R                  US   US9nU R                  US   US9n[        R                  " Xx5      u  p[        U	R                  U5      XrS9  [        XR                  S	5      S
   US9  Mz     g )Nro   r  r[   r   rn   r   r%   rp   r   r   )r'   r(   r   r   r]   r_   r  r*   r  r   rq  )r,   r&   rX   mats_amats_bmat_amat_brt  ru  r  r  s              r    test_align_vectors_primary_onlyr
  L  s    b!EZZ'5TD__Sa(224F__Sa(224FF+JJuQxuJ-JJuQxuJ- ((.
A1jjob1= ,r"   c                     [         R                  R                  S5      n [        R                  " U S9nU R	                  SS9nUR                  U5      n[        R                  " X25      u  pE[        R                  " UR                  5       UR                  5       5      u  pg[        UR                  5       UR                  5       5        [        Xu5        g )Nrm   rn   r  rq   )
r3   r]   rt   r   rx   rq  r  ru   r   r+   )rg   r  ru  rt  est_expectedr  r  r  s           r    test_align_vectors_array_liker  ^  s    
))


$CC A


A	
A"*"8"8">L&&qxxz188:>ICL((*CKKM:D(r"   c                    [         R                  " U 5      n[        R                  R	                  S5      n[        [        R                  " US9U 5      nU R                  UR                  SS9US9nU R                  UR                  U5      U R                  S9n[        R                  " XT5      u  pg[        UR                  5       UR                  5       5        g )Nrm   rn   r  rq   r%   )r'   r(   r3   r]   rt   r-   r   r*   rx   rq  r<   r  r   r+   )r,   r&   rg   r  ru  rt  r  r  s           r    test_align_vectors_mixed_dtypesr  j  s    b!E
))


$Cx3/4A


3::6:*%
8A


1771:RZZ
0A##A)FCCKKM199;/r"   c                     U R                  / SQ5      n[        [        R                  " U5      5      n[	        U 5      (       a
  SnX#:X  d   eg UR                  S5      (       d   eg )Nr0   zRotation.from_matrix(array([[1., 0., 0.],
                            [0., 1., 0.],
                            [0., 0., 1.]]))Rotation.from_matrix()r*   reprr   r)   r   
startswith)r,   rh   actualr   s       r    test_repr_single_rotationr  v  s[    


< A($$Q'(F||/ !!!  !89999r"   c                 0   U R                  / SQ/ SQ/5      [        R                  " S5      -  n[        R                  " U5      < n[        U 5      (       a(  SnS[        S[        4S jnU" U5      U" U5      :X  d   eg UR                  S5      (       d   eg )	N)r   r   r   r   r   r   a  Rotation.from_matrix(array([[[ 0.,  0.,  1.],
                             [ 0.,  1.,  0.],
                             [-1.,  0.,  0.]],

                            [[ 0., -1.,  0.],
                             [ 1.,  0.,  0.],
                             [ 0.,  0.,  1.]]]))sreturnc                 p    SR                  [        [        R                  U R	                  5       5      5      $ )N
)r  mapstrlstrip
splitlines)r  s    r    stripped-test_repr_rotation_sequence.<locals>.stripped  s"    99SQ\\^<==r"   r  )r*   r   r   r   r)   r   r  r  )r,   rh   r  r   r  s        r    test_repr_rotation_sequencer!    s    


NL12TYYq\AA""1%(F||4	> 	> 	> 8H#5555  !89999r"   c                 h   [         R                  R                  S5      n[        R                  " U R                  UR                  SS95      5      nUR                  5       n/ SQn[        XB5      n[        UR                  [        U R                  S5      5      5      (       d   e/ SQnU" U5      nUR                  5       nUS S 2S4   S:  S S 2S 4   n	U R                  X* U5      nUS S 2S4   S:  S S 2S 4   n	U R                  X* U5      n[        US   US   5        [        US   US	   5        [        US
   US   5        [        US   US   5        [        US   US   5        U R                  US   US   -  5      n
U R                  US   US	   -  5      n[        X5        U R                  US   US   -  5      nU R                  US   US
   -  5      n[        X5        U R                  US	   US   -  5      n[        USU
S-  -  S-
  5        [        [!        U5      [!        U5      5        g )Nr   r
  rq   )r   r   r   rS   rA   )r   r   r  r   r  r   g      @rS   g      
@g@rA   rs   r   r   r   )rB   .r   )r  .)rZ   .)rA   .r   r   )r3   r]   r^   r   r)   r*   r  r+   r   r>  timesr@  wherer   r  r   rR  )r,   r   key_rots	key_quats	key_timesinterpolatorr#  interp_rotsinterp_quatsmask
cos_theta1
cos_theta2
cos_theta4
cos_theta5
cos_theta3s                  r    
test_slerpr1    s0   
))


"C!!"**S[[f[-E"FGH  "II-Ll(($rzz!}*=>>>>=Eu%K&&(L B!#QW-D88D->Laeq !T'*Dz95I L()F*;<L()F*;<L()F*;<L()F*;<L)9V+<= V,|F/CCDJV,|F/CCDJJ+V,|F/CCDJV,|F/CCDJJ+ V,|F/CCDJJZ] 3a 78 [!3u:.r"   c                     [         R                  " [        SS9   U R                  / SQ/ SQ/5      nU R                  SS/5      n[	        X!5        S S S 5        g ! , (       d  f       g = f)Nzmust be a `Rotation` instancer   r   r0   r   r   )r   r   r  r*   r   )r,   r#   r1  s      r    test_slerp_rot_is_rotationr3    sO    	y(G	HJJ	!# $JJ1va	 
I	H	Hs   6A
A'z*must be a sequence of at least 2 rotationsc                     [         R                  " U R                  / SQ/5      5      n[        R                  " [
        [        S9   [        S/U5        S S S 5        g ! , (       d  f       g = f)N)r   r   rS   rA   r   r   )r   r)   r*   r   r   r   SLERP_EXCEPTION_MESSAGEr   r|   s     r    test_slerp_single_rotr6    sE    2::~&678A	z)@	Aqc1 
B	A	As   A
A+c                    [         R                  " 5       n[         R                  " U R                  UR	                  5       5      5      n[
        R                  " [        [        S9   [        / U5        S S S 5        g ! , (       d  f       g = f)Nr   
r   r]   r)   r*   r+   r   r   r   r5  r   r|   s     r    test_slerp_rot_len0r9    sR    A2::aiik23A	z)@	Ab! 
B	A	As   &A<<
B
c                    [         R                  " S5      n[         R                  " U R                  UR	                  5       5      5      n[
        R                  " [        [        S9   [        S/U5        S S S 5        g ! , (       d  f       g = f)Nr   r   r8  r|   s     r    test_slerp_rot_len1r;    sV    A2::aiik23A	z)@	Aqc1 
B	A	As   'A>>
Bc                     [         R                  " U R                  S5      5      n[        R                  " [
        SS9   [        SS/U5        S S S 5        g ! , (       d  f       g = f)Nr   r   rA   z"Rotations with more than 1 leadingr   r   r   )r   r)   r$  r   r   r   r   r|   s     r    test_slerp_tensor_rotr>    sE    2779-.A	z)M	Nq!fa 
O	N	Ns   A
A%c           	      L   [         R                  " [        SS9   [        R                  R                  S5      n[        R                  " U R                  UR                  SS95      5      nU R                  S/S//5      n[        X25        S S S 5        g ! , (       d  f       g = f)Nz.times to be specified in a 1 dimensional arrayr   r   r(  rq   r   r   )r   r   r   r3   r]   r^   r   r)   r*   r  r   r,   r   r#   r1  s       r    test_slerp_time_dim_mismatchrA    s    	zM
Oii##A&rzz#++6+*BCDJJ a
O 
O 
Os   A2B
B#c           	      D   [         R                  " [        SS9   [        R                  R                  S5      n[        R                  " U R                  UR                  SS95      5      nU R                  S5      n[        X25        S S S 5        g ! , (       d  f       g = f)Nz7number of rotations to be equal to number of timestampsr   r   r
  rq   r  )r   r   r   r3   r]   r^   r   r)   r*   r  aranger   r@  s       r    !test_slerp_num_rotations_mismatchrD    sv    	z *@ 
Aii##A&rzz#++6+*BCDIIaLa
A 
A 
As   A.B
Bc                    [         R                  R                  S5      nU R                  UR	                  SS95      n[
        R                  " U5      n/ SQn[        U5      (       a=  [        XC5      nU R                  U R                  UR                  5      5      (       d   eg [        R                  " [        SS9   [        XC5        S S S 5        g ! , (       d  f       g = f)Nr   r
  rq   )r   r   r   r   rA   strictly increasing orderr   r3   r]   r^   r*   r  r   r)   r   r   rw   r   r#  r   r   r   r,   r   rh   r#   r1  r  s         r    test_slerp_equal_timesrI  	      
))


"C


3;;F;+,A1AAQ!Kvvbhhqww'((((]]:-HI!K JII   >C
C!c                    [         R                  R                  S5      nU R                  UR	                  SS95      n[
        R                  " U5      n/ SQn[        U5      (       a=  [        XC5      nU R                  U R                  UR                  5      5      (       d   eg [        R                  " [        SS9   [        XC5        S S S 5        g ! , (       d  f       g = f)Nr   r
  rq   )r   r   rS   r   rA   rF  r   rG  rH  s         r    test_slerp_decreasing_timesrM  	  rJ  rK  c                 ~   [         R                  R                  S5      n[        R                  " U R                  UR                  SS95      5      nU R                  S5      n[        X25      n[        R                  " [        SS9   U R                  S/S//5      nU" U5        S S S 5        g ! , (       d  f       g = f)	Nr   r
  rq   rB   z&`times` must be at most 1-dimensional.r   g      @g@)r3   r]   r^   r   r)   r*   r  rC  r   r   r   r   )r,   r   r#   r1  r  interp_timess         r    !test_slerp_call_time_dim_mismatchrP  #	  s    
))


"C2::ckkvk&>?@A
		!AaA	zE
GzzC5$'5#* +	,	
G 
G 
Gs   B..
B<c                    [         R                  R                  S5      n[        R                  " U R                  UR                  SS95      5      nU R                  S5      S-   n[        X25      nU R                  / SQ5      nU R                  / SQ5      n[        U5      (       GaE  U" U5      R                  5       nU R                  XPR                  U5      :  XPR                  U5      :*  5      nU R                  U R                  Xx) S4   5      5      (       d   eU R                  U R                  XxS4   5      ) 5      (       d   eU" U5      R                  5       nU R                  X`R                  U5      :  X`R                  U5      :*  5      nU R                  U R                  Xx) S4   5      5      (       d   eU R                  U R                  XxS4   5      ) 5      (       d   eg [         R"                  " [$        S	S
9   U" U5        S S S 5        [         R"                  " [$        S	S
9   U" U5        S S S 5        g ! , (       d  f       N9= f! , (       d  f       g = f)Nr   r
  rq   rB   r   r  )r   r   rJ   .ztimes must be within the ranger   )r3   r]   r^   r   r)   r*   r  rC  r   r   r+   logical_andminmaxrw   r   r   r   r   )	r,   r   r#   r1  r  	times_low
times_highrh   in_ranges	            r    !test_slerp_call_time_out_of_rangerX  1	  s   
))


"C2::ckkvk&>?@A
		!qAaA

9%II&JYiL  ">>)vvay"8)vvay:PQvvbhhqC012222vvrxxC- 0112222jM!!#>>*q	"9:PQ;RSvvbhhqC012222vvrxxC- 0112222]]:-MNiL O]]:-MNjM ON ONNNs   	I0	I
I
I!c                    [         R                  " U 5      nXR                  :X  a  SOSn[        R                  " SU R                  S/S//5      SS9n[        SS/U5      nU" S	5      n[        R                  " SU R                  S
5      SS9nXVR                  5       -  n[        UR                  5       U R                  S5      S   US9  g )NrU   r   r`  r   P   Tr  r   r  r  r   r   rp   )
r'   r(   r   r   r   r*   r   r   r   r  )r,   r&   rX   r#   r  r_interpolatedr_interpolated_expecteddeltas           r    test_slerp_call_scalar_timer^  J	  s     b!EZZ'5TDCaS2$K!8$GAq!faAtWN&11#rzz"~tT88::EEOO%rzz#r':Fr"   c                    [         R                  " U R                  / SQ5      5      n[         R                  " U R                  / SQ5      5      nX-  n[        UR	                  5       U R                  / SQ5      5        [
        R                  " [        SS9   US-    S S S 5        UR                  S5      [        L d   eg ! , (       d  f       N)= f)Nr0   r   zunsupported operand typer   r   r   )
r   r)   r*   r   r+   r   r   r  __mul__NotImplemented)r,   r~  r  r   s       r    test_multiplicationrb  Z	  s    			BJJ|4	5B			BJJ|4	5B	BBJJL"**^"<= 
y(B	C
Q 
D ::a=N***	 
D	Cs   C  
Cc                    [         R                  R                  S5      n[        R                  " U R                  UR                  SS95      5      n[        R                  " U R                  UR                  SS95      5      nX#-  nUR                  5       R                  S:X  d   e[        R                  " U R                  UR                  SS95      5      n[        R                  " U R                  UR                  SS95      5      nX#-  nUR                  5       R                  S:X  d   e[        R                  " U R                  UR                  SS95      5      n[        R                  " U R                  UR                  SS95      5      nX#-  nUR                  5       R                  S:X  d   e[        R                  " U R                  UR                  S	S95      5      n[        R                  " U R                  UR                  S
S95      5      nX#-  nUR                  5       R                  S
:X  d   eg )Nr   r  rq   r$  )r   r   rA   )rS   r   rA   rA   )r   rA   rA   )rS   r   rA   rA   r(  r=  )	r3   r]   rt   r   r)   r*   rx   r+   rd   )r,   rg   r~  r  r   s        r    test_multiplication_ndrd  i	  s    ))


"C			BJJszzyz'AB	CB			BJJszzyz'AB	CB	B::<*** 
		BJJszzyz'AB	CB			BJJszzyz'AB	CB	B::<*** 
		BJJszz|z'DE	FB			BJJszzyz'AB	CB	B::<--- 
		BJJszzvz'>?	@B			BJJszzyz'AB	CB	B::<***r"   c                 x   [         R                  R                  S5      n[        R                  " U R                  UR                  SS95      5      n[        R                  " U R                  UR                  SS95      5      n[        R                  " [        SS9   X#-    S S S 5        g ! , (       d  f       g = f)Nr   r(  rq   )r   rA   rA   r  r   )
r3   r]   rt   r   r)   r*   rx   r   r   r   r  s       r    test_multiplication_errorsrf  	  s~    
))


"C			BJJszzvz'>?	@B			BJJszzyz'AB	CB	z);	<
 
=	<	<s   B++
B9c                    [        [        R                  " SSS9U 5      n[        [        R                  " SSS9U 5      nU R                  [	        U5      5      nU H,  nX$-  U-  n[        [        UR                  5       SS9U5        M.     g )N2   r   rn   r  r   r   )r-   r   r]   r$  rR  r   r   r+   )r,   qsrsr   r#   s        r    test_multiplication_stabilityrk  	  sn    	2B	7B	!4b	9Bwws2wHVb[rzz|!<hG r"   c                    [         R                  " U 5      nX R                  :X  a  SOSn[        R                  R                  S5      nU4US-
  -  nUR                  US-   S9n[        R                  " U R                  U5      5      nUR                  5       nS GH  n	Xy-  n
U R                  / SQ5      n[        U
R                  [        U5      5      (       d   e[        R                  " U R                  XS	-   5      5      n[        [!        U	5      5       H  nU	S:  a  X-  nM  X-  nM     XR                  5       -  R#                  5       nU R%                  X:  5      (       d   e[        R                  " U R                  XS	-   5      5      nX-  R'                  5       R(                  US-   :X  a  GM   e   S
 HT  n	Xy-  n
[        R*                  " XR-                  5       -  5      n[/        U
R'                  5       UR'                  5       US9  MV     / SQn	U	 H~  nX-  nXpR                  U/5      -  n[/        UR'                  5       UR'                  5       5        XpR                  U5      -  n[/        UR'                  5       UR'                  5       5        M     U R1                  US-   5      n[         R2                  " U5      S   R5                  S5      n[        R*                  " U5      nSn	Xy-  n
[        R*                  " XR-                  5       -  5      n[/        U
R'                  5       UR'                  5       US9  XpR                  U	/5      -  n
[        R*                  " XR-                  5       -  5      n[/        U
R'                  5       UR'                  5       US9  XpR                  U	5      -  n
[        R*                  " XR-                  5       -  5      n[/        U
R'                  5       UR'                  5       US9  g )Nr  r   r   r   rM   rq   )r  r   rs   r   r   r   rB   r   rL   )      r          r   r   r  rp   )r  r   rm  rs   r   rn  r   r   r   r   r  r   r   r}  ro   rS   )r'   r(   r   r3   r]   rt   rx   r   r)   r*   r   r>  r?  r@  ra   rc   r   r  rw   r+   rd   r   r  r   r   r   r   )r,   rI   r&   rX   rg   r  r   r  p_invr  rh   
q_identityr#   r  angexponentr_arrayr   s                     r    test_powrt  	  s&    b!EZZ'5TD
))


"C'TAX&K::;-:.D2::d+,AEEGE%FZZ.
!''4
#34444rwwz3EFGs1vA1uEI	 
 557{%%'vvcj!!!! rwwz3EFG~~%%t);;;;# &( /F  [[]!23		QYY[t< / 	AAMzz8*--		W__%67zz(++		W__%67  XXkD()FVVF^F#''.FV$A	A	AQ./AAIIK48 	
ZZ_AQ./AAIIK48	ZZ]AQ./AAIIK48r"   c                    [        [        R                  " SS9U 5      n[        R                  " [
        SS9   [        USS5        S S S 5        [        R                  " [        SS9   XR                  SS/5      -    S S S 5        [        R                  " [        SS9   XR                  S/S//5      -    S S S 5        g ! , (       d  f       N= f! , (       d  f       NY= f! , (       d  f       g = f)Nr   rn   zmodulus not supportedr   r   zArray exponent must be a scalarr   )	r-   r   r]   r   r   NotImplementedErrorpowr   r*   )r,   r  s     r    test_pow_errorsrx  	  s    x1-r2A	*2I	JAq! 
K	z)J	K	ZZA 
L	z)J	K	ZZ!qc
## 
L	K	 
K	J	K	K	K	Ks#   B?'CC!?
C
C!
C/c                  @   [         R                  " SS9n [         R                  " SSS9n[        R                  " U 5      n[	        UR
                  S5        [        R                  " U5      n[	        UR
                  S5        [        US   R                  5       US   R                  5       5        [        US   R                  5       US   R                  5       5        [        R                  " U /5      n[	        UR
                  S5        [	        US   U 5        [        R                  " U/5      n[	        UR
                  S5        [        US	   R                  5       US   R                  5       5        [        US
   R                  5       US   R                  5       5        [        R                  " X/[        S9n[	        UR
                  S5        [	        US   U 5        [	        US   U5        [        R                  " XU/5      n[	        UR
                  S5        g )Nr   rn   r   r   r   r#  rL   r:  r   )r   r   r%   )rS   r   )	r   r]   r3   r4   r   rd   r   r_   object)singlemultipler4   s      r     test_rotation_within_numpy_arrayr}  	  s   __#Fqa(HHHVEb!HHXEd#E!H&&((1+*?*?*ABE!H&&((1+*?*?*ABHHfXEd#q6"HHhZ Ef%E$K))+Xa[-B-B-DEE$K))+Xa[-B-B-DEHHf'v6Ed#q6"q8$HHh(34Ef%r"   array_api_strictz"array API doesn't support picklingc                    [         R                  " U R                  SS[        R                  " [
        R                  S-  5      [        R                  " [
        R                  S-  5      /5      5      n[        R                  " U5      n[        R                  " U5      n[        UR                  5       UR                  5       SS9  g Nr   rA   rT   rp   )r   r)   r*   r   sinr3   r  r-  pickledumpsloadsr   r_   )r,   r#   pkl	unpickleds       r    test_picklingr  
  s~     	2::q!TXXbeeAg->q@Q&RSTA
,,q/CS!IAKKM9#6#6#8uEr"   z"array API doesn't support deepcopyc                 d   [         R                  " U R                  SS[        R                  " [
        R                  S-  5      [        R                  " [
        R                  S-  5      /5      5      n[        R                  " U5      n[        UR                  5       UR                  5       SS9  g r  )r   r)   r*   r   r  r3   r  r-  r  deepcopyr   r_   )r,   r#   r~  s      r    test_deepcopyr  
  sn     	2::q!TXXbeeAg->q@Q&RSTA	q	BAKKM2<<>>r"   c                  T   [         R                  " / SQ5      n U R                  S5      nU R                  S5      nUR                  S   SL d   eUR                  S   SL d   e[	        S UR
                   5       5      (       d   e[	        S UR
                   5       5      (       d   eg )Nr0   r   ra  C_CONTIGUOUSTc              3   *   #    U  H	  oS :  v   M     g7fr   Nr   .0ri   s     r    	<genexpr>+test_as_euler_contiguous.<locals>.<genexpr>
       *z!Avz   c              3   *   #    U  H	  oS :  v   M     g7fr  r   r  s     r    r  r  
  r  r  )r   r)   r  flagsrw   strides)r#   e1e2s      r    test_as_euler_contiguousr  
  s    <(A	
E	B	
E	B88N#t+++88N#t+++*rzz******rzz*****r"   c                 ~   [        [        R                  " SSS9U 5      n/ SQnS/[        [        R
                  " U5      5      -   n[        X25       VVs/ s H  u  pEXXE-    PM     nnn[        R                  " U5      n[        UR                  5       UR                  5       5        [        R                  " U5      n[        UR                  5       UR                  5       5        XLd   e[        R                  R                  S5      nU R                  UR                  SS95      n	[        R                  " U	5      n[        R                  " U	S S2S4   5      n
[        R                  " U	SS 2S4   5      n[        R                  " X/5      n[        UR                  5       UR                  5       5        g s  snnf )	NrZ   r   rn   )r   r   rS   r   rS   rB   r   rA   rq   rS   .)r-   r   r]   listr3   cumsumr  concatenater
   r+   rt   r*   rx   r)   )r,   r  sizesstartsri   r  splitr   rg   r   r~  r  s               r    test_concatenater  !
  sf   hooba8"=HES4		%())F+.v+=>+=41X+=E>!!%(FH$$&(89 !!(+FH$$&(89 !!! ))


"C::cjjij01D!!$'H			D!SM	*B			DSM	*B!!2(+FH$$&(89% ?s   F9c                    [         R                  " [        SS9   [        U R	                  [        R
                  " 5       R                  5       5      5      n[        R                  " USS /5        S S S 5        g ! , (       d  f       g = f)NzRotation objects onlyr   r   )r   r   r  r   r*   r  r+   r  )r,   r   s     r    test_concatenate_wrong_typer  ;
  sW    	y(?	@rzz("3"3"5"="="?@Ac1d^, 
A	@	@s   AA88
Bc                 D   [         R                  " U R                  S5      5      n[         R                  " U R                  S5      5      n[        R                  " [
        [        [        45         [         R                  " X/5        S S S 5        g ! , (       d  f       g = f)Nr  r   )	r   r)   r$  r   r   r   RuntimeErrorr  r  )r,   r~  r  s      r    test_concatenate_wrong_shaper  B
  sb    			BGGI.	/B			BGGFO	,B	
L)<	=bX& 
>	=	=s   0B
Bc                    [        U R                  / SQ/5      5      n[        U R                  / SQ/ SQ/5      5      n[        U R                  / SQ5      5      n[        U5      S:X  d   e[        U5      S:X  d   e[        R                  " [
        SS9   [        U5        S S S 5        [         R                  " U R                  S5      5      n[        U5      S:X  d   eU(       d   eU(       d   eU(       d   eg ! , (       d  f       N`= f)Nr0   r   r   zSingle rotation has no len().r   r'  rS   )r   r*   rR  r   r   r  r)   r$  )r,   rotation_multi_onerotation_multirotation_singlerotation_batcheds        r    test_len_and_boolr  L
  s    !"**l^"<=bjj,)EFGNrzz,78O!"a'''~!###	y(G	HO 
I  ))"'')*<= A%%% >? 
I	Hs   C;;
D	c                     U R                  / SQ5      n[        R                  " USSSS9R                  5       nU R                  / SQ5      [        R
                  " S5      -  n[        X#5        g )Nr   ri  r\  Tr  r]  r   )r*   r   from_davenportr+   r   r   r   )r,   r   r   rG   s       r    #test_from_davenport_single_rotationr  `
  sV    ::i D""4b+/118 	JJ~.1=MD(r"   c                 V   U R                  / SQ5      nU R                  / SQ5      n[        R                  " XR                  -  S-  5      n[        R                  " USU R                  S-  5      n[        UR                  SS9UR                  SS95        U R                  US5      n[        R                  " XR                  -  S-  5      n[        R                  " USU R                  S-  /5      n[        UR                  SS9UR                  SS95        U R                  X/SS	9n[        R                  " XPR                  U R                  S-  /U R                  S
-  //5      -  5      nUS   US   -  nU R                  X!/SS	9n[        R                  " USU R                  S
-  U R                  S-  /5      n[        UR                  SS9UR                  SS95        U R                  X/SS	9n[        R                  " XPR                  U R                  S
-  /U R                  S-  //5      -  5      nU R                  US5      n[        R                  " USU R                  S
-  /U R                  S-  //5      n[        UR                  SS9UR                  SS95        g )Nr   r  rA   eTr   r  r   r   rJ   r   )	r*   r   r   r  r  r   r+   rN   r   )r,   ezeyr   rot_davr.  axes_davs          r    #test_from_davenport_one_or_two_axesr  i
  sA   	K	 B	K	 B 

rEEz!|
,C%%b#ruuQw7GCKK$K/41PQ ::b&!D


rEEz!|
,C%%dC"%%';GCKK$K/41PQ 88RH18%D


tjj2557)beeAgY1G&HH
IC
a&3q6/Cxxqx)H%%hbeeAgruuQw5GHGCKK$K/41PQ 88RH18%D


tjj2557)beeAgY1G&HH
ICzz"f%H%%hruuQwi"%%'5KLGCKK$K/41PQr"   c                 \   [         R                  R                  S5      nU4US-
  -  n[        R                  " U R                  UR                  SS95      5      nUR                  5       nU R                  UR                  US-   S95      n[        R                  " US   SU5      nUR                  5       R                  US-   :X  d   eU R                  UR                  US-   S95      n[        R                  " US   SU5      nUR                  5       R                  US-   :X  d   eU R                  UR                  US	-   S95      n[        R                  " US S
2S4   SU5      nUR                  5       R                  US-   :X  d   e[        R                  " U R                  UR                  US-   S95      5      nUR                  5       nU R                  UR                  US-   S95      n[        R                  " USU5      nUR                  5       R                  US-   :X  d   eg )Nr   r   rM   rq   rL   r   r  )r   N.r#  r   .r   r3   r]   rt   r   r)   r*   rx   r_   r  r+   rd   )r,   rI   rg   r  r#   r.  rd  r   s           r    test_from_davenport_shapesr  
  s    ))


"C'TAX&K2::cjjdj&;<=A;;=DZZ

d(:
;<F

!
!$v,V
<C;;=+"4444ZZ

d(:
;<F

!
!$|"4c6
BC;;=+"4444ZZ

d(:
;<F

!
!$rr3w-f
=C;;=+"4444 	2::cjjkD6Hj&IJKA;;=DZZ

d(:
;<F

!
!$V
4C;;=+"4444r"   c                 r   [         R                  R                  S5      n[        R                  " U R                  UR                  SS95      5      nUR                  5       nU R                  UR                  SS95      n[        R                  " USU5      nUR                  5       R                  S:X  d   eg )Nr   rA   	   r   rA   rq   )r   rA   rS   r  )rA   r  rA   rA   r  )r,   rg   r#   r.  rd  r   s         r    test_from_davenport_broadcastr  
  s    
))


"C2::cjjlj&CDEA;;=DZZ

	
23F

!
!$V
4C;;=,...r"   c                    / SQn/ SQn/ SQnU R                  X/5      n[        U5      (       aP  [        R                  " USSS/5      R	                  5       nU R                  U R                  U5      5      (       d   eO<[        R                  " [        SS9   [        R                  " USSS/5        S S S 5        U R                  XU/5      n[        U5      (       aP  [        R                  " US/ SQ5      R	                  5       nU R                  U R                  U5      5      (       d   eO<[        R                  " [        SS9   [        R                  " US/ SQ5        S S S 5        [        R                  " [        S	S9   [        R                  " U R                  U/5      S
S/5        S S S 5        [        R                  " [        SS9   [        R                  " U R                  XU/5      S/ SQ5        S S S 5        [        R                  " [        SS9   [        R                  " U R                  U5      SSS/5        S S S 5        [        R                  " [        SS9   [        R                  " U R                  XU/5      SSS/5        S S S 5        g ! , (       d  f       GN= f! , (       d  f       GNR= f! , (       d  f       GN= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       g = f)Nr   r   r  r  r   zmust be orthogonalr   r  zorder should ber   zExpected `angles`)r   r   r   rS   r   )
r*   r   r   r  r+   rw   r   r   r   r   )r,   r  r  ezyr.  rh   s         r    !test_from_davenport_invalid_inputr  
  s   	B	B
C::ri DT##D#1v6>>@vvbhhqk""""]]:-AB##D#1v6 C::rsm$DT##D#y9AACvvbhhqk""""]]:-AB##D#y9 C	z):	;

B4 0%!= 
<	z)<	=

BB< 8#|L 
>	z)<	=

2aV< 
>	z)<	=

BB< 8#1vF 
>	= CB CB	;	;	=	=	=	=	=	=sH   JJ-*J?,K*K"&,K3
J*-
J<?
K
K"
K03
Lc                     [         R                  R                  S5      n [         R                  " / SQ5      n[         R                  " / SQ5      n[         R                  " / SQ5      n[        R                  " U S9nUR                  XU/S5      n[        R                  " XU/SUR                  5       5      nUR                  USS9(       d   e[        R                  " S	U S9nUR                  XU/S5      n[        R                  " XU/SUR                  5       5      n[         R                  " UR                  USS95      (       d   eg )
Nrm   r   r   r   rn   r  ro   rp   r   )
r3   r]   rt   r4   r   as_davenportr  ru   rv   rw   )rg   r  r  e3ry   rd  r#   s          r    test_from_davenport_array_liker  
  s   
))


$C	)	B	)	B	)	BS)J$$bb\37Fc6==?CA""15"111 ,J$$bb\37Fc6==?CA66*))!%)89999r"   c                    [         R                  " U 5      n[        R                  R	                  S5      nSn[        R
                  " US45      nUR                  [        R                  * [        R                  U4S9US S 2S4'   UR                  S[        R                  U4S9nUR                  [        R                  * [        R                  U4S9US S 2S4'   UR                  S[        R                  SS9nU R                  / SQ5      nU R                  / SQ5      nU H  n	U R                  [        R                  " X-  5      R                  U5      5      n
U R                  XxU
/SS	9nXY-
  US S 2S
4'   S Hh  nUS:X  a  UOU R                  USS	9n[        R                  " XU R                  XAS95      nUR                  X5      n[!        XR                  XAS95        Mj     M     g )Nr   r[   rS   rn  r   )r  r  r  r   r   ri  rj  rj  r%   )r'   r(   r3   r]   r^   rA  r  r  r*   r   r   rq  r   rs  r  r  r   )r,   r&   r   r  rd  angles_middlelambdasr  r  lambr  ax_lambr  axr   
angles_davs                   r    test_as_davenportr  
  s   b!E
))


"CAXXq!fF;;BEE6QD;AF1a4LKKABEEK=M;;BEE6QD;AF1a4Lkkabee%k8G	K	 B	K	 BZZ,,TW5;;B?@((BB<a(0$+q!t/E![0bgggAg6NB))"RZZZ5TUC))"4JJ

6
(GH	 0	 r"   c                 @   [         R                  R                  S5      n[        R                  " U R                  UR                  SS95      5      nUR                  5       nU R                  UR                  [         R                  * [         R                  SS95      n[        R                  " U5      S   R                  US   S-  5      nS HL  nUS	:X  a  U R                  US
S9n[        R                  " X5U5      nUR                  X55      n[!        Xt5        MN     g )Nr   r  rq   )rA   r  r   rS   rn  r|  r   r  rj  r   r   )r3   r]   rt   r   r)   r*   rx   r_   r  r  r'   r   r   rs  r  r  r   )r,   rg   r#   r.  rd  r  r   r  s           r    test_as_davenport_ndr  
  s    
))


"C2::cjjlj&CDEA;;=DZZRUUNOFVVF^F#''v(:;F+K774b7)D%%d6:%%d2

+ ,r"   c                    [         R                  " U 5      nX R                  :X  a  SOSn[        R                  R                  S5      nSn[        R                  " US45      nUR                  [        R                  * [        R                  U4S9US S 2S4'   [        U5       Vs/ s H#  otR                  S[        R                  /5      PM%     nnUR                  [        R                  * [        R                  U4S9US S 2S4'   UR                  S[        R                  SS9n	U R                  / S	Q5      n
U R                  / S
Q5      nU	 GH
  nU R                  [        R                  " X-  5      R                  U
5      5      nU R                  XU/SS9nX-
  US S 2S4'   S H  nUS:X  a  UOU R!                  USS9n[        R"                  " UXR                  XbS95      n[%        U(       + U 5         UR'                  UUUS9nS S S 5        UR)                  5       n[        R"                  " UUW5      nUR)                  5       n[+        UUUS9  M     GM     g s  snf ! , (       d  f       N`= f)Nro   r   r   rB   rS   rn  r   )rB   r  r  r   r   r  rj  r%   )r  rp   )r'   r(   r   r3   r]   r^   rA  r  r  rc   choicer*   r   r   rq  r   rs  r  r  r  r_   r   )r,   r  r&   rX   r   r  rd  ri   r  r  r  r  r  r  r  r  r  r   r  r  rot_estimatedr  s                         r    test_as_davenport_degenerater    s    b!EZZ'5TD ))


"C	AXXq!fF ;;BEE6QD;AF1a4L5:1X>XZZBEE
+XM>;;BEE6QD;AF1a4Lkkabee$k7G	K	 B	K	 BZZ,,TW5;;B?@((BB<a(0$+q!t/E![0bgggAg6NB))"eZZZ5TUC',=(=rB --&7 . 
 C ==?L$33BzJM)335ML-dC 0	  ? CBs   &*I8I$$
I2c           
         [         R                  " U 5      n[        R                  R	                  S5      nSn[        R
                  " US45      nXR                  :X  a  SOSnUR                  [        R                  * [        R                  U4S9US S 2S4'   UR                  S[        R                  U4S9US S 2S4'   UR                  [        R                  * [        R                  U4S9US S 2S4'   U R                  XAS	9nS
 H  n[        S5       H  nSR                  US   US   US   /5      nU R                  U V	s/ s H  n	[        U	5      PM     sn	US	9n
US:X  a  UR                  5       n[        R                  " X5      n[        R                   " XU5      n[#        UR%                  SS9UR%                  SS9US9  M     M     [         R&                  " U5      S S 2S4   R)                  [        R                  S-  5      nS
 H  n[        S5       H  nSR                  U5      nU R                  U V	s/ s H  n	[        U	5      PM     sn	US	9n
US:X  a  UR                  5       n[        R                  " X5      n[        R                   " XU5      n[#        UR%                  5       UR%                  5       US9  M     M     g s  sn	f s  sn	f )Nr   r[   rS   ro   r  rn  r   r   r%   r  r   r  rj  Tr   r\   )r'   r(   r3   r]   r^   rA  r   r  r  r*   r   r  r!   r  r   r   r  r   r+   r   subtract)r,   r&   r   r  rd  rW   r  r  r  ri   r  euldavs                r    &test_compare_from_davenport_from_eulerr  6  sX   b!E
))


"CAXXq!fF ZZ'5TD;;BEE6QD;AF1a4L;;1255t;<F1a4L;;BEE6QD;AF1a4LZZZ,F+%e,I''9Q<1y|DEC373aYq\37uEB#iik%%c2C))"V<CCKK$K7t9T!%' - , VVF^AqD!**255195F+%e,I'')$C373aYq\37uEB#iik%%c2C))"V<CCKKM3;;=tD - , 8 8s   K?Kc                    [         R                  R                  S5      nSn[         R                  " US45      nUR	                  [         R
                  * [         R
                  U4S9US S 2S4'   UR	                  S[         R
                  U4S9US S 2S4'   UR	                  [         R
                  * [         R
                  U4S9US S 2S4'   S H  n[        S5       H  nS	R                  US   US   US   /5      nU Vs/ s H  n[        U5      PM     nnUS
:X  a  UR                  5       n[        R                  " X`R                  U5      5      n	U	R                  U5      n
U	R                  U R                  U5      U5      n[        XSS9  M     M     US S 2S4==   [         R
                  S-  -  ss'   S H  n[        S5       H  nS	R                  U5      nU Vs/ s H  n[        U5      PM     nnUS
:X  a  UR                  5       n[        R                  " X`R                  U5      5      n	U	R                  U5      n
U	R                  U R                  U5      U5      n[        XSS9  M     M     g s  snf s  snf )Nr   r[   rS   rn  r   r   r  r   r  rj  ro   r\   )r3   r]   r^   rA  r  r  r   r  r!   r  r   r   r*   r  r  r   )r,   r   r  rd  r  r  r  ri   r  r   r  r  s               r    "test_compare_as_davenport_as_eulerr  [  s   
))


"CAXXq!fF ;;BEE6QD;AF1a4L;;1255t;<F1a4L;;BEE6QD;AF1a4L+%e,I''9Q<1y|DEC(+,1)A,B,#iik%%c::f+=>C,,s#C""2::b>59CC51 - , 1a4LBEEAIL+%e,I'')$C(+,1)A,B,#iik%%c::f+=>C,,s#C""2::b>59CC51 - , - -s   I8!I=c                    [         R                  " SS9n[        U5      S:X  d   e[         R                  " SS9n[        U5      S:X  d   e[         R                  " SS9/    n[        U5      S:X  d   e[         R                  " U R                  S5      5      n[        U5      S:X  d   e[         R                  " U R                  S5      5      n[        U5      S:X  d   e[         R                  " SU R                  S5      5      n[        U5      S:X  d   e[         R                  " U R                  S5      5      n[        U5      S:X  d   e[         R                  " U R                  S5      SU R                  S5      5      n[        U5      S:X  d   e[         R                  " U R                  S5      5      n	[        U	5      S:X  d   eg )	Nr   )r  rS   r   rA   r   rS   rS   r   r
  ri  )r   r]   rR  r  r)   r   r   r   r   r  r`   r=  )
r,   r#   r_ider_getr_quatr_matrixr_eulerr_vecr_davr_mrps
             r    test_zero_rotation_constructionr  ~  so    	AAq6Q;;!$Eu:??OO"2&Eu:?? 01Fv;!##BHHY$78Hx=A!!%&)9:Gw<1  &!12Eu:??##BFF1I{BHHV<LMEu:??bhhv./Eu:??r"   c                    [         R                  " U R                  S5      5      nUR                  5       R                  S:X  d   eUR                  5       R                  S:X  d   eUR                  S5      R                  S:X  d   eUR                  5       R                  S:X  d   eUR                  5       R                  S:X  d   eUR                  U R                  S5      S5      R                  S:X  d   eg )Nr  r  r   r
  rS   ri  )r   r)   r   r+   rd   r_   r  r  rE  r  r`   r|   s     r    !test_zero_rotation_representationr    s     	288F+,A99;&&&;;=)+++::e""f,,,;;=&(((88:v%%%>>"&&)[1776AAAr"   c                    [         R                  " U R                  S5      5      nU R                  / SQ5      nUR	                  U5      nUR
                  S:X  d   eU R                  S5      nUR	                  U5      nUR
                  S:X  d   eU R                  S5      n[        R                  " [        SS9   UR	                  U5        S S S 5        g ! , (       d  f       g = f)Nr  r  r
  r  r  r   )
r   r)   r   r*   rq  rd   r$  r   r   r   )r,   r#   r  r  v0v0_rotr  s          r    !test_zero_rotation_array_rotationr    s    288F+,A


9A
I??f$$$	&	BWWR[F<<6!!!	B	,
.	
. 
. 
.s   :C
C#c                    [         R                  " U R                  S5      5      n[         R                  " U R                  / SQ5      5      nX-  n[	        U5      S:X  d   eX!-  n[	        U5      S:X  d   e[         R                  " U R                  S5      5      nX-  n[	        U5      S:X  d   e[        [         R                  " S5      U 5      n[        R                  " [        SS9   XW-    S S S 5        [        R                  " [        SS9   Xu-    S S S 5        g ! , (       d  f       N5= f! , (       d  f       g = f)Nr  r   r   r   r  r   )
r   r)   r   r*   rR  r-   r]   r   r   r   )r,   r#   r_singler_mult_leftr_mult_rightr0r_multr  s           r    !test_zero_rotation_multiplicationr    s    288F+,A!!"**^"<=H,K{q   <L|!!!			BHHV,	-BVFv;!	*B	/B	z);	<
 
= 
z);	<
 
=	< 
=	< 
=	<s   *DD/
D,/
D=c                 b   [         R                  " U R                  S5      5      n[         R                  " X/5      n[	        U5      S:X  d   e[         R                  " U R                  / SQ5      5      nUR                  X1/5      n[	        U5      S:X  d   e[        [         R                  " S5      U 5      nUR                  XA/5      n[	        U5      S:X  d   e[        [         R                  " S5      U 5      nUR                  X/5      nUR                  X/5      n[	        U5      S:X  d   eg )Nr  r   r   r   rS   rA   )r   r)   r   r  rR  r*   r-   r]   r,   r#   r  r~  r   r4s         r    !test_zero_rotation_concatentationr    s    288F+,A			qf	%Br7a<<			BJJ~6	7B	
w	Br7a<<	*B	/B	
w	Br7a<<	*B	/B	
w	B	
w	Br7a<<r"   c                     [         R                  " U R                  S5      5      nS H  nX-  n[        U5      S:X  a  M   e   g )Nr  )rm  rs   r   r   r  r   )r   r)   r   rR  )r,   r#   pppow0s       r    test_zero_rotation_powerr    s<    288F+,A#u4yA~~ $r"   c                     [         R                  " U R                  S5      5      nUR                  5       n[	        U5      S:X  d   eg )Nr  r   )r   r)   r   r   rR  )r,   r#   r_invs      r    test_zero_rotation_inverser     s6    288F+,AEEGEu:??r"   c                     [         R                  " U R                  S5      5      nUR                  5       nUR                  S:X  d   eg )Nr  r   )r   r)   r   r  rd   )r,   r#   r  s      r    test_zero_rotation_magnituder    s8    288F+,AI??d"""r"   c                     [         R                  " U R                  S5      5      n[        R                  " [
        SS9   UR                  5         S S S 5        g ! , (       d  f       g = f)Nr  z+Mean of an empty rotation set is undefined.r   )r   r)   r   r   r   r   r  r|   s     r    test_zero_rotation_meanr    s@    288F+,A	z)V	W	 
X	W	Ws   A
A'c                 >   [         R                  " U R                  S5      5      n[         R                  " U R                  S5      5      nUR                  U5      R                  S:X  d   e[         R                  " U R                  / SQ5      5      nUR                  U5      R                  S:X  d   e[        [         R                  " 5       U 5      nUR                  U5      R                  S:X  d   eSn[        [         R                  " S5      U 5      n[        R                  " [        US9   UR                  U5        S S S 5        [        R                  " [        US9   UR                  U5        S S S 5        g ! , (       d  f       NB= f! , (       d  f       g = f)Nr  r  r   z/Expected broadcastable shapes in both rotationsr   r   )r   r)   r   rv   rd   r*   r-   r]   r   r   r   )r,   r#   r  r~  r  
approx_msgr   s          r    test_zero_rotation_approx_equalr    s&   288F+,A			BHHV,	-B>>"##t+++			BJJ~6	7B>>"##t+++	)2	.B??1##t+++BJ	*B	/B	z	4	r 
5 
z	4
 
5	4 
5	4 
5	4s   /E="F=
F
Fz	jax.numpyz.JAX out-of-bounds indexing deviates from numpyz"zero-length arrays have nan-shapesc                    [         R                  " U R                  S5      5      nXR                  / U R                  S9   n[        U5      S:X  d   eUS S n[        U5      S:X  d   e[        R                  " [        5         XR                  S/5           S S S 5        [        R                  " [        5         XR                  S/5           S S S 5        [        R                  " [        5         [         R                  " U R                  / SQ5      5      US'   S S S 5        g ! , (       d  f       N= f! , (       d  f       Nm= f! , (       d  f       g = f)Nr  r%   r   Tr0   )	r   r)   r   r*   boolrR  r   r   
IndexError)r,   r#   r  r_slices       r    test_zero_rotation_get_setr    s     	288F+,Ajj277j+,Eu:??eGw<1	z	"	**aS/ 
# 
z	"	**dV
 
# 
z	"!!"**\":;! 
#	" 
#	" 
#	" 
#	"s$   D%:D61+E%
D36
E
Ec                    [        [        R                  " S5      U 5      nXR                  / SQ5         n[	        U5      S:X  d   eXR                  / SQ5         n[	        U5      S:X  d   eXR                  / SQ5         n[	        U5      S:X  d   e[        R
                  " U R                  S5      5      nXR                  / SQ5         n[	        U5      S:X  d   eUR                  5       R                  S	:X  d   e[        R                  " [        5         XR                  S
S
/5           S S S 5        g ! , (       d  f       g = f)NrS   )FFFr   )FTFr   )TTTr'  )TFF)r   r   rA   T)r-   r   r]   r*   rR  r)   r$  r+   rd   r   r   r  r  s         r    test_boolean_indexesr  -  s    xq)2.A	
::+,	-Br7a<<	
::*+	,Br7a<<	
::()	*Br7a<< 	2779-.A	
::*+	,Br7a<<::<***	z	"	**dD\
"# 
#	"	"s   D77
Ec                 "   [        [        R                  " S5      U 5      n[        U5       H`  u  p#[	        U[        5      (       d   e[        UR                  5       X   R                  5       5        U[        U5      :  d  MW  [        S5      e   g )NrS   z&Iteration exceeded length of rotations)	r-   r   r]   rX  r>  r
   r+   rR  r  )r,   r#   ri   r_is       r    test_rotation_iterr  D  si    xq)2.AA,#x((((qt||~6s1v:GHH	 r"   c                     [        [        SSU-   5      S US-
   5      nU R                  US-   5      n[        R                  " U5      nUR
                  U:X  d   SUR
                   SU 35       eg )Nr   r   rM   zGot z, expected )rQ  rc   r$  r   r)   rd   )r,   rI   rd   r   r#   s        r    test_rotation_shaper  N  sl    %1t8$YdQh/0E7754< D4 A77e?tAGG9Kw??r"   c                      [         R                  " / SQ5      n SU R                  l        [        R
                  " U 5        g )N)r   r   r   r   F)r3   r4   r  	writeabler   r)   )rh   s    r    test_non_writeabler  V  s*    
 AAGGqr"   )r   r   numpyr3   numpy.testingr   scipy.spatial.transformr   r   $scipy.spatial.transform._rotation_cyspatial	transform_rotation_cyr6   $scipy.spatial.transform._rotation_xp_rotation_xpr7   scipy.statsr   	itertoolsr   r   
contextlibr	   r  scipy._lib._array_apir
   r   r   r   r   r   r   r   r   r   r   scipy._lib.array_api_extra_libarray_api_extrar'   r  r  lazy_xp_modulesr+   r)   
pytestmarkr!   r-   r1   r9   r=   rH   markparametrizerc   intrO   r_   rk   rz   r}   r   r   r   r   r   r   r`  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r!  r&  skip_xp_backendsr0  r6  r8  r;  r=  rC  rF  rH  rJ  rL  rE  rQ  rT  rW  rZ  r^  rb  re  rk  rv  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rv   r  r"  r%  r*  r  r3  r8  r?  rF  rI  rN  rO  rV  ri  rq  rz  r  r  r  r  r  r  __getitem__r  r  r  __setitem__r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r  r!  __init____call__r1  r3  r5  r6  r9  r;  r>  rA  rD  rI  rM  rP  rX  r^  rb  rd  rf  rk  __pow__rt  rx  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  __iter__r  r  r  r   r"   r    <module>r4     s      & 3 = = 9 9 + + %     ) (   U# "("2"2H4F4FG
Dh D
$A0 q!-0S 0 .0 8%%&D 'D.:(5
F. 8&&'O (O@0
> 8<<!1!12= 3=> q!-! ! .!
" 8%%&q!-
3# 
3 . '
3 8%%&, ',6 8%%&, ',> 8''(q!-	H 	H . )	H 8''( ) 8''););<@ =@
 8''););<3 =3$ 8''););<P =P2 8''););<< =< 8''););<& =&"
: 8''(5 )5 8''(q!-@ @ . )@ 8''(V )V 8''(> )>. 8''););<
: =
: 8''(5 )5 8''(
" )
" 8''(1 )1
 8''(q!--C - . )- 8%%&l%M  OWO 'W" 8%%&q!-4S 4 . '4 8''););<* =* 8''););<	 =	 8$$%q!-IC I . &I
: 8$$%5 &5 8$$%	E &	E 8$$%q!-* * . &* 8??#E $E 8&&8 9 8??#q!-.# . . $. 8$$hoo6J 7J 8&&') () 8&&'5 (5 8&&'q!-)# ) . () 8&&(:(:;* <* 8&&' ( 8&&(:(:;	2 <	2 8&&(:(:; <8 8&&(:(:; <6 8&&(:(:; <6 8&&(:(:; <6:2 8&&(9(9:l5&9:m43 5 ; ;38 8&&(9(9:l5&9:m43 5 ; ;36 
 
 8&&(:(:H<M<MNl5&9:m4,m<< = 5 ; O<< 8&&(:(:H<M<MNl5&9:m4,m<< = 5 ; O<> 8&&(9(9:q!-
9 
9 . ;
9 8%%x||4 0 5 0F 8<<!3!34/ 5/@ 8%%x||43 53 8%%x||4$ 5$ 8<<!3!34
@ 5
@ 8<<!3!34
@ 5
@ & 8%%&q!--S - . '- 8%%&2 '2 8<<!3!3X5J5JK	I L	I 8'')>)>?2 @2 8<<!3!3X5J5JK I L IF 8(()	 *	 8''8J8JKq!-	@ 	@ . L	@ 8''8J8JKq!-S  . L0 8==("4"458 68* 8''%%'q!-I I .'I, 8==! "8 8??#( $( 8??# $ 8??HLL(2D2DE6 F6> 8''8A 9A: 8''8q!-: : . 9:0 8''8q!-: : . 9:D 8''8q!-9C 9 . 998 8>>"  # "/ 8>>"$ #$ 8''););X=Q=QRq!-Y3 Y . SY 8''(8 )8
 8'')=)=x?Q?QR	D S	D 8''(< )< 8''(5 )5 8''(3 )3 8''( ) 8''(! )!&&2 8))8+=+=>M ?M 8>>8#9#9:
M ;
M 8))8>>:M ;M 8))*
4 +
4 8))8+=+=>  ?  8>>8#7#79O9OP#9 Q#9L 8))*Q% +Q%h 8))8+=+=x~~N!> O!>H 8))8+=+=>B ?BB 8))8+=+=>> ?>0 8))8+=+=x~~''););X=O=OQ'BQ'BT 8))8>>:> ;>"	) 8>>8#9#9:0 ;0
::* 5>>5>>2,/ 3,/^ 5>>" # G  5>>" # 5>>" # 5>>" # 5>>" # 5>>" # 5>>" # 5>>"
 #
 5>>"
 #
 5>>5>>2
 3
 5>>5>>2 30 5>>5>>83F3F%%'G'G 8##$+ %+ 8##$+ %+8 8##$ % 8##$H %H 8<<!1!18<<ASAS''););=q!-:9s :9 .=:9z 8##$$ %$&> 8%%&0%I  KFK 'F 8%%&0%I  K?K '?+ 8''(: ):2 8''(- )- 8''(' )'  & 8**+) ,) 8'')@)@AR BR@ 8**+q!-5 5 . ,5< 8**+/ ,/ 8**+G ,G::$ 8**H,A,ABI CI0 8**H,A,AB, C, 8**H,A,A8CUCUV,m<"D = W"DJ 8&&(?(?@!E A!EH 8&&(9(98;P;PQ2 R2D 8'')<)<h>R>R**H,=,=??: 8%%x'8'8(:L:L??H$9$9;B;B 8>>" #" 8##$ %, 8''( )( 8##$ % 8<<  ! 8%%&# '# 8==! " 8(() *$ k%U  Wl3WX< YW<& 8''($ )$, 8$$%I &I q!-@# @ .@r"   