o
    5ήc`h                     @   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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(m)Z) G d
d dZ*G dd dZ+e+ Z,dd Z-dd Z.dAddZ/dd Z0dd Z1dd Z2dd Z3dd Z4ej56de,j7e,j8gd d! Z9d"d# Z:d$d% Z;ej56d&e e!e"e#e$e%e'e(gd'd( Z<ej56d&e e!e"e#e$e%e&e'e(e)g
d)d* Z=ej56d&ej>e$ej5j?e@ d+koejAd, d-kd.d/d0e%ej>e'ej5j?e@ d1kd2d/d0ej>e!ej5j?d0ej>e"ej5j?d0ej>e#ej5j?d0ej>e(ej5j?d0ej>e)ej5j?d0gd3d4 ZBej56d&e e!e"e#e$e%e&e'e(e)g
d5d6 ZCej56d&e e!e"e#e$e%e&e'e(g	d7d8 ZDej56d9e)d:fgd;d< ZEG d=d> d>ZFG d?d@ d@ZGdS )Bz5 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kronsum)LinearOperatoraslinearoperator)
cgcgsbicgbicgstabgmresqmrminreslgmresgcrotmktfqmrc                   @   s   e Zd ZdddZdd ZdS )CaseNc                 C   sb   || _ || _|d u rt|jd td| _n|| _|d u r g | _n|| _|d u r,g | _d S || _d S )Nr   dtype)nameAr	   shapefloatbskipnonconvergence)selfr"   r#   r&   r'   r(    r*   W/tmp/pip-target-vg8gfxp4/lib/python/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__*      
zCase.__repr__)NNN)__name__
__module____qualname__r,   r-   r*   r*   r*   r+   r      s    
r   c                   @      e Zd Zdd ZdS )IterativeParamsc                 C   s(  t 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|g d||dd	}td
|| _| jtd
| | jtd
|dtgd | jtd| |d | jtd| d|tg d t||}td|| _| jtd|tgd | jtd|dtgd tg dgdd}t|dgdddd	}	| jtd|	|d | jtd|	d|d tjd tjdd}| jtd||| d | jtd|d|| d tjd tjdd}||j }| jtd||d | jtd|d|d tjd tjdd}t| |j}| jtd| | jtd|dtgd tjd tjdddtjdd  }| jtd||| | d | jtd|d|| | d tjd tjdddtjdd  }||j  }| jtd||| d | jtd|d|| d tjd tjdddtjdd  }t| |j}| jtd||d | jtd|d|d td}d|dd d f< d|dd d f< t|ddgdddd	}
| jtd |
|tttt	g d | jtd |
d|tttt	g d tjg d!g d"g d#g d$g d%g d&g d'g d(g d)g d*g d+gtd}
tjg d,td}|
|
jk sJ | jtd-|
||ttttt	gd. d S )/N(         r      )r   r7   r8   csr)format	poisson1df)r'   zneg-poisson1d	poisson2d)
   r6      r7   
      i	   dr    rA   z	rand-diag  rB   randzrand-symrD   zrand-sym-pdy              ?z
rand-cmplxFzrand-cmplx-hermzrand-cmplx-sym-pd)r6   rA   nonsymposdef)r   r   r   r   r   r8   r7   r   r   r   r   )r   r   r   r   r   r6   r   r7   r   r   r   )r   r   r   r   r   r6   r   r   r7   r   r   )r   r   r   r   r   r6   r   r   r   r7   r   )r   r   r   r   r   r8   r   r   r   r   r7   )r8   r6   r6   r6   r8   r   r   r   r   r   r   )r7   r   r   r   r   r   r7   r   r   r   r   )r   r7   r   r   r   r   r   r7   r   r   r   )r   r   r7   r   r   r   r   r   r7   r   r   )r   r   r   r7   r   r   r   r   r   r7   r   )r   r   r   r   r7   r   r   r   r   r   r7   )r   r   r   r   r   r8   r   r   r   r   r   z	sym-nonpd)r'   r(   )r   r   r   r   r   r   r   r   r   r   solverscasesr   r   r   	Poisson1Dappendastyper   	Poisson2Dr
   nprandomseedrG   Tdotconjr%   all)r)   rJ   sym_solversposdef_solversreal_solversNdatarL   rO   RandDiagr#   r&   r*   r*   r+   r,   /   s   

 

  

zIterativeParams.__init__N)r/   r0   r1   r,   r*   r*   r*   r+   r3   .       r3   c                    s`   j }d}j d  }g  fdd}| | ||d|d\}}ttd t|d d S )Ng-q=r   c                    s    t j|    d S N)rM   r   r#   xr&   case	residualsr*   r+   callback      zcheck_maxiter.<locals>.callbackr8   x0tolmaxiterrd   )r#   r&   r   len)solverrb   r#   rh   rg   rd   r`   infor*   ra   r+   check_maxiter   s   rm   c               
   C   j   t jD ]/} t jD ])}|| j| j v rqt }|td t||  W d    n1 s,w   Y  qqd S N.*called without specifying.*)	paramsrK   rJ   r'   r(   r   filterDeprecationWarningrm   rb   rk   supr*   r*   r+   test_maxiter      

rv   :0yE>c                 C   s>   t | | }|t | }d| d| d}t||k |d d S )Nz
residual (z) not smaller than tolerance ())msg)r   r   )ar&   rh   residual	tolerancerz   r*   r*   r+   assert_normclose   s   r~   c                 C   s   |j }|jjdv rd}nd}|j}d| }| ||||d\}}t|d|  | |jvr<t|d t||||d d S t	|dk t	t
j||| t
j|k d S )NdDrx   {Gz?r   rg   rh   rh   )r#   r!   charr&   r   r(   r   r~   rT   r   rP   linalgr   )rk   rb   r#   rh   r&   rg   r`   rl   r*   r*   r+   check_convergence   s   

*r   c               
   C   sd   t jD ],} t jD ]&}| |jv rqt }|td t| | W d    n1 s)w   Y  qqd S ro   )rq   rJ   rK   r'   r   rr   rs   r   )rk   rb   ru   r*   r*   r+   test_convergence   s   


r   c                 C   s  d}ddd}|j }|j\}}| }t|t|kr'td| gdg|| |j}d| }	t|j||d}
| t	u rG| |||
|
|	|d\}}n| |||
|	|d\}}t
|d t|||| t|}||_||_| |||	|d	\}}t
|d t|| ||d
 d S )Nrx   c                 S   s   | S )ztrivial preconditionerr*   )r&   whichr*   r*   r+   identity   s   z%check_precond_dummy.<locals>.identity      ?r   rmatvec)M1M2rg   rh   Mrg   rh   r   r   r^   )r#   r$   diagonalrP   count_nonzerorj   r   r&   r   r   r   r~   rT   r   psolverpsolve)rk   rb   rh   r   r#   r   rZ   diagOfAr&   rg   precondr`   rl   r*   r*   r+   check_precond_dummy   s*   



r   c               
   C   rn   ro   )	rq   rK   rJ   r'   r(   r   rr   rs   r   rt   r*   r*   r+   test_precond_dummy  rw   r   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||| td dkt d S )Nrx   c                    s(    j }t|tjs| }tj|| S zinverse preconditioner)r#   
isinstancerP   ndarraytoarrayr   solver&   r   r#   rb   r*   r+   inverse(  s   z&check_precond_inverse.<locals>.inversec                    s*    j }t|tjs| }tj|j| S r   )r#   r   rP   r   r   r   r   rS   r   r   r*   r+   rinverse/  s   z'check_precond_inverse.<locals>.rinverser   c                    s   d  d7  <  j | S Nr   r8   )r#   rT   r&   rb   matvec_countr*   r+   matvec8  s   z%check_precond_inverse.<locals>.matvecc                    s   d  d7  <  j j| S r   )r#   rS   rT   r   r   r*   r+   r   <  s   z&check_precond_inverse.<locals>.rmatvecr   r   r5   r^   )	r&   r   r#   r$   r   r~   rT   r   repr)rk   rb   rh   r   r   r   r   r&   rg   r#   r   r`   rl   r*   r   r+   check_precond_inverse%  s   
r   rb   c              	   C   sb   t jD ]+}|| jv rq|tu rqt }|td t||  W d    n1 s)w   Y  qd S ro   )rq   rJ   r'   r   r   rr   rs   r   rt   r*   r*   r+   test_precond_inverseQ  s   

r   c               	   C   sn   t tttttg} tttt	g}||  D ]"}t
 }|td t|||v  W d    n1 s/w   Y  qd S ro   )r   r   r   r   r   r   r   r   r   r   r   rr   rs   _check_reentrancy)non_reentrant	reentrantrk   ru   r*   r*   r+   test_reentrancy]  s   r   c                    sl    fdd}t g d}td|||jd}|s!tt || d S  ||\}}t|d t|g d d S )Nc                    s8   t g dg dg dg} || \}}t|d |S )N)r   r   r   )r   g       @r   )r   r   g      @r   )rP   r
   r   )r`   r#   yrl   rk   r*   r+   r   g  s   
z!_check_reentrancy.<locals>.matvec)r8   g      ?gUUUUUU?)r5   r5   )r   r   r!   r   )r8   r8   r8   )rP   r
   r   r!   assert_raisesRuntimeErrorr   r   )rk   is_reentrantr   r&   opr   rl   r*   r   r+   r   f  s   
r   rk   c              	   C   sn  t jd t jdd}||jdt d  }dt jd }t j|}t j	dt 
t dt ddt jf }t jdd}||j}d d| d	| g}t|||D ][\}}}	|dkrg|	dkrgqY| tu r|d ur{t|}tt d}
nd }
| ||||
||	d
\}}n| |||||	d\}}t|d ||| }t j|}|| }t|t|	|k qYd S )NrF   rA   g     @@r   绽|=      Y@r@   ư>g    .A)r   r   rh   atol)r   rh   r   )rP   rQ   rR   rG   rT   rS   r   r   r   r_logspacelog10infrandn	itertoolsproductr   r   r   r   max)rk   r#   r&   b_normtolsM0Msr   rh   r   r   r`   rl   r|   erratol2r*   r*   r+   	test_atolx  s2   (
r   c              	   C   s  t jd t jdd}||jdt d  }t d}t jt 	t 
dt 
dd }|D ]}t }|td | |||d\}}t|d t|dd	d
 | |||tdd\}}t|d t|d|d
 | tur| |||dtdd\}}|dkrt|d | ||||d\}}t|d t|ddd
 | |||dd\}}t|d t|ddd
 W d    n1 sw   Y  q1d S )NrF   rA   r   r   r@   rp   r   r   V瞯<)r   )rh   rg   )rh   r   rg   rh   r   gYn)rP   rQ   rR   rG   rT   rS   r   r   r   r   r   r   rr   rs   r   r   r   r   )rk   r#   r&   r   rh   ru   r`   rl   r*   r*   r+   test_zero_rhs  s8   
 




r   aarch64r8   rD   zgh-13019)reason)marksppc64lezfails on ppc64lec           	      C   s   t g dg dg dg dg}t d}t j}t dkr!dnd}td	d
D ]>}| |||ddd\}}|dkrNtt j	|
|| dt j	| k t j	|
|| }t||}t||| k q(d S )N)gH|r   r   ghܾΤ?)r   yXq-DT!@r   r   )r   r   yXq-DT!r   )g |?                r   gܾΤĿrB   r   r@      r8      rx   r   )ri   rh   r   )rP   r
   r   r   platformmachineranger   r   r   rT   min)	rk   r#   v
best_errorrh   ri   r`   rl   errorr*   r*   r+   test_maxiter_worsening  s    

*
r   c                 C   s   t jd d}t j||}||j}t j|}t j|}| tu r+tdd}ntddd}| ||fi |\}}t|d t	t j
||| dt j
| k | ||fd|i|\}}t|d t	t j
||| dt j
| k d S )Nr8   rA   r   r   r   )r   rh   rg   )rP   rQ   rR   rG   rT   rS   r   dictr   r   r   r   )rk   nr#   r&   rg   kwr`   rl   r*   r*   r+   test_x0_working  s   
*
.r   c           	   	   C   s   t jD ]I}| |jv rqt 6}|td |j}|j}d}d}| ||||d\}}t|d t	|d t
||||d W d    n1 sGw   Y  qd S )Nrp   Mbrx   r   r   r   )rq   rK   r'   r   rr   rs   r#   r&   r   r   r~   rT   )	rk   rb   ru   r#   r&   rg   rh   r`   rl   r*   r*   r+   test_x0_equals_Mb  s    



r   )rk   solverstringTFQMRc                    s    fdd}dD ]D}t j| }|j}|j}dg | |||dd\}}	| \}
}|dkr:t|
| d d  d	 nt|
| d
 d  d	 t|d qd S )Nc                    s    d  d7  < d S r   r*   r_   countr*   r+   cb  s   ztest_show.<locals>.cb)r   r   r   T)rd   showr   z;: Linear solve not converged due to reach MAXIT iterations 
z5: Linear solve converged due to reach TOL iterations  )rq   rK   r#   r&   
readouterrr   )rk   r   capsysr   irb   r#   r&   r`   rl   outr   r*   r   r+   	test_show  s"   



r   c                   @   r2   )TestQMRc              	      s  ddl m} ddlm} d}t|}td| d| | gg d||}t|dd	}t| d
 |gddg||}td| | gddg||}t }	|	t	d || ||W d   n1 saw   Y   fdd}
fdd} fdd}fdd}|||f|
|d}|||f||d}t }	|	t
d t||dd||d\}}W d   n1 sw   Y  t|d t|| |dd dS )z8Check that QMR works with left and right preconditionersr   )splu)r   d   rB   )r7   r   r8   rE   r    r6   r7   r8   z&splu converted its input to CSC formatNc                    
     | S r^   r   r   L_solverr*   r+   L_solveB  r.   z/TestQMR.test_leftright_precond.<locals>.L_solvec                    r   r^   r   r   U_solverr*   r+   U_solveE  r.   z/TestQMR.test_leftright_precond.<locals>.U_solvec                         | dS NrS   r   r   r   r*   r+   LT_solveH     z0TestQMR.test_leftright_precond.<locals>.LT_solvec                    r   r   r   r   r   r*   r+   UT_solveK  r   z0TestQMR.test_leftright_precond.<locals>.UT_solve)r   r   rp   rx      )rh   ri   r   r   r   )scipy.sparse.linalg._dsolver   scipy.sparse.linalg._interfacer   r   r   r	   r   rr   r   rs   r   r   r~   )r)   r   r   r   datr#   r&   LUru   r   r   r   r   r   r   r`   rl   r*   )r   r   r+   test_leftright_precond-  s6   "

zTestQMR.test_leftright_precondN)r/   r0   r1   r  r*   r*   r*   r+   r   ,  r]   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S )	TestGMRESc                 C   s   t t dd d d d d df }t d}d|d< t }|td t||ddd\}}W d    n1 s:w   Y  t|d dd	d
 d S )NrA   r8   r7   r   rp   r   )restartri   g`"?r   rtol)	rP   vanderr	   r   r   rr   rs   r   r   )r)   r#   r&   ru   x_gmr   r*   r*   r+   
test_basicZ  s   &
zTestGMRES.test_basicc           	   	      sd  dd t tg dg dg dg dg dg dg}t|jd	 f}d
}t|d
  d d	<  fdd}t }|td t||t|jd	 d||d\}}W d    n1 s\w   Y  t	 tddgdd dt
|jd	  }t|d
  d d	< t }|td t|||d||d\}}W d    n1 sw   Y  t	 tddgdd d S )Nc                 S   s   | ||  d  d < d S r   )nonzeror   )rrvecr*   r*   r+   store_residualg  re   z/TestGMRES.test_callback.<locals>.store_residual)r   r8   r   r   r   r   )r8   r   r8   r   r   r   )r   r8   r   r8   r   r   )r   r   r8   r   r8   r   )r   r   r   r8   r   r8   )r   r   r   r   r8   r   r   r8   r   c                    s
   |  S r^   r*   r  r  r  r*   r+   <lambda>p  s   
 z)TestGMRES.test_callback.<locals>.<lambda>rp   gؗҜ<rf   g>,p ?r   r  gMbP?)r   rh   ri   rd   g!{bEJ?)r   r
   r   r$   r   r   rr   rs   r   r   rP   r   )	r)   r#   r&   ri   rd   ru   r`   flagr   r*   r  r+   test_callbacke  s(   0$zTestGMRES.test_callbackc                 C   s   t d}td}t '}|td t||\}}|t}t|t|t\}}W d    n1 s5w   Y  tt	| t
|| t||k d S )Nr6   rp   )r   r   r   rr   rs   r   rN   complexr   r   r   )r)   r#   r&   ru   r_xr_infor`   rl   r*   r*   r+   test_abi  s   

zTestGMRES.test_abic                 C   sp  t  }|td td}dtd }t||dd\}}t|td td}td}t||dd\}}t	tj
||| dtj
| k t||ddd tjd	}|d
d
}dtd
 }t||ddd\}}t	tj
||| dk W d    n1 sw   Y  td}dtd }t||ddd\}}t	tj
||| dtj
| k d S )Nrp   r6   r   gh㈵>r   r   rx   )r   r  i90     gHz>r   )rh   r  r   r   )r   rr   rs   r   r   r   r   rP   r   r   r   r   rT   r   rQ   RandomStaterG   )r)   ru   r#   r&   r`   rl   rndmr*   r*   r+   test_atol_legacy  s*   * .zTestGMRES.test_atol_legacyc                 C   s   t d}d|d< t g d}t g d}t g d}t||||ddd\}}tt |   |dkrMtt j	|
|| dt j	| k t|
|
||
| d S )	Nr5   r   )r6   r6   )r   r8   r8   r8   r   r   )r6   r5   rB   r   )rg   r   rh   r   )rP   r   r
   diagr   r   isnananyr   r   rT   r   )r)   r   r&   r`   r#   rl   r*   r*   r+    test_defective_precond_breakdown  s   
* z*TestGMRES.test_defective_precond_breakdownc                 C   s   t g dg dg dg}t g d}t||ddd\}}tt |   |dkrBtt j||| dt j| k t	||||| d S )N)r   r8   r   r  )r   r   r   )r8   r   r8   rx   r   r   )
rP   r
   r   r   r  r  r   r   rT   r   )r)   r#   r&   r`   rl   r*   r*   r+   test_defective_matrix_breakdown  s   * z)TestGMRES.test_defective_matrix_breakdownc              
      sp  t jd t jdd}t jd}dg  fdd} fdd}t ,}|td dg t||d	d|d
dd\}}|d
ksBJ  d d
ksJJ W d    n1 sTw   Y  dg t||d	d|d
ddd\}}|d
kspJ  d d
ksxJ dg t||d	d|d
ddd\}}|dksJ  d d
ksJ dg t||d	d|d
ddd\}}|dksJ  d d
ksJ d S )Nr8   r   r   c                    s"    d  d7  < t t| t d S r   )r   r   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 r   )r   r   rP   r   r_   r!  r*   r+   x_cb  s   z*TestGMRES.test_callback_type.<locals>.x_cbrp   r   r6   2   )rh   r   rd   ri   r  legacyrh   r   rd   ri   r  callback_typepr_normr`   )rP   rQ   rR   rG   r   rr   rs   r   )r)   r#   r&   r#  r$  ru   r`   rl   r*   r!  r+   test_callback_type  s>   	


zTestGMRES.test_callback_typec              
      s   t jd t jddt d  t jdt jgdg fdd}t dd|dddd	\}}|dks<J d d
ksDJ || d S )Nr8   r   r   c                    sB   t j |  }|d ksJ |d< d  d7  < d S r   )rP   r   r   rT   )r`   r  r#   r&   r   prev_rr*   r+   r$    s   z1TestGMRES.test_callback_x_monotonic.<locals>.x_cbr   rA   r`   r'     )rP   rQ   rR   rG   r   r   r   )r)   r$  r`   rl   r*   r+  r+   test_callback_x_monotonic  s   
z#TestGMRES.test_callback_x_monotonicN)r/   r0   r1   r	  r  r  r  r  r   r*  r.  r*   r*   r*   r+   r  Y  s    -r  )rx   )H__doc__r   r   sysnumpyrP   numpy.testingr   r   r   r   r   pytestr   r   r   r	   r
   r   r   r   scipy.linalgr   scipy.sparser   r   r   r   scipy.sparse.linalgr   r   scipy.sparse.linalg._isolver   r   r   r   r   r   r   r   r   r   r   r3   rq   rm   rv   r~   r   r   r   r   r   markparametrizerL   rO   r   r   r   r   r   paramxfailr   version_infor   r   r   r   r   r  r*   r*   r*   r+   <module>   sv     0 


%
,
	
 &
"
 


-