o
    i                     @   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   \/home/kim/smarthome/.venv/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   Z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nZA_goodZB_goodZ	bad_valueZA_badZB_badr   r   r   r   r   0test_orthogonal_procrustes_checkfinite_exception$   s   r,   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_origZR_origsZA_scaleZB_scaleRr   r   r   +test_orthogonal_procrustes_scale_invariance2   s   r4   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   r6   )
r   r   r   r   tolistr   r   dotr   r   )r   r*   r+   ZA_arrZB_arrZAsZBsZR_arrr2   ZAR_arrr   r   r3   ARr   r   r   +test_orthogonal_procrustes_array_conversion?   s   

r:   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   r5   g{Gz?Zfro)ord)r   r   r   r   r   Tr   r   r8   r   r	   r   )r   r*   r+   r   XwVr   r3   r2   ZA_perturbedZR_primeZnaive_approxZoptim_approxZnaive_approx_errorZoptim_approx_errorr   r   r   test_orthogonal_procrustesN   s&   

r@   c                 C   s   | j dd}| | |fS )Nr   )Zaxis)mean)r   mur   r   r   	_centeredo   s   rC   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"   Zdtyper&   r   r   :0yE>Zatol	r   arrayfloatrC   r   r.   r	   r8   r   )
r0   r1   r   A_mur   B_mur3   r2   scaleB_approxr   r   r   (test_orthogonal_procrustes_exact_examplet   s   &&rP   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 )NrD   r   rE   r"   rF   (   r&   r   ir      ii   rG   rH   g?rI   )r0   r1   r   rL   r   rM   r3   r2   rN   rO   expectedZexpected_disparityZAB_disparityZA_approxZBA_disparityr   r   r   ,test_orthogonal_procrustes_stretched_example   s"   &&&
rU   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   rE   ir"   rF   r&   r   gCuRg'a?gCuR?gT6ٿgT6?rI   )r0   r1   ZB_standardizedr   rL   r   rM   r3   r2   rN   rO   r   r   r   (test_orthogonal_procrustes_skbio_example   s   &&
rW   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#   rr2   r   r   r   
test_empty   s   

r[   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+=rH   r]   )r   r   Zdefault_rngZlinalgZqrr   r   Zconjr<   eyer
   sum)r\   r*   r+   r   r   Q_r   r3   rN   r2   r   r   r   test_unitary   s    
rb   )"	itertoolsr   r   numpyr   ZpytestZnumpy.testingr   r   r   r   Zscipy.linalgr   r   r	   r
   r   Zscipy.sparse._sputilsr   r   r   r%   r,   r4   r:   r@   rC   rP   rU   rW   r[   markZparametrizerb   r   r   r   r   <module>   s,    	!!
