o
    Ebf                     @   s   d dl mZm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 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S )    )productpermutationsN)assert_array_lessassert_allclose)raises)inveighnorm)orthogonal_procrustes)matrixc                  C   s>   t jd t jddd} t jddd}ttt| | d S )N           nprandomseedrandnassert_raises
ValueErrorr
   AB r   D/usr/lib/python3/dist-packages/scipy/linalg/tests/test_procrustes.py)test_orthogonal_procrustes_ndim_too_large   s   r   c                  C   s6   t jd t jd} t jd}ttt| | d S )Nr   r   r   r   r   r   r   )test_orthogonal_procrustes_ndim_too_small   s   r   c                  C   sN   t jd d} t| dD ]\}}t jj| }t 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
   )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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
   )	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 j| |}t j| |}t||\}}t t jdD ]}t t jdD ]}t|| || \}	}t|	| q9q.qd S )Nr   r   r   )r   r   r   ranger   r
   squarer   )
r(   r)   iA_origB_origZR_origsZA_scaleZB_scaleRr   r   r   +test_orthogonal_procrustes_scale_invariance1   s   r2   c                  C   s   t jd dD ]K\} }t j| |}t j| |}|| t|f}|| t|f}t||\}}||}t||D ]\}	}
t|	|
\}}||}t	|| q=qd S )Nr   )   r   r   )r   r4   )
r   r   r   r   tolistr   r
   dotr   r   )r(   r)   ZA_arrZB_arrZAsZBsZR_arrr0   ZAR_arrr   r   r1   ZARr   r   r   +test_orthogonal_procrustes_array_conversion>   s   

r7   c                  C   s
  t jd dD ]z\} }t j| |}t j||}t|j| \}}tt||j t ||j}t	||\}}tt||j t||| |dt j| |  }	t	|	|\}
}tt|
|
j |	|}|	|
}t
|| dd}t
|| dd}t|| qd S )Nr   r3   g{Gz?Zfro)ord)r   r   r   r   r   Tr   r   r6   r
   r	   r   )r(   r)   r   XwVr   r1   r0   ZA_perturbedZR_primeZnaive_approxZoptim_approxZnaive_approx_errorZoptim_approx_errorr   r   r   test_orthogonal_procrustesM   s&   

r=   c                 C   s   | j dd}| | |fS )Nr   )Zaxis)Zmean)r   Zmur   r   r   	_centeredn   s   r>   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   Zarrayfloatr>   r
   r,   r	   r6   r   )
r.   r/   r   A_mur   B_mur1   r0   scaleB_approxr   r   r   (test_orthogonal_procrustes_exact_examples   s   &&rJ   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    rA   (   r$   r   ir      ii   rB   rC   g?rD   )r.   r/   r   rF   r   rG   r1   r0   rH   rI   ZexpectedZexpected_disparityZAB_disparityZA_approxZBA_disparityr   r   r   ,test_orthogonal_procrustes_stretched_example   s"   &&&
rN   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    rA   r$   r   gCuRg'a?gCuR?gT6ٿgT6?rD   )r.   r/   ZB_standardizedr   rF   r   rG   r1   r0   rH   rI   r   r   r   (test_orthogonal_procrustes_skbio_example   s   &&
rP   )	itertoolsr   r   Znumpyr   Znumpy.testingr   r   Zpytestr   r   Zscipy.linalgr   r   r	   r
   Zscipy.sparse._sputilsr   r   r   r#   r*   r2   r7   r=   r>   rJ   rN   rP   r   r   r   r   <module>   s$    	!