o
    5ήc                  	   @   s
  d 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dg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
    )assert_assert_allcloseassert_equalsuppress_warningsN)python_implementation)zerosarrayallclose)norm)
csr_matrixeyerand)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 d  d7  < t|  S )Nr   r   )countAm)v r   T/tmp/pip-target-vg8gfxp4/lib/python/scipy/sparse/linalg/_isolve/tests/test_lgmres.pymatvec   s   r   r   shapedtypec                  K   s   dt d< t "}|td tttfttjd ddd| \}}W d    n1 s,w   Y  t d }t	t
t| tdddtt| t  ||fS )Nr   .*called without specifying.*r   +=)x0inner_mtol-q=)rtolatol)r   r   filterDeprecationWarningr   Abr   r!   r   r	   r
   )kwsupr%   flagcount_0r   r   r   do_solve&   s   &r3   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   sj   t t }t|jtjtjd}t \}}t|d\}}t	|dk t	||d k  t	t
||dd d S )Nr    )Mr   r   r$   r)   )r   r   tocscr   solver-   r!   r"   r3   r   r	   )selfpcr5   r%   r2   x1count_1r   r   r   test_preconditioner2   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)r>   r?   prepend_outer_vr   r$   r6   F)r>   r?   store_outer_Avc                 S   s   g | ]}|d  du qS )r   Nr   ).0r   r   r   r   
<listcomp>Q   s    z+TestLGMRES.test_outer_v.<locals>.<listcomp>r   )r3   r   lenr	   r   all)r9   r?   r%   r2   r;   r<   r   r   r   test_outer_v>   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 jd}t .}|td t||t	|j
d ddd	\}}t||t	|j
d ddd
\}}W d    n1 sKw   Y  t|d t|d t j||| }t|dk t|| d S )N  i  gMb@?)densityr#   r      r   )r%   r&   maxiter)r%   restartrL   g-C6?)nprandomseedr   r   r   r+   r,   r   r   r!   r   r   linalgr
   dotr   r   )	r9   r-   r.   r0   r%   flag0r;   flag1r
   r   r   r   test_arnoldi[   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 j|}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 )NrI   )r   r   
   d   r   r#   rV   rL   r   r$   r*   r'   rL   )rN   rO   rP   r   r   r+   r,   onesr   r   r   rR   r   )r9   nr-   r0   r.   xinfor   r   r   test_cornercaseq   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   rV   rZ   r   )	r   rN   nanr[   r   r+   r,   r   r   )r9   r-   r.   r0   r]   r^   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#   )r?   rL   r(   rY   )
rN   r   floatrQ   r8   r   r+   r,   r   r   )r9   r-   r.   r]   v0r0   xpr^   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   rd   )r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   r#   r   rX   )rcond)err_msg)rN   r   re   r   r+   r,   r   rQ   r
   rR   c_lstsqr   repr)r9   r-   bsr.   r0   rg   r^   respKy_r]   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   rd   rW   r   r#   )
rN   r   re   	nextafterr   r+   r,   r   r   rR   )r9   r-   r.   r0   rg   r^   r   r   r   test_denormals   s   zTestLGMRES.test_denormalsN)__name__
__module____qualname__r=   rF   pytestmarkskipifr   rU   r_   rc   rh   ru   rw   r   r   r   r   r4   1   s    

r4   )$__doc__numpy.testingr   r   r   r   r{   platformr   numpyrN   r   r   r	   scipy.linalgr
   scipy.sparser   r   r   scipy.sparse.linalg._interfacer   scipy.sparse.linalgr   scipy.sparse.linalg._isolver   r   r   r.   r   r   r!   r"   r-   r3   r4   r   r   r   r   <module>   s0    
