B
    `                 @   s\  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mZ ddlZddlZddlmZmZmZmZmZmZmZmZmZmZ ddlmZ ddlZddl m!Z! dd	 Z"G d
d de#Z$G dd de#Z%G dd de#Z&G dd de#Z'G dd de#Z(G dd de#Z)dd Z*dd Z+dd Z,G dd de#Z-G dd de#Z.dS ) z, Test functions for linalg.matfuncs module

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

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

    g3d?g     L@r   gRal!A?gQI?g^?)dtype)npr   float)A r   O/home/dcms/DCMS/lib/python3.7/site-packages/scipy/linalg/tests/test_matfuncs.py%_get_al_mohy_higham_2012_experiment_1   s    


r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
	TestSignMc          
   C   s   t dddddgdddd	d
gddddd
gddddd
gdddddgg}t dddddgdddddgdd d!d"d gd#d$d%d&d$gd'd(d)d*d(gg}t|}t|| d S )+Ng333333=@g3333338g     `Q@gfffffH@g      @gffffff"g@g      2g0g       g      $g      @g      4g333333#g333333#@g     9g.g#@g333333g      2@g3333332@g       @g'@g'Rqgy.@ge@5@g@ȽgUЛ'?g9\g+%gRQgQ?gGzgffffffgר#gw?î?gk#egC,Ng@g42
gF(@gcs@@)r   r   r	   )selfaZcrrr   r   r   	test_nils2   s    zTestSignM.test_nilsc             C   s@   t ddddgddddgddddgddddgg}t|dd d S )Ng           r   F)disp)r   r   )r!   r"   r   r   r   test_defective1@   s    0zTestSignM.test_defective1c          
   C   sT   t dddddgdddd	d
gddddd
gddddd
gdddddgf}t|dd d S )Ng333333=@g3333338g     `Q@gfffffH@g      @gffffff"g@g      2g0g       g      $g      @g      4g333333#g333333#@g     9g.g#@g333333g      2@g3333332@g       @F)r&   )r   r   )r!   r"   r   r   r   test_defective2E   s    zTestSignM.test_defective2c             C   s   t dddddddgdddddddgdddddddgdddddddgdddddddgdddddddgdddddddgg}t|d	d
 d S )Ng       g      9@g        g      g      $@g      @g       @g      .@F)r&   )r   r   )r!   r"   r   r   r   test_defective3O   s    zTestSignM.test_defective3N)__name__
__module____qualname__r$   r'   r(   r)   r   r   r   r   r    0   s   
r    c               @   sd   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd ZdS )TestLogMc             C   s   t dddddddgdddddddgdddddddgdddddddgdddddddgdddddddgdddddddgg}td	d
 d | }t|dd d S )Ng       g      9@g        g      g      $@g      @g       @g      .@   g@y                F)r&   )r   r   r   )r!   r"   mr   r   r   r$   ]   s    zTestLogM.test_nilsc             C   s2   t  }t|dd\}}t|}t||ddd d S )NF)r&   gh㈵>g+=)rtolatol)r   r   r   r
   )r!   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 )NF)r&   gh㈵>g+=)r0   r1   )r   r   r   logr   r   Zallclose)r!   r   Z
A_funm_logr3   r4   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 xtddD ]}t j||}xt dddD ]n}|| }t j|}d||}t	|dd	\}}|
|}	t|	| t|dd	\}
}t|
}t|||d
 q:W qW d S )Ni  r%         	   zM:{0} eivals:{1}F)r&   )err_msg)r   randomseedrangerandnlogspacelinalgeigvalsformatr   r   r
   r   r   )r!   n
M_unscaledscaleMWr<   M_sqrtmr3   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 xttddD ]f}t j||dt j||  }x@t dddD ].}|| }t|dd	\}}t|}t|| qLW qW d S )
Ni  r%   r8   y              ?r9   r:   r;   F)r&   )	r   r=   r>   r?   r@   rA   r   r   r
   )r!   rE   rF   rG   rH   rL   r3   M_round_tripr   r   r   test_round_trip_random_complex   s     z'TestLogM.test_round_trip_random_complexc             C   s   d}xddgddggddgddggddgddggddgddggfD ]}t j|}ttdd |D   tj|td}t|d	d
\}}t|j	j
|k tj|td}t|d	d
\}}t|j	j
|k tj|td }t|d	d
\}}t|j	j
|k qBW d S )N)FDGr%   r         c             s   s   | ]}|j p|jd k V  qdS )r   N)imagreal).0wr   r   r   	<genexpr>   s    zFTestLogM.test_logm_type_preservation_and_conversion.<locals>.<genexpr>)r   F)r&   )scipyrB   rC   r   anyr   r   r   r   r   charcomplex)r!   complex_dtype_charsmatrix_as_listrI   r   r2   r3   r   r   r   *test_logm_type_preservation_and_conversion   s"    z3TestLogM.test_logm_type_preservation_and_conversionc             C   s   dddgdddgdddgg}xtt 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&W d S )Nr%   rS   )r   g{Gz?F)r&   )r   r]   r   r   rZ   rB   rC   r   absoluterU   sumr   
issubdtyper   Zinexactr
   r   )r!   rH   dtXrX   Yr3   r   r   r   test_complex_spectrum_real_logm   s    z(TestLogM.test_complex_spectrum_real_logmc             C   sr   xlddgddggddgddggfD ]H}xBt tfD ]6}tj||d}t|dd\}}tt|jtj q0W q"W d S )Nr%   r   )r   F)r&   )	r   r]   r   r   r   r   rc   r   Zcomplexfloating)r!   rH   rd   r   r2   r3   r   r   r   test_real_mixed_sign_spectrum   s    z&TestLogM.test_real_mixed_sign_spectrumc             C   sz   t ddgddgg}t ddgddgg}xH||j||jfD ]4}tj}t|t|dd\}}t|}t	||dd q>W d S )Nr   y              ?r%   F)r&   g+=)r1   )
r   r   ZasarrayTr   ZLogmExactlySingularWarningr   r   r   r
   )r!   r   BrH   expected_warningLr3   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.++F)r&   g+=)r1   )r   r   r   ZLogmNearlySingularWarningr   r   r   r
   )r!   rH   rl   rm   r3   rn   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%   rh   g      ?g+=)r1   y              ?r:   y             rS   )r   pir
   r   r   )r!   rn   rm   r   r   r   &test_opposite_sign_complex_eigenvalues   s    *$z/TestLogM.test_opposite_sign_complex_eigenvaluesN)r*   r+   r,   r$   r5   r7   rM   rO   r`   rg   ri   ro   rp   rr   r   r   r   r   r-   [   s   
	r-   c               @   s|   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd ZdS )	TestSqrtMc             C   sv   t jd xdtddD ]V}t j||}xBt dddD ]0}|| }t|dd\}}||}t|| q:W qW d S )	Ni  r%   r8   r9   r:   r;   F)r&   )	r   r=   r>   r?   r@   rA   r   r   r
   )r!   rE   rF   rG   rH   rJ   r3   rK   r   r   r   rM      s    
z&TestSqrtM.test_round_trip_random_floatc             C   s   t jd xvtddD ]h}t j||dt j||  }xBt dddD ]0}|| }t|dd	\}}||}t|| qLW qW d S )
Ni  r%   r8   y              ?r9   r:   r;   F)r&   )	r   r=   r>   r?   r@   rA   r   r   r
   )r!   rE   rF   rG   rH   rJ   r3   rK   r   r   r   rO      s     
z(TestSqrtM.test_round_trip_random_complexc             C   s   d}t |}tddddgd|ddgdd|dgddddgg}tddddgd|ddgdd|dgddddgg}|jd }tt||| t|d|dd }tt||| t|dddd }tt||| d S )	Ng      ?g      ?r   r%   g      ?F)r&   	blocksizerS   )r   r   shaper	   r   r   )r!   eser"   sarE   Zesar   r   r   test_bad  s     




zTestSqrtM.test_badc             C   s  d}xddgddggddgddggddgddggddgddggddgddggfD ]}t j|}ttdd |D   tj|td}t|d	d
\}}t|j	j
|k tj|td}t|d	d
\}}t|j	j
|k tj|td }t|d	d
\}}t|j	j
|k qRW d S )N)rP   rQ   rR   r%   r   rS   rT   c             s   s   | ]}|j p|jd k V  qdS )r   N)rU   rV   )rW   rX   r   r   r   rY   %  s    zHTestSqrtM.test_sqrtm_type_preservation_and_conversion.<locals>.<genexpr>)r   F)r&   )rZ   rB   rC   r   r[   r   r   r   r   r   r\   r]   )r!   r^   r_   rI   r   A_sqrtmr3   r   r   r   +test_sqrtm_type_preservation_and_conversion  s$    z5TestSqrtM.test_sqrtm_type_preservation_and_conversionc             C   s   d}xddgddggddgddggdddgdddgdddggfD ]}t j|}ttdd |D  tj|td}t|dd	\}}t|j	j
|k tj|td}t|dd	\}}t|j	j
|k q@W d S )
N)rP   rQ   rR   r%   r   rh   c             s   s   | ]}|j p|jd k V  qdS )r   N)rU   rV   )rW   rX   r   r   r   rY   ?  s    zVTestSqrtM.test_sqrtm_type_conversion_mixed_sign_or_complex_spectrum.<locals>.<genexpr>)r   F)r&   )rZ   rB   rC   r   r[   r   r   r]   r   r   r\   r   )r!   r^   r_   rI   r   rz   r3   r   r   r   9test_sqrtm_type_conversion_mixed_sign_or_complex_spectrum6  s    "zCTestSqrtM.test_sqrtm_type_conversion_mixed_sign_or_complex_spectrumc             C   s   t jd xtddD ]z}t j||dt j||  }t|d|d\}}t|t j	|d x.tddD ] }t|d|d\}}t|| qnW qW d S )	Ni  r%      y              ?F)r&   rt   rS   
   )
r   r=   r>   r?   randr@   r   r
   rB   matrix_power)r!   rE   r   ZA_sqrtm_defaultr3   rt   ZA_sqrtm_newr   r   r   test_blocksizesK  s     zTestSqrtM.test_blocksizesc             C   sH   t  }t|dd\}}||}t||dd tt|t| d S )NF)r&   gh㈵>)r0   )r   r   r   r
   r   tril)r!   r   rz   r3   r4   r   r   r   %test_al_mohy_higham_2012_experiment_1V  s
    
z/TestSqrtM.test_al_mohy_higham_2012_experiment_1c          	   C   sn   xht tfD ]\}tjddddgddddgddddgddddgg|d}t|dd\}}tt|  q
W d S )Nr   rT   )r   F)r&   )intr   r   r   r   r   isnanall)r!   rd   r   rz   r3   r   r   r   test_strict_upper_triangular^  s    


z&TestSqrtM.test_strict_upper_triangularc             C   s   xt tfD ]}tjdddgdddgdddgg|d}tjdddgdddgdddgg|d}t||| t|dd\}}tt|	  q
W d S )Nr   r%   )r   F)r&   )
r   r   r   r   r   r   r   r   r   r   )r!   rd   r   rk   ZB_sqrtmr3   r   r   r   test_weird_matrixi  s    zTestSqrtM.test_weird_matrixc             C   s:   t jd t jdd}t|dd}t||| d S )Ni  rT   T)r&   )r   r=   r>   r   r   r
   r   )r!   r   rk   r   r   r   	test_dispz  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 )
Ny               @r:   r   y              y      ?      ?rS   y      ?      g+=)r1   )r
   r   r   r   )r!   rH   Rr   r   r   rr     s    z0TestSqrtM.test_opposite_sign_complex_eigenvaluesc          
   C   s   t ddddgddddgddddgddddgg}t tdddtdgddddgddddgtdddtdgg}tt |||dd tt||dd d S )Nr%   r   g      ?g+=)r1   )r   r   r   r
   r   r   )r!   rH   r   r   r   r   test_gh4866  s    



zTestSqrtM.test_gh4866c             C   sP   t dddg}t tdddg}tt |||dd tt||dd d S )NrS   r%   r   g+=)r1   )r   Zdiagr   r
   r   r   )r!   rH   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)rS   rS   g+=)r1   )r   zerosr
   r   r   )r!   rH   r   r   r   r   test_gh7839  s    

zTestSqrtM.test_gh7839N)r*   r+   r,   rM   rO   ry   r{   r|   r   r   r   r   r   rr   r   r   r   r   r   r   r   rs      s   

rs   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 xtddD ]~}xxtddD ]j}t j||dt j||  }xDt dddD ]2}|| }t|d| }t j||}t	|| q\W q(W qW d S )Ni  r%      y              ?r9   r:   r;   )
r   r=   r>   r?   r@   rA   r   rB   r   r
   )r!   prE   rF   rG   rH   M_rootrN   r   r   r   rO     s     z8TestFractionalMatrixPower.test_round_trip_random_complexc             C   s   t jd xztddD ]l}xftddD ]X}t j||}xDt dddD ]2}|| }t|d| }t j||}t	|| qJW q(W qW d S )Ni  r%   r   r9   r:   r;   )
r   r=   r>   r?   r@   rA   r   rB   r   r
   )r!   r   rE   rF   rG   rH   r   rN   r   r   r   rM     s    z6TestFractionalMatrixPower.test_round_trip_random_floatc             C   s   t jd xdD ]}xt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 W qW d S )Ni  )rS   rT   r   r~   y              ?g?r   gigffffff@   )	r   r=   r>   r?   r@   r   rB   r   r
   )r!   rE   irH   ZM_one_fifthrN   re   rf   r   r   r   (test_larger_abs_fractional_matrix_powers  s    
 




zBTestFractionalMatrixPower.test_larger_abs_fractional_matrix_powersc             C   s   t jd d}xt|D ]}tdd}t j }t tdd}t j||}tdrt|dt j||  }|| }t||}t	|dd	\}}	t
|| }
t||
 qW d S )
Ni     r%   r   r9   )TFy              ?F)r&   )r   r=   r>   r?   	randranger@   expchoicer   r   r   r
   )r!   nsamplesr   rE   r   Zmatrix_scaler   A_powerr2   r3   ZA_power_expm_logmr   r   r   test_random_matrices_and_powers  s    


z9TestFractionalMatrixPower.test_random_matrices_and_powersc       	      C   s   t  }t|tjdd\}}t|dd\}}t|d}t|d}t|| t	|| t	|| xLdD ]D}t||}t|d| }t	||dd t	t
|dt
|d qdW d S )NF)r&   g      ?)g      ?g?r%   g{Gz?)r0   )r   r   r   r   r   r   Z_remainder_matrix_powerr   r   r
   r   )	r!   r   ZA_funm_sqrtr3   rz   ZA_rem_powerr   r   r4   r   r   r   r     s    





z?TestFractionalMatrixPower.test_al_mohy_higham_2012_experiment_1c             C   sr   t jd x`t jddt jd  D ]@}x:tdD ].}t||}|t |  d }t|| q8W q*W d S )Ni  r~   y              ?r   r%   )	r   r=   r>   r@   r?   r   Z_briggs_helper_functionZexp2r
   )r!   r"   kZ
x_observedZ
x_expectedr   r   r   test_briggs_helper_function  s    "z5TestFractionalMatrixPower.test_briggs_helper_functionc             C   s   d}xd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   xdD ]~}tj|td	}t||}t|j	j
|k tj|td	}t||}t|j	j
|k tj|td	 }t||}t|j	j
|k qpW qBW d S )
N)rP   rQ   rR   r%   r   rS   rT   c             s   s   | ]}|j p|jd k V  qdS )r   N)rU   rV   )rW   rX   r   r   r   rY     s    zRTestFractionalMatrixPower.test_type_preservation_and_conversion.<locals>.<genexpr>)g333333gg?gffffff
@)r   )rZ   rB   rC   r   r[   r   r   r   r   r   r\   r]   )r!   r^   r_   rI   r   r   r   r   r   r   %test_type_preservation_and_conversion  s$    



z?TestFractionalMatrixPower.test_type_preservation_and_conversionc             C   s   d}xddgddggddgddggdddgdddgdddggfD ]}t j|}ttdd |D  x\dD ]T}tj|td}t||}t|j	j
|k tj|td}t||}t|j	j
|k qlW q@W d S )	N)rP   rQ   rR   r%   r   rh   c             s   s   | ]}|j p|jd k V  qdS )r   N)rU   rV   )rW   rX   r   r   r   rY   .  s    z`TestFractionalMatrixPower.test_type_conversion_mixed_sign_or_complex_spectrum.<locals>.<genexpr>)g333333gg?gffffff
@)r   )rZ   rB   rC   r   r[   r   r   r]   r   r   r\   r   )r!   r^   r_   rI   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.)reasonc             C   s   xddgddggddgddggddgddggdddgdddgdddggfD ]~}xxt tfD ]l}tj||d}x(dD ] }t||}tt|  qpW x.d	D ]&}t||}t|d| }t|| qW qXW qJW d S )
Nr   r%   rS   rT   r8   rh   )r   )gffffffgg333333g)g?gzG?)	r   r]   r   r   r   r   r   r   r
   )r!   r_   Znewtyper   r   r   r4   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 )Ny               @r:   r   y              y      ?      ?rS   y      ?      g+=)r1   g      ?)r
   r   r   r   )r!   rH   r   r   r   r   rr   R  s    z@TestFractionalMatrixPower.test_opposite_sign_complex_eigenvaluesN)r*   r+   r,   rO   rM   r   r   r   r   r   r   pytestmarkZxfailr   rr   r   r   r   r   r     s   #r   c               @   s$   e Z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 )Ng        r   r%   )r   r	   r   )r!   r"   r   r   r   	test_zeroZ  s    zTestExpM.test_zeroc             C   s   ddl m} d}d}||ggdd}||ggdd}t|}t|}tt|t| tt|t| t|d tdd	 t|d td
d d S )Nr   )
csc_matrixy       ~6 y       vr]   )r   )r   r   gGj/ܿghкg藣EgG)| ()Zscipy.sparser   r   r   typer
   r]   )r!   r   ZvOneZvTwoZmOneZmTwoZoutOneZoutTwor   r   r   test_single_elt^  s    zTestExpM.test_single_eltc             C   s$   t d}t|}|jdks td S )N)r   r   r   )r   r   r   sizeAssertionError)r!   r   resultr   r   r   test_empty_matrix_inputs  s    
z TestExpM.test_empty_matrix_inputN)r*   r+   r,   r   r   r   r   r   r   r   r   Y  s   r   c               @   sJ   e Zd Zdd Zdd Zdd Zdd Zejj	ejj
d	d
dd ZdS )TestExpmFrechetc       	      C   s   t jddddgddddgd	d	ddgd	d	ddggtd
}t jddgddggtd
}t jddgddggtd
}tj|}tj|d ddd f }x@i ddiddifD ]*}t||f|\}}t|| t|| qW d S )Nr%   rS   rT   r:   r   r8   r.   r}   r   )r   methodSPSblockEnlarge)r   r   r   rZ   rB   r   r   r
   )	r!   rH   r   rn   expected_expmexpected_frechetkwargsobserved_expmobserved_frechetr   r   r   test_expm_frechet|  s(    



z!TestExpmFrechet.test_expm_frechetc             C   sN  t jddddgddddgd	d	ddgd	d	ddggtd
}t jddgddggtd
}t jddgddggtd
}tj|d}ddddddddg}t|d d |dd  }x|D ]\}}tjjj| }	tjjj| }
d|	|
  }|| }|| }|| }|| }tj	|}tj	|d ddd f }t
||\}}t|| t|| qW d S )Nr%   rS   rT   r:   r   r8   r.   r}   r   )r   r;            rh   g      ?)r   r   r   rZ   rB   r   zipZ_expm_frechetZell_table_61r   r   r
   )r!   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_1rG   rH   r   rn   r   r   r   r   r   r   r   test_small_norm_expm_frechet  s<    



z,TestExpmFrechet.test_small_norm_expm_frechetc          	   C   s
  t jjt jjt jjt jjf}d}xt|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|| t|| q*W d S )Nd   g      ?rS      )r   r%   )r   r=   uniformnormalZstandard_cauchyexponentialr?   r   expovariater   rZ   rB   r   vstackZhstackZ
zeros_liker   r   r
   )r!   ZrfuncsZntestsr   Zrfuncr   rE   r   r   r   rG   r   rn   rH   r   r   r   r   r   r   r   	test_fuzz  s.    



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   rZ   rB   r   r   r
   )r!   r   rn   sps_expmsps_frechetblockEnlarge_expmblockEnlarge_frechetr   r   r   test_problematic_matrix  s    
z'TestExpmFrechet.test_problematic_matrixzthis test is deliberately slow)r   c             C   sd   d}t jj||fd}t jj||fd}t||dd\}}t||dd\}}t|| t|| d S )Ni  )r   r   )r   r   )r   r=   r   r   r
   )r!   rE   r   rn   r   r   r   r   r   r   r   test_medium_matrix  s    
z"TestExpmFrechet.test_medium_matrixN)r*   r+   r,   r   r   r   r   r   r   slowskipr   r   r   r   r   r   z  s   !r   c       
      C   sL   t || j}t|}|| ||  }t| | }t|| ||  }	|	 S )N)r   reshaperu   r   r   )
r   A_normre   X_normepsr   Zp_normperturbationX_primeZscaled_relative_errorr   r   r   _help_expm_cond_search  s    r   c             C   s   | t j|t j|   S )N)rZ   rB   r   )r   rk   r   r   r   _normalized_like  s    r   c             C   s(   | |}| || }t || t | S )N)r   )fr   r   re   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   sD   t jd x2tddD ]$}t j||}t|}td| qW d S )Ni  r%   r:   r   )r   r=   r>   r?   r@   r   r   )r!   rE   r   kappar   r   r   test_expm_cond_smoke  s
    z,TestExpmConditionNumber.test_expm_cond_smokec          	   C   sH   t ddddgddddgddd	d
gddddgg}t|}td| d S )Ng(gٙBgx@g  =g ZdBr   gzNV7g@g  2pgᙥT g?W[E@gT!g yhG)r   r   r   r   )r!   r   r   r   r   r   test_expm_bad_condition_number  s    


z6TestExpmConditionNumber.test_expm_bad_condition_numberc             C   s   t jd x8t jddddD ]$}t |gg}tt|t| qW x8t jddddD ]$}t |gg}tt|t| qXW x6t	dD ]*}t j
d	d	}tt|t |d
  qW d S )Ni90  r   r   )numrS   r~   r%   )r   r   )r   r=   r>   Zlinspacer   r
   r   absrA   r?   r@   ra   )r!   xr   r   r   r   r   test_univariate  s    z'TestExpmConditionNumber.test_univariatec          	   C   sP  t jd d}d}x4t|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|| |  xPtdD ]D}|tt jj|j | }tt|t| tt	||}t|| qW t|dd|  | |	  q W d S )	Ni90  gh㈵>r~   rS   r   zL-BFGS-B)r   r%   )r   r=   r>   r?   randintr@   rZ   rB   r   r   r   	functoolspartialr   Zonesr   r   r   r   ru   r   r
   r   )r!   r   r   r   rE   r   r   re   r   r   r   guessoutZxoptZyoptZp_bestZp_best_relerrjZp_randZp_rand_relerrr   r   r   test_expm_cond_fuzz!  s2    z+TestExpmConditionNumber.test_expm_cond_fuzzN)
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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%   rS   rT   r:   r   r8   r.   r}      r   r             )r:   rS   )r   r   r   r   emptyru   )r!   r"   br   r   r   
test_basicJ  s    zTestKhatriRao.test_basicc          	   C   sP   t t< tdddgdddgg}tddgddgg}t|| W d Q R X d S )Nr%   rS   rT   r:   r   r8   )r   raises
ValueErrorr   r   )r!   r"   r   r   r   r   test_number_of_columns_equalityV  s    
z-TestKhatriRao.test_number_of_columns_equalityc          	   C   s   t t, tdddg}tdddg}t|| W d Q R X t t6 tdddg}tdddgdddgg}t|| W d Q R X t t6 tdddgddd	gg}tdddg}t|| W d Q R X d S )
Nr%   rS   rT   r:   r   r8   r.   r}   r;   )r   r   r   r   r   )r!   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%   rS   rT   r:   r   r8   r.   r}   c                s0   g | ](}t  d d |f d d |f qS )N)r   Zkron)rW   r   )r"   r   r   r   
<listcomp>|  s   z@TestKhatriRao.test_equality_of_two_equations.<locals>.<listcomp>)r   r   r   r   r?   ru   rj   r   )r!   Zres1Zres2r   )r"   r   r   test_equality_of_two_equationsw  s    
z,TestKhatriRao.test_equality_of_two_equationsN)r*   r+   r,   r   r   r   r   r   r   r   r   r   H  s   r   )/__doc__r=   r   numpyr   r   r   r   r   Znumpy.testingr   r   r   r	   r
   r   r   r   Zscipy.linalgrZ   r   r   r   r   r   r   r   r   r   r   r   Zscipy.linalg._expm_frechetZscipy.optimizer   r   objectr    r-   rs   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s4   $0+  4 :!v	E