
    -iVT                    (   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
r
  S SKJrJr  S SK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\R8                  R;                  SS9rS	 rS
\4S jr S r!S r"S r#S r$S r%S r&S r'S r(S r)S r*S r+S r,S r-S r.S r/S r0S r1S r2S r3S r4S  r5S! r6S" r7S# r8S$ r9S% r:S& r;S' r<S( r=S) r>S* r?S+ r@S, rAS- rBS. rCS/ rDS0 rES1 rFS2 rGS3 rHS4 rIS5 rJS6 rKS7 rLS8 rMS9 rNS: rOS; rPS< rQS= rRS> rSS? rTS@ rUSA rVSB rWSC rXSD rYSE rZSF r[SG r\SH r]SI r^\R8                  R                  SJ\" SK5      5      \R8                  R                  SLSM5      SN 5       5       r`\R8                  R                  SJ\" SK5      5      \R8                  R                  SLSM5      SO 5       5       ra\R8                  R                  \R8                  R                  SJ\" SK5      5      \R8                  R                  SLSM5      SP 5       5       5       rc\R8                  R                  \R8                  R                  SJ\" SK5      5      \R8                  R                  SLSM5      SQ 5       5       5       rd\R8                  R                  \R8                  R                  SJ\" SK5      5      \R8                  R                  SLSM5      SR 5       5       5       reSS rfST rgSU rhSV riSW rjSX rkSY rlSZ rmS[ rn\R8                  R                  S\ 5       roS] rpS^ rqS_ rrS` rsSa rtSb ruSc rvSd rwSe rxSf rySg rzSh r{Si r|Sj r}Sk r~Sl rSm rSn rSo rSp rSq rSr rSs rSt rSu rSv rSw rSx rSy rSz rS{ rS| rS} rS~ rS rS rS rS rSrS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r\R8                  R                  S 5       rS rS rS rS rS rS rS rS rS rS rS rS rS rS rg)    N)assert_equal)RotationSlerp)special_ortho_group)permutationsproduct)xp_assert_equalis_numpyis_lazy_arrayxp_vector_normxp_assert_closeeager_warnsxp_default_dtypeT)np_onlyc                 @    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    ^/var/www/html/venv/lib/python3.13/site-packages/scipy/spatial/transform/tests/test_rotation.py	basis_vecr      s.    s{		 
    rc                 h    [         R                  " UR                  U R                  5       5      5      $ )N)r   	from_quatasarrayas_quat)r   xps     r   rotation_to_xpr%   %   s"    bjj566r   c                  4    [        S5        [        / SQ5        g )Nr   r   r   r   )r   r   r   r   test_init_non_arrayr(   )   s    \\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_matrixr3   .   sN    


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

SED6?33MAIIK/r   c                     U R                  / SQ5      n[        R                  " U5      nUS-  n[        UR	                  5       U5        g Nr*   r-   r0   r1   s       r   test_from_single_1d_quaternionr6   5   s9    


>"A1AEMAIIK/r   c                     U R                  / SQ/5      n[        R                  " U5      nUS-  n[        UR	                  5       U5        g r5   r0   r1   s       r   test_from_single_2d_quaternionr8   <   s<    


N#$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   r   r   r   Tscalar_first   V瞯<缉ؗҜ<rtolatol
   r   )rD   r   r   d   r,   r   r   .rA   )nprandomRandomStater   r!   r"   r   	as_matrixeyetilerandnr   rangeshaperollr#   r$   rngr   qiqis         r   test_from_quat_scalar_firstrV   C   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g N{   rR   -q=rB   r=   )	rG   rH   default_rngr   r!   r#   tolistapprox_equalallrR   
r_expectedr   s      r   test_from_quat_array_likerc   Z   s    
))


$CS)J:--/6689A""15"111 ,J:--/6689A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#   dtyper   r$   r   s     r   test_from_quat_int_dtyperg   g   s;    2::l34A99; 0 4444r   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   xyzr=   Tr;   )      ?r   r   r   r>   r?   r@   )rD   r=   rC   rE   r,   r   r   .rF   )	canonicalr<   rk   )rG   rH   rI   r   
from_eulerzerosr   r#   r"   rL   rM   r   rN   rO   r!   rP   rQ   s         r   test_as_quat_scalar_firstro   l   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   r,   r-   r   r.   r   r'   )rr   rr   r   r   r   r   rr   rr   rr   rr   rr   r/      r      r0   r1   s       r   test_from_square_quat_matrixrw      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 )
N)      r   r   r   )r   rr   r   r   )r   r   rr   r   rs   rt   r   r   Trl   )r"   r   r!   absr   r   r#   r1   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 )N)        r   r   rr   Frl   )rj   r   r   r   rv   )ry   r   r   r   )rj   r   r   rr   )ry   r   r   rr   r}   r   r   r   gؗҬ<r\   )	r"   r   r!   r	   r#   mathsqrtr   inv)r$   rS   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                 4   [         R                  " [        SS9   [        R                  " U R                  / SQ5      5        S S S 5        [         R                  " [        SS9   [        R                  " U R                  / SQ/ SQ/5      5        S S S 5        [         R                  " [        SS9   [        R                  " U R                  / SQ// SQ//5      5        S S S 5        g ! , (       d  f       N= f! , (       d  f       No= f! , (       d  f       g = f)NzExpected `quat` to have shapematchr   rv   r=   )r   rv   r=   r,   r-   )r,   r-            r   rv   r=   r,   )r,   r-   r   r   )pytestraises
ValueErrorr   r!   r"   r$   s    r   test_from_quat_wrong_shaper      s    	z)H	I2::i01 
J 
z)H	I2::'  	 
J 
z)H	I2::NN'  	 
J	I 
J	I 
J	I 
J	Is#   (C'#,C80.D	'
C58
D	
D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)r=   r,   r   r   )r   r   r   r   rq   r   .)
r"   r   r`   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[        R                  " U5      R                  5       n[	        X R                  S5      5        g )Nr'   r=   )r"   r   r!   rJ   r   rK   )r$   quatmats      r   #test_as_matrix_single_1d_quaternionr      s9    ::l#D


T
"
,
,
.CC#r   c                     U R                  / 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5        g )Nr   r   r   r   r   r=   r=   r}   rr   r   r   r   r   .r"   r   r!   rJ   r   rO   r   )r$   r   r   expected_mats       r   #test_as_matrix_single_2d_quaternionr      se    ::|n%D


T
"
,
,
.CI&::
 L
 CK.r   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5        U R                  / S
Q/ SQ/ SQ/5      n[        US   U5        [        US   U R                  S5      5        [        US   U R                  S5      5        g )Nr   r   r   r   r   r'   rs   )r,   r=   r=   r   r   r   r   r}   r   r   r   rr   r   r   r   rv   .r=   r=   .)r"   r   r!   rJ   r   rO   r   rK   )r$   quatsr   	expected0	expected1s        r    test_as_matrix_from_square_inputr      s    JJ	 E 

U
#
-
-
/CI&

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


 I
 CK+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5        U R                  / S	Q/ S
Q/ SQ/5      n[        US   U5        U R                  / SQ/ SQ/ SQ/5      S-  n[        US   U5        g )Nr   r   r   )r=   r=   r=   r   r   r   r   r   r   r   r   )皙?g@)gffffff@r   r   )rr   rv   rv   r=   r   r   )r$   r   r   r   r   	expected2s         r   !test_as_matrix_from_generic_inputr     s    JJ E
 

U
#
-
-
/CI&

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

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


  	I
 CK+r   c                     U R                  / SQ/ SQ/ SQ/5      nU R                  / SQ5      n[        [        R                  " U5      R	                  5       U5        g Nr   r   r   )      ?r   r   r   r"   r   r   from_matrixr#   r$   r   r2   s      r   test_from_single_2d_matrixr   6  sM    
** C
 JJ34MH((-557Gr   c                     U R                  / SQ/ SQ/ SQ//5      nU R                  / SQ/5      n[        [        R                  " U5      R	                  5       U5        g r   r   r   s      r   test_from_single_3d_matrixr   @  sU    
**
  C
 JJ 456M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>)rj   r   r   r   '   )3~˷g6iпnzo?)r   r   6i?)r   r   g3~˷?r\   r   r   r,   )r"   r   r   r   r   r   r#   reshape)r$   rB   r2   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 )Nr=   rD   r   )sizerandom_state)r"   r   rvsr   r   r   rJ   r$   r   s     r    test_matrix_calculation_pipeliner   X  s>    
**(,,QRaH
ICH((-7793?r   c                 N   Sn[         R                  R                  S5      nU R                  UR	                  S5      5      nU R
                  R                  U5      n[        UR                  S   5       H<  nXE   S:  d  M  [        R                  " U5      US4   R                  X5S4   * 5      nM>     [        R                  " U5      R                  5       nU R                  X`R!                  U5      5      nU R#                  S5      U R%                  S5      -   n['        XxUS9  g )Nr[   r   )rE   r=   r=   .r=   r\   )rG   rH   rI   r"   random_samplelinalgdetrN   rO   xpxatsetr   r   rJ   matmulmatrix_transposern   rK   r   )	r$   rB   rndr   detsrT   	ortho_matmult_resulteye3ds	            r   test_from_matrix_ortho_outputr   ]  s    D
))


"C
**S&&{3
4C99==D4::a=!7Q;&&+af%))3#v;,7C " $$S)335I))I':':9'EFKHH[!BFF1I-EKT2r   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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  g )Nr   r   r   r   r   )5_%?gx'?r}   )gx'ܿr   r}   )r}   r}   rj   ư>r\   )r         r   )r   r   r   )r   r   r   r   r   )r"   r   r   r   rJ   )r$   r   expecteds      r   test_from_matrix_normalizer   n  s    
** C zz5557 8H H((-7798$O
** C zz<'') *H H((-7798$Or   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)Nr=   r   r   r   zNon-positive determinantr   rr   )rK   r   r   r   r   r`   r   r   r   rJ   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 rX   )	rG   rH   r]   r   r   rJ   r^   r_   r`   ra   s      r   test_from_matrix_array_liker         
))


$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#   re   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                  / SQ5      n[        R                  " U5      n[        UR	                  5       X1S9  g NHz>r   )gJ?r   r   g<(?r\   r"   r   from_rotvecr   r#   r$   rB   rotvecr2   results        r   test_from_1d_single_rotvecr     sE    DZZ	"FJJ;<M!!&)FFNN$m?r   c                     SnU R                  / SQ/5      nU R                  / SQ/5      n[        R                  " U5      n[        UR	                  5       X1S9  g r   r   r   s        r   test_from_2d_single_rotvecr     sJ    DZZ$FJJ <=>M!!&)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   rv   rv   r   rr   r   r   r   r   )g.pG?cU(G?r   gQH?)gNZ]O?gNZ]OݿgNZ]O?g0i?r'   r\   )r"   r   r   r   r#   )r$   rB   r   r2   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@?r=   gMb@)皙?g333333?r   r   r   r=   rj   r   r   r   r   r   r=   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 rX   )	rG   rH   r]   r   r   	as_rotvecr^   r_   r`   ra   s      r   test_from_rotvec_array_liker     r   r   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#   re   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?r=   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   rv   r   r   r   r   r   r"   r   s    r   test_malformed_1d_from_rotvecr    s9    	z)K	LRZZA/0 
M	L	L   (A
Ac                     [         R                  " [        SS9   [        R                  " U R                  / SQ/ SQ/5      5        S S S 5        g ! , (       d  f       g = f)Nr  r   r   r-   r   r   r   r  r   s    r   test_malformed_2d_from_rotvecr     sB    	z)K	LRZZ)  	 
M	L	L   ,A
Ac           	      r   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                  X!S S 2S S24   5      U R                  S
5      SS9  g )Nr   rv   rr   r   r   rr   r   ga2U0*3?r'   rr   T)r   keepdimsr   r=   rv   )r=   r=   r>   r\   )
r"   r   r   r!   r   r   cosr   crossrn   )r$   r   r   angles       r   test_as_generic_rotvecr    s    :: D
 	N4b488D%//1F6+EDAJuqy 12BIIOOFBQBK8"((6:JQVWr   c                     U R                  / SQ5      nU R                  / SQ5      n[        R                  " U5      R                  5       n[	        UR
                  S5        [        X25        g )Nr   rv   rv   gj*0	x?g$x?g:2(r=   r"   r   r!   r   r   rO   r   r$   r   expected_rotvecactual_rotvecs       r   test_as_rotvec_single_1d_inputr(    sP    ::m$Djj!CDO&&t,668M$$d+M3r   c                     U R                  / SQ/5      nU R                  / SQ/5      n[        R                  " U5      R                  5       n[	        UR
                  S5        [        X25        g )Nr   r"  r   r$  r%  s       r   test_as_rotvec_single_2d_inputr*  !  sU    ::}o&Djj"D!EFO&&t,668M$$f-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  rr   r   g      ^@r   r   r   rv   )r"   r   r   r   r   r   )r$   r   rotr   r  s        r   test_as_rotvec_degreesr-  +  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   rr   rv   )ga2U0*3gǺ6?ga2U0*?Tr  )r"   r   r   r   r   )r$   r   s     r   test_rotvec_calc_pipeliner0  6  sg    ZZ
 F
 H((0::<fEH((>HHQUHVr   c                     U R                  / SQ5      nU R                  / SQ5      n[        R                  " U5      n[        UR	                  5       USS9  g )Nr   r   rj   r}   r   r   r   r[   r\   r"   r   from_mrpr   r#   r$   mrpr2   r   s       r   test_from_1d_single_mrpr8  B  sA    
**[
!CJJ~.Ms#FFNN$m%@r   c                     U R                  / SQ/5      nU R                  / SQ/5      n[        R                  " U5      n[        UR	                  5       U5        g )Nr2  r3  r4  r6  s       r   test_from_2d_single_mrpr:  I  sD    
**k]
#CJJ/0Ms#FFNN$m4r   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 rX   )	rG   rH   r]   r   r5  as_mrpr^   r_   r`   ra   s      r   test_from_mrp_array_liker=  P  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   r5  r#   re   r   )r$   r7  r   s      r   test_from_mrp_int_dtyper?  ]  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ߨӉؿr'   )r"   r   r   r5  r#   )r$   r7  r2   s      r   test_from_generic_mrprA  c  s\    
** C JJ:  M H%%c*224mDr   c                     [         R                  " [        SS9   [        R                  " U R                  SS/5      5        S S S 5        g ! , (       d  f       g = f)NExpected `mrp` to have shaper   r   rv   r   r   r   r   r5  r"   r   s    r   test_malformed_1d_from_mrprE  o  s9    	z)G	H"**aV,- 
I	H	Hr  c                     [         R                  " [        SS9   [        R                  " U R                  / SQ/ SQ/5      5        S S S 5        g ! , (       d  f       g = f)NrC  r   r   r  rD  r   s    r   test_malformed_2d_from_mrprG  t  sB    	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  r'   r   r   )gQUU?gvWUU?QUUտ)uFx?guFxrJ  r   )r"   r   r   r   r!   r<  )r$   r   expected_mrps      r   test_as_generic_mrprL  |  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 )	Nrv   r,   r}   r   ri   )i  r   r   Tr  )r"   r   tanr  r   r   rm   r<  )r$   rK  s     r   test_past_180_degree_rotationrO    s`     ::Q 77a@ALE2::k#:DIPPRr   c                     U R                  / SQ5      nU R                  / SQ5      n[        R                  " U5      R                  5       n[	        UR
                  S5        [        X25        g )Nr   g?g?gO޿r#  r"   r   r!   r<  r   rO   r   r$   r   rK  
actual_mrps       r   test_as_mrp_single_1d_inputrU    sP    ::m$D::CDL##D)002J!!4(J-r   c                     U R                  / SQ/5      nU R                  / SQ/5      n[        R                  " U5      R                  5       n[	        UR
                  S5        [        X25        g )Nr   rQ  r   rR  rS  s       r   test_as_mrp_single_2d_inputrW    sU    ::}o&D::DEFL##D)002J!!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?rI  )r"   r   r   r5  r<  )r$   rT  rK  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   rv   )r   rm   r"   r#   r   r   r   )r$   r   r2   s      r   test_from_euler_single_rotationr^    sJ    sBJJrNDAIIKDJJ~.1=M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   rm   r"   rJ   r   )r$   	extrinsic	intrinsics      r   (test_single_intrinsic_extrinsic_rotationrd    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  )r   r=   lowhighr   rr   r   ri   Tr  ZYX)
rG   rH   rI   r"   randintflipr   rm   r#   r   )r$   r   abr   r   s         r   test_from_euler_rotation_orderrn    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 )
Nr[   zxr\  Tr  r   r   r   rr   r   r\   ra  )r$   rB   r   r   s       r   -test_from_euler_elementary_extrinsic_rotationrr    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      <   -   ru  rv  ru  rw  ru  rv  ZXYTr  r   )g# ?      пgΙ6d?)g$+H?+Pz?Ppƿ)gPpֿ+Pz?gPp?r\   r   )g+a?r{  (s=?)r  r|  g&(ٿ)r{  r~  r|  r   )ga}@?gF6g^@?)g0	8?gF6?g4?)      r   r|  r"   r   rm   rJ   r   )r$   rB   anglesr   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 )Nrt  rx  ry  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$   r  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 )Nrt  rx  ry  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 )Nrt  rx  ry  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  *  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 )NrY   ri   rZ   r[   r\   r=   )	rG   rH   r]   r   rm   as_eulerr^   r_   r`   )rR   orderrb   r   s       r   test_from_euler_array_liker  E  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 )
NrY   Lr  )rg  rh  r   Tr  r[   r\   )rG   rH   r]   uniformr   rm   floatr_   )rR   degrb   r   s       r   test_from_euler_scalarr  S  sm    
))


$C
++$S+
)C$$S#t<JCsT:A""15"111r   	seq_tupleri   rc  )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	UR                  U5      n
[        XiSS	S
9  [        XjSS	S
9  U" X-
  SS5        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hypotr`   rz   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     r=   rf  rv   r    r[   rB   rA   r>   +=rG   rH   rI   emptyr  r  r"   joinupperr   rm   r  _as_euler_from_matrixr   r$   r  rc  r  r   nr  seqrotationangles_quat
angles_mats   `          r   test_as_euler_asymmetric_axesr  [  sI   % ))


"CAXXq!fF;;BEE6QD;AF1a4L;;BEE6A:BEEAIQD;IF1a4L;;BEE6QD;AF1a4LZZF
'')
C iik""3/H##C(K //4JFae<FQU;{#UE2z"E51r   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	UR                  U5      n
[        XiSS	S
9  [        XjSSS
9  U" X-
  SS5        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  r=   rf  r   rv   r  gvIh%<=r  &.>r?   r  r>   r  r  s   `          r   test_as_euler_symmetric_axesr    sL   % ))


"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//4JFae<FQT:{#UE2z"E51r   c                    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                  " XTSS9nUR                  5       n[        U[        S	S
9   UR                  USS9nS S S 5        [        R                  " UWSS9R                  5       n	[        XyUS9  g ! , (       d  f       N== f)Nr[   rw  r\  #   r     r  r\     r  r     r  Tr  Gimbal lockr   r\   
r"   r  r  r   rm   rJ   r   UserWarningr  r   
r$   r  rc  rB   r  r  r  mat_expectedangle_estimatesmat_estimateds
             r   (test_as_euler_degenerate_asymmetric_axesr    s     D ZZ	 F '')
C iik""3=H%%'L 
\;m	D"++C+> 
E''_dKUUWMLd;	 
E	Ds   <C
Cc                    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                  " XTS	S
9nUR                  5       n[        U[        SS9   UR                  US	S
9nS S S 5        [        R                  " UWS	S
9R                  5       n	[        XyUS9  g ! , (       d  f       N== f)Nr[   r  r   rv  r  r   K   rv  r  r  r  r  r  r  r   r   Tr  r  r   r\   r  r  s
             r   'test_as_euler_degenerate_symmetric_axesr    s     D ZZ	 F ''9Q<1y|<
=C iik""3=H%%'L 
\;m	D"++C+> 
E''_dKUUWMLd;	 
E	Ds   C
Cc                    U R                  / SQ/ SQ/ SQ/ SQ/5      nSR                  U5      nU(       a  UR                  5       n[        R                  " XCSS9n[        U[        SS	9   UR                  USS9nUR                  USS9nS S S 5        [        WS S 2S
S/4   WS S 2S
S/4   S
SS9  [        US S 2S4   US S 2S4   S
SS9  U R                  / SQ/ SQ/ SQ/ SQ/5      nUS S 2S4   S
:H  nSR                  US
   US   US
   /5      nU(       a  UR                  5       n[        R                  " XCSS9n[        U[        SS	9   UR                  USS9nS S S 5        [        U[        SS	9   UR                  USS9nS S S 5        [        US S 2S
S/4   US S 2S
S/4   S
SS9  [        Xh) S4   Xx) S4   S
SS9  [        XhS4   XxS4   SS9  g ! , (       d  f       GNQ= f! , (       d  f       N= f! , (       d  f       Ny= f)Nr  r  r  r  r  Tr  r  r   r   rv   r[   r  r   r   r  r  r  r  r   r\   )
r"   r  r  r   rm   r   r  r  r  r   )	r$   r  rc  r  r  r,  estimates_matrixestimates_quatidxs	            r   +test_as_euler_degenerate_compare_algorithmsr    s+    ZZ	 F '')
C iik


c4
8C	S+]	;44S$4Gc48 
< QF#^A1vI%>QU $QT*N1a4,@qtT ZZ	 F A,!
C ''9Q<1y|<
=C iik


c4
8C	S+]	;44S$4G 
<	S+]	;c48 
<QF#^A1vI%>QU q!>$'#: a .a"8tS 
<	;: 
<	;	;	;s$   *!GG'4G8
G$'
G58
Hc                    Sn[         R                  R                  S5      nSn[        R                  " X2S9n[        R                  " U R                  UR                  5       5      5      nUR                  5       nUR                  5       nUR                  5       nU R                  [         R                  " SXg5      5      nU R                  [         R                  " SXv5      5      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  g )	Nr[   r   rD   )numr   z...ij,...jk->...ikr=   .r\   )rG   rH   rI   r   r!   r"   r#   r   rJ   einsumr  r   r   r   rK   r   )r$   rB   r   r  prS   p_matq_matresult1result2r   s              r   test_invr    s    D
))


"C
AA0A2::aiik23A	AKKMEKKMEjj#7FGGjj#7FGGHHaAYEFF5M#rr2A2+&**266!95EG.G.r   c                    Sn[         R                  R                  S5      n[        R                  " US9n[        R                  " U R                  UR                  5       5      5      nUR                  5       nUR                  5       nUR                  5       n[         R                  " XV5      n[         R                  " Xe5      nU R                  S5      n	[        XyUS9  [        XUS9  [        R                  " SUS9n
[        R                  " U R                  U
R                  5       5      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 )
Nr[   	   #;h29s+,g0Hn rZ   r=   r\   r   )r  rR   r   .)rG   rH   r]   r   r!   r"   r#   r   rJ   dotrK   r   r   r   r  r   r   r   )r$   rB   rR   r  rS   r  r  res1res2rK   r   r   x_matrixy_matrixr  r  r   s                    r   test_inv_single_rotationr  4  sx   D
))

 G
HCC A2::aiik23A	AKKMEKKME66%D66%D
&&)CDD)DD)A3'A2::aiik23A	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      n[         R                  " U R                  UR	                  5       5      5      nU R                  U5      n[        UR                  5       U5        [        UR                  5       R                  5       U5        g )NrD   )	r   identityr!   r"   r#   rn   r   	magnituder   )r$   r  r   r   s       r   test_identity_magnituder  U  sl    
A!A2::aiik23Axx{HAKKM8,AEEG%%'2r   c                    [         R                  " U R                  [         R                  " 5       R	                  5       5      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  r   rf   s     r   test_single_identity_magnituder   ^  s^    2::h&7&7&9&A&A&CDEA;;=A557!###r   c                    SnSn[         R                  " USS9n[         R                  " U R                  UR	                  5       5      5      n[         R                  " U R                  [         R
                  " U5      R	                  5       5      5      nX4-  n[        UR	                  5       UR	                  5       5        XSR                  5       -  n[        UR                  5       U R                  U5      US9  g Nr[   rD   r   rZ   r\   
r   rH   r!   r"   r#   r  r   r   r  rn   r$   rB   r  r  rS   r   s         r   test_identity_invariancer  d  s    D
Aq!A2::aiik23A2::h&7&7&:&B&B&DEFAUFAIIK!12eegFF$$&$?r   c                    SnSn[         R                  " USS9n[         R                  " U R                  UR	                  5       5      5      n[         R                  " U R                  [         R
                  " 5       R	                  5       5      5      nX4-  n[        UR	                  5       UR	                  5       5        XSR                  5       -  n[        UR                  5       U R                  U5      US9  g r  r  r  s         r   test_single_identity_invariancer  q  s    D
Aq!A2::aiik23A2::h&7&7&9&A&A&CDEAUFAIIK!12eegFF$$&$?r   c           	         [         R                  " U R                  S5      5      nUR                  5       n[	        X R                  U R                  U R                  U R                  S/5      5        [         R                  " U R                  S5      * 5      nUR                  5       n[	        X R                  U R                  U R                  U R                  S/5      5        g )Nr,   r   )r   r!   rK   r  r   r"   r  r$   r   r   s      r   test_magnituder
    s    266!9%A[[]FFJJruubeeQ'?@ABFF1I:&A[[]FFJJruubeeQ'?@Ar   c                     [         R                  " U R                  S5      5      nUS   R                  5       n[	        X R
                  5        US   R                  5       n[	        US5        g )Nr,   r   r=   r}   )r   r!   rK   r  r   r  )r$   r   r  r  s       r   test_magnitude_single_rotationr    sP    266!9%AdnnGGUU#dnnGGS!r   c                 *   [         R                  R                  S5      n[        R                  " SUS9n[        R                  " SUS9n[        R                  " U R                  UR                  5       5      5      n[        R                  " U R                  UR                  5       5      5      nX#R                  5       -  nUR                  5       nU R                  [         R                  " U5      5      n[        UR                  X65      XV:  5        g )Nr  rD   rZ   )rG   rH   r]   r   r!   r"   r#   r   r  medianr	   r_   )r$   rR   r  rS   r   r_magrB   s          r   test_approx_equalr    s    
))

 G
HC$A$A2::aiik23A2::aiik23A	EEGAKKME::bii&'DANN1+el<r   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   r  r,   r=   r   绽|=r\   r   T)rB   r  zatol must be setr   r  )	r   r   r"   r!   rK   r_   r   warnsr  )r$   r  rS   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                    U R                  U R                  S5      * U R                  S5      45      n[        R                  " [        R                  " S5      * [        R                  " S5      45      nU R	                  SU R
                  S-  S5      nU HB  n[        R                  " X1-  5      n[        UR                  5       R                  5       SSS9  MD     g )Nr=   r   rv   rE   r}   r  r\   )concatrK   rG   concatenatelinspacer  r   r   r   r  r  )r$   axesthetastr   s        r   	test_meanr    s    99rvvayj"&&),-D>>BFF1I:rvvay12D[[BEEAIs+F  ***,c> r   c                    U R                  / SQ/ SQ/ SQ/5      nU R                  SU R                  S-  S5      nU H  n[        R                  " X1S S2S4   -  5      nUR                  SS/S9n[        R                  " X1-  5      nUR                  5       n[        XuR                  5       -  R                  5       S	S
S9  M     g )N)r}   r   r   r   r   rv   rE   .r   weightsr}   r  r\   )	r"   r  r  r   r   r  r   r   r  )r$   r  r  r  rwmwr   ms           r   test_weighted_meanr#    s    ::{Iy9:D[[BEEAIs+F!!!2A2s7m"34WWaVW$  *FFHVVX002CeD r   c                    [         R                  " U R                  S5      5      n[        UR	                  5       5      (       aK  UR                  U R                  S5      * S9n[        U R                  UR                  5      5      (       d   eg [        R                  " [        SS9   UR                  U R                  S5      * S9  S S S 5        g ! , (       d  f       g = f)Nr,   r  znon-negativer   )r   r!   rK   r   r#   r  onesr`   r   _quatr   r   r   )r$   r   r"  s      r   test_mean_invalid_weightsr'    s    266!9%AQYY[!!FFBGGAJ;F'288AGG$%%%%]]:^<FFBGGAJ;F' =<<s   ( C
Cc                     [         R                  " U R                  / SQ5      5      nUR                  SS9n[	        U[         5      (       d   eg )Nr}   r}   r}   rj   Freturn_indices)r   r!   r"   reduce
isinstancer	  s      r   test_reduction_no_indicesr.    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 )Nr)  Tr*  r=   )r   r!   r"   r,  typetuplelen)r$   r   r   reduced	left_best
right_bests         r   test_reduction_none_indicesr6    sr    2::&:;<AXXTX*F<5   v;!%+"G
r   c           	         Sn[         R                  R                  S5      n[        R                  " U R                  [        R                  " SUS9R                  5       5      5      n[        R                  " U R                  [        R                  " SUS9R                  5       5      5      n[        R                  " U R                  [        R                  " SUS9R                  5       5      5      nUR                  X4SS9u  pgn[         R                  " [        U5      [        U5      [        U5      45      n	[        U5       H]  u  p[        U5       HI  u  p[        U5       H5  u  p[         R                  " X-  U-  R                  5       S	   5      XX4'   M7     MK     M_     [         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 )Nr[   r  r-   rZ   rD   r   Tr*  r=   r   r   rr   r   r\   )rG   rH   r]   r   r!   r"   r#   r,  rn   r2  	enumeraterz   r   moveaxisrO   argmaxr`   r   r  r   )r$   rB   rR   lr   r  r3  r4  r5  scalarsrT   lijpjkrkmax_indleft_best_checkright_best_checkreduced_checkmags                        r   !test_reduction_scalar_calculationrG    s6   D
))

 G
HC2::hooaS&A&I&I&KLMA2::hoobc&B&J&J&LMNA2::hooaS&A&I&I&KLMA%&XXa4X%H"G
 hhAAA/0G1q\EA"1#%6627R<*@*@*B1*E#F1  & "  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                 &   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5      nU R                  USS9nU R                  / SQ5      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5      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   rr   r   r   r   r   r   )rj   rv   r=   g       r   r=          @rr   r=   Tinverser"   r   r   expand_dimsr   apply)
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    sU   
** C
 $Ds ;<D::k"D>>$Q>'D**\*K..1.5KDJJt$k2DJJt$k2DJJt$k2DJJt$k2**\*K..1.5KDJJtTJ2K@DJJtTJ2K@DJJtTJ2K@DJJtTJ2K@r   c                 
   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/ SQ/5      nU R                  / SQ/ S	Q/5      n[	        UR                  U5      U5        [	        UR                  U5      U5        U R                  / S
Q/ SQ/5      n[	        UR                  USS9U5        [	        UR                  USS9U5        g )NrI  r   r   r   r   r   r,   r-   r   rJ  )r,   r   rK  )r-   r   TrM  rO  )r$   r   r1r2v	v_rotated	v_inverses          r   *test_apply_single_rotation_multiple_pointsrd    s    
** C
 
		c	"B			bnnSqn9	:B


Iy)*A

L*56IBHHQK+BHHQK+

L*56IBHHQH-y9BHHQH-y9r   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 R                  / S	Q5      nU R                  USS
9nU R                  / SQ/ SQ/5      n[        UR                  U5      U5        [        UR                  U5      U5        U R                  / SQ/ SQ/5      n[        UR                  USS9U5        [        UR                  USS9U5        g )Nrv   r=   r=   rI  r   r   r   rq  r   r   r   r   rJ  )r   r!  rv   rK  )r   r=   r   TrM  )	rG   r  arrayr"   r   r   rP  r   rQ  )r$   r   r   v1v2rb  rc  s          r   *test_apply_multiple_rotations_single_pointrj  *  s	   
((9
CXX CF
 XX CF
 **S/CS!A	I	B		#B

L*56IAGGBK+AGGBK+

L*56IAGGBG-y9AGGBG-y9r   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 R                  / S	Q/ S
Q/5      nU R                  / SQ/ SQ/5      n[        UR                  U5      U5        U R                  / SQ/ SQ/5      n[        UR                  USS9U5        g )Nrf  rI  r   r   r   rq  r   r   r   r\  rJ  )r,   ir-   rK  )r,   r   r]  TrM  )rG   r  rg  r"   r   r   r   rQ  )r$   r   r   ra  rb  rc  s         r   -test_apply_multiple_rotations_multiple_pointsrl  G  s    
((9
CXX CF
 XX CF
 **S/CS!A


Iy)*A

L*56IAGGAJ	*

L*56IAGGAtG,i8r   c                 X   U R                  / SQ5      nU R                  U/5      nU R                  X/5      nU R                  S5      nU R                  U/5      nU R                  XD/5      n[        XEU/XU/5       H  u  px[        R                  " U5      n	UR
                  n
U	R                  (       d-  UR
                  S:X  d  UR
                  S:X  a  [        U	5      S4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 )N)rj   rL  r+   r=   r#  r   TrM  )	r"   rK   r   r   r   rO   singler2  rQ  )r$   vector0vector1vector2matrix0matrix1matrix2r"  ra  r   rO   r   s               r   test_apply_shapesru  ^  s   jj)Gjj'#Gjj'+,GffQiGjj'#Gjj'+,G73g5PQ  #xxQWW_60AVQKEGGAJww%GGAtG$ww% R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 )
NrY   rZ   irE   r#  r   r[   r\   rv   r=   )rG   rH   r]   r   r  rQ  r^   r   )rR   r   r  ra  
v_expecteds        r   test_apply_array_likerz  q  s    
))


$CC AD#D)A	
AJA.D#F+A	
AJA.r   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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 )Nrf  rI  r   r   r   rq  r   r   r>   r\   r   rr   r   r   )	rG   r  rg  r"   r   r   r   rJ   rP  r   s      r   test_getitemr|    s    
((9
CXX CF
 XX CF
 **S/CS!AAaDNN$c!f59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   r'   r   )r   r   	TypeErrorr   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   rq  r   r   r>   r\   r   )rG   rg  r   r   r   rJ   )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)Nr'   r~  r   r   )r   r!   r"   r   r   r  rf   s     r   test_setitem_singler    sS    2::l34A	y(;	<!!"**\":;! 
=	<	<s   +A55
Bc           	         [         R                  R                  S5      n[        R                  " U R                  [        R                  " SUS9R                  5       5      5      n[        R                  " U R                  [        R                  " SUS9R                  5       5      5      nX2SS& [        USS R                  5       UR                  5       5        g )Nr  rD   rZ   r-   r   r   rG   rH   r]   r   r!   r"   r#   r	   r$   rR   r_  r`  s       r   test_setitem_slicer    s    
))

 G
HC			BJJxrs'C'K'K'MN	OB			BJJxqc'B'J'J'LM	NBqGBqGOO%rzz|4r   c           	         [         R                  R                  S5      n[        R                  " U R                  [        R                  " SUS9R                  5       5      5      n[        R                  " U R                  [        R                  " US9R                  5       5      5      nX2S'   [        US   R                  5       UR                  5       5        g )Nr  rD   rZ   r   r  r  s       r   test_setitem_integerr    s    
))

 G
HC			BJJxrs'C'K'K'MN	OB			BJJx3'?'G'G'IJ	KBqEBqEMMORZZ\2r   c           	          [         R                  " U R                  [         R                  " SSS9R	                  5       5      5      n[
        R                  " [        SS9   SUS'   S S S 5        g ! , (       d  f       g = f)NrD   r   rZ   zRotation objectr   r   )r   r!   r"   rH   r#   r   r   r  rf   s     r   test_setitem_wrong_typer    sS    2::hooba&@&H&H&JKLA	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 )Nrf  rI  r   r   r   rq  r   r   rv   rr   )rG   r  rg  r"   r   r   r   r2  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                     [         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        g )Nr  rZ   r,   r   r   r-   r-   r,   )rG   rH   r]   r   r   r#   rO   rZ   s    r   test_random_rotation_shaper    s    
))

 G
HCS)113994@3/779??F,446<<fE,446<<fEr   c                    U R                  / SQ/ SQ/5      nU R                  USS9n[        R                  " X5      u  p4[        UR	                  5       U R                  S5      SS9  [        X@R                  S5      S	   S
SS9  g )Nr   r\  T)copyr=   r[   r\   r}   r   Fr   check_shaperB   )r"   r   align_vectorsr   rJ   rK   )r$   r   r   r   rssds        r   test_align_vectors_no_rotationr    sl    


Iy)*A


14
 A$$Q*GAAKKM266!959D**S/"-5tLr   c                    [         R                  R                  S5      n[        R                  " U R                  [        R                  " US9R                  5       5      5      nU R                  UR                  SS95      nUR                  U5      n[        R                  " XC5      u  pV[        UR                  5       UR                  5       5        [        X`R                  S5      S   SSS	9  g )
Nl	   #t}":xL rZ   r-   r=   rw  r}   r   Fr   r  )rG   rH   r]   r   r!   r"   r#   normalrQ  r  r   )r$   rR   crm  rl  estr  s          r   test_align_vectors_no_noiser    s    
))

 F
GC2::hoo#&>&F&F&HIJA


3::6:*+A	
A&&q,ICAIIK/D**S/"-5tLr   c                     U R                  / SQ/ SQ/5      nU R                  / SQ/ SQ/5      n[        R                  " X5      u  p4[        XR	                  U5      SS9  [        X@R                  S5      S   S	S
S9  g )N)gq?gH*fܿgHlB?)gMs^E?g+Obp޿gn^w)g=2)p?g[[VKg?gw7?)gѿgGvgpr   r\   r}   r   Fr   r  )r"   r   r  r   rQ  )r$   r   r   r  r  s        r   $test_align_vectors_improper_rotationr    ss    


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}         ?rj   )r}   rj   rj   r   r   r   r   r   r   )r   g?r   )r   g?r   Treturn_sensitivityr\   )r"   r   r  r   )	r$   rssd_expectedsens_expectedrB   rl  rm  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 )
NrD   r   rZ   r   r   rv   Tr   r\   )
r"   r   rH   rQ  r  r%  r   rJ   r   r   )r$   r  rl  rm  scaleest1rssd1cov1est2rssd2cov2s              r   !test_align_vectors_scaled_weightsr    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           	         [         R                  R                  S5      nSn[        [        R                  " US9U 5      nU R                  UR                  US4S95      nUR                  U5      n[         R                  " S5      nSU-  n[        R                  " U R                  UR                  US4US95      5      nUR                  U5      n	[        R                  " XS	S
9u  pnX:R                  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  X-  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  rE   rZ   r=   rw  r   r  )r   r  Tr  r   r}   r   r\   rv   r   )r   r   )rv   rv   r   F)r  )rG   rH   r]   r%   r   r"   r  rQ  deg2radr   r  r   r   r   sum)r$   rR   	n_vectorsr,  vectorsr   sigma	tolerancenoisenoisy_resultr  r  coverror_vector
rssd_checks                  r   test_align_vectors_noiser    s   
))

 G
HCI
S12
6Cjj)Q89GYYwF JJqMEeI  


3::Q  
 	E ;;v&L++L?CENCs '')O..0LLORZZ_R%8yILORZZ_R%8yILORZZ_R%8yI LCCIrzz#r2CCIrzz#r2CCIrzz#r2C		'(::q@ASHJD%8r   c                 P   [         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g [         R                  " [        SS9   [        R
                  " XSS9  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N= f! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GNS= 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 valuesrr   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 matrix)r   r   r   r"   r   r  r   r`   r   r#   inf)r$   rl  rm  r  r   r  r  s          r    test_align_vectors_invalid_inputr  A  sY   	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 BQ 
M	L 
M	L
@ 
@

G 
G
L 
LN NH HM ME EB Bsz   <Y57<ZAZ6AZ+)AZ=[*[!
[3"\\5
Z
Z
Z(+
Z:=
[
[!
[03
\
\
\%c                 r   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                  " X2U R                  U R                  S/5      S	9u  pV[	        UR                  5       XAS
9  [	        UR                  U5      X1S
9  [        R                  " USXS9(       d   eU R                  / SQ/ SQ/5      nSn[        R                  " X2U R                  U R                  S/5      S	9u  pV[	        UR                  5       XAS
9  [	        UR                  U5      S   US   US
9  [        R                  " XgX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                  " X2U R                  U R                  S/5      S	9u  pV[	        UR                  U5      S   US   US
9  [        R                  " XgXS9(       d   eg )Nr[   r   r   r}   r   r   r  r   r   r   r  r\   r}   )rB   r$   )r   rv   r   rj   r   r   r   rv   r   )r   r=   rr   )ry   r=   rv   r/  g4i?)	r"   r   r  r  r   rJ   rQ  r   isclose)	r$   rB   rm  rl  
m_expectedRr  r  
a_expecteds	            r   "test_align_vectors_align_constrainr    s   
 D


Iy)*A


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

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                    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                  SUS   U   S   -  SUS   U   S   -  /5      nU R                  SUS   U   S   -  S	US   U   S   -  /5      n[        R                  " XES
S/S9u  pg[        R                  " XEU R                  S/S9u  p[        UR	                  5       UR	                  5       SS9  M     [        U5       H  nU R                  SUS   U   S   -  SUS   U   S   -  SUS   U   S   -  /5      nU R                  S	US   U   S   -  SUS	   U   S   -  SUS   U   S   -  /5      n[        R                  " XE/ SQS9u  pg[        R                  " XEU R                  SS/S9u  p[        UR	                  5       UR	                  5       SS9  M     g )NrE   r   rD   rZ   r   r   rv   r=   r,       _Br  -C6?r\   r-   )r  rv   r   )	rN   appendr   rH   rJ   r"   r  r  r   )	r$   r  matsrT   rl  rm  r  _R2s	            r   test_align_vectors_near_infr    s    	AD1XHOOA262<<>?  1XJJDGAJqM)1tAwqz!}+<=>JJDGAJqM)1tAwqz!}+<=>%%aT1I>&&qbffa[Ar||~DA  1XJJ$q'!*Q-471:a=!DGAJqM/JKJJ$q'!*Q-471:a=!DGAJqM/JK%%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 )Nr[   rj   r   r   r   r  r   r   r   r  r\   r   r   )r"   r   r  r  r   rJ   rQ  )r$   rB   rl  rm  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           	         Sn[         R                  " / SQ/ SQ// SQ/ SQ// SQ/ SQ//5      nU Vs/ s H  o3S   * US   /PM     nn[        X$5       H  u  p5U R                  U5      U R                  U5      pS[        R
                  " X5U R                  S/S9u  pg[        UR                  5       U R                  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 H  nU R                  U5      U R                  U5      pS[        R
                  " X5U R                  S/S9u  pg[        R
                  " X5SS/S9u  p[        UR                  5       UR                  5       US	9  M     g s  snf )Nr[   r  r   r   r   r   r   r  r\   r   rE   rZ   r  r   r  )rG   rg  zipr"   r   r  r  r   r  r  rQ  rH   r   r   r  rJ   )r$   rB   
as_to_testrl  
bs_to_testrm  r  r  RsdRsdRr  s               r   test_align_vectors_antiparallelr    s   DK3%y1%y13 4J *44AaD5!A$-J4J+zz!}bjjm1%%aRVVQK@ruu48&	*AfIDA	 , 
!	$B


r||~d2
3C	YA	YAJ"((BHHQqTNAaD#9:; zz!}bjjm1%%aRVVQK@&&qdAY?r||~DA	  5s   Hc                    Sn[         R                  " SSS9R                  5       n[         R                  " SSS9R                  5       n[        X#5       H{  u  pEU R	                  US   5      nU R	                  US   5      n[         R
                  " Xg5      u  p[        UR                  U5      XaS9  [        R                  " U	SUS9(       a  M{   e   g )Nr[   rE   r   rZ   r   r\   )
r   rH   rJ   r  r"   r  r   rQ  rG   r  )
r$   rB   mats_amats_bmat_amat_brl  rm  r  r  s
             r   test_align_vectors_primary_onlyr    s    D__Sa(224F__Sa(224FF+JJuQx JJuQx  ((.
A1zz$---- ,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 )NrY   rZ   r  rw  )
rG   rH   r]   r   r  rQ  r  r^   r   r#   )rR   r  rm  rl  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                     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 )Nr'   zRotation.from_matrix(array([[1., 0., 0.],
                            [0., 1., 0.],
                            [0., 0., 1.]]))Rotation.from_matrix()r"   reprr   r!   r
   
startswithr$   rS   actualr   s       r   test_repr_single_rotationr    s[    


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


NL12TYYq\AA""1%(F||4 !!!  !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  rw  )r   r   rv   r=   r,   )r   r   r  r   r  rv   g      @r=   g      
@g@r,   rr   r   r   r   )r-   .r   )r   .)rD   .)r,   .rv   r   )rG   rH   rI   r   r!   r"   r  r#   r   r-  timesr0  wherer   r  r   r2  )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_slerpr   =  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   r'   r   r   )r   r   r  r"   r   )r$   r   r  s      r   test_slerp_rot_is_rotationr  l  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)rj   rv   r=   r,   r   r   )r   r!   r"   r   r   r   SLERP_EXCEPTION_MESSAGEr   rf   s     r   test_slerp_single_rotr  w  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   rH   r!   r"   r#   r   r   r   r  r   rf   s     r   test_slerp_rot_len0r  }  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   r  rf   s     r   test_slerp_rot_len1r
    sV    A2::aiik23A	z)@	Aqc1 
B	A	As   'A>>
B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   )rv   r,   rw  r   rv   )r   r   r   rG   rH   rI   r   r!   r"   r  r   r$   r   r   r  s       r   test_slerp_time_dim_mismatchr    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  rw  r   )r   r   r   rG   rH   rI   r   r!   r"   r  aranger   r  s       r   !test_slerp_num_rotations_mismatchr    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  rw  )r   r   rv   rv   r,   strictly increasing orderr   rG   rH   rI   r"   r  r   r!   r   r   r`   r   r  r   r   r   r$   r   rS   r   r  ss         r   test_slerp_equal_timesr        
))


"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  rw  )r   r   r=   rv   r,   r  r   r  r  s         r   test_slerp_decreasing_timesr    r  r  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  rw  r-   z&`times` must be at most 1-dimensional.r   g      @g@)rG   rH   rI   r   r!   r"   r  r  r   r   r   r   )r$   r   r   r  r  interp_timess         r   !test_slerp_call_time_dim_mismatchr    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  rw  r-   r   r  )r   rv   r   .ztimes must be within the ranger   )rG   rH   rI   r   r!   r"   r  r  r   r   r#   logical_andminmaxr`   r   r   r   r   )	r$   r   r   r  r  	times_low
times_highrS   in_ranges	            r   !test_slerp_call_time_out_of_ranger%    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                 8   [         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X4R	                  5       -  nU R                  UR                  5       SS	S
9(       d   eg )NXr   P   Tr  r   r  r  r?   r\   )r   rm   r"   r   r   allcloser  )r$   r   r  r_interpolatedr_interpolated_expecteddeltas         r   test_slerp_call_scalar_timer-    s    CQG!4dCAq!faAtWN&11#rzz"~tT88::E;;u(!%;888r   c                    [         R                  " SSS9n[         R                  " U R                  UR	                  5       5      5      n[         R                  " SSS9n[         R                  " U R                  UR	                  5       5      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   rZ   r  r   r   )	r   rH   r!   r"   r#   r%  r2  r   r   )r$   qsrsr   rS   s        r   test_multiplication_stabilityr2    s    		#B			BJJrzz|4	5B	1	%B			BJJrzz|4	5Bwws2wH
"frzz|!<hG r   c                     Sn[         R                  " SSS9n[         R                  " U R                  UR	                  5       5      5      nUR                  5       nS GHI  nX$-  n[         R                  " S5      n[         R                  " U R                  UR	                  5       5      5      n[        [        U5      5       H  nUS:  a  Xb-  nM  Xc-  nM     XVR                  5       -  R                  5       nU R                  X:  5      (       d   e[         R                  " U R                  / SQ5      5      nXd-  R	                  5       R                  S:X  d   e[         R                  " U R                  / SQ/5      5      nXd-  R	                  5       R                  S:X  a  GMJ   e   S	 HT  nX$-  n[         R                  " XBR                  5       -  5      n[        UR	                  5       UR	                  5       US
9  MV     [         R                  " U R                  / SQ5      5      nSnX$-  n[         R                  " XBR                  5       -  5      n[        UR	                  5       UR	                  5       US
9  g )Nr  rD   r   rZ   )r]  r   rr   r   r   rv   r-   r'   r  r   )      r   g       r}   r   r  r\   )r[   r   r   r=   )r   rH   r!   r"   r#   r   r  rN   rz   r  r`   rO   r   r   r   )	r$   rB   r  p_invr  rS   r   r  angs	            r   test_powr7    s   D"A2::aiik23AEEGE%Fb!rzz!))+67s1vA1uEI	 
 557{%%'vvcj!!!! rzz,78~~%%---rzz<.9:~~%%///# &( /F  [[]!23		QYY[t< / 	RZZ67A	A	AQ./AAIIK48r   c                    [         R                  " SS9n[         R                  " U R                  UR	                  5       5      5      n[
        R                  " [        SS9   [        USS5        S S S 5        g ! , (       d  f       g = f)Nr   rZ   zmodulus not supportedr   r   )	r   rH   r!   r"   r#   r   r   NotImplementedErrorpow)r$   r  s     r   test_pow_errorsr;    sW    AA2::aiik23A	*2I	JAq! 
K	J	Js   !A88
B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   rZ   rv   r   r   )rv   )r   )r   rv   r   )r   r   re   )r=   rv   )	r   rH   rG   rg  r   rO   r   rJ   object)rn  multiplerg  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   c                    [         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   r,   r>   r\   )r   r!   r"   r   sinrG   r  r  pickledumpsloadsr   rJ   )r$   r   pkl	unpickleds       r   test_picklingrI  A  s~     	2::q!TXXbeeAg->q@Q&RSTA
,,q/CS!IAKKM9#6#6#8uEr   c                 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 rB  )r   r!   r"   r   rC  rG   r  r  r  deepcopyr   rJ   )r$   r   r_  s      r   test_deepcopyrL  J  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 )Nr'   ri   XYZC_CONTIGUOUSTc              3   *   #    U  H	  oS :  v   M     g7fr   Nr   .0rT   s     r   	<genexpr>+test_as_euler_contiguous.<locals>.<genexpr>Y       *z!Avz   c              3   *   #    U  H	  oS :  v   M     g7frQ  r   rR  s     r   rT  rU  Z  rV  rW  )r   r!   r  flagsr`   strides)r   e1e2s      r   test_as_euler_contiguousr]  R  s    <(A	
E	B	
E	B88N#t+++88N#t+++*rzz******rzz*****r   c                 @   [         R                  " SSS9n[         R                  " U R                  UR	                  5       5      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                  " U R                  [         R                  " 5       R	                  5       5      5      n[         R                  " U5      n[        UR	                  5       UR	                  5       5        g s  snnf )NrD   r   rZ   )r   rv   r=   r   r=   )r   rH   r!   r"   r#   listrG   cumsumr  r  r	   r  )	r$   r  sizesstartsrT   r  splitr   r,  s	            r   test_concatenaterd  ]  s4   rq)H!!"**X-=-=-?"@AHES4		%())F+.v+=>+=41X+=E>!!%(FH$$&(89 !!(+FH$$&(89 !!! 

RZZ(9(9(;(C(C(EF
GC!!#&FCKKM6>>#34 ?s   >F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_typerf  s  sW    	y(?	@rzz("3"3"5"="="?@Ac1d^, 
A	@	@s   AA88
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        U(       d   eU(       d   eU(       d   eg ! , (       d  f       N*= f)Nr'   r   rv   zSingle rotation has no len().r   )r   r"   r2  r   r   r  )r$   rotation_multi_onerotation_multirotation_singles       r   test_len_and_boolrk  z  s    !"**l^"<=bjj,)EFGNrzz,78O!"a'''~!###	y(G	HO 
I >? 
I	Hs   C
C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   rb  r\  Tr  r]  rv   )r"   r   from_davenportr#   r   r   r   )r$   r   r   r2   s       r   #test_from_davenport_single_rotationrn    sV    ::i D""4b+/118 	JJ~.1=MD(r   c                 R   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                  " XPR                  -  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  r,   eTrl   r   r   r   r   r   )	r"   r   r   r  rm  r   r#   r   stack)r$   ezeyr,  rot_davr  axes_davs          r   #test_from_davenport_one_or_two_axesrv    sI   	K	 B	K	 B 

rEEz!|
,C%%b#ruuQw7GCKK$K/OOdO35 ::b&!D


tee|A~
.C%%dC"%%';GCKK$K/OOdO35 88RH18%D


tjj2557)beeAgY1G&HH
IC
a&3q6/Cxxqx)H%%hbeeAgruuQw5GHGCKK$K/OOdO35 88RH18%D


tjj2557)beeAgY1G&HH
ICzz"f%H%%hbeeAgruuQw5GHGCKK$K/OOdO35r   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        g ! , (       d  f       GNW= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       g = f)Nr   r   r  rp  r   zmust be orthogonalr   r   zorder should beri   zExpected `angles`)r   r   rv   r=   )
r"   r   r   rm  r#   r`   r   r   r   r   )r$   rr  rs  ezyr  rS   s         r   !test_from_davenport_invalid_inputry    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 
>	= CB CB	;	;	=	=s0   HH*H&,H7
H
H#&
H47
I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 )
NrY   r   r   r   rZ   rp  r[   r\   rv   )
rG   rH   r]   rg  r   as_davenportrm  r^   r_   r`   )rR   r[  r\  e3rb   r  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                  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                  XgU	/SS	9n
XH-
  US S 2S
4'   S H|  nUS:X  a  U
OU R                  U
SS	9n[        R                  " U R                  U5      X5      nUR                  U R                  U5      U5      n[        XR                  U5      5        M~     M     g )Nr   rE   r=   rf  rv   )r  r  r  r   r   rb  rc  rc  )rG   rH   rI   r  r  r  r"   r   r   rQ  rq  rk  rm  r{  r   )r$   r   r  r  angles_middlelambdasr[  r\  lambr|  ax_lambr  axr,  
angles_davs                  r   test_as_davenportr    s   
))


"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))"**R.%HC))"**R.%@JJ

6(:;	 0	 r   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5       Vs/ s H#  oAR                  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                  XxU
/SS	9nXY-
  US S 2S
4'   S H  nUS:X  a  UOUS S S2   n[        R                  " U R                  U5      X5      n[        U[        SS9   UR!                  U R                  U5      U5      nS S S 5        UR#                  5       n[        R                  " U R                  U5      UW5      nUR#                  5       n[%        UUSS9  M     GM$     g s  snf ! , (       d  f       No= f)Nr   r-   r=   rf  rv   )r-   r  r  r   r   r  rc  rr   r  r   r[   r\   )rG   rH   rI   r  r  r  rN   choicer"   r   r   rQ  rq  rm  r   r  r{  rJ   r   )r$   r   r  r  rT   r  r  r[  r\  r  r|  r  r  r  r,  r  r  rot_estimatedr  s                      r   test_as_davenport_degenerater    s    ))


"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gddmB))"**R.%HCS+]C --bjjneD
 D==?L$33BJJrNE:VM)335ML-eD 0	  ? DCs   =*I"I
I 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	[        R                  " U R                  U5      X@R                  U5      5      n
[        U	R                  SS9U
R                  SS9S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	[        R                  " U R                  U5      X@R                  U5      5      n
[        U	R                  5       U
R                  5       SS9  M     M     g s  snf s  snf )Nr   rE   r=   rf  r   rv   r  ri   r  rc  Trl   r[   rF   )rG   rH   rI   r  r  r  r   r  r   r  r   rm   r"   rm  r   r#   )r$   r   r  r  r  r  r  rT   r  euldavs              r   &test_compare_from_davenport_from_eulerr  	  s3   
))


"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))"**R.%FASTCCKK$K7t9T!&( - , 1a4LBEEAIL+%e,I'')$C(+,1)A,B,#iik%%c::f+=>C))"**R.%FASTCCKKM3;;=uE - , - -s   J6?J;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   rE   r=   rf  r   rv   r  ri   r  rc  r[   rF   )rG   rH   rI   r  r  r  r   r  r   r  r   rm   r"   r  r{  r   )r$   r   r  r  r  r  r  rT   r  r,  r  r  s               r   "test_compare_as_davenport_as_eulerr  8	  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  r=   r   r,   r   r=   r=   ri   r   rb  )r   rH   r2  r  r!   rn   r   rm   r   rm  rK   r5  )
r$   r   r_ider_getr_quatr_matrixr_eulerr_vecr_davr_mrps
             r   test_zero_rotation_constructionr  Z	  sm   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  ri   r   r=   rb  )r   r!   rn   r#   rO   rJ   r  r   r<  r{  rK   rf   s     r   !test_zero_rotation_representationr  w	  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   rx  z/Expected equal numbers of rotations and vectorsr   )
r   r!   rn   r"   rQ  rO   r%  r   r   r   )r$   r   ra  rb  v0v0_rotri  s          r   !test_zero_rotation_array_rotationr  	  s    288F+,A


9A
I??f$$$	&	BWWR[F<<6!!!	B	K
M	
M 
M 
M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Sn[         R
                  " S5      n[         R                  " U R                  UR                  5       5      5      n[        R                  " [        US9   XX-    S S S 5        [        R                  " [        US9   X-    S S S 5        g ! , (       d  f       N5= f! , (       d  f       g = f)Nr  r~   r   "Expected equal number of rotationsrv   r   )
r   r!   rn   r"   r2  rH   r#   r   r   r   )	r$   r   r_singler_mult_leftr_mult_rightr0r_multmsg_rotation_errorr`  s	            r   !test_zero_rotation_multiplicationr  	  s   288F+,A!!"**^"<=H,K{q   <L|!!!			BHHV,	-BVFv;!=		B			BJJrzz|4	5B	z);	<
 
= 
z);	<
 
=	< 
=	< 
=	<s   E	;E	
E
E(c                    [         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                  " U R                  [         R                  " S5      R                  5       5      5      nUR                  XA/5      n[	        U5      S:X  d   e[         R                  " U R                  [         R                  " S5      R                  5       5      5      nUR                  X/5      nUR                  X/5      n[	        U5      S:X  d   eg )Nr  r   r~   r   r=   r,   )r   r!   rn   r  r2  r"   rH   r#   )r$   r   r  r_  r   r4s         r   !test_zero_rotation_concatentationr  	  s   288F+,A			qf	%Br7a<<			BJJ~6	7B	
w	Br7a<<			BJJxq'9'A'A'CD	EB	
w	Br7a<<			BJJxq'9'A'A'CD	EB	
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  )r4  rr   r   r   r  r   )r   r!   rn   r2  )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!   rn   r   r2  )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!   rn   r  rO   )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!   rn   r   r   r   r  rf   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                  " U R                  [         R                  " 5       R                  5       5      5      nUR                  U5      R                  S:X  d   eSn[         R                  " U R                  [         R                  " S5      R                  5       5      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~   r  rv   r   )r   r!   rn   r_   rO   r"   rH   r#   r   r   r   )r$   r   r  r_  r`  
approx_msgr   s          r   test_zero_rotation_approx_equalr  	  sR   288F+,A			BHHV,	-B>>"##t+++			BJJ~6	7B>>"##t+++			BJJx'8'@'@'BC	DB??1##t+++5J			BJJxq'9'A'A'CD	EB	z	4	r 
5 
z	4
 
5	4 
5	4 
5	4s   =G0G
G
G*c                    [         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   Tr'   )	r   r!   rn   r"   boolr2  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                  " U R                  [         R                  " S5      R	                  5       5      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                  " [        5         XR                  SS/5           S S S 5        g ! , (       d  f       g = f)Nr=   )FFFr   )FTFr   )TTTT)	r   r!   r"   rH   r#   r2  r   r   r  )r$   r   r  r_  r   s        r   test_boolean_indexesr  	  s    2::hooa&8&@&@&BCDA	
::+,	-Br7a<<	
::*+	,Br7a<<	
::()	*Br7a<<	z	"	**dD\
"# 
#	"	"s   C33
D)r   r   numpyrG   numpy.testingr   scipy.spatial.transformr   r   scipy.statsr   	itertoolsr   r   scipy._lib._array_apir	   r
   r   r   r   r   r   scipy._lib.array_api_extra_libarray_api_extrar   rD  r  markskip_xp_backends
pytestmarkr   r%   r(   r3   r6   r8   rV   rc   rg   ro   rw   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-  r0  r8  r:  r=  r?  rA  rE  rG  rL  rO  rU  rW  rZ  r^  rd  rn  rr  r  r  r  r  r  r  parametrizer  r  thread_unsafer  r  r  r  r  r  r   r  r  r
  r  r  r  r  r#  r'  r.  r6  rG  rZ  rd  rj  rl  ru  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  r  r%  r-  r2  r7  r;  r@  rI  rL  r]  rd  rf  rk  rn  rv  ry  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   <module>r     s?      & 3 + +   ) (   [[))$)7
7h 7
000D.
:5
O@0
>=>(
"$	/,8,>HH@
3"P(&"
:5@@V>.
:5
"1
X44*	A5
:5	E.
E..J)*	28666:2 l5&9:m42 5 ;2D l5&9:m42 5 ;2> l5&9:m4< 5 ; <6 l5&9:m4< 5 ; <6 l5&9:m4= 5 ; =@/*/B3$
@@B"	= 2 2?
E((66A8:*::9. &/Y(8
	D<53!&FMM	M
4 %9PKN\ >FB8>0B:. 	)
::",/^ G 


0	9H$9N&>F?+5,- ) 5FM2:$<. E E>FB2D:B"0(#$<&$r   