o
    Ö­j¤  ã                   @   sp  d 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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%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ƒZ0dd„ Z1dd„ Z2dd„ Z3G dd„ dƒZ4G d d!„ d!ƒZ5d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ÚcosmÚsinmÚtanmÚcoshmÚsinhmÚtanhm)Ú_matfuncs_inv_ssq)Úpick_pade_structure)ÚLogmExactlySingularWarning)Ú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&   ú]/var/www/html/CropPilot/venv/lib/python3.10/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@r2   )g@¢èÈ½Àç˜UÐ›'êß?gëò9¹×\Àgçœ+Œ%¿Àr3   )gR¸…ëQÀçìQ¸…ëá?g®Gáz®ÀgffffffÀr4   )g¥×¨#Àç´w?Ã®ð?gÀk#àeÀgC,î�NÀr5   )gà®ý¡@ç4Õ2ì
à¿gÆF(£@gcÔsÚ@@r6   )r   r   r   )ÚselfÚaÚcrÚrr&   r&   r'   Ú	test_nils2   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   )r=   r   r=   r   ©r   r   r   r=   )r   r   r=   r   F©Údisp©r   r   ©r7   r8   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/   r0   Fr?   rA   rB   r&   r&   r'   Útest_defective2E   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@r<   r<   r<   r<   r<   ©r<   ç      Àç      $@ç      @rJ   rJ   r<   ©r<   r<   r1   ç      .@rJ   rJ   r<   ©r<   r<   r<   r<   rL   rJ   r<   ©r<   r<   r<   r<   rJ   rI   r<   ©r<   r<   r<   r<   r<   r-   rF   ©r<   r<   r<   r<   r<   r<   rH   Fr?   rA   rB   r&   r&   r'   Útest_defective3O   s   úzTestSignM.test_defective3N)Ú__name__Ú
__module__Ú__qualname__r;   rC   rD   rQ   r&   r&   r&   r'   r)   0   s
    
r)   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
ejjdd„ ƒZejjdd„ ƒZdd„ Zdd„ Zejjdd�ej deeejeejg¡dd„ ƒƒZejjej deeejeejg¡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 )NrE   rG   rK   rM   rN   rO   rP   é   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_logmi   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ãˆµøä>rX   rY   )r(   r   r#   Úlogr   r   Úallclose)r7   r%   Ú
A_funm_logr]   r^   r&   r&   r'   Ú.test_al_mohy_higham_2012_experiment_1_funm_logq   s   z7TestLogM.test_al_mohy_higham_2012_experiment_1_funm_logc                 C   s°   t j d¡ tddƒD ]J}t j ||¡}t  ddd¡D ]9}|| }t j |¡}d|› d|› �}t|d	d
�\}}| 	|¡}	t
|	|ƒ t|d	d
�\}
}t|
ƒ}t
|||d� qqd S )NéÒ  r=   é   éüÿÿÿé   é	   zM:z eivals:Fr?   )Úerr_msg)r#   ÚrandomÚseedÚrangeÚrandnÚlogspaceÚlinalgÚeigvalsr   r   r   r   r   )r7   ÚnÚ
M_unscaledÚscaleÚMÚWrj   ÚM_sqrtmr]   ÚM_sqrtm_round_tripÚM_logmÚM_logm_round_tripr&   r&   r'   Útest_round_trip_random_floaty   s   

ñþz%TestLogM.test_round_trip_random_floatc                 C   s~   t j d¡ tddƒD ]1}t j ||¡dt j ||¡  }t  ddd¡D ]}|| }t|dd	�\}}t|ƒ}t||ƒ q$qd S ©
Nre   r=   rf   ù              ð?rg   rh   ri   Fr?   )	r#   rk   rl   rm   rn   ro   r   r   r   )r7   rr   rs   rt   ru   ry   r]   Ú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 ]Z}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ÚGr=   r   é   é   c                 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!   Fr?   )Úscipyrp   rq   r   Úanyr#   r   r$   r   r"   ÚcharÚcomplex)r7   Úcomplex_dtype_charsÚmatrix_as_listrv   r%   r\   r]   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 ]4}tj||d�}tj |¡}tdt |j	¡ 
¡ k ƒ t|dd�\}}tt |jtj¡ƒ tt|ƒ|ƒ qd S )N)r=   r=   r„   )r„   r=   r=   )r=   r„   r=   r!   ç{®Gáz„?Fr?   )r$   r“   r#   r   r�   rp   rq   r   Úabsoluter‰   Úsumr   Ú
issubdtyper"   Úinexactr   r   )r7   ru   ÚdtÚXr�   ÚYr]   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 ]"}t tfD ]}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"   Úcomplexfloating)r7   ru   rœ   r%   r\   r]   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 ]}tj}t|t|dd�\}}t|ƒ}t	||dd� qd S )Nr   r}   r=   Fr?   rX   ©r[   )
r#   r   ÚasarrayÚTr   r   r   r   r   r   )r7   r%   ÚBru   Úexpected_warningÚLr]   Ú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?   rX   r£   )r#   r   r   ÚLogmNearlySingularWarningr   r   r   r   )r7   ru   r§   r¨   r]   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    ç      à?rX   r£   r}   rh   y       €      ð¿r„   )r#   Úpir   r   r   )r7   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   ©r7   rr   r8   r&   r&   r'   Útest_readonlyî   s   zTestLogM.test_readonlyz6ValueError: attempt to get argmax of an empty sequence©Úreasonrœ   c                 C   óN   t jd|d�}t|ƒ}t jd|d�}t|ƒ}|jdksJ ‚|j|jks%J ‚d S ©N©r   r   r!   r„   )r#   Úemptyr   ÚeyeÚshaper"   )r7   rœ   r8   Úlog_aÚa0Úlog_a0r&   r&   r'   Ú
test_emptyô   s   zTestLogM.test_emptyr"   c              	   C   s€   t jtdd��/ t  t¡� ttjd|d�ƒ W d   ƒ n1 s!w   Y  W d   ƒ d S W d   ƒ d S 1 s9w   Y  d S )Nzlogm result may be inaccurate)Úmatch©r„   r„   r!   )ÚpytestÚwarnsÚRuntimeWarningr   r   r#   Úzeros)r7   r"   r&   r&   r'   Útest_no_ZeroDivisionErrorÿ   s
   ÿPþz"TestLogM.test_no_ZeroDivisionErrorN)rR   rS   rT   r;   r_   rd   r{   r   r–   rŸ   r¢   rÄ   ÚmarkÚthread_unsaferª   r¬   r¯   rµ   ÚxfailÚparametrizeÚintr$   r#   Úfloat32r“   Ú	complex64rÁ   rÈ   r&   r&   r&   r'   rU   [   s*    

	
	rU   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ej d-eeeje ej!g¡d.d/„ ƒZ"d0S )1Ú	TestSqrtMc           	      C   sl   t j d¡}tddƒD ](}| ||¡}t  ddd¡D ]}|| }t|dd�\}}| |¡}t||ƒ qqd S )	Nre   r=   rf   rg   rh   ri   Fr?   ©	r#   rk   ÚRandomStaterm   rn   ro   r   r   r   ©	r7   Úrngrr   rs   rt   ru   rw   r]   rx   r&   r&   r'   r{     s   
üþz&TestSqrtM.test_round_trip_random_floatc           	      C   s|   t j d¡}tddƒD ]0}| ||¡d| ||¡  }t  ddd¡D ]}|| }t|dd	�\}}| |¡}t||ƒ q"qd S r|   rÑ   rÓ   r&   r&   r'   r     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       ?)g      ð?r   r   r=   r   r>   )r=   r   r   r­   F©r@   Ú	blocksizer„   )r   r   r½   r   r   r   )r7   ÚeÚser8   Úsarr   Ú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 ]Z}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 )Nr€   r=   r   r„   r…   c                 s   r†   r‡   rˆ   r‹   r&   r&   r'   rŽ   B  r�   zHTestSqrtM.test_sqrtm_type_preservation_and_conversion.<locals>.<genexpr>r!   Fr?   )r�   rp   rq   r   r‘   r#   r   r$   r   r"   r’   r“   ©r7   r”   r•   rv   r%   ÚA_sqrtmr]   r&   r&   r'   Ú+test_sqrtm_type_preservation_and_conversion4  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 ]A}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 ƒ qd S )Nr€   r=   r   r    ©r   r=   r   ©r   r   r=   ©r=   r   r   c                 s   r†   r‡   rˆ   r‹   r&   r&   r'   rŽ   \  r�   zVTestSqrtM.test_sqrtm_type_conversion_mixed_sign_or_complex_spectrum.<locals>.<genexpr>r!   Fr?   )r�   rp   rq   r   r‘   r#   r   r“   r   r"   r’   r$   rÜ   r&   r&   r'   Ú9test_sqrtm_type_conversion_mixed_sign_or_complex_spectrumS  s   ýïzCTestSqrtM.test_sqrtm_type_conversion_mixed_sign_or_complex_spectrumc                 C   s’   t j d¡ tddƒD ];}t j ||¡dt j ||¡  }t|d|d�\}}t|t j 	|d¡ƒ tddƒD ]}t|d|d�\}}t||ƒ q5qd S )	Nre   r=   é   r}   FrÕ   r„   é
   )
r#   rk   rl   rm   Úrandrn   r   r   rp   Úmatrix_power)r7   rr   r%   ÚA_sqrtm_defaultr]   rÖ   ÚA_sqrtm_newr&   r&   r'   Útest_blocksizesh  s    þüzTestSqrtM.test_blocksizesc                 C   sH   t ƒ }t|dd�\}}| |¡}t||dd� tt |¡t |¡ƒ d S )NFr?   r`   ©rZ   )r(   r   r   r   r#   Útril)r7   r%   rÝ   r]   r^   r&   r&   r'   Ú%test_al_mohy_higham_2012_experiment_1s  s
   
z/TestSqrtM.test_al_mohy_higham_2012_experiment_1c                 C   sZ   t tfD ]&}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!   Fr?   )rÍ   r$   r#   r   r   r   ÚisnanÚall)r7   rœ   r%   rÝ   r]   r&   r&   r'   Útest_strict_upper_triangular{  s   üüùz&TestSqrtM.test_strict_upper_triangularc                 C   s„   t tfD ];}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!   Fr?   )
rÍ   r$   r#   r   r
   r   r   r   rî   rï   )r7   rœ   r%   r¦   ÚB_sqrtmr]   r&   r&   r'   Útest_weird_matrix†  s&   ýýýýózTestSqrtM.test_weird_matrixc                 C   s:   t j d¡ t j dd¡}t|dd�}t| |¡|ƒ d S )Nre   r…   Tr?   )r#   rk   rl   rå   r   r   r   )r7   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ù               @rh   r   ù       €       Àù      ð?      ð?r„   ù      ð?      ð¿rX   r£   )r   r#   r   r   ©r7   ru   Ú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)r=   r   r   r=   rí   r­   r   rX   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)r„   r=   r   r„   r=   r   rX   r£   )r#   Ú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 )NrÃ   rX   r£   )r#   rÇ   r   r   r   rù   r&   r&   r'   Útest_gh7839¶  s   

zTestSqrtM.test_gh7839zfailing on macOS after gh-20212r¶   c                 C   s6   t  d¡}| d¡ t  |d¡ t  t|ƒ¡sJ ‚d S )N)é   rÿ   g®Gázî?r=   )r#   r»   ÚfillÚfill_diagonalÚ	isrealobjr   ©r7   ru   r&   r&   r'   Útest_gh17918¼  s   

zTestSqrtM.test_gh17918c                 C   ó”   t jdt jd�}t|ƒjt jksJ ‚t jdt jd�}t|ƒjt jks$J ‚t jdt jd�}t|ƒjt jks6J ‚t jdt jd�}t|ƒjt jksHJ ‚d S ©N©rä   rä   r!   )	r#   rÇ   Úuint8r   r"   Úfloat64Úuint16Úuint32Úuint64r  r&   r&   r'   Ú-test_data_size_preservation_uint_in_float_outÃ  ó   z7TestSqrtM.test_data_size_preservation_uint_in_float_outc                 C   r  r  )	r#   rÇ   Úint8r   r"   r	  Úint16Úint32Úint64r  r&   r&   r'   Ú,test_data_size_preservation_int_in_float_outÍ  r  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sJ ‚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sHJ ‚t jddgddggt jd�}t|ƒjt jks`J ‚d S )Nr„   rh   r   éþÿÿÿr!   )	r#   r   r  r   r"   Ú
complex128r  r  r  r  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s$J ‚t jdt jd�}t|ƒjt jks6J ‚tt dƒrMt jdt jd�}t|ƒjt jksOJ ‚d S d S )Nr  r!   Úfloat128)	r#   rÇ   Úfloat16r   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sJ ‚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sHJ ‚t	t dƒrjt	t dƒrlt jddgddggt j
d�}t|ƒjt jksnJ ‚d S d S d S )Nr„   rh   r   r  r!   r  Ú
complex256)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sJ ‚t jddgddggt jd�}t|ƒjt jks0J ‚tt dƒrMt jddgddggt jd�}t|ƒjt jksOJ ‚d S d S )Nrõ   rh   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_outrœ   c                 C   r¸   r¹   )r#   r»   r   r¼   r½   r"   )r7   rœ   r8   Úsr¿   Ús0r&   r&   r'   rÁ      s   zTestSqrtM.test_emptyN)#rR   rS   rT   r{   r   rÛ   rÞ   râ   ré   rì   rð   ró   rô   r¯   rû   rý   rþ   rÄ   rÉ   rË   r  r  r  r  r  r  r  rÌ   rÍ   r$   r#   rÎ   r“   rÏ   rÁ   r&   r&   r&   r'   rÐ   
  s2    





	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 ];}tddƒD ]3}t j ||¡dt j ||¡  }t  ddd¡D ]}|| }t|d| ƒ}t j ||¡}t	||ƒ q+qqd S )Nre   r=   r°   r}   rg   rh   ri   ©
r#   rk   rl   rm   rn   ro   r   rp   ræ   r   ©r7   Úprr   rs   rt   ru   ÚM_rootr~   r&   r&   r'   r     s    üþÿz8TestFractionalMatrixPower.test_round_trip_random_complexc                 C   s€   t j d¡ tddƒD ]2}tddƒD ]*}t j ||¡}t  ddd¡D ]}|| }t|d| ƒ}t j ||¡}t	||ƒ q"qqd S )Nre   r=   r°   rg   rh   ri   r!  r"  r&   r&   r'   r{     s   üþÿz6TestFractionalMatrixPower.test_round_trip_random_floatc                 C   s®   t j d¡ dD ]L}tdƒD ]E}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 )Nre   )r„   r…   r°   rä   r}   çš™™™™™É?r°   gš™™™™™Àiåÿÿÿgffffff@rÿ   )	r#   rk   rl   rm   rn   r   rp   ræ   r   )r7   rr   Úiru   ÚM_one_fifthr~   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 ]N}| dd¡}| ¡ }t  | dd¡¡}|j||gd�}ddg| d	¡ r>|d
|j||gd�  }|| }t||ƒ}t|dd�\}	}
t	|	| ƒ}t
||ƒ qd S )Nl   ½fmø1 é   r=   r°   rg   ©ÚsizeTFr„   r}   r?   )r#   rk   Údefault_rngrm   ÚintegersÚexpÚchoicer   r   r   r   )r7   rÔ   Únsamplesr&  rr   r#  Úmatrix_scaler%   ÚA_powerr\   r]   ÚA_power_expm_logmr&   r&   r'   Útest_random_matrices_and_powers8  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 ]"}t||ƒ}t|d| ƒ}t||dd� tt 	|d¡t 	|d¡ƒ q3d S )	NFr?   r­   g•dyáý¥=rê   )r­   g«ªªªªªú?r=   r—   )
r(   r   r#   r   r   r   Ú_remainder_matrix_powerr   r   rë   )	r7   r%   ÚA_funm_sqrtr]   rÝ   ÚA_rem_powerr2  r#  r^   r&   r&   r'   rì   Q  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||ƒ qqd S )Nre   rä   r}   r°   r=   )	r#   rk   rl   rn   rm   r   Ú_briggs_helper_functionÚexp2r   )r7   r8   ÚkÚ
x_observedÚ
x_expectedr&   r&   r'   Útest_briggs_helper_functione  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 ]V}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 ƒ q6q d S )
Nr€   r=   r   r„   r…   c                 s   r†   r‡   rˆ   r‹   r&   r&   r'   rŽ   {  r�   zRTestFractionalMatrixPower.test_type_preservation_and_conversion.<locals>.<genexpr>©ç333333ÀçÍÌÌÌÌÌì¿r%  gffffff
@r!   )r�   rp   rq   r   r‘   r#   r   r$   r   r"   r’   r“   ©r7   r”   r•   rv   r#  r%   r2  r&   r&   r'   Ú%test_type_preservation_and_conversionm  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j|td�}t||ƒ}t|j	j
|v ƒ tj|td�}t||ƒ}t|j	j
|v ƒ q1qd S )Nr€   r=   r   r    rß   rà   rá   c                 s   r†   r‡   rˆ   r‹   r&   r&   r'   rŽ   ™  r�   z`TestFractionalMatrixPower.test_type_conversion_mixed_sign_or_complex_spectrum.<locals>.<genexpr>r>  r!   )r�   rp   rq   r   r‘   r#   r   r“   r   r"   r’   r$   rA  r&   r&   r'   Ú3test_type_conversion_mixed_sign_or_complex_spectrum�  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 ]9}t tfD ]2}tj||d	�}d
D ]}t||ƒ}tt |¡ ¡ ƒ q2dD ]}t||ƒ}t|d| ƒ}t||ƒ qEq'q!d S )Nr   r=   r„   r…   rf   rñ   )r   r=   r=   )r   r    r=   r!   )gffffffæ¿r@  r?  gÍÌÌÌÌÌô¿)r%  gáz®Gáö?)	r$   r“   r#   r   r   r   rî   rï   r   )r7   r•   Únewtyper%   r#  r2  r^   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õ   rh   r   rö   r÷   r„   rø   rX   r£   r­   )r   r#   r   r   rù   r&   r&   r'   r¯   ½  s   z@TestFractionalMatrixPower.test_opposite_sign_complex_eigenvaluesN)rR   rS   rT   r   r{   r(  r4  rì   r=  rB  rC  rÄ   rÉ   rË   rE  r¯   r&   r&   r&   r'   r     s    #
r   c                
   @   s¢   e Zd Zdd„ Zdd„ Zej dee	e
eeeeg¡ej deeejeejg¡ej ddd	g¡d
d„ ƒƒƒZdd„ Zdd„ Zdd„ Zejjej d¡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   rB   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_eltÚfuncrœ   r½   rº   )r=   r=   c                 C   sN   t j||d�}t jd|d�}||ƒ}||ƒ}|j|ksJ ‚|j|jks%J ‚d S )Nr!   r  )r#   rÇ   r½   r"   )r7   rJ  rœ   r½   r%   ÚA0ÚresultÚresult0r&   r&   r'   Útest_small_empty_matrix_inputÍ  s   z&TestExpM.test_small_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sLJ ‚d S )Nr=   rh   r„   r�   Úf)
r#   r×   r   r   r   ÚastyperÏ   r"   r’   rÎ   )r7   r©   r8   ÚaaÚ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=   rh   r…   r    r°   éýÿÿÿrg   r�   )Úorderr„   rV   rã   rf   éûÿÿÿ)r#   r×   r   r   r   )r7   r©   r8   Ú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 )NrV   F)r#   r±   r²   r³   r   r´   r&   r&   r'   rµ   ú  s   zTestExpM.test_readonlyr°   c           
      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s=J ‚t	|ƒ}t j
 t|ƒ|¡ td	ƒD ]}t	|ƒ}	t j
 ||	¡ qNd S )
N)é�  rY  r!   éd   r   i�  iô  )r°   rY  rY  ri   r°   )r#   rÇ   r$   rk   r,  r-  r»   Úcopyr   r   Útestingr   r   rm   )
r7   r%   rÔ   r&  ÚjÚAmrW   r  Ú	first_resÚnext_resr&   r&   r'   Útest_gh18086   s   þzTestExpM.test_gh18086N)rR   rS   rT   rG  rI  rÄ   rÉ   rÌ   r   r   r   r   r   r   r   rÍ   r$   r#   rÎ   r“   rÏ   rN  rS  rX  rµ   rÊ   Ú	fail_slowra  r&   r&   r&   r'   rF  Ä  s    
	
rF  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||ƒ qJd S )N©r=   r„   r…   rh   ©r°   rf   rV   rã   ©r   r   r=   r„   ©r   r   r°   rf   r!   r=   r„   r°   rf   r…   rh   rV   rã   ÚmethodÚSPSÚblockEnlarge)r#   r   r$   r�   rp   r   r   r   )	r7   ru   r%   r©   Úexpected_expmÚexpected_frechetÚkwargsÚobserved_expmÚobserved_frechetr&   r&   r'   Útest_expm_frechet  s6   üûþýþý
ý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 ]M\}}tjjj| }	tjjj| }
d|	|
  }|| }|| }|| }|| }tj 	|¡}tj 	|¡d d…dd …f }t
||ƒ\}}t||ƒ t||ƒ qGd S )Nrd  re  rf  rg  r!   r=   r„   r°   rf   r…   rh   rV   rã   )r=   r…   r°   rV   ri   é   é   é   r    r­   )r#   r   r$   r�   rp   r   ÚzipÚ_expm_frechetÚell_table_61r   r   r   )r7   Ú
M_originalÚ
A_originalÚ
E_originalÚA_original_norm_1Úselected_m_listÚm_neighbor_pairsÚmaÚmbÚell_aÚell_bÚtarget_norm_1rt   ru   r%   r©   rk  rl  rn  ro  r&   r&   r'   Útest_small_norm_expm_frechet/  sJ   üûþýþý
ôz,TestExpmFrechet.test_small_norm_expm_frechetc              	   C   s  t j d¡}t jjt jjt jjt jjf}d}t|ƒD ]q}|| d¡ }| ¡ }| 	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 )Nl   ñ]±"ù1 rZ  rh   r„   é   r*  r=   gH¯¼šò×j>r£   gH¯¼šò×z>)r#   rk   r,  ÚuniformÚnormalÚstandard_cauchyÚexponentialrm   r/  r-  r�   rp   r   ÚvstackÚhstackÚ
zeros_liker   r   r   )r7   rÔ   ÚrfuncsÚntestsr&  Úrfuncr�  rr   rx  ry  rz  rt   r%   r©   ru   rk  rl  rn  ro  r&   r&   r'   Ú	test_fuzzP  s6   üþï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=   ri  ©rh  rj  )r#   r   r$   r�   rp   r   r   r   )r7   r%   r©   Úsps_expmÚsps_frechetÚblockEnlarge_expmÚblockEnlarge_frechetr&   r&   r'   Útest_problematic_matrixl  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è  r*  ri  r�  rj  )r#   rk   r‡  r   r   )r7   rr   r%   r©   r�  r‘  r’  r“  r&   r&   r'   Útest_medium_matrix~  s   
ÿ
ÿ
z"TestExpmFrechet.test_medium_matrixN)rR   rS   rT   rp  r‚  rŽ  r”  rÄ   rÉ   ÚslowÚskipr•  r&   r&   r&   r'   rc    s    !rc  c           
      C   sL   t  || j¡}t|ƒ}|| ||  }t| | ƒ}t|| ƒ||  }	|	 S ©N)r#   Úreshaper½   r   r   )
r%   ÚA_normr�   ÚX_normÚepsr#  Úp_normÚperturbationÚX_primeÚscaled_relative_errorr&   r&   r'   Ú_help_expm_cond_search�  s   r¡  c                 C   s   | t j |¡t j | ¡  S r˜  )r�   rp   r   )r%   r¦   r&   r&   r'   Ú_normalized_like–  s   r¢  c                 C   s(   | |ƒ}| || ƒ}t || ƒt |ƒ S r˜  )r   )rO  r%   rž  r�   rŸ  r&   r&   r'   Ú_relative_errorš  s   r£  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 )Nre   r=   rh   r   )r#   rk   rl   rm   rn   r   r	   )r7   rr   r%   Úkappar&   r&   r'   Útest_expm_cond_smoke¡  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	   )r7   r%   r¥  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|ƒƒ q)t	dƒD ]}t j 
d	d	¡}tt|ƒt  |¡d
 ƒ q@d S )Né90  rV  r°   rq  )Únumr  r„   rä   r=   rº   )r#   rk   rl   Úlinspacer   r   r   Úabsro   rm   rn   r˜   )r7   Úxr%   r&  r&   r&   r'   Útest_univariate²  s   þz'TestExpmConditionNumber.test_univariatec              	   C   s>  t j d¡}d}d}t|ƒD ]Ž}| dd¡}| ||¡}tj |¡}t	|ƒ}tj |¡}	t
|ƒ}
t t||||	|¡}t  || ¡}t||dd�}|j}||ƒ}|tt  ||j¡|ƒ }tt	||ƒ}t|| | ƒ tdƒD ]!}|t|j|jŽ |ƒ }tt|ƒt|ƒƒ tt	||ƒ}t||ƒ qmt|dd|  | |
 ƒ qd S )	Nr¨  r`   rä   r„   r°   zL-BFGS-Br�  r=   )r#   rk   rÒ   rm   Úrandintrn   r�   rp   r   r   r   Ú	functoolsÚpartialr¡  r±   r   r¬  r¢  r™  r½   r£  r   r	   )r7   rÔ   rœ  r0  r&  rr   r%   rš  r�   r›  r¥  rO  ÚguessÚoutÚxoptÚyoptÚp_bestÚp_best_relerrr]  Úp_randÚp_rand_relerrr&   r&   r'   Útest_expm_cond_fuzz¾  s6   
ÿáz+TestExpmConditionNumber.test_expm_cond_fuzzN)
rR   rS   rT   r¦  r§  r­  rÄ   rÉ   r–  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 )Ú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=   r„   r…   rh   r°   rf   rV   rã   é   rƒ  rs  é   é   é    )rh   r„   )r   r   r
   r#   r»   r½   ©r7   r8   Úbr&   r&   r'   Ú
test_basicç  s   ÿýzTestKhatriRao.test_basicc                 C   sb   t  t¡�" tg d¢g d¢gƒ}tddgddggƒ}t||ƒ W d   ƒ d S 1 s*w   Y  d S )N©r=   r„   r…   ©rh   r°   rf   r=   r„   r…   rh   ©rÄ   ÚraisesÚ
ValueErrorr   r   r¿  r&   r&   r'   Útest_number_of_columns_equalityó  s   ÿÿ"ûz-TestKhatriRao.test_number_of_columns_equalityc                 C   sú   t  t¡� tg d¢ƒ}tg d¢ƒ}t||ƒ W d   ƒ n1 s!w   Y  t  t¡� tg d¢ƒ}tg d¢g d¢gƒ}t||ƒ W d   ƒ n1 sKw   Y  t  t¡� tg d¢g d¢gƒ}tg d¢ƒ}t||ƒ W d   ƒ d S 1 svw   Y  d S )NrÂ  rÃ  )rV   rã   ri   rÄ  r¿  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=   r„   r…   rh   r°   rf   rV   rã   c                    s0   g | ]}t  ˆ d d …|f ˆd d …|f ¡‘qS r˜  )r#   Úkron)rŒ   r:  ©r8   rÀ  r&   r'   Ú
<listcomp>  s    (ÿz@TestKhatriRao.test_equality_of_two_equations.<locals>.<listcomp>)r   r   r#   rˆ  rm   r½   r¥   r
   )r7   Úres1Úres2r&   rÊ  r'   Útest_equality_of_two_equations  s   
ÿÿz,TestKhatriRao.test_equality_of_two_equationsc                 C   s`   t  d¡}t  d¡}t||ƒ}t|t  d¡ƒ t  d¡}t  d¡}t||ƒ}t|t  d¡ƒ d S )N)r   r„   )r…   r„   )r…   r   )r°   r   )rs  r   )r#   r»   r   r   )r7   r8   rÀ  Úresr&   r&   r'   rÁ     s   





zTestKhatriRao.test_emptyN)rR   rS   rT   rÁ  rÇ  rÈ  rÎ  rÁ   r&   r&   r&   r'   rº  å  s    
rº  )6Ú__doc__r¯  Únumpyr#   r   r   r   r   Únumpy.testingr   r   r   r	   r
   r   rÄ   Úscipy.linalgr�   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Úscipy.linalg._matfuncsr   Úscipy.linalg._matfuncs_inv_ssqr   Úscipy.linalg._expm_frechetÚscipy.optimizer   r(   r)   rU   rÐ   r   rF  rc  r¡  r¢  r£  r¤  rº  r&   r&   r&   r'   Ú<module>   s:    H+ 0   :Rw	E