o
    i                     @   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   gQI?r    )r   r   r   g^?dtype)npr   float)A r&   Z/home/kim/smarthome/.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=@g3333338g     `Q@gfffffH@g      @gffffff"g@      2g0       g      $g      @g      4r,   r-   g333333#g333333#@g     9g.r-   g#@g333333g      2@g3333332@       @)g'@'Rqgy.@ge@5@r2   )g@ȽUЛ'?g9\g+%r3   )gRQQ?gGzgffffffr4   )gר#w?î?gk#egC,Nr5   )g@42
gF(@gcs@@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   Zallclose)r7   r%   Z
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Wrh   M_sqrtmr]   M_sqrtm_round_tripM_logmZ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 
Nrc   r=   rd                 ?re   rf   rg   Fr?   )	r#   ri   rj   rk   rl   rm   r   r   r   )r7   rp   rq   rr   rs   rw   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?   )scipyrn   ro   r   anyr#   r   r$   r   r"   charcomplex)r7   complex_dtype_charsmatrix_as_listrt   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!   {Gz?Fr?   )r$   r   r#   r   r   rn   ro   r   absoluter   sumr   
issubdtyper"   Zinexactr   r   )r7   rs   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"   Zcomplexfloating)r7   rs   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   rz   r=   Fr?   rX   r[   )
r#   r   ZasarrayTr   r   r   r   r   r   )r7   r%   Brs   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   ZLogmNearlySingularWarningr   r   r   r   )r7   rs   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   rz   rf   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   rp   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   Zlog_aa0Z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!   )pytestZwarnsRuntimeWarningr   r   r#   zeros)r7   r"   r&   r&   r'   test_no_ZeroDivisionError   s
   Pz"TestLogM.test_no_ZeroDivisionErrorN)rR   rS   rT   r;   r_   rb   rx   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 )	Nrc   r=   rd   re   rf   rg   Fr?   	r#   ri   RandomStaterk   rl   rm   r   r   r   	r7   rngrp   rq   rr   rs   ru   r]   rv   r&   r&   r'   rx     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 ry   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   sarp   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 ]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   rn   ro   r   r   r#   r   r$   r   r"   r   r   r7   r   r   rt   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   rn   ro   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 )	Nrc   r=      rz   Fr   r   
   )
r#   ri   rj   rk   randrl   r   r   rn   matrix_power)r7   rp   r%   ZA_sqrtm_defaultr]   r   Z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   Z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 )Nrc   r   Tr?   )r#   ri   rj   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               @rf   r                       ?      ?r         ?      rX   r   )r   r#   r   r   r7   rs   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#   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 )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Gz?r=   )r#   r   fillZfill_diagonalZ	isrealobjr   r7   rs   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   Zuint8r   r"   float64Zuint16Zuint32Z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   rf   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   rf   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   rf   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   rx   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 )Nrc   r=   r   rz   re   rf   rg   
r#   ri   rj   rk   rl   rm   r   rn   r   r   r7   prp   rq   rr   rs   Z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 )Nrc   r=   r   re   rf   rg   r  r  r&   r&   r'   rx     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 )Nrc   )r   r   r   r   rz   皙?r   gigffffff@r   )	r#   ri   rj   rk   rl   r   rn   r   r   )r7   rp   irs   Z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   re   sizeTFr   rz   r?   )r#   ri   default_rngrk   integersexpchoicer   r   r   r   )r7   r   nsamplesr  rp   r  Zmatrix_scaler%   A_powerr\   r]   Z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   gdy=r   )r   g?r=   r   )
r(   r   r#   r   r   r   Z_remainder_matrix_powerr   r   r   )	r7   r%   ZA_funm_sqrtr]   r   ZA_rem_powerr  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 )Nrc   r   rz   r   r=   )	r#   ri   rj   rl   rk   r   Z_briggs_helper_functionZexp2r   )r7   r8   kZ
x_observedZ
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   rn   ro   r   r   r#   r   r$   r   r"   r   r   r7   r   r   rt   r  r%   r  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   rn   ro   r   r   r#   r   r   r   r"   r   r$   r!  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   rd   r   )r   r=   r=   )r   r   r=   r!   )gffffffr   r  g)r  gzG?)	r$   r   r#   r   r   r   r   r   r   )r7   r   Znewtyper%   r  r  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   rf   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|   rx   r  r  r   r  r"  r#  r   r   r   r$  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   r)  r   r   r%   ZA0resultZ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=   rf   r   r~   f)
r#   r   r   r   r   Zastyper   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=   rf   r   r   r   re   r~   )orderr   rV   r   rd   )r#   r   r   r   r   )r7   r   r8   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 )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)  r2  r!   d   r   i  i  )r   r2  r2  rg   r   )r#   r   r$   ri   r  r  r   copyr   r   Ztestingr   r   rk   )
r7   r%   r   r  jZAmrW   r	  Z	first_resZnext_resr&   r&   r'   test_gh18086   s   zTestExpM.test_gh18086N)rR   rS   rT   r&  r(  r   r   r   r   r   r   r   r   r   r   r   r$   r#   r   r   r   r+  r-  r1  r   r   Z	fail_slowr6  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|| qJd S )Nr=   r   r   rf   r   rd   rV   r   r   r   r=   r   r   r   r   rd   r!   r=   r   r   rd   r   rf   rV   r   methodSPSblockEnlarge)r#   r   r$   r   rn   r   r   r   )	r7   rs   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 )Nr8  r9  r:  r;  r!   r=   r   r   rd   r   rf   rV   r   )r=   r   r   rV   rg            r   r   )r#   r   r$   r   rn   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_1rr   rs   r%   r   r?  r@  rB  rC  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 r3  rf   r      r  r=   gHj>r   gHz>)r#   ri   r  uniformnormalZstandard_cauchyexponentialrk   r  r  r   rn   r   vstackZhstackZ
zeros_liker   r   r   )r7   r   ZrfuncsZntestsr  ZrfuncrN  rp   rI  rJ  rK  rr   r%   r   rs   r?  r@  rB  rC  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vP?g^?guÝ?r!   gS,?g| @gJt?g~3?r=   r=  r<  r>  )r#   r   r$   r   rn   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  r=  rV  r>  )r#   ri   rS  r   r   )r7   rp   r%   r   rW  rX  rY  rZ  r&   r&   r'   test_medium_matrix~  s   


z"TestExpmFrechet.test_medium_matrixN)rR   rS   rT   rD  rO  rU  r[  r   r   slowskipr\  r&   r&   r&   r'   r7    s    !r7  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   rf  c                 C   s   | t j|t j|   S r_  )r   rn   r   )r%   r   r&   r&   r'   _normalized_like  s   rg  c                 C   s(   | |}| || }t || t | S r_  )r   )r,  r%   rd  r   re  r&   r&   r'   _relative_error  s   rh  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 )Nrc   r=   rf   r   )r#   ri   rj   rk   rl   r   r	   )r7   rp   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ٙBgx@g  =g ZdB)r   gzNV7g@g  2p)r   r   gᙥT g?W[E@)r   r   r   gT!g yhG)r#   r   r   r	   )r7   r%   rj  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 )N90  r0  r   rE  )numr   r   r   r=   r   )r#   ri   rj   Zlinspacer   r   r   absrm   rk   rl   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 )	Nrm  r`   r   r   r   zL-BFGS-BrV  r=   )r#   ri   r   rk   randintrl   r   rn   r   r   r   	functoolspartialrf  r   r   rp  rg  r`  r   rh  r   r	   )r7   r   rc  r  r  rp   r%   ra  r   rb  rj  r,  guessoutZxoptZyoptZp_bestZp_best_relerrr5  Zp_randZp_rand_relerrr&   r&   r'   test_expm_cond_fuzz  s6   
z+TestExpmConditionNumber.test_expm_cond_fuzzN)
rR   rS   rT   rk  rl  rq  r   r   r]  rw  r&   r&   r&   r'   ri    s    
ri  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   rf   r   rd   rV   r      rP  rG            )rf   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   rf   r   rd   r=   r   r   rf   r   Z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   rg   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   rf   r   rd   rV   r   c                    s0   g | ]}t  d d |f d d |f qS r_  )r#   Zkron)r   r  r8   r~  r&   r'   
<listcomp>  s    (z@TestKhatriRao.test_equality_of_two_equations.<locals>.<listcomp>)r   r   r#   rT  rk   r   r   r
   )r7   Zres1Z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   )rG  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'   rx    s    
rx  )6__doc__rs  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   r   r   r   r   r   r   Zscipy.linalg._matfuncsr   Zscipy.linalg._matfuncs_inv_ssqr   Zscipy.linalg._expm_frechetZscipy.optimizer   r(   r)   rU   r   r  r%  r7  rf  rg  rh  ri  rx  r&   r&   r&   r'   <module>   s:    H+ 0   :Rw	E