o
    h                     @   s   d dl mZmZ 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mZmZ d dlmZ d dlmZ dd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zej d g d!d"d# Z!dS )$    )productpermutationsN)assert_array_lessassert_allclose)raises)inveighnormsvd)orthogonal_procrustes)matrixc                  C   s:   t jd} | ddd}| ddd}ttt|| d S )N           nprandomRandomStaterandnassert_raises
ValueErrorr   rngAB r   V/var/www/vscode/kcb/lib/python3.10/site-packages/scipy/linalg/tests/test_procrustes.py)test_orthogonal_procrustes_ndim_too_large   s   r   c                  C   s2   t jd} | d}| d}ttt|| d S )Nr   r   r   r   r   r   r   )test_orthogonal_procrustes_ndim_too_small   s   

r   c                  C   sJ   t jd} d}t|dD ]\}}| j| }| j| }ttt|| qd S )Nr   ))r   r   )r   r   r   r   r   r      )r   r   r   r   r   r   r   r   )r   shapesabr   r   r   r   r   )test_orthogonal_procrustes_shape_mismatch   s   

r&   c            
      C   s   t jd} d\}}| ||}| ||}t jt j t jfD ])}| }||d< | }||d< ||f||f||ffD ]\}}	ttt	||	 q<qd S )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   r   r   r   0test_orthogonal_procrustes_checkfinite_exception$   s   r2   c                  C   s   t jd} d\}}tdD ];}| ||}| ||}t||\}}t | dD ]}t | dD ]}	t|| ||	 \}
}t|
| q5q+qd S )Nr   r    r   )r   r   r   ranger   r   squarer   )r   r+   r,   iA_origB_origR_origsA_scaleB_scaleRr   r   r   +test_orthogonal_procrustes_scale_invariance2   s   r=   c                  C   s   t jd} dD ]I\}}| ||}| ||}|| t|f}|| t|f}t||\}}||}	t||D ]\}
}t|
|\}}||}t	||	 q;qd S )Nr   )   r   r!   )r   r?   )
r   r   r   r   tolistr   r   dotr   r   )r   r+   r,   A_arrB_arrAsBsR_arrr9   AR_arrr   r   r<   ARr   r   r   +test_orthogonal_procrustes_array_conversion?   s   

rI   c                  C   s  t jd} dD ]w\}}| ||}| ||}t|j| \}}tt||j t ||j}t	||\}}	tt||j t||| |d| ||  }
t	|
|\}}	tt||j |
|}|
|}t
|| dd}t
|| dd}t|| qd S )Nr   r>   g{Gz?fro)ord)r   r   r   r   r   Tr   r   rA   r   r	   r   )r   r+   r,   r   XwVr   r<   r9   A_perturbedR_primenaive_approxoptim_approxnaive_approx_erroroptim_approx_errorr   r   r   test_orthogonal_procrustesN   s&   

rV   c                 C   s   | j dd}| | |fS )Nr   )axis)mean)r   mur   r   r   	_centeredo   s   rZ   c            
      C   s   t jddgddgddgddggtd} t jddgddgddgddggtd}t| \}}t|\}}t||\}}|t t| }|t || | }	t|	|d	d
 d S )Nr   r"   dtyper'   r   r   :0yE>atol	r   arrayfloatrZ   r   r4   r	   rA   r   )
r6   r7   r   A_mur   B_mur<   r9   scaleB_approxr   r   r   (test_orthogonal_procrustes_exact_examplet   s   &&ri   c                  C   sP  t jddgddgddgddggtd} t jddgddgdd	gd
dggtd}t| \}}t|\}}t||\}}|t t| }|t || | }	t jddgddgddgddggtd}
t|	|
dd d}t t|	| t| }t|| t||\}}|t t| }|t || | }t t||  t| }t|| d S )Nr[   r   r\   r"   r]   (   r'   r   ir      ii   r_   r`   g?rb   )r6   r7   r   re   r   rf   r<   r9   rg   rh   expectedexpected_disparityAB_disparityA_approxBA_disparityr   r   r   ,test_orthogonal_procrustes_stretched_example   s"   &&&
rr   c                  C   s   t jddgddgddgddggtd} t jddgddgddgddggtd}t d	d
gd	dgd	dgddgg}t| \}}t|\}}t||\}}|t t| }	|	t || | }
t|
| t|t| | d S )Nr   r\   ir"   r]   r'   r   gCuRg'a?gCuR?gT6ٿgT6?rb   )r6   r7   B_standardizedr   re   r   rf   r<   r9   rg   rh   r   r   r   (test_orthogonal_procrustes_skbio_example   s   &&
ru   c                  C   sT   t d} t| | \}}t|t d t d} t| | \}}t|t d d S )N)r   r   )r   r   r   )r   emptyr   r   identity)r$   rr9   r   r   r   
test_empty   s   

ry   shape)r   r   )r   r   )r   r   c                 C   s   | \}}t jd}|| || d  }|||f|||fd  }t j|\}}|| }t||\}}	t|| j t 	|dd t|| | | dkrXt|| t
| j| \}}
}t|	t |
 d S )Nl   sIHb$y              ?g+=r`   r{   )r   r   default_rnglinalgqrr   r   conjrL   eyer
   sum)rz   r+   r,   r   r   Q_r   r<   rg   r9   r   r   r   test_unitary   s    
r   )"	itertoolsr   r   numpyr   pytestnumpy.testingr   r   r   r   scipy.linalgr   r   r	   r
   r   scipy.sparse._sputilsr   r   r   r&   r2   r=   rI   rV   rZ   ri   rr   ru   ry   markparametrizer   r   r   r   r   <module>   s,    	!!
