o
    Yi                  	   @   s$  d Z ddlZddlmZmZmZmZ ddlZddlm	Z	 ddl
Zddl
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 dd	lmZ dd
lmZmZ eeg dg dg dg dg dg dgZeg dZe Ze Z dd Z!dd Z"ee!ej#ej$dZ%dd Z&G dd dZ'dS )z+Tests for the linalg._isolve.lgmres module
    N)assert_assert_allcloseassert_equalsuppress_warnings)python_implementation)zerosarrayallclose)norm)	csr_array	eye_arrayrandom_array)LinearOperator)splu)lgmresgmres)   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      c                 C   s,   t tds	dgt_tjd  d7  < t|  S )Ncr   r   )hasattrcountr   Amv r    T/tmp/pip-target-1s0edx8b/lib/python/scipy/sparse/linalg/_isolve/tests/test_lgmres.pymatvec    s   
r"   c                 C   s(   t tds	dgt_tjd  d7  < d S )Nnr   r   )r   niterr#   r   r    r    r!   cb'   s   
r%   r"   shapedtypec                  K   s   t tds	dgt_t tdsdgt_dtjd< t "}|td tt	t
ftt	jd ddd| \}}W d    n1 s?w   Y  tjd }ttt	| t
ddd	tt	| t
  ||fS )
Nr#   r   r   .*called without specifying.*r   +=)x0inner_mrtol-q=)r-   atol)r   r$   r#   r   r   r   filterDeprecationWarningr   Abr   r'   r   r	   r
   )kwsupr+   flagcount_0r    r    r!   do_solve0   s    



&r8   c                   @   sb   e Zd Zdd Zdd Zejje dkdddd	 Z	d
d Z
dd Zdd Zdd Zdd ZdS )
TestLGMRESc                 C   s   t t }t|jtjtjd}t \}}dt	j
d< t|td\}}|dks(J ||d k s0J t||dds9J t	j
d dk sBJ d S )Nr&   r   )Mcallbackr   r   r*   r-   )r   r   tocscr   solver2   r'   r(   r8   r$   r#   r%   r	   )selfpcr:   r+   r7   x1count_1r    r    r!   test_preconditioner@   s   

zTestLGMRES.test_preconditionerc                 C   s  g }t d|d\}}tt|dk tt|dk t d|dd\}}t|dk| t||d k  tt||dd g }t d|d	d
\}}ttdd |D   tt|dk tt|dk t d|dd\}}t|dk| t||d k  tt||dd d S )Nr   )outer_kouter_vr   T)rD   rE   prepend_outer_vr   r*   r<   F)rD   rE   store_outer_Avc                 S   s   g | ]}|d  du qS )r   Nr    ).0r   r    r    r!   
<listcomp>a   s    z+TestLGMRES.test_outer_v.<locals>.<listcomp>r   )r8   r   lenr	   r   all)r?   rE   r+   r7   rA   rB   r    r    r!   test_outer_vN   s.   


zTestLGMRES.test_outer_vPyPyz Fails on PyPy CI runs. See #9507)reasonc           
      C   s   t jd}tdtdd|d }|d}t .}|td t||t	|j
d dd	d
\}}t||t	|j
d dd	d\}}W d    n1 sJw   Y  t|d	 t|d	 t j||| }	t|	dk t|| d S )N{     )rP   rP   gMb@?)densityrngr)   r   
   r   )r+   r,   maxiter)r+   restartrT   g-C6?)nprandomdefault_rngr   r   r   r0   r1   r   r   r'   r   r   linalgr
   dotr   r   )
r?   rR   r2   r3   r5   r+   flag0rA   flag1r
   r    r    r!   test_arnoldik   s   
 "

zTestLGMRES.test_arnoldic              	   C   s<  t jd}dD ]}dt| }t }|td t |}t||dd\}}t	|d t
||| ddd	 t||ddd
\}}|dkrSt
||| ddd	 ||}t||dd\}}t	|d t
||| ddd	 t||ddd
\}}|dkrt
||| ddd	 W d    n1 sw   Y  qd S )Ni  )r   r   rS   d   r   r)   rS   rT   r   r*   r/   r-   rT   )rV   rW   RandomStater   r   r0   r1   onesr   r   r   rZ   rand)r?   rR   r#   r2   r5   r3   xinfor    r    r!   test_cornercase   s.   



zTestLGMRES.test_cornercasec                 C   sv   t ddd}tj|d< td}t }|td t||ddd\}}t|d	 W d    d S 1 s4w   Y  d S )
Nr   lil)format)r   r   r)   r   rS   ra   r   )	r   rV   nanrc   r   r0   r1   r   r   )r?   r2   r3   r5   re   rf   r    r    r!   	test_nans   s   

"zTestLGMRES.test_nansc                 C   s   t jddgddggtd}t ddg}t j||}t ddg}t }|td t|||d f|d fgdd\}}W d    n1 sFw   Y  t	||d	d
 d S )Nr   r   r   r   r(   r   r)   )rE   rT   r.   r`   )
rV   r   floatrY   r>   r   r0   r1   r   r   )r?   r2   r3   re   v0r5   xprf   r    r    r!   test_breakdown_with_outer_v   s   "z&TestLGMRES.test_breakdown_with_outer_vc                 C   sJ  t jg dg dg dg dgtd}t g dt g dt g dt g d	g}|D ]s}t }|td
 t||dd\}}W d    n1 sNw   Y  t j|	|| }t j
||	||	|	||	|	|	|f }t jj|	||dd\}	}
}
}
|	|	}t j|	|| }t||t|d q/d S )N)r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   rl   )r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   r)   r   r_   )rcond)err_msg)rV   r   rm   r   r0   r1   r   rY   r
   rZ   c_lstsqr   repr)r?   r2   bsr3   r5   ro   rf   respKy_re   resr    r    r!   test_breakdown_underdetermined   s0   
6 
z)TestLGMRES.test_breakdown_underdeterminedc                 C   s   t jddgddggtd}|dt dd 9 }t ddg}t }|td t||\}}W d    n1 s9w   Y  |dkrLt|	|| d S d S )	Nr   r   r   r   rl   r^   r   r)   )
rV   r   rm   	nextafterr   r0   r1   r   r   rZ   )r?   r2   r3   r5   ro   rf   r    r    r!   test_denormals   s   zTestLGMRES.test_denormalsN)__name__
__module____qualname__rC   rL   pytestmarkskipifr   r]   rg   rk   rp   r}   r   r    r    r    r!   r9   ?   s    

r9   )(__doc__	threadingnumpy.testingr   r   r   r   r   platformr   numpyrV   r   r   r	   scipy.linalgr
   scipy.sparser   r   r   scipy.sparse.linalg._interfacer   scipy.sparse.linalgr   scipy.sparse.linalg._isolver   r   r   r3   localr   r$   r"   r%   r'   r(   r2   r8   r9   r    r    r    r!   <module>   s6    
