
    ri                    f1   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jV                  ejX                        Z-d Z.d	efd
Z/d Z0d Z1d Z2d Z3ejh                  jk                  d e6dd            de7fd       Z8 e!ejr                        d        Z:d Z;d Z<d Z= e!ej|                        d        Z?d Z@d ZA e!ej                  ej                        d        ZDejh                  jk                  d e6dd            de7fd       ZEd ZF e!ejr                        ejh                  jk                  d e6dd            de7fd              ZG e!ejr                        d        ZH e!ejr                        d        ZI e!ej                        ejh                  jk                  d e6dd            de7fd               ZK e!ej                        d!        ZL e!ej                  ejr                        d"        ZM e!ej                  ejr                        d#        ZN e!ej                  ejr                        d$        ZO e!ej                  ejr                        d%        ZP e!ej                  ejr                        d&        ZQd' ZR e!ej                        d(        ZS e!ej                        ejh                  jk                  d e6dd            de7fd)              ZU e!ej                        d*        ZV e!ej                        d+        ZW e!ej                  ej                        d,        ZY e!ej                        d-        ZZ e!ej                        d.        Z[ e!ej                        d/        Z\ e!ej                        ejh                  jk                  d e6dd            de7fd0              Z] e!ej                        ejh                  j                  d1d23      d4               Z_ e!ej                        ejh                  jk                  d e6dd5            de7fd6              Z` e!ej                  ej                        d7        Za e!ej                  ej                        d8        Zb e!ej                        ejh                  jk                  d e6dd5            de7fd9              Zdd: Ze e!ej                        d;        Zf e!ej                        d<        Zg e!ej                        ejh                  jk                  d e6dd5            de7fd=              Zh e!ej                        d>        Zj e!ej|                  ej                        d?        Zk e!ej                        ejh                  jk                  d e6dd5            de7fd@              Zl e!ej                  ej                        dA        Zm e!ej|                        dB        Zn e!ej|                        dC        Zo e!ej|                        ejh                  jk                  d e6dd5            de7fdD              Zp e!ej|                  ejr                        dE        Zq e!ej|                        dF        Zr e!ej|                  ejr                        dG        Zs e!ej|                  ejr                        dH        Zt e!ej|                  ejr                        dI        Zu e!ej|                  ejr                        dJ        Zv e!ej|                  ejr                        dK        ZwdL ZxdM Zy e!ej|                  ej                        ejh                  jk                  dN edO            ejh                  jk                  dPdQ      dR                      Z{ e!ej|                  ej                        ejh                  jk                  dN edO            ejh                  jk                  dPdQ      dS                      Z|edT        Z} e!ej|                  ejr                  ej                        ejh                  jk                  dN edO            ejh                  jk                  dPdQ      ejh                  jk                  dUdQ      dV                             Z~ e!ej|                  ejr                  ej                        ejh                  jk                  dN edO            ejh                  jk                  dPdQ      ejh                  jk                  dUdQ      dW                             Z e!ej|                  ej                        ejh                  jk                  d e6dd5            de7fdX              Z e!ejr                  ej                        dY        Z e!ej                  ejr                        dZ        Z e!ej                  ej                        d[        Z e!ej                  ej                        d\        Z e!ej                  ej                        d]        Z e!ej                  ej                        d^        Zd_ Z e!ej                        ejh                  jk                  d e6dd5            de7fd`              Z e!ej                        da        Z e!ej                  ej                  ej                        db        Z e!ej                  ej                        dc        Z e!ej                  ej                  ej                        dd        Z e!ej                        de        Z e!ej                  ej                   ej                        ejh                  jk                  d e6dd5            de7fdf              Z e!ej                  ej                   ej                        ejh                  jk                  d e6ddg            de7fdh              Z e!ej                   ej                        di        Z e!ej                  ej                   ej                  ej                        ejh                  jk                  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j                  ej                        dn        Z e!ej                  ej4                        do        Z e!ej                  ej4                        ejh                  jk                  d e6dd5            de7fdp              Z e!ej                  ej4                        ejh                  jk                  d e6ddg            de7fdq              Z e!ej                  ej4                        ejh                  jk                  d e6ddg            de7fdr              Z e!ej4                        ds        Zdt Z e!ej4                        du        Z e!ej                  ejr                  ejD                        ejh                  jk                  d e6dd5            de7fdv              Z e!ejD                        dw        Z e!ej                  ejD                  ejr                        dx        Z e!ejL                        dy        Z e!ejL                        dz        Z e!ejL                        d{        Z e!ejL                        d|        Z e!ej                        d}        Zd~ Z e!ejZ                  ejr                        d        Z e!ej4                  ejZ                        d        Z e!ejZ                  ej4                        d        Z e!ejZ                        d        Z e!ejZ                  ejr                        d        Z e!ej4                  ej                  ejZ                        d        Z e!ejZ                        d        Z e!ejZ                  ejr                  ej4                        d        Z e!ejZ                  ejr                        d        Z e!ejZ                  ejr                        d        Z e!ejZ                  ej                  ej4                  ej                  ej                  ejr                        d        Z e!ejZ                  ej4                        d        Zd Z e!ej4                  ejZ                        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j                  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                  ej                  ej                  ej                  ej                        ejh                  jk                  d e6dd5            de7fd              Z e!ej                        d        Zd Z e!ejr                        ejh                  j                  dd3      d               Z e!ejr                        ejh                  j                  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j                  ej                        d        Z e!ej                        ejh                  jk                  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jr                        ejh                  jk                  dUdQ      d               Z e!ej|                  ej                        d        Z e!ej|                  ej                  ej                        d        Z e!ej                  ej|                  ej                  ej                  ej                        d        Z e!ejr                  ej                  ej                  ej                  ej                        d        Z e!ej4                        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        Zejh                  j                  ddĬ3      ejh                  j                  d1dŬ3      dƄ               Z e!ejD                        dǄ        Z e!ej                        dȄ        Zejh                  jk                  d e6ddg            de7fdɄ       Zy)    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                 :    | dk(  rg dS | dk(  rg dS | dk(  rg dS y )Nx   r   r   yr   r   r   zr   r   r    axiss    i/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/scipy/spatial/transform/tests/test_rotation.py	basis_vecr    &   s.    s{		 
    rc                     t        j                  |      }t        j                  |j	                  | j                         |            S )Ndtype)xpxdefault_dtyper   	from_quatasarrayas_quat)r"   xpr%   s      r   rotation_to_xpr,   /   s6    b!EbjjEjBCCr!   c                  R    t        d       t        g d       t        g dgg       y 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 y r.   )r   r(   nparray_backendcython_backend
xp_backendr"   s    r   test_cython_backend_selectionr8   :   s    288L12A::'''288\N34A::'''288l^$456A::###r!   c                  x    t        j                  t        j                  g dt        j                               y )Nr   r   r   r   r$   )r   r(   r2   r3   float32r   r!   r   test_numpy_float32_inputsr<   C   s    rxxBJJ?@r!   c                     | j                  g dg dg      }t        j                  |      }|| j                  dgdgg      z  }t        |j	                         |       y )N      @   r   r   )      r   r         @g      *@r)   r   r(   r   r*   r+   r   r"   expected_quats       r   test_generic_quat_matrixrG   G   sP    


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

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


>"A


1ddQh'$./A1AEMAIIK/r!   c                    t         j                  j                  d      }t        j                  | j                  g d      d      }t        |j                         | j                  d      dd       | j                  | j                  g d      d	      }t        j                  |d      }t        |j                         | j                  | j                  d      d
      dd       | j                  |j                  dd            }|t        |d      d d d f   z  }t        |j                  d         D ]L  }||df   }t        j                  |d      }t        | j                  |j                         d      |d       N t        j                  |d      }t        | j                  |j                         dd      |d       y )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   sf   
))


"C2::l3$GAAKKM266!95uE


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

399S!$%A	"1d7	++A1771: Aq#vYr5		Q/%@A
 	140ABGGAIIKG3QUCr!   c                     t         j                  j                  d      } t        j                  |       }t        j                  |j                         j                               }|j                  |d      sJ t        j                  d|       }t        j                  |j                         j                               }t        j                  |j                  |d            sJ | j                  d      }|t        |d	      d
   z  }t        j                  |      }t        j                  |      }t        j                  |j                  |d            sJ y )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   s   
))


$CS)J:--/6689A""15"111 ,J:--/6689A66*))!%)8999 	


%A	#I	..A##A&J1A66*))!%)8999r!   c                     t        j                  | j                  g d            }|j                         j                  t        |       k(  sJ y )Nr:   )r   r(   r)   r*   r%   r   r+   r"   s     r   test_from_quat_int_dtyper|      s;    2::l34A99; 0 4444r!   c                 \   | j                  g d      }t        t        j                  |      j	                  d      |        | j                  g d      }t        t        j                  |      j	                  d      |        | j                  g d      }t        t        j                  |      j	                  d      |        | j                  g d      }t        t        j                  |      j	                  d      |        | j                  g d      }|t        |      z  }t        t        j                  |      j	                  d      |       | j                  g d      }|t        |      z  }t        t        j                  |      j	                  d      |       y )	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      sP   


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


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


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


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


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


()A	N1AH&&q)11D1A1Er!   c           	      ~   t         j                  j                  d      }t        j                  d| j                  d            }t        |j                  d      | j                  g d      dd	       t        j                  d| j                  d
            }t        |j                  d      | j                  | j                  g d      d      dd	       | j                  |j                  dd            }|t        |d      d d d f   z  }t        |j                  d         D ]  }||df   }t        j                  |      }t        |j                  d      | j                  |d      d       t        |j                  dd      | j                  |j                  d      d      d        t        j                  |      }t        |j                  d      | j                  |dd      d       t        |j                  dd      | j                  |j                  d      dd      d       y )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"**^2LU, 	E288G#45AAII4I0GGBJJ~6@U, 	

399S!$%A	"1d7	++A1771: $q#vYr"		t	4bggb!n"	$ 			Dt	D		D	 91="	$$ 	1AAII4I0"''!QQ'2G  AII4I@GGAIII5qqGAOr!   c           	          | j                  g dg dg dg dg dg dg      }t        j                  |      }|| j                  dgdgd	gd
gd	gd
gg      z  }t        |j	                         |       y )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      su    


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

SEB4!qcA3#DEEMAIIK/r!   c                     | j                  g dg dg dg dg dg      }t        j                  |      }| j                  |      t	        |d      d d d f   z  }t        |j                  d	      |       y )
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      sm    



 	A 	1AFF1Iqq 9!T' BBMAIII-}=r!   c                 h   | j                  g d      }t        j                  |      }t        ||j	                  d             | j                  g d      t        j                  d      z  }t        j                  |      }||z  |z  }t        |j	                  d      t        j                  d      z  | j                  g d             t        |j                         j	                  d      t        j                  d      z  | j                  g d             t        |j	                  d      t        j                  d      z  | j                  g d             t        |j                         j	                  d      t        j                  d      z  | j                  g d             t        ||j                         z  j	                  d      | j                  g d	      d
       t        ||j                         z  j	                  d      | j                  g d	      d
       t        ||z  j	                  d      | j                  g d      d
       t        |j                         |j                         z  j	                  d      | j                  g d      d
       y )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2


>"499Q</A1A	
1QBAIII.tyy|;JJ~.0AEEGOOeO4TYYq\AJJ/1BJJJ/		!<JJ/1BFFH$$u$5diilBJJ/02 QquuwY''%'8JJ~.U<R[))E):JJ~.U<QrTNNUN3JJ/e=QUUWrvvx'0050AJJ/e=r!   c                     | j                  g d|z  d      }t        j                  t        d      5  t	        j
                  |       d d d        y # 1 sw Y   y xY w)NrK   rA   zExpected `quat` to have shapematch)r   pytestraises
ValueErrorr   r(   )r+   rH   quats      r   test_from_quat_wrong_shaper      sQ    88'td{'Q'(D	z)H	I !4 ! ! !s   AAc                 b   | j                  g dg dg dg      }t        |      rG| j                  | j                  t	        j
                  |      j                         d               sJ y t        j                  t              5  t	        j
                  |       d d d        y # 1 sw Y   y xY w)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    


 	A
 Qvvbhhx11!4<<>vFGHHH]]:& 	"q!	" 	" 	"s   B%%B.c                 ,   | j                  g d      }| j                  |d|dz
  z  dz         }t        j                  |      j	                         }| j                  g dg dg dg      }| j                  |d|dz
  z  dz         }t        ||d	
       y )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     ::l#D::dDD1H-45D


T
"
,
,
.C::
 L
 ::lDD1H,=,FGLCE2r!   c                    | j                  g dg dg dg dg      }t        j                  |      j                         }t	        |j
                  d       | j                  g dg dg dg      }t        |d	   |d
       | j                  g dg dg dg      }t        |d   |d
       t        |d   | j                  d             t        |d   | j                  d             y )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     s    JJ	 E 

U
#
-
-
/CI&

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


 I
 CK7CK+CK+r!   c                    | j                  g dg dg dg      }t        j                  |      j                         }t	        |j
                  d       | j                  g dg dg dg      }t        |d   |d	
       | j                  g dg dg dg      }t        |d   |d	
       | j                  g dg dg dg      dz  }t        |d   |       y )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   ;  s    JJ E
 

U
#
-
-
/CI&

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

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


  	I
 CK+r!   c                 $   | j                  g dg dg dg      }| j                  |d|dz
  z  dz         }| j                  g d      }| j                  |d|dz
  z  dz         }t        t        j                  |      j                         |       y )	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     ** C
 **S$$(+f4
5CJJ34MJJ}ddQh.?$.FGMH((-557Gr!   c                    d}| j                  g d      t        j                  d      z  }| j                  g dg dg dg      }t        t	        j
                  |      j                         ||       t        t	        j
                  | j                  |d            j                         | j                  |d	      |       y )
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TRH((C)CDLLNJJ}f5r!   c                     | j                  t        j                  ddd            }t        t	        j
                  |      j                         |       y )NrR   rY   r   )rq   random_state)r)   r   rvsr   r   r   r^   r+   r   s     r    test_matrix_calculation_pipeliner   x  s>    
**(,,QRaH
ICH((-7793?r!   c                    t        j                  |       }|| j                  k(  rdnd}t        j                  j                  d      }| j                  |j                  d      |      }| j                  j                  |      }t        |j                  d         D ]:  }||   dk  st        j                  |      |df   j                  ||df          }< t        j                  |      j!                         }| j#                  || j%                  |            }| j'                  d      | j)                  d      z   }	t+        ||	|       y )	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   ~  s   b!ERZZ'5TD
))


"C
**S&&{35*
AC99==D4::a=! 87Q;&&+af%))3q#v;,7C8 $$S)335I))Ir':':9'EFKHH[!BFF1I-EKT2r!   c                 v   | j                  g dg dg dg      }| j                  g dg dg dg      }t        t        j                  |      j	                         |d       | j                  g d	g d
g dg      }| j                  g dg dg dg      }t        t        j                  |      j	                         |d       | j                  || j                  d      g      }| j                  || j                  d      g      }t        t        j                  |      j	                         |d       y )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7 8H H((-7798$O
** C zz<'') *H H((-7798$O ((C#
$Cxx266!9-.HH((-7798$Or!   c                    t         j                  j                  d      }t        j                  |       }|| j
                  k(  rdnd}t        t        j                  |j                  d            |       }t        j                  |j                         d      }| j                  |j                  ||            sJ y )	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RZZ'5TD
++CJJGJ,DEr
JC&&s}}TJK66#"";T":;;;r!   c                    | j                  d      }t        j                  |      d   j                  d      }t	        |      rC| j                  | j                  t        j                  |      j                                     s;J t        j                  t        d      5  t        j                  |       d d d        t        j                  |      d   j                  d      }t	        |      rD| j                  | j                  t        j                  |      j                                     sJ y t        j                  t        d      5  t        j                  |       d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)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33C8BBDEFFF]]:-GH 	&  %	& &&+d



#CSvvbhhx33C8BBDEFFF]]:-GH 	&  %	& 	&	& 	&	& 	&s   "E0E<0E9<Fc                     t         j                  j                  d      } t        j                  |       }t        j                  |j                         j                               }|j                  |d      sJ t        j                  d|       }t        j                  |j                         j                               }t        j                  |j                  |d            sJ y 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::<=A""15"111 ,JZ113::<=A66*))!%)8999r!   c                     | j                  g dg dg dg      }t        j                  |      }|j                         j                  t        |       k(  sJ y )Nr   r   r   )r)   r   r   r*   r%   r   r+   r   r"   s      r   test_from_matrix_int_dtyper     sG    
**iI6
7CS!A99; 0 4444r!   c                 "   d}| j                  g d      }| j                  |d|dz
  z  dz         }| j                  g d      }| j                  |d|dz
  z  dz         }t        j                  |      }t	        |j                         ||       y )	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9FJJ;<MJJ}ddQh.?$.FGM!!&)FFNN$m$?r!   c                     d}| j                  g dg dg dg      }| j                  g dg dg dg      }t        t        j                  |      j	                         ||       y )	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    sd    DZZ F JJ45 
 M
 H((088:MPTUr!   c                 B   | j                  dt        j                  d      z  dt        j                  d      z  dt        j                  d      z  gg dg dg      }t        j                  |      j                         }t        |d   | j                  d      d          t        |d	d df   |d
   dz         t        |d   | j                  d      d          t        |dd df   | j                  g d             t        |d   | j                  g d             y )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    s    ZZ			!	ediil2D499Q<4GH
 F '//1DDJ

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

9 5b 9:DBQBKJJ % &' DL"**^"<=r!   c                     t         j                  j                  d      } t        j                  |       }t        j                  |j                         j                               }|j                  |d      sJ t        j                  d|       }t        j                  |j                         j                               }t        j                  |j                  |d            sJ y 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::<=A""15"111 ,JZ113::<=A66*))!%)8999r!   c                     | j                  g d      }t        j                  |      }|j                         j                  t        |       k(  sJ y )Nr   )r)   r   r   r*   r%   r   )r+   r   r"   s      r   test_from_rotvec_int_dtyper    s@    ZZ	"FV$A99; 0 4444r!   c                     | j                  dgdz        }t        j                  |d      }|j                         }| j                  |dz  | j                  z        }t        j                  |      }|j                         }t        ||       y )Ngvô0?rR   Tdegrees   )r)   r   r   r*   pir   )r+   rotvec1rot1quat1rotvec2rot2quat2s          r   test_degrees_from_rotvecr  &  sw    jj.)A-.G6DLLNE jj3./G(DLLNEE5!r!   c                     t        j                  t        d      5  t        j                  | j                  ddg             d d d        y # 1 sw Y   y xY w)N Expected `rot_vec` to have shaper   r   r   )r   r   r   r   r   r)   r+   s    r   test_malformed_1d_from_rotvecr   4  sA    	z)K	L 1RZZA/01 1 1s   'AAc                     d|dz
  z  dz   }t        j                  t        d      5  t        j                  | j                  |             d d d        y # 1 sw Y   y xY w)NrK   r   r   r  r   )r   r   r   r   r   onesr+   rH   rc   s      r   test_malformed_nd_from_rotvecr%  :  sQ     D1H$E	z)K	L -RWWU^,- - -   %AAz
dask.arrayz&missing required linalg.cross function)reasonc           	         t        j                  |       }|| j                  k(  rdnd}| j                  g dg dg dg      }|t	        |dd      z  }t        j                  |      j                         }t	        |d	      }t        |d d d
f   | j                  |dz               t        | j                  j                  ||d d d d
f         | j                  d      |       y )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RZZ'5TD:: D
 	N4b488D%//1F6+EDAJuqy 12BIIOOFDBQBK8"((6:JQUVr!   r@   c                 Z   | j                  g d      }| j                  |d|dz
  z  dz         }| j                  g d      }| j                  |d|dz
  z  dz         }t        j                  |      j	                         }t        |j                  |j                         t        ||       y )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     ::m$D::dDD1H-45Djj!CDOjj$$(2Cd2JKO&&t,668M$$o&;&;<M?3r!   c                 $   | j                  g dg dg dg      }t        j                  |      }|j                  d      }t	        |d      }t        || j                  d      d	          t        |d
   |d          t        |d   |d          y )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     **iI6
7C


s
#C]]4](F6+EE2::e,R01F1Ivay)F1Ivay)r!   c                     | j                  g dg dg dg      }t        t        j                  |      j	                         |       t        t        j                  |d      j	                  d      |       y )Nr  r   rr   r   )ga2U0*3gǺ6?ga2U0*?Tr  )r)   r   r   r   r  )r+   r   s     r   test_rotvec_calc_pipeliner:  o  si     ZZ
 F
 H((0::<fEH((>HHQUHVr!   c                    | j                  g d      }| j                  |d|dz
  z  dz         }| j                  g d      }| j                  |d|dz
  z  dz         }t        j                  |      }t	        |j                         |d       y )	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
3CJJ~.MJJ}ddQh.?$.FGMs#FFNN$m%@r!   c                     t         j                  j                  d      } t        j                  |       }t        j                  |j                         j                               }|j                  |d      sJ t        j                  d|       }t        j                  |j                         j                               }t        j                  |j                  |d            sJ y 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7A""15"111 ,J*++-4467A66*))!%)8999r!   c                     | j                  g d      }t        j                  |      }|j                         j                  t        |       k(  sJ y )Nr   )r)   r   r<  r*   r%   r   )r+   r=  r"   s      r   test_from_mrp_int_dtyperC    s@    
**Y
C#A99; 0 4444r!   c                     | j                  g dg dg dg      }| j                  g dg dg dg      }t        t        j                  |      j	                         |       y )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4mDr!   c                     d|dz
  z  dz   }t        j                  t        d      5  t        j                  | j                  |             d d d        y # 1 sw Y   y xY w)NrK   r   r"  zExpected `mrp` to have shaper   )r   r   r   r   r<  r#  r$  s      r   test_malformed_nd_from_mrprG    sQ     D1H$E	z)G	H *"''%.)* * *r&  c                     | j                  g dg dg dg      }|t        |d      d d d f   z  }| j                  g dg dg dg      }t        t        j                  |      j                         |       y )	Nr)  r*  r/   r   r   )gQUU?gvWUU?QUUտ)uFx?guFxrJ  r  )r)   r   r   r   r(   r@  )r+   r   expected_mrps      r   test_as_generic_mrprL    sv    :: D 	N4a(D11D::-- L H&&t,335|Dr!   c           	          | j                  t        j                  | j                  dz  dz         ddg      }t	        t        j                  d| j                  g d      d      j                         |       y )	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a@ALE2::k#:DIPPRr!   c                 Z   | j                  g d      }| j                  |d|dz
  z  dz         }| j                  g d      }| j                  |d|dz
  z  dz         }t        j                  |      j	                         }t        |j                  |j                         t        ||       y )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     ::m$D::dDD1H-45D::CDL::lDD1H,=,DEL##D)002J!!<#5#56J-r!   c                     | j                  g dg dg dg dg      }| j                  g dg dg dg dg      }t        t        j                  |      j	                         |       y )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    sb    	 J
 ::.	 L
 H%%j188:LIr!   c                     t        j                  d| j                  d      d      j                         }| j                  g d      t	        j
                  d      z  }t        ||       y )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    sL    sBJJrNDAIIKDJJ~.1=MD-(r!   c                 ^   t        j                  t        d      5  t        j                  d| j                  ddg             d d d        t        j                  t        d      5  t        j                  d| j                  dg             d d d        y # 1 sw Y   TxY w# 1 sw Y   y xY w)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 6CQG!456 
z)Q	R 5E2::rd#345 56 65 5s   (B''B#B #B,c                 H   | j                  | j                  g d      d|dz
  z  dz         }t        j                  d|d      j	                         }| j                  g d      t        j                  d	      z  }| j                  |d|dz
  z  d
z         }t        ||       y )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IFufd;CCEDJJ~.1=MJJ}ddQh.?$.FGMD-(r!   c                     t        j                  d| j                  d      d      j                         }t        j                  d| j                  d      d      j                         }t	        ||       y )Nr   rW  Tr  Zr   r   r)   r^   r   )r+   	extrinsic	intrinsics      r   (test_single_intrinsic_extrinsic_rotationrf    sV    ##CBFPPRI##CBFPPRIIy)r!   c                 ^   t         j                  j                  d      }| j                  |j	                  ddd            }| j                  |d      }t        j                  d|d	      j                         }t        j                  d
|d	      j                         }t        ||       y )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;;=AE1d3;;=AAqr!   c                     d}t        j                  d| j                  ddg      d      j                         }| j                  g dg dg dg      }t	        |||	       y )
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$
G
Q
Q
SC:: L
 CD1r!   c           	      ~   d}| j                  g dg dg dg      }t        j                  d|d      j                         }t	        |d   | j                  g d	g d
g dg      |       t	        |d   | j                  g dg dg dg      |       t	        |d   | j                  g dg dg dg      |       y )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
FCCK***- " 	 CK***- " 	 CK*)*- " 	r!   c           	      n   | j                  g dg dg dg      }t        j                  d|d      j                         }t	        |d   | j                  g dg d	g d
g             t	        |d   | j                  g dg dg dg             t	        |d   | j                  g dg dg dg             y )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
FCCK,,*- "  CK+*'- "  CK-.*- " r!   c           	      n   | j                  g dg dg dg      }t        j                  d|d      j                         }t	        |d   | j                  g dg d	g d
g             t	        |d   | j                  g dg d	g dg             t	        |d   | j                  g dg dg dg             y )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
FCCK++-- "  CK+++- "  CK,,,- " r!   c           	      n   | j                  g dg dg dg      }t        j                  d|d      j                         }t	        |d   | j                  g dg d	g d
g             t	        |d   | j                  g dg dg d
g             t	        |d   | j                  g dg dg dg             y )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
FCCK-.)- "  CK,+)- "  CK,,+- " r!   c                     t         j                  j                  d      } d}t        j                  |       }t        j                  ||j                  |      j                               }|j                  |d      sJ t        j                  d|       }t        j                  ||j                  |      j                               }t        j                  |j                  |d            sJ y )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GA""15"111 ,JE:#6#6u#=#D#D#FGA66*))!%)8999r!   c                     t         j                  j                  d      } | j                  dd      }t	        j
                  d|d      }t	        j
                  dt        |      d      }|j                  |d	      sJ y )
Nrl   Lr  )rj  rk  r   Tr  rn   ro   )r2   r\   rs   uniformr   r   floatru   )rf   degrx   r"   s       r   test_from_euler_scalarr    sm    
))


$C
++$S+
)C$$S#t<JCsT:A""15"111r!   	seq_tupler   re  )FTc                      fd}t         j                  j                  d      }d}t        j                  |df      }|j	                  t         j
                   t         j
                  |f      |d d df<   |j	                  t         j
                   dz  t         j
                  dz  |f      |d d df<   |j	                  t         j
                   t         j
                  |f      |d d df<    j                  |      }dj                  |      }|r|j                         }t        j                  ||      }|j                  |      }	t        ||	dd	
        ||	|z
  dd       y )Nc                     j                  | d      }j                  | d      }j                  ||      }j                  j	                  |      |k        sJ j                  ||k        sJ y Nr   r   meanstdhypotrv   r   errormean_maxrms_maxr  r  rmsr+   s         r   
test_statsz1test_as_euler_asymmetric_axes.<locals>.test_stats  l    wwu1w%ffUf#hhtS!vvbffTlX-...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    s"   
% ))


"CAXXq!fF;;BEE6QD;AF1a4L;;BEE6A:BEEAIQD;IF1a4L;;BEE6QD;AF1a4LZZF
'')
C iik""3/H##C(KFKae<{V#UE2r!   c                      fd}t         j                  j                  d      }d}t        j                  |df      }|j	                  t         j
                   t         j
                  |f      |d d df<   |j	                  dt         j
                  |f      |d d df<   |j	                  t         j
                   t         j
                  |f      |d d df<    j                  |      }dj                  |d   |d   |d   g      }|r|j                         }t        j                  ||      }|j                  |      }	t        ||	dd	
        ||	|z
  dd       y )Nc                     j                  | d      }j                  | d      }j                  ||      }j                  j	                  |      |k        sJ j                  ||k        sJ y 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    s'   
% ))


"CAXXq!fF;;BEE6QD;AF1a4L;;1255t;<F1a4L;;BEE6QD;AF1a4LZZF ''9Q<1y|<
=Ciik""3/H##C(KFKag>{V#UE2r!   c              #      K   | r t        t        d|      5  d  d d d        y t        j                         5  t        j                  d       d  d d d        y # 1 sw Y   y xY w# 1 sw Y   y xY ww)NzGimbal lock)r   r+   r  )r   UserWarningwarningscatch_warningssimplefilter)should_warnr+   s     r   maybe_warn_gimbal_lockr    sl      MbA 		 	 $$& 	!!'*	 			 		 	s2   A4AA4A(	A4A%!A4(A1-A4suppress_warningsc                    t        j                  |       }|| j                  k(  rdnd}| j                  g dg dg dg dg      }dj	                  |      }|r|j                         }t        j                  ||d	      }|j                         }	t        | |       5  |j                  |d|
      }
d d d        t        j                  |
d	      j                         }t        |	||       y # 1 sw Y   >xY w)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RZZ'5TD ZZ	 F '')
C iik""3=H%%'L	$5 5r	: 
"++1B , 

 ''_dKUUWML-d;
 
s   C00C9c                    t        j                  |       }|| j                  k(  rdnd}| j                  g dg dg dg dg      }dj	                  |d   |d	   |d   g      }|r|j                         }t        j                  ||d
      }|j                         }	t        | |       5  |j                  |d
|      }
d d d        t        j                  |
d
      j                         }t        |	||       y # 1 sw Y   >xY w)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RZZ'5TD ZZ	 F ''9Q<1y|<
=C iik""3=H%%'L	$5 5r	: 
"++1B , 

 ''_dKUUWML-d;
 
s   *C<<Dc                 2   | j                  g dg dg dg      }| j                  |d|dz
  z  dz         }t        j                  |      j	                  dd	      }| j                  g d
      }| j                  |d|dz
  z  dz         }t        ||d       y )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
5C!!#&//t/DFjj.Ojj$$(2Cd2JKOFO%8r!   c                    t        j                  |       }|| j                  k(  rdnd}t        j                  j                  d      }d}t        j                  ||      }t        ||       }|j                         }|j                         j                         }||z  }||z  }	| j                  |ddf      }
t        j                  |
      dd dd df   j                  | j                  d            }
t        ||
|       t        |	|
|       d	}|| j                  k(  rdnd
}| j                  |j!                  |dz         |      }t        j"                  |      }|j                         }|j                         j                         }||z  }||z  }	| j                  |dz         }t        j                  |      dd dd df   j                  | j                  d            }t        |||       t        |	||       y )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RZZ'5TD
))


"C
AAC0Aq"AKKMEEEGEemGemGHHaAYEFF5M#rr2A2+&**266!95EGU.GU. KRZZ'5TD::cjjkD&8j9:GD4 AKKMEEEGEemGemGXXkF*+FVVF^C!RaRK(,,RVVAY7FGV$/GV$/r!   c                    t        j                  |       }|| j                  k(  rdnd}t        j                  j                  d      }t        t        j                  |      |       }|j                         }|j                         }|j                         }| j                  ||      }| j                  ||      }	| j                  d      }
t        ||
|       t        |	|
|       t        t        j                  d|      |       }|j                         }|j                         }|j                         }| j                  j                  ||      }| j                  j                  ||      }| j                  d	      }t        j                  |      d
d dd df   j!                  | j                  d            }t        |||       t        |||       y )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  sq   b!ERZZ'5TD
))

 G
HCx3/4A	AKKMEKKME99UE"D99UE"D
&&)CD#D)D#D)x1#6;A	A{{}H{{}Hiix2Giix2GHHYEFF5M#rr2A2+&**266!95EGU.GU.r!   c                     d}t        t        j                  |      |       }| j                  |      }t	        |j                         |       t	        |j                         j                         |       y )NrY   )r,   r   identityr   r   	magnituder   )r+   r  r"   r   s       r   test_identity_magnituder    sT    
Ax((+R0Axx{HAKKM8,AEEG%%'2r!   c                     t        t        j                         |       }|j                         dk(  sJ |j	                         j                         dk(  sJ y )Nr   )r,   r   r  r  r   r{   s     r   test_single_identity_magnituder    sH    x((*B/A;;=A557!###r!   c                    t        j                  |       }|| j                  k(  rdnd}d}t        t	        j
                  |d      |       }t        t	        j                  |      |       }||z  }t        |j                         |j                                ||j                         z  }t        |j                         | j                  |      |       y 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RZZ'5TD
Axqa0"5Ax((+R0AUFAIIK!12aeegFF$$&$?r!   c                    t        j                  |       }|| j                  k(  rdnd}d}t        t	        j
                  |d      |       }t        t	        j                         |       }||z  }t        |j                         |j                                ||j                         z  }t        |j                         | j                  |      |       y r  r  r  s          r   test_single_identity_invariancer    s    b!ERZZ'5TD
Axqa0"5Ax((*B/AUFAIIK!12aeegFF$$&$?r!   c                     t        j                  d      } | j                         j                  dk(  sJ t        j                  d      } | j                         j                  dk(  sJ t        j                  d      } | j                         j                  dk(  sJ t        j                  d      } t	        | j                         j                  d	d
      t        j                  t        j                  d
      d	   d             t        j                  t        d      5  t        j                  d       d d d        t        j                  t        d      5  t        j                  dd       d d d        t        j                  t        d      5  t        j                  dd       d d d        y # 1 sw Y   xY w# 1 sw Y   PxY w# 1 sw Y   y xY w)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    sc   #A99;$$$"A99;&&&'A99;	)))	*AAIIK''A.q	"~0VW	z)T	U %$%	z)N	O /av./	y(P	Q  !Q   	% %/ /   s$   %F:GG:GGGc                    d|dz
  z  dz   }| j                  | j                  d      |dz         }t        j                  |      }|j	                         }| j                  | j                  | j                  | j                  dg      }| j                  ||      }t        ||       t        j                  |       }|j	                         }t        ||       y )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::bffQid!23D4 A[[]Fjj"%%q!9:Ojj*=OFO,D5!A[[]FFO,r!   c                 $   t        j                  | j                  d            }|d   j                         }t	        || j                  | j                        d          |d   j                         }t	        || j                  d      d          y )Nr@   r   r   rR   r   )r   r(   r_   r  r   r)   r  )r+   r"   r  r  s       r   test_magnitude_single_rotationr    sm    266!9%AdnnGGRZZ.r23dnnGGRZZ_R01r!   c                    t         j                  j                  d      }t        j                  d|      }t        j                  d|      }||j	                         z  j                         }t        ||       }t        ||       }| j                  t        j                  |            }t        |j                  ||      | j                  |      |k         y )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
HC$A$A[##%Eq"Aq"A::bii&'DANN1d+bjj.?$.FHr!   c                    t        j                  | j                  g d            }t        j                  | j	                  d            }|j                  |d         sJ |j                  |d         rJ |j                  |d   d      rJ |j                  |d   dd	      rJ t        j                  t        d
      5  |j                  |d   d      sJ 	 d d d        y # 1 sw Y   y xY w)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    s     	RZZ56A266!9%A>>!A$~~ad### ~~ad~///~~adt~<<<	k);	< 2~~adD~1112 2 2s   C&&C/c                    d}t         j                  j                  d      }t        j                  |j                  |dz               }t        j                  |j                  |dz               }||j                         z  j                         }t        ||       }t        ||       }|j                  |k(  sJ | j                  t        j                  |            }t        |j                  ||      | j                  |      |k         t        j                  |j                  |dz               }t        j                  |j                  d            }||j                         z  j                         }t        ||       }t        ||       }|j                  |k(  sJ | j                  t        j                  |            }t        |j                  ||      | j                  |      |k         t        j                  |j                  |dz               }t        j                  |j                  d            }||j                         z  j                         }t        ||       }t        ||       }|j                  |k(  sJ | j                  t        j                  |            }t        |j                  ||      | j                  |      |k         y )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     sK    K
))


"C3::;+=:>?A3::;+=:>?A[##%Eq"Aq"A;;+%%%::bii&'DANN1d+bjj.?$.FH 	3::;+=:>?A3::=:9:A[##%Eq"Aq"A;;+%%%::bii&'DANN1d+bjj.?$.FH 	3::;+=:>?A3::9:56A[##%Eq"Aq"A;;+%%%::bii&'DANN1d+bjj.?$.FHr!   c                 (   t        j                  | j                  d            }t        j                  | j                  d            }t        j                  t
        d      5  |j                  |       d d d        t        j                  | j                  d            }t        j                  | j                  d            }t        j                  t
        d      5  |j                  |       d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)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$  $  s    2779-.A2779-.A	z)?	@ 	q 	2776?+A2776?+A	z)?	@ 	q  
 s   $C<!D<DDc                    | j                  | j                  d       | j                  d      f      }| j                  |d|dz
  z  dz         }| j                  d| j                  dz  d      }| j                  d      d	   }t        |       | j                  u rd
nd}|D ]U  }t        j                  ||z        j                         }|j                  d	k(  sJ t        |j                         ||       W y )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     99rvvayj"&&),-D::dDD1H-67D[[BEEAIs+Fjjob!G#B'2::545D @%%a$h/446||r!!!((*G$?@r!   rA   c                    | j                  | j                  | j                  d       | j                  d      f      d|dz
  z  dz         }| j                  dz  }t	        j
                  ||z        }| j                  |j                  d d d      }|dk(  r|d   }t        |       | j                  u rd	nd
}t        |j                  d      j                         ||       | j                  |j                  dd d      }|dk  r|d   }t        |j                  d      j                         ||       |j                  d      }t        |j                  d      |j                  d      |       y )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  ?  sH    77299rvvayj"&&)45ttax7H67QRDEEAIEUT\*A ggdjj"os+Gqy"+#B'2::545DAFFFO--/tD ggdjj2&,Gax"+AFFF(224gDI VVV_FFNNTN2AIII4Mr!   c           	         t        j                  |       | j                  k(  rdnd}t        j                  j                  d      }| j                  |j                  d      t        j                  |             }t        j                  |      }|j                  d      }t        |j                  d         D ]  }t        |j                  d	         D ]s  }t        j                  |d d ||d
f         j                         }t        ||   |   |j                         z  j                         | j                  d      d   |       u  |j                  d      }	t        |j                  d         D ]l  }t        j                  ||d
f         j                         }t        |	|   |j                         z  j                         | j                  d      d   |       n y )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)RZZ75TD
))


"C


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

3+$	88r!   c           	      n   | j                  d| j                  dz  d      }|f|dz
  z  }| j                  g dg dg dg      }| j                  ddg      }| j                  ||dz         }| j                  ||dz         }| j                  d	      d
   }|D ]  }t	        j
                  ||dd dd d f   z        }|j                  |      }	t	        j
                  ||z        }
|
j                         }|j                  d
k(  sJ t        ||	j                         z  j                         |d        y )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  s&   
 [[BEEAIs+F 'TAX&K::{Iy9:Djj!Q G774v-.Dggg{T12Gzz#r"H I!!!d3A:&6"67WWWW%  T*FFHww"}}RVVX002H4HIr!   c                    t        j                  | j                  d            }t        |j	                               rN|j                  | j                  d             }| j                  | j                  |j                              sHJ t        j                  t        d      5  |j                  | j                  d              d d d        t        j                  | j                  d            }t        j                  t        d      5  |j                  | j                  d             d d d        t        j                  | j                  d            }t        j                  t        d      5  |j                  | j                  d	             d d d        t        j                  t        d
      5  |j                  d       d d d        t        j                  t        d
      5  |j                  d       d d d        t        j                  t        d      5  |j                  d       d d d        t        j                  t        d
      5  |j                  d       d d d        y # 1 sw Y   xY w# 1 sw Y   YxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   ~xY w# 1 sw Y   y xY w)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    s   266!9%AQYY[!FFBGGAJ;F'vvbhhqww'(((]]:^< 	(FFBGGAJ;F'	( 	2776?+A	z)@	A &	rwwt}%&2779-.A	z)@	A (	rwwv'( 
z)D	E 	A	z)D	E 	G	z)V	W 	C	z)D	E 	C %	( 	(
& &( (    sT   '#I="J
:"J?J#5J/+J;!K=J
JJ #J,/J8;KKc                     t        j                  | j                  g d            }|j                  d      }t	        |t               sJ y )Nr   r   r   r   Freturn_indices)r   r(   r)   reduce
isinstance)r+   r"   r   s      r   test_reduction_no_indicesrK    s<    2::&:;<AXXUX+Ffh'''r!   c                     t        j                  | j                  g d            }|j                  d      }t	        |      t
        u sJ t        |      dk(  sJ |\  }}}|J |J y )NrF  TrG  rR   )r   r(   r)   rI  typetuplelen)r+   r"   r   reduced	left_best
right_bests         r   test_reduction_none_indicesrS    st    2::&:;<AXXTX*F<5   v;!%+"GY
r!   c                 &   t        j                  |       }|| j                  k(  rdnd}t        j                  j                  d      }t        j                  d|      }t        j                  d|      }t        j                  d|      }t        ||       }t        ||       }t        ||       }	|	j                  ||d	      \  }
}}t        j                  t        |      t        |      t        |      f      }t        |      D ]]  \  }}t        |      D ]J  \  }}t        |      D ]7  \  }}t        j                  ||z  |z  j                         d
         ||||f<   9 L _ t        j                  t        j                  |dd      |j                   d   df      }t        j"                  t        j                  |t        |	      df      d      }| j%                  |t        |      z        }| j%                  |t        |      z        }| j'                  ||k(        sJ | j'                  ||k(        sJ ||   |	z  ||   z  }|
j)                         |z  j+                         }t-        || j                  t        |	            |       y )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RZZ'5TD
))

 G
HC??1#&D??23'D??1#&DtR AtR AtR A%&XXa4X%H"GY
 hhD	3t9c$i89G4 G2t_ 	GEAr"4 G2#%6627R<*@*@*B1*E#F1a G	GG jjWa3gmmA6F5KLGii

7SVRL9BGjjCF!23Ozz'CF"2366).///66* 00111o&*Q/?-@@M;;==(
3
3
5CC#a&)5r!   c                    t        j                  |       }| j                  g dg dg dg      }t        j                  |      }t        j                  | j                  |d            }| j                  g d|      }| j                  |d      }| j                  g d|      }| j                  |d      }t        |j                  |      |       t        |j                  |      |       t        |j                  |      |       t        |j                  |      |       | j                  g d	|      }	| j                  |	d      }
t        |j                  |d
      |	       t        |j                  |d
      |
       t        |j                  |d
      |
       t        |j                  |d
      |
       y )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    sq   b!E
** C
 $Ds ;<D::k:/D>>$Q>'D**\*7K..1.5KDJJt$k2DJJt$k2DJJt$k2DJJt$k2**\*7K..1.5KDJJtTJ2K@DJJtTJ2K@DJJtTJ2K@DJJtTJ2K@r!   c                    t        j                  |       }| j                  g dg dg dg      }t        j                  |      }t        j                  | j                  |d            }t        j                  j                  d      }|f|dz
  z  }| j                  |j                  |dz         |	      }| j                  |d
    |d   |d   gd      }	t        |j                  |      |	       t        |j                  |      |	       | j                  |d
   |d    |d   gd      }
t        |j                  |d      |
       t        |j                  |d      |
       y )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    sE    b!E
** C
 
		c	"B			bnnSqn9	:B
))


"C'TAX&K


3::;#7:8
FA1V9*ai6;"EIBHHQK+BHHQK+!F)aiZ6;"EIBHHQH-y9BHHQH-y9r!   c                 D   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<   | j                  ||	      }|f|dz
  z  }| j                  ||d
z         }t        j                  |      }| j                  g d      }| j                  |d      }| j                  g dg dg      }| j                  ||dz         }t        |j                  |      |       t        |j                  |      |       | j                  g dg dg      }	| j                  |	|dz         }	t        |j                  |d      |	       t        |j                  |d      |	       y )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    so    b!E
((9
CXX CF
 XX CF
 **S*
&C'TAX&K
''#{Y.
/CS!A	I	B		#B

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

L*56I	;#78IAGGBG-y9AGGBG-y9r!   c                    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<   | j                  ||	      }|f|dz
  z  }| j                  ||d
z         }t        j                  |      }| j                  g dg dg|	      }| j                  g dg dg|	      }| j                  ||dz         }t        |j                  |      |       | j                  g dg dg|	      }| j                  ||dz         }t        |j                  |d      |       y )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  sE    b!E
((9
CXX CF
 XX CF
 **S*
&C'TAX&K
''#{Y.
/CS!A


Iy)
7A

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

L*5U
CI	;#78IAGGAtG,i8r!   c                    t         j                  j                  d      }g d}g d}t        ||      D ]  \  }}| j	                  |j                  |dz               }| j	                  |j                  |dz               }t        j                  |      }t        j                  ||      dz   }	|j                  |      }
|
j                  |	k(  sJ |j                  |d      }
|
j                  |	k(  rJ  y )	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7MUJ#J>  JJszzw~z67JJszzw~z67q!##GW5<GGAJww%GGAtG$ww% r!   c                     t         j                  j                  d      } t        j                  |       }| j	                  ddd      }|j                  |j                               }|j                  |      }t        ||d       | j	                  ddd	      }|j                  |j                               }|j                  |      }t        ||d       y )
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                  | j                  d            }t        j                  t
        d      5  |j                  | j                  d             d d d        t        j                  t
        d      5  |j                  | j                  d             d d d        t        j                  | j                  d            }t        j                  t
        d      5  |j                  | j                  d             d d d        t        j                  | j                  d	            }t        j                  t
        d      5  |j                  | j                  d
             d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)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  s1   2771:&A	z)B	C 	
	z)B	C !	 !2776?+A	z);	< !	 !277<01A	z);	< $		"#$ $ ! !! !$ $s0    !E>!F,!F!F#>FFF #F,c                    t         j                  j                  d      }|j                  d|f|dz
  z  z   dz         }| j	                  t        j                  |      j                               }t        j                  |      }t        |d   j                         |d   d       t        |d   j                         |d	   d       t        |d d
 j                         | j                  |d   d      d       y )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
:CS!AAaDNN$c&k>AaDNN$c&k>AcrF$$&s6{(KRWXr!   c                     t        j                  t        d      5  t        j                  | j                  g d            d    d d d        y # 1 sw Y   y xY w)Nnot subscriptabler   r/   r   )r   r   r  r   r(   r)   r  s    r   test_getitem_singler    sB    	y(;	< 82::l34Q78 8 8s   *AAc                     t        j                  g dg dg dgg dg dg dgg      } t        j                  |       }t	        |dg   j                         | dg   d       t	        |dd	g   j                         | dd	g   d       y )
Nr   r   r   rt  r   r   rS   ro   r   )r2   r3   r   r   r   r^   )r   r"   s     r   test_getitem_array_liker    s    
((\   ! "C 	S!AAqcF$$&QCu=Aq!fI'')31v;UCr!   c                    t        j                  | j                  g d            }t        j                  t
        d      5  t        j                  | j                  g d            |d<   d d d        y # 1 sw Y   y xY w)Nr/   r  r   r   )r   r(   r)   r   r   r  r{   s     r   test_setitem_singler    s\    2::l34A	y(;	< <!!"**\":;!< < <s   *A55A>c                 V   t         j                  j                  d      }t        t	        j                  d|      |       }t        t	        j                  d|      |       }||dd t        |dd j                         |j                                t	        j                  | j                  |j                  d                  }t	        j                  | j                  |j                  d	                  }||dd
 t        |dd
 j                         |j                                y )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
HC	4b	9B	s3R	8BBqGBqGOO%rzz|4 
		BJJszzyz'AB	CB			BJJszzyz'AB	CBBqGBqGOO%rzz|4r!   c                 T   t         j                  j                  d      }t        t	        j                  d|      |       }t        t	        j                  |      |       }||d<   t        |d   j                         |j                                t	        j                  | j                  |j                  d                  }t	        j                  | j                  |j                  d                  }||d<   t        |d   j                         |j                                y )Nr  rY   rm   r   r  rp   r  r  r  s       r   test_setitem_integerr    s    
))

 G
HC	4b	9B	C0"	5BBqEBqEMMORZZ\2 
		BJJszzyz'AB	CB			BJJszzvz'>?	@BBqEBqEMMORZZ\2r!   c                     t        t        j                  dd      |       }t        j                  t
        d      5  d|d<   d d d        y # 1 sw Y   y xY w)NrY   r   rm   zRotation objectr   r   )r,   r   r\   r   r   r  r{   s     r   test_setitem_wrong_typer    sF    xrq126A	y(9	: !  s   AAc                 X   t        j                  d      }t        j                  g dg dg dg      |d<   t        j                  g dg dg dg      |d<   | j                  |      }t	        j
                  |      }t        t        |      d	       t        t        |d d
       d       y )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XX CF
 XX CF
 **S/CS!AQQsVa r!   c                  V   t         j                  j                  d      } t        t	        j                  |       j                         j                  d       t        t	        j                  d |       j                         j                  d       t        t	        j                  d|       j                         j                  d       t        t	        j                  d|       j                         j                  d       t        t	        j                  | d	      j                         j                  d       t        t	        j                  | d
	      j                         j                  d       t        t	        j                  | d	      j                         j                  d       t         j                  j                  d      t         j                  j                  d      }}t	        j                  d|      }t	        j                  |d	      }t        |j                         |j                         j                  dd      d       t        j                  t        d      5  t	        j                  d| d       d d d        t        j                  t        d      5  t	        j                  | d	       d d d        t        j                  t        d      5  t	        j                  d| d        d d d        y # 1 sw Y   xY w# 1 sw Y   QxY w# 1 sw Y   y xY w)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    s   
))


"CS)113994@3/779??F,446<<fE,446<<fES3;;=CCTJS5==?EEvNS7??AGGS&&r*BII,A,A",E$DOOA4(Eoo$f5GEMMOW__%6%>%>q!%D5Q	z)N	O 5A#V45	z)T	U ,Cs+,	y(P	Q &3%& &	5 5, ,& &s$   /L+L&LLLL(c                 v   t        j                  |       }|| j                  k(  rdnd}| j                  g dg dg|      }| j                  |d      }t	        j
                  ||      \  }}t        |j                         | j                  d      |	       t        || j                  d
      d   dd       y )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RZZ'5TD


Iy)
7A


14
 A$$Q*GAtAKKM266!948D"**S/"-5tLr!   c                    t        j                  |       }|| j                  k(  rdnd}t        j                  j                  d      }t        t        j                  |      |       }| j                  |j                  d      |      }|j                  |      }t        j                  ||      \  }}t        |j                         |j                                t        || j                  d      d	   d
|       y )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BJJ&4DD
))

 F
GCx3/4A


3::6:*%
8A	
A&&q!,ICAIIK/D"**S/"-5tLr!   c                 ^   t        j                  |       }|| j                  k(  rdnd}| j                  g dg dg      }| j                  g dg dg      }t	        j
                  ||      \  }}t        ||j                  |      d       t        || j                  d	      d
   d|       y )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BJJ&4DD


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


8:< 	=A &&q!,ICAsyy|$/D"**S/"-5tLr!   c                 <   | j                  d      d   }| j                  g dg dg dg      }d}| j                  g dg dg dg      }| j                  g d	g d
g dg      }t        j                  ||d      \  }}}t        |||       t        |||       y )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"5MJJ . . 0 1M D


Iy)45A


I{K89A,,QdKOCtD-d3D-d3r!   c                 J   d}| j                  t        j                  |d      j                  g d            }| j                  t        j                  |d      j                  g d            }d}t        j                  ||| j                  |      d      \  }}}t        j                  |||| j                  |      z  d      \  }}	}
t        |j                         |j                                t        t        j                  |      |z  |	d	       t        ||
       y )
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29=>A


8??1!,229=>AE ..q!RWWQZFD% ..q!URWWQZ5GND%DNN$dnn&67DIIe$u,e$?D$r!   c                    t        j                  |       }t        j                  j	                  d      }d}t        t        j                  |      |       }| j                  |j                  |df      |      }|j                  |      }t        j                  d      }d|z  }t        j                  | j                  |j                  |df|	      |            }	|	j                  |      }
t        j                  |
|d
      \  }}}||j                         z  j                         }t        |d   | j                  d      d   |       t        |d   | j                  d      d   |       t        |d   | j                  d      d   |       || j                  |      z  }t        |d   | j                  d      d   |       t        |d   | j                  d      d   |       t        |d   | j                  d      d   |       | j!                  |
|j                  |      z
  dz        dz  }t        ||d       y )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  s   b!E
))

 G
HCI
S12
6Cjj)Q8jFGYYwF JJqMEeI  


3::Iq>:?u
ME ;;v&L++L'?CENCs #'')O..0LLORZZ_R%8yILORZZ_R%8yILORZZ_R%8yI 2::eCCIrzz#r2CCIrzz#r2CCIrzz#r2C		'(::q@ASHJD*%8r!   c                    t        j                  t        d      5  | j                  g d      | j                  g d      }}t	        j
                  ||       d d d        t        j                  t        d      5  | j                  g d      | j                  g d      }}t	        j
                  ||       d d d        t        j                  t        d      5  | j                  g dg dg      | j                  g dg      }}t	        j
                  ||       d d d        t        j                  t        d      5  | j                  g dg      | j                  g dg      }}| j                  d	gg      }t	        j
                  |||       d d d        t        j                  t        d
      5  | j                  g dg dg      | j                  g dg dg      }}| j                  g d      }t	        j
                  |||       d d d        | j                  g dg      | j                  g dg      }}| j                  dg      }t        |      rgt	        j
                  |||      \  }}| j                  | j                  |j                                     sJ d       | j                  |      sBJ d       t        j                  t        d      5  t	        j
                  |||       d d d        | j                  g dg dg      | j                  g dg dg      }}| j                  | j                  | j                  g      }t        |      rgt	        j
                  |||      \  }}| j                  | j                  |j                                     sJ d       | j                  |      sBJ d       t        j                  t        d      5  t	        j
                  |||       d d d        | j                  g dg      | j                  g dg      }}t        |      rft	        j
                  ||      \  }}| j                  | j                  |j                                     sJ d       | j                  |      sAJ d       t        j                  t        d      5  t	        j
                  ||       d d d        | j                  g dg dg      | j                  g dg dg      }}| j                  | j                  d	g      }t        |      rDt	        j
                  |||d      \  }}}| j                  | j                  |            sDJ d       t        j                  t        d      5  t	        j
                  |||d       d d d        | j                  g dg      | j                  g dg      }}t        |      rCt	        j
                  ||d      \  }}}| j                  | j                  |            sCJ d       t        j                  t        d      5  t	        j
                  ||d       d d d        | j                  g dgg      | j                  g dgg      }}t        j                  t        d      5  t	        j
                  ||       d d d        y # 1 sw Y   kxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   WxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   SxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)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 %zz,'I)>1q!$% 
z)K	L %zz)$bjj&>1q!$% 
z *? 
@ %zz9i012::yk3J1q!$%
 
zE
G .zz9+&

I;(?1**qcU#q!W-	. 
zJ
L .zz9i012::y)>T3U1**Y'q!W-	. ::yk"BJJ	{$;qAjj"GW((Aw74vvbhhqyy{+,H.HH,xx~333~]]:!LN 	2""1a1	2 ::y),-rzz9i:P/QqAjj"&&"&&)*GW((Aw74vvbhhqyy{+,H.HH,xx~333~]]:!FH 	2""1a1	2 ::yk"BJJ	{$;qAQ((A.4vvbhhqyy{+,H.HH,xx~333~]]:!KM 	)""1a(	) ::y),-rzz9i:P/QqAjj"&&!%GQ ..q!WQUV4vvbhhtn%I'II%]]:!CE 	K""1aTJ	K ::yk"BJJ	{$;qAQ ..q!M4vvbhhtn%I'II%]]:@B 	N ..q!M	N
 ::	{m$bjj9+&?qA	zH
J %q!$% %]% %% %% %
. .. .	2 	2	2 	2	) 	)	K 	K	N 	N% %s   =[<=[A[A[)7A[6\!\5\	\*<\7"][[[&)[36\ \\\'*\47] ]c                    t        j                  |       }|| j                  k(  rdnd}| j                  g dg dg      }| j                  g dg dg      }| j                  g dg dg dg      }t	        j
                  ||| j                  | j                  d	g      
      \  }}t        |j                         ||       t        |j                  |      ||       t        || j                  d      d   |       | j                  g dg dg      }d}t	        j
                  ||| j                  | j                  d	g      
      \  }}t        |j                         ||       t        |j                  |      d   |d   |       t        j                  ||||       sJ | j                  g dg dg      }	t        |j                  |      |	|       | j                  g dg dg      }| j                  g dg dg      }d}t	        j
                  ||| j                  | j                  d	g      
      \  }}t        |j                  |      d   |d   |       t        j                  ||||       sJ y )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RZZ'5TD


Iy)*A


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

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

I{+,A


L*-.A&M$$Q2::rvvqk3JKGAtAGGAJv&&	=;;t]"===r!   c           
      >   t        j                  |       }|| j                  k(  rt        j                  d       d}g }t        d      D ]9  }|j                  t        j                  |d|z         j                                ; t        |      D ]  }| j                  t        j                  d|d   |   d   z  d|d   |   d   z  g      |	      }| j                  t        j                  d
|d   |   d   z  d|d
   |   d   z  g      |	      }t        j                  ||ddg      \  }}t        j                  ||| j                  dg      \  }	}t        |j                         |	j                         d        t        |      D ]  }| j                  t        j                  d|d   |   d   z  d|d   |   d   z  d
|d   |   d   z  g      |	      }| j                  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        |j                         |	j                         d        y )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AD1X @HOOA262<<>?@ 1X BJJrxxT!WQZ]!2AQ
14E FGuJUJJrxxT!WQZ]!2AQ
14E FGuJU%%aT1I>1&&q!bffa[AAr||~DAB 1X 	BJJrxx471:a=!DGAJqM/1T!WQZPQ]? ST"  $JJrxx471:a=!DGAJqM/1T!WQZPQ]? ST"  $ %%aLA1&&q!bffa^DAr||~DA	Br!   c                 ~   d}| j                  g dg dg      }| j                  g dg dg      }| j                  g dg dg dg      }t        j                  ||| j                  dg      \  }}t	        |j                         ||	       t        j                  |d
   |d
         \  }}t	        |j                         ||	       t	        |j                  |d
         |d
   |	       | j                  g dg dg      }| j                  g dg dg dg      }t        j                  ||| j                  dg      \  }}t	        |j                         ||	       t        j                  |d
   |d
         \  }}t	        |j                         ||	       t	        |j                  |d
         |d
   |	       y )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    sx   D


K+,A


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


Iy)*A[&&( )J !!!Q<DAqAKKM:D9!!!F)QvY7DAqAKKM:D9AGGAfI&&	=r!   c           	         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 cg c]  }|d    |d   g c}      }t        ||      D ]  \  }}| j                  ||	      | j                  ||	      }}t        j                  ||| j                  dg
      \  }}t        |j                         | j                  | j                        d   |       t        |j                  |d         |d   |        t        j                  dd      }	t        j                  |	j!                         dz        }
g dg dg}g dg dg}g }|
D ]=  }|j#                  t        j                  |j                  |d         |d   g             ? t%        | j                  d            dk(  rd}|D ]  }| j                  |      | j                  |      }}t        j                  ||| j                  dg
      \  }}t        j                  ||ddg
      \  }}t        |j'                         |j'                         |        y c c}w )Nrn   r   r  r   r   r   r   r   r$   r;  r   ro   r   rZ   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_testro  
bs_to_testrp  r  r  RsdRsdRr  s                r   test_align_vectors_antiparallelr    s9    b!ERZZ'5TDK3%y1%y13 4J *=QQqTE1Q4==>JJ
+ B1zz!5z)2::au:+E1%%aRVVQK@1rzz"%%'8'<4H&	*AfIDA	B 
!	$B


r||~d2
3C	YA	YAJ <"((BHHQqTNAaD#9:;< bjjm$. Bzz!}bjjm1%%aRVVQK@1&&q!dAY?Ar||~DA	B5 >s   &Jc                    t        j                  |       }|| j                  k(  rdnd}t        j                  dd      j                         }t        j                  dd      j                         }t        ||      D ]  \  }}| j                  |d   |      }| j                  |d   |      }t        j                  ||      \  }	}
t        |	j                  |      ||       t        |
| j                  d	      d
   |        y )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RZZ'5TD__Sa(224F__Sa(224FFF+ >uJJuQxuJ-JJuQxuJ- ((A.4
AD1bjjob1=>r!   c                     t         j                  j                  d      } t        j                  |       }| j	                  d      }|j                  |      }t        j                  ||      \  }}t        j                  |j                         |j                               \  }}t        |j                         |j                                t        ||       y )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"8A">L-&&qxxz188:>ICL((*CKKM:D-(r!   c                    t        j                  |       }t        j                  j	                  d      }t        t        j                  |      |       }| j                  |j                  d      |      }| j                  |j                  |      | j                        }t        j                  ||      \  }}t        |j                         |j                                y )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/4A


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


1771:RZZ
0A##Aq)FCCKKM199;/r!   c                     | j                  g d      }t        t        j                  |            }t	        |       r
d}||k(  sJ y |j                  d      sJ y )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  sX    


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

                            [[ 0., -1.,  0.],
                             [ 1.,  0.,  0.],
                             [ 0.,  0.,  1.]]]))sreturnc                 p    dj                  t        t        j                  | 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    


NL12TYYq\AA""1%(F|4	> 	> 	> 8H#5555  !8999r!   c                 l   t         j                  j                  d      }t        j                  | j                  |j                  d                  }|j                         }g d}t        ||      }t        |j                  t        | j                  d                  sJ g d} ||      }|j                         }|d d df   dk  d d d f   }	| j                  |	| |      }|d d df   dk  d d d f   }	| j                  |	| |      }t        |d   |d          t        |d   |d	          t        |d
   |d          t        |d   |d          t        |d   |d          | j                  |d   |d   z        }
| j                  |d   |d	   z        }t        |
|       | j                  |d   |d   z        }| j                  |d   |d
   z        }t        ||       | j                  |d	   |d   z        }t        |d|
dz  z  dz
         t        t!        |      t!        |             y )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_slerpr-    s7   
))


"C!!"**S[[f[-E"FGH  "IIH-Ll(($rzz!}*=>>>=Eu%K&&(L B!#QW-D88D<->Laeq !T'*D	z95I L()F*;<L()F*;<L()F*;<L()F*;<L)9V+<= V,|F/CCDJV,|F/CCDJJ
+V,|F/CCDJV,|F/CCDJJ
+ V,|F/CCDJJZ] 3a 78 [!3u:.r!   c                     t        j                  t        d      5  | j                  g dg dg      }| j                  ddg      }t	        ||       d d d        y # 1 sw Y   y xY w)Nzmust be a `Rotation` instancer   r   r/   r   r   )r   r   r  r)   r   )r+   r"   r+  s      r   test_slerp_rot_is_rotationr/    sY    	y(G	H JJ	!# $JJ1va	  s   7AA%z*must be a sequence of at least 2 rotationsc                     t        j                  | j                  g dg            }t        j                  t
        t              5  t        dg|       d d d        y # 1 sw Y   y xY w)N)r   r   rR   r@   r   r   )r   r(   r)   r   r   r   SLERP_EXCEPTION_MESSAGEr   r{   s     r   test_slerp_single_rotr2    sM    2::~&678A	z)@	A qc1  s   AA'c                    t        j                         }t        j                  | j                  |j	                                     }t        j                  t        t              5  t        g |       d d d        y # 1 sw Y   y xY w)Nr   
r   r\   r(   r)   r*   r   r   r   r1  r   r{   s     r   test_slerp_rot_len0r5    sZ    A2::aiik23A	z)@	A b!  s   &A<<Bc                    t        j                  d      }t        j                  | j                  |j	                                     }t        j                  t        t              5  t        dg|       d d d        y # 1 sw Y   y xY w)Nr   r   r4  r{   s     r   test_slerp_rot_len1r7    s^    A2::aiik23A	z)@	A qc1  s   'A>>Bc                     t        j                  | j                  d            }t        j                  t
        d      5  t        ddg|       d d d        y # 1 sw Y   y xY w)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:    sM    2779-.A	z)M	N q!fa  s    AA!c                 L   t        j                  t        d      5  t        j                  j                  d      }t        j                  | j                  |j                  d                  }| j                  dgdgg      }t        ||       d d d        y # 1 sw Y   y xY w)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_mismatchr=    s    	zM
O ii##A&rzz#++6+*BCDJJ a  s   A5BB#c                 D   t        j                  t        d      5  t        j                  j                  d      }t        j                  | j                  |j                  d                  }| j                  d      }t        ||       d d d        y # 1 sw Y   y xY w)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_mismatchr@    sz    	z *@ 
A ii##A&rzz#++6+*BCDIIaLa  s   A1BBc                    t         j                  j                  d      }| j                  |j	                  d            }t        j                  |      }g d}t        |      r9t        ||      }| j                  | j                  |j                              sJ y t        j                  t        d      5  t        ||       d d d        y # 1 sw Y   y xY w)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_timesrE  	      
))


"C


3;;F;+,A1AAQ!QKvvbhhqww'(((]]:-HI 	!QK	 	 	   9CCc                    t         j                  j                  d      }| j                  |j	                  d            }t        j                  |      }g d}t        |      r9t        ||      }| j                  | j                  |j                              sJ y t        j                  t        d      5  t        ||       d d d        y # 1 sw Y   y xY w)Nr   r  rp   )r   r   rR   r   r@   rB  r   rC  rD  s         r   test_slerp_decreasing_timesrI  	  rF  rG  c                 ~   t         j                  j                  d      }t        j                  | j                  |j                  d                  }| j                  d      }t        ||      }t        j                  t        d      5  | j                  dgdgg      } ||       d d d        y # 1 sw Y   y xY w)	Nr   r  rp   rA   z&`times` must be at most 1-dimensional.r   g      @g@)r2   r\   r]   r   r(   r)   r  r?  r   r   r   r   )r+   r   r"   r+  r  interp_timess         r   !test_slerp_call_time_dim_mismatchrL   	  s    
))


"C2::ckkvk&>?@A
		!AaA	zE
G zzC5$'5#* +	,	  s   B33B<c                    t         j                  j                  d      }t        j                  | j                  |j                  d                  }| j                  d      dz   }t        ||      }| j                  g d      }| j                  g d      }t        |      r9 ||      j                         }| j                  || j                  |      k\  || j                  |      k        }| j                  | j                  || df               sJ | j                  | j                  ||df                sJ  ||      j                         }| j                  || j                  |      k\  || j                  |      k        }| j                  | j                  || df               sJ | j                  | j                  ||df                sJ y t!        j"                  t$        d	
      5   ||       d d d        t!        j"                  t$        d	
      5   ||       d d d        y # 1 sw Y   6xY w# 1 sw Y   y xY w)Nr   r  rp   rA   r   r  )r   r   rI   .ztimes must be within the ranger   )r2   r\   r]   r   r(   r)   r  r?  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_rangerT  .	  s   
))


"C2::ckkvk&>?@A
		!qAaA

9%II&JYiL  ">>)rvvay"8)rvvay:PQvvbhhq(C01222vvrxx(C- 011222jM!!#>>*q	"9:PQ;RSvvbhhq(C01222vvrxx(C- 011222]]:-MN 	iL	]]:-MN 	jM	 		 		 	s   :	H8&	I8IIc                    t        j                  |       }|| j                  k(  rdnd}t        j                  d| j                  dgdgg      d      }t        ddg|      } |d	      }t        j                  d| j                  d
      d      }||j                         z  }t        |j                         | j                  d      d   |       y )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_timerZ  G	  s     b!ERZZ'5TDCaS2$K!8$GAq!faAtWN&11#rzz"~tT488::EEOO%rzz#r':Fr!   c                    t        j                  | j                  g d            }t        j                  | j                  g d            }||z  }t        |j	                         | j                  g d             t        j                  t        d      5  |dz   d d d        |j                  d      t        u sJ y # 1 sw Y   #xY w)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_multiplicationr^  W	  s    			BJJ|4	5B			BJJ|4	5B	bBBJJL"**^"<= 
y(B	C 
Q ::a=N***	 s   C  C	c                    t         j                  j                  d      }t        j                  | j                  |j                  d                  }t        j                  | j                  |j                  d                  }||z  }|j                         j                  dk(  sJ t        j                  | j                  |j                  d                  }t        j                  | j                  |j                  d                  }||z  }|j                         j                  dk(  sJ t        j                  | j                  |j                  d                  }t        j                  | j                  |j                  d                  }||z  }|j                         j                  dk(  sJ t        j                  | j                  |j                  d	                  }t        j                  | j                  |j                  d
                  }||z  }|j                         j                  d
k(  sJ y )Nr   r  rp   r  )r   r   r@   )rR   r   r@   r@   )r   r@   r@   )rR   r   r@   r@   r"  r9  )	r2   r\   rs   r   r(   r)   rw   r*   rc   )r+   rf   r{  r|  r   s        r   test_multiplication_ndr`  f	  s    ))


"C			BJJszzyz'AB	CB			BJJszzyz'AB	CB	bB::<*** 
		BJJszzyz'AB	CB			BJJszzyz'AB	CB	bB::<*** 
		BJJszz|z'DE	FB			BJJszzyz'AB	CB	bB::<--- 
		BJJszzvz'>?	@B			BJJszzyz'AB	CB	bB::<***r!   c                 |   t         j                  j                  d      }t        j                  | j                  |j                  d                  }t        j                  | j                  |j                  d                  }t        j                  t        d      5  ||z   d d d        y # 1 sw Y   y xY w)Nr   r"  rp   )r   r@   r@   r  r   )
r2   r\   rs   r   r(   r)   rw   r   r   r   r  s       r   test_multiplication_errorsrb  	  s    
))


"C			BJJszzvz'>?	@B			BJJszzyz'AB	CB	z);	< 
R  s   #B22B;c                 $   t        t        j                  dd      |       }t        t        j                  dd      |       }| j                  t	        |            }|D ]/  }||z  |z  }t        t        |j                         d      |       1 y )N2   r   rm   r  r   r   )r,   r   r\   r#  rO  r   r   r*   )r+   qsrsr   r"   s        r   test_multiplication_stabilityrg  	  sw    	2B	7B	!4b	9Bwws2wH H!Vb[rzz|!<hGHr!   c                    t        j                  |       }|| j                  k(  rdnd}t        j                  j                  d      }|f|dz
  z  }|j                  |dz         }t        j                  | j                  |            }|j                         }dD ]  }	||	z  }
| j                  g d      }t        j                  | j                  ||d	z               }t        t        |	            D ]  }|	dkD  r||z  }||z  } |
|j                         z  j                         }| j                  ||k        sJ t        j                  | j                  ||d	z               }||	z  j!                         j"                  |dz   k(  rJ  d
D ]W  }	||	z  }
t        j$                  |	|j'                         z        }t)        |
j!                         |j!                         |       Y g d}	|	D ]  }||z  }|| j                  |g      z  }t)        |j!                         |j!                                || j                  |      z  }t)        |j!                         |j!                                 | j+                  |dz         }t        j,                  |      d   j/                  d      }t        j$                  |      }d}	||	z  }
t        j$                  |	|j'                         z        }t)        |
j!                         |j!                         |       || j                  |	g      z  }
t        j$                  |	|j'                         z        }t)        |
j!                         |j!                         |       || j                  |	      z  }
t        j$                  |	|j'                         z        }t)        |
j!                         |j!                         |       y )Nr  r   r   r   rL   rp   )r  r   rr   r   r   r   rA   r   rK   )      r          r   r   r  ro   )r  r   ri  rr   r   rj  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_powrp  	  sC    b!ERZZ'5TD
))


"C'TAX&K::;-:.D2::d+,AEEGE% <FZZ.
rwwz;3EFGs1v 	A1uEI		
 1557{%%'vvcDj!!! rwwz;3EFG1~~%%t);;;;<$ / =F  Q[[]!23		QYY[t<= 	AA 8Mrzz8*--		W__%67rzz(++		W__%678 XXkD()FVVF^F#''.FV$A	A	QAQ./AAIIK48 	
RZZ_AQ./AAIIK48	RZZ]AQ./AAIIK48r!   c                    t        t        j                  d      |       }t        j                  t
        d      5  t        |dd       d d d        t        j                  t        d      5  || j                  ddg      z   d d d        t        j                  t        d      5  || j                  dgdgg      z   d d d        y # 1 sw Y   xY w# 1 sw Y   RxY w# 1 sw Y   y xY w)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_errorsrt  	  s    x1-r2A	*2I	J Aq!	z)J	K  	RZZA 	z)J	K $	RZZ!qc
##$ $	    $ $s#   C	-C'C!	CC!C*c                  F   t        j                  d      } t        j                  dd      }t        j                  |       }t	        |j
                  d       t        j                  |      }t	        |j
                  d       t        |d   j                         |d   j                                t        |d   j                         |d   j                                t        j                  | g      }t	        |j
                  d       t	        |d   |        t        j                  |g      }t	        |j
                  d       t        |d	   j                         |d   j                                t        |d
   j                         |d   j                                t        j                  | |gt              }t	        |j
                  d       t	        |d   |        t	        |d   |       t        j                  |||g      }t	        |j
                  d       y )Nr   rm   r   r   r   r"  rK   r4  r   )r   r   r$   )rR   r   )	r   r\   r2   r3   r   rc   r   r^   object)singlemultipler3   s      r    test_rotation_within_numpy_arrayry  	  s   __#Fqa(HHHVEb!HHXEd#E!H&&((1+*?*?*ABE!H&&((1+*?*?*ABHHfXEd#q6"HHhZ Ef%E$K))+Xa[-B-B-DEE$K))+Xa[-B-B-DEHHfh'v6Ed#q6"q8$HHh(34Ef%r!   array_api_strictz"array API doesn't support picklingc                    t        j                  | j                  ddt        j                  t
        j                  dz        t        j                  t
        j                  dz        g            }t        j                  |      }t        j                  |      }t        |j                         |j                         d       y 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!TXXbeeAg->q@Q&RSTA
,,q/CS!IAKKM9#6#6#8uEr!   z"array API doesn't support deepcopyc                 b   t        j                  | j                  ddt        j                  t
        j                  dz        t        j                  t
        j                  dz        g            }t        j                  |      }t        |j                         |j                         d       y r|  )r   r(   r)   r   r}  r2   r  r,  r  deepcopyr   r^   )r+   r"   r{  s      r   test_deepcopyr  
  sn     	2::q!TXXbeeAg->q@Q&RSTA	q	BAKKM2<<>>r!   c                  :   t        j                  g d      } | j                  d      }| j                  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 y )Nr/   r   r\  C_CONTIGUOUSTc              3   &   K   | ]	  }|d k\    ywr   Nr   .0rh   s     r   	<genexpr>z+test_as_euler_contiguous.<locals>.<genexpr>
       *!qAv*   c              3   &   K   | ]	  }|d k\    yw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88N#t+++88N#t+++*rzz*****rzz****r!   c                 ~   t        t        j                  dd      |       }g d}dgt        t	        j
                  |            z   }t        ||      D cg c]  \  }}||||z     }}}t        j                  |      }t        |j                         |j                                t        j                  |      }t        |j                         |j                                ||usJ t        j                  j                  d      }| j                  |j                  d            }	t        j                  |	      }t        j                  |	d ddf         }
t        j                  |	dd df         }t        j                  |
|g      }t        |j                         |j                                y c c}}w )	NrY   r   rm   )r   r   rR   r   rR   rA   r   r@   rp   rR   .)r,   r   r\   listr2   cumsumr  concatenater
   r*   rs   r)   rw   r(   )r+   r  sizesstartsrh   r  splitr   rf   r   r{  r|  s               r   test_concatenater  
  so   hooba8"=HES4		%())F+.vu+=>41aXaA>E>!!%(FH$$&(89 !!(+FH$$&(89 6!!! ))


"C::cjjij01D!!$'H			D!SM	*B			DSM	*B!!2r(+FH$$&(89% ?s   F9c                    t        j                  t        d      5  t        | j	                  t        j
                         j                                     }t        j                  |dd g       d d d        y # 1 sw Y   y xY w)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"3"5"="="?@Ac1d^,- - -s   AA88Bc                 4   t        j                  | j                  d            }t        j                  | j                  d            }t        j                  t
        t        t        f      5  t        j                  ||g       d d d        y # 1 sw Y   y xY w)Nr  r   )	r   r(   r#  r   r   r   RuntimeErrorr  r  )r+   r{  r|  s      r   test_concatenate_wrong_shaper  =
  sm    			BGGI.	/B			BGGFO	,B	
L)<	= 'b"X&' ' 's   -BBc                    t        | j                  g dg            }t        | j                  g dg dg            }t        | j                  g d            }t        |      dk(  sJ t        |      dk(  sJ t        j                  t
        d      5  t        |       d d d        t        j                  | j                  d            }t        |      dk(  sJ |sJ |sJ |sJ y # 1 sw Y   JxY w)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
  s    !"**l^"<=bjj,)EFGNrzz,78O!"a'''~!###	y(G	H O  ))"'')*<= A%%% >? s   C**C3c                     | j                  g d      }t        j                  |ddd      j                         }| j                  g d      t	        j
                  d      z  }t        ||       y )Nr   rd  rW  Tr  rX  r   )r)   r   from_davenportr*   r   r   r   )r+   r   r   rF   s       r   #test_from_davenport_single_rotationr  [
  sX    ::i D""4b+/118 	JJ~.1=MD-(r!   c                    | j                  g d      }| j                  g d      }t        j                  || j                  z  dz        }t        j                  |d| j                  dz        }t        |j                  d      |j                  d             | j                  |d      }t        j                  || j                  z  dz        }t        j                  |d| j                  dz  g      }t        |j                  d      |j                  d             | j                  ||gd	      }t        j                  || j                  | j                  dz  g| j                  d
z  gg      z        }|d   |d   z  }| j                  ||gd	      }t        j                  |d| j                  d
z  | j                  dz  g      }t        |j                  d      |j                  d             | j                  ||gd	      }t        j                  || j                  | j                  d
z  g| j                  dz  gg      z        }| j                  |d      }t        j                  |d| j                  d
z  g| j                  dz  gg      }t        |j                  d      |j                  d             y )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
  sO   	K	 B	K	 B 

rBEEz!|
,C%%b#ruuQw7GCKK$K/41PQ ::b&!D


rBEEz!|
,C%%dC"%%';GCKK$K/41PQ 88RH18%D


tbjj2557)beeAgY1G&HH
IC
a&3q6/CxxRqx)H%%hbeeAgruuQw5GHGCKK$K/41PQ 88RH18%D


tbjj2557)beeAgY1G&HH
ICzz"f%H%%hruuQwi"%%'5KLGCKK$K/41PQr!   c                 l   t         j                  j                  d      }|f|dz
  z  }t        j                  | j                  |j                  d                  }|j                         }| j                  |j                  |dz               }t        j                  |d   d|      }|j                         j                  |dz   k(  sJ | j                  |j                  |dz               }t        j                  |d   d|      }|j                         j                  |dz   k(  sJ | j                  |j                  |d	z               }t        j                  |d d
df   d|      }|j                         j                  |dz   k(  sJ t        j                  | j                  |j                  |dz                     }|j                         }| j                  |j                  |dz               }t        j                  |d|      }|j                         j                  |dz   k(  sJ y )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ZZ

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

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

d(:
;<F

!
!$V
4C;;=+"4444r!   c                 x   t         j                  j                  d      }t        j                  | j                  |j                  d                  }|j                         }| j                  |j                  d            }t        j                  |d|      }|j                         j                  dk(  sJ y )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DEA;;=DZZ

	
23F

!
!$V
4C;;=,...r!   c                    g d}g d}g d}| j                  ||g      }t        |      rIt        j                  |dddg      j	                         }| j                  | j                  |            s?J t        j                  t        d      5  t        j                  |dddg       d d d        | j                  |||g      }t        |      rIt        j                  |dg d      j	                         }| j                  | j                  |            s?J t        j                  t        d      5  t        j                  |dg d       d d d        t        j                  t        d	      5  t        j                  | j                  |g      d
dg       d d d        t        j                  t        d      5  t        j                  | j                  |||g      dg d       d d d        t        j                  t        d      5  t        j                  | j                  |      dddg       d d d        t        j                  t        d      5  t        j                  | j                  |||g      dddg       d d d        y # 1 sw Y   xY w# 1 sw Y   NxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)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  
  sJ   	B	B
C::r3i DT##D#1v6>>@vvbhhqk"""]]:-AB 	7##D#1v6	7::r2sm$DT##D#y9AACvvbhhqk"""]]:-AB 	:##D#y9	:	z):	; >

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

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

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

BB< 8#1vFG G	7 	7	: 	:> >M M= =G GsH   J4J1)J'=,J4)K ,KJJ$'J14J= K	Kc                     t         j                  j                  d      } t        j                  g d      }t        j                  g d      }t        j                  g d      }t	        j                  |       }|j                  |||gd      }t	        j                  |||gd|j                               }|j                  |d      sJ t	        j                  d	|       }|j                  |||gd      }t	        j                  |||gd|j                               }t        j                  |j                  |d            sJ y )
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7FRc6==?CA""15"111 ,J$$b"b\37FRc6==?CA66*))!%)8999r!   c           
         t        j                  |       }t        j                  j	                  d      }d}t        j
                  |df      }|j                  t        j                   t        j                  |f      |d d df<   |j                  dt        j                  |f      }|j                  t        j                   t        j                  |f      |d d df<   |j                  dt        j                  d      }| j                  g d      }| j                  g d      }|D ]  }	| j                  t        j                  |	|z        j                  |            }
| j                  |||
gd	      }||	z
  |d d d
f<   dD ]s  }|dk(  r|n| j                  |d	      }t        j                  ||| j                  ||            }|j                  ||      }t!        || j                  ||             u  y )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XXq!fF;;BEE6QD;AF1a4LKKABEEK=M;;BEE6QD;AF1a4Lkkabee%k8G	K	 B	K	 B IZZ,,T"W5;;B?@((BB<a(0$t+q!t/ 	IE![0bgggAg6NB))"eRZZeZ5TUC))"e4JJ

6
(GH		I	Ir!   c                 L   t         j                  j                  d      }t        j                  | j                  |j                  d                  }|j                         }| j                  |j                  t         j                   t         j                  d            }t        j                  |      d   j                  |d   dz        }dD ]O  }|d	k(  r| j                  |d
      }t        j                  |||      }|j                  ||      }t!        ||       Q y )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DEA;;=DZZRUUNOFVVF^F#''v(:;F+ ,K774b7)D%%dE6:%%dE2

F+,r!   c           
         t        j                  |       }|| j                  k(  rdnd}t        j                  j                  d      }d}t        j                  |df      }|j                  t        j                   t        j                  |f      |d d df<   t        |      D cg c]#  }|j                  dt        j                  g      % }}|j                  t        j                   t        j                  |f      |d d df<   |j                  dt        j                  d      }	| j                  g d	      }
| j                  g d
      }|	D ]  }| j                  t        j                  ||z        j                  |
            }| j                  |
||gd      }||z
  |d d df<   dD ]  }|dk(  r|n| j!                  |d      }t        j"                  ||| j                  ||            }t%        | |       5  |j'                  |||      }d d d        |j)                         }t        j"                  ||      }|j)                         }t+        |||         y c c}w # 1 sw Y   YxY w)Nrn   r   r   rA   rR   ri  r   )rA   r  r  r   r   r  re  r$   )r  ro   )r&   r'   r   r2   r\   r]   r  r  r  rb   choicer)   r   r   rn  r   rn  r  r  r  r^   r   )r+   r  r%   rW   r   r  r_  rh   r  r  r  r  r  r  r  r  r  r   r  r  rot_estimatedr  s                         r   test_as_davenport_degenerater  
  s2    b!ERZZ'5TD ))


"C	AXXq!fF ;;BEE6QD;AF1a4L5:1X>SZZBEE
+>M>;;BEE6QD;AF1a4Lkkabee$k7G	K	 B	K	 B DZZ,,T"W5;;B?@((BB<a(0$t+q!t/ 	DE![0bgggAg6NB))"eRZZeZ5TUC',=(=rB  --&7 . 
 ==?L$33BzJM)335ML-dC	D	D ? s   '(I,I11I:c           
         t        j                  |       }t        j                  j	                  d      }d}t        j
                  |df      }|| j                  k(  rdnd}|j                  t        j                   t        j                  |f      |d d df<   |j                  dt        j                  |f      |d d df<   |j                  t        j                   t        j                  |f      |d d df<   | j                  ||	      }d
D ]  }t        d      D ]  }dj                  |d   |d   |d   g      }| j                  |D 	cg c]  }	t        |	       c}	|	      }
|dk(  r|j                         }t        j                  ||      }t        j                   |
||      }t#        |j%                  d      |j%                  d      |         t        j&                  |      d d df   j)                  t        j                  dz        }d
D ]  }t        d      D ]  }dj                  |      }| j                  |D 	cg c]  }	t        |	       c}	|	      }
|dk(  r|j                         }t        j                  ||      }t        j                   |
||      }t#        |j%                         |j%                         |         y c c}	w c c}	w )Nr   rZ   rR   rn   r  ri  r   r   r$   r  r   r  re  Tr   r[   )r&   r'   r2   r\   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  rh   r  euldavs                r   &test_compare_from_davenport_from_eulerr  1  st   b!E
))


"CAXXq!fF RZZ'5TD;;BEE6QD;AF1a4L;;1255t;<F1a4L;;BEE6QD;AF1a4LZZeZ,F+ 	'%e, 	'I''9Q<1y|DEC37aYq\7uEB#iik%%c62C))"eV<CCKK$K7t9T!%'	'	' VVF^AqD!**255195F+ E%e, 	EI'')$C37aYq\7uEB#iik%%c62C))"eV<CCKKM3;;=tD	EE 8 8s   KKc                    t         j                  j                  d      }d}t        j                  |df      }|j	                  t         j
                   t         j
                  |f      |d d df<   |j	                  dt         j
                  |f      |d d df<   |j	                  t         j
                   t         j
                  |f      |d d df<   dD ]  }t        d      D ]  }d	j                  |d   |d   |d   g      }|D cg c]  }t        |       }}|d
k(  r|j                         }t        j                  || j                  |            }	|	j                  |      }
|	j                  | j                  |      |      }t        |
|d         |d d dfxx   t         j
                  dz  z  cc<   dD ]  }t        d      D ]  }d	j                  |      }|D cg c]  }t        |       }}|d
k(  r|j                         }t        j                  || j                  |            }	|	j                  |      }
|	j                  | j                  |      |      }t        |
|d         y c c}w c c}w )Nr   rZ   rR   ri  r   r   r  r   r  re  rn   r[   )r2   r\   r]   r  r  r  r   r  r    r  r   r   r)   r  r  r   )r+   r   r  r_  r  r  r  rh   r  r   r  r  s               r   "test_compare_as_davenport_as_eulerr  V  s.   
))


"CAXXq!fF ;;BEE6QD;AF1a4L;;1255t;<F1a4L;;BEE6QD;AF1a4L+ 	2%e, 	2I''9Q<1y|DEC(+,1)A,,B,#iik%%c2::f+=>C,,s#C""2::b>59CC51	2	2 1a4LBEEAIL+ 	2%e, 	2I'')$C(+,1)A,,B,#iik%%c2::f+=>C,,s#C""2::b>59CC51	2	2 - -s   	I8%I=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                  | j                  d            }t        |      dk(  sJ t        j                  | j                  d            }t        |      dk(  sJ t        j                  d| j                  d            }t        |      dk(  sJ t        j                  | j                  d            }t        |      dk(  sJ t        j                  | j                  d      d| j                  d            }t        |      dk(  sJ t        j                  | j                  d            }	t        |	      dk(  sJ y )	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  so    	AAq6Q;;!$Eu:??OO"2&Eu:?? 01Fv;!##BHHY$78Hx=A!!%&)9:Gw<1  &!12Eu:??##BFF1I{BHHV<LMEu:??bhhv./Eu:??r!   c                    t        j                  | j                  d            }|j                         j                  dk(  sJ |j                         j                  dk(  sJ |j                  d      j                  dk(  sJ |j                         j                  dk(  sJ |j                         j                  dk(  sJ |j                  | j                  d      d      j                  dk(  sJ y )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776AAAr!   c                    t        j                  | j                  d            }| j                  g d      }|j	                  |      }|j
                  dk(  sJ | j                  d      }|j	                  |      }|j
                  dk(  sJ | j                  d      }t        j                  t        d      5  |j	                  |       d d d        y # 1 sw Y   y xY w)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


9A
I??f$$$	&	BWWR[F<<6!!!	B	,
. 	  s   9CCc                 p   t        j                  | j                  d            }t        j                  | j                  g d            }||z  }t	        |      dk(  sJ ||z  }t	        |      dk(  sJ t        j                  | j                  d            }||z  }t	        |      dk(  sJ t        t        j                  d      |       }t        j                  t        d      5  ||z   d d d        t        j                  t        d      5  ||z   d d d        y # 1 sw Y   3xY w# 1 sw Y   y xY w)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),D5c                 Z   t        j                  | j                  d            }t        j                  ||g      }t	        |      dk(  sJ t        j                  | j                  g d            }|j                  ||g      }t	        |      dk(  sJ t        t        j                  d      |       }|j                  ||g      }t	        |      dk(  sJ t        t        j                  d      |       }|j                  ||g      }|j                  ||g      }t	        |      dk(  sJ y )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r7a<<			BJJ~6	7B	
Aw	Br7a<<	*B	/B	
Aw	Br7a<<	*B	/B	
2w	B	
2w	Br7a<<r!   c                     t        j                  | j                  d            }dD ]  }||z  }t        |      dk(  rJ  y )Nr  )ri  rr   r   r   r  r   )r   r(   r   rO  )r+   r"   pppow0s       r   test_zero_rotation_powerr    sC    288F+,A# "u4yA~~r!   c                     t        j                  | j                  d            }|j                         }t	        |      dk(  sJ y )Nr  r   )r   r(   r   r   rO  )r+   r"   r_invs      r   test_zero_rotation_inverser    s6    288F+,AEEGEu:??r!   c                     t        j                  | j                  d            }|j                         }|j                  dk(  sJ y )Nr  r   )r   r(   r   r  rc   )r+   r"   r  s      r   test_zero_rotation_magnituder    s8    288F+,AI??d"""r!   c                     t        j                  | j                  d            }t        j                  t
        d      5  |j                          d d d        y # 1 sw Y   y xY w)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     sH    288F+,A	z)V	W 	  s    AA#c                 "   t        j                  | j                  d            }t        j                  | j                  d            }|j                  |      j                  dk(  sJ t        j                  | j                  g d            }|j                  |      j                  dk(  sJ t        t        j                         |       }|j                  |      j                  dk(  sJ d}t        t        j                  d      |       }t        j                  t        |      5  |j                  |       d d d        t        j                  t        |      5  |j                  |       d d d        y # 1 sw Y   ?xY w# 1 sw Y   y xY w)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    s6   288F+,A			BHHV,	-B>>"##t+++			BJJ~6	7B>>"##t+++	)2	.B??1##t+++BJ	*B	/B	z	4 	r 
z	4 
   s   )E9F9FFz	jax.numpyz.JAX out-of-bounds indexing deviates from numpyz"zero-length arrays have nan-shapesc                    t        j                  | j                  d            }|| j                  g | j                           }t        |      dk(  sJ |d d }t        |      dk(  sJ t        j                  t              5  || j                  dg          d d d        t        j                  t              5  || j                  dg          d d d        t        j                  t              5  t        j                  | j                  g d            |d<   d d d        y # 1 sw Y   xY w# 1 sw Y   axY w# 1 sw Y   y xY w)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277j+,Eu:??eGw<1	z	" 	"**aS/ 
z	" 	"**dV
 
z	" <!!"**\":;!< <  < <s$   D$:D01*D<$D-0D9<Ec                    t        t        j                  d      |       }|| j                  g d         }t	        |      dk(  sJ || j                  g d         }t	        |      dk(  sJ || j                  g d         }t	        |      dk(  sJ t        j
                  | j                  d            }|| j                  g d         }t	        |      dk(  sJ |j                         j                  d	k(  sJ t        j                  t              5  || j                  d
d
g          d d d        y # 1 sw Y   y xY w)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r7a<<	
2::*+	,Br7a<<	
2::()	*Br7a<< 	2779-.A	
2::*+	,Br7a<<::<***	z	" $	"**dD\
"#$ $ $s   D44D=c                    t        t        j                  d      |       }t        |      D ][  \  }}t	        |t              sJ t        |j                         ||   j                                |t        |      kD  sRt        d       y )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  ?  sq    xq)2.AA, I3#x(((qt||~6s1v:GHH	Ir!   c                     t        t        dd|z         d |dz
         }| j                  |dz         }t        j                  |      }|j
                  |k(  sJ d|j
                   d|        y )Nr   r   rL   zGot z, expected )rN  rb   r#  r   r(   rc   )r+   rH   rc   r   r"   s        r   test_rotation_shaper  I  sl    %1t8$YdQh/0E7754< D4 A77e?tAGG9Kw??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__r-  r/  r1  r2  r5  r7  r:  r=  r@  rE  rI  rL  rT  rZ  r^  r`  rb  rg  __pow__rp  rt  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
  __iter__r  r  r   r!   r   <module>r,     s      & 3 = = 9 9 + + %    ) (   U# "("2"2H4F4FG
Dh D
$A0 q!-0S 0 .0 8%%&D 'D.:(5
F. 8&&'O (O@0
> 8<<!1!12= 3=> q!-! ! .!
" 8%%&q!-
3# 
3 . '
3 8%%&, ',6 8%%&, ',> 8''(q!-	H 	H . )	H 8''( ) 8''););<@ =@
 8''););<3 =3$ 8''););<P =P2 8''););<< =< 8''););<& =&"
: 8''(5 )5 8''(q!-@ @ . )@ 8''(V )V 8''(> )>. 8''););<
: =
: 8''(5 )5 8''(
" )
" 8''(1 )1
 8''(q!--C - . )- 8%%&l%M  OWO 'W" 8%%&q!-4S 4 . '4 8''););<* =* 8''););<	 =	 8$$%q!-AC A . &A
: 8$$%5 &5 8$$%	E &	E 8$$%q!-* * . &* 8??#E $E 8&&8 9 8??#q!-.# . . $. 8$$hoo6J 7J 8&&') () 8&&'5 (5 8&&'q!-)# ) . () 8&&(:(:;* <* 8&&' ( 8&&(:(:;	2 <	2 8&&(:(:; <8 8&&(:(:; <6 8&&(:(:; <6 8&&(:(:; <6:2 8&&(9(9:l5&9:m43 5 ; ;38 8&&(9(9:l5&9:m43 5 ; ;36 
 
 8&&(:(:H<M<MNl5&9:m4,m<< = 5 ; O<< 8&&(:(:H<M<MNl5&9:m4,m<< = 5 ; O<> 8&&(9(9:q!-
9 
9 . ;
9 8%%x||4 0 5 0F 8<<!3!34/ 5/@ 8%%x||43 53 8%%x||4$ 5$ 8<<!3!34
@ 5
@ 8<<!3!34
@ 5
@ & 8%%&q!--S - . '- 8%%&2 '2 8<<!3!3X5J5JK	I L	I 8'')>)>?2 @2 8<<!3!3X5J5JK I L IF 8(()	 *	 8''8J8JKq!-	@ 	@ . L	@ 8''8J8JKq!-S  . L0 8==("4"458 68* 8''%%'q!-I I .'I, 8==! "8 8??#( $( 8??# $ 8??HLL(2D2DE6 F6> 8''8A 9A: 8''8q!-: : . 9:0 8''8q!-: : . 9:D 8''8q!-9C 9 . 998 8>>"  # "/ 8>>"$ #$ 8''););X=Q=QRq!-Y3 Y . SY 8''(8 )8
 8'')=)=x?Q?QR	D S	D 8''(< )< 8''(5 )5 8''(3 )3 8''( ) 8''(! )!&&2 8))8+=+=>M ?M 8>>8#9#9:
M ;
M 8))8>>:M ;M 8))*
4 +
4 8))8+=+=>  ?  8>>8#7#79O9OP#9 Q#9L 8))*Q% +Q%h 8))8+=+=x~~N!> O!>H 8))8+=+=>B ?BB 8))8+=+=>> ?>0 8))8+=+=x~~''););X=O=OQ'BQ'BT 8))8>>:> ;>"	) 8>>8#9#9:0 ;0
::* 5>>5>>2,/ 3,/^ 5>>" # G  5>>" # 5>>" # 5>>" # 5>>" # 5>>" # 5>>" # 5>>"
 #
 5>>"
 #
 5>>5>>2
 3
 5>>5>>2 30 5>>5>>83F3F%%'G'G 8##$+ %+ 8##$+ %+8 8##$ % 8##$H %H 8<<!1!18<<ASAS''););=q!-89s 89 .=89v 8##$$ %$&> 8%%&0%I  KFK 'F 8%%&0%I  K?K '?+ 8''(: ):2 8''(- )- 8''(' )'  & 8**+) ,) 8'')@)@AR BR@ 8**+q!-5 5 . ,5< 8**+/ ,/ 8**+G ,G::$ 8**H,A,ABI CI0 8**H,A,AB, C, 8**H,A,A8CUCUV,m<"D = W"DJ 8&&(?(?@!E A!EH 8&&(9(98;P;PQ2 R2D 8'')<)<h>R>R**H,=,=??: 8%%x'8'8(:L:L??H$9$9;B;B 8>>" #" 8##$ %, 8''( )( 8##$ % 8<<  ! 8%%&# '# 8==! " 8(() *$ k%U  Wl3WX< YW<& 8''($ )$, 8$$%I &I q!-@# @ .@r!   