U
    »mœd(—  ã                   @   sH  d Z ddlZddlZddlZddlmZmZmZmZ ddl	m
Z
mZmZmZmZmZ ddlZddlZddlmZmZmZmZmZmZmZmZmZmZ ddlmZ ddlZddlm Z  dd	„ Z!G d
d„ dƒZ"G dd„ dƒZ#G dd„ dƒZ$G dd„ dƒZ%G dd„ dƒZ&G dd„ dƒZ'dd„ Z(dd„ Z)dd„ Z*G dd„ dƒZ+G dd„ dƒZ,dS ) z, Test functions for linalg.matfuncs module

é    N)ÚarrayÚidentityÚdotÚsqrt)Úassert_array_almost_equalÚassert_allcloseÚassert_Úassert_array_lessÚassert_array_equalÚassert_warns)
ÚfunmÚsignmÚlogmÚsqrtmÚfractional_matrix_powerÚexpmÚexpm_frechetÚ	expm_condÚnormÚ
khatri_rao)Ú_matfuncs_inv_ssq)Úminimizec                  C   s:   t jddddgddddgddddgddddggtd�} | S )aW  
    Return the test matrix from Experiment (1) of [1]_.

    References
    ----------
    .. [1] Awad H. Al-Mohy and Nicholas J. Higham (2012)
           "Improved Inverse Scaling and Squaring Algorithms
           for the Matrix Logarithm."
           SIAM Journal on Scientific Computing, 34 (4). C152-C169.
           ISSN 1095-7197

    g3d’‘³Ô?g     LÝ@r   gRal!ÈAÓ?g“©‚QI�Ô?gÝ^Ò­Ó?©Údtype)Únpr   Úfloat)ÚA© r   úY/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scipy/linalg/tests/test_matfuncs.pyÚ%_get_al_mohy_higham_2012_experiment_1   s    



üür   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú	TestSignMc              
   C   sž   t dddddgdddd	d
gddddd
gddddd
gdddddggƒ}t dddddgdddddgdd d!d"d gd#d$d%d&d$gd'd(d)d*d(ggƒ}t|ƒ}t||ƒ d S )+Nç333333=@ç3333338Àç     `Q@çfffffæH@ç      @çffffff"ÀçÍÌÌÌÌÌ@ç      2ÀçÍÌÌÌÌÌ0Àç       Àç      $Àç      @ç      4Àç333333#Àç333333#@ç     €9ÀçÍÌÌÌÌÌ.Àçš™™™™™#@ç333333Àç      2@ç3333332@ç       @gŸ´ªæ'@gÀ'RqöÀgÂ�¤ƒy¢.@g�¼eÚ@§5@g@¢èÈ½Àg˜UÐ›'êß?gëò9¹×\Àgçœ+Œ%¿ÀgR¸…ëQÀgìQ¸…ëá?g®Gáz®ÀgffffffÀg¥×¨#Àg´w?Ã®ð?gÀk#àeÀgC,î�NÀgà®ý¡@g4Õ2ì
à¿gÆF(£@gcÔsÚ@@)r   r   r   )ÚselfÚaÚcrÚrr   r   r   Ú	test_nils0   s    üüzTestSignM.test_nilsc                 C   s@   t ddddgddddgddddgddddggƒ}t|dd� d S )Nç        é   r   F©Údisp©r   r   ©r7   r8   r   r   r   Útest_defective1>   s    0zTestSignM.test_defective1c              
   C   sT   t dddddgdddd	d
gddddd
gddddd
gdddddgfƒ}t|dd� d S )Nr!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   Fr>   r@   rA   r   r   r   Útest_defective2C   s    ûzTestSignM.test_defective2c                 C   sˆ   t dddddddgdddddddgdddddddgdddddddgdddddddgdddddddgdddddddggƒ}t|d	d
� d S )Nr*   ç      9@r<   ç      Àç      $@ç      @r6   ç      .@Fr>   r@   rA   r   r   r   Útest_defective3M   s    úzTestSignM.test_defective3N)Ú__name__Ú
__module__Ú__qualname__r;   rB   rC   rI   r   r   r   r   r    .   s   
r    c                   @   sd   e Z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dS )ÚTestLogMc                 C   sœ   t dddddddgdddddddgdddddddgdddddddgdddddddgdddddddgdddddddggƒ}td	ƒd
 d | }t|dd� d S )Nr*   rD   r<   rE   rF   rG   r6   rH   é   gÍÌÌÌÌÌ@y                Fr>   )r   r   r   )r7   r8   Úmr   r   r   r;   [   s    úzTestLogM.test_nilsc                 C   s2   t ƒ }t|dd�\}}t|ƒ}t||ddd� d S )NFr>   g-Cëâ6
?ç›+¡†›„=©ÚrtolÚatol)r   r   r   r   )r7   r   ÚA_logmÚinfoÚA_round_tripr   r   r   Ú*test_al_mohy_higham_2012_experiment_1_logmg   s    z3TestLogM.test_al_mohy_higham_2012_experiment_1_logmc                 C   s>   t ƒ }t|tjdd�\}}t|ƒ}ttj||ddd� ƒ d S )NFr>   çñhãˆµøä>rP   rQ   )r   r   r   Úlogr   r   Zallclose)r7   r   Z
A_funm_logrU   rV   r   r   r   Ú.test_al_mohy_higham_2012_experiment_1_funm_logo   s    z7TestLogM.test_al_mohy_higham_2012_experiment_1_funm_logc                 C   s¬   t j d¡ tddƒD ]�}t j ||¡}t  ddd¡D ]n}|| }t j |¡}d ||¡}t	|dd	�\}}| 
|¡}	t|	|ƒ t|dd	�\}
}t|
ƒ}t|||d
� q6qd S )NéÒ  r=   é   éüÿÿÿé   é	   zM:{0} eivals:{1}Fr>   )Úerr_msg)r   ÚrandomÚseedÚrangeÚrandnÚlogspaceÚlinalgÚeigvalsÚformatr   r   r   r   r   )r7   ÚnÚ
M_unscaledÚscaleÚMÚWr`   ÚM_sqrtmrU   ÚM_sqrtm_round_tripÚM_logmZM_logm_round_tripr   r   r   Útest_round_trip_random_floatw   s    

z%TestLogM.test_round_trip_random_floatc                 C   s~   t j d¡ tddƒD ]b}t j ||¡dt j ||¡  }t  ddd¡D ].}|| }t|dd	�\}}t|ƒ}t||ƒ qHqd S ©
Nr[   r=   r\   ù              ð?r]   r^   r_   Fr>   )	r   ra   rb   rc   rd   re   r   r   r   )r7   ri   rj   rk   rl   rp   rU   ÚM_round_tripr   r   r   Útest_round_trip_random_complexŒ   s     z'TestLogM.test_round_trip_random_complexc                 C   sú   d}ddgddggddgddggddgddggddgddggfD ]´}t j |¡}ttdd„ |D ƒƒ ƒ tj|td�}t|d	d
�\}}t|j	j
|kƒ tj|td�}t|d	d
�\}}t|j	j
|kƒ tj|td� }t|d	d
�\}}t|j	j
|kƒ q@d S )N©ÚFÚDÚGr=   r   é   é   c                 s   s   | ]}|j p|jd k V  qdS ©r   N©ÚimagÚreal©Ú.0Úwr   r   r   Ú	<genexpr>£   s     zFTestLogM.test_logm_type_preservation_and_conversion.<locals>.<genexpr>r   Fr>   )Úscipyrf   rg   r   Úanyr   r   r   r   r   ÚcharÚcomplex)r7   Úcomplex_dtype_charsÚmatrix_as_listrm   r   rT   rU   r   r   r   Ú*test_logm_type_preservation_and_conversion–   s"    üz3TestLogM.test_logm_type_preservation_and_conversionc                 C   s’   dddgdddgdddgg}t tfD ]h}tj||d�}tj |¡}tdt |j	¡ 
¡ k ƒ t|dd�\}}tt |jtj¡ƒ tt|ƒ|ƒ q$d S )Nr=   rz   r   ç{®Gáz„?Fr>   )r   r‡   r   r   r„   rf   rg   r   Úabsoluter~   Úsumr   Ú
issubdtyper   Zinexactr   r   )r7   rl   ÚdtÚXr‚   ÚYrU   r   r   r   Útest_complex_spectrum_real_logm´   s    z(TestLogM.test_complex_spectrum_real_logmc                 C   sj   ddgddggddgddggfD ]D}t tfD ]6}tj||d�}t|dd�\}}tt |jtj¡ƒ q,q d S )Nr=   r   éÿÿÿÿr   Fr>   )	r   r‡   r   r   r   r   rŽ   r   Zcomplexfloating)r7   rl   r�   r   rT   rU   r   r   r   Útest_real_mixed_sign_spectrumÀ   s    þz&TestLogM.test_real_mixed_sign_spectrumc                 C   sv   t  ddgddgg¡}t  ddgddgg¡}||j||jfD ]4}tj}t|t|dd�\}}t|ƒ}t	||dd� q<d S )Nr   rs   r=   Fr>   rP   ©rS   )
r   r   ZasarrayÚTr   ZLogmExactlySingularWarningr   r   r   r   )r7   r   ÚBrl   Úexpected_warningÚLrU   ÚEr   r   r   Útest_exactly_singularË   s    zTestLogM.test_exactly_singularc                 C   sB   t  dgg¡}tj}t|t|dd�\}}t|ƒ}t||dd� d S )Ng0Žä.ÿ++Fr>   rP   r•   )r   r   r   ZLogmNearlySingularWarningr   r   r   r   )r7   rl   r˜   r™   rU   rš   r   r   r   Útest_nearly_singularÔ   s
    zTestLogM.test_nearly_singularc                 C   s  ddgddgg}dt jd gt j d dgg}tt|ƒ|dd� tt|ƒ|dd� ddgdd	gg}dt j d d
t j gdd	t j d gg}tt|ƒ|dd� tt|ƒ|dd� ddgdd	gg}dt j d dgdd	t j d gg}tt|ƒ|dd� tt|ƒ|dd� d S )Nr   r=   r“   ç      à?rP   r•   rs   r^   y       €      ð¿rz   )r   Úpir   r   r   )r7   rš   r™   r   r   r   Ú&test_opposite_sign_complex_eigenvaluesÛ   s    *$z/TestLogM.test_opposite_sign_complex_eigenvaluesN)rJ   rK   rL   r;   rW   rZ   rq   ru   rŠ   r’   r”   r›   rœ   rŸ   r   r   r   r   rM   Y   s   
	rM   c                   @   s¬   e Z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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 )*Ú	TestSqrtMc                 C   sn   t j d¡ tddƒD ]R}t j ||¡}t  ddd¡D ]0}|| }t|dd�\}}| |¡}t||ƒ q6qd S )	Nr[   r=   r\   r]   r^   r_   Fr>   ©	r   ra   rb   rc   rd   re   r   r   r   ©r7   ri   rj   rk   rl   rn   rU   ro   r   r   r   rq   ì   s    
z&TestSqrtM.test_round_trip_random_floatc                 C   s€   t j d¡ tddƒD ]d}t j ||¡dt j ||¡  }t  ddd¡D ]0}|| }t|dd	�\}}| |¡}t||ƒ qHqd S rr   r¡   r¢   r   r   r   ru   ö   s     
z(TestSqrtM.test_round_trip_random_complexc                 C   sÎ   d}t |ƒ}tddddgd|ddgdd|dgddddggƒ}tddddgd|ddgdd|dgddddggƒ}|jd }tt||ƒ|ƒ t|d|d�d }tt||ƒ|ƒ t|ddd�d }tt||ƒ|ƒ d S )	Ng       ?ç      ð?r   r=   r�   F©r?   Ú	blocksizerz   )r   r   Úshaper   r   r   )r7   ÚeÚser8   Úsari   Zesar   r   r   Útest_bad   s$    


ý


ý
zTestSqrtM.test_badc                 C   s  d}ddgddggddgddggddgddggddgddggddgddggfD ]´}t j |¡}ttdd„ |D ƒƒ ƒ tj|td�}t|d	d
�\}}t|j	j
|kƒ tj|td�}t|d	d
�\}}t|j	j
|kƒ tj|td� }t|d	d
�\}}t|j	j
|kƒ qNd S )Nrv   r=   r   rz   r{   c                 s   s   | ]}|j p|jd k V  qdS r|   r}   r€   r   r   r   rƒ   #  s     zHTestSqrtM.test_sqrtm_type_preservation_and_conversion.<locals>.<genexpr>r   Fr>   )r„   rf   rg   r   r…   r   r   r   r   r   r†   r‡   ©r7   rˆ   r‰   rm   r   ÚA_sqrtmrU   r   r   r   Ú+test_sqrtm_type_preservation_and_conversion  s$    ûz5TestSqrtM.test_sqrtm_type_preservation_and_conversionc                 C   sÆ   d}ddgddggddgddggdddgdddgdddggfD ]‚}t j |¡}ttdd„ |D ƒƒƒ tj|td�}t|dd	�\}}t|j	j
|kƒ tj|td�}t|dd	�\}}t|j	j
|kƒ q>d S )
Nrv   r=   r   r“   c                 s   s   | ]}|j p|jd k V  qdS r|   r}   r€   r   r   r   rƒ   =  s     zVTestSqrtM.test_sqrtm_type_conversion_mixed_sign_or_complex_spectrum.<locals>.<genexpr>r   Fr>   )r„   rf   rg   r   r…   r   r   r‡   r   r   r†   r   r«   r   r   r   Ú9test_sqrtm_type_conversion_mixed_sign_or_complex_spectrum4  s    ýzCTestSqrtM.test_sqrtm_type_conversion_mixed_sign_or_complex_spectrumc                 C   s’   t j d¡ tddƒD ]v}t j ||¡dt j ||¡  }t|d|d�\}}t|t j 	|d¡ƒ tddƒD ] }t|d|d�\}}t||ƒ qjqd S )	Nr[   r=   é   rs   Fr¤   rz   é
   )
r   ra   rb   rc   Úrandrd   r   r   rf   Úmatrix_power)r7   ri   r   ZA_sqrtm_defaultrU   r¥   ZA_sqrtm_newr   r   r   Útest_blocksizesI  s     zTestSqrtM.test_blocksizesc                 C   sH   t ƒ }t|dd�\}}| |¡}t||dd� tt |¡t |¡ƒ d S )NFr>   rX   ©rR   )r   r   r   r   r   Útril)r7   r   r¬   rU   rV   r   r   r   Ú%test_al_mohy_higham_2012_experiment_1T  s
    
z/TestSqrtM.test_al_mohy_higham_2012_experiment_1c              	   C   sj   t tfD ]\}tjddddgddddgddddgddddgg|d�}t|dd�\}}tt |¡ ¡ ƒ qd S )Nr   r{   r   Fr>   )Úintr   r   r   r   r   ÚisnanÚall)r7   r�   r   r¬   rU   r   r   r   Útest_strict_upper_triangular\  s    



üüz&TestSqrtM.test_strict_upper_triangularc                 C   s�   t tfD ]‚}tjdddgdddgdddgg|d�}tjdddgdddgdddgg|d�}t|| |¡ƒ t|dd�\}}tt |¡ 	¡ ƒ qd S )Nr   r=   r   Fr>   )
r·   r   r   r   r
   r   r   r   r¸   r¹   )r7   r�   r   r—   ZB_sqrtmrU   r   r   r   Útest_weird_matrixg  s$    ýýýýzTestSqrtM.test_weird_matrixc                 C   s:   t j d¡ t j dd¡}t|dd�}t| |¡|ƒ d S )Nr[   r{   Tr>   )r   ra   rb   r±   r   r   r   )r7   r   r—   r   r   r   Ú	test_dispx  s    zTestSqrtM.test_dispc                 C   sL   ddgddgg}ddgddgg}t t ||¡|dd	� t t|ƒ|dd	� d S )
Nù               @r^   r   ù       €       Àù      ð?      ð?rz   ù      ð?      ð¿rP   r•   )r   r   r   r   ©r7   rl   ÚRr   r   r   rŸ     s    z0TestSqrtM.test_opposite_sign_complex_eigenvaluesc              
   C   s    t  ddddgddddgddddgddddgg¡}t  tdƒddtdƒgddddgddddgtdƒddtdƒgg¡}tt  ||¡|dd� tt|ƒ|dd� d S )Nr=   r   r�   rP   r•   )r   r   r   r   r   r   rÁ   r   r   r   Útest_gh4866…  s    


ý

ýzTestSqrtM.test_gh4866c                 C   sP   t  dddg¡}t  tdƒddg¡}tt  ||¡|dd� tt|ƒ|dd� d S )Nrz   r=   r   rP   r•   )r   Zdiagr   r   r   r   rÁ   r   r   r   Útest_gh5336‘  s    zTestSqrtM.test_gh5336c                 C   s@   t  d¡}t  d¡}tt  ||¡|dd� tt|ƒ|dd� d S )N)rz   rz   rP   r•   )r   Úzerosr   r   r   rÁ   r   r   r   Útest_gh7839—  s    

zTestSqrtM.test_gh7839c                 C   s”   t jdt jd�}t|ƒjt jks$t‚t jdt jd�}t|ƒjt jksHt‚t jdt jd�}t|ƒjt j	kslt‚t jdt j
d�}t|ƒjt jks�t‚d S ©N©r°   r°   r   )r   rÅ   Zuint8r   r   Úfloat16ÚAssertionErrorZuint16Zuint32Úfloat32Zuint64Úfloat64©r7   rl   r   r   r   Ú-test_data_size_preservation_uint_in_float_out�  s    z7TestSqrtM.test_data_size_preservation_uint_in_float_outc                 C   s”   t jdt jd�}t|ƒjt jks$t‚t jdt jd�}t|ƒjt jksHt‚t jdt jd�}t|ƒjt j	kslt‚t jdt j
d�}t|ƒjt jks�t‚d S rÇ   )r   rÅ   Úint8r   r   rÉ   rÊ   Úint16Úint32rË   Úint64rÌ   rÍ   r   r   r   Ú,test_data_size_preservation_int_in_float_out¨  s    z6TestSqrtM.test_data_size_preservation_int_in_float_outc                 C   sÄ   t jddgddggt jd�}t|ƒjt jks0t‚t jddgddggt jd�}t|ƒjt jks`t‚t jddgddggt jd�}t|ƒjt jks�t‚t jddgddggt j	d�}t|ƒjt j
ksÀt‚d S )Nrz   r^   r   éþÿÿÿr   )r   r   rÏ   r   r   Ú	complex64rÊ   rÐ   rÑ   rÒ   Ú
complex128rÍ   r   r   r   Ú+test_data_size_preservation_int_in_comp_out³  s    z5TestSqrtM.test_data_size_preservation_int_in_comp_outc                 C   sž   t jdt jd�}t|ƒjt jks$t‚t jdt jd�}t|ƒjt jksHt‚t jdt jd�}t|ƒjt jkslt‚tt dƒršt jdt j	d�}t|ƒjt j	ksšt‚d S )NrÈ   r   Úfloat128)
r   rÅ   rÉ   r   r   rÊ   rË   rÌ   ÚhasattrrØ   rÍ   r   r   r   Ú.test_data_size_preservation_float_in_float_out¿  s    
z8TestSqrtM.test_data_size_preservation_float_in_float_outc                 C   sØ   t jddgddggt jd�}t|ƒjt jks0t‚t jddgddggt jd�}t|ƒjt jks`t‚t jddgddggt jd�}t|ƒjt j	ks�t‚t
t dƒrÔt
t dƒrÔt jddgddggt jd�}t|ƒjt jksÔt‚d S )Nrz   r^   r   rÔ   r   rØ   Ú
complex256)r   r   rÉ   r   r   rÕ   rÊ   rË   rÌ   rÖ   rÙ   rØ   rÛ   rÍ   r   r   r   Ú-test_data_size_preservation_float_in_comp_outÊ  s    z7TestSqrtM.test_data_size_preservation_float_in_comp_outc                 C   sž   t jddgddggt jd�}t|ƒjt jks0t‚tt dƒršt jddgddggt jd�}t|ƒjt jksjt‚t jddgddggt jd�}t|ƒjt jksšt‚d S )Nr½   r^   r   r¾   r   rÛ   )	r   r   rÕ   r   r   rÖ   rÊ   rÙ   rÛ   rÍ   r   r   r   Ú,test_data_size_preservation_comp_in_comp_outÖ  s    
z6TestSqrtM.test_data_size_preservation_comp_in_comp_outN)rJ   rK   rL   rq   ru   rª   r­   r®   r³   r¶   rº   r»   r¼   rŸ   rÃ   rÄ   rÆ   rÎ   rÓ   r×   rÚ   rÜ   rÝ   r   r   r   r   r    ë   s(   

r    c                   @   sj   e Z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jdd�dd„ ƒZdd„ ZdS )ÚTestFractionalMatrixPowerc                 C   s’   t j d¡ tddƒD ]v}tddƒD ]f}t j ||¡dt j ||¡  }t  ddd¡D ]2}|| }t|d| ƒ}t j ||¡}t	||ƒ qVq$qd S )Nr[   r=   é   rs   r]   r^   r_   ©
r   ra   rb   rc   rd   re   r   rf   r²   r   ©r7   Úpri   rj   rk   rl   ZM_rootrt   r   r   r   ru   á  s     z8TestFractionalMatrixPower.test_round_trip_random_complexc                 C   s€   t j d¡ tddƒD ]d}tddƒD ]T}t j ||¡}t  ddd¡D ]2}|| }t|d| ƒ}t j ||¡}t	||ƒ qDq$qd S )Nr[   r=   rß   r]   r^   r_   rà   rá   r   r   r   rq   ì  s    z6TestFractionalMatrixPower.test_round_trip_random_floatc                 C   s®   t j d¡ dD ]˜}tdƒD ]Š}t j ||¡dt j ||¡  }t|dƒ}t j |d¡}t||ƒ t|dƒ}t j |d¡}t||ƒ t|d	ƒ}t j |d
¡}t||ƒ qqd S )Nr[   )rz   r{   rß   r°   rs   çš™™™™™É?rß   gš™™™™™Àiåÿÿÿgffffff@é   )	r   ra   rb   rc   rd   r   rf   r²   r   )r7   ri   Úirl   ZM_one_fifthrt   r�   r‘   r   r   r   Ú(test_larger_abs_fractional_matrix_powersû  s     




zBTestFractionalMatrixPower.test_larger_abs_fractional_matrix_powersc                 C   s°   t j d¡ d}t|ƒD ]’}t dd¡}t j ¡ }t  t dd¡¡}t j ||¡}t d¡rr|dt j ||¡  }|| }t||ƒ}t	|dd	�\}}	t
|| ƒ}
t||
ƒ qd S )
Nr[   é   r=   rß   r]   )TFrs   Fr>   )r   ra   rb   rc   Ú	randrangerd   ÚexpÚchoicer   r   r   r   )r7   Únsamplesrå   ri   râ   Zmatrix_scaler   ÚA_powerrT   rU   ZA_power_expm_logmr   r   r   Útest_random_matrices_and_powers  s    


z9TestFractionalMatrixPower.test_random_matrices_and_powersc           	      C   s¬   t ƒ }t|tjdd�\}}t|dd�\}}t |d¡}t|dƒ}t||ƒ t	||ƒ t	||ƒ dD ]D}t||ƒ}t|d| ƒ}t	||dd� t	t 
|d¡t 
|d¡ƒ qbd S )NFr>   r�   )r�   g«ªªªªªú?r=   r‹   r´   )r   r   r   r   r   r   Z_remainder_matrix_powerr   r
   r   rµ   )	r7   r   ZA_funm_sqrtrU   r¬   ZA_rem_powerrì   râ   rV   r   r   r   r¶   &  s    




z?TestFractionalMatrixPower.test_al_mohy_higham_2012_experiment_1c                 C   sj   t j d¡ t j d¡dt j d¡  D ]<}tdƒD ].}t ||¡}|t  | ¡ d }t||ƒ q4q(d S )Nr[   r°   rs   rß   r=   )	r   ra   rb   rd   rc   r   Z_briggs_helper_functionZexp2r   )r7   r8   ÚkZ
x_observedZ
x_expectedr   r   r   Útest_briggs_helper_function:  s     z5TestFractionalMatrixPower.test_briggs_helper_functionc                 C   sò   d}ddgddggddgddggddgddggddgddggfD ]¬}t j |¡}ttdd„ |D ƒƒ ƒ dD ]~}tj|td	�}t||ƒ}t|j	j
|kƒ tj|td	�}t||ƒ}t|j	j
|kƒ tj|td	� }t||ƒ}t|j	j
|kƒ qlq@d S )
Nrv   r=   r   rz   r{   c                 s   s   | ]}|j p|jd k V  qdS r|   r}   r€   r   r   r   rƒ   P  s     zRTestFractionalMatrixPower.test_type_preservation_and_conversion.<locals>.<genexpr>©ç333333ÀçÍÌÌÌÌÌì¿rã   gffffff
@r   )r„   rf   rg   r   r…   r   r   r   r   r   r†   r‡   ©r7   rˆ   r‰   rm   râ   r   rì   r   r   r   Ú%test_type_preservation_and_conversionB  s$    ü


z?TestFractionalMatrixPower.test_type_preservation_and_conversionc                 C   sÄ   d}ddgddggddgddggdddgdddgdddggfD ]€}t j |¡}ttdd„ |D ƒƒƒ dD ]T}tj|td�}t||ƒ}t|j	j
|kƒ tj|td�}t||ƒ}t|j	j
|kƒ qhq>d S )	Nrv   r=   r   r“   c                 s   s   | ]}|j p|jd k V  qdS r|   r}   r€   r   r   r   rƒ   n  s     z`TestFractionalMatrixPower.test_type_conversion_mixed_sign_or_complex_spectrum.<locals>.<genexpr>rð   r   )r„   rf   rg   r   r…   r   r   r‡   r   r   r†   r   ró   r   r   r   Ú3test_type_conversion_mixed_sign_or_complex_spectrume  s    ý

zMTestFractionalMatrixPower.test_type_conversion_mixed_sign_or_complex_spectrumzToo unstable across LAPACKs.©Úreasonc                 C   sÀ   ddgddggddgddggddgddggdddgdddgdddggfD ]r}t tfD ]d}tj||d�}dD ] }t||ƒ}tt |¡ ¡ ƒ qjd	D ]&}t||ƒ}t|d| ƒ}t||ƒ q�qTqHd S )
Nr   r=   rz   r{   r\   r“   r   )gffffffæ¿rò   rñ   gÍÌÌÌÌÌô¿)rã   gáz®Gáö?)	r   r‡   r   r   r   r   r¸   r¹   r   )r7   r‰   Znewtyper   râ   rì   rV   r   r   r   Útest_singular~  s    ü

z'TestFractionalMatrixPower.test_singularc                 C   sN   ddgddgg}ddgddgg}t t ||¡|dd	� t t|d
ƒ|dd	� d S )Nr½   r^   r   r¾   r¿   rz   rÀ   rP   r•   r�   )r   r   r   r   rÁ   r   r   r   rŸ   ’  s    z@TestFractionalMatrixPower.test_opposite_sign_complex_eigenvaluesN)rJ   rK   rL   ru   rq   ræ   rí   r¶   rï   rô   rõ   ÚpytestÚmarkZxfailrø   rŸ   r   r   r   r   rÞ   à  s   #
rÞ   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚTestExpMc                 C   s2   t ddgddggƒ}tt|ƒddgddggƒ d S )Nr<   r   r=   )r   r   r   rA   r   r   r   Ú	test_zeroš  s    zTestExpM.test_zeroc                 C   s"   t dƒ}t|t tjgg¡ƒ d S )Nr=   )r   r   r   r   r§   )r7   Úeltr   r   r   Útest_single_eltž  s    zTestExpM.test_single_eltc                 C   s$   t  d¡}t|ƒ}|jdks t‚d S )N©r   r   r   )r   rÅ   r   ÚsizerÊ   )r7   r   Úresultr   r   r   Útest_empty_matrix_input¢  s    
z TestExpM.test_empty_matrix_inputc                 C   sœ   t j}tddgddggƒ}|d d d|  }|d d | }tt|ƒt||g|d |ggƒƒ t| t j¡ƒjjdks|t	‚t| t j
¡ƒjjdks˜t	‚d S )Nr=   r^   rz   rw   Úf)r   r§   r   r   r   ZastyperÕ   r   r†   rÊ   rË   )r7   rš   r8   ZaaZbbr   r   r   Útest_2x2_input¨  s    "zTestExpM.test_2x2_inputc                 C   sx  t j}t jddgddggddgddggddgddggddgddggddgddgggdd	�}t  |d d d
|  |d d | g|d d d | |d d d
|  ggdd|d
   d|d
  d  d|d
  d dd|d
    g|d
 d dd|d
    dd|d
   |d
 d  ggdd|  |d d  dd|  d|d  d  gdd
|  |d d
  dd|  d|d  d  ggdd|d
   d|d  d  dd|d
   d|d  d  gdd|d
   d|d  d  dd|d
   d|d  d  ggdd
|  d| d
  dd
|  d| d
  gdd
|  d| d
  dd
|  d| d
  ggg¡}tt|ƒ|ƒ d S )Nr=   r^   r{   r“   rß   éýÿÿÿr]   rw   )Úorderrz   rN   r¯   r\   éûÿÿÿ)r   r§   r   r   r   )r7   rš   r8   Za_resr   r   r   Útest_nx2x2_input±  s6    üü"&ÿ>6ÿ22ÿ>>ÿ..ÿ÷zTestExpM.test_nx2x2_inputN)rJ   rK   rL   rü   rþ   r  r  r  r   r   r   r   rû   ™  s
   	rû   c                   @   sJ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zejj	ejj
d	d
�dd„ ƒƒZdS )ÚTestExpmFrechetc           	      C   sÔ   t jddddgddddgd	d	ddgd	d	ddggtd
�}t jddgddggtd
�}t jddgddggtd
�}tj |¡}tj |¡d d…dd …f }i ddiddifD ]*}t||f|Ž\}}t||ƒ t||ƒ q¤d S )Nr=   rz   r{   r^   rß   r\   rN   r¯   r   r   ÚmethodÚSPSÚblockEnlarge)r   r   r   r„   rf   r   r   r   )	r7   rl   r   rš   Úexpected_expmÚexpected_frechetÚkwargsÚobserved_expmÚobserved_frechetr   r   r   Útest_expm_frechetË  s4    



üûþýþý
z!TestExpmFrechet.test_expm_frechetc                 C   sJ  t jddddgddddgd	d	ddgd	d	ddggtd
�}t jddgddggtd
�}t jddgddggtd
�}tj |d¡}ddddddddg}t|d d… |dd … ƒ}|D ]š\}}tjjj| }	tjjj| }
d|	|
  }|| }|| }|| }|| }tj 	|¡}tj 	|¡d d…dd …f }t
||ƒ\}}t||ƒ t||ƒ qªd S )Nr=   rz   r{   r^   rß   r\   rN   r¯   r   r   r_   é   é   é   r“   r�   )r   r   r   r„   rf   r   ÚzipZ_expm_frechetZell_table_61r   r   r   )r7   Z
M_originalÚ
A_originalÚ
E_originalÚA_original_norm_1Zselected_m_listZm_neighbor_pairsÚmaÚmbZell_aZell_bÚtarget_norm_1rk   rl   r   rš   r  r  r  r  r   r   r   Útest_small_norm_expm_frechetâ  sH    



üûþýþý
z,TestExpmFrechet.test_small_norm_expm_frechetc              	   C   s  t jjt jjt jjt jjf}d}t|ƒD ]à}t |¡}t d¡}t 	dd¡}|||fd�}|||fd�}t
j |d¡}	||	 }
|
| }|
| }t  t  ||g¡t  t  |¡|g¡g¡}t
j |¡}t
j |¡d |…|d …f }t||ƒ\}}t||dd� t||d	d� q(d S )
Néd   r£   rz   é   ©r   r=   gH¯¼šò×j>r•   gH¯¼šò×z>)r   ra   ÚuniformÚnormalZstandard_cauchyÚexponentialrc   rê   Úexpovariaterè   r„   rf   r   ÚvstackZhstackZ
zeros_liker   r   r   )r7   ZrfuncsZntestsrå   Zrfuncr  ri   r  r  r  rk   r   rš   rl   r  r  r  r  r   r   r   Ú	test_fuzz  s2    ü

þzTestExpmFrechet.test_fuzzc                 C   s~   t jddgddggtd�}t jddgdd	ggtd�}tj |d
¡ t||dd�\}}t||dd�\}}t||ƒ t||ƒ d S )Ng]±Ø‰?ø?gîvÿP÷þ?g¯¾^Ú?guÃ�¨øÎ?r   gîðS,éþ?g�¶·|� @gJ»Ùtõ?g~3µ•Œå?r=   r  ©r
  r  )r   r   r   r„   rf   r   r   r   )r7   r   rš   Úsps_expmÚsps_frechetÚblockEnlarge_expmÚblockEnlarge_frechetr   r   r   Útest_problematic_matrix  s2    þýþý  ÿ
  ÿ

z'TestExpmFrechet.test_problematic_matrixzthis test is deliberately slowrö   c                 C   sd   d}t jj||fd�}t jj||fd�}t||dd�\}}t||dd�\}}t||ƒ t||ƒ d S )Niè  r   r  r'  r  )r   ra   r#  r   r   )r7   ri   r   rš   r(  r)  r*  r+  r   r   r   Útest_medium_matrix0  s      ÿ
  ÿ

z"TestExpmFrechet.test_medium_matrixN)rJ   rK   rL   r  r  r&  r,  rù   rú   ÚslowÚskipr-  r   r   r   r   r	  É  s   !r	  c           
      C   sL   t  || j¡}t|ƒ}|| ||  }t| | ƒ}t|| ƒ||  }	|	 S ©N)r   Úreshaper¦   r   r   )
r   ÚA_normr�   ÚX_normÚepsrâ   Zp_normÚperturbationÚX_primeZscaled_relative_errorr   r   r   Ú_help_expm_cond_search?  s    r7  c                 C   s   | t j |¡t j | ¡  S r0  )r„   rf   r   )r   r—   r   r   r   Ú_normalized_likeH  s    r8  c                 C   s(   | |ƒ}| || ƒ}t || ƒt |ƒ S r0  )r   )r  r   r5  r�   r6  r   r   r   Ú_relative_errorL  s    r9  c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zejjdd„ ƒZ	d	S )
ÚTestExpmConditionNumberc                 C   s@   t j d¡ tddƒD ]$}t j ||¡}t|ƒ}td|ƒ qd S )Nr[   r=   r^   r   )r   ra   rb   rc   rd   r   r	   )r7   ri   r   Úkappar   r   r   Útest_expm_cond_smokeS  s
    z,TestExpmConditionNumber.test_expm_cond_smokec              	   C   sH   t  ddddgddddgddd	d
gddddgg¡}t|ƒ}td|ƒ d S )Ngöá(’ò¿gÙ™BgÝx÷@g  °=ÛðÁg ¾Zd ðBr   gzNÑV7ó¿gðŠà¯…÷@g  2pñÁgá™¥¤T ò¿g?W[±ÎE÷@gT–†!ßò¿gã yÏùhG)r   r   r   r	   )r7   r   r;  r   r   r   Útest_expm_bad_condition_numberZ  s    



üz6TestExpmConditionNumber.test_expm_bad_condition_numberc                 C   s°   t j d¡ t jdddd�D ]$}t  |gg¡}tt|ƒt|ƒƒ qt jdddd�D ]$}t  |gg¡}tt|ƒt|ƒƒ qRt	dƒD ]*}t j 
d	d	¡}tt|ƒt  |¡d
 ƒ q€d S )Né90  r  rß   r  )ÚnumrÔ   rz   r°   r=   rÿ   )r   ra   rb   Zlinspacer   r   r   Úabsre   rc   rd   rŒ   )r7   Úxr   rå   r   r   r   Útest_univariated  s    z'TestExpmConditionNumber.test_univariatec              	   C   sF  t j d¡ d}d}t|ƒD �]"}t j dd¡}t j ||¡}tj |¡}t	|ƒ}tj |¡}t
|ƒ}	t t|||||¡}
t  || ¡}t|
|dd�}|j}|
|ƒ}|tt  ||j¡|ƒ }tt	||ƒ}t|| | ƒ tdƒD ]D}|tt jj|jŽ |ƒ }tt|ƒt|ƒƒ tt	||ƒ}t||ƒ qàt|dd|  | |	 ƒ qd S )	Nr>  rX   r°   rz   rß   zL-BFGS-Br'  r=   )r   ra   rb   rc   Úrandintrd   r„   rf   r   r   r   Ú	functoolsÚpartialr7  Zonesr   rA  r8  r1  r¦   r9  r   r	   )r7   r4  rë   rå   ri   r   r2  r�   r3  r;  r  ÚguessÚoutZxoptZyoptZp_bestZp_best_relerrÚjZp_randZp_rand_relerrr   r   r   Útest_expm_cond_fuzzp  s<        ÿz+TestExpmConditionNumber.test_expm_cond_fuzzN)
rJ   rK   rL   r<  r=  rB  rù   rú   r.  rI  r   r   r   r   r:  R  s
   
r:  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestKhatriRaoc                 C   s~   t tddgddggƒtddgddggƒƒ}t|tdd	gdd
gddgddggƒƒ t t ddg¡t ddg¡ƒ}t|jdƒ d S )Nr=   rz   r{   r^   rß   r\   rN   r¯   é   r  r  é   é   é    )r^   rz   )r   r   r
   r   Úemptyr¦   ©r7   r8   Úbr   r   r   Ú
test_basic™  s    ÿýzTestKhatriRao.test_basicc              	   C   sP   t  t¡�< tdddgdddggƒ}tddgddggƒ}t||ƒ W 5 Q R X d S )Nr=   rz   r{   r^   rß   r\   ©rù   ZraisesÚ
ValueErrorr   r   rP  r   r   r   Útest_number_of_columns_equality¥  s    
ÿÿz-TestKhatriRao.test_number_of_columns_equalityc              	   C   sÌ   t  t¡�, tdddgƒ}tdddgƒ}t||ƒ W 5 Q R X t  t¡�6 tdddgƒ}tdddgdddggƒ}t||ƒ W 5 Q R X t  t¡�6 tdddgddd	ggƒ}tdddgƒ}t||ƒ W 5 Q R X d S )
Nr=   rz   r{   r^   rß   r\   rN   r¯   r_   rS  rP  r   r   r   Útest_to_assure_2d_array­  s$    þþz%TestKhatriRao.test_to_assure_2d_arrayc                    sf   t ddgddggƒ‰ t ddgddggƒ‰tˆ ˆƒ}t ‡ ‡fd	d
„tˆjd ƒD ƒ¡j}t||ƒ d S )Nr=   rz   r{   r^   rß   r\   rN   r¯   c                    s0   g | ](}t  ˆ d d …|f ˆd d …|f ¡‘qS r0  )r   Zkron)r�   rî   ©r8   rQ  r   r   Ú
<listcomp>Ë  s   ÿz@TestKhatriRao.test_equality_of_two_equations.<locals>.<listcomp>)r   r   r   r%  rc   r¦   r–   r
   )r7   Zres1Zres2r   rW  r   Útest_equality_of_two_equationsÆ  s    
ÿ
z,TestKhatriRao.test_equality_of_two_equationsN)rJ   rK   rL   rR  rU  rV  rY  r   r   r   r   rJ  —  s   rJ  )-Ú__doc__ra   rD  Únumpyr   r   r   r   r   Znumpy.testingr   r   r   r	   r
   r   rù   Zscipy.linalgr„   r   r   r   r   r   r   r   r   r   r   r   Zscipy.linalg._expm_frechetZscipy.optimizer   r   r    rM   r    rÞ   rû   r	  r7  r8  r9  r:  rJ  r   r   r   r   Ú<module>   s4    0+  v :0v	E