3
Od_                 @   s  d Z ddlZddlZddlZddlZddlmZmZm	Z	m
Z
mZ ddlZddlmZ ddlmZmZmZmZmZmZ ddlmZ ddlmZmZmZ ddlmZmZ dd	lmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' G d
d de(Z)G dd de(Z*e* Z+dd Z,dd Z-d<ddZ.dd Z/dd Z0dd Z1dd Z2dd Z3dd  Z4d!d" Z5d#d$ Z6d%d& Z7ej8j9d'ee e!e"e#e$e&e'gd(d) Z:ej8j9d'ee e!e"e#e$e%e&e'g	d*d+ Z;ej8j9d'ej<e#ej8j=ej> d,koej?d- d.kd/d0d1e$ej<e&ej8j=ej> d2kd3d0d1ej<e ej8j=d1ej<e!ej8j=d1ej<e"ej8j=d1ej<e'ej8j=d1gd4d5 Z@ej8j9d'ee e!e"e#e$e%e&e'g	d6d7 ZAG d8d9 d9e(ZBG d:d; d;e(ZCdS )=z4 Test functions for the sparse.linalg.isolve module
    N)assert_equalassert_array_equalassert_assert_allclosesuppress_warnings)raises)zerosarangearrayoneseyeiscomplexobj)norm)spdiags
csr_matrixSparseEfficiencyWarning)LinearOperatoraslinearoperator)	cgcgsbicgbicgstabgmresqmrminreslgmresgcrotmkc               @   s   e Zd ZdddZdd ZdS )CaseNc             C   s`   || _ || _|d kr*t|jd td| _n|| _|d kr@g | _n|| _|d krVg | _n|| _d S )Nr   )dtype)nameAr	   shapefloatbskipnonconvergence)selfr   r    r#   r$   r%    r'   c/var/www/html/virt/lib64/python3.6/site-packages/scipy/sparse/linalg/isolve/tests/test_iterative.py__init__   s    zCase.__init__c             C   s
   d| j  S )Nz<%s>)r   )r&   r'   r'   r(   __repr__*   s    zCase.__repr__)NNN)__name__
__module____qualname__r)   r*   r'   r'   r'   r(   r      s   
r   c               @   s   e Zd Zdd ZdS )IterativeParamsc             C   s  t ttttttttg	}tt g}t g}tg}|| _	g | _
d}td|f}d|dd d f< d"|dd d f< d#|dd d f< t|dd$dg||dd}td|| _| j
jtd| | j
jtd|jd	tgd
 | j
jtd| |d
 | j
jtd| jd	|tg d
 tdd%ddd&ddd'd(dg
gdd}t|dgdddd}| j
jtd||d
 | j
jtd|jd	|d
 tjjd tjjdd}| j
jtd||| d
 | j
jtd|jd	|| d
 tjjd tjjdd}||j }| j
jtd||d
 | j
jtd|jd	|d
 tjjd tjjdd}tj|j |j}| j
jtd| | j
jtd|jd	tgd
 tjjd tjjdddtjjdd  }| j
jtd||| | d
 | j
jtd|jd|| | d
 tjjd tjjdddtjjdd  }||jj  }| j
jtd||| d
 | j
jtd|jd|| d
 tjjd tjjdddtjjdd  }tj|j |j}| j
jtd||d
 | j
jtd|jd|d
 td)}d|dd d f< d*|dd d f< t|dd+gdddd}	| j
jtd|	|tttg d
 | j
jtd|	jd|tttg d
 tjddddddd,d-d.d/d0gddddddd1d2d3d4d5gddddddd6d7d8d9d:gddddddd;d<d=d>d?gddddddd@dAdBdCdDgdddddddEdFdGdHdIgdJddddddKdLdMdNdOgddPdddddQdRdSdTdUgdddVddddWdXdYdZd[gdddd\ddd]d^d_d`dagdddddbddcdddedfdgggtd}	tjdddddddddddgtd}
|	|	jkj st| j
jtd |	|
|ttttgd! d S )hN(         r      Zcsr)formatZ	poisson1df)r$   zneg-poisson1d         
         	   d)r   z	rand-diagi  randzrand-symzrand-sym-pdy              ?z
rand-cmplxFzrand-cmplx-hermzrand-cmplx-sym-pdZnonsymposdefz	sym-nonpd)r$   r%   r?   r?   r?   i)r1   r8   r?   r?   r?   r   r   r   r   r   r?   r   r   r   r   r   r?   r   r   r   r   r   r?   r   r   r   r   r   r?   r   r   r   r   r   r?   r?   r   r   r   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   solverscasesr   r   r   	Poisson1Dappendastyper
   nprandomseedr=   TdotZconjr"   allAssertionError)r&   rB   Zsym_solversZposdef_solversZreal_solversNdatarD   ZRandDiagr    r#   r'   r'   r(   r)   /   s    
"


   
"$zIterativeParams.__init__N)r+   r,   r-   r)   r'   r'   r'   r(   r.   .   s   r.   c                s`   j }d}j d  }g  fdd}| | ||d|d\}}ttd t|d d S )Ng-q=r   c                s   j t j|    d S )N)rE   r   r    )x)r#   case	residualsr'   r(   callback   s    zcheck_maxiter.<locals>.callbackr2   )x0tolmaxiterrS   )r    r#   r   len)solverrQ   r    rU   rT   rS   rP   infor'   )r#   rQ   rR   r(   check_maxiter   s    rZ   c              C   sN   t j} xBt jD ]8}|| jkrqt }|jtd t||  W d Q R X qW d S )Nz.*called without specifying.*)paramsrD   rB   r$   r   filterDeprecationWarningrZ   )rQ   rX   supr'   r'   r(   test_maxiter   s    
r_   :0yE>c             C   s8   t | | }|t | }d||f }t||k |d d S )Nz+residual (%g) not smaller than tolerance %g)msg)r   r   )ar#   rU   residualZ	tolerancera   r'   r'   r(   assert_normclose   s    rd   c             C   s   |j }|jjdkrd}nd}|j}d| }| ||||d\}}t|d|  | |jkrvt|d t|j|||d n2t	|dk t	t
jj|j|| t
jj|k d S )NZdDg:0yE>g{Gz?r   )rT   rU   )rU   )r    r   charr#   r   r%   r   rd   rK   r   rG   linalgr   )rX   rQ   r    rU   r#   rT   rP   rY   r'   r'   r(   check_convergence   s    

rg   c              C   sX   xRt jD ]H} xBt jD ]8}| |jkr$qt }|jtd t| | W d Q R X qW qW d S )Nz.*called without specifying.*)r[   rB   rC   r$   r   r\   r]   rg   )rX   rQ   r^   r'   r'   r(   test_convergence   s    
rh   c             C   s   d}ddd}|j }|j\}}td|j  gdg|| |j}d| }t|j||d}	| tkrx| |||	|	||d\}
}n| |||	||d\}
}t|d t|j	|
|| t
|}||_||_| ||||d	\}
}t|d t||
 ||d
 d S )Ng:0yE>c             S   s   | S )ztrivial preconditionerr'   )r#   whichr'   r'   r(   identity   s    z%check_precond_dummy.<locals>.identityg      ?r   )rmatvec)M1M2rT   rU   )MrT   rU   )rT   rU   )rU   )N)r    r!   r   Zdiagonalr#   r   r   r   rd   rK   r   ZpsolveZrpsolve)rX   rQ   rU   rj   r    rn   rN   r#   rT   precondrP   rY   r'   r'   r(   check_precond_dummy   s&    



rp   c              C   sN   t j} xBt jD ]8}|| jkrqt }|jtd t||  W d Q R X qW d S )Nz.*called without specifying.*)r[   rD   rB   r$   r   r\   r]   rp   )rQ   rX   r^   r'   r'   r(   test_precond_dummy  s    
rq   c                s   d}d fdd	}d fdd	}dg fdd} fd	d
} j }d| }t jj||d}	t jj||d}
dg| |	||
||d\}}t|d t jj||| td dkt d S )Ng:0yE>c                s(    j }t|tjs|j }tjj|| S )zinverse preconditioner)r    
isinstancerG   ndarraytodenserf   solve)r#   ri   r    )rQ   r'   r(   inverse  s    z&check_precond_inverse.<locals>.inversec                s*    j }t|tjs|j }tjj|j| S )zinverse preconditioner)r    rr   rG   rs   rt   rf   ru   rJ   )r#   ri   r    )rQ   r'   r(   rinverse"  s    z'check_precond_inverse.<locals>.rinverser   c                s   d  d7  <  j j| S )Nr   r2   )r    rK   )r#   )rQ   matvec_countr'   r(   matvec+  s    z%check_precond_inverse.<locals>.matvecc                s   d  d7  <  j jj| S )Nr   r2   )r    rJ   rK   )r#   )rQ   rx   r'   r(   rk   /  s    z&check_precond_inverse.<locals>.rmatvec)rk   )rn   rT   rU   r0   )N)N)	r#   r   r    r!   r   rd   rK   r   repr)rX   rQ   rU   rv   rw   ry   rk   r#   rT   r    ro   rP   rY   r'   )rQ   rx   r(   check_precond_inverse  s    
r{   c              C   sX   t j} xLt jD ]B}|| jkrq|tkr(qt }|jtd t||  W d Q R X qW d S )Nz.*called without specifying.*)	r[   rD   rB   r$   r   r   r\   r]   r{   )rQ   rX   r^   r'   r'   r(   test_precond_inverseD  s    
r|   c              C   s   t jt jdd d d d d d
f } t jd}d|d< t jj| | t &}|jtd t	| |ddd\}}W d Q R X t
|d ddd	 d S )Nr8   r2   r   z.*called without specifying.*r6   )restartrV   g`"?g{Gz?)rtolr?   )rG   Zvanderr	   r   rf   ru   r   r\   r]   r   r   )r    r#   r^   Zx_gmerrr'   r'   r(   test_gmres_basicP  s    &
r   c              C   s\   t tttttg} tttg}x<||  D ]0}t	  }|j
td t|||k W d Q R X q$W d S )Nz.*called without specifying.*)r   r   r   r   r   r   r   r   r   r   r\   r]   _check_reentrancy)Znon_reentrantZ	reentrantrX   r^   r'   r'   r(   test_reentrancy]  s    
r   c                sn    fdd}t jdd	d
g}td|||jd}|sBtt || n( ||\}}t|d t|dddg d S )Nc                s>   t jdddgdddgdddgg} || \}}t|d |S )Ng      ?r   g       @g      @)rG   r
   r   )rP   r    yrY   )rX   r'   r(   ry   g  s    "
z!_check_reentrancy.<locals>.matvecr2   g      ?r1   r0   )ry   rk   r   r   g      ?gUUUUUU?)r0   r0   )rG   r
   r   r   assert_raisesRuntimeErrorr   r   )rX   Zis_reentrantry   r#   opr   rY   r'   )rX   r(   r   f  s    

r   rX   c          	   C   st  t jjd t jjdd}|j|jdt jd  }dt jjd }t jj|}t j	dt j
t jdt jddt jf }t jjdd}|j|j}d d| d	| g}xtj|||D ]\}}}	|dkr|	dkrq| tkr|d k	rt|}tt jd}
nd }
| ||||
||	d
\}}n| |||||	d\}}t|d |j|| }t jj|}|| }t|t|	|k qW d S )Ni  r8   g     @@r   g|=g      Y@r7   gư>g    .A)rl   rm   rU   atol)rn   rU   r   )rG   rH   rI   r=   rK   rJ   r   rf   r   r_logspacelog10infZrandn	itertoolsproductr   r   r   r   max)rX   r    r#   Zb_normtolsZM0ZMsrn   rU   r   rm   rP   rY   rc   r   Zatol2r'   r'   r(   	test_atolx  s0    (

r   c             C   s|  t jjd t jjdd}|j|jdt jd  }t jd}t jt j	t j
dt j
dd }x|D ]}t }|jtd | |||d\}}t|d t|dd	d
 | |||tdd\}}t|d t|d|d
 | tk	rj| |||dtdd\}}|dkrt|d | ||||d\}}t|d t|ddd
 | |||dd\}}t|d t|ddd
 W d Q R X qfW d S )Ni  r8   g|=g      Y@r7   z.*called without specifying.*)rU   r   gV瞯<)r   )rU   rT   )rU   r   rT   )rU   r   gYn)rG   rH   rI   r=   rK   rJ   r   r   r   r   r   r   r\   r]   r   r   r   r   )rX   r    r#   r   rU   r^   rP   rY   r'   r'   r(   test_zero_rhs  s0    
 






r   aarch64r2   r;   zgh-13019)reason)Zmarksppc64lezfails on ppc64lec       	      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 jd	}t j}tj d
krRdnd}xtddD ]|}| |||ddd\}}|dkrtt jj	|j
|| dt jj	| k t jj	|j
|| }t||}t||| k qbW d S )NgH|?r   ghܾΤ?gXq?y        -DT!@g |?y                gܾΤ?r9   r   r7   r6   r2      g:0yE>)rV   rU   r   gH|gXqyXq-DT!@gXqyXq-DT!gܾΤĿ)rG   r
   r   r   platformmachineranger   rf   r   rK   min)	rX   r    vZ
best_errorrU   rV   rP   rY   errorr'   r'   r(   test_maxiter_worsening  s    


*
r   c             C   s   t jjd d}t jj||}|j|j}t jj|}t jj|}| tkrVtdd}ntddd}| ||f|\}}t|d t	t j
j|j|| dt j
j| k | ||fd|i|\}}t|d t	t j
j|j|| dt j
j| k d S )Nr2   r8   gư>)rU   r   )r   rU   rT   )rG   rH   rI   r=   rK   rJ   r   dictr   r   rf   r   )rX   nr    r#   rT   kwrP   rY   r'   r'   r(   test_x0_working  s    
*
r   c               @   s   e Zd Zdd ZdS )TestQMRc                sd  ddl m} ddlm} d}t|}td| d| | gdddg||}t|dd	}t| d |gddg||}td| | gddg||}t "}	|	jt	d
 || ||W dQ R X  fdd}
fdd} fdd}fdd}|||f|
|d}|||f||d}t *}	|	jt
d t||dd||d\}}W dQ R X t|d t|| |dd dS )z8Check that QMR works with left and right preconditionersr   )splu)r   d   r1   r9   r2   r<   )r   zsplu requires CSC matrix formatNc                s
    j | S )N)ru   )r#   )L_solverr'   r(   L_solve  s    z/TestQMR.test_leftright_precond.<locals>.L_solvec                s
    j | S )N)ru   )r#   )U_solverr'   r(   U_solve  s    z/TestQMR.test_leftright_precond.<locals>.U_solvec                s    j | dS )NrJ   )ru   )r#   )r   r'   r(   LT_solve  s    z0TestQMR.test_leftright_precond.<locals>.LT_solvec                s    j | dS )NrJ   )ru   )r#   )r   r'   r(   UT_solve!  s    z0TestQMR.test_leftright_precond.<locals>.UT_solve)ry   rk   z.*called without specifying.*g:0yE>   )rU   rV   rl   rm   )rU   r?   r?   )Zscipy.sparse.linalg.dsolver   Zscipy.sparse.linalg.interfacer   r   r   r	   r   r\   r   r]   r   r   rd   )r&   r   r   r   Zdatr    r#   LUr^   r   r   r   r   rl   rm   rP   rY   r'   )r   r   r(   test_leftright_precond  s.    $"
zTestQMR.test_leftright_precondN)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 )	TestGMRESc       	         sl  dd t tddddddgddddddgddddddgddddddgddddddgddddddgg}t|jd f}d}t|d  d d<  fdd}t 4}|jtd	 t||t|jd d
||d\}}W d Q R X t	 tddgdd dt
j|jd  }t|d  d d< t *}|jtd	 t|||d
||d\}}W d Q R X t	 tddgdd d S )Nc             S   s   | ||j  d j d < d S )Nr   r2   )Znonzeror   )rrvecr'   r'   r(   store_residual2  s    z/TestGMRES.test_callback.<locals>.store_residualr1   r2   r   g      ?c                s
   |  S )Nr'   )r   )r   r   r'   r(   <lambda>;  s    z)TestGMRES.test_callback.<locals>.<lambda>z.*called without specifying.*gؗҜ<)rT   rU   rV   rS   g>,p ?g|=)r~   gMbP?)rn   rU   rV   rS   r   r   r   r   r   r   g!{bEJ?)r   r
   r   r!   r   r   r\   r]   r   r   rG   r   )	r&   r    r#   rV   rS   r^   rP   flagrn   r'   )r   r   r(   test_callback0  s$    `,"zTestGMRES.test_callbackc             C   s   t d}td}t D}|jtd t||\}}|jt}t|jt|jt\}}W d Q R X tt	| t
|| t||k d S )Nr1   z.*called without specifying.*)r   r   r   r\   r]   r   rF   complexr   r   r   )r&   r    r#   r^   Zr_xZr_inforP   rY   r'   r'   r(   test_abiN  s    
$
zTestGMRES.test_abic             C   s\  t  }|jtd td}dtd }t||dd\}}t|tjd td}td}t||dd\}}t	tj
j|j|| dtj
j| k t||ddd tjjd	}|jd
d
}dtd
 }t||ddd\}}t	tj
j|j|| dk W d Q R X td}dtd }t||ddd\}}t	tj
j|j|| dtj
j| k d S )Nz.*called without specifying.*r1   gư>gh㈵>)rU   r   g:0yE>)r   r~   i90     gHz>r   )rU   r}   g|=)rU   r   )r   r\   r]   r   r   r   r   rG   r   r   rf   r   rK   r   rH   ZRandomStater=   )r&   r^   r    r#   rP   rY   Zrndmr'   r'   r(   test_atol_legacy]  s(    *(zTestGMRES.test_atol_legacyc             C   s   t jd}d|d< t jdddg}t jdddg}t jdddg}t||||ddd\}}tt j|j   |dkrtt jj	|j
|| dt jj	| k t|j
|j
||j
| d S )	Nr0   r   r1   r2   r9   gV瞯<)rT   rn   rU   r   )r1   r1   )rG   r   r
   Zdiagr   r   isnananyrf   r   rK   r   )r&   rn   r#   rP   r    rY   r'   r'   r(    test_defective_precond_breakdowny  s    
*z*TestGMRES.test_defective_precond_breakdownc             C   s   t jdddgdddgdddgg}t jdddg}t||ddd\}}tt j|j   |dkrtt jj|j|| dt jj| k t	|j|j||j| d S )Nr   r2   g:0yE>)rU   r   )
rG   r
   r   r   r   r   rf   r   rK   r   )r&   r    r#   rP   rY   r'   r'   r(   test_defective_matrix_breakdown  s    "*z)TestGMRES.test_defective_matrix_breakdownc                sd  t jjd t jjdd}t jjd}dg  fdd} fdd}t N}|jtd dg t||d	d|d
dd\}}|d
kst d d
kstW d Q R X dg t||d	d|d
ddd\}}|d
kst d d
kstdg t||d	d|d
ddd\}}|dkst d d
kstdg t||d	d|d
ddd\}}|dksNt d d
ks`td S )Nr2   r   r   c                s"    d  d7  < t t| t d S )Nr   r2   )r   rr   r"   )r   )cb_countr'   r(   
pr_norm_cb  s    z0TestGMRES.test_callback_type.<locals>.pr_norm_cbc                s$    d  d7  < t t| tj d S )Nr   r2   )r   rr   rG   rs   )rP   )r   r'   r(   x_cb  s    z*TestGMRES.test_callback_type.<locals>.x_cbz.*called without specifying.*gư>r1   2   )rU   r   rS   rV   r}   legacy)rU   r   rS   rV   r}   callback_typeZpr_normrP   )	rG   rH   rI   r=   r   r\   r]   r   rM   )r&   r    r#   r   r   r^   rP   rY   r'   )r   r(   test_callback_type  s6    zTestGMRES.test_callback_typec          
      s   t jjd t jjddt jd  t jjdt jgdg fdd}t dd|dddd	\}}|dksxtd d
kst|| d S )Nr2   r   r   c                sB   t jj j|  }|d ks&t|d< d  d7  < d S )Nr   r2   )rG   rf   r   rK   rM   )rP   r   )r    r#   countprev_rr'   r(   r     s    z1TestGMRES.test_callback_x_monotonic.<locals>.x_cbgư>r8   rP   )rU   r   rS   rV   r}   r      )rG   rH   rI   r=   r   r   r   rM   )r&   r   rP   rY   r'   )r    r#   r   r   r(   test_callback_x_monotonic  s    z#TestGMRES.test_callback_x_monotonicN)
r+   r,   r-   r   r   r   r   r   r   r   r'   r'   r'   r(   r   /  s   -r   )r`   )D__doc__r   r   sysZnumpyrG   Znumpy.testingr   r   r   r   r   Zpytestr   r   r   r	   r
   r   r   r   Zscipy.linalgr   Zscipy.sparser   r   r   Zscipy.sparse.linalgr   r   Zscipy.sparse.linalg.isolver   r   r   r   r   r   r   r   r   objectr   r.   r[   rZ   r_   rd   rg   rh   rp   rq   r{   r|   r   r   r   markZparametrizer   r   paramZxfailr   version_infor   r   r   r   r'   r'   r'   r(   <module>   sV    ,y


!
,	&'(#

(,