a
    CCCf                     @   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   gQI?r   )r   r   r   g^?dtype)npr   float)A r   \/var/www/html/django/DPS/env/lib/python3.9/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@r+   )g@ȽUЛ'?g9\g+%r,   )gRQQ?gGzgffffffr-   )gר#w?î?gk#egC,Nr.   )g@42
gF(@gcs@@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   {Gz?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Gz?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sJ 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sJ 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sJ t jddgddggt jd}t|jt j	ksJ 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rt jdt jd}t|jt jksJ 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sJ t	t drt	t drt jddgddggt j
d}t|jt jksJ 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rt 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sJ 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igffffff@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   gdy=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|| qqNqBd S )Nr   r6   rz   r{   r]   r   )r   r6   r6   )r   r   r6   r   )gffffffr  r  g)r   gz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sJ 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
||	 qd S )
N)  r  r   d   r   i  i  )r   r  r  r`   r   )r   r   r   rb   Zdefault_rngZintegersr   copyr   r   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|| qd 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|| qd 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   gHj>r   gHz>)r   rb   uniformnormalZstandard_cauchyexponentialrd   r   expovariater   r   rg   r   vstackZhstackZ
zeros_liker   r   r   )r0   ZrfuncsZntestsr   Zrfuncr6  ri   r1  r2  r3  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vP?g^?guÝ?r   gS,?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  r9  r%  r@  r&  )r   rb   r<  r   r   )r0   ri   r   r   rA  rB  rC  rD  r   r   r    test_medium_matrixW  s    


z"TestExpmFrechet.test_medium_matrixN)rK   rL   rM   r,  r7  r?  rE  r   r   slowskiprF  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    rP  c                 C   s   | t j|t j|   S rI  )r   rg   r   )r   r   r   r   r    _normalized_likeo  s    rQ  c                 C   s(   | |}| || }t || t | S rI  )r   )r  r   rN  r   rO  r   r   r    _relative_errors  s    rR  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ٙ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	   )r0   r   rT  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
  qd S )N90  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|| qt|dd|  | |	  qd S )	NrW  rY   r   rz   r   zL-BFGS-Br@  r6   )r   rb   rc   rd   randintre   r   rg   r   r   r   	functoolspartialrP  r   r   rZ  rQ  rJ  r   rR  r   r	   )r0   rM  r   r   ri   r   rK  r   rL  rT  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   rU  rV  r[  r   r   rG  ra  r   r   r   r    rS  y  s
   
rS  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      r8  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   rg  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 s0    Y  t t: tg dg dg}tg d}t|| W d    n1 s0    Y  d S )Nrj  rk  )rO   r   r`   rl  rg  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 rI  )r   Zkron)r   r   r1   rh  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   rp  r    test_equality_of_two_equations  s    

z,TestKhatriRao.test_equality_of_two_equationsN)rK   rL   rM   ri  rn  ro  rr  r   r   r   r    rb    s   rb  )/__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  rP  rQ  rR  rS  rb  r   r   r   r    <module>   s6    0+  } :Iv	E