
    ?.i*                    (/   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#m$Z$ d dl%m&c m'Z( d dl)Z)d dl*Z*eegZ+ e#ej,        ej-                  Z.d Z/d	efd
Z0d Z1d Z2d Z3d Z4ej5        6                    d e7dd                    de8fd            Z9 e"ej:                  d             Z;d Z<d Z=d Z> e"ej?                  d             Z@d ZAd ZB e"ejC        ejD                  d             ZEej5        6                    d e7dd                    de8fd            ZFd ZG e"ej:                  ej5        6                    d e7dd                    de8fd                        ZH e"ej:                  d             ZI e"ej:                  d             ZJ e"ejK                  ej5        6                    d e7dd                    de8fd                         ZL e"ejK                  d!             ZM e"ejK        ej:                  d"             ZN e"ejK        ej:                  d#             ZO e"ejK        ej:                  d$             ZP e"ejK        ej:                  d%             ZQ e"ejK        ej:                  d&             ZRd' ZS e"ejK                  d(             ZT e"ejU                  ej5        6                    d e7dd                    de8fd)                        ZV e"ejU                  d*             ZW e"ejU                  d+             ZX e"ejU        ejY                  d,             ZZ e"ejU                  d-             Z[ e"ejU                  d.             Z\ e"ejU                  d/             Z] e"ejU                  ej5        6                    d e7dd                    de8fd0                        Z^ e"ejY                  ej5        _                    d1d23          d4                         Z` e"ejY                  ej5        6                    d e7dd5                    de8fd6                        Za e"ejK        ejY                  d7             Zb e"ejU        ejY                  d8             Zc e"ejd                  ej5        6                    d e7dd5                    de8fd9                        Zed: Zf e"ejd                  d;             Zg e"ejd                  d<             Zh e"ejd                  ej5        6                    d e7dd5                    de8fd=                        Zi e"ejj                  d>             Zk e"ej?        ejj                  d?             Zl e"ejj                  ej5        6                    d e7dd5                    de8fd@                        Zm e"ejd        ejj                  dA             Zn e"ej?                  dB             Zo e"ej?                  dC             Zp e"ej?                  ej5        6                    d e7dd5                    de8fdD                        Zq e"ej?        ej:                  dE             Zr e"ej?                  dF             Zs e"ej?        ej:                  dG             Zt e"ej?        ej:                  dH             Zu e"ej?        ej:                  dI             Zv e"ej?        ej:                  dJ             Zw e"ej?        ej:                  dK             ZxdL ZydM Zz e"ej?        ej{                  ej5        6                    dN edO                    ej5        6                    dPdQ          dR                                     Z| e"ej?        ej{                  ej5        6                    dN edO                    ej5        6                    dPdQ          dS                                     Z}edT             Z~ e"ej?        ej:        ej{                  ej5        6                    dN edO                    ej5        6                    dPdQ          ej5        6                    dUdQ          dV                                                 Z e"ej?        ej:        ej{                  ej5        6                    dN edO                    ej5        6                    dPdQ          ej5        6                    dUdQ          dW                                                 Z e"ej?        ej{                  ej5        6                    d e7dd5                    de8fdX                        Z e"ej:        ejC                  dY             Z e"ejC        ej:                  dZ             Z e"ej        ejC                  d[             Z e"ej        ejC                  d\             Z e"ejC        ej                  d]             Z e"ejC        ej                  d^             Zd_ Z e"ej                  ej5        6                    d e7dd5                    de8fd`                        Z e"ej                  da             Z e"ejC        ej        ej                  db             Z e"ejU        ej                  dc             Z e"ejC        ej        ej                  dd             Z e"ej                  de             Z e"ejU        ej        ej                  ej5        6                    d e7dd5                    de8fdf                        Z e"ejU        ej        ej                  ej5        6                    d e7ddg                    de8fdh                        Z e"ej        ej                  di             Z e"ejU        ej        ejC        ej                  ej5        6                    d e7dd5                    de8fdj                        Z e"ej                  dk             Z e"ej                  dl             Z e"ej                  dm             Z e"ej        ejC        ej                  dn             Z e"ejK        ej                  do             Z e"ejK        ej                  ej5        6                    d e7dd5                    de8fdp                        Z e"ejK        ej                  ej5        6                    d e7ddg                    de8fdq                        Z e"ejK        ej                  ej5        6                    d e7ddg                    de8fdr                        Z e"ej                  ds             Zdt Z e"ej                  du             Z e"ejK        ej:        ej                  ej5        6                    d e7dd5                    de8fdv                        Z e"ej                  dw             Z e"ejK        ej        ej:                  dx             Z e"ej                  dy             Z e"ej                  dz             Z e"ej                  d{             Z e"ej                  d|             Z e"ejK                  d}             Zd~ 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                  d             Z e"ej        ej:                  d             Z e"ej        ejU        ej                  d             Z e"ej                  d             Z e"ej        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        ej        ejU        ejY        ej:                  d             Z e"ej        ej                  d             Zd Z e"ej        ej                  d             Zd Zd Z e"ej        ej                  d             Z e"ej                  d             ZdZ e"ej                  d             Z e"ej                  d             Z e"ej                  d             Z e"ej                  d             Z e"ej                  d             Z e"ej                  d             Z e"ej                  d             Z e"ej                  d             Z e"ej        ej                  d             Z e"ej        ej                  d             Z e"ej        ej        ej?        ejC        ej                  d             Z e"ejD                  d             Z e"ejD                  d             Z e"ejD                  d             Z e"ejD                  d             Z e"ejC        ej        ejC        ej        ejU        ejY                  ej5        6                    d e7dd5                    de8fd                        Z e"ej                  d             Zd Z e"ej:                  ej5        _                    dd3          d                         Z e"ej:                  ej5        _                    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jU        ej                  d             Z e"ej                  ej5        6                    d e7dd5                    de8f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j:                  ej5        6                    dUdQ          d                         Z e"ej?        ej                  d             Z e"ej?        ej{        ej                  d             Z e"ejK        ej?        ejU        ej        ejd                  d             Z e"ej:        ej{        ejY        ejj        ej                  d             Z e"ej                  d             Z e"ejD                  d             Z e"ej                  d             Z e"ej                  d             Z e"ejC                  d             Z e"ej                  d             Z e"ej                  d             Z e"ej                  d             Zej5        _                    ddĬ3          ej5        _                    d1dŬ3          dƄ                         Z e"ej                  dǄ             Z e"ej                  dȄ             Zej5        6                    d e7ddg                    de8fdɄ            Zdʄ ZdS )    N)assert_equal)RotationSlerp)special_ortho_group)permutationsproduct)contextmanager)xp_assert_equalarray_namespaceis_numpyis_lazy_arrayxp_vector_normxp_assert_closeeager_warnsxp_default_dtypemake_xp_test_casemake_xp_pytest_marksxp_device_typec                 B    | dk    rg dS | dk    rg dS | dk    rg dS d S )Nx   r   r   yr   r   r   zr   r   r    axiss    s/home/louicyp/clawd-clean/.venv-aircash/lib/python3.11/site-packages/scipy/spatial/transform/tests/test_rotation.py	basis_vecr!   '   sB    s{{yy	yy	yy 
    rc                     t          j        |          }t          j        |                    |                                 |                    S )Ndtype)xpxdefault_dtyper   	from_quatasarrayas_quat)r#   xpr&   s      r    rotation_to_xpr-   0   s;    b!!EbjjEjBBCCCr"   c                  l    t          d           t          g d           t          g dgg           d S Nr   r   r   r   )r   r   r"   r    test_init_non_arrayr1   5   s?    \\\\|||nr"   c                  \   t          j        t          j        g d                    } | j        t
          u sJ t          j        t          j        g dg                    } | j        t
          u sJ t          j        t          j        g dgg                    } | j        t          u sJ d S r/   )r   r)   nparray_backendcython_backend
xp_backendr#   s    r    test_cython_backend_selectionr9   ;   s    28LLL1122A:''''28\\\N3344A:''''28lll^$45566A:######r"   c                  n    t          j        t          j        g dt          j                             d S )Nr   r   r   r   r%   )r   r)   r3   r4   float32r   r"   r    test_numpy_float32_inputsr=   D   s.    rxBJ???@@@@@r"   c                     |                      g dg dg          }t          j        |          }||                      dgdgg          z  }t          |                                |           d S )N      @   r   r   )      r   r         @g      *@r*   r   r)   r   r+   r,   r   r#   expected_quats       r    test_generic_quat_matrixrH   H   sl    


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

SED6?333MAIIKK/////r"   ndimr      c                     |                      g d          }|                     |d|dz
  z  dz             }t          j        |          }|dz  }t	          |                                |           d S )Nr?   r   r   rA   rB   )r*   reshaper   r)   r   r+   )r,   rI   r   r#   rG   s        r    test_from_single_nd_quaternionrO   O   so    


>>>""A


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

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

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

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


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


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


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


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


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


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

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


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

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


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

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


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


LLLLMM 	 	A
 Q "vvbhhx1!44<<>>vFGGHHHHHHH]:&& 	" 	"q!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s   B??CCc                 \   |                      g d          }|                     |d|dz
  z  dz             }t          j        |                                          }|                      g dg dg dg          }|                     |d|dz
  z  dz             }t          ||d	
           d S )Nr   r   r   r   rL   r   rM   r   rs   r   r   r   rS   rS   rU   rp   )r*   rN   r   r)   r_   r   )r,   rI   r   matexpected_mats        r    #test_as_matrix_single_nd_quaternionr     s     ::lll##D::dDD1H-455D

T
"
"
,
,
.
.C::				
  L
 ::lDD1H,=,FGGLCE222222r"   c                 :   |                      g dg dg dg dg          }t          j        |                                          }t	          |j        d           |                      g dg dg dg          }t          |d	         |d
           |                      g dg dg dg          }t          |d         |d
           t          |d         |                     d                     t          |d         |                     d                     d S )Nr   r   r   r   r   r0   r   )rA   rS   rS   r   r   r   r   .rU   rp   r   r   r   r   rs   r   r   r   r   .rS   rS   .)r*   r   r)   r_   r   rd   r   r`   )r,   quatsr   	expected0	expected1s        r     test_as_matrix_from_square_inputr      s8   JJLLLLLLMM	  E 
U
#
#
-
-
/
/CI&&&

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

		


  I
 CK7777CK+++CK+++++r"   c                    |                      g dg dg dg          }t          j        |                                          }t	          |j        d           |                      g dg dg dg          }t          |d         |d	
           |                      g dg dg dg          }t          |d         |d	
           |                      g dg dg dg          dz  }t          |d         |           d S )Nr   r   r   r   rS   rA   )rS   rS   rS   r   r   r   r   rU   rp   r   r   r   r   )皙?g@)gffffff@r   r   )rs   r   r   rS   r   )r*   r   r)   r_   r   rd   r   )r,   r   r   r   r   	expected2s         r    !test_as_matrix_from_generic_inputr   <  sB   JJLLLLLL  E
 
U
#
#
-
-
/
/CI&&&

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

		

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



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

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

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


  F
 H(00::<<fEEEH(>>>HHQUHVV    r"   c                    |                      g d          }|                     |d|dz
  z  dz             }|                      g d          }|                     |d|dz
  z  dz             }t          j        |          }t	          |                                |d           t          |j        t          t          |          
                    d	                              sJ d S )
N)r   r   r   rL   r   r   )r   r   r   r   rM   ro   rp   r   )r*   rN   r   from_mrpr   r+   
isinstance_quattyper   empty)r,   rI   mrprG   r   s        r    test_from_mrp_single_nd_inputrC  }  s     **[[[
!
!C
**S$$(+d2
3
3CJJ~~~..MJJ}ddQh.?$.FGGMs##FFNN$$m%@@@@flD)=)=)C)CA)F)F$G$GHHHHHHHr"   c                     t           j                            d          } t          j        |           }t          j        |                                                                          }|                    |d          sJ t          j        d|           }t          j        |                                                                          }t          j        |                    |d                    sJ d S r   )	r3   r]   rt   r   r=  as_mrpru   rv   rw   r   s      r    test_from_mrp_array_likerF    s    
)


$
$CS)))J*++--446677A""15"11111 ,,,J*++--446677A6*))!%)889999999r"   c                     |                      g d          }t          j        |          }|                                j        t          |           k    sJ d S )Nr   )r*   r   r=  r+   r&   r   )r,   rB  r#   s      r    test_from_mrp_int_dtyperH    sR    
**YYY

C#A99;; 0 4 4444444r"   c                     |                      g dg dg dg          }|                      g dg dg dg          }t          t          j        |                                          |           d S )Nr  r  r  )r	  r   r   g)g}+;?g}+;g}+;?gߨӉؿr0   )r*   r   r   r=  r+   )r,   rB  rG   s      r    test_from_generic_mrprJ    s    
**				  C JJ:::   M H%c**2244mDDDDDr"   c                     d|dz
  z  dz   }t          j        t          d          5  t          j        |                     |                     d d d            d S # 1 swxY w Y   d S )NrL   r   r#  zExpected `mrp` to have shaper   )r   r   r   r   r=  r$  r%  s      r    test_malformed_nd_from_mrprL    s     D1H$E	z)G	H	H	H * *"''%..)))* * * * * * * * * * * * * * * * * *r'  c                 "   |                      g dg dg dg          }|t          |d          d d d f         z  }|                      g dg dg dg          }t          t          j        |                                          |           d S )	Nr*  r+  r0   r   r   )gQUU?gvWUU?QUUտ)uFx?guFxrO  r  )r*   r   r   r   r)   rE  )r,   r   expected_mrps      r    test_as_generic_mrprQ    s    ::  D 	N4a(((D11D::------		  L H&t,,3355|DDDDDr"   c           	      
   |                      t          j        | j        dz  dz             ddg          }t	          t          j        d|                      g d          d                                          |           d S )	Nr   rA   r   r   r   )i  r   r   Tr  )r*   r   tanr  r   r   r   rE  )r,   rP  s     r    test_past_180_degree_rotationrT    s     ::Q 7 77a@AALE2::kkk#:#:DIIIPPRR    r"   c                 ~   |                      g d          }|                     |d|dz
  z  dz             }|                      g d          }|                     |d|dz
  z  dz             }t          j        |                                          }t          |j        |j                   t          ||           d S )Nr2  rL   r   rM   )g?g?gO޿r   )r*   rN   r   r)   rE  r   rd   r   )r,   rI   r   rP  
actual_mrps        r    test_as_mrp_single_nd_inputrW    s     ::mmm$$D::dDD1H-455D::CCCDDL::lDD1H,=,DEEL#D))0022J!<#5666J-----r"   c                     |                      g dg dg dg dg          }|                      g dg dg dg dg          }t          t          j        |                                          |           d S )Nr  r:  )gzpy?r   r   )皙?r	  rY  )gK}\UUſgK}\UU?rN  )r*   r   r   r=  rE  )r,   rV  rP  s      r    test_mrp_calc_pipelinerZ    s    		

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

:::..q0AD0HIIFufd;;;CCEEDJJ~~~..1=MJJ}ddQh.?$.FGGMD-(((((r"   c                    t          j        d|                     d          d                                          }t          j        d|                     d          d                                          }t	          ||           d S )Nr   r\  Tr  Zr   r   r*   r_   r   )r,   	extrinsic	intrinsics      r    (test_single_intrinsic_extrinsic_rotationrk    sr    #CBFFFPPRRI#CBFFFPPRRIIy)))))r"   c                    t           j                            d          }|                     |                    ddd                    }|                     |d          }t          j        d|d	                                          }t          j        d
|d	                                          }t          ||           d S )Nr   r  rJ   rS   lowhighrr   rs   r   r   Tr  ZYX)
r3   r]   r^   r*   randintflipr   r   r+   r   )r,   r   abr   r   s         r    test_from_euler_rotation_orderrv    s     )


"
"C


3;;13V;<<==A
AE1d333;;==AE1d333;;==AAqr"   c                     d}t          j        d|                     ddg          d                                          }|                     g dg dg dg          }t	          |||	           d S )
Nro   zxr\  Tr  r   r   r   rs   r   rp   rh  )r,   rX   r   r   s       r    -test_from_euler_elementary_extrinsic_rotationrz    s    D

dBJJBx$8$8$
G
G
G
Q
Q
S
SC::

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


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

3+$	8 	8 	8 	8 	88 8r"   c           	         |                      d| j        dz  d          }|f|dz
  z  }|                     g dg dg dg          }|                     ddg          }|                     ||dz             }|                     ||dz             }|                     d	          d
         }|D ]}t	          j        ||dd dd d f         z            }|                    |          }	t	          j        ||z            }
|
                                }|j        d
k    sJ t          ||		                                z  
                                |d           d S )Nr   r   r[   r   )r   r   r   r   r3  rL   r   r   .weightsr   rp   )r+  r  r*   ra   r   r   r  rd   r   r   r  )r,   rI   r-  r  r,  r@  r   r/  rwmwr#   ms               r    test_weighted_meanrD  r  sf   
 [[BEAIs++F 'TAX&K::{{{IIIyyy9::Djj!Q  G774v-..Dggg{T122Gzz#r"H I I!!d3AAA:&6"677WWWW%% T**FFHHw"}}}}RVVXX0022H4HHHHHI Ir"   c                 Z   t          j        |                     d                    }t          |                                          rZ|                    |                     d                     }|                     |                     |j	                            sJ n]t          j        t          d          5  |                    |                     d                      d d d            n# 1 swxY w Y   t          j        |                     d                    }t          j        t          d          5  |                    |                     d                     d d d            n# 1 swxY w Y   t          j        |                     d                    }t          j        t          d          5  |                    |                     d	                     d d d            n# 1 swxY w Y   t          j        t          d
          5  |                    d           d d d            n# 1 swxY w Y   t          j        t          d
          5  |                    d           d d d            n# 1 swxY w Y   t          j        t          d          5  |                    d           d d d            n# 1 swxY w Y   t          j        t          d
          5  |                    d           d d d            d S # 1 swxY w Y   d S )NrA   r?  znon-negativer   r'  zExpected `weights` tor#  r
  r  zaxis .* is out of boundsrS   r   )rs   r   z+`axis` must be None, int, or tuple of ints.0i)r   r)   r`   r   r+   r  r$  rw   r   r?  r   r   r   )r,   r#   rC  s      r    test_mean_input_validationrG    sZ   266!99%%AQYY[[!! (FFBGGAJJ;F''vvbhhqw''((((((]:^<<< 	( 	(FFBGGAJJ;F'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	2776??++A	z)@	A	A	A & &	rwwt}}%%%& & & & & & & & & & & & & & &2779--..A	z)@	A	A	A ( (	rwwv'''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 
z)D	E	E	E  	A              	z)D	E	E	E  	G              	z)V	W	W	W  	C              	z)D	E	E	E  	C                 s~   >+C55C9<C9*E88E<?E<*G;;G?G?!III*JJJ3KKK<L  L$'L$c                     t          j        |                     g d                    }|                    d          }t	          |t                     sJ d S )Nr   r   r   r   Freturn_indices)r   r)   r*   reducer>  )r,   r#   r   s      r    test_reduction_no_indicesrM    sT    2::&:&:&:;;<<AXXUX++Ffh'''''''r"   c                     t          j        |                     g d                    }|                    d          }t	          |          t
          u sJ t          |          dk    sJ |\  }}}|J |J d S )NrI  TrJ  rS   )r   r)   r*   rL  r@  tuplelen)r,   r#   r   reduced	left_best
right_bests         r    test_reduction_none_indicesrT    s    2::&:&:&:;;<<AXXTX**F<<5    v;;!%+"GY
r"   c                    t          j        |           }|| j        k    rdnd}t          j                            d          }t          j        d|          }t          j        d|          }t          j        d|          }t          ||           }t          ||           }t          ||           }	|	                    ||d	          \  }
}}t          j	        t          |          t          |          t          |          f          }t          |          D ]g\  }}t          |          D ]R\  }}t          |          D ]=\  }}t          j        ||z  |z                                  d
                   ||||f<   >Sht          j        t          j        |dd          |j        d         df          }t          j        t          j        |t          |	          df          d          }|                     |t          |          z            }|                     |t          |          z            }|                     ||k              sJ |                     ||k              sJ ||         |	z  ||         z  }|
                                |z                                  }t-          || 	                    t          |	                    |           d S )Nro   r   r  rB   rn   rZ   r  TrJ  rS   r   r   rs   r   rp   )r'   r(   r   r3   r]   rt   r   r-   rL  r   rP  	enumerater   r+   rN   moveaxisrd   argmaxr*   rw   r   r  r   )r,   r&   rX   rg   l_npr_npp_nplr#   r  rQ  rR  rS  scalarsri   lir:  pjkrkmax_indleft_best_checkright_best_checkreduced_checkmags                            r    !test_reduction_scalar_calculationrg    s   b!!ERZ''55TD
)

 G
H
HC?1#&&&D?23'''D?1#&&&DtR  AtR  AtR  A%&XXa4X%H%H"GY
 hD		3t99c$ii899G4 G G2t__ 	G 	GEAr"4 G G2#%627R<*@*@*B*B1*E#F#F1a  G	G jWa33gmA6F5KLLGi
7SVVRL99BBBGjjCFF!233Ozz'CFF"23366)./////66* 0011111o&*Q/?-@@M;;===(
3
3
5
5CC#a&&))555555r"   c                 D   t          j        |           }|                     g dg dg dg          }t          j        |          }t          j        |                     |d                    }|                     g d|          }|                     |d          }|                     g d|          }|                     |d          }t          |                    |          |           t          |                    |          |           t          |                    |          |           t          |                    |          |           |                     g d	|          }	|                     |	d          }
t          |                    |d
          |	           t          |                    |d
          |
           t          |                    |d
          |
           t          |                    |d
          |
           d S )Nr   rs   r   r   r   r   r   )r   r   rS   r%   g       r   rS   g       @rs   rS   Tinverse)r'   r(   r*   r   r   expand_dimsr   apply)r,   r&   r   r_1dr_2dv_1dv_2dv1d_rotatedv2d_rotatedv1d_inversev2d_inverses              r    'test_apply_single_rotation_single_pointrx    s   b!!E
**

				  C
 $$Ds ; ;<<D::kkk://D>>$Q>''D**\\\*77K..1.55KDJJt$$k222DJJt$$k222DJJt$$k222DJJt$$k222**\\\*77K..1.55KDJJtTJ22K@@@DJJtTJ22K@@@DJJtTJ22K@@@DJJtTJ22K@@@@@r"   c                 d   t          j        |           }|                     g dg dg dg          }t          j        |          }t          j        |                     |d                    }t          j                            d          }|f|dz
  z  }|                     |	                    |dz             |	          }| 
                    |d
          |d         |d         gd          }	t          |                    |          |	           t          |                    |          |	           | 
                    |d
         |d          |d         gd          }
t          |                    |d          |
           t          |                    |d          |
           d S )Nri  r   r   r   r   r   r	  rq   r%   .r   .r   ).r   rs   Trl  )r'   r(   r*   r   r   rn  r3   r]   rt   rx   r   r   ro  )r,   rI   r&   r   r1r2rg   r  v	v_rotated	v_inverses              r    *test_apply_single_rotation_multiple_pointsr    s    b!!E
**

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


3::;#7:88
FFA1V9*ai6;"EEIBHHQKK+++BHHQKK+++!F)aiZ6;"EEIBHHQH--y999BHHQH--y99999r"   c                    t          j        |           }t          j        d          }t          j        g dg dg dg          |d<   t          j        g dg dg dg          |d<   |                     ||	          }|f|dz
  z  }|                     ||d
z             }t          j        |          }|                     g d          }| 	                    |d          }|                     g dg dg          }|                     ||dz             }t          |                    |          |           t          |                    |          |           |                     g dg dg          }	|                     |	|dz             }	t          |                    |d          |	           t          |                    |d          |	           d S )Nr   rS   rS   ri  r   r   r   ry  r   r   r%   r   r   r   r   r   rS   r   rj  )r   r3  r   r3  rk  )r   rS   r   Trl  )r'   r(   r3   rA  r4   r*   ra   r   r   rn  r   ro  )
r,   rI   r&   r   r  r#   v1v2r  r  s
             r    *test_apply_multiple_rotations_single_pointr    s    b!!E
(9

CX

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

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

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

LLL***566I	;#788IAGGBG--y999AGGBG--y99999r"   c                    t          j        |           }t          j        d          }t          j        g dg dg dg          |d<   t          j        g dg dg dg          |d<   |                     ||	          }|f|dz
  z  }|                     ||d
z             }t          j        |          }|                     g dg dg|	          }|                     g dg dg|	          }|                     ||dz             }t          |
                    |          |           |                     g dg dg|	          }|                     ||dz             }t          |
                    |d          |           d S )Nr  ri  r   r   r   ry  r   r   r%   r  r  rA   rB   rJ   rj  )rA   irB   r3  rk  )rA   rJ   Trl  )r'   r(   r3   rA  r4   r*   ra   r   r   r   ro  )	r,   rI   r&   r   r  r#   r~  r  r  s	            r    -test_apply_multiple_rotations_multiple_pointsr  7  s    b!!E
(9

CX

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

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


IIIyyy)
77A

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

LLL***5U
CCI	;#788IAGGAtG,,i88888r"   c                    t           j                            d          }g d}g d}t          ||          D ]\  }}|                     |                    |dz                       }|                     |                    |dz                       }t          j        |          }t          j        ||          dz   }	|	                    |          }
|
j
        |	k    sJ |	                    |d          }
|
j
        |	k    sJ d S )	Nr   )r   rL   r#  r8  )rB   r   r   )r   rL   r#  r8  )rA   r   )r   rA   r   )rB   rA   r   )rJ   rB   rA   r   r   rq   rM   Trl  )r3   r]   rt   r   r*   rx   r   r)   broadcast_shapesro  rd   )r,   rg   vector_shapes
rot_shapesq_shapev_shaper~  rh   r#   rd   r   s              r    test_apply_shapesr  U  s   
)


"
"C777MUUUJ#J>>    JJszzw~z6677JJszzw~z6677q!!#GW55<GGAJJw%GGAtG$$w%   r"   c                     t           j                            d          } t          j        |           }|                     ddd          }|                    |                                          }|                    |          }t          ||d           |                     ddd	          }|                    |                                          }|                    |          }t          ||d           d S )
Nrm   rn   ir[   r   rq   ro   rp   r	  )r3   r]   rt   r   r  ro  ru   r   )rg   r#   r/  r~  
v_expecteds        r    test_apply_array_liker  g  s    
)


$
$CC   AD#D))A	

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

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

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

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

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


IIIyyy)
77A


14
  A$Q**GAtAKKMM266!9948888D"**S//"-5tLLLLLLr"   c                 @   t          j        |           }|| j        k    rdnd}t          j                            d          }t          t          j        |          |           }|                     |	                    d          |          }|
                    |          }t          j        ||          \  }}t          |                                |                                           t          ||                     d          d	         d
|           d S )Nr   gMb`?l	   #t}":xL rn   rB   rS   rq   r%   r   r   Fr  )r'   r(   r   r3   r]   rt   r-   r   r*   rx   ro  r  r   r+   )	r,   r&   rX   rg   cru  rt  estr  s	            r    test_align_vectors_no_noiser  
  s    b!!EBJ&&44DD
)

 F
G
GCx3///44A


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

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


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


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


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


III{{{KKK899A,QdKKKOCtD-d3333D-d333333r"   c                    d}|                      t          j        |d                              g d                    }|                      t          j        |d                              g d                    }d}t          j        |||                     |          d          \  }}}t          j        ||||                     |          z  d          \  }}	}
t          |                                |                                           t          t          j	        |          |z  |	d	           t          ||
           d S )
NrZ   r   rn   r   r   r   Tr   rp   )
r*   r   r]   ro  r  r$  r   r_   r   r   )r,   r  rt  ru  scaleest1rssd1cov1est2rssd2cov2s              r    !test_align_vectors_scaled_weightsr  5  s!   
A


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


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


3::Iq>:??u
MM E ;;v&&L+L'?CE E ENCs #''))O..00LLORZZ__R%8yIIIILORZZ__R%8yIIIILORZZ__R%8yIIII 2::eCCIrzz#r2CCCCCIrzz#r2CCCCCIrzz#r2CCCC		'(:(::q@AASHJD*%888888r"   c                 N   t          j        t          d          5  |                     g d          |                     g d          }}t	          j        ||           d d d            n# 1 swxY w Y   t          j        t          d          5  |                     g d          |                     g d          }}t	          j        ||           d d d            n# 1 swxY w Y   t          j        t          d          5  |                     g dg dg          |                     g dg          }}t	          j        ||           d d d            n# 1 swxY w Y   t          j        t          d          5  |                     g dg          |                     g dg          }}|                     d	gg          }t	          j        |||           d d d            n# 1 swxY w Y   t          j        t          d
          5  |                     g dg dg          |                     g dg dg          }}|                     g d          }t	          j        |||           d d d            n# 1 swxY w Y   |                     g dg          |                     g dg          }}|                     dg          }t          |          r}t	          j        |||          \  }}|                     |                     |	                                                    s
J d            |                     |          s
J d            nIt          j        t          d          5  t	          j        |||           d d d            n# 1 swxY w Y   |                     g dg dg          |                     g dg dg          }}|                     | j
        | j
        g          }t          |          r}t	          j        |||          \  }}|                     |                     |	                                                    s
J d            |                     |          s
J d            nIt          j        t          d          5  t	          j        |||           d d d            n# 1 swxY w Y   |                     g dg          |                     g dg          }}t          |          r|t	          j        ||          \  }}|                     |                     |	                                                    s
J d            |                     |          s
J d            nHt          j        t          d          5  t	          j        ||           d d d            n# 1 swxY w Y   |                     g dg dg          |                     g dg dg          }}|                     | j
        d	g          }t          |          rOt	          j        |||d          \  }}}|                     |                     |                    s
J d            nKt          j        t          d          5  t	          j        |||d           d d d            n# 1 swxY w Y   |                     g dg          |                     g dg          }}t          |          rNt	          j        ||d          \  }}}|                     |                     |                    s
J d            nJt          j        t          d          5  t	          j        ||d           d d d            n# 1 swxY w Y   |                     g dgg          |                     g dgg          }}t          j        t          d          5  t	          j        ||           d d d            d S # 1 swxY w Y   d S )Nz Expected input `a` to have shaper   r   r  z Expected input `b` to have shapez/Expected inputs `a` and `b` to have same shapesr  z&Expected `weights` to be 1 dimensionalr   z+Expected `weights` to have number of valuesrs   zQuaternion should be nanzRSSD should be nanz)`weights` may not contain negative valuesz#Only one infinite weight is allowedr  z(Cannot align zero length primary vectorsTr  z Sensitivity matrix should be nanz Cannot return sensitivity matrixz)Expected inputs `a` and `b` to have shape)r   r   r   r*   r   r  r   rw   r   r+   inf)r,   rt  ru  r@  r#   r  r  s          r     test_align_vectors_invalid_inputr  k  s
   	z)K	L	L	L % %zz,,,''III)>)>1q!$$$% % % % % % % % % % % % % % % 
z)K	L	L	L % %zz)))$$bjj&>&>1q!$$$% % % % % % % % % % % % % % % 
z *? 
@ 
@ 
@ % %zz999iii0112::yyyk3J3J1q!$$$% % % % % % % % % % % % % % %
 
zE
G 
G 
G . .zz999+&&

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


IIIyyy)**A


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

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

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


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


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


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


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

AD1111bjjoob1=====> >r"   c                     t           j                            d          } t          j        |           }|                     d          }|                    |          }t          j        ||          \  }}t          j        |                                |                                          \  }}t          |	                                |	                                           t          ||           d S )Nrm   rn   r  rq   )
r3   r]   rt   r   rx   ro  r  ru   r   r+   )rg   r  ru  rt  est_expectedr  r  r  s           r    test_align_vectors_array_liker  ^  s    
)


$
$CC   A


A	

A"*"8A">">L-&qxxzz188::>>ICL((**CKKMM:::D-(((((r"   c                    t          j        |           }t          j                            d          }t          t          j        |          |           }|                     |                    d          |          }|                     |	                    |          | j
                  }t          j        ||          \  }}t          |                                |                                           d S )Nrm   rn   r  rq   r%   )r'   r(   r3   r]   rt   r-   r   r*   rx   ro  r<   r  r   r+   )r,   r&   rg   r  ru  rt  r  r  s           r    test_align_vectors_mixed_dtypesr  j  s    b!!E
)


$
$Cx3///44A


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


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


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

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


NNNLLL122TYq\\AA"1%%)F|| :4	> 	> 	> 	> 	> 	> x88H#5#5555555  !89999999r"   c                    t           j                            d          }t          j        |                     |                    d                              }|                                }g d}t          ||          }t          |j
        t          |                     d                              sJ g d} ||          }|                                }|d d df         dk     d d d f         }	|                     |	| |          }|d d df         dk     d d d f         }	|                     |	| |          }t          |d         |d                    t          |d         |d	                    t          |d
         |d                    t          |d         |d                    t          |d         |d                    |                     |d         |d         z            }
|                     |d         |d	         z            }t          |
|           |                     |d         |d         z            }|                     |d         |d
         z            }t          ||           |                     |d	         |d         z            }t          |d|
dz  z  dz
             t          t!          |          t!          |                     d S )Nr   r  rq   )r   r   r   rS   rA   )r   r   r  r   r  r   g      @rS   g      
@g@rA   rs   r   r   r   )rB   .r   )r  .)rZ   .)rA   .r   r   )r3   r]   r^   r   r)   r*   r  r+   r   r>  timesr@  wherer   r  r   rP  )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_slerpr2    s   
)


"
"C!"**S[[f[-E-E"F"FGGH  ""IIH--Ll($rzz!}}*=*=>>>>>===E,u%%K&&((L B!#QQQW-D88D<->>Laaaeq !!!T'*D	z955I L()F*;<<<L()F*;<<<L()F*;<<<L()F*;<<<L)9V+<=== V,|F/CCDDJV,|F/CCDDJJ
+++V,|F/CCDDJV,|F/CCDDJJ
+++ V,|F/CCDDJJZ] 3a 7888 [!!3u::.....r"   c                     t          j        t          d          5  |                     g dg dg          }|                     ddg          }t	          ||           d d d            d S # 1 swxY w Y   d S )Nzmust be a `Rotation` instancer   r   r0   r   r   )r   r   r  r*   r   )r,   r#   r/  s      r    test_slerp_rot_is_rotationr4    s    	y(G	H	H	H  JJ			!		# $ $JJ1va	                 s   AA,,A03A0z*must be a sequence of at least 2 rotationsc                     t          j        |                     g dg                    }t          j        t
          t                    5  t          dg|           d d d            d S # 1 swxY w Y   d S )N)r   r   rS   rA   r   r   )r   r)   r*   r   r   r   SLERP_EXCEPTION_MESSAGEr   r|   s     r    test_slerp_single_rotr7    s    2::~~~&67788A	z)@	A	A	A  qc1                 s   A**A.1A.c                 0   t          j                    }t          j        |                     |                                                    }t          j        t          t                    5  t          g |           d d d            d S # 1 swxY w Y   d S )Nr   
r   r]   r)   r*   r+   r   r   r   r6  r   r|   s     r    test_slerp_rot_len0r:    s    A2::aiikk2233A	z)@	A	A	A  b!                 s   -BBBc                 4   t          j        d          }t          j        |                     |                                                    }t          j        t          t                    5  t          dg|           d d d            d S # 1 swxY w Y   d S )Nr   r   r9  r|   s     r    test_slerp_rot_len1r<    s    A2::aiikk2233A	z)@	A	A	A  qc1                 s   .BBBc                     t          j        |                     d                    }t          j        t
          d          5  t          ddg|           d d d            d S # 1 swxY w Y   d S )Nr   r   rA   z"Rotations with more than 1 leadingr   r   r   )r   r)   r$  r   r   r   r   r|   s     r    test_slerp_tensor_rotr?    s    2779--..A	z)M	N	N	N  q!fa                 s   A##A'*A'c                 t   t          j        t          d          5  t          j                            d          }t          j        |                     |	                    d                              }|                     dgdgg          }t          ||           d d d            d S # 1 swxY w Y   d S )Nz.times to be specified in a 1 dimensional arrayr   r   r&  rq   r   r   )r   r   r   r3   r]   r^   r   r)   r*   r  r   r,   r   r#   r/  s       r    test_slerp_time_dim_mismatchrB    s    	zM
O 
O 
O  i##A&&rzz#++6+*B*BCCDDJJ  a                 s   BB--B14B1c                 l   t          j        t          d          5  t          j                            d          }t          j        |                     |	                    d                              }| 
                    d          }t          ||           d d d            d S # 1 swxY w Y   d S )Nz7number of rotations to be equal to number of timestampsr   r   r  rq   r  )r   r   r   r3   r]   r^   r   r)   r*   r  aranger   rA  s       r    !test_slerp_num_rotations_mismatchrE    s    	z *@ 
A 
A 
A  i##A&&rzz#++6+*B*BCCDDIIaLLa                 s   B B))B-0B-c                    t           j                            d          }|                     |                    d                    }t          j        |          }g d}t          |          rAt          ||          }| 	                    | 
                    |j                            sJ d S t          j        t          d          5  t          ||           d d d            d S # 1 swxY w Y   d S )Nr   r  rq   )r   r   r   r   rA   strictly increasing orderr   r3   r]   r^   r*   r  r   r)   r   r   rw   r   r$  r   r   r   r,   r   rh   r#   r/  r  s         r    test_slerp_equal_timesrJ  	     
)


"
"C


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

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

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

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

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

d(:
;;<<F

!$V
4
4C;;==+"4444444r"   c                    t           j                            d          }t          j        |                     |                    d                              }|                                }|                     |                    d                    }t          j        |d|          }|	                                j
        dk    sJ d S )Nr   rA   	   r   rA   rq   )r   rA   rS   r  )rA   r  rA   rA   r  )r,   rg   r#   r,  rd  r   s         r    test_from_davenport_broadcastr  
  s    
)


"
"C2::cjjlj&C&CDDEEA;;==DZZ

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

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

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

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

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

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


999A

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