
    
g	                        d dl Z d dlZd dlmZmZ d dlmZ d dlmZm	Z	 d dl
mZ d dlmZ d dlZd dlZd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d  Z)d! Z*d" Z+d# Z,d$ Z-d% Z.d& Z/d' Z0d( Z1d) Z2d* Z3d+ Z4d, Z5d- Z6d. Z7d/ Z8d0 Z9d1 Z:d2 Z;d3 Z<d4 Z=d5 Z>d6 Z?d7 Z@d8 ZAe j                  j                  d9 ed:            e j                  j                  d;d<      d=               ZDe j                  j                  d9 ed:            e j                  j                  d;d<      d>               ZEe j                  j                  e j                  j                  d9 ed:            e j                  j                  d;d<      d?                      ZGe j                  j                  e j                  j                  d9 ed:            e j                  j                  d;d<      d@                      ZHe j                  j                  e j                  j                  d9 ed:            e j                  j                  d;d<      dA                      ZIdB ZJdC ZKdD ZLdE ZMdF ZNdG ZOdH ZPdI ZQdJ ZRe j                  j                  dK        ZSdL ZTdM ZUdN ZVdO ZWdP ZXdQ ZYdR ZZdS Z[dT Z\dU Z]dV Z^dW Z_dX Z`dY ZadZ Zbd[ Zcd\ Zdd] Zed^ Zfd_ Zgd` Zhda Zidb Zjdc Zkdd Zlde Zmdf Zndg Zodh Zpdi Zqdj Zrdk Zsdl Ztdm Zudn Zvdo Zwdp Zxdq Zydr Zzds Z{dt Z|du Z}dv Z~dw Zdx Zdy Zdz Zd{ Zd| Zd} Zd~ Zd Zd Zd Zd Ze j                  j                  d        Zd Zd Zy)    N)assert_equalassert_array_almost_equal)assert_allclose)RotationSlerp)special_ortho_group)permutationsc                 :    | dk(  rg dS | dk(  rg dS | dk(  rg dS y )Nx   r   r   yr   r   r   zr   r   r    axiss    h/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/scipy/spatial/transform/tests/test_rotation.py	basis_vecr      s.    s{		 
    c                      t        j                  g dg dg      } t        j                  |       }| t        j                  dgdgg      z  }t	        |j                         |       y )N      r   r   )      r   r   r      nparrayr   	from_quatr   as_quatr   rexpected_quats      r   test_generic_quat_matrixr'      sP    
,./A1A1#t--Maiik=9r   c                      t        j                  g d      } t        j                  |       }| dz  }t	        |j                         |       y Nr   r   r   r$   s      r   test_from_single_1d_quaternionr*      s9    
A1AEMaiik=9r   c                      t        j                  g dg      } t        j                  |       }| dz  }t	        |j                         |       y r)   r   r$   s      r   test_from_single_2d_quaternionr,   #   s;    
, A1AEMaiik=9r   c                  ^   t         j                  j                  d      } t        j                  g dd      }t        |j                         t        j                  d      dd       t        j                  t        j                  g dd	      d      }t        |j                         t        j                  t        j                  d      d
      dd       | j                  dd      }|t         j                  j                  |d      d d d f   z  }|D ]I  }t        j                  |d      }t        t        j                  |j                         d      |d       K t        j                  |d      }t        t        j                  |j                         dd      |d       y )Nr   r   r   r   r   Tscalar_firstr   V瞯<缉ؗҜ<rtolatol
   r   )r7   r   r   d   r   r   r   r4   )r    randomRandomStater   r"   r   	as_matrixeyetilerandnlinalgnormrollr#   rngr%   qqis       r   test_from_quat_scalar_firstrG   *   s4   
))


"C<d;AAKKM266!95uE277<9MAAKKM277266!9j#AU, 			#qA	"1d7	++A Ar5		Q/%@A 	140ABGGAIIK3QUCr   c            	      J   t         j                  j                  d      } t        j                  dt        j
                  d            }t        |j                  d      g ddd	       t        j                  dt        j
                  d
            }t        |j                  d      t        j                  g dd      dd	       | j                  dd      }|t         j                  j                  |d      d d d f   z  }|D ]  }t        j                  |      }t        |j                  d      t        j                  |d      d       t        |j                  dd      t        j                  |j                  d      d      d        t        j                  |      }t        |j                  d      t        j                  |dd      d       t        |j                  dd      t        j                  |j                  d      dd      d       y )Nr   xyzr   Tr/   r.   r1   r2   r3   )r7   r   r6   r8   r   r   r   r9   )	canonicalr0   rJ   )r    r:   r;   r   
from_eulerzerosr   r#   r>   r?   r@   rA   r"   rB   rC   s       r   test_as_quat_scalar_firstrN   >   s   
))


"CE288A;/AAII4I0,U, 	E288G#45AAII4I0GGL'2UL 			#qA	"1d7	++A $r"		t	4bggb!n"	$ 			Dt	D		D	 91="	$$ 	1AAII4I0"''!QQ2G  AII4I@GGAIII5qqAOr   c            	          t        j                  g dg dg dg dg dg dg      } t        j                  |       }| t        j                  dgdgd	gd
gd	gd
gg      z  }t	        |j                         |       y )N)r   r   r   r   r   r   r   r   r   r   r   r   )rR   rR   r   r   r   r   rR   rR   rR   rR   rR   r   r   r      r   r$   s      r   test_from_square_quat_matrixrV   \   su    

 	A 	1A1#taS1#sQC!@AAMaiik=9r   c                  *   t        j                  g dg dg dg dg dg      } t        j                  |       }t        j                  |       t         j
                  j                  | d      d d d f   z  }t        |j                  d	      |       y )
N)rR   r   r   r   )r   rR   r   r   )r   r   rR   r   rS   rT   r   r   TrK   )	r    r!   r   r"   absr@   rA   r   r#   r$   s      r   *test_quat_double_to_canonical_single_coverrY   k   sw    

 	A 	1AFF1I		qq 9!T' BBMAIII-}=r   c                     t        j                  g d      } t        j                  |       }t	        | |j                  d             t        j                  g d      t        j                  d      z  } t        j                  |       }||z  |z  }t        |j                  d      t        j                  d      z  g d       t        |j                         j                  d      t        j                  d      z  g d       t        |j                  d      t        j                  d      z  g d       t        |j                         j                  d      t        j                  d      z  g d       t        ||j                         z  j                  d      g d	d
       t        ||j                         z  j                  d      g d	d
       t        ||z  j                  d      g dd
       t        |j                         |j                         z  j                  d      g dd
       y )NrS   FrK   )r   r   r   r   rU   )rR   r   r   r   )r   r   r   rR   )rR   r   r   rR   rQ   gؗҬ<r5   )	r    r!   r   r"   r   r#   sqrtr   inv)rE   r%   r3s      r   test_quat_double_coverr_   x   s    	A1AAIII./ 	rwwqz)A1A	
1QBAIII.rwwqz9 "AEEGOOeO4RWWQZ?!#BJJJ/
:!#BFFH$$u$5bggaj@"$ QquuwY''%'8 u.R[))E): u.QrTNNUN3!/QUUWRVVX%...?!/r   c                     t        j                  t        d      5  t        j                  t        j                  g d             d d d        t        j                  t        d      5  t        j                  t        j                  g dg dg             d d d        t        j                  t        d      5  t        j                  t        j                  g dgg dgg             d d d        t        j                  t        d      5  t        j                  t        j                  g       j                  d             d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   ~xY w# 1 sw Y   y xY w)	NzExpected `quat` to have shapematchr   rU   r   )r   rU   r   r   r   )r   r            r   rU   r   r   )r   r   rd   re   )r   r   )pytestraises
ValueErrorr   r"   r    r!   reshaper   r   r   test_from_quat_wrong_shaperl      s!   	z)H	I 0288I./0 
z)H	I 288%  	 
z)H	I 288NN%  	 
z)H	I 9288B<//789 9%0 0  9 9s/   +E*/E<1E*8E6EE'*E36E?c                      t        j                  g dg dg dg      } t        j                  t              5  t        j                  |        d d d        y # 1 sw Y   y xY w)Nr   )r   r   r   r   rP   )r    r!   rh   ri   rj   r   r"   )r   s    r   test_zero_norms_from_quatrn      sO    
 	A
 
z	" 1  s   AA c                      g d} t        j                  |       j                         }t        |t	        j
                  d             y )NrQ   r   )r   r"   r<   r   r    r=   )quatmats     r   #test_as_matrix_single_1d_quaternionrr      s2    D


T
"
,
,
.Cc266!9-r   c                      g dg} t        j                  |       j                         }t        |j                  d       t        j                  g dg dg dg      }t        |d   |       y )Nr   r   r   r   r   r   r   r   rR   r   r   r   r   r   r"   r<   r   shaper    r!   r   )rp   rq   expected_mats      r   #test_as_matrix_single_2d_quaternionrz      s\    >D


T
"
,
,
.CI&88
 L
 c!fl3r   c                     g dg dg dg dg} t        j                  |       j                         }t        |j                  d       t        j                  g dg dg dg      }t        |d	   |       t        j                  g dg d
g dg      }t        |d   |       t        |d   t        j                  d             t        |d   t        j                  d             y )Nrt   r   r   r   r   rQ   rS   )r   r   r   rv   r   r   r   r   rR   r   r   r   rU   r   )	r   r"   r<   r   rx   r    r!   r   r=   )quatsrq   	expected0	expected1s       r    test_as_matrix_from_square_inputr      s    	E 

U
#
-
-
/CI&
 I
 c!fi0
 I
 c!fi0c!fbffQi0c!fbffQi0r   c                     g dg dg dg} t        j                  |       j                         }t        |j                  d       t        j                  g dg dg dg      }t        |d   |       t        j                  g dg d	g d
g      }t        |d   |       t        j                  g dg dg dg      dz  }t        |d   |       y )Nrt   r|   rg   )r   r   r   rv   r   r   r   r   r}   r   )皙?g@)gffffff@r   r   )rR   rU   rU   r   rU   rw   )r~   rq   r   r   	expected2s        r   !test_as_matrix_from_generic_inputr      s    E
 

U
#
-
-
/CI&
 I
 c!fi0
 I
 c!fi0
  	I
 c!fi0r   c                  |    g dg dg dg} g d}t        t        j                  |       j                         |       y )Nr   r   r         ?r   r   r   )r   r   from_matrixr#   rq   r&   s     r   test_from_single_2d_matrixr     s;    C
 )M  %--/r   c                     t        j                  g dg dg dg      j                  d      } t        j                  g d      j                  d      }t        t	        j
                  |       j                         |       y )Nr   r   r   ru   r   r   r   )r    r!   rk   r   r   r   r#   r   s     r   test_from_single_3d_matrixr     sk    
((
  79	 
 HH12::6BM  %--/r   c                     t        j                  g d      t        j                  d      z  } t        j                  g dg dg dg      }t        t	        j
                  |      j                         |        t        t	        j
                  |j                  d            j                         | j                  d             y )N)r   r   rd   r   '   )3~˷g6iпnzo?)r   r   6i?)r   r   g3~˷?ru   r   )r    r!   r\   r   r   r   r#   rk   )r&   rq   s     r   test_from_matrix_calculationr      s    HH\*RWWR[8M
((/.- C
   %--/   Y!78@@B!!&)+r   c                      t        j                  ddd      } t        t        j                  |       j                         |        y )Nr   r7   r   )sizerandom_state)r   rvsr   r   r   r<   )rq   s    r    test_matrix_calculation_pipeliner   /  s4    

!
!!"1
=Ch2237AACSIr   c                  l   t         j                  j                  d      } | j                  d      }t	        j
                  |      j                         }t        j                  d||j                  d            }t        j                  d      }t        d      D ]  }d|d d ||f<    t        ||       y )Nr   )r8   r   r   ...ij,...jk->...ik)r   rU   r   r         ?)r    r:   r;   random_sampler   r   r<   einsum	transposerM   ranger   )rndrq   	ortho_matmult_resulteye3dis         r   test_from_matrix_ortho_outputr   4  s    
))


"C


K
(C$$S)335I))0)%//	:<K HH[!E1X aAg k51r   c                      g d} t        j                  g d      }t        j                  |       }t	        |j                         |       y Nr   )gJ?r   r   g<(?r    r!   r   from_rotvecr   r#   rotvecr&   results      r   test_from_1d_single_rotvecr   C  s7    FHH9:M!!&)Ffnn.>r   c                      g dg} t        j                  g dg      }t        j                  |       }t	        |j                         |       y r   r   r   s      r   test_from_2d_single_rotvecr   J  s<    [FHH:;<M!!&)Ffnn.>r   c                      g dg dg dg} t        j                  g dg dg dg      }t        t        j                  |       j                         |       y )Nr   rU   rU   r   rR   r   r   r   r   )g.pG?cU(G?r   gQH?)gNZ]O?gNZ]OݿgNZ]O?g0i?rQ   )r    r!   r   r   r   r#   )r   r&   s     r   test_from_generic_rotvecr   Q  sT    F
 HH45
 M
   (002r   c                     t        j                  dt        j                  d      z  dt        j                  d      z  dt        j                  d      z  gg dg dg      } t        j                  |       j                         }t        |d   d       t        |dd df   | d   d	z         t        |d
   d       t        |dd df   t        j                  g d             t        |d   t        j                  g d             y )NgMb@?r   gMb@)皙?g333333?r   r   )r   r   r   r   r   r   r   g@w?)g>}J?g.e?g>}J?rU   rQ   )r    r!   r\   r   r   r#   r   r   )r   rp   s     r   test_from_rotvec_small_angler   a  s    XX	
	EBGGAJ.rwwqz0AB
 F '//1DDJ"DBQBKS1DJ	*BQBKHH   a"((<01r   c                  l   dt        j                  d      z  dt        j                  d      z  dt        j                  d      z  g} t        j                  | d      }|j	                         }t        j
                  |       }t        j                  |      }|j	                         }t        ||       y )Nr   r   Tdegrees)r    cbrtr   r   r#   deg2radr   )rotvec1rot1quat1rotvec2rot2quat2s         r   test_degrees_from_rotvecr   z  s    RWWQZrwwqz!133CDG6DLLNEjj!G(DLLNEE5!r   c                      t        j                  t        d      5  t        j                  ddg       d d d        y # 1 sw Y   y xY w)N Expected `rot_vec` to have shapera   r   rU   rh   ri   rj   r   r   r   r   r   test_malformed_1d_from_rotvecr     s8    	z)K	L %aV$% % %	   =Ac                      t        j                  t        d      5  t        j                  g dg dg       d d d        y # 1 sw Y   y xY w)Nr   ra   rg   r   rd   re   rf   r   r   r   r   test_malformed_2d_from_rotvecr     s?    	z)K	L  	     AA
c            	         t        j                  g dg dg dg      } | t         j                  j                  | d      d d d f   z  } t	        j
                  |       j                         }t         j                  j                  |d      }t        | d d df   t        j                  |dz               t        t        j                  || d d d df         t        j                  d             y )	Nr   rU   rR   r   r   rR   r   ga2U0*3?rQ   r   r   r   rU   )r   r   )r    r!   r@   rA   r   r"   	as_rotvecr   coscrossrM   )rp   r   angles      r   test_as_generic_rotvecr     s    88 D
 	BIINN4aN(D11D%//1FIINN6N*EDAJuQw0BHHVT!RaR%[1288F3CDr   c                      t        j                  g d      } t        j                  g d      }t        j                  |       j	                         }t        |j                  d       t        ||       y )Nr   rU   rU   gj*0	x?g$x?g:2(r   r    r!   r   r"   r   r   rx   r   rp   expected_rotvecactual_rotvecs      r   test_as_rotvec_single_1d_inputr     sR    88M"DhhABO&&t,668M$$d+M?3r   c                      t        j                  g dg      } t        j                  g dg      }t        j                  |       j	                         }t        |j                  d       t        ||       y )Nr   r   r   r   r   s      r   test_as_rotvec_single_2d_inputr     sW    88]O$Dhh BCDO&&t,668M$$f-M?3r   c                     g dg dg dg} t        j                  |       }|j                  d      }t        j                  j                  |      }t        |d       t        |d   |d          t        |d   |d	          y )
Nr   r   r   Tr   g      ^@r   r   rU   )r   r   r   r    r@   rA   r   )rq   rotr   r   s       r   test_as_rotvec_degreesr     sn    i
+C


s
#C]]4](FIINN6"EE5!F1Ivay)F1Ivay)r   c                      t        j                  g dg dg dg      } t        t        j                  |       j                         |        t        t        j                  | d      j                  d      |        y )Nr   r   rR   rU   )ga2U0*3gǺ6?ga2U0*?Tr   )r    r!   r   r   r   r   )r   s    r   test_rotvec_calc_pipeliner     sg    XX
 F
 H((0::<fEH((>HHQUHVr   c                      g d} t        j                  g d      }t        j                  |       }t	        |j                         |       y N)r   r   r   )r   r   r   r   r    r!   r   from_mrpr   r#   mrpr&   r   s      r   test_from_1d_single_mrpr     s6    
CHH\*Ms#Ffnn.>r   c                      g dg} t        j                  g dg      }t        j                  |       }t	        |j                         |       y r   r   r   s      r   test_from_2d_single_mrpr     s:    -CHHl^,Ms#Ffnn.>r   c                      t        j                  g dg dg dg      } t        j                  g dg dg dg      }t        t        j                  |       j                         |       y )Nr   r   r   )r   r   r   g)g}+;?g}+;g}+;?gߨӉؿrQ   )r    r!   r   r   r   r#   )r   r&   s     r   test_from_generic_mrpr     s\    
(( C HH: M h//4<<>Nr   c                      t        j                  t        d      5  t        j                  ddg       d d d        y # 1 sw Y   y xY w)NExpected `mrp` to have shapera   r   rU   rh   ri   rj   r   r   r   r   r   test_malformed_1d_from_mrpr     s8    	z)G	H "1a&!" " "r   c                      t        j                  t        d      5  t        j                  g dg dg       d d d        y # 1 sw Y   y xY w)Nr   ra   rg   r   r   r   r   r   test_malformed_2d_from_mrpr     s?    	z)G	H  	  r   c                  ,   t        j                  g dg dg dg      } | t         j                  j                  | d      d d d f   z  } t        j                  g dg dg dg      }t	        t        j                  |       j                         |       y )	Nr   r   rQ   r   r   )gQUU?gvWUU?QUUտ)uFx?guFxr   r   )r    r!   r@   rA   r   r   r"   as_mrp)rp   expected_mrps     r   test_as_generic_mrpr    s    88 D 	BIINN4aN(D11D88-- L h006==?Nr   c                      t        j                  t        j                  t         j                  dz  dz         ddg      } t	        t        j                  dg dd      j                         |        y )	NrU   r           r   rI   )i  r   r   Tr   )r    r!   tanpir   r   rL   r   )r   s    r   test_past_180_degree_rotationr    sW     88bffRUU1WQY//a89LE;=DDFr   c                      t        j                  g d      } t        j                  g d      }t        j                  |       j	                         }t        |j                  d       t        ||       y )Nr   g?g?gO޿r   r    r!   r   r"   r   r   rx   r   rp   r   
actual_mrps      r   test_as_mrp_single_1d_inputr    sR    88M"D88ABL##D)002J!!4(J-r   c                      t        j                  g dg      } t        j                  g dg      }t        j                  |       j	                         }t        |j                  d       t        ||       y )Nr   r  r   r	  r
  s      r   test_as_mrp_single_2d_inputr    sW    88]O$D88BCDL##D)002J!!6*J-r   c                      t        j                  g dg dg dg dg      } t        j                  g dg dg dg dg      }t        t        j                  |       j                         |       y )Nr   r   )gzpy?r   r   )皙?r   r  )gK}\UUſgK}\UU?r   )r    r!   r   r   r   r   )r  r   s     r   test_mrp_calc_pipeliner    sb    	 J
 88.	 L
 H%%j188:LIr   c                      t        j                  ddd      j                         } t        j                  g d      t        j
                  d      z  }t        | |       y )Nr   Z   Tr   rt   rU   )r   rL   r#   r    r!   r\   r   )rp   r&   s     r   test_from_euler_single_rotationr  -  sD    sB5==?DHH\*RWWQZ7MD-(r   c                      t        j                  ddd      j                         } t        j                  ddd      j                         }t        | |       y )Nr   r  Tr   Z)r   rL   r<   r   	extrinsic	intrinsics     r   (test_single_intrinsic_extrinsic_rotationr  3  sF    ##CT:DDFI##CT:DDFIIy)r   c                  2   t         j                  j                  d      } | j                  ddd      }|d d d d df   }t	        j
                  d|d      j                         }t	        j
                  d	|d      j                         }t        ||       y )
Nr      )rd   r   lowhighr   rR   rI   Tr   ZYX)r    r:   r;   randintr   rL   r#   r   )r   abr   r   s        r   test_from_euler_rotation_orderr$  9  s    
))


"C&1A	!TrT'
AE1d3;;=AE1d3;;=AAqr   c                      t        j                  dddgd      j                         } t        j                  g dg dg dg      }t        | |       y )Nzxr  Tr   rv   r   r   rR   r   )r   rL   r<   r    r!   r   )rq   ry   s     r   -test_from_euler_elementary_extrinsic_rotationr(  C  sK    


dRHd
;
E
E
GC88 L
 c<0r   c            	      h   g dg dg dg} t        j                  d| d      j                         }t        |d   t	        j
                  g dg d	g d
g             t        |d   t	        j
                  g dg dg dg             t        |d   t	        j
                  g dg dg dg             y )N   <   -   r+  r,  r+  r-  r+  r,  ZXYTr   r   )g# ?      пgΙ6d?)g$+H?+Pz?Ppƿ)gPpֿ+Pz?gPp?r   )g+a?r1  (s=?)r5  r2  g&(ٿ)r1  r4  r2  rU   )ga}@?gF6g^@?)g0	8?gF6?g4?)      r   r2  r   rL   r<   r   r    r!   anglesrq   s     r   &test_from_euler_intrinsic_rotation_312r:  N  s    
F
 

eVT
:
D
D
FCc!fbhh***0 '  c!fbhh***0 '  c!fbhh*)*0 ' r   c            	      h   g dg dg dg} t        j                  d| d      j                         }t        |d   t	        j
                  g dg d	g d
g             t        |d   t	        j
                  g dg dg dg             t        |d   t	        j
                  g dg dg dg             y )Nr*  r.  r/  ZXZTr   r   )>d?g @r2  )l>?^|@r6  )X?r@  r   r   g      ?g ,r2  g ,?g      ?r6  r2        ?r   rU   )r3  g4&d'e?)cH?Xӿg'eֿ)r2        ?r4  r7  r8  s     r   &test_from_euler_intrinsic_rotation_313rI  i  s    
F
 

eVT
:
D
D
FCc!fbhh,,*0 '  c!fbhh+*'0 '  c!fbhh-.*0 ' r   c            	      h   g dg dg dg} t        j                  d| d      j                         }t        |d   t	        j
                  g dg d	g d
g             t        |d   t	        j
                  g dg d	g dg             t        |d   t	        j
                  g dg dg dg             y )Nr*  r.  r/  zxyTr   r   )4&d?gPp?rE  )rH  r2  g+Pz)rG  rF  rE  r   )g
?\2׳rH  )rM  g ,?r2  rU   )r>  r?  rD  )r@  r@        )g>dۿ @?r2  r7  r8  s     r   &test_from_euler_extrinsic_rotation_312rP    s    
F
 

eVT
:
D
D
FCc!fbhh++-0 '  c!fbhh+++0 '  c!fbhh,,,0 ' r   c            	      h   g dg dg dg} t        j                  d| d      j                         }t        |d   t	        j
                  g dg d	g d
g             t        |d   t	        j
                  g dg dg d
g             t        |d   t	        j
                  g dg dg dg             y )Nr*  r.  r/  zxzTr   r   )r=  gl>r@  )rO  r?  gXrC  r   rA  rB  rU   )r3  gcHr2  )rL  rG  r1  )rE  rE  r4  r7  r8  s     r   &test_from_euler_extrinsic_rotation_313rS    s    
F
 

eVT
:
D
D
FCc!fbhh-.)0 '  c!fbhh,+)0 '  c!fbhh,,+0 ' r   	seq_tuplerI   r  )FTc                    d }t         j                  j                  d      }d}t        j                  |df      }|j	                  t         j
                   t         j
                  |f      |d d df<   |j	                  t         j
                   dz  t         j
                  dz  |f      |d d df<   |j	                  t         j
                   t         j
                  |f      |d d df<   dj                  |       }|r|j                         }t        j                  ||      }|j                  |      }|j                  |      }	t        ||dd	
       t        ||	dd	
        |||z
  dd        ||	|z
  dd       y )Nc                    t        j                  | d      }t        j                  | d      }t        j                  ||      }t        j                  t        j
                  |      |k        sJ t        j                  ||k        sJ y Nr   r   r    meanstdhypotallrX   errormean_maxrms_maxrY  rZ  rmss         r   
test_statsz1test_as_euler_asymmetric_axes.<locals>.test_stats  g    wwu1%ffU#hhtS!vvbffTlX-...vvcGm$$$r   r     r   r  rU   r    -q=r5   r4   r1   +=r    r:   r;   emptyuniformr  joinupperr   rL   as_euler_as_euler_from_matrixr   
rT  r  rb  r   nr9  seqrotationangles_quat
angles_mats
             r   test_as_euler_asymmetric_axesrv    sB   % ))


"CAXXq!fF;;BEE6QD;AF1a4L;;BEE6A:BEEAIQD;IF1a4L;;BEE6QD;AF1a4L
'')
C iik""3/H##C(K//4JFKae<FJQU;{V#UE2zF"E51r   c                    d }t         j                  j                  d      }d}t        j                  |df      }|j	                  t         j
                   t         j
                  |f      |d d df<   |j	                  dt         j
                  |f      |d d df<   |j	                  t         j
                   t         j
                  |f      |d d df<   dj                  | d   | d   | d   g      }|r|j                         }t        j                  ||      }|j                  |      }|j                  |      }	t        ||dd	
       t        ||	dd
        |||z
  dd        ||	|z
  dd	       y )Nc                    t        j                  | d      }t        j                  | d      }t        j                  ||      }t        j                  t        j
                  |      |k        sJ t        j                  ||k        sJ y rW  rX  r]  s         r   rb  z0test_as_euler_symmetric_axes.<locals>.test_stats  rc  r   r   rd  r   r  r   rU   re  gvIh%<=rg  &.>r2   rh  r1   ri  rp  s
             r   test_as_euler_symmetric_axesrz    sG   % ))


"CAXXq!fF;;BEE6QD;AF1a4L;;1255t;<F1a4L;;BEE6QD;AF1a4L ''9Q<1y|<
=Ciik""3/H##C(K//4JFKae<FJQT:{V#UE2zF"E51r   c                    t        j                  g dg dg dg dg      }dj                  |       }|r|j                         }t	        j
                  ||d      }|j                         }t        j                  t        d	      5  |j                  |d      }d d d        t	        j
                  |d      j                         }t        ||       y # 1 sw Y   <xY w)
Nr-  r  #   r}     r}  r     r  r     re  Tr   Gimbal lockra   r    r!   rl  rm  r   rL   r<   rh   warnsUserWarningrn  r   rT  r  r9  rr  rs  mat_expectedangle_estimatesmat_estimateds           r   (test_as_euler_degenerate_asymmetric_axesr    s     XX	 F '')
C iik""3=H%%'L	k	7 ?"++C+>?''_dKUUWMlM:	? ?s   CC c                    t        j                  g dg dg dg dg      }dj                  | d   | d   | d   g      }|r|j                         }t	        j
                  ||d	      }|j                         }t        j                  t        d
      5  |j                  |d	      }d d d        t	        j
                  |d	      j                         }t        ||       y # 1 sw Y   <xY w)Nr  r   r,  r}  r   K   r,  r  r}  r  iLr  re  r   r   Tr   r  ra   r  r  s           r   'test_as_euler_degenerate_symmetric_axesr    s     XX	 F ''9Q<1y|<
=C iik""3=H%%'L	k	7 ?"++C+>?''_dKUUWMlM:	? ?s   C##C,c                    t        j                  g dg dg dg dg      }dj                  |       }|r|j                         }t	        j
                  ||d      }t        j                  t        d	      5  |j                  |d      }d d d        t        j                  t        d	      5  |j                  |d      }d d d        t        d d d
dgf   d d d
dgf   d
d       t        |d d df   |d d df   d
d       t        j                  g dg dg dg dg      }|d d df   d
k(  }dj                  | d
   | d   | d
   g      }|r|j                         }t	        j
                  ||d      }t        j                  t        d	      5  |j                  |d      }d d d        t        j                  t        d	      5  |j                  |d      }d d d        t        |d d d
dgf   |d d d
dgf   d
d       t        || df   || df   d
d       t        ||df   ||df   d       y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)Nr|  r~  r  r  re  Tr   r  ra   r   rU   rf  rg  r   Hz>r  r  r  r  ư>r[   )r    r!   rl  rm  r   rL   rh   r  r  ro  rn  r   )rT  r  r9  rr  r   estimates_matrixestimates_quatidxs           r   +test_as_euler_degenerate_compare_algorithmsr  1  s}    XX	 F '')
C iik


c64
8C	k	7 H44S$4GH	k	7 9c489QF#^A1vI%>QU $QT*N1a4,@qtT XX	 F A,!
C ''9Q<1y|<
=C iik


c64
8C	k	7 H44S$4GH	k	7 9c489QF#^A1vI%>QU #q!>3$'#: a .a"8tUH H9 98H H9 9s0   8I /III& I
II#&I/c                     t         j                  j                  d      } d}t        j                  ||       }|j	                         }|j                         }|j                         }t        j                  d||      }t        j                  d||      }t        j                  |ddf      }t        j                  d      |d d  t        ||       t        ||       y )Nr   r7   )numr   r   r   )
r    r:   r;   r   r]   r<   r   rj  r=   r   )	r   rq  prE   p_matq_matresult1result2r   s	            r   test_invr  u  s    
))


"C
AAC0A	AKKMEKKMEii,eU;Gii,eU;GHHaAYEvvayE!Hgu-gu-r   c                     t         j                  j                  d      } t        j                  |       }|j	                         }|j                         }|j                         }t        j                  ||      }t        j                  ||      }t        j                  d      }t        ||       t        ||       t        j                  d|       }|j	                         }	|j                         }
|	j                         }t        j                  d|
|      }t        j                  d||
      }t        j                  d      }t        j                  d      |d d  t        ||       t        ||       y )N	   #;h29s+,g0Hn rD   r   r   )r  rD   r   ru   )r    r:   default_rngr   r]   r<   dotr=   r   r   rj  )rD   r  rE   r  r  res1res2r=   r   r   x_matrixy_matrixr  r  r   s                  r   test_inv_single_rotationr    s   
))

 G
HCC A	AKKMEKKME66%D66%D
&&)CdC(dC(A3'A	A{{}H{{}Hii,hAGii,hAGHHYEvvayE!Hgu-gu-r   c                      d} t        t        j                  |       j                         d       t        t        j                  |       j	                         j                         d       y )Nr7   r   )r   r   identity	magnituder]   )rq  s    r   test_identity_magnituder    sL    
AH%%a(224a8H%%a(,,.88:A>r   c                      t        j                         j                         dk(  sJ t        j                         j                         j                         dk(  sJ y )Nr   )r   r  r  r]   r   r   r   test_single_identity_magnituder    sK    ((*a///""$..0A555r   c                  6   d} t        j                  | d      }|t        j                  |       z  }t        |j	                         |j	                                ||j                         z  }t        |j                         t        j                  |              y Nr7   r   r  	r   r:   r  r   r#   r]   r  r    rM   rq  r  r   s      r   test_identity_invariancer    sn    
Aq!A""1%%Faiik6>>+;<aeegFf..0"((1+>r   c                  4   d} t        j                  | d      }|t        j                         z  }t        |j	                         |j	                                ||j                         z  }t        |j                         t        j                  |              y r  r  r  s      r   test_single_identity_invariancer    sl    
Aq!A""$$Faiik6>>+;<aeegFf..0"((1+>r   c                     t        j                  t        j                  d            } | j	                         }t        |t        j                  t        j                  t        j                  dg       t        j                  t        j                  d             } | j	                         }t        |t        j                  t        j                  t        j                  dg       y )Nr   r   )r   r"   r    r=   r  r   r  )r%   r   s     r   test_magnituder    s    266!9%A[[]FfruubeeRUUA&>?BFF1I:&A[[]FfruubeeRUUA&>?r   c                      t        j                  t        j                  d            } | d   j	                         }t        |t        j                         | d   j	                         }t        |d       y )Nr   r   r   )r   r"   r    r=   r  r   r  )r%   r  r  s      r   test_magnitude_single_rotationr    sR    266!9%AdnnGGRUU#dnnGGQr   c                  L   t         j                  j                  d      } t        j                  d|       }t        j                  d|       }||j	                         z  }|j                         }t        j                  |      }t        |j                  ||      ||k         y )Nr  r7   r  )	r    r:   r  r   r]   r  medianr   approx_equal)rD   r  rE   r%   r_magr5   s         r   test_approx_equalr    sx    
))

 G
HC$A$A	AEEGAKKME99UD4(54<9r   c                     t        j                  g d      } t        j                  t        j                  d            }| j                  |d         sJ | j                  |d         rJ | j                  |d   d      rJ | j                  |d   dd	      rJ t        j                  t        d
      5  | j                  |d   d      sJ 	 d d d        y # 1 sw Y   y xY w)N)r   r   ry  r   r   r   绽|=r[   g:0yE>T)r5   r   zatol must be setra   r   )	r   r   r"   r    r=   r  rh   r  r  )r  rE   s     r   !test_approx_equal_single_rotationr    s     	\*A266!9%A>>!A$~~ad### ~~ad~///~~adt~<<<	k);	< 2~~adD~1112 2 2s   8CC$c                  b   t        j                  t        j                  d       t        j                  d      f      } t        j                  dt         j                  dz  d      }|D ]D  }t        j                  || z        }t        |j                         j                         dd       F y )Nr   r   rU   r8   r  r[   )
r    concatenater=   linspacer  r   r   r   rY  r  )axesthetastr%   s       r   	test_meanr    s    >>BFF1I:rvvay12D[[BEEAIs+F =  T***,ae<=r   c                     t        j                  g dg dg dg      } t        j                  dt         j                  dz  d      }|D ]  }t	        j
                  || d d z        }|j                  ddg      }t	        j
                  || z        }|j                         }t        ||j                         z  j                         dd	        y )
Nr   r   r   rU   r8   r   weightsr  r[   )
r    r!   r  r  r   r   rY  r   r]   r  )r  r  r  rwmwr%   ms          r   test_weighted_meanr    s    88Y	956D[[BEEAIs+F C!!!d2Ah,/WWaVW$  T*FFHRVVX002AEBCr   c                      t        j                  t        d      5  t        j                  t        j                  d            } | j                  t        j                  d              d d d        y # 1 sw Y   y xY w)Nznon-negativera   r   r  )	rh   ri   rj   r   r"   r    r=   rY  onesr%   s    r   test_mean_invalid_weightsr    sU    	z	8 $rvvay)	
{#$ $ $s   AA44A=c                  p    t        j                         j                  d      } t        | t               sJ y )NFreturn_indices)r   r  reduce
isinstance)r   s    r   test_reduction_no_indicesr    s.     ''u'=Ffh'''r   c                      t        j                         j                  d      } t        |       t        u sJ t        |       dk(  sJ | \  }}}|J |J y )NTr  r   )r   r  r  typetuplelen)r   reduced	left_best
right_bests       r   test_reduction_none_indicesr    sf     ''t'<F<5   v;!%+"GY
r   c                  R   t         j                  j                  d      } t        j                  d|       }t        j                  d|       }t        j                  d|       }|j	                  ||d      \  }}}t        j
                  t        |      t        |      t        |      f      }t        |      D ]]  \  }}	t        |      D ]J  \  }
}t        |      D ]7  \  }}t        j                  |	|z  |z  j                         d         |||
|f<   9 L _ t        j                  t        j                  |d	d
      |j                  d	   df      }t        j                  t        j                  |t        |      df      d	      }|t        |      z  }|t        |      z  }||k(  j                         sJ ||k(  j                         sJ ||   |z  ||   z  }|j                         |z  j!                         }t#        |t        j
                  t        |                   y )Nr  r   r  r7   re   Tr  r   r   r   rR   r   )r    r:   r  r   r  rM   r  	enumeraterX   r#   rk   moveaxisrx   argmaxr\  r]   r  r   )rD   lr%   r  r  r  r  scalarsr   lijpjkrkmax_indleft_best_checkright_best_checkreduced_checkmags                      r   !test_reduction_scalar_calculationr    s   
))

 G
HCs#A$As#A%&XXa4X%H"GY
 hhAAA/0G1 G2q\ 	GEAr"1 G2#%6627R<*@*@*B1*E#F1a G	GG jjWa3gmmA6F5KLGii

7SVRL9BGQ'OQ'(--///**//111o&*Q/?-@@M;;==(
3
3
5Cc288CF#34r   c                     t        j                  g dg dg dg      } t        j                  |       }t        j                  t        j                  | d            }t        j                  g d      }t        j                  |d      }t        j                  g d      }t        j                  |d      }t        |j                  |      |       t        |j                  |      |       t        |j                  |      |       t        |j                  |      |       t        j                  g d      }t        j                  |d      }t        |j                  |d	
      |       t        |j                  |d	
      |       t        |j                  |d	
      |       t        |j                  |d	
      |       y )Nrv   r   r   r   r   rc   r   r   r   rU   rR   r   Tinverser    r!   r   r   expand_dimsr   apply)	rq   r_1dr_2dv_1dv_2dv1d_rotatedv2d_rotatedv1d_inversev2d_inverses	            r   'test_apply_single_rotation_single_pointr  7  sM   
(( C
 $Ds ;<D88ID>>$Q'D((:&K..15KDJJt$k2DJJt$k2DJJt$k2DJJt$k2((:&K..15KDJJtTJ2K@DJJtTJ2K@DJJtTJ2K@DJJtTJ2K@r   c                  @   t        j                  g dg dg dg      } t        j                  |       }t        j                  t        j                  | d            }t        j                  g dg dg      }t        j                  g dg d	g      }t        |j                  |      |       t        |j                  |      |       t        j                  g d
g dg      }t        |j                  |d      |       t        |j                  |d      |       y )Nrv   r   r   r   r   rc   r   r   rd   r  )r   rd   r  )r   rd   Tr  r  )rq   r1r2v	v_rotated	v_inverses         r   *test_apply_single_rotation_multiple_pointsr  S  s    
(( C
 
		c	"B			bnnSq9	:B
)Y'(A*j12IBHHQK+BHHQK+*j12IBHHQH-y9BHHQH-y9r   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        j                  g d	      }t        j
                  |d
      }t        j                  g dg dg      }t        |j                  |      |       t        |j                  |      |       t        j                  g dg dg      }t        |j                  |d      |       t        |j                  |d      |       y )NrU   r   r   rv   r   r   r   r'  r   r   rc   r   r  )r   r   rU   r  )r   r   r   Tr  )r    rj  r!   r   r   r  r   r  )rq   r%   v1v2r  r  s         r   *test_apply_multiple_rotations_single_pointr  h  s    
((9
CXX CF
 XX CF
 	S!A	)	B		#B*j12IAGGBK+AGGBK+*j12IAGGBG-y9AGGBG-y9r   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        j                  g d	g d
g      }t        j                  g dg dg      }t        |j                  |      |       t        j                  g dg dg      }t        |j                  |d      |       y )Nr  rv   r   r   r   r'  r   r   rc   r
  r  )r   ir   r  )r   rd   r  Tr  )r    rj  r!   r   r   r   r  )rq   r%   r  r  r  s        r   -test_apply_multiple_rotations_multiple_pointsr    s    
((9
CXX CF
 XX CF
 	S!A
)Y'(A*j12IAGGAJ	**j12IAGGAtG,i8r   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        |d   j                         | d   d	
       t        |d   j                         | d   d	
       t        |d d j                         t        j                  | d   d      d	
       y )Nr  rv   r   r   r   r'  r   r   r1   r[   rR   r   )r    rj  r!   r   r   r   r<   r  rq   r%   s     r   test_getitemr    s    
((9
CXX CF
 XX CF
 	S!AAaDNN$c!f59AaDNN$c!f59AcrF$$&s1vA(FUSr   c                      t        j                  t        d      5  t        j                         d    d d d        y # 1 sw Y   y xY wNznot subscriptablera   r   )rh   ri   	TypeErrorr   r  r   r   r   test_getitem_singler     s7    	y(;	< A  r   c                      t        j                         } t        j                  t        d      5  t        j                         | d<   d d d        y # 1 sw Y   y xY wr  )r   r  rh   ri   r  r  s    r   test_setitem_singler"    sF    A	y(;	< #  "!# # #s   AAc                      t         j                  j                  d      } t        j                  d|       }t        j                  d|       }||dd t	        |dd j                         |j                                y )Nr  r7   r  r   r   rd   r    r:   r  r   r   r#   rD   r  r  s      r   test_setitem_slicer&    s_    
))

 G
HC		%B		$BBqGAa"BJJL1r   c                      t         j                  j                  d      } t        j                  d|       }t        j                  |       }||d<   t	        |d   j                         |j                                y )Nr  r7   r  r   r$  r%  s      r   test_setitem_integerr(    sX    
))

 G
HC		%B	S	!BBqEA"**,/r   c                      t        j                  dd      } t        j                  t        d      5  d| d<   d d d        y # 1 sw Y   y xY w)Nr7   r   r  zRotation objectra   r   )r   r:   rh   ri   r  r  s    r   test_setitem_wrong_typer*    s?    "A	y(9	: !  s   AAc                  6   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       y )Nr  rv   r   r   r   r'  r   r   rU   rR   )r    rj  r!   r   r   r   r  r  s     r   test_n_rotationsr,    s    
((9
CXX CF
 XX CF
 	S!AQQsVa r   c                     t         j                  j                  d      } t        t	        j                  |       j                         j                  d       t        t	        j                  d |       j                         j                  d       t        t	        j                  d|       j                         j                  d       t        t	        j                  d|       j                         j                  d       y )Nr  r  r   r   r   r   r   r   )r    r:   r  r   r   r#   rx   r  s    r   test_random_rotation_shaper0    s    
))

 G
HCS)113994@3/779??F,446<<fE,446<<fEr   c                     t        j                  g dg dg      } | j                         }t        j                  | |      \  }}t        |j                         t        j                  d             t        |dd       y )Nrc   r
  r   r   r  r[   )	r    r!   copyr   align_vectorsr   r<   r=   r   )r   r   r%   rssds       r   test_align_vectors_no_rotationr5    sZ    
)Y'(A	A$$Q*GAtakkmRVVAY7D!$'r   c                  R   t         j                  j                  d      } t        j                  |       }| j	                  d      }|j                  |      }t        j                  ||      \  }}t        |j                         |j                                t        |dd       y )Nl	   #t}":xL r  )r   r   r   r   r  r[   )	r    r:   r  r   normalr  r3  r   r#   )rD   cr#  r"  estr4  s         r   test_align_vectors_no_noiser;    sz    
))

 F
GCC A


A	
A&&q!,ICAIIK/D!$'r   c                      t        j                  g dg dg      } t        j                  g dg dg      }t        j                  | |      \  }}t	        | |j                  |      d       t	        |dd       y )	N)gq?gH*fܿgHlB?)gMs^E?g+Obp޿gn^w)g=2)p?g[[VKg?gw7?)gѿgGvgpr  r[   r   r  )r    r!   r   r3  r   r  )r   r   r:  r4  s       r   $test_align_vectors_improper_rotationr=    sl    
679 	:A
68: 	;A &&q!,ICAsyy|$/D!$'r   c                     d} t        j                  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        j                  || |      sJ t        j
                  |||      sJ y )NgbQ?)r   r  r  )r        ?r   )r  r   r   r  r   r   r   r   r   )r   g?r   )r   g?r   Treturn_sensitivityr[   )r    r!   r   r3  iscloseallclose)rssd_expectedsens_expectedr5   r"  r#  r   r4  senss           r   #test_align_vectors_rssd_sensitivityrH  	  s    %MHHn,,. /M D	Iy)A	K-A,,QdKOCt::dM555;;t]666r   c                     d} t        j                  | d      j                  g d      }t        j                  | d      j                  g d      }d}t        j                  ||t	        j
                  |       d      \  }}}t        j                  |||t	        j
                  |       z  d      \  }}}	t        |j                         |j                                t        t	        j                  |      |z  |d	       t        ||	       y )
Nr7   r   r  r   r   rU   Tr  r[   )	r   r:   r  r3  r    r  r   r<   r\   )
rq  r"  r#  scaleest1rssd1cov1est2rssd2cov2s
             r   !test_align_vectors_scaled_weightsrQ    s    
Aq!''	2Aq!''	2AE ..q!RWWQZFD% ..q!URWWQZ5GND%DNN$dnn&67BGGENU*E=D$r   c            	          t         j                  j                  d      } d}t        j                  |       }| j	                  |df      }|j                  |      }t        j                  d      }d|z  }t        j                  | j	                  |df|            }|j                  |      }t        j                  ||d	
      \  }	}
}||	j                         z  j                         }t        |d   d|       t        |d   d|       t        |d   d|       ||z  }t        |d   d|       t        |d   d|       t        |d   d|       t        |
t        j                  ||	j                  |      z
  dz        dz         y )Nr  r8   r  r   r7  r   r?  )r   rJ  TrA  r   r[   rU   r   r   )r   r   )rU   rU   r   )r    r:   r  r   r8  r  r   r   r3  r]   r   r   sum)rD   	n_vectorsr   vectorsr   sigma	tolerancenoisenoisy_resultr:  r4  coverror_vectors                r   test_align_vectors_noiser]  $  sm   
))

 G
HCI
//c
"Cjjy!nj-GYYwF JJqMEeI  

Q 	 	
E ;;v&L++L'?CENCs #'')O..0LLOQY7LOQY7LOQY7 5LCCIqy1CIqy1CIqy1D"&&,71C"Ca!GH#MNr   c                     t        j                  t        d      5  t        j                  g dg d       d d d        t        j                  t        d      5  t        j                  g dg d       d d d        t        j                  t        d      5  t        j                  g dg dgg dg       d d d        t        j                  t        d      5  t        j                  g dgg dgd	gg
       d d d        t        j                  t        d      5  t        j                  g dg dgg dg dgg d
       d d d        t        j                  t        d      5  t        j                  g dgg dgdg
       d d d        t        j                  t        d      5  t        j                  g dg dgg dg dgt
        j                  t
        j                  g
       d d d        t        j                  t        d      5  t        j                  g dgg dg       d d d        t        j                  t        d      5  t        j                  g dg dgg dg dgdt
        j                  d	g       d d d        t        j                  t        d      5  t        j                  g dgg dgd       d d d        y # 1 sw Y   xY w# 1 sw Y   mxY w# 1 sw Y   7xY w# 1 sw Y    xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   4xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nz Expected input `a` to have shapera   rg   rc   z Expected input `b` to have shapez/Expected inputs `a` and `b` to have same shapesr
  z&Expected `weights` to be 1 dimensionalr   r  z+Expected `weights` to have number of valuesz)`weights` may not contain negative valuesrR   z#Only one infinite weight is allowedz(Cannot align zero length primary vectorsr   z Cannot return sensitivity matrixT)rB  r  rA  )rh   ri   rj   r   r3  r    infr   r   r    test_align_vectors_invalid_inputr`  K  s   	z)K	L 8|Y78 
z)K	L 8y,78 
z *? 
@ C	)4ykBC 
zE
G H	{YK1#GH 
zJ
L 2	95	97M'0	22
 
zH
J G	{YK"FG 
zB
D 9	95	97M(*'7	99
 
zG
I 9	{YK89 
z?
A M	95	97M26	MM
 
z?
A 8	{YK26	88 8K8 88 8C CH H2 2
G G9 9
9 9M M
8 8sx   KK  K-!K:'L) L,AL!L.6L;+MK K*-K7:LLL!L+.L8;MMc                     d} g dg dg}g dg dg}t        j                  g dg dg dg      }t        j                  ||t         j                  dg      \  }}t        |j                         || 	       t        |j                  |      || 	       t        j                  |d
| 	      sJ g dg dg}d}t        j                  ||t         j                  dg      \  }}t        |j                         || 	       t        |j                  |      d
   |d
   | 	       t        j                  ||| 	      sJ g dg dg}t        |j                  |      || 	       g dg dg}g dg dg}d}t        j                  ||t         j                  dg      \  }}t        |j                  |      d
   |d
   | 	       t        j                  ||| 	      sJ y )Nrf  r   )r   r   r   r   r@  r   r   r  r[   r   )r   rU   r   r   r   r   rU   rc   )r   r   rR   )rR   r   rU   r   g4i?)	r    r!   r   r3  r_  r   r<   r  rC  )r5   r#  r"  
m_expectedRr4  rE  
a_expecteds           r   "test_align_vectors_align_constrainrf  w  s   
 D	IA	IA9$$& 'J $$QBFFA;?GAtAKKM:D9AGGAJ-::dAD))) 
IAM$$QBFFA;?GAtAKKM:D9AGGAJqM1Q4d3::dM555Y'JAGGAJ
6 
K A	Z A&M$$QBFFA;?GAtAGGAJqM1Q4d3::dM555r   c                     d} g }t        d      D ]9  }|j                  t        j                  | d|z         j	                                ; t        |       D ]  }d|d   |   d   z  d|d   |   d   z  g}d|d   |   d   z  d	|d   |   d   z  g}t        j
                  ||d
dg      \  }}t        j
                  ||t        j                  dg      \  }}t        |j	                         |j	                         d        t        |       D ]  }d|d   |   d   z  d|d   |   d   z  d|d   |   d   z  g}d	|d   |   d   z  d|d	   |   d   z  d|d   |   d   z  g}t        j
                  ||g d      \  }}t        j
                  ||t        j                  ddg      \  }}t        |j	                         |j	                         d        y )Nr8   rd   r7   r  r   r   rU   r   r       _Br  -C6?r[   r   )rh  rU   r   )	r   appendr   r:   r<   r3  r    r_  r   )rq  matsr   r"  r#  rd  _R2s           r   test_align_vectors_near_infrn    s    	AD1X @HOOA262<<>?@ 1X BtAwqz!}_aQ
1o.tAwqz!}_aQ
1o.%%aT1I>1&&q!bffa[AAr||~DAB 1X BtAwqz!}_aQ
1oqaA?tAwqz!}_aQ
1oqaA?%%aLA1&&q!bffa^DAr||~DABr   c                  D   d} g dg dg}g dg dg}t        j                  g dg dg dg      }t        j                  ||t         j                  dg      \  }}t        |j                         ||        t        j                  |d	   |d	         \  }}t        |j                         ||        t        |j                  |d	         |d	   |        g dg dg}t        j                  g dg dg dg      }t        j                  ||t         j                  dg      \  }}t        |j                         ||        t        j                  |d	   |d	         \  }}t        |j                         ||        t        |j                  |d	         |d	   |        y )
Nrf  r   r   r}   r   r   r  r[   r   )r    r!   r   r3  r_  r   r<   r  )r5   r"  r#  rc  rd  rl  s         r   test_align_vectors_parallelrp    s[   D	IA	IA9%$& 'J !!!Q<DAqAKKM:D9!!!A$!-DAqAKKM:D9AGGAaDM1Q4d3	IA9$$& 'J !!!Q<DAqAKKM:D9!!!A$!-DAqAKKM:D9AGGAaDM1Q4d3r   c                     d} t        j                  g dg dgg dg dgg dg dgg      }|D cg c]  }|d    |d   g }}t        ||      D ]}  \  }}t        j                  ||t         j
                  dg      \  }}t        |j                         t         j                  |        t        |j                  |d         |d   |         t        j                  d	d
      }t        j                  |j                         dz        }g dg dg}g dg dg}g }|D ]*  }	|j                  |	j                  |d         |d   g       , |D ]t  }t        j                  ||t         j
                  dg      \  }}t        j                  ||ddg      \  }
}t        |j                         |
j                         |        v y c c}w )Nrf  r   r   r   r   r   r  r[   r8   r  ri  r}   rh  )r    r!   zipr   r3  r_  r   r  r  r  r:   r   r   rj  r<   )r5   
as_to_testr"  
bs_to_testr#  rd  rl  RsdRsdRrm  s              r   test_align_vectors_antiparallelrx    s   DIy1%y1%y13 4J *44AAaD5!A$-4J4J
+ 81%%aRVVQK@1ruu48!qt$78 
!	$B


r||~d2
3C	YA	YAJ 2288AaD>1Q4012 B%%aRVVQK@1&&q!dAY?Ar||~DAB 5s   G	c                  x   d} t        j                  dd      j                         }t        j                  dd      j                         }t        ||      D ]_  \  }}|d   }|d   }t        j                  ||      \  }}t        |j                  |      ||        t        j                  |d|       r_J  y )Nrf  r8   r   r  r   r[   )	r   r:   r<   rr  r3  r   r  r    rC  )	r5   mats_amats_bmat_amat_br"  r#  rd  r4  s	            r   test_align_vectors_primary_onlyr~    s    D__Sa(224F__Sa(224FFF+ .u!H!H ((A.4
AD1zz$---.r   c                     t         j                  j                  d      } t        j                  | j                  d            }|j                         }g d}t        ||      }g d} ||      }|j                         }||d d df   dk  xx   dz  cc<   ||d d df   dk  xx   dz  cc<   t        |d   |d          t        |d   |d          t        |d	   |d
          t        |d   |d          t        |d   |d          t        j                  |d   |d
   z        }t        j                  |d
   |d   z        }	t        ||	       t        j                  |d   |d   z        }
t        j                  |d   |d	   z        }t        |
|       t        j                  |d   |d   z        }t        |d
|d
z  z  dz
         t        t        |      t        |             y )Nr   r/  r7  )r   r   rU   r   r   )r   r   rH  r   r?  rU   g      @r   g      
@g@r   rR   r   r   r   rU   re   r7   r   )r    r:   r;   r   r"   rk  r#   r   r   rT  r   r  )r   key_rots	key_quats	key_timesinterpolatortimesinterp_rotsinterp_quats
cos_theta1
cos_theta2
cos_theta4
cos_theta5
cos_theta3s                r   
test_slerpr    s   
))


"C!!#++6+":;H  "IIH-L=Eu%K&&(L ae$q()R/)i2"#r)# LOYq\2LOYq\2LOYq\2LOYq\2L$il3 Q,q/9:JQ,q/9:JJ
+Q,q/9:JQ,q/9:JJ
+ Q,q/9:JJZ] 3a 78 [!3u:.r   c                      t        j                  t        d      5  t        j                  g dg dg      } t        j                  ddg      }t        ||        d d d        y # 1 sw Y   y xY w)Nzmust be a `Rotation` instancera   rg   rQ   r   r   )rh   ri   r  r    r!   r   )r%   r  s     r   test_slerp_rot_is_rotationr  #  sY    	y(G	H HHi! "HHaVa	  s   ?A$$A-c                      d} t        j                  t        |       5  t        j                  g d      }t        dg|       d d d        y # 1 sw Y   y xY wNz*must be a sequence of at least 2 rotationsra   rg   r   rh   ri   rj   r   r"   r   msgr%   s     r   test_slerp_single_rotr  +  sE    
6C	z	- |,qc1  s   %AAc                      d} t        j                  t        |       5  t        j                  g dg      }t        dg|       d d d        y # 1 sw Y   y xY wr  r  r  s     r   test_slerp_rot_len1r  2  sG    
6C	z	- ~.qc1  s   &AAc                  6   t        j                  t        d      5  t        j                  j                  d      } t        j                  | j                  d            }t        j                  dgdgg      }t        ||       d d d        y # 1 sw Y   y xY w)Nz.times to be specified in a 1 dimensional arrayra   r   )rU   r   r7  r   rU   )rh   ri   rj   r    r:   r;   r   r"   rk  r!   r   r   r%   r  s      r   test_slerp_time_dim_mismatchr  9  s}    	zM
O ii##A&s{{{78HHqcc a  s   A*BBc                  .   t        j                  t        d      5  t        j                  j                  d      } t        j                  | j                  d            }t        j                  d      }t        ||       d d d        y # 1 sw Y   y xY w)Nz7number of rotations to be equal to number of timestampsra   r   r/  r7  re   )rh   ri   rj   r    r:   r;   r   r"   rk  aranger   r  s      r   !test_slerp_num_rotations_mismatchr  C  sq    	z *@ 
A ii##A&s{{{78IIaLa  s   A&BBc                     t        j                  t        d      5  t        j                  j                  d      } t        j                  | j                  d            }g d}t        ||       d d d        y # 1 sw Y   y xY w)Nstrictly increasing orderra   r   r/  r7  )r   r   rU   rU   r   
rh   ri   rj   r    r:   r;   r   r"   rk  r   r  s      r   test_slerp_equal_timesr  L  c    	z)D	E ii##A&s{{{78a	     AA::Bc                     t        j                  t        d      5  t        j                  j                  d      } t        j                  | j                  d            }g d}t        ||       d d d        y # 1 sw Y   y xY w)Nr  ra   r   r/  r7  )r   r   r   rU   r   r  r  s      r   test_slerp_decreasing_timesr  T  r  r  c                  p   t         j                  j                  d      } t        j                  | j                  d            }t        j                  d      }t        ||      }t        j                  t        d      5  t        j                  dgdgg      } ||       d d d        y # 1 sw Y   y xY w)	Nr   r/  r7  r   z&`times` must be at most 1-dimensional.ra   g      @g@)r    r:   r;   r   r"   rk  r  r   rh   ri   rj   r!   )r   r%   r  sinterp_timess        r   !test_slerp_call_time_dim_mismatchr  \  s    
))


"C3;;F;34A
		!AaA	zE
G xx#"%!( )	,	  s   "B,,B5c                     t         j                  j                  d      } t        j                  | j                  d            }t        j                  d      dz   }t        ||      }t        j                  t        d      5   |g d       d d d        t        j                  t        d      5   |g d	       d d d        y # 1 sw Y   8xY w# 1 sw Y   y xY w)
Nr   r/  r7  r   r   ztimes must be within the rangera   rb  )r   rU   rd   )r    r:   r;   r   r"   rk  r  r   rh   ri   rj   )r   r%   r  r  s       r   !test_slerp_call_time_out_of_ranger  i  s    
))


"C3;;F;34A
		!qAaA	z)I	J 	)	z)I	J 	)   s   C2CCCc                      t        j                  dddgd      } t        ddg|       } |d      }t        j                  ddd      }||j                         z  }t	        |j                         dd	
       y )NXr   P   Tr   r   rH  r  r2   r[   )r   rL   r   r]   r   r  )r%   r  r_interpolatedr_interpolated_expecteddeltas        r   test_slerp_call_scalar_timer  u  so    C!R$7Aq!faAtWN&11#r4H488::EEOO%qu5r   c                      t        j                  dd      } t        j                  dd      }| D ]C  }|||z  z  }t        t        j                  j                  |j                         d      d       E y )N2   r   r  rd  r   r   )r   r:   r   r    r@   rA   r#   )qsrsrE   s      r   test_multiplication_stabilityr    sa    		#B	1	%B A
a"f		rzz|!<a@Ar   c                     d} t        j                  dd      }|j                         }dD ]  }||z  }t        j                  d      }t	        t        |            D ]  }|dkD  r||z  }||z  } ||j                         z  j                         }t        j                  || k        sJ t        j                  g d      }||z  j                         j                  dk(  sJ t        j                  g dg      }||z  j                         j                  dk(  rJ  d	D ]W  }||z  }t        j                  ||j                         z        }t        |j                         |j                         | 
       Y t        j                  g d      }d}||z  }t        j                  ||j                         z        }t        |j                         |j                         | 
       y )Nrh  r7   r   r  )r  r   rR   r   r   rU   r   rQ   r.  r   )g      rN  g       r  r   r?  r[   )rf  r   r   r   )r   r:   r]   r  r   rX   r  r    r\  r"   r#   rx   r   r   r   )r5   r  p_invrq  rE   r%   rl  angs           r   test_powr    s   D"AEEGE% 0Fb!s1v 	A1uEI		
 1557{%%'vvcDj!!! |,1~~%%---~.1~~%%///!0& / =F  Q[[]!23		QYY[t<= 	]+A	A	QAQ./AAIIK48r   c                      t        j                  d      } t        j                  t        d      5  t        | dd       d d d        y # 1 sw Y   y xY w)Nr   r  zmodulus not supportedra   r   )r   r:   rh   ri   NotImplementedErrorpow)r  s    r   test_pow_errorsr    s@    AA	*2I	J Aq!  s   A		Ac                  F   t        j                  d      } t        j                  dd      }t        j                  |       }t	        |j
                  d       t        j                  |      }t	        |j
                  d       t        |d   j                         |d   j                                t        |d   j                         |d   j                                t        j                  | g      }t	        |j
                  d       t	        |d   |        t        j                  |g      }t	        |j
                  d       t        |d	   j                         |d   j                                t        |d
   j                         |d   j                                t        j                  | |gt              }t	        |j
                  d       t	        |d   |        t	        |d   |       t        j                  |||g      }t	        |j
                  d       y )Nr   r  rU   r   r   )rU   )r   )r   rU   rS  )r   r   )dtype)r   rU   )	r   r:   r    r!   r   rx   r   r<   object)singlemultipler!   s      r    test_rotation_within_numpy_arrayr    s   __#Fqa(HHHVEb!HHXEd#E!H&&((1+*?*?*ABE!H&&((1+*?*?*ABHHfXEd#q6"HHhZ Ef%E$K))+Xa[-B-B-DEE$K))+Xa[-B-B-DEHHfh'v6Ed#q6"q8$HHh(34Ef%r   c            	      n   t        j                  ddt        j                  t        j                  dz        t        j
                  t        j                  dz        g      } t        j                  |       }t        j                  |      }t        | j                         |j                         d       y Nr   r   r1   r[   )r   r"   r    sinr  r   pickledumpsloadsr   r<   )r%   pkl	unpickleds      r   test_picklingr    sq    Aq"&&q/266"%%'?CDA
,,q/CS!IAKKM9#6#6#8uEr   c            	      D   t        j                  ddt        j                  t        j                  dz        t        j
                  t        j                  dz        g      } t        j                  |       }t        | j                         |j                         d       y r  )
r   r"   r    r  r  r   r2  deepcopyr   r<   )r%   r  s     r   test_deepcopyr    sa    Aq"&&q/266"%%'?CDA	q	BAKKM2<<>>r   c                  :   t        j                  g d      } | j                  d      }| j                  d      }|j                  d   du sJ |j                  d   du sJ t	        d |j
                  D              sJ t	        d |j
                  D              sJ y )NrQ   rI   XYZC_CONTIGUOUSTc              3   &   K   | ]	  }|d k\    ywr   Nr   .0r   s     r   	<genexpr>z+test_as_euler_contiguous.<locals>.<genexpr>       *!qAv*   c              3   &   K   | ]	  }|d k\    ywr  r   r  s     r   r  z+test_as_euler_contiguous.<locals>.<genexpr>  r  r  )r   r"   rn  flagsr\  strides)r%   e1e2s      r   test_as_euler_contiguousr    s    <(A	
E	B	
E	B88N#t+++88N#t+++*rzz*****rzz****r   c                     t        j                  dd      } g d}dgt        t        j                  |            z   }t        ||      D cg c]  \  }}| |||z     }}}t        j                  |      }t        | j                         |j                                t        j                  |       }t        | j                         |j                                | |usJ t        j                  t        j                               }t        t        j                         j                         |j                                y c c}}w )Nr7   r   r  )r   rU   r   r   r   )
r   r:   listr    cumsumrr  r  r   r#   r  )rs  sizesstartsr   rq  splitr   s          r   test_concatenater    s   rq)HES4		%())F+.vu+=>41aXaA>E>!!%(F!!#V^^%56 !!(+F!!#V^^%56 6!!! !!("3"3"56F""$,,.0@A ?s   Ec                      t        j                  t        d      5  t        j                  t        j
                         dd g       d d d        y # 1 sw Y   y xY w)NzRotation objects onlyra   r   )rh   ri   r  r   r  r  r   r   r   test_concatenate_wrong_typer    sD    	y(?	@ =h//11d;<= = =s   +AAc                  *   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        | sJ |sJ |sJ y # 1 sw Y   xY w)NrQ   r   rU   zSingle rotation has no len().ra   )r   r  rh   ri   r  )rotation_multi_onerotation_multirotation_singles      r   test_len_and_boolr    s    !<.1|\:;N|,O!"a'''~!###	y(G	H O >? s   (B		Bc                      g d} t        j                  | ddd      j                         }t        j                  g d      t        j
                  d      z  }t        ||       y )Nr   r  r  Tr   rt   rU   )r   from_davenportr#   r    r!   r\   r   )r   rp   r&   s      r   #test_from_davenport_single_rotationr    sO    D""4b+/118 	HH\*RWWQZ7MD-(r   c                     g d} g d}t        j                  t        j                  |       t        j                  z  dz        }t        j
                  | dt        j                  dz        }t        |j                  d      |j                  d             t        j                  t        j                  |       t        j                  z  dz  g      }t        j
                  | gdt        j                  dz  g      }t        |j                  d      |j                  d             t        j                  t        j                  |       t        j                  z  dz  t        j                  |      t        j                  z  dz  g      }|d   |d	   z  }t        j
                  || gdt        j                  dz  t        j                  dz  g      }t        |j                  d      |j                  d             t        j                  t        j                  |       t        j                  z  dz  t        j                  |       t        j                  z  dz  g      }t        j
                  | gdt        j                  dz  t        j                  dz  g      }t        |j                  d      |j                  d             y )
Nr   r   r   eTrK   rd   r   r   )r   r   r    r!   r  r  r   r#   )ezeyr   rot_davs       r   #test_from_davenport_one_or_two_axesr    s    	B	B 

rxx|bee3A5
6C%%b#ruuQw7GCKK$K/OOdO35 

ruu 4Q 67
8C%%rdC"%%';GCKK$K/OOdO35 

ruu 4Q 6 "ruu 4Q 6 8 9C
a&3q6/C%%r2hbeeAgruuQw5GHGCKK$K/OOdO35 

ruu 4Q 6 "ruu 4Q 6 8 9C%%rdC"%%'25571CDGCKK$K/OOdO35r   c                  t   g d} g d}g d}t        j                  t        d      5  t        j                  | |gdddg       d d d        t        j                  t        d      5  t        j                  | ||gdg d       d d d        t        j                  t        d	      5  t        j                  | gd
dg       d d d        t        j                  t        d      5  t        j                  | || gdg d       d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   bxY w# 1 sw Y   y xY w)Nr   r   r@  zmust be orthogonalra   r  r   r   zorder should berI   zExpected `angles`)r   r   rU   r   )rh   ri   rj   r   r  )r  r  ezys      r   !test_from_davenport_invalid_inputr  ;  s   	B	B
C	z)=	> 8S	3A78	z)=	> ?RsI>?	z):	; 2eaS12	z)<	= ARc<@A A8 8? ?2 2A As/   D
'D'D"$D.
DD"D+.D7c                  N   t         j                  j                  d      } d}t        j                  |df      }| j	                  t         j
                   t         j
                  |f      |d d df<   | j	                  dt         j
                  |f      }| j	                  t         j
                   t         j
                  |f      |d d df<   | j	                  dt         j
                  d      }t        j                  g d      }t        j                  g d      }|D ]  }||t        j                  ||z        j                  |      g}||z
  |d d d	f<   d
D ]F  }	|	dk(  r|n|d d d   }
t        j                  |
|	|      }|j                  |
|	      }t        ||       H  y )Nr   r8   r   r  rU   )r  r   r   r   r  r  rR   )r    r:   r;   rj  rk  r  r!   r   r   r  r  as_davenportr   )r   rq  r9  angles_middlelambdasr  r  lambax_lamborderaxr   
angles_davs                r   test_as_davenportr  I  sg   
))


"CAXXq!fF;;BEE6QD;AF1a4LKKABEEK=M;;BEE6QD;AF1a4Lkkabee%k8G	)	B	)	B 0r8//R8>>rBC$t+q!t/ 	0E![0gddmB))"eV<C))"e4JJ/		00r   c                  J   t         j                  j                  d      } d}t        j                  |df      }| j	                  t         j
                   t         j
                  |f      |d d df<   t        |      D cg c]#  }| j                  dt         j
                  g      % }}| j	                  t         j
                   t         j
                  |f      |d d df<   | j	                  dt         j
                  d      }t        j                  g d      }t        j                  g d      }|D ]  }||t        j                  ||z        j                  |      g}	||z
  |d d d	f<   d
D ]  }
|
dk(  r|	n|	d d d   }t        j                  ||
|      }t        j                  t        d      5  |j!                  ||
      }d d d        |j#                         }t        j                  ||
      j#                         }t%        ||         y c c}w # 1 sw Y   TxY w)Nr   r   r   r  rU   )r   r   r   r   r  r  rR   r  ra   )r    r:   r;   rj  rk  r  r   choicer!   r   r   r  r  rh   r  r  r  r<   r   )r   rq  r9  r   r  r  r  r  r  r   r  r  r   r  r  r  s                   r   test_as_davenport_degenerater  _  s    ))


"C	AXXq!fF ;;BEE6QD;AF1a4L5:1X>SZZBEE
+>M>;;BEE6QD;AF1a4Lkkabee$k7G	)	B	)	B 
Cr8//R8>>rBC$t+q!t/ 	CE![0gddmB))"eV<Ck? 9 --b%8
9==?L$33BzJTTVM%lMB	C
C ?9 9s   ?(H3HH"c                     t         j                  j                  d      } d}t        j                  |df      }| j	                  t         j
                   t         j
                  |f      |d d df<   | j	                  dt         j
                  |f      |d d df<   | j	                  t         j
                   t         j
                  |f      |d d df<   dD ]  }t        d      D ]  }d	j                  |d   |d   |d   g      }|D cg c]  }t        |       }}|d
k(  r|j                         }t        j                  ||      }t        j                  |||      }	t        |j                  d      |	j                  d      d         |d d dfxx   t         j
                  dz  z  cc<   dD ]  }t        d      D ]  }d	j                  |      }|D cg c]  }t        |       }}|d
k(  r|j                         }t        j                  ||      }t        j                  |||      }	t        |j                         |	j                         d         y c c}w c c}w )Nr   r8   r   r  r   rU   r  rI   re  r  TrK   rf  r9   )r    r:   r;   rj  rk  r  r	   rl  r   rm  r   rL   r  r   r#   )
r   rq  r9  r  rT  rr  r   r  euldavs
             r   &test_compare_from_davenport_from_eulerr  }  s   
))


"CAXXq!fF ;;BEE6QD;AF1a4L;;1255t;<F1a4L;;BEE6QD;AF1a4L+ 	(%e, 	(I''9Q<1y|DEC(+,1)A,,B,#iik%%c62C))"eV<CCKK$K7t9T!&(	(	( 1a4LBEEAIL+ F%e, 	FI'')$C(+,1)A,,B,#iik%%c62C))"eV<CCKKM3;;=uE	FF - -s   	I I%c                     t         j                  j                  d      } d}t        j                  |df      }| j	                  t         j
                   t         j
                  |f      |d d df<   | j	                  dt         j
                  |f      |d d df<   | j	                  t         j
                   t         j
                  |f      |d d df<   dD ]  }t        d      D ]  }d	j                  |d   |d   |d   g      }|D cg c]  }t        |       }}|d
k(  r|j                         }t        j                  ||      }|j                  |      }	|j                  ||      }
t        |	|
d         |d d dfxx   t         j
                  dz  z  cc<   dD ]  }t        d      D ]  }d	j                  |      }|D cg c]  }t        |       }}|d
k(  r|j                         }t        j                  ||      }|j                  |      }	|j                  ||      }
t        |	|
d         y c c}w c c}w )Nr   r8   r   r  r   rU   r  rI   re  r  rf  r9   )r    r:   r;   rj  rk  r  r	   rl  r   rm  r   rL   rn  r  r   )r   rq  r9  r  rT  rr  r   r  r   r	  r
  s              r   "test_compare_as_davenport_as_eulerr    s   
))


"CAXXq!fF ;;BEE6QD;AF1a4L;;1255t;<F1a4L;;BEE6QD;AF1a4L+ 	2%e, 	2I''9Q<1y|DEC(+,1)A,,B,#iik%%c62C,,s#C""2u-CC51	2	2 1a4LBEEAIL+ 	2%e, 	2I'')$C(+,1)A,,B,#iik%%c62C,,s#C""2u-CC51	2	2 - -s   	H<I)rh   numpyr    numpy.testingr   r   r   scipy.spatial.transformr   r   scipy.statsr   	itertoolsr	   r  r2  r   r'   r*   r,   rG   rN   rV   rY   r_   rl   rn   rr   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r$  r(  r:  rI  rP  rS  markparametrizerv  rz  thread_unsafer  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r"  r&  r(  r*  r,  r0  r5  r;  r=  rH  rQ  r]  r`  rf  rn  rp  rx  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   <module>r     sD     A ) 3 + "  :::D(O<:
>/@90.	4181>		+J
2?? 22	"%
E44*	??	O"
O..J)*16666 l5&9:m42 5 ;2> l5&9:m42 5 ;2: l5&9:m4; 5 ; ;0 l5&9:m4; 5 ; ;2 l5&9:m4> 5 ; >B.&.<?6
??@ : 2 2=
C$(
54A8:*:89,T&
#20!$F((	(
7 $ON)8X 6FB840B4.)/X
		6A"9J&<F?+B(= )5@A0, C C:FB2r   