o
    ×?Hhì  ã                   @   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   úb/home/air/sanwanet/gpt-api/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   Ú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{®Gáz„?Ú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 )Néýÿÿÿr   éþÿÿÿr"   ©Údtyper'   r   r   ç:Œ0âŽyE>©Ú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   iØÿÿÿr   é   iîÿÿÿiëÿÿÿé   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\   éüÿÿÿiúÿÿÿr"   r]   r'   r   gCuRãÎÁ¿g”'œ‚aå?gCuRãÎÁ?gä¯ûT6¨Ù¿gä¯ûT6¨Ù?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,    	!!
