B
    `e                 @   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 )Ni           )nprandomseedrandnassert_raises
ValueErrorr
   )AB r   Q/home/dcms/DCMS/lib/python3.7/site-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 )Ni  r   )r   r   r   r   r   r   r
   )r   r   r   r   r   )test_orthogonal_procrustes_ndim_too_small   s    r   c              C   sR   t jd d} x<t| dD ].\}}t jj| }t jj| }ttt|| qW d S )Ni  ))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| |}xlt jt j t jfD ]V}| }||d< | }||d< x0||f||f||ffD ]\}}ttt	|| qW qDW d S )Ni  )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\} }xtdD ]}t j| |}t j| |}t||\}}xVt t jdD ]@}x:t t jdD ]$}t|| || \}	}t|	| qxW q`W qW d S )Ni  )r   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    r-   c              C   s   t jd xdD ]\} }t j| |}t j| |}|| t|f}|| t|f}t||\}}||}x8t||D ]*\}	}
t|	|
\}}||}t	|| q~W qW d S )Ni  ))   r   )r   r   )r   r.   )
r   r   r   r   tolistr   r
   dotr   r   )r#   r$   ZA_arrZB_arrZAsZBsZR_arrr+   ZAR_arrr   r   r,   ARr   r   r   +test_orthogonal_procrustes_array_conversion>   s    

r2   c              C   s  t jd xdD ]\} }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W d S )Ni  ))r.   r   )r   r   )r   r.   g{Gz?Zfro)ord)r   r   r   r   r   Tr   r   r0   r
   r	   r   )r#   r$   r   XwVr   r,   r+   ZA_perturbedZR_primeZnaive_approxZoptim_approxZnaive_approx_errorZoptim_approx_errorr   r   r   test_orthogonal_procrustesM   s$    

r8   c             C   s   | j dd}| | |fS )Nr   )Zaxis)Zmean)r   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   )dtyper   r   r   g:0yE>)atol)	r   arrayfloatr:   r
   r'   r	   r0   r   )
r)   r*   r   A_mur   B_mur,   r+   scaleB_approxr   r   r   (test_orthogonal_procrustes_exact_examples   s    &&rE   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   g:0yE>)r>   g?)	r   r?   r@   r:   r
   r'   r	   r0   r   )r)   r*   r   rA   r   rB   r,   r+   rC   rD   expectedZexpected_disparityZAB_disparityZA_approxZBA_disparityr   r   r   ,test_orthogonal_procrustes_stretched_example   s"    &&&
rJ   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?)	r   r?   r@   r:   r
   r'   r	   r0   r   )r)   r*   ZB_standardizedr   rA   r   rB   r,   r+   rC   rD   r   r   r   (test_orthogonal_procrustes_skbio_example   s    &&
rL   )	itertoolsr   r   numpyr   Znumpy.testingr   r   Zpytestr   r   Zscipy.linalgr   r   r	   r
   Zscipy.sparse.sputilsr   r   r   r   r%   r-   r2   r8   r:   rE   rJ   rL   r   r   r   r   <module>   s"   	!