
    bib#                         d dl mZmZ d dlZd dlZd dlmZ d dlmZ	 d dl
mZ d dlmZ d dlmZmZ d dlmZ d	 Z ee       G d
 d             Zy)    )productpermutationsN)assert_allclose)raises)orthogonal_procrustes)matrix)make_xp_test_casexp_assert_close)skip_xp_invalid_argc                 6    |j                  | d      }| |z
  |fS )Nr   )axis)mean)Axpmus      ]/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/scipy/linalg/tests/test_procrustes.py	_centeredr      s"    		Br62:    c                       e Zd Zd Zd Zd Zd Z e       d        Zd Z	d Z
d Zd	 Zd
 Zej                  j!                  dg d      d        Zy)TestOrthogonalProcrustesc                     t         j                  j                  d      }|j                  |j	                  d            }|j                  |j	                  d            }t        t        t        ||       y )N     )nprandomRandomStateasarrayrandnassert_raises
ValueErrorr   )selfr   rngr   Bs        r   )test_orthogonal_procrustes_ndim_too_smallzBTestOrthogonalProcrustes.test_orthogonal_procrustes_ndim_too_small   sQ    ii##D)JJsyy|$JJsyy|$j"7A>r   c                    t         j                  j                  d      }d}t        |d      D ]W  \  }}|j	                   |j
                  |       }|j	                   |j
                  |       }t        t        t        ||       Y y )Nr   ))r   r   )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_mismatchzBTestOrthogonalProcrustes.test_orthogonal_procrustes_shape_mismatch   sv    ii##D)1 + 	CDAq

9399a=)A

9399a=)A*&;QB	Cr   c           
         t         j                  j                  d      }d\  }}|j                  ||      }|j                  ||      }t         j                  t         j                   t         j
                  fD ]s  }|j                         }||d<   |j                         }	||	d<   ||	f||f||	ffD ]9  \  }
}t        t        t        |j                  |
      |j                  |             ; u y )Nr   )r)   r   )   r)   )r   r   r   r   infnancopyr   r    r   r   )r!   r   r"   mnA_goodB_good	bad_valueA_badB_badr   r#   s               r   0test_orthogonal_procrustes_checkfinite_exceptionzITestOrthogonalProcrustes.test_orthogonal_procrustes_checkfinite_exception!   s    ii##D)11a1a"&&"&&0 	-IKKME#E$KKKME#E$K %5&/E5>J -1j*?A jjm--	-r   c           
      0   t         j                  j                  d      }d\  }}t        d      D ]  }|j	                  |j                  ||            }|j	                  |j                  ||            }t        ||      \  }}	t        j                  |j                  d            D ]j  }
t        j                  |j                  d            D ]A  }t        ||j	                  |
      z  ||j	                  |      z        \  }}	t        ||       C l  y )Nr   r'   r   )	r   r   r   ranger   r   r   squarer
   )r!   r   r"   r3   r4   iA_origB_origR_origsA_scaleB_scaleRs                r   +test_orthogonal_procrustes_scale_invariancezDTestOrthogonalProcrustes.test_orthogonal_procrustes_scale_invariance/   s    ii##D)1q 	/AZZ		!Q0FZZ		!Q0F-ff=IFA99SYYq\2 /!yy16 /G0"**W:M1M17"**W:M1MODAq#Av.//		/r   c                    t         j                  j                  d      }dD ]  \  }}|j                  ||      }|j                  ||      }||j	                         t        |      f}||j	                         t        |      f}t        ||      \  }}	|j                  |      }
t        ||      D ]1  \  }}t        ||      \  }}	|j                  |      }t        ||
       3  y )Nr   )   r&   r(   )r&   rI   )
r   r   r   r   tolistr   r   dotr   r   )r!   r"   r3   r4   A_arrB_arrAsBsR_arrrB   AR_arrr   r#   rE   ARs                  r   +test_orthogonal_procrustes_array_conversionzDTestOrthogonalProcrustes.test_orthogonal_procrustes_array_conversion<   s    ii##D), 
	,DAqIIaOEIIaOE7B7B,UE:HE1YYu%FB ,1,Q21YYq\F+,
	,r   c           	         t         j                  j                  d      }dD ]  \  }}|j                  |j	                  ||            }|j                  |j	                  ||            }|j
                  j                  |j                  |z         \  }}t        |j
                  j                  |      |j                         ||j                  z  }	t        |	|      \  }
}t        |j
                  j                  |
      |
j                         t        |	|
z  |       |	d|j                  |j	                  ||            z  z   }t        ||      \  }}t        |j
                  j                  |      |j                         ||
z  }||z  }|j
                  j                  ||z
  d      }|j
                  j                  ||z
  d      }|j                  ||k        rJ  y )Nr   rH   g{Gz?fro)ord)r   r   r   r   r   linalgeighTr
   invr   matrix_normall)r!   r   r"   r3   r4   r#   XwVr   rE   rB   A_perturbedR_primenaive_approxoptim_approxnaive_approx_erroroptim_approx_errors                     r   test_orthogonal_procrustesz3TestOrthogonalProcrustes.test_orthogonal_procrustesK   s   ii##D), 	CDAq

399Q?+A 

399Q?+A99>>!##'*DAqBIIMM!,acc2ACCA(A.DAqBIIMM!,acc2AE1%dRZZ		!Q%@@@K /{A>JGQBIIMM'2GII>&?L&0L!#!6!6|a7GU!6!S!#!6!6|a7GU!6!S66,/AABBB9	Cr   c                 v   |j                  ddgddgddgddgg|j                        }|j                  ddgddgddgddgg|j                        }t        ||      \  }}t        ||      \  }}t        ||      \  }}	|	|j                  j                  |      dz  z  }
|
|z  |z  |z   }t        ||d	
       y )Nr   r)   dtyper/   r      :0yE>atolr   float64r   r   rW   r[   r
   )r!   r   r?   r@   r   A_mur#   B_murE   rB   scaleB_approxs               r   (test_orthogonal_procrustes_exact_examplezATestOrthogonalProcrustes.test_orthogonal_procrustes_exact_examplek   s     b!Wr1gAwQ@

SaVaVaWq!f=RZZPFB'4FB'4$Q*1BII))!,a//19q=4'&t4r   c                    |j                  ddgddgddgddgg|j                        }|j                  ddgddgdd	gd
dgg|j                        }t        ||      \  }}t        ||      \  }}t        ||      \  }}	|	|j                  j                  |      dz  z  }
|
|z  |z  |z   }|j                  ddgddgddgddgg|j                        }t        ||d       |j                  d|j                        d   }|j                  j                  ||z
        |j                  j                  |      z  dz  }t        ||       t        ||      \  }}	|	|j                  j                  |      dz  z  }
|
|z  |z  |z   }|j                  j                  ||z
        |j                  j                  |      z  dz  }t        ||       y )Nrh   r   ri   r)   rj   (   r/   r   irl      ii   rm   rn   g? rp   )r!   r   r?   r@   r   rr   r#   rs   rE   rB   rt   ru   expectedexpected_disparityAB_disparityA_approxBA_disparitys                    r   ,test_orthogonal_procrustes_stretched_examplezETestOrthogonalProcrustes.test_orthogonal_procrustes_stretched_example   s   b!Wr1gAwQ@

SaWq!fq#hA?rzzRFB'4FB'4$Q*1BII))!,a//19q=4'::2wa1c(RGDBJJ:W(6ZZ(:"**ZMbQ		--h.?@))//23567&89$Q*1BII))!,a//19q=4'		--h.?@))//23567&89r   c                    |j                  ddgddgddgddgg|j                        }|j                  ddgddgddgddgg|j                        }|j                  d	d
gd	dgd	dgddgg|j                        }t        ||      \  }}t        ||      \  }}t        ||      \  }	}
|
|j                  j                  |      dz  z  }||z  |	z  |z   }t        ||       t        ||j                  j                  |      z  |       y )Nr&   ri   ir)   rj   r/   r   gCuRg'a?gCuR?gT6ٿgT6?rp   )r!   r   r?   r@   B_standardizedr   rr   r#   rs   rE   rB   rt   ru   s                r   (test_orthogonal_procrustes_skbio_examplezATestOrthogonalProcrustes.test_orthogonal_procrustes_skbio_example   s0   " aWq"g2wB@

SaVaVaVaV<BJJOk9%=&1:%>&1;%?&0+%>%@ HJzz $ S FB'4FB'4$Q*1BII))!,a//19q=4'&)BII11!44nEr   c                     |j                  d      }t        ||      \  }}t        ||j                  d             |j                  d      }t        ||      \  }}t        ||j                  d             y )N)r   r   )r   r   r   )emptyr   r
   eye)r!   r   r+   rrB   s        r   
test_emptyz#TestOrthogonalProcrustes.test_empty   sc    HHV$Q*1288F+,HHV$Q*1266!9%r   shape)r&   rl   )rl   rl   )rl   r&   c                    |\  }}t         j                  j                  d      }|j                  |j                  |      |j                  |      dz  z         }|j                  |j                  ||f      |j                  ||f      dz  z         }|j                  j                  |      \  }}||z  }	t        ||	      \  }
}t        |
|j                  |
      j                  z  |j                  ||j                        d       t        ||z  |	       |dk7  rt        |
|       |j                  j                  |j                  |      j                  |	z        \  }}}t        ||j                  |             y )Nl   sIHb$y              ?rj   g+=rn   r   )r   r   default_rngr   rW   qrr   r
   conjrY   r   
complex128svdsum)r!   r   r   r3   r4   r"   r   Q_r#   rE   rt   rB   s                r   test_unitaryz%TestOrthogonalProcrustes.test_unitary   s3    1ii##L1JJszz%(3::e+<r+AABJJszz1a&)CJJ1v,>,CCDyy||A1E(A.5BGGAJLL("&&"--&*HuUAq!F?Aq!))--
q 011arvvay)r   N)__name__
__module____qualname__r$   r-   r:   rF   r   rS   rf   rv   r   r   r   pytestmarkparametrizer   r{   r   r   r   r      sq    ?C-/ , ,C@5.:.F>& [[W&>?* @*r   r   )	itertoolsr   r   numpyr   r   numpy.testingr   r   r   scipy.linalgr   scipy.sparse._sputilsr   scipy._lib._array_apir	   r
   scipy.conftestr   r   r   r{   r   r   <module>r      sG    +   ) * . ( D . ()* * **r   