
    (ph                         S SK JrJr  S SKrS SKrS SKJrJr  S SKJ	r
  S SKJrJrJrJr  S SKJr  S SKJr  S rS	 rS
 rS rS rS rS rS rS rS rS rS r\R>                  RA                  S/ SQ5      S 5       r!g)    )productpermutationsN)assert_array_lessassert_allclose)raises)inveighnormsvd)orthogonal_procrustes)matrixc                      [         R                  R                  S5      n U R                  SSS5      nU R                  SSS5      n[	        [
        [        X5        g )N           nprandomRandomStaterandnassert_raises
ValueErrorr   rngABs      U/var/www/html/venv/lib/python3.13/site-packages/scipy/linalg/tests/test_procrustes.py)test_orthogonal_procrustes_ndim_too_larger      sG    
))


%C		!QA		!QA*3Q:    c                      [         R                  R                  S5      n U R                  S5      nU R                  S5      n[	        [
        [        X5        g )Nr   r   r   r   s      r   )test_orthogonal_procrustes_ndim_too_smallr"      s=    
))


%C		!A		!A*3Q:r    c                      [         R                  R                  S5      n Sn[        US5       H8  u  p#U R                  " U6 nU R                  " U6 n[        [        [        XE5        M:     g )Nr   ))r   r   )r   r   r   r   r   r      )r   r   r   r   r   r   r   r   )r   shapesabr   r   s         r   )test_orthogonal_procrustes_shape_mismatchr*      sU    
))


%C-FVQ'IIqMIIqMj"7> (r    c                     [         R                  R                  S5      n Su  pU R                  X5      nU R                  X5      n[         R                  [         R                  * [         R
                  4 HQ  nUR                  5       nXVS'   UR                  5       nXWS'   X74Xd4Xg44 H  u  p[        [        [        X5        M     MS     g )Nr   )r&   r   )   r&   )
r   r   r   r   infnancopyr   r   r   )
r   mnA_goodB_good	bad_valueA_badB_badr   r   s
             r   0test_orthogonal_procrustes_checkfinite_exceptionr7   $   s    
))


%CDAYYq_FYYq_FVVbffWbff,	dd_uo~FDA*&;QB G -r    c                     [         R                  R                  S5      n Su  p[        S5       H  nU R	                  X5      nU R	                  X5      n[        XE5      u  pg[         R                  " U R	                  S5      5       HL  n[         R                  " U R	                  S5      5       H   n	[        XH-  XY-  5      u  p[        X5        M"     MN     M     g )Nr   r$   r   )r   r   r   ranger   r   squarer   )r   r0   r1   iA_origB_origR_origsA_scaleB_scaleRs              r   +test_orthogonal_procrustes_scale_invariancerC   2   s    
))


%CDA1X11)&9	yy1.G99SYYq\2,V-=v?OP* 3 /	 r    c                     [         R                  R                  S5      n S H  u  pU R                  X5      nU R                  X5      nX3R	                  5       [        U5      4nXDR	                  5       [        U5      4n[        X45      u  pxUR                  U5      n	[        XV5       H.  u  p[        X5      u  pUR                  U5      n[        X5        M0     M     g )Nr   )   r   r%   )r   rF   )
r   r   r   r   tolistr   r   dotr   r   )r   r0   r1   A_arrB_arrAsBsR_arrr?   AR_arrr   r   rB   ARs                 r   +test_orthogonal_procrustes_array_conversionrP   ?   s    
))


%C(		!		!\\^VE]3\\^VE]3(65!BODA(.DA1BB' $ )r    c                     [         R                  R                  S5      n S GHP  u  pU R                  X5      nU R                  X"5      n[	        UR
                  U-   5      u  pV[        [        U5      UR
                  5        [         R                  " X6R
                  5      n[        Xs5      u  p[        [        U5      UR
                  5        [        UR                  U5      U5        USU R                  X5      -  -   n
[        X5      u  p[        [        U5      UR
                  5        U
R                  U5      nU
R                  U5      n[        X-
  SS9n[        X-
  SS9n[        X5        GMS     g )Nr   rE   g{Gz?fro)ord)r   r   r   r   r	   Tr   r   rH   r   r
   r   )r   r0   r1   r   XwVr   rB   r?   A_perturbedR_primenaive_approxoptim_approxnaive_approx_erroroptim_approx_errors                   r   test_orthogonal_procrustesr^   N   s    
))


%C(IIaO IIaOACC!G}A$FF1ccN$Q*A$a!$$100 +;:
Ggii0"q)"w/!,"2>!,"2>,A9 )r    c                 ,    U R                  SS9nX-
  U4$ )Nr   )axis)mean)r   mus     r   	_centeredrc   o   s    	
QB62:r    c                  v   [         R                  " SS/SS/SS/SS//[        S9n [         R                  " SS/SS/SS/SS//[        S9n[        U 5      u  p#[        U5      u  pE[	        X$5      u  pgU[         R
                  " [        U5      5      -  nU[         R                  " X&5      -  U-   n	[        XS	S
9  g )Nr   r&   dtyper,   r   r   :0yE>atol	r   arrayfloatrc   r   r:   r
   rH   r   )
r<   r=   r   A_mur   B_murB   r?   scaleB_approxs
             r   (test_orthogonal_procrustes_exact_examplers   t   s     XXAwQ"a2q':%HFXX1v1v2wA7uEFGAGA &DA		$q'""Ervva|#d*HH40r    c                  :   [         R                  " SS/SS/SS/SS//[        S9n [         R                  " SS/SS/SS	/S
S//[        S9n[        U 5      u  p#[        U5      u  pE[	        X$5      u  pgU[         R
                  " [        U5      5      -  nU[         R                  " X&5      -  U-   n	[         R                  " SS/SS/SS/SS//[        S9n
[        XSS9  Sn[         R
                  " [        X-
  5      [        U5      -  5      n[        X5        [	        XB5      u  pgU[         R
                  " [        U5      5      -  nU[         R                  " XF5      -  U-   n[         R
                  " [        X-
  5      [        U5      -  5      n[        X5        g )Nre   r   rf   r&   rg   (   r,   r   ir      ii   ri   rj   g?rl   )r<   r=   r   ro   r   rp   rB   r?   rq   rr   expectedexpected_disparityAB_disparityA_approxBA_disparitys                  r   ,test_orthogonal_procrustes_stretched_exampler}      sg   XXAwQ"a2q':%HFXX2wAC1a&9GFGAGA &DA		$q'""Ervva|#d*Hxx!R3(QHr1g>eLHHT2+99T("34tAw>?LL5 &DA		$q'""Ervva|#d*H99T("34tAw>?LL5r    c                     [         R                  " SS/SS/SS/SS//[        S9n [         R                  " SS/SS/SS/SS//[        S9n[         R                  " S	S
/S	S/S	S/SS//5      n[        U 5      u  p4[        U5      u  pV[	        X55      u  pxU[         R
                  " [        U5      5      -  n	U	[         R                  " X75      -  U-   n
[        X5        [        U[        U5      -  U5        g )Nr   rf   ir&   rg   r,   r   gCuRg'a?gCuR?gT6ٿgT6?rl   )r<   r=   B_standardizedr   ro   r   rp   rB   r?   rq   rr   s              r   (test_orthogonal_procrustes_skbio_exampler      s    " XX2wB!R1b':%HFXX1v1v1v1v6eDFXX	i 	j!	k"	[!	# $N
 GAGA &DA		$q'""Ervva|#d*HH%AQK0r    c                     [         R                  " S5      n [        X 5      u  p[        U[         R                  " S5      5        [         R                  " S5      n [        X 5      u  p[        U[         R                  " S5      5        g )N)r   r   )r   r   r   )r   emptyr   r   identity)r(   rr?   s      r   
test_emptyr      s[    
A &DAArxx'(
A &DAAr{{1~&r    shape)r   r   )r   r   )r   r   c                    U u  p[         R                  R                  S5      nUR                  U 5      UR                  U 5      S-  -   nUR                  X"45      UR                  X"45      S-  -   n[         R                  R	                  U5      u  pVXE-  n[        XG5      u  p[        XR                  5       R                  -  [         R                  " U5      SS9  [        XE-  U5        U S:w  a  [        X5        [        UR                  5       R                  U-  5      u  pjn[        U	[         R                  " U
5      5        g )Nl   sIHb$y              ?g+=rj   r   )r   r   default_rnglinalgqrr   r   conjrT   eyer   sum)r   r0   r1   r   r   Q_r   rB   rq   r?   s              r   test_unitaryr      s     DA
))


-C

5CJJu-22A

A6SZZ/"44A99<<?DA	A$Q*HAA

NBFF1IE:AE1!&&(**q.!GA!E266!9%r    )"	itertoolsr   r   numpyr   pytestnumpy.testingr   r   r   r   scipy.linalgr   r	   r
   r   r   scipy.sparse._sputilsr   r   r"   r*   r7   rC   rP   r^   rc   rs   r}   r   r   markparametrizer    r    r   <module>r      s    +   < * - - . (;;?C
+(BB
106,1B' ":;& <&r    