
    Pi                    /   d dl Z d dlZd dlZd dlmZ d dlmZmZ d dl	m
c mc mZ d dlm
c mc mZ d dlmZ d dlmZmZ d dlmZ d dlZd dlmZmZmZmZmZmZm Z m!Z!m"Z"m#Z# d dl$m%c m&Z' d dl(Z(d dl)Z)eegZ* e"ej+        ej,                  Z-d Z.d	efd
Z/d Z0d Z1d Z2d Z3ej4        5                    d e6dd                    de7fd            Z8 e!ej9                  d             Z:d Z;d Z<d Z= e!ej>                  d             Z?d Z@d ZA e!ejB        ejC                  d             ZDej4        5                    d e6dd                    de7fd            ZEd ZF e!ej9                  ej4        5                    d e6dd                    de7fd                        ZG e!ej9                  d             ZH e!ej9                  d             ZI e!ejJ                  ej4        5                    d e6dd                    de7fd                         ZK e!ejJ                  d!             ZL e!ejJ        ej9                  d"             ZM e!ejJ        ej9                  d#             ZN e!ejJ        ej9                  d$             ZO e!ejJ        ej9                  d%             ZP e!ejJ        ej9                  d&             ZQd' ZR e!ejJ                  d(             ZS e!ejT                  ej4        5                    d e6dd                    de7fd)                        ZU e!ejT                  d*             ZV e!ejT                  d+             ZW e!ejT        ejX                  d,             ZY e!ejT                  d-             ZZ e!ejT                  d.             Z[ e!ejT                  d/             Z\ e!ejT                  ej4        5                    d e6dd                    de7fd0                        Z] e!ejX                  ej4        ^                    d1d23          d4                         Z_ e!ejX                  ej4        5                    d e6dd5                    de7fd6                        Z` e!ejJ        ejX                  d7             Za e!ejT        ejX                  d8             Zb e!ejc                  ej4        5                    d e6dd5                    de7fd9                        Zdd: Ze e!ejc                  d;             Zf e!ejc                  d<             Zg e!ejc                  ej4        5                    d e6dd5                    de7fd=                        Zh e!eji                  d>             Zj e!ej>        eji                  d?             Zk e!eji                  ej4        5                    d e6dd5                    de7fd@                        Zl e!ejc        eji                  dA             Zm e!ej>                  dB             Zn e!ej>                  dC             Zo e!ej>                  ej4        5                    d e6dd5                    de7fdD                        Zp e!ej>        ej9                  dE             Zq e!ej>                  dF             Zr e!ej>        ej9                  dG             Zs e!ej>        ej9                  dH             Zt e!ej>        ej9                  dI             Zu e!ej>        ej9                  dJ             Zv e!ej>        ej9                  dK             ZwdL ZxdM Zy e!ej>        ejz                  ej4        5                    dN edO                    ej4        5                    dPdQ          dR                                     Z{ e!ej>        ejz                  ej4        5                    dN edO                    ej4        5                    dPdQ          dS                                     Z|edT             Z} e!ej>        ej9        ejz                  ej4        5                    dN edO                    ej4        5                    dPdQ          ej4        5                    dUdQ          dV                                                 Z~ e!ej>        ej9        ejz                  ej4        5                    dN edO                    ej4        5                    dPdQ          ej4        5                    dUdQ          dW                                                 Z e!ej>        ejz                  ej4        5                    d e6dd5                    de7fdX                        Z e!ej9        ejB                  dY             Z e!ejB        ej9                  dZ             Z e!ej        ejB                  d[             Z e!ej        ejB                  d\             Z e!ejB        ej                  d]             Z e!ejB        ej                  d^             Zd_ Z e!ej                  ej4        5                    d e6dd5                    de7fd`                        Z e!ej                  da             Z e!ejB        ej        ej                  db             Z e!ejT        ej                  dc             Z e!ejB        ej        ej                  dd             Z e!ej                  de             Z e!ejT        ej        ej                  ej4        5                    d e6dd5                    de7fdf                        Z e!ejT        ej        ej                  ej4        5                    d e6ddg                    de7fdh                        Z e!ej        ej                  di             Z e!ejT        ej        ejB        ej                  ej4        5                    d e6dd5                    de7fdj                        Z e!ej                  dk             Z e!ej                  dl             Z e!ej                  dm             Z e!ej        ejB        ej                  dn             Z e!ejJ        ej                  do             Z e!ejJ        ej                  ej4        5                    d e6dd5                    de7fdp                        Z e!ejJ        ej                  ej4        5                    d e6ddg                    de7fdq                        Z e!ejJ        ej                  ej4        5                    d e6ddg                    de7fdr                        Z e!ej                  ds             Zdt Z e!ej                  du             Z e!ejJ        ej9        ej                  ej4        5                    d e6dd5                    de7fdv                        Z e!ej                  dw             Z e!ejJ        ej        ej9                  dx             Z e!ej                  dy             Z e!ej                  dz             Z e!ej                  d{             Z e!ej                  d|             Z e!ejJ                  d}             Zd~ Z e!ej        ej9                  d             Z e!ej        ej                  d             Z e!ej        ej                  d             Z e!ej                  d             Z e!ej        ej9                  d             Z e!ej        ejT        ej                  d             Z e!ej                  d             Z e!ej        ej9        ej                  d             Z e!ej        ej9                  d             Z e!ej        ej9                  d             Z e!ej        ej        ej        ejT        ejX        ej9                  d             Z e!ej        ej                  d             Zd Z e!ej        ej                  d             Zd Zd Z e!ej        ej                  d             Z e!ej                  d             ZdZ e!ej                  d             Z e!ej                  d             Z e!ej                  d             Z e!ej                  d             Z e!ej                  d             Z e!ej                  d             Z e!ej                  d             Z e!ej                  d             Z e!ej        ej                  d             Z e!ej        ej                  d             Z e!ej        ej        ej>        ejB        ej                  d             Z e!ejC                  d             Z e!ejC                  d             Z e!ejC                  d             Z e!ejC                  d             Z e!ejB        ej        ejB        ej        ejT        ejX                  ej4        5                    d e6dd5                    de7fd                        Z e!ej                  d             Zd Z e!ej9                  ej4        ^                    dd3          d                         Z e!ej9                  ej4        ^                    dd3          d                         Zd Z e!ej                  d             Z e!ej                  d             Z e!ej                  d             Z e!            d             Z e!ej                  d             Z e!ejT        ej                  d             Z e!ej                  ej4        5                    d e6dd5                    de7fd                        Z e!ej                  d             Z e!ej                  d             Zd Z e!ej        ej                  d             Z e!ej        ej                  d             Z e!ej        ej        ej9                  ej4        5                    dUdQ          d                         Z e!ej>        ej                  d             Z e!ej>        ejz        ej                  d             Z e!ejJ        ej>        ejT        ej        ejc                  d             Z e!ej9        ejz        ejX        eji        ej                  d             Z e!ej                  d             Z e!ejC                  d             Z e!ej                  d             Z e!ej                  d             Z e!ejB                  d             Z e!ej                  d             Z e!ej                  d             Z e!ej                  d             Zej4        ^                    ddĬ3          ej4        ^                    d1dŬ3          dƄ                         Z e!ej                  dǄ             Z e!ej                  dȄ             Zej4        5                    d e6ddg                    de7fdɄ            ZdS )    N)assert_equal)RotationSlerp)special_ortho_group)permutationsproduct)contextmanager)
xp_assert_equalis_numpyis_lazy_arrayxp_vector_normxp_assert_closeeager_warnsxp_default_dtypemake_xp_test_casemake_xp_pytest_marksxp_device_typec                 B    | dk    rg dS | dk    rg dS | dk    rg dS d S )Nx   r   r   yr   r   r   zr   r   r    axiss    /home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/scipy/spatial/transform/tests/test_rotation.py	basis_vecr    &   sB    s{{yy	yy	yy 
    rc                     t          j        |          }t          j        |                    |                                 |                    S )Ndtype)xpxdefault_dtyper   	from_quatasarrayas_quat)r"   xpr%   s      r   rotation_to_xpr,   /   s;    b!!EbjjEjBBCCCr!   c                  l    t          d           t          g d           t          g dgg           d S Nr   r   r   r   )r   r   r!   r   test_init_non_arrayr0   4   s?    \\\\|||nr!   c                  \   t          j        t          j        g d                    } | j        t
          u sJ t          j        t          j        g dg                    } | j        t
          u sJ t          j        t          j        g dgg                    } | j        t          u sJ d S r.   )r   r(   nparray_backendcython_backend
xp_backendr"   s    r   test_cython_backend_selectionr8   :   s    28LLL1122A:''''28\\\N3344A:''''28lll^$45566A:######r!   c                  n    t          j        t          j        g dt          j                             d S )Nr   r   r   r   r$   )r   r(   r2   r3   float32r   r!   r   test_numpy_float32_inputsr<   C   s.    rxBJ???@@@@@r!   c                     |                      g dg dg          }t          j        |          }||                      dgdgg          z  }t          |                                |           d S )N      @   r   r   )      r   r         @g      *@r)   r   r(   r   r*   r+   r   r"   expected_quats       r   test_generic_quat_matrixrG   G   sl    


NNNMMM233A1A

SED6?333MAIIKK/////r!   ndimr      c                     |                      g d          }|                     |d|dz
  z  dz             }t          j        |          }|dz  }t	          |                                |           d S )Nr>   r   r   r@   rA   )r)   reshaper   r(   r   r*   )r+   rH   r   r"   rF   s        r   test_from_single_nd_quaternionrN   N   so    


>>>""A


1ddQh'$.//A1AEMAIIKK/////r!   c                 <   t           j                            d          }t          j        |                     g d          d          }t          |                                |                     d          dd           | 	                    |                     g d          d	          }t          j        |d          }t          |                                | 	                    |                     d          d
          dd           |                     |
                    dd                    }|t          |d          d d d f         z  }t          |j        d                   D ]Z}||df         }t          j        |d          }t          |                     |                                d          |d           [t          j        |d          }t          |                     |                                dd          |d           d S )Nr   r:   Tscalar_first   V瞯<缉ؗҜ<rtolatol
   r   )rY   r   r   d   r@   r   r   .rV   )r2   randomRandomStater   r(   r)   r   	as_matrixeyetilerandnr   rangeshaperollr*   r+   rngr"   qiqis         r   test_from_quat_scalar_firstrj   W   s   
)


"
"C2::lll33$GGGAAKKMM266!995uEEEE


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

399S!$$%%A	"	"	"111d7	++A171: A Aq#vYr555		Q//%@@@@@14000ABGGAIIKKG33QUCCCCCCr!   c                     t           j                            d          } t          j        |           }t          j        |                                                                          }|                    |d          sJ t          j        d|           }t          j        |                                                                          }t          j        |                    |d                    sJ | 	                    d          }|t          |d	          d
         z  }t          j        |          }t          j        |          }t          j        |                    |d                    sJ d S )N{   rf   -q=rW   rR   )rR   r@   rA   r@   sizer   ).N)r2   r\   default_rngr   r(   r*   tolistapprox_equalallnormalr   )rf   
r_expectedr"   rg   s       r   test_from_quat_array_likery   o   sW   
)


$
$CS)))J:--//668899A""15"11111 ,,,J:--//668899A6*))!%)8899999 	


%%A	#	#	#I	..A#A&&J1A6*))!%)889999999r!   c                     t          j        |                     g d                    }|                                j        t          |           k    sJ d S )Nr:   )r   r(   r)   r*   r%   r   r+   r"   s     r   test_from_quat_int_dtyper|      sM    2::lll3344A99;; 0 4 4444444r!   c                    |                      g d          }t          t          j        |                              d          |            |                      g d          }t          t          j        |                              d          |            |                      g d          }t          t          j        |                              d          |            |                      g d          }t          t          j        |                              d          |            |                      g d          }|t          |          z  }t          t          j        |                              d          |           |                      g d          }|t          |          z  }t          t          j        |                              d          |           d S )	N        r   r   rr   T	canonical      r   r   r   )r   rr   r   r   )r   r   rr   r   )r   皙r   ?)r   r   r   r   )r)   r   r   r(   r*   r   )r+   rg   s     r   test_quat_canonicalr      s   


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


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


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


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


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


((())A	N1AH&q))11D1AA1EEEEEr!   c           	      T   t           j                            d          }t          j        d|                     d                    }t          |                    d          |                     g d          dd	           t          j        d|                     d
                    }t          |                    d          | 	                    |                     g d          d          dd	           |                     |
                    dd                    }|t          |d          d d d f         z  }t          |j        d                   D ]}||df         }t          j        |          }t          |                    d          |                     |d          d           t          |                    dd          |                     |                    d          d          d           t          j        |          }t          |                    d          |                     |dd          d           t          |                    dd          |                     |                    d          dd          d           d S )Nr   xyzrR   TrP   )      ?r   r   r   rS   rT   rU   )rY   rR   rX   rZ   r@   r   r   .r[   )r   rQ   r   )r2   r\   r]   r   
from_eulerzerosr   r*   r)   r`   ra   r   rb   rc   r(   rd   re   s         r   test_as_quat_scalar_firstr      s   
)


"
"CE288A;;//AAII4I00"**^^^2L2LU, , , , 	E288G#4#455AAII4I00GGBJJ~~~66@@U, , , , 	

399S!$$%%A	"	"	"111d7	++A171: $ $q#vYr""		t	44bggb!nn"	$ 	$ 	$ 	$ 			Dt	DD		D	 9 91=="	$ 	$ 	$ 	$ 	$ 	1AAII4I00"''!QQ'2G2G        AII4I@@GGAIII55qqGAAO O O O O Or!   c           	         |                      g dg dg dg dg dg dg          }t          j        |          }||                      dgdgd	gd
gd	gd
gg          z  }t          |                                |           d S )N)r?   r   r   r@   rA   r   rB   r   r/   )rr   rr   rr   r   r   r   r   rr   rr   rr   rr   rr   rC      r      rD   rE   s       r   test_from_square_quat_matrixr      s    


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

SEB4!qcA3#DEEEMAIIKK/////r!   c                     |                      g dg dg dg dg dg          }t          j        |          }|                     |          t	          |d          d d d f         z  }t          |                    d	          |           d S )
Nr   )r   rr   r   r   )r   r   rr   r   r   r   r   r   Tr   )r)   r   r(   absr   r   r*   rE   s       r   *test_quat_double_to_canonical_single_coverr      s    



 	 	A 	1AFF1IIqq 9 9 9!!!T' BBMAIII--}=====r!   c                 l   |                      g d          }t          j        |          }t          ||                    d                     |                      g d          t          j        d          z  }t          j        |          }||z  |z  }t          |                    d          t          j        d          z  |                      g d                     t          |                                                    d          t          j        d          z  |                      g d                     t          |                    d          t          j        d          z  |                      g d                     t          |                                                    d          t          j        d          z  |                      g d                     t          ||                                z                      d          |                      g d	          d
           t          ||                                z                      d          |                      g d	          d
           t          ||z                      d          |                      g d          d
           t          |                                |                                z                      d          |                      g d          d
           d S )Nr~   Fr   )r   r   r   r   r   )r   r   r   r   )r   r   r   rr   )r   r   r   rr   r   r   r   r   gؗҬ<ro   )	r)   r   r(   r
   r*   mathsqrtr   inv)r+   rg   r"   r3s       r   test_quat_double_coverr      s   
 	

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


>>>""49Q<</A1A	
1QBAIII..ty||;JJ~~~..0 0 0AEEGGOOeO44TYq\\AJJ//1 1 1BJJJ//	!<JJ//1 1 1BFFHH$$u$55dillBJJ///002 2 2 QquuwwY''%'88JJ~~~..U< < < <R[))E)::JJ~~~..U< < < <QrTNNUN33JJ//e= = = =QUUWWrvvxx'0050AAJJ//e= = = = = =r!   c                     |                      g d|z  dR           }t          j        t          d          5  t	          j        |           d d d            d S # 1 swxY w Y   d S )NrK   rA   zExpected `quat` to have shapematch)r   pytestraises
ValueErrorr   r(   )r+   rH   quats      r   test_from_quat_wrong_shaper      s    88'td{'Q''((D	z)H	I	I	I ! !4   ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !s   AA"Ac                    |                      g dg dg dg          }t          |          rV|                     |                     t	          j        |                                          d                             sJ d S t          j        t                    5  t	          j        |           d d d            d S # 1 swxY w Y   d S )N)rR   r@   r   r   )r   r   r   r   r   r   .)
r)   r   rv   isnanr   r(   r*   r   r   r   )r+   r   s     r   test_zero_norms_from_quatr     s   


LLLLMM 	 	A
 Q "vvbhhx1!44<<>>vFGGHHHHHHH]:&& 	" 	"q!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s   B??CCc                 \   |                      g d          }|                     |d|dz
  z  dz             }t          j        |                                          }|                      g dg dg dg          }|                     |d|dz
  z  dz             }t          ||d	
           d S )Nr   r   r   r   rK   r   rL   r   rr   r   r   r   rR   rR   rT   ro   )r)   rM   r   r(   r^   r   )r+   rH   r   matexpected_mats        r   #test_as_matrix_single_nd_quaternionr     s     ::lll##D::dDD1H-455D

T
"
"
,
,
.
.C::				
  L
 ::lDD1H,=,FGGLCE222222r!   c                 :   |                      g dg dg dg dg          }t          j        |                                          }t	          |j        d           |                      g dg dg dg          }t          |d	         |d
           |                      g dg dg dg          }t          |d         |d
           t          |d         |                     d                     t          |d         |                     d                     d S )Nr   r   r   r   r   r/   r   )r@   rR   rR   r   r   r   r   .rT   ro   r   r   r   r   rr   r   r   r   r   .rR   rR   .)r)   r   r(   r^   r   rc   r   r_   )r+   quatsr   	expected0	expected1s        r    test_as_matrix_from_square_inputr     s8   JJLLLLLLMM	  E 
U
#
#
-
-
/
/CI&&&

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

		


  I
 CK7777CK+++CK+++++r!   c                    |                      g dg dg dg          }t          j        |                                          }t	          |j        d           |                      g dg dg dg          }t          |d         |d	
           |                      g dg dg dg          }t          |d         |d	
           |                      g dg dg dg          dz  }t          |d         |           d S )Nr   r   r   r   rR   r@   )rR   rR   rR   r   r   r   r   rT   ro   r   r   r   r   )皙?g@)gffffff@r   r   )rr   r   r   rR   r   )r)   r   r(   r^   r   rc   r   )r+   r   r   r   r   	expected2s         r   !test_as_matrix_from_generic_inputr   ;  sB   JJLLLLLL  E
 
U
#
#
-
-
/
/CI&&&

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

		

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




   	I
 CK+++++r!   c                 T   |                      g dg dg dg          }|                     |d|dz
  z  dz             }|                      g d          }|                     |d|dz
  z  dz             }t          t          j        |                                          |           d S )	Nr   r   r   rK   r   r   )      ?r   r   r   rL   )r)   rM   r   r   from_matrixr*   )r+   rH   r   rF   s       r   test_from_single_nd_matrixr   [  s     **IIIIII  C
 **S$$(+f4
5
5CJJ33344MJJ}ddQh.?$.FGGMH(--5577GGGGGr!   c                    d}|                      g d          t          j        d          z  }|                      g dg dg dg          }t          t	          j        |                                          ||           t          t	          j        |                     |d                                                    |                     |d	          |           d S )
N:0yE>)r   r   rI   r   '   )3~˷g6iпnzo?)r   r   6i?)r   r   g3~˷?ro   r   rR   rR   r   r@   )r)   r   r   r   r   r   r*   rM   )r+   rW   rF   r   s       r   test_from_matrix_calculationr   i  s    DJJ~~~..2>M
**///...---  C
 H(--5577TRRRRH(C)C)CDDLLNNJJ}f55     r!   c                     |                      t          j        ddd                    }t          t	          j        |                                          |           d S )NrR   rY   r   )rq   random_state)r)   r   rvsr   r   r   r^   r+   r   s     r    test_matrix_calculation_pipeliner   x  sS    
**(,QRaHHH
I
ICH(--77993?????r!   c                    t          j        |           }|| j        k    rdnd}t          j                            d          }|                     |                    d          |          }| j        	                    |          }t          |j        d                   D ]F}||         dk     r8t          j        |          |df                             ||df                    }Gt          j        |                                          }|                     ||                     |                    }|                     d          |                     d          z   }	t+          ||	|           d S )	Nrn   ư>r   )rZ   rR   rR   r$   .rR   ro   )r&   r'   float64r2   r\   r]   r)   random_samplelinalgdetrb   rc   atsetr   r   r^   matmulmatrix_transposer   r_   r   )
r+   r%   rW   rndr   detsrh   	ortho_matmult_resulteye3ds
             r   test_from_matrix_ortho_outputr   ~  sC   b!!ERZ''55TD
)


"
"C
**S&&{335*
A
AC9==D4:a=!! 8 87Q;;&++af%))3q#v;,77C$S))3355I))Ir':':9'E'EFFKHH[!!BFF1II-EKT222222r!   c                    |                      g dg dg dg          }|                      g dg dg dg          }t          t          j        |                                          |d           |                      g d	g d
g dg          }|                      g dg dg dg          }t          t          j        |                                          |d           |                     ||                     d          g          }|                     ||                     d          g          }t          t          j        |                                          |d           d S )Nr   r   r   r   r   )5_%?gx'?r   )gx'ܿr   r   )r   r   r   r   ro   )r         r   )r   r   r   )r   r   r   r   r   rR   )r)   r   r   r   r^   stackr_   )r+   r   expecteds      r   test_from_matrix_normalizer     s   
**						  C zz5555555557 8 8H H(--77998$OOOO
**  C zz<<<'<<'<<) * *H H(--77998$OOOO ((C#
$
$Cxx266!99-..HH(--77998$OOOOOOr!   c                    t           j                            d          }t          j        |           }|| j        k    rdnd}t          t          j        |	                    d                    |           }t          j
        |                                d          }|                     |                    ||                    sJ d S )	Nr   rn   r   )rY   r@   rp   T)assume_validro   )r2   r\   rs   r&   r'   r   r,   r   r(   rw   r   r^   rv   ru   )r+   rf   r%   rW   rotrot_no_norms         r   test_from_matrix_assume_validr     s    
)


"
"Cb!!ERZ''55TD
+CJJGJ,D,DEEr
J
JC&s}}TJJJK66#"";T"::;;;;;;;r!   c                 |   |                      d          }t          j        |          d                             d          }t	          |          rO|                     |                     t          j        |          	                                                    sJ nGt          j        t          d          5  t          j        |           d d d            n# 1 swxY w Y   t          j        |          d                             d          }t	          |          rP|                     |                     t          j        |          	                                                    sJ d S t          j        t          d          5  t          j        |           d d d            d S # 1 swxY w Y   d S )NrR   r   r   r   zNon-positive determinantr   rr   )r_   r&   r   r   r   rv   r   r   r   r^   r   r   r   r   s     r   )test_from_matrix_non_positive_determinantr     s   
&&))C
&++d



"
"CS &vvbhhx3C88BBDDEEFFFFFF]:-GHHH 	& 	& %%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& &++d



#
#CS &vvbhhx3C88BBDDEEFFFFFFF]:-GHHH 	& 	& %%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&s$   <CC!$C!F11F58F5c                     t           j                            d          } t          j        |           }t          j        |                                                                          }|                    |d          sJ t          j        d|           }t          j        |                                                                          }t          j        |                    |d                    sJ d S Nrl   rm   rn   ro   rR   )	r2   r\   rs   r   r   r^   rt   ru   rv   rf   rx   r"   s      r   test_from_matrix_array_liker     s    
)


$
$CS)))JZ1133::<<==A""15"11111 ,,,JZ1133::<<==A6*))!%)889999999r!   c                     |                      g dg dg dg          }t          j        |          }|                                j        t          |           k    sJ d S )Nr   r   r   )r)   r   r   r*   r%   r   r+   r   r"   s      r   test_from_matrix_int_dtyper     sa    
**iiiIII6
7
7CS!!A99;; 0 4 4444444r!   c                 R   d}|                      g d          }|                     |d|dz
  z  dz             }|                      g d          }|                     |d|dz
  z  dz             }t          j        |          }t	          |                                ||           d S )	NHz>r   rK   r   rR   )gJ?r   r   g<(?rL   ro   )r)   rM   r   from_rotvecr   r*   )r+   rH   rW   rotvecrF   results         r   test_from_nd_single_rotvecr     s     DZZ			""FZZq 1D 899FJJ;;;<<MJJ}ddQh.?$.FGGM!&))FFNN$$m$??????r!   c                     d}|                      g dg dg dg          }|                      g dg dg dg          }t          t          j        |                                          ||           d S )	Nr   r   r   r   r   rr   r   r   r   r   )g.pG?cU(G?r  gQH?)gNZ]O?gNZ]OݿgNZ]O?g0i?r/   ro   )r)   r   r   r   r*   )r+   rW   r   rF   s       r   test_from_generic_rotvecr    s    DZZIILLII  F JJ444555 
  M
 H(0088::MPTUUUUUUr!   c                    |                      dt          j        d          z  dt          j        d          z  dt          j        d          z  gg dg dg          }t          j        |                                          }t          |d         |                      d          d                    t          |d	d df         |d
         dz             t          |d         |                      d          d                    t          |dd df         |                      g d                     t          |d         |                      g d                     d S )NgMb@?rR   gMb@)皙?g333333?r   r  r   rR   r   r   r   r   r   r   rR   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    sP   ZZ		!	edill2D49Q<<4GH		
  F ''//11DDJ

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

9 5 5b 9:::DBQBKJJ % % % & &' ' ' DL"**^^^"<"<=====r!   c                     t           j                            d          } t          j        |           }t          j        |                                                                          }|                    |d          sJ t          j        d|           }t          j        |                                                                          }t          j        |                    |d                    sJ d S r   )	r2   r\   rs   r   r   	as_rotvecrt   ru   rv   r   s      r   test_from_rotvec_array_liker    s    
)


$
$CS)))JZ1133::<<==A""15"11111 ,,,JZ1133::<<==A6*))!%)889999999r!   c                     |                      g d          }t          j        |          }|                                j        t          |           k    sJ d S )Nr   )r)   r   r   r*   r%   r   )r+   r   r"   s      r   test_from_rotvec_int_dtyper    sR    ZZ			""FV$$A99;; 0 4 4444444r!   c                 <   |                      dgdz            }t          j        |d          }|                                }|                      |dz  | j        z            }t          j        |          }|                                }t          ||           d S )Ngvô0?rR   Tdegrees   )r)   r   r   r*   pir   )r+   rotvec1rot1quat1rotvec2rot2quat2s          r   test_degrees_from_rotvecr  &  s    jj.)A-..G666DLLNNE jj3.//G((DLLNNEE5!!!!!r!   c                     t          j        t          d          5  t          j        |                     ddg                     d d d            d S # 1 swxY w Y   d S )N Expected `rot_vec` to have shaper   r   r   )r   r   r   r   r   r)   r+   s    r   test_malformed_1d_from_rotvecr   4  s    	z)K	L	L	L 1 1RZZA//0001 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1s   *AAAc                     d|dz
  z  dz   }t          j        t          d          5  t          j        |                     |                     d d d            d S # 1 swxY w Y   d S )NrK   r   r   r  r   )r   r   r   r   r   onesr+   rH   rc   s      r   test_malformed_nd_from_rotvecr%  :  s     D1H$E	z)K	L	L	L - -RWWU^^,,,- - - - - - - - - - - - - - - - - -   (AA #A z
dask.arrayz&missing required linalg.cross function)reasonc           	         t          j        |           }|| j        k    rdnd}|                     g dg dg dg          }|t	          |dd          z  }t          j        |                                          }t	          |d	          }t          |d d d
f         | 	                    |dz                       t          | j
                            ||d d d d
f                   |                     d          |           d S )NrS   r   r   r   rr   r   r   rr   r   ga2U0*3?r/   rr   T)r   keepdimsr   rR   r   r   ro   )r&   r'   r   r)   r   r   r(   r  r   cosr   crossr   )r+   r%   rW   r   r   angles         r   test_as_generic_rotvecr/  B  s    b!!ERZ''55TD::OOLL  D
 	N4b48888D%%//11F6+++EDAJuqy 1 1222BIOOFDBQBK88"((6:J:JQUVVVVVVr!   r@   c                 ~   |                      g d          }|                     |d|dz
  z  dz             }|                      g d          }|                     |d|dz
  z  dz             }t          j        |                                          }t          |j        |j                   t          ||           d S )Nr   r   r   rK   r   rL   )gj*0	x?g$x?g:2(r   )r)   rM   r   r(   r  r   rc   r   )r+   rH   r   expected_rotvecactual_rotvecs        r   test_as_rotvec_single_nd_inputr5  V  s     ::mmm$$D::dDD1H-455Djj!C!C!CDDOjj$$(2Cd2JKKO&t,,6688M$o&;<<<M?33333r!   c                 z   |                      g dg dg dg          }t          j        |          }|                    d          }t	          |d          }t          ||                      d          d	                    t          |d
         |d                    t          |d         |d                    d S )Nr   r   r   Tr  rr   r   g      ^@r   r   r   r   )r)   r   r   r  r   r   )r+   r   r   r   r.  s        r   test_as_rotvec_degreesr7  c  s     **iiiIII6
7
7C

s
#
#C]]4]((F6+++EE2::e,,R0111F1Ivay)))F1Ivay)))))r!   c                    |                      g dg dg dg          }t          t          j        |                                          |           t          t          j        |d                              d          |           d S )Nr  r   rr   r   )ga2U0*3gǺ6?ga2U0*?Tr  )r)   r   r   r   r  )r+   r   s     r   test_rotvec_calc_pipeliner:  o  s     ZZ		


  F
 H(00::<<fEEEH(>>>HHQUHVV    r!   c                 N   |                      g d          }|                     |d|dz
  z  dz             }|                      g d          }|                     |d|dz
  z  dz             }t          j        |          }t	          |                                |d           d S )	N)r   r   r   rK   r   r   )r   r   r   r   rL   rn   ro   )r)   rM   r   from_mrpr   r*   )r+   rH   mrprF   r   s        r   test_from_mrp_single_nd_inputr>  |  s     **[[[
!
!C
**S$$(+d2
3
3CJJ~~~..MJJ}ddQh.?$.FGGMs##FFNN$$m%@@@@@@r!   c                     t           j                            d          } t          j        |           }t          j        |                                                                          }|                    |d          sJ t          j        d|           }t          j        |                                                                          }t          j        |                    |d                    sJ d S r   )	r2   r\   rs   r   r<  as_mrprt   ru   rv   r   s      r   test_from_mrp_array_likerA    s    
)


$
$CS)))J*++--446677A""15"11111 ,,,J*++--446677A6*))!%)889999999r!   c                     |                      g d          }t          j        |          }|                                j        t          |           k    sJ d S )Nr   )r)   r   r<  r*   r%   r   )r+   r=  r"   s      r   test_from_mrp_int_dtyperC    sR    
**YYY

C#A99;; 0 4 4444444r!   c                     |                      g dg dg dg          }|                      g dg dg dg          }t          t          j        |                                          |           d S )Nr  r  r  )r  r   r   g)g}+;?g}+;g}+;?gߨӉؿr/   )r)   r   r   r<  r*   )r+   r=  rF   s      r   test_from_generic_mrprE    s    
**				  C JJ:::   M H%c**2244mDDDDDr!   c                     d|dz
  z  dz   }t          j        t          d          5  t          j        |                     |                     d d d            d S # 1 swxY w Y   d S )NrK   r   r"  zExpected `mrp` to have shaper   )r   r   r   r   r<  r#  r$  s      r   test_malformed_nd_from_mrprG    s     D1H$E	z)G	H	H	H * *"''%..)))* * * * * * * * * * * * * * * * * *r&  c                 "   |                      g dg dg dg          }|t          |d          d d d f         z  }|                      g dg dg dg          }t          t          j        |                                          |           d S )	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    s    ::  D 	N4a(((D11D::------		  L H&t,,3355|DDDDDr!   c           	      
   |                      t          j        | j        dz  dz             ddg          }t	          t          j        d|                      g d          d                                          |           d S )	Nr   r@   r   r   r   )i  r   r   Tr  )r)   r   tanr  r   r   r   r@  )r+   rK  s     r   test_past_180_degree_rotationrO    s     ::Q 7 77a@AALE2::kkk#:#:DIIIPPRR    r!   c                 ~   |                      g d          }|                     |d|dz
  z  dz             }|                      g d          }|                     |d|dz
  z  dz             }t          j        |                                          }t          |j        |j                   t          ||           d S )Nr1  rK   r   rL   )g?g?gO޿r   )r)   rM   r   r(   r@  r   rc   r   )r+   rH   r   rK  
actual_mrps        r   test_as_mrp_single_nd_inputrR    s     ::mmm$$D::dDD1H-455D::CCCDDL::lDD1H,=,DEEL#D))0022J!<#5666J-----r!   c                     |                      g dg dg dg dg          }|                      g dg dg dg dg          }t          t          j        |                                          |           d S )Nr  r9  )gzpy?r   r   )皙?r  rT  )gK}\UUſgK}\UU?rI  )r)   r   r   r<  r@  )r+   rQ  rK  s      r   test_mrp_calc_pipelinerU    s    		

	  J
 ::		...	  L
 H%j1188::LIIIIIr!   c                     t          j        d|                     d          d                                          }|                     g d          t	          j        d          z  }t          ||           d S )Nr   Z   Tr  r   r   r   r   r   )r   r   r)   r*   r   r   r   )r+   r   rF   s      r   test_from_euler_single_rotationrY    sg    sBJJrNNDAAAIIKKDJJ~~~..1=MD-(((((r!   c                 z   t          j        t          d          5  t          j        d|                     ddg                     d d d            n# 1 swxY w Y   t          j        t          d          5  t          j        d|                     dg                     d d d            d S # 1 swxY w Y   d S )Nz&Expected last dimension of `angles` tor   Xr   rW  XYZ)r   r   r   r   r   r)   r  s    r    test_from_euler_input_validationr]    s/    
z)Q	R	R	R 6 6CQG!4!45556 6 6 6 6 6 6 6 6 6 6 6 6 6 6 
z)Q	R	R	R 5 5E2::rd#3#34445 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5s#   +AAA9*B00B47B4c                 v   |                      |                     g d          d|dz
  z  dz             }t          j        d|d                                          }|                     g d          t          j        d	          z  }|                      |d|dz
  z  d
z             }t          ||           d S )N)r   r   rW  rK   r   r   r   Tr  rX  r   rL   )rM   r)   r   r   r*   r   r   r   )r+   rH   anglesr   rF   s        r   test_from_euler_nd_rotationr`    s     ZZ

:::..q0AD0HIIFufd;;;CCEEDJJ~~~..1=MJJ}ddQh.?$.FGGMD-(((((r!   c                    t          j        d|                     d          d                                          }t          j        d|                     d          d                                          }t	          ||           d S )Nr   rW  Tr  Zr   r   r)   r^   r   )r+   	extrinsic	intrinsics      r   (test_single_intrinsic_extrinsic_rotationrf    sr    #CBFFFPPRRI#CBFFFPPRRIIy)))))r!   c                    t           j                            d          }|                     |                    ddd                    }|                     |d          }t          j        d|d	                                          }t          j        d
|d	                                          }t          ||           d S )Nr   r  rI   rR   lowhighrq   rr   r   r   Tr  ZYX)
r2   r\   r]   r)   randintflipr   r   r*   r   )r+   r   abr   r   s         r   test_from_euler_rotation_orderrq    s     )


"
"C


3;;13V;<<==A
AE1d333;;==AE1d333;;==AAqr!   c                     d}t          j        d|                     ddg          d                                          }|                     g dg dg dg          }t	          |||	           d S )
Nrn   zxrW  Tr  r   r   r   rr   r   ro   rc  )r+   rW   r   r   s       r   -test_from_euler_elementary_extrinsic_rotationru    s    D

dBJJBx$8$8$
G
G
G
Q
Q
S
SC::

		  L
 CD111111r!   c           	         d}|                      g dg dg dg          }t          j        d|d                                          }t	          |d         |                      g d	g d
g dg          |           t	          |d         |                      g dg dg dg          |           t	          |d         |                      g dg dg dg          |           d S )Nr      <   -   rx  ry  rx  rz  rx  ry  ZXYTr  r   )g# ?      пgΙ6d?)g$+H?+Pz?Ppƿ)gPpֿ+Pz?gPp?ro   r   )g+a?r~  (s=?)r  r  g&(ٿ)r~  r  r  r   )ga}@?gF6g^@?)g0	8?gF6?g4?)      r   r  r)   r   r   r^   r   )r+   rW   r_  r   s       r   &test_from_euler_intrinsic_rotation_312r     s]   DZZ
  F
 
eVT
:
:
:
D
D
F
FCCK*********- " " 	    CK*********- " " 	    CK***)))***- " " 	     r!   c           	         |                      g dg dg dg          }t          j        d|d                                          }t	          |d         |                      g dg d	g d
g                     t	          |d         |                      g dg dg dg                     t	          |d         |                      g dg dg dg                     d S )Nrw  r{  r|  ZXZTr  r   )>d?g @r  )l>?^|@r  )X?r  r   r   g      ?g ,r  g ,?g      ?r  r        ?r   r   )r  g4&d'e?)cH?Xӿg'eֿ)r        ?r  r  r+   r_  r   s      r   &test_from_euler_intrinsic_rotation_313r  =  s:   ZZ
  F
 
eVT
:
:
:
D
D
F
FCCK,,,,,,***- " "    CK+++***'''- " "    CK---...***- " "     r!   c           	         |                      g dg dg dg          }t          j        d|d                                          }t	          |d         |                      g dg d	g d
g                     t	          |d         |                      g dg d	g dg                     t	          |d         |                      g dg dg dg                     d S )Nrw  r{  r|  zxyTr  r   )4&d?gPp?r  )r  r  g+Pz)r  r  r  r   )g
?\2׳r  )r  g ,?r  r   )r  r  r  )r  r  r   )g>dۿ @?r  r  r  s      r   &test_from_euler_extrinsic_rotation_312r  Y  s:   ZZ
  F
 
eVT
:
:
:
D
D
F
FCCK++++++---- " "    CK+++++++++- " "    CK,,,,,,,,,- " "     r!   c           	         |                      g dg dg dg          }t          j        d|d                                          }t	          |d         |                      g dg d	g d
g                     t	          |d         |                      g dg dg d
g                     t	          |d         |                      g dg dg dg                     d S )Nrw  r{  r|  zxzTr  r   )r  gl>r  )r  r  gXr  r   r  r  r   )r  gcHr  )r  r  r~  )r  r  r  r  r  s      r   &test_from_euler_extrinsic_rotation_313r  u  s:   ZZ
  F
 
eVT
:
:
:
D
D
F
FCCK---...)))- " "    CK,,,+++)))- " "    CK,,,,,,+++- " "     r!   c                     t           j                            d          } d}t          j        |           }t          j        ||                    |                                                    }|                    |d          sJ t          j        d|           }t          j        ||                    |                                                    }t          j        |                    |d                    sJ d S )Nrl   r   rm   rn   ro   rR   )	r2   r\   rs   r   r   as_eulerrt   ru   rv   )rf   orderrx   r"   s       r   test_from_euler_array_liker    s    
)


$
$CES)))JE:#6#6u#=#=#D#D#F#FGGA""15"11111 ,,,JE:#6#6u#=#=#D#D#F#FGGA6*))!%)889999999r!   c                     t           j                            d          } |                     dd          }t	          j        d|d          }t	          j        dt          |          d          }|                    |d	          sJ d S )
Nrl   Lr  )rj  rk  r   Tr  rn   ro   )r2   r\   rs   uniformr   r   floatru   )rf   degrx   r"   s       r   test_from_euler_scalarr    s    
)


$
$C
++$S+
)
)C$S#t<<<JCsT:::A""15"1111111r!   	seq_tupler   re  )FTc                      fd}t           j                            d          }d}t          j        |df          }|                    t           j         t           j        |f          |d d df<   |                    t           j         dz  t           j        dz  |f          |d d df<   |                    t           j         t           j        |f          |d d df<                        |          }d                    |          }|r|                                }t          j
        ||          }|                    |          }	t          ||	dd	
            ||	|z
  dd           d S )Nc                 "                        | d          }                    | d          }                    ||          }                                        |          |k               sJ                     ||k               sJ d S Nr   r   meanstdhypotrv   r   errormean_maxrms_maxr  r  rmsr+   s         r   
test_statsz1test_as_euler_asymmetric_axes.<locals>.test_stats      wwu1w%%ffUf##hhtS!!vvbffTllX-.....vvcGm$$$$$$$r!   r     rR   ri  r   r    rn   rW   rV   rS   +=r2   r\   r]   emptyr  r  r)   joinupperr   r   r  r   
r+   r  re  r  r   nr_  seqrotationangles_quats
   `         r   test_as_euler_asymmetric_axesr    sh   
% % % % % )


"
"CAXq!fF;;BE6QD;AAF111a4L;;BE6A:BEAIQD;IIF111a4L;;BE6QD;AAF111a4LZZF
'')

C  iikk"3//H##C((KFKae<<<<J{V#UE22222r!   c                      fd}t           j                            d          }d}t          j        |df          }|                    t           j         t           j        |f          |d d df<   |                    dt           j        |f          |d d df<   |                    t           j         t           j        |f          |d d df<                        |          }d                    |d         |d         |d         g          }|r|                                }t          j
        ||          }|                    |          }	t          ||	dd	
            ||	|z
  dd           d S )Nc                 "                        | d          }                    | d          }                    ||          }                                        |          |k               sJ                     ||k               sJ d S r  r  r  s         r   r  z0test_as_euler_symmetric_axes.<locals>.test_stats  r  r!   r   r  rR   ri  r   r   r  gU>=r  rT   r  r  r  s
   `         r   test_as_euler_symmetric_axesr    so   
% % % % % )


"
"CAXq!fF;;BE6QD;AAF111a4L;;125t;<<F111a4L;;BE6QD;AAF111a4LZZF ''9Q<1y|<
=
=C iikk"3//H##C((KFKag>>>>J{V#UE22222r!   c              #     K   | r6t          t          d|          5  d V  d d d            d S # 1 swxY w Y   d S t          j                    5  t          j        d           d V  d d d            d S # 1 swxY w Y   d S )NzGimbal lock)r   r+   r  )r   UserWarningwarningscatch_warningssimplefilter)should_warnr+   s     r   maybe_warn_gimbal_lockr    s!      	 MbAAA 	 	EEE	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 $&& 	 	!'***EEE	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   .22A44A8;A8suppress_warningsc                 2   t          j        |           }|| j        k    rdnd}|                     g dg dg dg dg          }d                    |          }|r|                                }t          j        ||d	          }|                                }	t          | |           5  |
                    |d|
          }
d d d            n# 1 swxY w Y   t          j        ||
d	                                          }t          |	||           d S )Nrn   r   )rz  rW  #   )r     )r  rW     )r  r     r  Tr  r  r  ro   r&   r'   r   r)   r  r  r   r   r^   r  r  r   r+   r  re  r  r%   rW   r_  r  r  mat_expectedangle_estimatesmat_estimateds               r   (test_as_euler_degenerate_asymmetric_axesr    s|    b!!ERZ''55TD ZZ	  F '')

C  iikk"3===H%%''L	$5 5r	:	: 
 
"++1B , 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 '_dKKKUUWWML-d;;;;;;s   ,CCCc                 \   t          j        |           }|| j        k    rdnd}|                     g dg dg dg dg          }d                    |d         |d	         |d         g          }|r|                                }t          j        ||d
          }|                                }	t          | |           5  |
                    |d
|          }
d d d            n# 1 swxY w Y   t          j        ||
d
                                          }t          |	||           d S )Nrn   r   )r  r   ry  )r  r   K   )ry  r  r  )r  r  r  r  r   r   Tr  r  ro   r  r  s               r   'test_as_euler_degenerate_symmetric_axesr    s    b!!ERZ''55TD ZZ	  F ''9Q<1y|<
=
=C  iikk"3===H%%''L	$5 5r	:	: 
 
"++1B , 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 '_dKKKUUWWML-d;;;;;;s   C&&C*-C*c                 b   |                      g dg dg dg          }|                     |d|dz
  z  dz             }t          j        |                              dd	          }|                      g d
          }|                     |d|dz
  z  dz             }t          ||d           d S )Nr   r   r   rK   r   r   r   Tr  )r   r   g     V@r   rn   ro   )r)   rM   r   r   r  r   )r+   rH   r   r_  expected_angless        r   test_as_euler_nd_rotationr  7  s     **				  C
 **S$$(+f4
5
5C!#&&//t/DDFjj..Ojj$$(2Cd2JKKOFO%888888r!   c                    t          j        |           }|| j        k    rdnd}t          j                            d          }d}t          j        ||          }t          ||           }|                                }|	                                                                }||z  }||z  }	| 
                    |ddf          }
t          j        |
          dd dd df                             |                     d                    }
t          ||
|           t          |	|
|           d	}|| j        k    rdnd
}|                     |                    |dz             |          }t          j        |          }|                                }|	                                                                }||z  }||z  }	| 
                    |dz             }t          j        |          dd dd df                             |                     d                    }t          |||           t          |	||           d S )Nrn   r   r   rY   )numr   rR   .ro   )rY   rR      r   rL   rp   r$   r   )r&   r'   r   r2   r\   r]   r   r,   r^   r   r  r   r   r_   r   r)   rw   r(   )r+   r%   rW   r   r  pp_matq_matresult1result2r   batch_shaper   r"   eye_nds                  r   test_invr  F  s   b!!ERZ''55TD
)


"
"C
AAC000Aq"AKKMMEEEGGEemGemGHHaAYEF5MM#rr2A2+&**266!9955EGU....GU.... KRZ''55TD::cjjkD&8j99:GGD4  AKKMMEEEGGEemGemGXXkF*++FVF^^C!RaRK(,,RVVAYY77FGV$////GV$//////r!   c                 >   t          j        |           }|| j        k    rdnd}t          j                            d          }t          t          j        |          |           }|                                }|	                                }|	                                }| 
                    ||          }| 
                    ||          }	|                     d          }
t          ||
|           t          |	|
|           t          t          j        d|          |           }|                                }|	                                }|	                                }| j        
                    ||          }| j        
                    ||          }|                     d	          }t          j        |          d
d dd df                             |                     d                    }t          |||           t          |||           d S )Nrn   r   	   #;h29s+,g0Hn rm   rR   ro   r   )r  rf   r   .)r&   r'   r   r2   r\   rs   r,   r   r   r^   r   r_   r   r   r  r   r   )r+   r%   rW   rf   r  rg   r  r  res1res2r_   r   r   x_matrixy_matrixr  r  r   s                     r   test_inv_single_rotationr  j  s   b!!ERZ''55TD
)

 G
H
HCx3///44A	AKKMMEKKMME99UE""D99UE""D
&&))CD#D))))D#D))))x1#666;;A	A{{}}H{{}}Hix22Gix22GHHYEF5MM#rr2A2+&**266!9955EGU....GU......r!   c                 $   d}t          t          j        |          |           }|                     |          }t	          |                                |           t	          |                                                                |           d S )NrY   )r,   r   identityr   r   	magnituder   )r+   r  r"   r   s       r   test_identity_magnituder    sr    
Ax(++R00Axx{{HAKKMM8,,,AEEGG%%''22222r!   c                     t          t          j                    |           }|                                dk    sJ |                                                                dk    sJ d S )Nr   )r,   r   r  r  r   r{   s     r   test_single_identity_magnituder    s^    x(**B//A;;==A5577!######r!   c                    t          j        |           }|| j        k    rdnd}d}t          t	          j        |d          |           }t          t	          j        |          |           }||z  }t          |                                |                                           ||	                                z  }t          |
                                |                     |          |           d S Nrn   r   rY   r   rm   ro   r&   r'   r   r,   r   r\   r  r   r*   r   r  r   r+   r%   rW   r  r  rg   r   s          r   test_identity_invariancer     s    b!!ERZ''55TD
Axqa000"55Ax(++R00AUFAIIKK!1!1222aeeggFF$$&&$??????r!   c                    t          j        |           }|| j        k    rdnd}d}t          t	          j        |d          |           }t          t	          j                    |           }||z  }t          |                                |                                           ||	                                z  }t          |
                                |                     |          |           d S r  r  r  s          r   test_single_identity_invariancer    s    b!!ERZ''55TD
Axqa000"55Ax(**B//AUFAIIKK!1!1222aeeggFF$$&&$??????r!   c                     t          j        d          } |                                 j        dk    sJ t          j        d          } |                                 j        dk    sJ t          j        d          } |                                 j        dk    sJ t          j        d          } t	          |                                                     d	d
          t          j        t          j        d
          d	         d                     t          j
        t          d          5  t          j        d           d d d            n# 1 swxY w Y   t          j
        t          d          5  t          j        dd           d d d            n# 1 swxY w Y   t          j
        t          d          5  t          j        dd           d d d            d S # 1 swxY w Y   d S )Nr   )rc   rL   rA   rA   r@   r   rR   r   rR   r@   r   r   rR   rr   r@   )rB   r   )`shape` must be an int or a tuple of intsr         @#Only one of `num` or `shape` can berR   r   r   )r  rc   z&takes from 0 to 1 positional arguments)r   r  r*   rc   r
   rM   r2   r`   r_   r   r   r   	TypeErrorr7   s    r   test_identity_shaper    so   ###A99;;$$$$"""A99;;&&&&'''A99;;	))))	***AAIIKK''A..q		"~0V0VWWW	z)T	U	U	U % %$$$$% % % % % % % % % % % % % % %	z)N	O	O	O / /av..../ / / / / / / / / / / / / / /	y(P	Q	Q	Q    !Q                                   s6   .EEE6FF F?G""G&)G&c                    d|dz
  z  dz   }|                      |                     d          |dz             }t          j        |          }|                                }|                     | j        | j        | j        dg          }|                      ||          }t          ||           t          j        |           }|                                }t          ||           d S )NrK   r   rL   r@   r   )rM   r_   r   r(   r  r)   r  r   )r+   rH   
quat_shaper   r"   r   expected_results          r   test_magnituder    s     "T)J::bffQiid!233D4  A[[]]Fjj"%q!9::Ojj*==OFO,,,D5!!A[[]]FFO,,,,,r!   c                 j   t          j        |                     d                    }|d                                         }t	          ||                     | j                  d                    |d                                         }t	          ||                     d          d                    d S )Nr@   r   r   rR   r   )r   r(   r_   r  r   r)   r  )r+   r"   r  r  s       r   test_magnitude_single_rotationr    s    266!99%%AdnnGGRZZ..r2333dnnGGRZZ__R011111r!   c                    t           j                            d          }t          j        d|          }t          j        d|          }||                                z                                  }t          ||           }t          ||           }|                     t          j        |                    }t          |
                    ||          |                     |          |k                d S )Nr  rY   rm   )r2   r\   rs   r   r   r  r,   r)   medianr
   ru   )r+   rf   r  rg   r_magrW   s         r   test_approx_equalr    s    
)

 G
H
HC$$$A$$$A[##%%Eq"Aq"A::bi&&''DANN1d++bjj.?.?$.FHHHHHr!   c                 @   t          j        |                     g d                    }t          j        |                     d                    }|                    |d                   sJ |                    |d                   rJ |                    |d         d          rJ |                    |d         dd	          rJ t          j        t          d
          5  |                    |d         d          sJ 	 d d d            d S # 1 swxY w Y   d S )N)r   r   g&.>r@   rR   r   绽|=ro   r   T)rW   r  zatol must be setr   r  )	r   r   r)   r(   r_   ru   r   warnsr  r+   r  rg   s      r   !test_approx_equal_single_rotationr    sW    	RZZ5566A266!99%%A>>!A$~~ad##### ~~ad~/////~~adt~<<<<<	k);	<	<	< 2 2~~adD~1111112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2s   % DDDc                    d}t           j                            d          }t          j        |                    |dz                       }t          j        |                    |dz                       }||                                z                                  }t          ||           }t          ||           }|j	        |k    sJ | 
                    t          j        |                    }t          |                    ||          | 
                    |          |k                t          j        |                    |dz                       }t          j        |                    d                    }||                                z                                  }t          ||           }t          ||           }|j	        |k    sJ | 
                    t          j        |                    }t          |                    ||          | 
                    |          |k                t          j        |                    |dz                       }t          j        |                    d                    }||                                z                                  }t          ||           }t          ||           }|j	        |k    sJ | 
                    t          j        |                    }t          |                    ||          | 
                    |          |k                d S )N)r   rY   rR   r   rL   rp   )r   rY   r   r@   r   rR   r@   )r2   r\   rs   r   r(   rw   r   r  r,   rc   r)   r  r
   ru   )r+   r  rf   r  rg   r  rW   s          r   test_approx_equal_batchedr     s    K
)


"
"C3::;+=:>>??A3::;+=:>>??A[##%%Eq"Aq"A;+%%%%::bi&&''DANN1d++bjj.?.?$.FHHH 	3::;+=:>>??A3::=:99::A[##%%Eq"Aq"A;+%%%%::bi&&''DANN1d++bjj.?.?$.FHHH 	3::;+=:>>??A3::9:5566A[##%%Eq"Aq"A;+%%%%::bi&&''DANN1d++bjj.?.?$.FHHHHHr!   c                 `   t          j        |                     d                    }t          j        |                     d                    }t          j        t
          d          5  |                    |           d d d            n# 1 swxY w Y   t          j        |                     d                    }t          j        |                     d                    }t          j        t
          d          5  |                    |           d d d            d S # 1 swxY w Y   d S )Nr  rR   r   r@   zbroadcastable shapesr   r   r@   rR   r@   )r   r(   r#  r   r   r   ru   r  s      r   *test_approx_equal_batched_input_validationr$  $  sy   2779--..A2779--..A	z)?	@	@	@  	q               	2776??++A2776??++A	z)?	@	@	@  	q                 s$   *BBB D##D'*D'c                 &   |                      |                     d           |                     d          f          }|                     |d|dz
  z  dz             }|                     d| j        dz  d          }|                     d          d	         }t          |           | j        u rd
nd}|D ]\}t          j	        ||z            
                                }|j        d	k    sJ t          |                                ||           ]d S )NrR   rK   r   rh  r   r   rZ   r   r   r   r  ro   )concatr_   rM   linspacer  r)   r   r;   r   r   r  rc   r   r  )r+   rH   axesthetasdesiredrW   tr_means           r   	test_meanr-  1  s    99rvvayyj"&&)),--D::dDD1H-677D[[BEAIs++Fjjoob!G#B''2:55445D @ @%a$h//4466|r!!!!((**G$?????@ @r!   rA   c                 v   |                      |                     |                     d           |                     d          f          d|dz
  z  dz             }| j        dz  }t	          j        ||z            }|                     |j        d d         d          }|dk    r|d         }t          |           | j	        u rd	nd
}t          |                    d                                          ||           |                     |j        dd         d          }|dk     r|d         }t          |                    d                                          ||           |                    d          }t          |                    d          |                    d          |           d S )NrR   r   r   r   r   r@   r   r   r   r   r  rr   r   ro   )r   rr   Tr   )r`   r&  r_   r  r   r   fullrc   r   r;   r   r  r  r*   )r+   rH   r(  thetar"   r*  rW   r,  s           r   test_mean_axisr2  ?  s    77299rvvayyj"&&))455ttax7H67QRRDEAIEUT\**A ggdj"os++Gqyy"+#B''2:55445DAFFFOO--//tDDDD ggdj2&,,Gaxx"+AFFF((2244gDIIII VVV__FFNNTN22AIII4M4M     r!   c           	      Z   t          j        |           | j        k    rdnd}t          j                            d          }|                     |                    d          t          j        |                     }t          j	        |          }|
                    d          }t          |j        d                   D ]}t          |j        d	                   D ]}t          j	        |d d ||d
f                   
                                }t          ||         |         |                                z                                  |                     d          d         |           |
                    d          }	t          |j        d                   D ]}t          j	        ||d
f                   
                                }t          |	|         |                                z                                  |                     d          d         |           d S )Nr  r   r   )r@   rA   rI   r@   rp   r$   r   r   r   .r   r   ro   r   r   )r&   r'   r   r2   r\   rs   r)   rw   r   r(   r  rb   rc   r   r   r  )
r+   rW   rf   rg   r"   mean_0rh   j
mean_slicemean_1_2s
             r   test_mean_compare_axisr9  Y  s    %b))RZ7755TD
)


"
"C


3::<:008I"8M8M
NNA1AVVV^^F171: < <qwqz"" 	< 	<A!+AaaaAslO<<AACCJVAYq\JNN,<,<<GGIIJJsOOB/d< < < < <	< vv6v""H171: 8 8'!S&	227799
!z~~'7'77BBDD

3+$	8 	8 	8 	8 	88 8r!   c           	         |                      d| j        dz  d          }|f|dz
  z  }|                     g dg dg dg          }|                     ddg          }|                     ||dz             }|                     ||dz             }|                     d	          d
         }|D ]}t	          j        ||dd dd d f         z            }|                    |          }	t	          j        ||z            }
|
                                }|j        d
k    sJ t          ||		                                z  
                                |d           d S )Nr   r   rZ   r   )r   r   r   r   r/  rK   r   r   .weightsr   ro   )r'  r  r)   r`   r   r   r  rc   r   r   r  )r+   rH   r)  r  r(  r<  r   r+  rwmwr"   ms               r   test_weighted_meanr@  o  sf   
 [[BEAIs++F 'TAX&K::{{{IIIyyy9::Djj!Q  G774v-..Dggg{T122Gzz#r"H I I!!d3AAA:&6"677WWWW%% T**FFHHw"}}}}RVVXX0022H4HHHHHI Ir!   c                 Z   t          j        |                     d                    }t          |                                          rZ|                    |                     d                     }|                     |                     |j	                            sJ n]t          j        t          d          5  |                    |                     d                      d d d            n# 1 swxY w Y   t          j        |                     d                    }t          j        t          d          5  |                    |                     d                     d d d            n# 1 swxY w Y   t          j        |                     d                    }t          j        t          d          5  |                    |                     d	                     d d d            n# 1 swxY w Y   t          j        t          d
          5  |                    d           d d d            n# 1 swxY w Y   t          j        t          d
          5  |                    d           d d d            n# 1 swxY w Y   t          j        t          d          5  |                    d           d d d            n# 1 swxY w Y   t          j        t          d
          5  |                    d           d d d            d S # 1 swxY w Y   d S )Nr@   r;  znon-negativer   r#  zExpected `weights` tor"  r  r  zaxis .* is out of boundsrR   r   )rr   r   z+`axis` must be None, int, or tuple of ints.0i)r   r(   r_   r   r*   r  r#  rv   r   _quatr   r   r   )r+   r"   r?  s      r   test_mean_input_validationrD    sZ   266!99%%AQYY[[!! (FFBGGAJJ;F''vvbhhqw''((((((]:^<<< 	( 	(FFBGGAJJ;F'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	2776??++A	z)@	A	A	A & &	rwwt}}%%%& & & & & & & & & & & & & & &2779--..A	z)@	A	A	A ( (	rwwv'''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 
z)D	E	E	E  	A              	z)D	E	E	E  	G              	z)V	W	W	W  	C              	z)D	E	E	E  	C                 s~   >+C55C9<C9*E88E<?E<*G;;G?G?!III*JJJ3KKK<L  L$'L$c                     t          j        |                     g d                    }|                    d          }t	          |t                     sJ d S )Nr   r   r   r   Freturn_indices)r   r(   r)   reduce
isinstance)r+   r"   r   s      r   test_reduction_no_indicesrK    sT    2::&:&:&:;;<<AXXUX++Ffh'''''''r!   c                     t          j        |                     g d                    }|                    d          }t	          |          t
          u sJ t          |          dk    sJ |\  }}}|J |J d S )NrF  TrG  rR   )r   r(   r)   rI  typetuplelen)r+   r"   r   reduced	left_best
right_bests         r   test_reduction_none_indicesrS    s    2::&:&:&:;;<<AXXTX**F<<5    v;;!%+"GY
r!   c                    t          j        |           }|| j        k    rdnd}t          j                            d          }t          j        d|          }t          j        d|          }t          j        d|          }t          ||           }t          ||           }t          ||           }	|	                    ||d	          \  }
}}t          j	        t          |          t          |          t          |          f          }t          |          D ]g\  }}t          |          D ]R\  }}t          |          D ]=\  }}t          j        ||z  |z                                  d
                   ||||f<   >Sht          j        t          j        |dd          |j        d         df          }t          j        t          j        |t          |	          df          d          }|                     |t          |          z            }|                     |t          |          z            }|                     ||k              sJ |                     ||k              sJ ||         |	z  ||         z  }|
                                |z                                  }t-          || 	                    t          |	                    |           d S )Nrn   r   r  rA   rm   rY   r  TrG  rR   r   r   rr   r   ro   )r&   r'   r   r2   r\   rs   r   r,   rI  r   rO  	enumerater   r*   rM   moveaxisrc   argmaxr)   rv   r   r  r   )r+   r%   rW   rf   l_npr_npp_nplr"   r  rP  rQ  rR  scalarsrh   lir6  pjkrkmax_indleft_best_checkright_best_checkreduced_checkmags                            r   !test_reduction_scalar_calculationrf    s   b!!ERZ''55TD
)

 G
H
HC?1#&&&D?23'''D?1#&&&DtR  AtR  AtR  A%&XXa4X%H%H"GY
 hD		3t99c$ii899G4 G G2t__ 	G 	GEAr"4 G G2#%627R<*@*@*B*B1*E#F#F1a  G	G jWa33gmA6F5KLLGi
7SVVRL99BBBGjjCFF!233Ozz'CFF"23366)./////66* 0011111o&*Q/?-@@M;;===(
3
3
5
5CC#a&&))555555r!   c                 D   t          j        |           }|                     g dg dg dg          }t          j        |          }t          j        |                     |d                    }|                     g d|          }|                     |d          }|                     g d|          }|                     |d          }t          |                    |          |           t          |                    |          |           t          |                    |          |           t          |                    |          |           |                     g d	|          }	|                     |	d          }
t          |                    |d
          |	           t          |                    |d
          |
           t          |                    |d
          |
           t          |                    |d
          |
           d S )Nr   rr   r   r   r   r   r   )r   r   rR   r$   g       r   rR   g       @rr   rR   Tinverse)r&   r'   r)   r   r   expand_dimsr   apply)r+   r%   r   r_1dr_2dv_1dv_2dv1d_rotatedv2d_rotatedv1d_inversev2d_inverses              r   'test_apply_single_rotation_single_pointrw    s   b!!E
**

				  C
 $$Ds ; ;<<D::kkk://D>>$Q>''D**\\\*77K..1.55KDJJt$$k222DJJt$$k222DJJt$$k222DJJt$$k222**\\\*77K..1.55KDJJtTJ22K@@@DJJtTJ22K@@@DJJtTJ22K@@@DJJtTJ22K@@@@@r!   c                 d   t          j        |           }|                     g dg dg dg          }t          j        |          }t          j        |                     |d                    }t          j                            d          }|f|dz
  z  }|                     |	                    |dz             |	          }| 
                    |d
          |d         |d         gd          }	t          |                    |          |	           t          |                    |          |	           | 
                    |d
         |d          |d         gd          }
t          |                    |d          |
           t          |                    |d          |
           d S )Nrh  r   r   r   r   r   r  rp   r$   .r   .r   ).r   rr   Trk  )r&   r'   r)   r   r   rm  r2   r\   rs   rw   r   r   rn  )r+   rH   r%   r   r1r2rf   r  v	v_rotated	v_inverses              r   *test_apply_single_rotation_multiple_pointsr    s    b!!E
**

				  C
 
	c	"	"B		bnnSqn99	:	:B
)


"
"C'TAX&K


3::;#7:88
FFA1V9*ai6;"EEIBHHQKK+++BHHQKK+++!F)aiZ6;"EEIBHHQH--y999BHHQH--y99999r!   c                    t          j        |           }t          j        d          }t          j        g dg dg dg          |d<   t          j        g dg dg dg          |d<   |                     ||	          }|f|dz
  z  }|                     ||d
z             }t          j        |          }|                     g d          }| 	                    |d          }|                     g dg dg          }|                     ||dz             }t          |                    |          |           t          |                    |          |           |                     g dg dg          }	|                     |	|dz             }	t          |                    |d          |	           t          |                    |d          |	           d S )Nr   rR   rR   rh  r   r   r   rt  r   r   r$   r   r   r   r   r   rR   r   ri  )r   r2  r   r/  rj  )r   rR   r   Trk  )r&   r'   r2   r  r3   r)   r`   r   r   rm  r   rn  )
r+   rH   r%   r   r  r"   v1v2r~  r  s
             r   *test_apply_multiple_rotations_single_pointr    s    b!!E
(9

CX

				  CF
 X		

		  CF
 **S*
&
&C'TAX&K
''#{Y.
/
/CS!!A	III		B		#	#B

LLL***566I	;#788IAGGBKK+++AGGBKK+++

LLL***566I	;#788IAGGBG--y999AGGBG--y99999r!   c                    t          j        |           }t          j        d          }t          j        g dg dg dg          |d<   t          j        g dg dg dg          |d<   |                     ||	          }|f|dz
  z  }|                     ||d
z             }t          j        |          }|                     g dg dg|	          }|                     g dg dg|	          }|                     ||dz             }t          |
                    |          |           |                     g dg dg|	          }|                     ||dz             }t          |
                    |d          |           d S )Nr  rh  r   r   r   rt  r   r   r$   r  r  r@   rA   rI   ri  )r@   irA   r/  rj  )r@   rI   Trk  )r&   r'   r2   r  r3   r)   r`   r   r   r   rn  )	r+   rH   r%   r   r  r"   r}  r~  r  s	            r   -test_apply_multiple_rotations_multiple_pointsr  4  s    b!!E
(9

CX

				  CF
 X		

		  CF
 **S*
&
&C'TAX&K
''#{Y.
/
/CS!!A


IIIyyy)
77A

LLL***5U
CCI	;#788IAGGAJJ	***

LLL***5U
CCI	;#788IAGGAtG,,i88888r!   c                    t           j                            d          }g d}g d}t          ||          D ]\  }}|                     |                    |dz                       }|                     |                    |dz                       }t          j        |          }t          j        ||          dz   }	|	                    |          }
|
j
        |	k    sJ |	                    |d          }
|
j
        |	k    sJ d S )	Nr   )r   rK   r"  r4  )rA   r   r   )r   rK   r"  r4  )r@   r   )r   r@   r   )rA   r@   r   )rI   rA   r@   r   r   rp   rL   Trk  )r2   r\   rs   r   r)   rw   r   r(   broadcast_shapesrn  rc   )r+   rf   vector_shapes
rot_shapesq_shapev_shaper}  rg   r"   rc   r   s              r   test_apply_shapesr  R  s   
)


"
"C777MUUUJ#J>>    JJszzw~z6677JJszzw~z6677q!!#GW55<GGAJJw%GGAtG$$w%   r!   c                     t           j                            d          } t          j        |           }|                     ddd          }|                    |                                          }|                    |          }t          ||d           |                     ddd	          }|                    |                                          }|                    |          }t          ||d           d S )
Nrl   rm   irZ   r   rp   rn   ro   r  )r2   r\   rs   r   r  rn  rt   r   )rf   r"   r+  r}  
v_expecteds        r   test_apply_array_liker  d  s    
)


$
$CC   AD#D))A	

AJAz....D#F++A	

AJAz......r!   c                    t          j        |                     d                    }t          j        t
          d          5  |                    |                     d                     d d d            n# 1 swxY w Y   t          j        t
          d          5  |                    |                     d                     d d d            n# 1 swxY w Y   t          j        |                     d                    }t          j        t
          d          5  |                    |                     d                     d d d            n# 1 swxY w Y   t          j        |                     d	                    }t          j        t
          d          5  |                    |                     d
                     d d d            d S # 1 swxY w Y   d S )Nr@   zExpected input of shaper   r   r  r"  Cannot broadcastr   )r   r  r   r@   r  )r   r(   r#  r   r   r   rn  r{   s     r   test_apply_input_validationr  s  s   2771::&&A	z)B	C	C	C  	

              	z)B	C	C	C ! !	   ! ! ! ! ! ! ! ! ! ! ! ! ! ! !2776??++A	z);	<	<	< ! !	   ! ! ! ! ! ! ! ! ! ! ! ! ! ! !277<0011A	z);	<	<	< $ $		""###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $sH   )A88A<?A<)CCC )EEE")GGGc                 r   t           j                            d          }|                    d|f|dz
  z  z   dz             }|                     t          j        |                                                    }t          j        |          }t          |d                                         |d         d           t          |d                                         |d	         d           t          |d d
                                         | 
                    |d         d          d           d S )Nr   r"  r   rL   rp   r   rS   ro   r   rr   r   )r2   r\   rs   rw   r)   r   r(   r^   r   r   rm  )r+   rH   rf   r   r   r"   s         r   test_getitemr    s    )


"
"C::5D7dQh#77$>:??D
**X'--7799
:
:CS!!AAaDNN$$c&k>>>>AaDNN$$c&k>>>>AcrcF$$&&s6{(K(KRWXXXXXXr!   c                     t          j        t          d          5  t          j        |                     g d                    d          d d d            d S # 1 swxY w Y   d S )Nnot subscriptabler   r/   r   )r   r   r  r   r(   r)   r  s    r   test_getitem_singler    s    	y(;	<	<	< 8 82::lll3344Q778 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8s   0AA Ac                  J   t          j        g dg dg dgg dg dg dgg          } t          j        |           }t	          |dg                                         | dg         d           t	          |dd	g                                         | dd	g         d           d S )
Nr   r   r   rt  r   r   rS   ro   r   )r2   r3   r   r   r   r^   )r   r"   s     r   test_getitem_array_liker    s    
(\\\YYYY  YYZZYY ! " "C 	S!!AAqcF$$&&QCu====Aq!fI''))31v;UCCCCCCr!   c                    t          j        |                     g d                    }t          j        t
          d          5  t          j        |                     g d                    |d<   d d d            d S # 1 swxY w Y   d S )Nr/   r  r   r   )r   r(   r)   r   r   r  r{   s     r   test_setitem_singler    s    2::lll3344A	y(;	<	<	< < <!"**\\\":":;;!< < < < < < < < < < < < < < < < < <s   -A??BBc                    t           j                            d          }t          t	          j        d|          |           }t          t	          j        d|          |           }||dd<   t          |dd                                         |                                           t	          j        |                     |	                    d                              }t	          j        |                     |	                    d	                              }||dd
<   t          |dd
                                         |                                           d S )Nr  rY   rm   rA   r   rI   rR   rA   r@   rp   )r   rA   r@   rR   
r2   r\   rs   r,   r   r
   r*   r(   r)   rw   r+   rf   r{  r|  s       r   test_setitem_slicer    s   
)

 G
H
HC	444b	9	9B	s333R	8	8BBqsGBqsGOO%%rzz||444 
	BJJszzyz'A'ABB	C	CB		BJJszzyz'A'ABB	C	CBBqsGBqsGOO%%rzz||44444r!   c                    t           j                            d          }t          t	          j        d|          |           }t          t	          j        |          |           }||d<   t          |d                                         |                                           t	          j        |                     |	                    d                              }t	          j        |                     |	                    d                              }||d<   t          |d                                         |                                           d S )Nr  rY   rm   r   r  rp   r  r  r  s       r   test_setitem_integerr    s   
)

 G
H
HC	444b	9	9B	C000"	5	5BBqEBqEMMOORZZ\\222 
	BJJszzyz'A'ABB	C	CB		BJJszzvz'>'>??	@	@BBqEBqEMMOORZZ\\22222r!   c                     t          t          j        dd          |           }t          j        t
          d          5  d|d<   d d d            d S # 1 swxY w Y   d S )NrY   r   rm   zRotation objectr   r   )r,   r   r\   r   r   r  r{   s     r   test_setitem_wrong_typer    s    xrq111266A	y(9	:	:	:  !                 s    AAAc                    t          j        d          }t          j        g dg dg dg          |d<   t          j        g dg dg dg          |d<   |                     |          }t	          j        |          }t          t          |          d	           t          t          |d d
                   d           d S )Nr  rh  r   r   r   rt  r   r   r   rr   )r2   r  r3   r)   r   r   r   rO  r   s      r   test_n_rotationsr    s    
(9

CX

				  CF
 X		

		  CF
 **S//CS!!AQQssVa     r!   c                     t           j                            d          } t          t	          j        |                                           j        d           t          t	          j        d |                                           j        d           t          t	          j        d|                                           j        d           t          t	          j        d|                                           j        d           t          t	          j        | d	                                          j        d           t          t	          j        | d
	                                          j        d           t          t	          j        | d	                                          j        d           t           j                            d          t           j                            d          }}t	          j        d|          }t	          j        |d	          }t          |                                |                                                    dd          d           t          j
        t          d          5  t	          j        d| d           d d d            n# 1 swxY w Y   t          j
        t          d          5  t	          j        | d	           d d d            n# 1 swxY w Y   t          j
        t          d          5  t	          j        d| d            d d d            d S # 1 swxY w Y   d S )Nr   rm   rL   r   r   rA   r  r   )rf   rc   r   r#  r  r  *   rI   r@   rn   ro   r
  r   rR   r  )r  rf   rc   r  r	  z&takes from 0 to 2 positional arguments)r2   r\   rs   r   r   r*   rc   r   rM   r   r   r   r  )rf   rng1rng2r_numr_shapes        r   test_random_rotationr    so   
)


"
"CS)))113394@@@3///7799?FFF,,,4466<fEEE,,,4466<fEEES333;;==CTJJJS555==??EvNNNS777??AAGSSS&&r**BI,A,A",E,E$DOA4(((Eo$f555GEMMOOW__%6%6%>%>q!%D%D5QQQQ	z)N	O	O	O 5 5A#V44445 5 5 5 5 5 5 5 5 5 5 5 5 5 5	z)T	U	U	U , ,Cs++++, , , , , , , , , , , , , , ,	y(P	Q	Q	Q & &3%%%& & & & & & & & & & & & & & & & & &s6   J//J36J3K88K<?K<MM	Mc                    t          j        |           }|| j        k    rdnd}|                     g dg dg|          }|                     |d          }t	          j        ||          \  }}t          |                                |                     d          |	           t          ||                     d
          d         dd           d S )Nrn   h㈵>r  r  r$   T)copyrR   ro   r   r   Fr   check_shaperW   )	r&   r'   r   r)   r   align_vectorsr   r^   r_   )r+   r%   rW   r   r   r"   rssds          r   test_align_vectors_no_rotationr    s    b!!ERZ''55TD


IIIyyy)
77A


14
  A$Q**GAtAKKMM266!9948888D"**S//"-5tLLLLLLr!   c                 @   t          j        |           }|| j        k    rdnd}t          j                            d          }t          t          j        |          |           }|                     |	                    d          |          }|
                    |          }t          j        ||          \  }}t          |                                |                                           t          ||                     d          d	         d
|           d S )Nr   gMb`?l	   #t}":xL rm   rA   rR   rp   r$   r   r   Fr  )r&   r'   r   r2   r\   rs   r,   r   r)   rw   rn  r  r   r*   )	r+   r%   rW   rf   crp  ro  estr  s	            r   test_align_vectors_no_noiser    s    b!!EBJ&&44DD
)

 F
G
GCx3///44A


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

A&q!,,ICAIIKK///D"**S//"-5tLLLLLLr!   c                    t          j        |           }|| j        k    rdnd}|                     g dg dg          }|                     g dg dg          }t	          j        ||          \  }}t          ||                    |          d           t          ||                     d	          d
         d|           d S )Nr   gMbP?)gq?gH*fܿgHlB?)gMs^E?g+Obp޿gn^w)g=2)p?g[[VKg?gw7?)gѿgGvgpr   ro   r   r   Fr  )r&   r'   r   r)   r   r  r   rn  )r+   r%   rW   r   r   r  r  s          r   $test_align_vectors_improper_rotationr    s    b!!EBJ&&44DD


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


888:::< 	= 	=A &q!,,ICAsyy||$////D"**S//"-5tLLLLLLr!   c                 r   |                      d          d         }|                      g dg dg dg          }d}|                      g dg dg dg          }|                      g d	g d
g dg          }t          j        ||d          \  }}}t          |||           t          |||           d S )NgbQ?r   )r  r   r   )r         ?r   )r   r   r   r   r   r   r   r   r   )r   g?r   )r   r   r   Treturn_sensitivityro   )r)   r   r  r   )	r+   rssd_expectedsens_expectedrW   ro  rp  r   r  senss	            r   #test_align_vectors_rssd_sensitivityr  $  s    JJ011"5MJJ . . 0 1 1M D


IIIyyy)))455A


III{{{KKK899A,QdKKKOCtD-d3333D-d333333r!   c                    d}|                      t          j        |d                              g d                    }|                      t          j        |d                              g d                    }d}t          j        |||                     |          d          \  }}}t          j        ||||                     |          z  d          \  }}	}
t          |                                |                                           t          t          j	        |          |z  |	d	           t          ||
           d S )
NrY   r   rm   r   r   r   Tr   ro   )
r)   r   r\   rn  r  r#  r   r^   r   r   )r+   r  ro  rp  scaleest1rssd1cov1est2rssd2cov2s              r   !test_align_vectors_scaled_weightsr  2  s!   
A


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


8?1!,,,22999==>>AE .q!RWWQZZFFD% .q!URWWQZZ5GNND%DNN$$dnn&6&6777DIe$$u,e$????D$r!   c                    t          j        |           }t          j                            d          }d}t          t          j        |          |           }|                     |                    |df          |          }|	                    |          }t          j
        d          }d|z  }t          j        |                     |                    |df|	          |                    }	|		                    |          }
t          j        |
|d
          \  }}}||                                z                                  }t          |d         |                     d          d         |           t          |d         |                     d          d         |           t          |d         |                     d          d         |           ||                     |          z  }t          |d         |                     d          d         |           t          |d         |                     d          d         |           t          |d         |                     d          d         |           |                     |
|	                    |          z
  dz            dz  }t          ||d           d S )Nr  rZ   rm   rR   rp   r$   r   r  )rq   r  Tr  r   r   r   ro   r   r   r/  r  r   F)r  )r&   r'   r2   r\   rs   r,   r   r)   rw   rn  deg2radr   r  r   r  r   sum)r+   r%   rf   	n_vectorsr   vectorsr   sigma	tolerancenoisenoisy_resultr  r  coverror_vector
rssd_checks                   r   test_align_vectors_noiser  A  sz   b!!E
)

 G
H
HCI
S1112
6
6Cjj)Q88jFFGYYwF JqMMEeI 


3::Iq>:??u
MM E ;;v&&L+L'?CE E ENCs #''))O..00LLORZZ__R%8yIIIILORZZ__R%8yIIIILORZZ__R%8yIIII 2::eCCIrzz#r2CCCCCIrzz#r2CCCCCIrzz#r2CCCC		'(:(::q@AASHJD*%888888r!   c                 N   t          j        t          d          5  |                     g d          |                     g d          }}t	          j        ||           d d d            n# 1 swxY w Y   t          j        t          d          5  |                     g d          |                     g d          }}t	          j        ||           d d d            n# 1 swxY w Y   t          j        t          d          5  |                     g dg dg          |                     g dg          }}t	          j        ||           d d d            n# 1 swxY w Y   t          j        t          d          5  |                     g dg          |                     g dg          }}|                     d	gg          }t	          j        |||           d d d            n# 1 swxY w Y   t          j        t          d
          5  |                     g dg dg          |                     g dg dg          }}|                     g d          }t	          j        |||           d d d            n# 1 swxY w Y   |                     g dg          |                     g dg          }}|                     dg          }t          |          r}t	          j        |||          \  }}|                     |                     |	                                                    s
J d            |                     |          s
J d            nIt          j        t          d          5  t	          j        |||           d d d            n# 1 swxY w Y   |                     g dg dg          |                     g dg dg          }}|                     | j
        | j
        g          }t          |          r}t	          j        |||          \  }}|                     |                     |	                                                    s
J d            |                     |          s
J d            nIt          j        t          d          5  t	          j        |||           d d d            n# 1 swxY w Y   |                     g dg          |                     g dg          }}t          |          r|t	          j        ||          \  }}|                     |                     |	                                                    s
J d            |                     |          s
J d            nHt          j        t          d          5  t	          j        ||           d d d            n# 1 swxY w Y   |                     g dg dg          |                     g dg dg          }}|                     | j
        d	g          }t          |          rOt	          j        |||d          \  }}}|                     |                     |                    s
J d            nKt          j        t          d          5  t	          j        |||d           d d d            n# 1 swxY w Y   |                     g dg          |                     g dg          }}t          |          rNt	          j        ||d          \  }}}|                     |                     |                    s
J d            nJt          j        t          d          5  t	          j        ||d           d d d            n# 1 swxY w Y   |                     g dgg          |                     g dgg          }}t          j        t          d          5  t	          j        ||           d d d            d S # 1 swxY w Y   d S )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 matrixz)Expected inputs `a` and `b` to have shape)r   r   r   r)   r   r  r   rv   r   r*   inf)r+   ro  rp  r<  r"   r  r  s          r    test_align_vectors_invalid_inputr  h  s
   	z)K	L	L	L % %zz,,,''III)>)>1q!$$$% % % % % % % % % % % % % % % 
z)K	L	L	L % %zz)))$$bjj&>&>1q!$$$% % % % % % % % % % % % % % % 
z *? 
@ 
@ 
@ % %zz999iii0112::yyyk3J3J1q!$$$% % % % % % % % % % % % % % %
 
zE
G 
G 
G . .zz999+&&

III;(?(?1**qcU##q!W---	. . . . . . . . . . . . . . . 
zJ
L 
L 
L . .zz999iii0112::yyy)))>T3U3U1**YYY''q!W---	. . . . . . . . . . . . . . . ::yyyk""BJJ			{$;$;qAjj"GW 2(Aw774vvbhhqyy{{++,,HH.HHH,xx~~33333~3]:!LN N N 	2 	2"1a111	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 ::yyy))),--rzz999iii:P/Q/QqAjj"&"&)**GW 2(Aw774vvbhhqyy{{++,,HH.HHH,xx~~33333~3]:!FH H H 	2 	2"1a111	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 ::yyyk""BJJ			{$;$;qAQ )(A..4vvbhhqyy{{++,,HH.HHH,xx~~33333~3]:!KM M M 	) 	)"1a(((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) ::yyy))),--rzz999iii:P/Q/QqAjj"&!%%GQ K .q!WQUVVV4vvbhhtnn%%II'III%I]:!CE E E 	K 	K"1aTJJJJ	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K ::yyyk""BJJ			{$;$;qAQ N .q!MMM4vvbhhtnn%%II'III%I]:@B B B 	N 	N .q!MMMM	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N
 ::			{m$$bjj999+&?&?qA	zH
J 
J 
J % %q!$$$% % % % % % % % % % % % % % % % % %s   AA,,A03A0AC""C&)C&A	EE!$E!AG--G14G1A$JJ
J;NN"%N"'S

SS+WWW#[[[;^^#&^#7``!`c                    t          j        |           }|| j        k    rdnd}|                     g dg dg          }|                     g dg dg          }|                     g dg dg dg          }t	          j        |||                     | j        d	g          
          \  }}t          |                                ||           t          |	                    |          ||           t          ||                     d          d         |           |                     g dg dg          }d}t	          j        |||                     | j        d	g          
          \  }}t          |                                ||           t          |	                    |          d         |d         |           t          j
        ||||           sJ |                     g dg dg          }	t          |	                    |          |	|           |                     g dg dg          }|                     g dg dg          }d}t	          j        |||                     | j        d	g          
          \  }}t          |	                    |          d         |d         |           t          j
        ||||           sJ d S )Nrn   r   r   r   r   r   r   r  r   r   r   r;  ro   r   r   )r   r   r   r   r   )rW   r+   r   r   r   r  )r   rR   rr   )r   rR   r   r9  g4i?)r&   r'   r   r)   r   r  r  r   r^   rn  isclose)
r+   r%   rW   rp  ro  
m_expectedRr  r  
a_expecteds
             r   "test_align_vectors_align_constrainr    s    b!!ERZ''55TD


IIIyyy)**A


KKK+,,A[[[&YY&YY( ) )J $Q2::rvqk3J3JKKKGAtAKKMM:D9999AGGAJJ----D"**S//"-D9999 	

IIIyyy)**AM$Q2::rvqk3J3JKKKGAtAKKMM:D9999AGGAJJv&&	====;t]"======[[[)))455JAGGAJJ
6666 	

III{{{+,,A


LLL***-..A&M$Q2::rvqk3J3JKKKGAtAGGAJJv&&	====;t]"========r!   c           
      2   t          j        |           }|| j        k    rt          j        d           d}g }t          d          D ]@}|                    t          j        |d|z             	                                           At          |          D ] }| 
                    t          j        d|d         |         d         z  d|d         |         d         z  g          |	          }| 
                    t          j        d
|d         |         d         z  d|d
         |         d         z  g          |	          }t          j        ||ddg          \  }}t          j        ||| j        dg          \  }	}t          |	                                |		                                d           "t          |          D ]M}| 
                    t          j        d|d         |         d         z  d|d         |         d         z  d
|d         |         d         z  g          |	          }| 
                    t          j        d|d
         |         d         z  d|d         |         d         z  d|d         |         d         z  g          |	          }t          j        ||g d          \  }}t          j        ||| j        ddg          \  }	}t          |	                                |		                                d           Od S )Nz9Align vectors near inf is numerically unstable in float32rZ   rI   rY   rm   r   r   r   r$   rR   r@       _Br;  -C6?ro   rA   )r  r   r   )r&   r'   r;   r   skiprb   appendr   r\   r^   r)   r2   r3   r  r  r   )
r+   r%   r  matsrh   ro  rp  r  _R2s
             r   test_align_vectors_near_infr    s   
 b!!E
OPPPAD1XX @ @HOA26222<<>>????1XX B BJJrxT!WQZ]!2AQ
14E FGGuJUUJJrxT!WQZ]!2AQ
14E FGGuJUU%aT1I>>>1&q!bfa[AAAAr||~~DAAAAA1XX 	B 	BJJrx471:a=!DGAJqM/1T!WQZPQ]? STT"  $ $JJrx471:a=!DGAJqM/1T!WQZPQ]? STT"  $ $ %aLLLAAA1&q!bfa^DDDAr||~~DAAAAA	B 	Br!   c                    d}|                      g dg dg          }|                      g dg dg          }|                      g dg dg dg          }t          j        ||| j        dg          \  }}t	          |                                ||	           t          j        |d
         |d
                   \  }}t	          |                                ||	           t	          |                    |d
                   |d
         |	           |                      g dg dg          }|                      g dg dg dg          }t          j        ||| j        dg          \  }}t	          |                                ||	           t          j        |d
         |d
                   \  }}t	          |                                ||	           t	          |                    |d
                   |d
         |	           d S )Nrn   r   r   r   r   r  r   r   r   r;  ro   r   r   )r)   r   r  r  r   r^   rn  )r+   rW   ro  rp  r  r  r  s          r   test_align_vectors_parallelr    s   D


KKK+,,A


KKK+,,A[[['ZZ&YY( ) )J !!Q<<<DAqAKKMM:D9999!!F)QvY77DAqAKKMM:D9999AGGAfI&&&	====


IIIyyy)**A[[[&YY&YY( ) )J !!Q<<<DAqAKKMM:D9999!!F)QvY77DAqAKKMM:D9999AGGAfI&&&	======r!   c           	      Z   t          j        |           }|| j        k    rdnd}t          j        g dg dgg dg dgg dg dgg          }t          j        d |D                       }t          ||          D ]\  }}|                     ||          |                     ||          }}t          j        ||| j	        d	g
          \  }}t          |                                |                     | j                  d         |           t          |                    |d                   |d         |           t          j        dd          }	t          j        |	                                dz            }
g dg dg}g dg dg}g }|
D ]J}|                    t          j        |                    |d                   |d	         g                     Kt%          |                     d                    dk    rd}|D ]}|                     |          |                     |          }}t          j        ||| j	        d	g
          \  }}t          j        ||dd	g
          \  }}t          |                                |                                |           d S )Nrn   r   r  r   r   r   c                 0    g | ]}|d           |d         gS r   r   r   ).0ro  s     r   
<listcomp>z3test_align_vectors_antiparallel.<locals>.<listcomp>(  s&    ===QQqTE1Q4====r!   r$   r   r;  r   ro   r   rZ   r   rm   r  r   cudar  )r&   r'   r   r2   r3   zipr)   r   r  r  r   r  r  rn  r\   r   r  r  r   r^   )r+   r%   rW   
as_to_test
bs_to_testro  rp  r  r  RsdRsdRr  s                r   test_align_vectors_antiparallelr    s    b!!ERZ''55TDKKK3%IIyyy1%IIyyy13 4 4J ==*===>>JJ
++ B B1zz!5z))2::au:+E+E1%aRVQK@@@1rzz"%'8'8'<4HHHH&	**AfIDAAAAA 
!	$	$	$B

r||~~d2
3
3C	YYYA	YYYAJ < <"(BHHQqTNNAaD#9::;;;; bjjmm$$.. B Bzz!}}bjjmm1%aRVQK@@@1&q!dAY???Ar||~~DAAAAA	B Br!   c                 \   t          j        |           }|| j        k    rdnd}t          j        dd                                          }t          j        dd                                          }t          ||          D ]\  }}|                     |d         |          }|                     |d         |          }t          j        ||          \  }	}
t          |	
                    |          ||           t          |
|                     d	          d
         |           d S )Nrn   r  rZ   r   rm   r   r$   ro   r   r   )r&   r'   r   r   r\   r^   r  r)   r  r   rn  )r+   r%   rW   mats_amats_bmat_amat_bro  rp  r  r  s              r   test_align_vectors_primary_onlyr  I  s   b!!ERZ''55TD_Sa(((2244F_Sa(((2244FFF++ > >uJJuQxuJ--JJuQxuJ-- (A..4

AD1111bjjoob1=====> >r!   c                     t           j                            d          } t          j        |           }|                     d          }|                    |          }t          j        ||          \  }}t          j        |                                |                                          \  }}t          |	                                |	                                           t          ||           d S )Nrl   rm   r  rp   )
r2   r\   rs   r   rw   rn  r  rt   r   r*   )rf   r  rp  ro  est_expectedr  r  r  s           r   test_align_vectors_array_liker  [  s    
)


$
$CC   A


A	

A"*"8A">">L-&qxxzz188::>>ICL((**CKKMM:::D-(((((r!   c                    t          j        |           }t          j                            d          }t          t          j        |          |           }|                     |                    d          |          }|                     |	                    |          | j
                  }t          j        ||          \  }}t          |                                |                                           d S )Nrl   rm   r  rp   r$   )r&   r'   r2   r\   rs   r,   r   r)   rw   rn  r;   r  r   r*   )r+   r%   rf   r  rp  ro  r  r  s           r   test_align_vectors_mixed_dtypesr  g  s    b!!E
)


$
$Cx3///44A


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


1771::RZ
00A#Aq))FCCKKMM199;;/////r!   c                     |                      g d          }t          t          j        |                    }t	          |           rd}||k    sJ d S |                    d          sJ d S )Nr/   zRotation.from_matrix(array([[1., 0., 0.],
                            [0., 1., 0.],
                            [0., 0., 1.]]))Rotation.from_matrix()r)   reprr   r(   r   
startswith)r+   rg   actualr   s       r   test_repr_single_rotationr  s  s~    


<<<  A($Q''((F|| :/ !!!!!!  !89999999r!   c                 <   |                      g dg dg          t          j        d          z  }t          j        |          }t          |           r0d}dt          dt          fd} ||           ||          k    sJ d S |                    d          sJ d S )	N)r   r   r   r   r   r   a  Rotation.from_matrix(array([[[ 0.,  0.,  1.],
                             [ 0.,  1.,  0.],
                             [-1.,  0.,  0.]],

                            [[ 0., -1.,  0.],
                             [ 1.,  0.,  0.],
                             [ 0.,  0.,  1.]]]))sreturnc                     d                     t          t          j        |                                                     S )N
)r  mapstrlstrip
splitlines)r  s    r   strippedz-test_repr_rotation_sequence.<locals>.stripped  s(    99SQ\\^^<<===r!   r  )r)   r   r   r   r(   r   r  r  )r+   rg   r  r   r   s        r   test_repr_rotation_sequencer!    s    


NNNLLL122TYq\\AA"1%%)F|| :4	> 	> 	> 	> 	> 	> x88H#5#5555555  !89999999r!   c                    t           j                            d          }t          j        |                     |                    d                              }|                                }g d}t          ||          }t          |j
        t          |                     d                              sJ g d} ||          }|                                }|d d df         dk     d d d f         }	|                     |	| |          }|d d df         dk     d d d f         }	|                     |	| |          }t          |d         |d                    t          |d         |d	                    t          |d
         |d                    t          |d         |d                    t          |d         |d                    |                     |d         |d         z            }
|                     |d         |d	         z            }t          |
|           |                     |d         |d         z            }|                     |d         |d
         z            }t          ||           |                     |d	         |d         z            }t          |d|
dz  z  dz
             t          t!          |          t!          |                     d S )Nr   r  rp   )r   r   r   rR   r@   )r   r   r  r   r  r   g      @rR   g      
@g@r@   rr   r   r   r   )rA   .r   )r  .)rY   .)r@   .r   r   )r2   r\   r]   r   r(   r)   r  r*   r   rJ  timesrM  wherer   r  r   rO  )r+   r   key_rots	key_quats	key_timesinterpolatorr#  interp_rotsinterp_quatsmask
cos_theta1
cos_theta2
cos_theta4
cos_theta5
cos_theta3s                  r   
test_slerpr1    s   
)


"
"C!"**S[[f[-E-E"F"FGGH  ""IIH--Ll($rzz!}}*=*=>>>>>===E,u%%K&&((L B!#QQQW-D88D<->>Laaaeq !!!T'*D	z955I L()F*;<<<L()F*;<<<L()F*;<<<L()F*;<<<L)9V+<=== V,|F/CCDDJV,|F/CCDDJJ
+++V,|F/CCDDJV,|F/CCDDJJ
+++ V,|F/CCDDJJZ] 3a 7888 [!!3u::.....r!   c                     t          j        t          d          5  |                     g dg dg          }|                     ddg          }t	          ||           d d d            d S # 1 swxY w Y   d S )Nzmust be a `Rotation` instancer   r   r/   r   r   )r   r   r  r)   r   )r+   r"   r+  s      r   test_slerp_rot_is_rotationr3    s    	y(G	H	H	H  JJ			!		# $ $JJ1va	                 s   AA,,A03A0z*must be a sequence of at least 2 rotationsc                     t          j        |                     g dg                    }t          j        t
          t                    5  t          dg|           d d d            d S # 1 swxY w Y   d S )N)r   r   rR   r@   r   r   )r   r(   r)   r   r   r   SLERP_EXCEPTION_MESSAGEr   r{   s     r   test_slerp_single_rotr6    s    2::~~~&67788A	z)@	A	A	A  qc1                 s   A**A.1A.c                 0   t          j                    }t          j        |                     |                                                    }t          j        t          t                    5  t          g |           d d d            d S # 1 swxY w Y   d S )Nr   
r   r\   r(   r)   r*   r   r   r   r5  r   r{   s     r   test_slerp_rot_len0r9    s    A2::aiikk2233A	z)@	A	A	A  b!                 s   -BBBc                 4   t          j        d          }t          j        |                     |                                                    }t          j        t          t                    5  t          dg|           d d d            d S # 1 swxY w Y   d S )Nr   r   r8  r{   s     r   test_slerp_rot_len1r;    s    A2::aiikk2233A	z)@	A	A	A  qc1                 s   .BBBc                     t          j        |                     d                    }t          j        t
          d          5  t          ddg|           d d d            d S # 1 swxY w Y   d S )Nr   r   r@   z"Rotations with more than 1 leadingr   r   r   )r   r(   r#  r   r   r   r   r{   s     r   test_slerp_tensor_rotr>    s    2779--..A	z)M	N	N	N  q!fa                 s   A##A'*A'c                 t   t          j        t          d          5  t          j                            d          }t          j        |                     |	                    d                              }|                     dgdgg          }t          ||           d d d            d S # 1 swxY w Y   d S )Nz.times to be specified in a 1 dimensional arrayr   r   r"  rp   r   r   )r   r   r   r2   r\   r]   r   r(   r)   r  r   r+   r   r"   r+  s       r   test_slerp_time_dim_mismatchrA    s    	zM
O 
O 
O  i##A&&rzz#++6+*B*BCCDDJJ  a                 s   BB--B14B1c                 l   t          j        t          d          5  t          j                            d          }t          j        |                     |	                    d                              }| 
                    d          }t          ||           d d d            d S # 1 swxY w Y   d S )Nz7number of rotations to be equal to number of timestampsr   r   r  rp   r  )r   r   r   r2   r\   r]   r   r(   r)   r  aranger   r@  s       r   !test_slerp_num_rotations_mismatchrD    s    	z *@ 
A 
A 
A  i##A&&rzz#++6+*B*BCCDDIIaLLa                 s   B B))B-0B-c                    t           j                            d          }|                     |                    d                    }t          j        |          }g d}t          |          rAt          ||          }| 	                    | 
                    |j                            sJ d S t          j        t          d          5  t          ||           d d d            d S # 1 swxY w Y   d S )Nr   r  rp   )r   r   r   r   r@   strictly increasing orderr   r2   r\   r]   r)   r  r   r(   r   r   rv   r   r#  r   r   r   r+   r   rg   r"   r+  r  s         r   test_slerp_equal_timesrI  	     
)


"
"C


3;;F;++,,A1AAQ !QKKvvbhhqw''(((((((]:-HIII 	 	!QKKK	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	   C**C.1C.c                    t           j                            d          }|                     |                    d                    }t          j        |          }g d}t          |          rAt          ||          }| 	                    | 
                    |j                            sJ d S t          j        t          d          5  t          ||           d d d            d S # 1 swxY w Y   d S )Nr   r  rp   )r   r   rR   r   r@   rF  r   rG  rH  s         r   test_slerp_decreasing_timesrM  	  rJ  rK  c                    t           j                            d          }t          j        |                     |                    d                              }|                     d          }t          ||          }t          j
        t          d          5  |                     dgdgg          } ||           d d d            d S # 1 swxY w Y   d S )	Nr   r  rp   rA   z&`times` must be at most 1-dimensional.r   g      @g@)r2   r\   r]   r   r(   r)   r  rC  r   r   r   r   )r+   r   r"   r+  r  interp_timess         r   !test_slerp_call_time_dim_mismatchrP   	  s   
)


"
"C2::ckkvk&>&>??@@A
		!AaA	zE
G 
G 
G  zzC5$'5#* + +	,	                 s   %CCCc                    t           j                            d          }t          j        |                     |                    d                              }|                     d          dz   }t          ||          }|                     g d          }|                     g d          }t          |          r ||          
                                }|                     ||                     |          k    ||                     |          k              }|                     |                     || df                             sJ |                     |                     ||df                              sJ  ||          
                                }|                     ||                     |          k    ||                     |          k              }|                     |                     || df                             sJ |                     |                     ||df                              sJ d S t!          j        t$          d	
          5   ||           d d d            n# 1 swxY w Y   t!          j        t$          d	
          5   ||           d d d            d S # 1 swxY w Y   d S )Nr   r  rp   rA   r   r  )r   r   rI   .ztimes must be within the ranger   )r2   r\   r]   r   r(   r)   r  rC  r   r   r*   logical_andminmaxrv   r   r   r   r   )	r+   r   r"   r+  r  	times_low
times_highrg   in_ranges	            r   !test_slerp_call_time_out_of_rangerX  .	  s   
)


"
"C2::ckkvk&>&>??@@A
		!qAaA

999%%IIII&&JY AiLL  "">>)rvvayy"8)rvvayy:PQQvvbhhq(C01122222vvrxx(C- 011122222AjMM!!##>>*q		"9:PQ;RSSvvbhhq(C01122222vvrxx(C- 01112222222]:-MNNN 	 	AiLLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	]:-MNNN 	 	AjMMM	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s$   ,JJJ*KK
Kc                    t          j        |           }|| j        k    rdnd}t          j        d|                     dgdgg          d          }t          ddg|          } |d	          }t          j        d|                     d
          d          }||                                z  }t          |	                                |                     d          d         |           d S )NrT   r   r[  r   P   Tr  r   r  r  r   r   ro   )
r&   r'   r   r   r   r)   r   r   r   r  )r+   r%   rW   r"   r  r_interpolatedr_interpolated_expecteddeltas           r   test_slerp_call_scalar_timer^  G	  s     b!!ERZ''55TDCaS2$K!8!8$GGGAq!faAQtWWN&1#rzz"~~tTTT488:::EEOO%%rzz#r':FFFFFFr!   c                    t          j        |                     g d                    }t          j        |                     g d                    }||z  }t          |                                |                     g d                     t          j        t          d          5  |dz   d d d            n# 1 swxY w Y   |                    d          t          u sJ d S )Nr/   r   zunsupported operand typer   r   r   )
r   r(   r)   r   r*   r   r   r  __mul__NotImplemented)r+   r{  r|  r   s       r   test_multiplicationrb  W	  s   		BJJ|||44	5	5B		BJJ|||44	5	5B	bBBJJLL"**^^^"<"<=== 
y(B	C	C	C  
Q               ::a==N******s   *B<<C C c                    t           j                            d          }t          j        |                     |                    d                              }t          j        |                     |                    d                              }||z  }|                                j        dk    sJ t          j        |                     |                    d                              }t          j        |                     |                    d                              }||z  }|                                j        dk    sJ t          j        |                     |                    d                              }t          j        |                     |                    d                              }||z  }|                                j        dk    sJ t          j        |                     |                    d	                              }t          j        |                     |                    d
                              }||z  }|                                j        d
k    sJ d S )Nr   r  rp   r  )r   r   r@   )rR   r   r@   r@   )r   r@   r@   )rR   r   r@   r@   r"  r=  )	r2   r\   rs   r   r(   r)   rw   r*   rc   )r+   rf   r{  r|  r   s        r   test_multiplication_ndrd  f	  s	    )


"
"C		BJJszzyz'A'ABB	C	CB		BJJszzyz'A'ABB	C	CB	bB::<<**** 
	BJJszzyz'A'ABB	C	CB		BJJszzyz'A'ABB	C	CB	bB::<<**** 
	BJJszz|z'D'DEE	F	FB		BJJszzyz'A'ABB	C	CB	bB::<<---- 
	BJJszzvz'>'>??	@	@B		BJJszzyz'A'ABB	C	CB	bB::<<******r!   c                    t           j                            d          }t          j        |                     |                    d                              }t          j        |                     |                    d                              }t          j        t          d          5  ||z   d d d            d S # 1 swxY w Y   d S )Nr   r"  rp   )r   r@   r@   r  r   )
r2   r\   rs   r   r(   r)   rw   r   r   r   r  s       r   test_multiplication_errorsrf  	  s    
)


"
"C		BJJszzvz'>'>??	@	@B		BJJszzyz'A'ABB	C	CB	z);	<	<	<  
R                 s   1CCCc                 V   t          t          j        dd          |           }t          t          j        dd          |           }|                     t	          |                    }|D ];}||z  |z  }t          t          |                                d          |           <d S )N2   r   rm   r  r   r   )r,   r   r\   r#  rO  r   r   r*   )r+   qsrsr   r"   s        r   test_multiplication_stabilityrk  	  s    	222B	7	7B	!444b	9	9Bwws2wwH H H!Vb[rzz||!<<<hGGGGH Hr!   c                    t          j        |           }|| j        k    rdnd}t          j                            d          }|f|dz
  z  }|                    |dz             }t          j        | 	                    |                    }|
                                }dD ]}	||	z  }
| 	                    g d          }t          j        |                     ||d	z                       }t          t          |	                    D ]}|	dk    r||z  }||z  }|
|
                                z                                  }|                     ||k               sJ t          j        |                     ||d	z                       }||	z                                  j        |dz   k    sJ d
D ]f}	||	z  }
t          j        |	|                                z            }t)          |
                                |                                |           gg d}	|	D ]}||z  }|| 	                    |g          z  }t)          |                                |                                           || 	                    |          z  }t)          |                                |                                           |                     |dz             }t          j        |          d                             d          }t          j        |          }d}	||	z  }
t          j        |	|                                z            }t)          |
                                |                                |           || 	                    |	g          z  }
t          j        |	|                                z            }t)          |
                                |                                |           || 	                    |	          z  }
t          j        |	|                                z            }t)          |
                                |                                |           d S )Nr  r   r   r   rL   rp   )r  r   rr   r   r   r   rA   r   rK   )      r          r   r   r  ro   )r  r   rm  rr   r   rn  r   r   r   r   r  r   r   rz  rn   rR   )r&   r'   r   r2   r\   rs   rw   r   r(   r)   r   r`   rb   r   r  rv   r*   rc   r   r  r   r   r   r   )r+   rH   r%   rW   rf   r  r   r  p_invr  rg   
q_identityr"   r  angexponentr_arrayr   s                     r   test_powrt  	  s    b!!ERZ''55TD
)


"
"C'TAX&K::;-:..D2::d++,,AEEGGE% < <FZZ..
rwwz;3EFFGGs1vv 	 	A1uuEI15577{%%''vvcDj!!!!! rwwz;3EFFGG1~~%t);;;;;; / = =F Q[[]]!233		QYY[[t<<<<< 	A@@A 8 8Mrzz8*---		W__%6%6777rzz(+++		W__%6%67777 XXkD())FVF^^F#''..FV$$A	A	QAQ.//AAIIKK48888 	
RZZ__AQ.//AAIIKK48888	RZZ]]AQ.//AAIIKK4888888r!   c                    t          t          j        d          |           }t          j        t
          d          5  t          |dd           d d d            n# 1 swxY w Y   t          j        t          d          5  ||                     ddg          z   d d d            n# 1 swxY w Y   t          j        t          d          5  ||                     dgdgg          z   d d d            d S # 1 swxY w Y   d S )Nr   rm   zmodulus not supportedr   r   zArray exponent must be a scalarr   )	r,   r   r\   r   r   NotImplementedErrorpowr   r)   )r+   r  s     r   test_pow_errorsrx  	  s   x1---r22A	*2I	J	J	J  Aq!              	z)J	K	K	K    	RZZA                             	z)J	K	K	K $ $	RZZ!qc
####$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s5   AA!$A!B**B.1B.C::C>C>c                     t          j        d          } t          j        dd          }t          j        |           }t	          |j        d           t          j        |          }t	          |j        d           t          |d                                         |d                                                    t          |d                                         |d                                                    t          j        | g          }t	          |j        d           t	          |d         |            t          j        |g          }t	          |j        d           t          |d	                                         |d                                                    t          |d
                                         |d                                                    t          j        | |gt                    }t	          |j        d           t	          |d         |            t	          |d         |           t          j        |||g          }t	          |j        d           d S )Nr   rm   r   r   r   r"  rK   r4  r   r  r$   )rR   r   )	r   r\   r2   r3   r   rc   r   r^   object)singlemultipler3   s      r    test_rotation_within_numpy_arrayr}  	  s   _###Fqa(((HHVEb!!!HXEd###E!H&&(((1+*?*?*A*ABBBE!H&&(((1+*?*?*A*ABBBHfXEd###q6"""HhZ  Ef%%%E$K))++Xa[-B-B-D-DEEEE$K))++Xa[-B-B-D-DEEEHfh'v666Ed###q6"""q8$$$Hh(344Ef%%%%%r!   array_api_strictz"array API doesn't support picklingc                    t          j        |                     ddt          j        t
          j        dz            t          j        t
          j        dz            g                    }t          j	        |          }t          j
        |          }t          |                                |                                d           d S Nr   r@   rS   ro   )r   r(   r)   r   sinr2   r  r,  pickledumpsloadsr   r^   )r+   r"   pkl	unpickleds       r   test_picklingr  	  s     	2::q!TXbeAg->->q@Q@Q&RSSTTA
,q//CS!!IAKKMM9#6#6#8#8uEEEEEEr!   z"array API doesn't support deepcopyc                 l   t          j        |                     ddt          j        t
          j        dz            t          j        t
          j        dz            g                    }t          j	        |          }t          |                                |                                d           d S r  )r   r(   r)   r   r  r2   r  r,  r  deepcopyr   r^   )r+   r"   r{  s      r   test_deepcopyr  
  s     	2::q!TXbeAg->->q@Q@Q&RSSTTA	q		BAKKMM2<<>>>>>>>>r!   c                  J   t          j        g d          } |                     d          }|                     d          }|j        d         du sJ |j        d         du sJ t	          d |j        D                       sJ t	          d |j        D                       sJ d S )Nr/   r   r\  C_CONTIGUOUSTc              3   "   K   | ]
}|d k    V  dS r   Nr   r  rh   s     r   	<genexpr>z+test_as_euler_contiguous.<locals>.<genexpr>
  &      **!qAv******r!   c              3   "   K   | ]
}|d k    V  dS r  r   r  s     r   r  z+test_as_euler_contiguous.<locals>.<genexpr>
  r  r!   )r   r(   r  flagsrv   strides)r"   e1e2s      r   test_as_euler_contiguousr  
  s    <<<((A	
E		B	
E		B8N#t++++8N#t++++**rz**********rz**********r!   c                   	 t          t          j        dd          |           	g d}dgt          t	          j        |                    z   }	fdt          ||          D             }t          j        |          }t          		                                |	                                           t          j        	          }t          		                                |	                                           	|usJ t          j        
                    d          }|                     |                    d                    }t          j        |          	t          j        |d dd	f                   }t          j        |dd d	f                   }t          j        ||g          }t          		                                |	                                           d S )
NrY   r   rm   )r   r   rR   r   rR   c                 0    g | ]\  }}|||z            S r   r   )r  rh   r  r  s      r   r  z$test_concatenate.<locals>.<listcomp>!
  s*    >>>41aXaAg>>>r!   rA   r   r@   rp   rR   .)r,   r   r\   listr2   cumsumr  concatenater
   r*   rs   r)   rw   r(   )
r+   sizesstartssplitr   rf   r   r{  r|  r  s
            @r   test_concatenater  
  s   hoba888"==HOOES4	%(()))F>>>>3vu+=+=>>>E!%((FH$$&&(8(8999 !(++FH$$&&(8(8999 6!!!! )


"
"C::cjjij0011D!$''H		D!SM	*	*B		DSM	*	*B!2r(++FH$$&&(8(899999r!   c                 &   t          j        t          d          5  t          |                     t          j                                                                        }t          j        |dd g           d d d            d S # 1 swxY w Y   d S )NzRotation objects onlyr   r   )r   r   r  r   r)   r  r*   r  )r+   r   s     r   test_concatenate_wrong_typer  6
  s    	y(?	@	@	@ - -rzz("3"5"5"="="?"?@@AAc1d^,,,- - - - - - - - - - - - - - - - - -s   ABB
B
c                 L   t          j        |                     d                    }t          j        |                     d                    }t          j        t
          t          t          f          5  t          j        ||g           d d d            d S # 1 swxY w Y   d S )Nr  r   )	r   r(   r#  r   r   r   RuntimeErrorr  r  )r+   r{  r|  s      r   test_concatenate_wrong_shaper  =
  s    		BGGI..	/	/B		BGGFOO	,	,B	
L)<	=	= ' 'b"X&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 's   5BB Bc                 P   t          |                     g dg                    }t          |                     g dg dg                    }t          |                     g d                    }t          |          dk    sJ t          |          dk    sJ t          j        t
          d          5  t          |           d d d            n# 1 swxY w Y   t          j        |                     d                    }t          |          dk    sJ |sJ |sJ |sJ d S )Nr/   r   r   zSingle rotation has no len().r   r!  rR   )r   r)   rO  r   r   r  r(   r#  )r+   rotation_multi_onerotation_multirotation_singlerotation_batcheds        r   test_len_and_boolr  G
  st   !"**lll^"<"<==bjj,,,)EFFGGNrzz,,,7788O!""a''''~!####	y(G	H	H	H  O                )"'')*<*<==  A%%%% >?s   7CCCc                     |                      g d          }t          j        |ddd                                          }|                      g d          t	          j        d          z  }t          ||           d S )Nr   rd  rW  Tr  rX  r   )r)   r   from_davenportr*   r   r   r   )r+   r   r   rF   s       r   #test_from_davenport_single_rotationr  [
  s{    ::iii  D"4b+/1 1 118 	JJ~~~..1=MD-(((((r!   c                    |                      g d          }|                      g d          }t          j        || j        z  dz            }t          j        |d| j        dz            }t          |                    d          |                    d                     |                     |d          }t          j        || j        z  dz            }t          j        |d| j        dz  g          }t          |                    d          |                    d                     |                     ||gd	          }t          j        ||                      | j        dz  g| j        d
z  gg          z            }|d         |d         z  }|                     ||gd	          }t          j        |d| j        d
z  | j        dz  g          }t          |                    d          |                    d                     |                     ||gd	          }t          j        ||                      | j        d
z  g| j        dz  gg          z            }|                     |d          }t          j        |d| j        d
z  g| j        dz  gg          }t          |                    d          |                    d                     d S )Nr   r  r@   eTr   r
  r   r   rI   r   )	r)   r   r   r  r  r   r*   rM   r   )r+   ezeyr   rot_davr(  axes_davs          r   #test_from_davenport_one_or_two_axesr  d
  s   	KKK	 	 B	KKK	 	 B 
rBEz!|
,
,C%b#ruQw77GCKK$K//41P1PQQQ ::b&!!D

rBEz!|
,
,C%dC"%';;GCKK$K//41P1PQQQ 88RH18%%D

tbjj257)beAgY1G&H&HH
I
IC
a&3q6/CxxRqx))H%hbeAgruQw5GHHGCKK$K//41P1PQQQ 88RH18%%D

tbjj257)beAgY1G&H&HH
I
ICzz"f%%H%hruQwi"%'5KLLGCKK$K//41P1PQQQQQr!   c                    t           j                            d          }|f|dz
  z  }t          j        |                     |                    d                              }|                                }|                     |                    |dz                       }t          j        |d         d|          }|	                                j
        |dz   k    sJ |                     |                    |dz                       }t          j        |d         d|          }|	                                j
        |dz   k    sJ |                     |                    |d	z                       }t          j        |d d
df         d|          }|	                                j
        |dz   k    sJ t          j        |                     |                    |dz                                 }|                                }|                     |                    |dz                       }t          j        |d|          }|	                                j
        |dz   k    sJ d S )Nr   r   rL   rp   rK   r   r  )r   N.r"  r   .r   r2   r\   rs   r   r(   r)   rw   r^   r  r*   rc   )r+   rH   rf   r  r"   r(  r_  r   s           r   test_from_davenport_shapesr  
  s    )


"
"C'TAX&K2::cjjdj&;&;<<==A;;==DZZ

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

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

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

d(:
;;<<F

!$V
4
4C;;==+"4444444r!   c                    t           j                            d          }t          j        |                     |                    d                              }|                                }|                     |                    d                    }t          j        |d|          }|	                                j
        dk    sJ d S )Nr   r@   	   r   r@   rp   )r   r@   rR   r  )r@   r  r@   r@   r  )r+   rf   r"   r(  r_  r   s         r   test_from_davenport_broadcastr  
  s    
)


"
"C2::cjjlj&C&CDDEEA;;==DZZ

	
2233F

!$V
4
4C;;==,......r!   c                 6   g d}g d}g d}|                      ||g          }t          |          rUt          j        |dddg                                          }|                     |                     |                    sJ nKt          j        t          d          5  t          j        |dddg           d d d            n# 1 swxY w Y   |                      |||g          }t          |          rUt          j        |dg d                                          }|                     |                     |                    sJ nKt          j        t          d          5  t          j        |dg d           d d d            n# 1 swxY w Y   t          j        t          d	          5  t          j        |                      |g          d
dg           d d d            n# 1 swxY w Y   t          j        t          d          5  t          j        |                      |||g          dg d           d d d            n# 1 swxY w Y   t          j        t          d          5  t          j        |                      |          dddg           d d d            n# 1 swxY w Y   t          j        t          d          5  t          j        |                      |||g          dddg           d d d            d S # 1 swxY w Y   d S )Nr   r   r  r  r   zmust be orthogonalr   r  zorder should ber   zExpected `angles`)r   r   r   rR   r   )
r)   r   r   r  r*   rv   r   r   r   r   )r+   r  r  ezyr(  rg   s         r   !test_from_davenport_invalid_inputr  
  s   	B	B
))C::r3i  DT 7#D#1v66>>@@vvbhhqkk""""""]:-ABBB 	7 	7#D#1v666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7::r2sm$$DT :#D#yyy99AACCvvbhhqkk""""""]:-ABBB 	: 	:#D#yyy999	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	:	z):	;	;	; > >

B4 0 0%!===> > > > > > > > > > > > > > >	z)<	=	=	= M M

BB< 8 8#|||LLLM M M M M M M M M M M M M M M	z)<	=	=	= = =

2aV<<<= = = = = = = = = = = = = = =	z)<	=	=	= G G

BB< 8 8#1vFFFG G G G G G G G G G G G G G G G G Gsl   #CCC*FFF5,G--G14G1/III4,J,,J03J0/LLLc                     t           j                            d          } t          j        g d          }t          j        g d          }t          j        g d          }t	          j        |           }|                    |||gd          }t	          j        |||gd|                                          }|                    |d          sJ t	          j        d	|           }|                    |||gd          }t	          j        |||gd|                                          }t          j	        |                    |d                    sJ d S )
Nrl   r   r   r   rm   r  rn   ro   r   )
r2   r\   rs   r3   r   as_davenportr  rt   ru   rv   )rf   r  r  e3rx   r_  r"   s          r   test_from_davenport_array_liker  
  s@   
)


$
$C	)))		B	)))		B	)))		BS)))J$$b"b\377FRc6==??CCA""15"11111 ,,,J$$b"b\377FRc6==??CCA6*))!%)889999999r!   c           
      :   t          j        |           }t          j                            d          }d}t          j        |df          }|                    t          j         t          j        |f          |d d df<   |                    dt          j        |f          }|                    t          j         t          j        |f          |d d df<   |                    dt          j        d          }|                     g d          }|                     g d          }|D ]}	|                     t          j
        |	|z                                |                    }
|                     |||
gd	          }||	z
  |d d d
f<   dD ]}|dk    r|n|                     |d	          }t          j        |||                     ||                    }|                    ||          }t!          ||                     ||                     d S )Nr   rZ   rR   ri  r   )r  r  r  r   r   rd  re  re  r$   )r&   r'   r2   r\   r]   r  r  r  r)   r   r   rn  r   rn  r  r  r   )r+   r%   r   r  r_  angles_middlelambdasr  r  lambr  ax_lambr  axr   
angles_davs                   r   test_as_davenportr  
  s   b!!E
)


"
"CAXq!fF;;BE6QD;AAF111a4LKKABEK==M;;BE6QD;AAF111a4Lkkabe%k88G	KKK	 	 B	KKK	 	 B I IZZ,T"W55;;B??@@((BB<a(00$t+qqq!t/ 	I 	IE![00bgggAg6N6NB)"eRZZeZ5T5TUUC))"e44JJ

6
(G(GHHHH		I	I Ir!   c                    t           j                            d          }t          j        |                     |                    d                              }|                                }|                     |                    t           j	         t           j	        d                    }t          j        |          d                             |d         dz            }dD ][}|d	k    r|                     |d
          }t          j        |||          }|                    ||          }t!          ||           \d S )Nr   r  rp   )r@   r  r   rR   ri  ry  r   r  re  r   r   )r2   r\   rs   r   r(   r)   rw   r^   r  r  r&   r   r   rn  r  r  r   )r+   rf   r"   r(  r_  r  r   r  s           r   test_as_davenport_ndr  
  s   
)


"
"C2::cjjlj&C&CDDEEA;;==DZZRUNNOOFVF^^F#''v(:;;F+ , ,K774b7))D%dE6::%%dE22

F++++, ,r!   c           
         t          j        |           }|| j        k    rdnd}t          j                            d          d}t          j        |df          }                    t          j         t          j        |f          |d d df<   fdt          |          D             }                    t          j         t          j        |f          |d d df<                       dt          j        d	          }| 
                    g d
          }| 
                    g d          }	|D ]F}
| 
                    t          j        |
|	z                                |                    }|                     ||	|gd          }||
z
  |d d df<   dD ]}|dk    r|n|                     |d          }t          j        ||| 
                    ||                    }t#          | |           5  |                    |||          }d d d            n# 1 swxY w Y   |                                }t          j        |||          }|                                }t)          |||           ސHd S )Nrn   r   r   rA   rR   ri  c                 R    g | ]#}                     d t          j        g          $S r   )choicer2   r  )r  rh   r   s     r   r  z0test_as_davenport_degenerate.<locals>.<listcomp>  s+    >>>SZZBE
++>>>r!   r   )rA   r  r  r   r   r  re  r$   )r  ro   )r&   r'   r   r2   r\   r]   r  r  r  rb   r)   r   r   rn  r   rn  r  r  r  r^   r   )r+   r  r%   rW   r  r_  r  r  r  r  r  r  r  r  r  r   r  r  rot_estimatedr  r   s                       @r   test_as_davenport_degenerater  
  s    b!!ERZ''55TD )


"
"C	AXq!fF ;;BE6QD;AAF111a4L>>>>U1XX>>>M;;BE6QD;AAF111a4Lkkabe$k77G	KKK	 	 B	KKK	 	 B D DZZ,T"W55;;B??@@((BB<a(00$t+qqq!t/ 	D 	DE![00bgggAg6N6NB)"eRZZeZ5T5TUUC',=(=rBB   --&7 .  
               ==??L$3BzJJM)3355ML-dCCCCC	D	D Ds   8HH!$H!c                    t          j        |           }t          j                            d          }d}t          j        |df          }|| j        k    rdnd}|                    t          j         t          j        |f          |d d df<   |                    dt          j        |f          |d d df<   |                    t          j         t          j        |f          |d d df<   | 	                    ||	          }d
D ]}t          d          D ]}d                    |d         |d         |d         g          }| 	                    d |D             |	          }	|dk    r|                                }t          j        ||          }
t          j        |	||          }t!          |
                    d          |                    d          |           ͌t          j        |          d d df                             t          j        dz            }d
D ]}t          d          D ]}d                    |          }| 	                    d |D             |	          }	|dk    r|                                }t          j        ||          }
t          j        |	||          }t!          |
                                |                                |           d S )Nr   rZ   rR   rn   r  ri  r   r   r$   r  r   r  c                 ,    g | ]}t          |          S r   r    r  s     r   r  z:test_compare_from_davenport_from_euler.<locals>.<listcomp>A      777aYq\\777r!   re  Tr   r[   c                 ,    g | ]}t          |          S r   r  r  s     r   r  z:test_compare_from_davenport_from_euler.<locals>.<listcomp>N  r  r!   )r&   r'   r2   r\   r]   r  r   r  r  r)   r   r  r  r   r   r  r   r*   r   subtract)r+   r%   r   r  r_  rV   r  r  r  r  euldavs               r   &test_compare_from_davenport_from_eulerr  1  s   b!!E
)


"
"CAXq!fF RZ''55TD;;BE6QD;AAF111a4L;;125t;<<F111a4L;;BE6QD;AAF111a4LZZeZ,,F+ 	' 	'%e,, 	' 	'I''9Q<1y|DEEC773777uEEB##iikk%c622C)"eV<<CCKK$K77t9T9T!%' ' ' ' '	' VF^^AAAqD!**251955F+ E E%e,, 	E 	EI'')$$C773777uEEB##iikk%c622C)"eV<<CCKKMM3;;==tDDDDD	EE Er!   c                 0   t           j                            d          }d}t          j        |df          }|                    t           j         t           j        |f          |d d df<   |                    dt           j        |f          |d d df<   |                    t           j         t           j        |f          |d d df<   dD ]}t          d          D ]}d	                    |d         |d         |d         g          }d
 |D             }|dk    r|                                }t          j
        ||                     |                    }|                    |          }	|                    |                     |          |          }
t          |	|
d           ˌ|d d dfxx         t           j        dz  z  cc<   dD ]}t          d          D ]}d	                    |          }d |D             }|dk    r|                                }t          j
        ||                     |                    }|                    |          }	|                    |                     |          |          }
t          |	|
d           d S )Nr   rZ   rR   ri  r   r   r  r   r  c                 ,    g | ]}t          |          S r   r  r  s     r   r  z6test_compare_as_davenport_as_euler.<locals>.<listcomp>c      ,,,1)A,,,,,r!   re  rn   r[   c                 ,    g | ]}t          |          S r   r  r  s     r   r  z6test_compare_as_davenport_as_euler.<locals>.<listcomp>p  r  r!   )r2   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  s              r   "test_compare_as_davenport_as_eulerr  V  s   
)


"
"CAXq!fF ;;BE6QD;AAF111a4L;;125t;<<F111a4L;;BE6QD;AAF111a4L+ 	2 	2%e,, 	2 	2I''9Q<1y|DEEC,,,,,B##iikk%c2::f+=+=>>C,,s##C""2::b>>599CC511111	2 111a4LLLBEAILLL+ 	2 	2%e,, 	2 	2I'')$$C,,,,,B##iikk%c2::f+=+=>>C,,s##C""2::b>>599CC511111	2	2 	2r!   c                 
   t          j        d          }t          |          dk    sJ t          j        d          }t          |          dk    sJ t          j        d          g          }t          |          dk    sJ t          j        |                     d                    }t          |          dk    sJ t          j        |                     d                    }t          |          dk    sJ t          j        d|                     d                    }t          |          dk    sJ t          j        |                     d                    }t          |          dk    sJ t          j	        | 
                    d          d|                     d                    }t          |          dk    sJ t          j        |                     d                    }	t          |	          dk    sJ d S )	Nr   )r  rR   r   r@   r   rR   rR   r   r	  rd  )r   r\   rO  r  r(   r   r   r   r   r  r_   r<  )
r+   r"   r_ider_getr_quatr_matrixr_eulerr_vecr_davr_mrps
             r   test_zero_rotation_constructionr  y  s    	AAq66Q;;;;!$$$Eu::????O"""2&Eu::???? 0 011Fv;;!#BHHY$7$788Hx==A!%&)9)9::Gw<<1 &!1!122Eu::????#BFF1II{BHHV<L<LMMEu::????bhhv..//Eu::??????r!   c                    t          j        |                     d                    }|                                j        dk    sJ |                                j        dk    sJ |                    d          j        dk    sJ |                                j        dk    sJ |                                j        dk    sJ |	                    | 
                    d          d          j        dk    sJ d S )Nr  r  r   r	  rR   rd  )r   r(   r   r*   rc   r^   r  r  r@  r  r_   r{   s     r   !test_zero_rotation_representationr    s     	288F++,,A99;;&&&&;;==)++++::e"f,,,,;;==&((((88::v%%%%>>"&&))[1176AAAAAAr!   c                    t          j        |                     d                    }|                     g d          }|                    |          }|j        dk    sJ |                     d          }|                    |          }|j        dk    sJ |                     d          }t          j        t          d          5  |                    |           d d d            d S # 1 swxY w Y   d S )Nr  r  r	  r  r  r   )
r   r(   r   r)   rn  rc   r#  r   r   r   )r+   r"   r}  r~  v0v0_rotr  s          r   !test_zero_rotation_array_rotationr    s'   288F++,,A


999A

I?f$$$$	&		BWWR[[F<6!!!!	B	,
. 
. 
.  	                 s   C++C/2C/c                    t          j        |                     d                    }t          j        |                     g d                    }||z  }t	          |          dk    sJ ||z  }t	          |          dk    sJ t          j        |                     d                    }||z  }t	          |          dk    sJ t          t          j        d          |           }t          j        t          d          5  ||z   d d d            n# 1 swxY w Y   t          j        t          d          5  ||z   d d d            d S # 1 swxY w Y   d S )Nr  r   r   r   r  r   )
r   r(   r   r)   rO  r,   r\   r   r   r   )r+   r"   r_singler_mult_leftr_mult_rightr0r_multr|  s           r   !test_zero_rotation_multiplicationr    s   288F++,,A!"**^^^"<"<==Hh,K{q    a<L|!!!!		BHHV,,	-	-BVFv;;!	**B	/	/B	z);	<	<	<  
R               
z);	<	<	<  
R                 s$   DDD;EEEc                    t          j        |                     d                    }t          j        ||g          }t	          |          dk    sJ t          j        |                     g d                    }|                    ||g          }t	          |          dk    sJ t          t          j        d          |           }|                    ||g          }t	          |          dk    sJ t          t          j        d          |           }|                    ||g          }|                    ||g          }t	          |          dk    sJ d S )Nr  r   r   r   rR   r@   )r   r(   r   r  rO  r)   r,   r\   r+   r"   r  r{  r   r4s         r   !test_zero_rotation_concatentationr     s(   288F++,,A		q!f	%	%Br77a<<<<		BJJ~~~66	7	7B	
Aw		Br77a<<<<	**B	/	/B	
Aw		Br77a<<<<	**B	/	/B	
2w		B	
2w		Br77a<<<<<<r!   c                     t          j        |                     d                    }dD ]}||z  }t          |          dk    sJ d S )Nr  )rm  rr   r   r   r  r   )r   r(   r   rO  )r+   r"   pppow0s       r   test_zero_rotation_powerr    sU    288F++,,A#  "u4yyA~~~~~ r!   c                     t          j        |                     d                    }|                                }t	          |          dk    sJ d S )Nr  r   )r   r(   r   r   rO  )r+   r"   r_invs      r   test_zero_rotation_inverser    sB    288F++,,AEEGGEu::??????r!   c                     t          j        |                     d                    }|                                }|j        dk    sJ d S )Nr  r  )r   r(   r   r  rc   )r+   r"   r  s      r   test_zero_rotation_magnituder	    sD    288F++,,AI?d""""""r!   c                     t          j        |                     d                    }t          j        t
          d          5  |                                 d d d            d S # 1 swxY w Y   d S )Nr  z+Mean of an empty rotation set is undefined.r   )r   r(   r   r   r   r   r  r{   s     r   test_zero_rotation_meanr    s    288F++,,A	z)V	W	W	W  	                 s   A%%A),A)c                 `   t          j        |                     d                    }t          j        |                     d                    }|                    |          j        dk    sJ t          j        |                     g d                    }|                    |          j        dk    sJ t          t          j                    |           }|                    |          j        dk    sJ d}t          t          j        d          |           }t          j	        t          |          5  |                    |           d d d            n# 1 swxY w Y   t          j	        t          |          5  |                    |           d d d            d S # 1 swxY w Y   d S )Nr  r  r   z/Expected broadcastable shapes in both rotationsr   r   )r   r(   r   ru   rc   r)   r,   r\   r   r   r   )r+   r"   r  r{  r|  
approx_msgr   s          r   test_zero_rotation_approx_equalr    s   288F++,,A		BHHV,,	-	-B>>"#t++++		BJJ~~~66	7	7B>>"#t++++	))2	.	.B??1#t++++BJ	**B	/	/B	z	4	4	4  	r               
z	4	4	4  
                 s$   8EE!E F##F'*F'z	jax.numpyz.JAX out-of-bounds indexing deviates from numpyz"zero-length arrays have nan-shapesc                    t          j        |                     d                    }||                     g | j                           }t          |          dk    sJ |d d         }t          |          dk    sJ t          j        t                    5  ||                     dg                    d d d            n# 1 swxY w Y   t          j        t                    5  ||                     dg                    d d d            n# 1 swxY w Y   t          j        t                    5  t          j        |                     g d                    |d<   d d d            d S # 1 swxY w Y   d S )Nr  r$   r   Tr/   )	r   r(   r   r)   boolrO  r   r   
IndexError)r+   r"   r  r_slices       r   test_zero_rotation_get_setr    s	    	288F++,,Abjj27j++,Eu::????eGw<<1	z	"	"  	"**aS//               
z	"	"  	"**dV

               
z	"	" < <!"**\\\":":;;!< < < < < < < < < < < < < < < < < <s6   C  CC$DDD1-E++E/2E/c                    t          t          j        d          |           }||                     g d                   }t	          |          dk    sJ ||                     g d                   }t	          |          dk    sJ ||                     g d                   }t	          |          dk    sJ t          j        |                     d                    }||                     g d                   }t	          |          dk    sJ |                                j        d	k    sJ t          j
        t                    5  ||                     d
d
g                    d d d            d S # 1 swxY w Y   d S )NrR   )FFFr   )FTFr   )TTTr!  )TFF)r   r   r@   T)r,   r   r\   r)   rO  r(   r#  r*   rc   r   r   r  r  s         r   test_boolean_indexesr  (  s   xq))2..A	
2::+++,,	-Br77a<<<<	
2::***++	,Br77a<<<<	
2::((())	*Br77a<<<< 	2779--..A	
2::***++	,Br77a<<<<::<<****	z	"	" $ $	"**dD\
"
"##$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s   
E55E9<E9c                 Z   t          t          j        d          |           }t          |          D ]x\  }}t	          |t                    sJ t          |                                ||                                                    |t          |          k    rt          d          yd S )NrR   z&Iteration exceeded length of rotations)	r,   r   r\   rU  rJ  r
   r*   rO  r  )r+   r"   rh   r_is       r   test_rotation_iterr  ?  s    xq))2..AA,, I I3#x(((((qt||~~666s1vv::GHHH I Ir!   c                     t          t          dd|z             d |dz
                     }|                     |dz             }t          j        |          }|j        |k    sJ d|j         d|             d S )Nr   r   rL   zGot z, expected )rN  rb   r#  r   r(   rc   )r+   rH   rc   r   r"   s        r   test_rotation_shaper  I  s    %1t8$$YdQhY/00E7754<  D4  A7e?AG????r!   )r   r   numpyr2   numpy.testingr   scipy.spatial.transformr   r   $scipy.spatial.transform._rotation_cyspatial	transform_rotation_cyr5   $scipy.spatial.transform._rotation_xp_rotation_xpr6   scipy.statsr   	itertoolsr   r   
contextlibr	   r  scipy._lib._array_apir
   r   r   r   r   r   r   r   r   r   scipy._lib.array_api_extra_libarray_api_extrar&   r  r  lazy_xp_modulesr*   r(   
pytestmarkr    r,   r0   r8   r<   rG   markparametrizerb   intrN   r^   rj   ry   r|   r   r   r   r   r   r   r`  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r   r%  skip_xp_backendsr/  r5  r7  r:  r<  r>  rA  rC  rE  rG  r@  rL  rO  rR  rU  rY  r]  r`  rf  rq  ru  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  ru   r  r  r  r$  r  r-  r2  r9  r@  rD  rI  rK  rS  rf  rn  rw  r  r  r  r  r  r  __getitem__r  r  r  __setitem__r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  __init____call__r1  r3  r5  r6  r9  r;  r>  rA  rD  rI  rM  rP  rX  r^  rb  rd  rf  rk  __pow__rt  rx  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r	  r  r  r  r  __iter__r  r  r   r!   r   <module>r7     so$         & & & & & & 3 3 3 3 3 3 3 3 = = = = = = = = = = = = 9 9 9 9 9 9 9 9 9 9 9 9 + + + + + + + + + + + + + + % % % % % %                         ) ( ( ( ( ( ( ( (   U# "!("2H4FGG
  Dh D D D D
  $ $ $A A A0 0 0 q!--0S 0 0 0 .-0 8%&&D D '&D.: : :(5 5 5
F F F. 8&''O O ('O@0 0 0
> 
> 
> 8<!122= = 32=> q!--! ! ! ! .-!
" 
" 
" 8%&&q!--
3# 
3 
3 
3 .- '&
3 8%&&, , '&,6 8%&&, , '&,> 8'((q!--	H 	H 	H 	H .- )(	H 8'((  )( 8');<<@ @ =<@
 8');<<3 3 =<3$ 8');<<P P =<P2 8');<<< < =<< 8');<<& & =<&"
: 
: 
: 8'((5 5 )(5 8'((q!--@ @ @ @ .- )(@ 8'((V V )(V 8'((> > )(>. 8');<<
: 
: =<
: 8'((5 5 )(5 8'((
" 
" )(
" 8'((1 1 )(1
 8'((q!---C - - - .- )(- 8%&&l%M  O OW WO O '&W" 8%&&q!--4S 4 4 4 .- '&4 8');<<* * =<* 8');<<	 	 =<	 8$%%q!--AC A A A .- &%A
: 
: 
: 8$%%5 5 &%5 8$%%	E 	E &%	E 8$%%q!--* * * * .- &%* 8?##E E $#E 8&88  98 8?##q!--.# . . . .- $#. 8$ho66J J 76J 8&'') ) (') 8&''5 5 ('5 8&''q!--)# ) ) ) .- (') 8&(:;;* * <;* 8&''  (' 8&(:;;	2 	2 <;	2 8&(:;;  <;8 8&(:;;  <;6 8&(:;;  <;6 8&(:;;  <;6: : :2 2 2 8&(9::ll5&9&9::m443 3 54 ;: ;:38 8&(9::ll5&9&9::m443 3 54 ;: ;:36 
 
 
 8&(:H<MNNll5&9&9::m44,m<<< < =< 54 ;: ON<< 8&(:H<MNNll5&9&9::m44,m<<< < =< 54 ;: ON<> 8&(9::q!--
9 
9 
9 
9 .- ;:
9 8%x|44 0  0 54 0F 8<!344/ / 54/@ 8%x|443 3 543 8%x|44$ $ 54$ 8<!344
@ 
@ 54
@ 8<!344
@ 
@ 54
@     & 8%&&q!---S - - - .- '&- 8%&&2 2 '&2 8<!3X5JKK	I 	I LK	I 8')>??2 2 @?2 8<!3X5JKK I  I LK IF 8())	 	 *)	 8'8JKKq!--	@ 	@ 	@ 	@ .- LK	@ 8'8JKKq!--S    .- LK0 8=("4558 8 658* 8'%' 'q!--I I I I .-' 'I, 8=!!  "!8 8?##( ( $#( 8?##  $# 8?HL(2DEE6 6 FE6> 8'88A A 98A: 8'88q!--: : : : .- 98:0 8'88q!--: : : : .- 98:D 8'88q!--9C 9 9 9 .- 9898 8>""    #" "/ / / 8>""$ $ #"$ 8');X=QRRq!--Y3 Y Y Y .- SRY 8'((8 8 )(8
 8')=x?QRR	D 	D SR	D 8'((< < )(< 8'((5 5 )(5 8'((3 3 )(3 8'((  )( 8'((! ! )(!&& & &2 8)8+=>>M M ?>M 8>8#9::
M 
M ;:
M 8)8>::M M ;:M 8)**
4 
4 +*
4 8)8+=>>    ?>  8>8#79OPP#9 #9 QP#9L 8)**Q% Q% +*Q%h 8)8+=x~NN!> !> ON!>H 8)8+=>>B B ?>BB 8)8+=>>> > ?>>0 8)8+=x~');X=OQ Q'B 'BQ Q'BT 8)8>::> > ;:>"	) 	) 	) 8>8#9::0 0 ;:0
: 
: 
:: : :* 5>5>22,/ ,/ 32,/^ 5>""  #" G  5>""  #" 5>""  #" 5>""  #" 5>""  #" 5>""  #" 5>""  #" 5>""
 
 #"
 5>""
 
 #"
 5>5>22
 
 32
 5>5>22  320 5>5>83F%' 'G G' 'G 8#$$+ + %$+ 8#$$+ + %$+8 8#$$  %$ 8#$$H H %$H 8<!18<AS');= =q!--89s 89 89 89 .-= =89v 8#$$$ $ %$$& & &> 8%&&0%I  K KF FK K '&F 8%&&0%I  K K? ?K K '&?+ + + 8'((: : )(:2 8'((- - )(- 8'((' ' )('   & 8*++) ) ,+) 8')@AAR R BAR@ 8*++q!--5 5 5 5 .- ,+5< 8*++/ / ,+/ 8*++G G ,+G:: : :$ 8*H,ABBI I CBI0 8*H,ABB, , CB, 8*H,A8CUVV,m<<"D "D =< WV"DJ 8&(?@@!E !E A@!EH 8&(98;PQQ2 2 RQ2D 8')<h>R*H,=? ? ? ?: 8%x'8(:L?H$9; ;B B; ;B 8>""  #"" 8#$$  %$, 8'((  )(( 8#$$  %$ 8<    !  8%&&# # '&# 8=!!  "! 8())  *)$ k%U  W Wl3WXX< < YXW W<& 8'(($ $ )($, 8$%%I I &%I q!--@# @ @ @ .-@ @ @r!   