a
    ‡ù»jëŸ  ã                   @   sT  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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)Úpick_pade_structure)Úminimizec                  C   s*   t jg d¢g d¢g d¢g d¢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’‘³Ô?ç     LÝ@r   r   )r   gRal!ÈAÓ?r   r   )r   r   g“©‚QI�Ô?r   )r   r   r   gÝ^Ò­Ó?©Údtype)Únpr   Úfloat)ÚA© r   úFE:\soccer\ml_env\Lib\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   sb   t g d¢g d¢g d¢g d¢g d¢gƒ}t g d¢g d¢g d¢g d	¢g d
¢gƒ}t|ƒ}t||ƒ d S )N©g333333=@g3333338Àg     `Q@gfffffæH@g      @©gffffff"ÀgÍÌÌÌÌÌ@ç      2ÀgÍÌÌÌÌÌ0Àç       À©g      $Àg      @g      4Àr%   r&   ©g333333#Àg333333#@g     €9ÀgÍÌÌÌÌÌ.Àr&   ©gš™™™™™#@g333333Àg      2@g3333332@ç       @)gŸ´ªæ'@çÀ'RqöÀgÂ�¤ƒy¢.@g�¼eÚ@§5@r+   )g@¢èÈ½Àç˜UÐ›'êß?gëò9¹×\Àgçœ+Œ%¿Àr,   )gR¸…ëQÀçìQ¸…ëá?g®Gáz®ÀgffffffÀr-   )g¥×¨#Àç´w?Ã®ð?gÀk#àeÀgC,î�NÀr.   )gà®ý¡@ç4Õ2ì
à¿gÆF(£@gcÔsÚ@@r/   )r   r   r   )ÚselfÚaÚcrÚrr   r   r    Ú	test_nils1   s    üüzTestSignM.test_nilsc                 C   s0   t g d¢g d¢g d¢g d¢gƒ}t|dd� d S )N)ç        é   r   r   )r6   r   r6   r   ©r   r   r   r6   )r   r   r6   r   F©Údisp©r   r   ©r0   r1   r   r   r    Útest_defective1?   s     zTestSignM.test_defective1c                 C   s6   t g d¢g d¢g d¢g d¢g d¢fƒ}t|dd� d S )Nr#   r$   r'   r(   r)   Fr8   r:   r;   r   r   r    Útest_defective2D   s    ûzTestSignM.test_defective2c              	   C   sB   t g d¢g d¢g d¢g d¢g d¢g d¢g d¢gƒ}t|dd	� d S )
N©r&   ç      9@r5   r5   r5   r5   r5   ©r5   ç      Àç      $@ç      @rC   rC   r5   ©r5   r5   r*   ç      .@rC   rC   r5   ©r5   r5   r5   r5   rE   rC   r5   ©r5   r5   r5   r5   rC   rB   r5   ©r5   r5   r5   r5   r5   r&   r?   ©r5   r5   r5   r5   r5   r5   rA   Fr8   r:   r;   r   r   r    Útest_defective3N   s    úzTestSignM.test_defective3N)Ú__name__Ú
__module__Ú__qualname__r4   r<   r=   rJ   r   r   r   r    r"   /   s   
r"   c                   @   sl   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S )ÚTestLogMc              	   C   sV   t g d¢g d¢g d¢g d¢g d¢g d¢g d¢gƒ}tdƒd	 d
 | }t|dd� d S )Nr>   r@   rD   rF   rG   rH   rI   é   gÍÌÌÌÌÌ@y                Fr8   )r   r   r   )r0   r1   Úmr   r   r    r4   \   s    úzTestLogM.test_nilsc                 C   s2   t ƒ }t|dd�\}}t|ƒ}t||ddd� d S )NFr8   g-Cëâ6
?ç›+¡†›„=©ÚrtolÚatol)r!   r   r   r   )r0   r   ÚA_logmÚinfoÚA_round_tripr   r   r    Ú*test_al_mohy_higham_2012_experiment_1_logmh   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 )NFr8   çñhãˆµøä>rQ   rR   )r!   r   r   Úlogr   r   Zallclose)r0   r   Z
A_funm_logrV   rW   r   r   r    Ú.test_al_mohy_higham_2012_experiment_1_funm_logp   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 ]r}|| }t j |¡}d|› d|› �}t|d	d
�\}}| 	|¡}	t
|	|ƒ t|d	d
�\}
}t|
ƒ}t
|||d� q6qd S )NéÒ  r6   é   éüÿÿÿé   é	   zM:z eivals:Fr8   )Úerr_msg)r   ÚrandomÚseedÚrangeÚrandnÚlogspaceÚlinalgÚeigvalsr   r   r   r   r   )r0   ÚnÚ
M_unscaledÚscaleÚMÚWra   ÚM_sqrtmrV   ÚM_sqrtm_round_tripÚM_logmZM_logm_round_tripr   r   r    Útest_round_trip_random_floatx   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\   r6   r]   ù              ð?r^   r_   r`   Fr8   )	r   rb   rc   rd   re   rf   r   r   r   )r0   ri   rj   rk   rl   rp   rV   Ú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
|vƒ tj|td�}t|d	d
�\}}t|j	j
|v ƒ tj|td� }t|d	d
�\}}t|j	j
|v ƒ q@d S )N©ÚFÚDÚGr6   r   é   é   c                 s   s   | ]}|j p|jd k V  qdS ©r   N©ÚimagÚreal©Ú.0Úwr   r   r    Ú	<genexpr>¤   ó    zFTestLogM.test_logm_type_preservation_and_conversion.<locals>.<genexpr>r   Fr8   )Úscipyrg   rh   r   Úanyr   r   r   r   r   ÚcharÚcomplex)r0   Úcomplex_dtype_charsÚmatrix_as_listrm   r   rU   rV   r   r   r    Ú*test_logm_type_preservation_and_conversion—   s"    üz3TestLogM.test_logm_type_preservation_and_conversionc                 C   sŒ   g d¢g d¢g d¢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 )N)r6   r6   rz   )rz   r6   r6   )r6   rz   r6   r   ç{®Gáz„?Fr8   )r   rˆ   r   r   r…   rg   rh   r   Úabsoluter~   Úsumr   Ú
issubdtyper   Zinexactr   r   )r0   rl   ÚdtÚXr‚   ÚYrV   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 )Nr6   r   éÿÿÿÿr   Fr8   )	r   rˆ   r   r   r   r   r�   r   Zcomplexfloating)r0   rl   r�   r   rU   rV   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   r6   Fr8   rQ   ©rT   )
r   r   ZasarrayÚTr   ZLogmExactlySingularWarningr   r   r   r   )r0   r   ÚBrl   Úexpected_warningÚLrV   Ú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Žä.ÿ++Fr8   rQ   r–   )r   r   r   ZLogmNearlySingularWarningr   r   r   r   )r0   rl   r™   rš   rV   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   r6   r”   ç      à?rQ   r–   rs   r_   y       €      ð¿rz   )r   Úpir   r   r   )r0   r›   rš   r   r   r    Ú&test_opposite_sign_complex_eigenvaluesÜ   s    *$z/TestLogM.test_opposite_sign_complex_eigenvaluesc                 C   s0   d}t  ||f¡t  |¡ }d|j_t|ƒ d S )Né   F)r   Úonesr   ÚflagsÚ	writeabler   ©r0   ri   r1   r   r   r    Útest_readonlyë   s    zTestLogM.test_readonlyN)rK   rL   rM   r4   rX   r[   rq   ru   r‹   r“   r•   rœ   r�   r    r¦   r   r   r   r    rN   Z   s   
	rN   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ejjdd�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\   r6   r]   r^   r_   r`   Fr8   ©	r   rb   rc   rd   re   rf   r   r   r   ©r0   ri   rj   rk   rl   rn   rV   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g d¢d|ddgdd|dgg d¢gƒ}tg d¢d|ddgdd|dgg d¢gƒ}|jd }tt||ƒ|ƒ t|d|d�d }tt||ƒ|ƒ t|ddd�d }tt||ƒ|ƒ d S )	Ng       ?)ç      ð?r   r   r6   r   r7   )r6   r   r   rž   F©r9   Ú	blocksizerz   )r   r   Úshaper   r   r   )r0   ÚeÚser1   Ú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
|vƒ tj|td�}t|d	d
�\}}t|j	j
|v ƒ tj|td� }t|d	d
�\}}t|j	j
|v ƒ qNd S )Nrv   r6   r   rz   r{   c                 s   s   | ]}|j p|jd k V  qdS r|   r}   r€   r   r   r    rƒ   *  r„   zHTestSqrtM.test_sqrtm_type_preservation_and_conversion.<locals>.<genexpr>r   Fr8   )r…   rg   rh   r   r†   r   r   r   r   r   r‡   rˆ   ©r0   r‰   rŠ   rm   r   ÚA_sqrtmrV   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g d¢g d¢g d¢gfD ]‚}t j |¡}ttdd	„ |D ƒƒƒ tj|td
�}t|dd�\}}t|j	j
|v ƒ tj|td
�}t|dd�\}}t|j	j
|v ƒ q8d S )Nrv   r6   r   r”   ©r   r6   r   ©r   r   r6   ©r6   r   r   c                 s   s   | ]}|j p|jd k V  qdS r|   r}   r€   r   r   r    rƒ   D  r„   zVTestSqrtM.test_sqrtm_type_conversion_mixed_sign_or_complex_spectrum.<locals>.<genexpr>r   Fr8   )r…   rg   rh   r   r†   r   r   rˆ   r   r   r‡   r   r²   r   r   r    Ú9test_sqrtm_type_conversion_mixed_sign_or_complex_spectrum;  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\   r6   é   rs   Fr«   rz   é
   )
r   rb   rc   rd   Úrandre   r   r   rg   Úmatrix_power)r0   ri   r   ZA_sqrtm_defaultrV   r¬   ZA_sqrtm_newr   r   r    Útest_blocksizesP  s     zTestSqrtM.test_blocksizesc                 C   sH   t ƒ }t|dd�\}}| |¡}t||dd� tt |¡t |¡ƒ d S )NFr8   rY   ©rS   )r!   r   r   r   r   Útril)r0   r   r³   rV   rW   r   r   r    Ú%test_al_mohy_higham_2012_experiment_1[  s
    
z/TestSqrtM.test_al_mohy_higham_2012_experiment_1c                 C   sZ   t tfD ]L}tjg d¢g d¢g d¢g d¢g|d�}t|dd�\}}tt |¡ ¡ ƒ qd S )N)r   r{   r   r   )r   r   r{   r   )r   r   r   r{   ©r   r   r   r   r   Fr8   )Úintr   r   r   r   r   ÚisnanÚall)r0   r�   r   r³   rV   r   r   r    Útest_strict_upper_triangularc  s    üüz&TestSqrtM.test_strict_upper_triangularc                 C   s„   t tfD ]v}tjg d¢g d¢g d¢g|d�}tjg d¢g d¢g d¢g|d�}t|| |¡ƒ t|dd�\}}tt |¡ 	¡ ƒ qd S )Nr¶   ©r   r   r   rµ   r   Fr8   )
rÂ   r   r   r   r
   r   r   r   rÃ   rÄ   )r0   r�   r   r˜   ZB_sqrtmrV   r   r   r    Útest_weird_matrixn  s$    ýýýýzTestSqrtM.test_weird_matrixc                 C   s:   t j d¡ t j dd¡}t|dd�}t| |¡|ƒ d S )Nr\   r{   Tr8   )r   rb   rc   r»   r   r   r   )r0   r   r˜   r   r   r    Ú	test_disp  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   ù      ð?      ð¿rQ   r–   )r   r   r   r   ©r0   rl   ÚRr   r   r    r    †  s    z0TestSqrtM.test_opposite_sign_complex_eigenvaluesc              
   C   sˆ   t  g d¢g d¢g d¢g d¢g¡}t  tdƒddtdƒgg d¢g d¢tdƒddtdƒgg¡}tt  ||¡|dd� tt|ƒ|dd� d S )N)r6   r   r   r6   rÁ   rž   r   rQ   r–   )r   r   r   r   r   r   rÍ   r   r   r    Útest_gh4866Œ  s    
ýýzTestSqrtM.test_gh4866c                 C   sN   t  g d¢¡}t  tdƒddg¡}tt  ||¡|dd� tt|ƒ|dd� d S )N)rz   r6   r   rz   r6   r   rQ   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   rQ   r–   )r   Úzerosr   r   r   rÍ   r   r   r    Útest_gh7839ž  s    

zTestSqrtM.test_gh7839zfailing on macOS after gh-20212©Úreasonc                 C   s6   t  d¡}| d¡ t  |d¡ t  t|ƒ¡s2J ‚d S )N)é   rÕ   g®Gázî?r6   )r   ÚemptyÚfillZfill_diagonalZ	isrealobjr   ©r0   rl   r   r   r    Útest_gh17918¤  s    

zTestSqrtM.test_gh17918c                 C   s”   t jdt jd�}t|ƒjt jks$J ‚t jdt jd�}t|ƒjt jksHJ ‚t jdt jd�}t|ƒjt jkslJ ‚t jdt j	d�}t|ƒjt j
ks�J ‚d S ©N©rº   rº   r   )r   rÑ   Zuint8r   r   Úfloat16Zuint16Zuint32Úfloat32Zuint64Úfloat64rØ   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$J ‚t jdt jd�}t|ƒjt jksHJ ‚t jdt jd�}t|ƒjt jkslJ ‚t jdt j	d�}t|ƒjt j
ks�J ‚d S rÚ   )r   rÑ   Úint8r   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s0J ‚t jddgddggt jd�}t|ƒjt jks`J ‚t jddgddggt jd�}t|ƒjt jks�J ‚t jddgddggt jd�}t|ƒjt j	ksÀJ ‚d S )Nrz   r_   r   éþÿÿÿr   )
r   r   rà   r   r   Ú	complex64rá   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$J ‚t jdt jd�}t|ƒjt jksHJ ‚t jdt jd�}t|ƒjt jkslJ ‚tt dƒršt jdt jd�}t|ƒjt jksšJ ‚d S )NrÛ   r   Úfloat128)	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s0J ‚t jddgddggt jd�}t|ƒjt jks`J ‚t jddgddggt jd�}t|ƒjt jks�J ‚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ÔJ ‚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    Ú-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s0J ‚tt dƒršt jddgddggt jd�}t|ƒjt jksjJ ‚t jddgddggt jd�}t|ƒjt jksšJ ‚d S )NrÉ   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)rK   rL   rM   rq   ru   r±   r´   r¸   r½   rÀ   rÅ   rÇ   rÈ   r    rÏ   rÐ   rÒ   ÚpytestÚmarkÚxfailrÙ   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\   r6   r¡   rs   r^   r_   r`   ©
r   rb   rc   rd   re   rf   r   rg   r¼   r   ©r0   Ú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\   r6   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Õ   )	r   rb   rc   rd   re   r   rg   r¼   r   )r0   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\   é   r6   r¡   r^   )TFrs   Fr8   )r   rb   rc   rd   Ú	randrangere   ÚexpÚchoicer   r   r   r   )r0   Únsamplesr÷   ri   rõ   Zmatrix_scaler   ÚA_powerrU   rV   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||dd� t||ƒ t||ƒ dD ]D}t||ƒ}t|d| ƒ}t||dd� tt 	|d¡t 	|d¡ƒ qfd S )	NFr8   rž   g•dyáý¥=r¾   )rž   g«ªªªªªú?r6   rŒ   )
r!   r   r   r   r   r   Z_remainder_matrix_powerr   r   r¿   )	r0   r   ZA_funm_sqrtrV   r³   ZA_rem_powerrþ   rõ   rW   r   r   r    rÀ   4  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¡   r6   )	r   rb   rc   re   rd   r   Z_briggs_helper_functionZexp2r   )r0   r1   ÚkZ
x_observedZ
x_expectedr   r   r    Útest_briggs_helper_functionH  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
|vƒ tj|td	�}t||ƒ}t|j	j
|v ƒ tj|td	� }t||ƒ}t|j	j
|v ƒ qlq@d S )
Nrv   r6   r   rz   r{   c                 s   s   | ]}|j p|jd k V  qdS r|   r}   r€   r   r   r    rƒ   ^  r„   zRTestFractionalMatrixPower.test_type_preservation_and_conversion.<locals>.<genexpr>©ç333333ÀçÍÌÌÌÌÌì¿rö   gffffff
@r   )r…   rg   rh   r   r†   r   r   r   r   r   r‡   rˆ   ©r0   r‰   rŠ   rm   rõ   r   rþ   r   r   r    Ú%test_type_preservation_and_conversionP  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g d¢g d¢g d¢gfD ]€}t j |¡}ttdd	„ |D ƒƒƒ d
D ]T}tj|td�}t||ƒ}t|j	j
|v ƒ tj|td�}t||ƒ}t|j	j
|v ƒ qbq8d S )Nrv   r6   r   r”   rµ   r¶   r·   c                 s   s   | ]}|j p|jd k V  qdS r|   r}   r€   r   r   r    rƒ   |  r„   z`TestFractionalMatrixPower.test_type_conversion_mixed_sign_or_complex_spectrum.<locals>.<genexpr>r  r   )r…   rg   rh   r   r†   r   r   rˆ   r   r   r‡   r   r  r   r   r    Ú3test_type_conversion_mixed_sign_or_complex_spectrums  s    ý

zMTestFractionalMatrixPower.test_type_conversion_mixed_sign_or_complex_spectrumzToo unstable across LAPACKs.rÓ   c                 C   sº   ddgddggddgddggddgddggg d¢g d¢g d¢gfD ]r}t tfD ]d}tj||d	�}d
D ] }t||ƒ}tt |¡ ¡ ƒ qddD ]&}t||ƒ}t|d| ƒ}t||ƒ qŠqNqBd S )Nr   r6   rz   r{   r]   rÆ   )r   r6   r6   )r   r”   r6   r   )gffffffæ¿r  r  gÍÌÌÌÌÌô¿)rö   gáz®Gáö?)	r   rˆ   r   r   r   r   rÃ   rÄ   r   )r0   rŠ   Znewtyper   rõ   rþ   rW   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Ì   rQ   r–   rž   )r   r   r   r   rÍ   r   r   r    r       s    z@TestFractionalMatrixPower.test_opposite_sign_complex_eigenvaluesN)rK   rL   rM   ru   rq   rø   rÿ   rÀ   r  r  r  rï   rð   rñ   r  r    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S )ÚTestExpMc                 C   s2   t ddgddggƒ}tt|ƒddgddggƒ d S )Nr5   r   r6   )r   r   r   r;   r   r   r    Ú	test_zero¨  s    zTestExpM.test_zeroc                 C   s"   t dƒ}t|t tjgg¡ƒ d S )Nr6   )r   r   r   r   r®   )r0   Úeltr   r   r    Útest_single_elt¬  s    zTestExpM.test_single_eltc                 C   s$   t  d¡}t|ƒ}|jdks J ‚d S )N©r   r   r   )r   rÑ   r   Úsize)r0   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|J ‚t| t j	¡ƒjjdks˜J ‚d S )Nr6   r_   rz   rw   Úf)
r   r®   r   r   r   Zastyperæ   r   r‡   rÝ   )r0   r›   r1   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 )Nr6   r_   r{   r”   r¡   éýÿÿÿr^   rw   )Úorderrz   rO   r¹   r]   éûÿÿÿ)r   r®   r   r   r   )r0   r›   r1   Za_resr   r   r    Útest_nx2x2_input¿  s6    üü"&ÿ>6ÿ22ÿ>>ÿ..ÿ÷zTestExpM.test_nx2x2_inputc                 C   s&   d}t  ||f¡}d|j_t|ƒ d S )NrO   F)r   r¢   r£   r¤   r   r¥   r   r   r    r¦   Ö  s    zTestExpM.test_readonlyc           
      C   s¼   t jdtd�}t j d¡}| ddd¡}| ddd¡}| d¡|||f< t jdtd�}| ¡ |d< t|ƒ\}}|dkszJ ‚t	|ƒ}t j
 t|ƒ|¡ td	ƒD ]}t	|ƒ}	t j
 ||	¡ qœd S )
N)é�  r  r   éd   r   i�  iô  )r¡   r  r  r`   r¡   )r   rÑ   r   rb   Zdefault_rngZintegersrÖ   Úcopyr   r   Ztestingr   r   rd   )
r0   r   Úrngr÷   ÚjZAmrP   ÚsZ	first_resZnext_resr   r   r    Útest_gh18086Ü  s    zTestExpM.test_gh18086N)
rK   rL   rM   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ejj	ejj
d	d
�dd„ ƒƒZdS )ÚTestExpmFrechetc           	      C   sÈ   t jg d¢g d¢g d¢g d¢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i |¤Ž\}}t||ƒ t||ƒ q”d S )N©r6   rz   r{   r_   ©r¡   r]   rO   r¹   ©r   r   r6   rz   ©r   r   r¡   r]   r   r6   rz   r¡   r]   r{   r_   rO   r¹   ÚmethodÚSPSÚblockEnlarge)r   r   r   r…   rg   r   r   r   )	r0   rl   r   r›   Úexpected_expmÚexpected_frechetÚkwargsÚobserved_expmÚobserved_frechetr   r   r    Útest_expm_frechetò  s4    üûþýþý
z!TestExpmFrechet.test_expm_frechetc                 C   s.  t jg d¢g d¢g d¢g d¢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¡}g d¢}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  r   r!  r"  r   r6   rz   r¡   r]   r{   r_   rO   r¹   )r6   r{   r¡   rO   r`   é   é   é   r”   rž   )r   r   r   r…   rg   r   ÚzipZ_expm_frechetZell_table_61r   r   r   )r0   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 )
Nr  rª   rz   é   ©r  r6   gH¯¼šò×j>r–   gH¯¼šò×z>)r   rb   ÚuniformÚnormalZstandard_cauchyÚexponentialrd   rü   Úexpovariaterú   r…   rg   r   ÚvstackZhstackZ
zeros_liker   r   r   )r0   ZrfuncsZntestsr÷   Zrfuncr5  ri   r0  r1  r2  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µ•Œå?r6   r$  ©r#  r%  )r   r   r   r…   rg   r   r   r   )r0   r   r›   Úsps_expmÚsps_frechetÚblockEnlarge_expmÚblockEnlarge_frechetr   r   r    Útest_problematic_matrixE  s*    þýþýÿ
ÿ

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è  r8  r$  r?  r%  )r   rb   r;  r   r   )r0   ri   r   r›   r@  rA  rB  rC  r   r   r    Útest_medium_matrixW  s    ÿ
ÿ

z"TestExpmFrechet.test_medium_matrixN)rK   rL   rM   r+  r6  r>  rD  rï   rð   ÚslowÚskiprE  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_searchf  s    rO  c                 C   s   | t j |¡t j | ¡  S rH  )r…   rg   r   )r   r˜   r   r   r    Ú_normalized_likeo  s    rP  c                 C   s(   | |ƒ}| || ƒ}t || ƒt |ƒ S rH  )r   )r  r   rM  r‘   rN  r   r   r    Ú_relative_errors  s    rQ  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\   r6   r_   r   )r   rb   rc   rd   re   r   r	   )r0   ri   r   Úkappar   r   r    Útest_expm_cond_smokez  s
    z,TestExpmConditionNumber.test_expm_cond_smokec                 C   s8   t  g d¢g d¢g d¢g d¢g¡}t|ƒ}td|ƒ d S )N)göá(’ò¿gÙ™BgÝx÷@g  °=ÛðÁg ¾Zd ðB)r   gzNÑV7ó¿gðŠà¯…÷@g  2pñÁ)r   r   gá™¥¤T ò¿g?W[±ÎE÷@)r   r   r   gT–†!ßò¿gã yÏùhG)r   r   r   r	   )r0   r   rS  r   r   r    Útest_expm_bad_condition_number�  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º   r6   r  )r   rb   rc   Zlinspacer   r   r   Úabsrf   rd   re   r�   )r0   Úxr   r÷   r   r   r    Útest_univariate‹  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 )	NrV  rY   rº   rz   r¡   zL-BFGS-Br?  r6   )r   rb   rc   rd   Úrandintre   r…   rg   r   r   r   Ú	functoolsÚpartialrO  r¢   r   rY  rP  rI  r­   rQ  r   r	   )r0   rL  rý   r÷   ri   r   rJ  r‘   rK  rS  r  ÚguessÚoutZxoptZyoptZp_bestZp_best_relerrr  Zp_randZp_rand_relerrr   r   r    Útest_expm_cond_fuzz—  s4    
ÿz+TestExpmConditionNumber.test_expm_cond_fuzzN)
rK   rL   rM   rT  rU  rZ  rï   rð   rF  r`  r   r   r   r    rR  y  s
   
rR  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 )Nr6   rz   r{   r_   r¡   r]   rO   r¹   é   r7  r.  é   é   é    )r_   rz   )r   r   r
   r   rÖ   r­   ©r0   r1   Úbr   r   r    Ú
test_basicÀ  s    ÿýzTestKhatriRao.test_basicc                 C   s`   t  t¡�B tg d¢g d¢gƒ}tddgddggƒ}t||ƒ W d   ƒ n1 sR0    Y  d S )N©r6   rz   r{   ©r_   r¡   r]   r6   rz   r{   r_   ©rï   ZraisesÚ
ValueErrorr   r   rf  r   r   r    Útest_number_of_columns_equalityÌ  s    ÿÿz-TestKhatriRao.test_number_of_columns_equalityc                 C   sø   t  t¡�2 tg d¢ƒ}tg d¢ƒ}t||ƒ W d   ƒ n1 sB0    Y  t  t¡�: tg d¢ƒ}tg d¢g d¢gƒ}t||ƒ W d   ƒ n1 s–0    Y  t  t¡�: tg d¢g d¢gƒ}tg d¢ƒ}t||ƒ W d   ƒ n1 sê0    Y  d S )Nri  rj  )rO   r¹   r`   rk  rf  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 )Nr6   rz   r{   r_   r¡   r]   rO   r¹   c                    s0   g | ](}t  ˆ d d …|f ˆd d …|f ¡‘qS rH  )r   Zkron)r�   r   ©r1   rg  r   r    Ú
<listcomp>ò  s   ÿz@TestKhatriRao.test_equality_of_two_equations.<locals>.<listcomp>)r   r   r   r=  rd   r­   r—   r
   )r0   Zres1Zres2r   ro  r    Útest_equality_of_two_equationsí  s    
ÿ
z,TestKhatriRao.test_equality_of_two_equationsN)rK   rL   rM   rh  rm  rn  rq  r   r   r   r    ra  ¾  s   ra  )/Ú__doc__rb   r\  Ú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._matfuncsr   Zscipy.linalg._expm_frechetZscipy.optimizer   r!   r"   rN   r§   rò   r	  r  rO  rP  rQ  rR  ra  r   r   r   r    Ú<module>   s6    0+  } :Iv	E