
    xfFg              
          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	 ddl
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% eeeee e!e"e#e$e%g
Z& e
jN                  e&d	
      d        Z( G d d      Z) G d d      Z* e*       jV                  Z+ e
jN                  e+e+D  cg c]  } | jX                   c} d	      d        Z-d Z.d Z/d)dZ0d Z1d Z2d Z3d Z4d Z5d Z6d Z7d Z8d Z9d Z:e
jv                  jy                  d       d!        Z=d" Z>d# Z?d$ Z@ G d% d&      ZA G d' d(      ZByc c} w )*z5 Test functions for the sparse.linalg._isolve module
    N)assert_array_equalassert_allclosesuppress_warnings)zerosarangearrayoneseyeiscomplexobjnorm)spdiags
csr_matrixSparseEfficiencyWarningkronsum)LinearOperatoraslinearoperator)
bicgbicgstabcgcgsgcrotmkgmreslgmresminresqmrtfqmrsession)paramsscopec                     | j                   S )z@
    Fixture for all solvers in scipy.sparse.linalg._isolve
    paramrequests    R/usr/lib/python3/dist-packages/scipy/sparse/linalg/_isolve/tests/test_iterative.pysolverr'          
 ==    c                       e Zd ZddZd Zy)CaseNc                     || _         || _        |$t        |j                  d   t              | _        n|| _        |g | _        n|| _        |g | _        y || _        y )Nr   dtype)nameAr   shapefloatbskipnonconvergence)selfr/   r0   r3   r4   r5   s         r&   __init__zCase.__init__(   s[    	9AGGAJe4DFDF<DIDI!"$D"0Dr)   c                 "    d| j                    dS )N<>)r/   r6   s    r&   __repr__zCase.__repr__8   s    499+Qr)   )NNN)__name__
__module____qualname__r7   r<    r)   r&   r+   r+   '   s    1  r)   r+   c                       e Zd Zd Zy)IterativeParamsc                 |   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	      }| j                  j                  t        d
|             | j                  j                  t        d|j                  d      t         g             | j                  j                  t        d| |             | j                  j                  t        d| j                  d      |t         gz                t        ||      }| j                  j                  t        d|t         g             | j                  j                  t        d|j                  d      t         g             t        g dgd      }t	        |dgddd	      }| j                  j                  t        d||             | j                  j                  t        d|j                  d      |             t        j                  j                  d       t        j                  j                  dd      }| j                  j                  t        d|||z                | j                  j                  t        d|j                  d      ||z                t        j                  j                  d       t        j                  j                  dd      }||j                  z   }| j                  j                  t        d||             | j                  j                  t        d|j                  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             t        j                  j                  d       t        j                  j                  dd      d!t        j                  j                  dd      z  z   }||z   |z   }	| j                  j                  t        d"||	             | j                  j                  t        d#|j                  d$      |	             t        j                  j                  d       t        j                  j                  dd      d!t        j                  j                  dd      z  z   }||j                  j!                         z   }| j                  j                  t        d%|||z                | j                  j                  t        d&|j                  d$      ||z                t        j                  j                  d       t        j                  j                  dd      d!t        j                  j                  dd      z  z   }t        j                  |j!                         |j                        }| j                  j                  t        d'||             | j                  j                  t        d(|j                  d$      |             t        d)      }d|dd d f<   d|dd d f<   t	        |ddgddd	      }
| j                  j                  t        d*|
|t"        t$        t&        t(        gz                | j                  j                  t        d+|
j                  d$      |t"        t$        t&        t(        gz                t        j                  g d,g d-g d.g d/g d0g d1g d2g d3g d4g d5g d6gt*              }
t        j                  g d7t*              }|
|
j                  k(  j-                         sJ | j                  j                  t        d8|
||t"        t&        t.        t$        t(        g9             y ):N(         r      )r   rG   rH   csr)format	poisson1dzpoisson1d-Ff)r4   zneg-poisson1dzneg-poisson1d-F	poisson2dzpoisson2d-F)
   rF      rG   
      i	   dr-   rQ   z	rand-diagzrand-diag-F  rR   randzrand-Fzrand-symz
rand-sym-FrT   zrand-sym-pdzrand-sym-pd-Fy              ?z
rand-cmplxzrand-cmplx-FFzrand-cmplx-hermzrand-cmplx-herm-Fzrand-cmplx-sym-pdzrand-cmplx-sym-pd-F)rF   rQ   nonsymposdefnonsymposdef-F)r   r   r   r   r   rH   rG   r   r   r   r   )r   r   r   r   r   rF   r   rG   r   r   r   )r   r   r   r   r   rF   r   r   rG   r   r   )r   r   r   r   r   rF   r   r   r   rG   r   )r   r   r   r   r   rH   r   r   r   r   rG   )rH   rF   rF   rF   rH   r   r   r   r   r   r   )rG   r   r   r   r   r   rG   r   r   r   r   )r   rG   r   r   r   r   r   rG   r   r   r   )r   r   rG   r   r   r   r   r   rG   r   r   )r   r   r   rG   r   r   r   r   r   rG   r   )r   r   r   r   rG   r   r   r   r   r   rG   )r   r   r   r   r   rH   r   r   r   r   r   	sym-nonpd)r4   r5   )r   r   casesr	   r   appendr+   astyper   r   nprandomseedrW   Tdotconjr   r   r   r   r2   allr   )r6   sym_solversposdef_solversreal_solversNdata	Poisson1D	Poisson2DRandDiag
skip_cmplxr0   r3   s               r&   r7   zIterativeParams.__init__=   sg   rlx 
 QF|QT
QT
QT
D*a5A	

${I67

$}i.>.>s.C%+H. 	/ 	

$
$24 	5 	

$0I:2E2Ec2J$2fX$=? 	@ Iy1	 	

${IVHEF

$}i.>.>s.C%+H. 	/ 9:#F4!b"U;

${H>JK

$}hooc.B$24 	5 			tyy~~a#

$vt$2[$@B 	C

$xS)9$2[$@B 	C 			tyy~~a#dff}

$z4nEF

$|T[[-=$24 	5 			tyy~~a#vvdiik466*

$}d34

$C0@%+H. 	/ 			tyy~~a#b299>>!Q+?&??#k1L@


$|T
CD

$~t{{3/?$.0 	1 			tyy~~a#b299>>!Q+?&??dffkkm#

$0$$2\$AC 	D

$2DKK4D$2\$AC 	D 			tyy~~a#b299>>!Q+?&??vvdiik466*

$2D|LM

$4dkk#6F$02 	3 G}QT
QT
D1b'2r%8

$~q$/3T52I$IK 	L

$/#$/3T52I$IK 	L HH<<<<<<=====
? GL
M HH6eDQSS~~

${Aq$2/2D(C.O! 	r)   N)r=   r>   r?   r7   r@   r)   r&   rB   rB   <   s    |r)   rB   )r   idsr    c                     | j                   S )z2
    Fixture for all cases in IterativeParams
    r"   r$   s    r&   caserq      r(   r)   c                    	 j                   }d}j                  dz  }g 		fd} | |||d|      \  }}t        	      dk(  sJ |dk(  sJ y )Ng-q=r   c                 Z    j                  t        j                  | z  z
               y N)r]   r   r0   )xr3   rq   	residualss    r&   callbackzcheck_maxiter.<locals>.callback   s"    a$&&1*n-.r)   rH   x0tolmaxiterrw   )r0   r3   len)
r'   rq   r0   rz   ry   rw   ru   infor3   rv   s
    `      @@r&   check_maxiterr~      se    A
CA	
QBI/ Qbc1xHGAty>Q199r)   c                     | |j                   |j                  z   v rt        j                   d       t               5 }|j	                  t
        d       t        | |       d d d        y # 1 sw Y   y xY wNunsupported combination.*called without specifying.*)r4   r5   pytestr   filterDeprecationWarningr~   r'   rq   sups      r&   test_maxiterr      s]    T0000-.		 $

%'FGfd#$ $ $   #A''A0c                 J    t        | |z
        }|t        |      z  }||k  sJ y rt   r   )ar3   rz   residual	tolerances        r&   assert_normcloser      s*    AE{Hd1gIir)   c                    |j                   }|j                  j                  dv rd}nd}|j                  }d|z  } | ||||      \  }}t	        |d|z         | |j
                  vr|dk(  sJ t        ||z  ||       y |dk7  sJ t        j                  j                  ||z  |z
        t        j                  j                  |      k  sJ y )NdD:0yE>{Gz?r   ry   rz   rz   )
r0   r.   charr3   r   r5   r   r_   linalgr   )r'   rq   r0   rz   r3   ry   ru   r}   s           r&   check_convergencer      s    Aww||tA	
QBQbc*GAtr1q5!T(((qyyQs+qyyyy~~a!eai(BIINN1,====r)   c                     | |j                   v rt        j                   d       t               5 }|j                  t        d       t        | |       d d d        y # 1 sw Y   y xY wr   )r4   r   r   r   r   r   r   s      r&   test_convergencer      sR    -.		 (

%'FG&$'( ( (s   #AA#c                 "   d}d
d}|j                   }|j                  \  }}|j                         }t        j                  |      t        |      k(  rt        d|z  gdg||       |j                  }d|z  }	t        |j                  ||      }
| t        u r | |||
|
|	|      \  }}n | |||
|	|      \  }}|dk(  sJ t        ||z  ||       t        |      }||_        ||_         | |||	|      \  }}|dk(  sJ t        ||z  ||	       y )Nr   c                     | S )ztrivial preconditionerr@   )r3   whichs     r&   identityz%check_precond_dummy.<locals>.identity  s    r)         ?r   rmatvec)M1M2ry   rz   Mry   rz   r   r   rt   )r0   r1   diagonalr_   count_nonzeror|   r   r3   r   r   r   r   psolverpsolve)r'   rq   rz   r   r0   r   ri   diagOfAr3   ry   precondru   r}   s                r&   check_precond_dummyr     s   
C 	A77DAq jjlG	 CL0w!a+A	
QBQWWhAG}A'g"#F4ARS94199QUAs#AAHAIQbc*GAt199QUA3'r)   c                     | |j                   |j                  z   v rt        j                   d       t               5 }|j	                  t
        d       t        | |       d d d        y # 1 sw Y   y xY wr   )r4   r5   r   r   r   r   r   r   s      r&   test_precond_dummyr   (  s]    T0000-.		 *

%'FGFD)* * *r   c                 h   d}d
fd	}d
fd	}dgfd}fd}j                   }d|z  }t        j                  j                  ||      }	t        j                  j                  ||      }
dg | |	||
||      \  }}|dk(  sJ t	        j                  |z  ||       d   d	k  sJ y )Nr   c                     j                   }t        |t        j                        s|j	                         }t        j
                  j                  ||       S zinverse preconditioner)r0   
isinstancer_   ndarraytoarrayr   solver3   r   r0   rq   s      r&   inversez&check_precond_inverse.<locals>.inverse3  s:    FF!RZZ(		Ayyq!$$r)   c                     j                   }t        |t        j                        s|j	                         }t        j
                  j                  |j                  |       S r   )r0   r   r_   r   r   r   r   rb   r   s      r&   rinversez'check_precond_inverse.<locals>.rinverse:  s>    FF!RZZ(		AyyqssA&&r)   r   c                 <    dxx   dz  cc<   j                   | z  S Nr   rH   )r0   r3   rq   matvec_counts    r&   matvecz%check_precond_inverse.<locals>.matvecC  s    Q1vvzr)   c                 P    dxx   dz  cc<   j                   j                  | z  S r   )r0   rb   r   s    r&   r   z&check_precond_inverse.<locals>.rmatvecG  s#    Q1vvxx!|r)   r   r   rE   rt   )r3   r   r0   r1   r   )r'   rq   rz   r   r   r   r   r3   ry   r0   r   ru   r}   r   s    `           @r&   check_precond_inverser   0  s    
C%' 3L 	A	
QBtvv||VW=ATVV\\7HEG 3LQW5GAt199TVVaZC( ?ar)   c                     | |j                   v s| t        u s|j                  dvrt        j                   d       t	               5 }|j                  t        d       t        | |       d d d        y # 1 sw Y   y xY w)N)rK   rM   r   r   )r4   r   r/   r   r   r   r   r   r   s      r&   test_precond_inverser   \  se    $))v}yy ::-.		 ,

%'FGfd+, , ,s   #A00A9c                     t         t        t        t        g}t	               5 }|j                  t        d       t        | | |v        d d d        y # 1 sw Y   y xY w)Nr   )r   r   r   r   r   r   r   _check_reentrancy)r'   	reentrantr   s      r&   test_reentrancyr   e  sL    %0I		 7

%'FG&&I"567 7 7s   %AAc                       fd}t        j                  g d      }t        d|||j                        }|st	        j
                  t         ||       y   ||      \  }}|dk(  sJ t        |g d       y )Nc                 j    t        j                  g dg dg dg      } ||       \  }}|dk(  sJ |S )N)r   r   r   )r   g       @r   )r   r   g      @r   )r_   r   )ru   r0   yr}   r'   s       r&   r   z!_check_reentrancy.<locals>.matvecm  s8    HHk;<=A,4qyyr)   )rH   g      ?gUUUUUU?)rE   rE   )r   r   r.   r   )rH   rH   rH   )r_   r   r   r.   r   raisesRuntimeErrorr   )r'   is_reentrantr   r3   opr   r}   s   `      r&   r   r   l  sl    
 	$%A	vvgg
'B lFB2Q-4qyy9%r)   c           	      `   | t         t        fv rt        j                  d       t        j
                  j                  d       t        j
                  j                  dd      }||j                  z  dt	        j                  d      z  z   }dt        j
                  j                  d      z  }t        j                  j                  |      }t        j                  dt	        j                  t	        j                  d      t	        j                  d      d      t        j                  f   }t        j
                  j!                  dd      }||j                  z  }d d	|z  d
|z  g}t#        j$                  |||      D ]  \  }}}	|dk(  r|	dk(  r| t&        u r@|*t)        |      }t)        t	        j                  d            }
nd }
 | ||||
||	      \  }}n | |||||	      \  }}|dk(  sJ ||z  |z
  }t        j                  j                  |      }||z  }|dt+        |	|      z  k  rJ  y )NTODOrV   rQ   g     @@r   绽|=      Y@rP   ư>g    .A)r   r   rz   atol)r   rz   r   g/$?)r   r   r   r4   r_   r`   ra   rW   rb   r
   r   r   r_logspacelog10infrandn	itertoolsproductr   r   max)r'   r0   r3   b_normtolsM0Msr   rz   r   r   ru   r}   r   erratol2s                   r&   	test_atolr   ~  s    &% FIINN4
		r2A	ACC"rvvbz/!AbiinnR  AYY^^AF55BKK#BBFFJKD 
R	 B	bddB
r	38	$B!))"dD9 13!8	S=}$Q'%bffRj1QaBCdCGAtQQCd;GAtqyyq519iinnX&f gD% 00000)1r)   c                    t         j                  j                  d       t         j                  j                  dd      }||j                  z  dt        j
                  d      z  z   }t        j                  d      }t         j                  t        j                  t        j                  d      t        j                  d      d         }|D ]  }t               5 }|j                  t        d        | |||      \  }}|dk(  sJ t        |d	d
        | |||t        d            \  }}|dk(  sJ t        |d	|       | t        urr | |||dt        d            \  }}|dk(  rt        |d        | ||||      \  }}|dk(  sJ t        |dd        | |||d      \  }}|dk(  sJ t        |dd       d d d         y # 1 sw Y   xY w)NrV   rQ   r   r   rP   r   r   r   g        V瞯<)r   )rz   ry   )rz   r   ry   rz   r   gYn)r_   r`   ra   rW   rb   r
   r   r   r   r   r   r   r   r   r	   r   )r'   r0   r3   r   rz   r   ru   r}   s           r&   test_zero_rhsr     s   IINN4
		r2A	ACC"rvvbz/!A
A55RXXe_bhhsmQ?@D 3  	3CJJ)+JKQs+GAt199Ar.QstBx8GAt199Ar,V# A3Q48D419#Aq) A3S94qy y162 A3Q74qy y162-	3 	33	3 	3s   C!GG	zsee gh-18697reasonc                 `   | t         t        fvrt        j                  d       | t         u rCt	        j
                         dk(  r,t        j                  d   dk(  rt        j                  d       | t        u r,t	        j
                         dvrt        j                  d       t        j                  g d	g d
g dg dg      }t        j                  d      }t        j                  }t	        j
                         dk(  rdnd}t        dd      D ]  } | |||dd      \  }}|dk(  rJt        j                  j                  ||z  |z
        dt        j                  j                  |      z  k  sJ t        j                  j                  ||z  |z
        }t!        ||      }|||z  k  rJ  y )Nr   aarch64rH   rT   zgh-13019r   )	x86_64x86r   arm64z,fails on at least ppc64le, ppc64 and riscv64)gH|r   r   ghܾΤ?)r   yXq-DT!@r   r   )r   r   yXq-DT!r   )g |?                r   gܾΤĿrR   rP         r   r   )r{   rz   r   )r   r   r   r4   platformmachinesysversion_infoxfailr_   r   r	   r   ranger   r   min)	r'   r0   v
best_errorrz   r{   ru   r}   errors	            r&   test_maxiter_worseningr     sn   eV_$-.
 	%H,,.);  #q(J'&&JJJK 	BFFDF 	GA 	
AJ!Y.!ACB< 
)AwDqA41999>>!a%!),ryy~~a7H0HHHH		q1uqy)U+
 j((((
)r)   c                    t         j                  j                  d       d}t         j                  j                  ||      }||j                  z  }t         j                  j                  |      }t         j                  j                  |      }| t
        u rt        d      }nt        dd      } | ||fi |\  }}|dk(  sJ t         j                  j                  ||z  |z
        dt         j                  j                  |      z  k  sJ  | ||fd|i|\  }}|dk(  sJ t         j                  j                  ||z  |z
        dt         j                  j                  |      z  k  sJ y )	NrH   rQ   r   r   r   )r   rz   ry   g>)	r_   r`   ra   rW   rb   r   dictr   r   )r'   nr0   r3   ry   kwru   r}   s           r&   test_x0_workingr     s*   IINN1
A
		q!A	ACCA
		qA		Bd^qd#Q R GAt19999>>!a%!)$ryy~~a/@(@@@@Q'b'B'GAt19999>>!a%!)$ryy~~a/@(@@@@r)   c                 b   | |j                   v s| t        u rt        j                   d       t               5 }|j	                  t
        d       |j                  }|j                  }d}d} | ||||      \  }}t        |d       |dk(  sJ t        ||z  ||       d d d        y # 1 sw Y   y xY w)Nr   r   Mbr   r   r   r   )
r4   r   r   r   r   r   r0   r3   r   r   )	r'   rq   r   r0   r3   ry   rz   ru   r}   s	            r&   test_x0_equals_Mbr    s    fo-.		 
,

%'FGFFFFA"#.42t$qyyQs+
, 
, 
,s   A&B%%B.c                     d }t        | j                  | j                  |d      \  }}|j                         \  }}| j                  dk(  rd}n| j                  dv rd}nd}|j                  |      sJ |dk(  sJ y )	Nc                      y rt   r@   ru   s    r&   cbztest_show.<locals>.cb  s    r)   T)rw   showr[    )rY   rZ   z?TFQMR: Linear solve not converged due to reach MAXIT iterationsz9TFQMR: Linear solve converged due to reach TOL iterations)r   r0   r3   
readouterrr/   
startswith)rq   capsysr  ru   r}   outr   exps           r&   	test_showr    s}     DFFDFFRd;GAt  "HCyyK	8	8OI>>#"99r)   c                       e Zd Zd Zy)TestQMRc           	         ddl m} ddlm} d}t	        |      }t        d|z  d|z  | gg d||      }t        |d	      }t        | d
z  |gddg||      }t        d|z  | gddg||      }t               5 }	|	j                  t        d        ||       ||      ddd       fd}
fd}fd}fd} |||f|
|      } |||f||      }t               5 }	|	j                  t        d       t        ||dd||      \  }}ddd       dk(  sJ t        |z  |d       y# 1 sw Y   xY w# 1 sw Y   .xY w)z8Check that QMR works with left and right preconditionersr   )splu)r   d   rR   )rG   r   rH   rU   r-   rF   rG   rH   z&splu converted its input to CSC formatNc                 &    j                  |       S rt   r   r3   L_solvers    r&   L_solvez/TestQMR.test_leftright_precond.<locals>.L_solveD      >>!$$r)   c                 &    j                  |       S rt   r  r3   U_solvers    r&   U_solvez/TestQMR.test_leftright_precond.<locals>.U_solveG  r  r)   c                 (    j                  | d      S Nrb   r  r  s    r&   LT_solvez0TestQMR.test_leftright_precond.<locals>.LT_solveJ      >>!S))r)   c                 (    j                  | d      S r  r  r  s    r&   UT_solvez0TestQMR.test_leftright_precond.<locals>.UT_solveM  r!  r)   )r   r   r   r      )rz   r{   r   r   r   )scipy.sparse.linalg._dsolver  scipy.sparse.linalg._interfacer   r	   r   r   r   r   r   r   r   r   )r6   r  r   r   datr0   r3   LUr   r  r  r   r#  r   r   ru   r}   r  r  s                     @@r&   test_leftright_precondzTestQMR.test_leftright_precond/  se    	5A1gR#Xq3w-z1a@1C cTAXsOb!Wa3QWsdOaVQ2  	CJJ.?AAwHAwH			%	%	*	* QF7HEQF7HE  	DCJJ)+JK!QD"CGAt	D qyyQt,5	 	*	D 	Ds   9'D, +D8,D58EN)r=   r>   r?   r*  r@   r)   r&   r  r  .  s    )-r)   r  c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)	TestGMRESc                 R   t        j                  t        j                  d      dz         d d d d df   }t        j                  d      }d|d<   t	               5 }|j                  t        d       t        ||dd      \  }}d d d        t        d   dd	
       y # 1 sw Y   xY w)NrQ   rH   rG   r   r   r   )restartr{   g`"?r   rtol)	r_   vanderr   r   r   r   r   r   r   )r6   r0   r3   r   x_gmr   s         r&   
test_basiczTestGMRES.test_basic\  s    IIbiima'(DbD1HHRL!  	:CJJ)+JKaAq9ID#	: 	QT2		: 	:s   )BB&c                   	
 d 
t        t        g dg dg dg dg dg dg            }t        |j                  d   f      }d	}t	        |d	z         	d
	d<   	
fd}t               5 }|j                  t        d       t        ||t	        |j                  d         d||      \  }}d d d        t        	t        d
dg      d       dt        j                  |j                  d         z  }t	        |d	z         	d
	d<   t               5 }|j                  t        d       t        |||d||      \  }}d d d        t        	t        d
dg      d       y # 1 sw Y   xY w# 1 sw Y   /xY w)Nc                 R    | ||j                         d   j                         dz   <   y r   )nonzeror   )rrvecs     r&   store_residualz/TestGMRES.test_callback.<locals>.store_residuali  s%    01D"&&(1,-r)   )r  rH   r   r   r   r   )rH   r  rH   r   r   r   )r   rH   r  rH   r   r   )r   r   rH   r  rH   r   )r   r   r   rH   r  rH   )r   r   r   r   rH   r  r   rH   r   c                      |       S rt   r@   )r7  r8  r9  s    r&   rw   z)TestGMRES.test_callback.<locals>.callbackx  s    !!T**r)   r   gؗҜ<rx   g>,p ?r   r/  gMbP?)r   rz   r{   rw   g!{bEJ?)r   r   r	   r1   r   r   r   r   r   r   r_   r
   )r6   r0   r3   r{   rw   r   ru   flagr   r8  r9  s            @@r&   test_callbackzTestGMRES.test_callbackg  sv   	2 u1111113 4 5 !''!*Wq[!Q	+   	@CJJ)+JKAqU1771:%6E$+h@GAt	@ 	eS*=$>?eL 266!''!*%%Wq[!Q  	/CJJ)+JKAqA5'%-/GAt	/ 	eS*D$EF"	$'	@ 	@	/ 	/s   *AE+E'E$'E0c                    t        d      }t        d      }t               5 }|j                  t        d       t        ||      \  }}|j                  t              }t        |j                  t              |j                  t                    \  }}d d d        t              sJ t        |       k(  sJ y # 1 sw Y   *xY w)NrF   r   )
r
   r	   r   r   r   r   r^   complexr   r   )r6   r0   r3   r   r_xr_inforu   r}   s           r&   test_abizTestGMRES.test_abi  s    FG  	BCJJ)+JK1+KC**W%CAHHW-qxx/@AGAt	B AQ~~	B 	Bs   A0B::Cc                    t               5 }|j                  t        d       t        d      }dt	        d      z  }t        ||d      \  }}t        |t        j                  d             t        d      }t	        d      }t        ||d      \  }}t        j                  j                  ||z  |z
        dt        j                  j                  |      z  k  sJ t        ||dd       t        j                  j                  d	      }|j                  d
d
      }dt	        d
      z  }t        ||dd      \  }}t        j                  j                  ||z  |z
        dkD  sJ 	 d d d        t        d      }dt	        d      z  }t        ||dd      \  }}t        j                  j                  ||z  |z
        dt        j                  j                  |      z  k  sJ y # 1 sw Y   xY w)Nr   rF   r   gh㈵>r   r   r   )r   r0  i90     gHz>r   )rz   r.  r   r   )r   r   r   r
   r	   r   r   r_   r   r   r   r   r`   RandomStaterW   )r6   r   r0   r3   ru   r}   rndms          r&   test_atol_legacyzTestGMRES.test_atol_legacy  s     	4CJJ)+JK AAtAwAAqd+GAtq"((1+.AAQAAqd+GAt99>>!a%!),ryy~~a7H0HHHHAqqt499((/D		"b!AtBxAAqdB7GAt99>>!a%!),t333)	4, FDGO1$Q/4yy~~a!eai(D299>>!3D,DDDD3	4 	4s   EG%%G.c                    t        j                  d      }d|d<   t        j                  g d      }t        j                  g d      }t        j                  g d      }t	        ||||dd      \  }}t        j
                  |      j                         rJ |dk(  rJt         j                  j                  ||z  |z
        dt         j                  j                  |      z  k  sJ t        |||z  z  ||z         y )	NrE   r   )rF   rF   )r   rH   rH   rH   r   r   )rF   rE   rR   r   )ry   r   rz   r   )
r_   r
   r   diagr   isnananyr   r   r   )r6   r   r3   ru   r0   r}   s         r&    test_defective_precond_breakdownz*TestGMRES.test_defective_precond_breakdown  s    FF1I$HHYHHYGGI1aU;4 88A;??$$$1999>>!a%!),		q8I0IIII 	QUQU+r)   c                    t        j                  g dg dg dg      }t        j                  g d      }t        ||dd      \  }}t        j                  |      j	                         rJ |dk(  rJt         j
                  j                  ||z  |z
        dt         j
                  j                  |      z  k  sJ t        |||z  z  ||z         y )N)r   rH   r   rH  )r   r   r   )rH   r   rH   r   r   r   )r_   r   r   rJ  rK  r   r   r   )r6   r0   r3   ru   r}   s        r&   test_defective_matrix_breakdownz)TestGMRES.test_defective_matrix_breakdown  s    HHiI67HHY1$Q/4 88A;??$$$1999>>!a%!),ryy~~a7H0HHHH 	QUQU+r)   c           
         t         j                  j                  d       t         j                  j                  dd      }t         j                  j                  d      }dgfd}fd}t	               5 }|j                  t        d       dgt        ||dd|dd	
      \  }}|dk(  sJ d   dk(  sJ 	 d d d        dgt        ||dd|dd	d      \  }}|dk(  sJ d   dk(  sJ dgt        ||dd|dd	d      \  }}|dk(  sJ d   dkD  sJ dgt        ||dd|dd	d      \  }}|dk(  sJ d   dk(  sJ y # 1 sw Y   xY w)NrH   r   r   c                 D    dxx   dz  cc<   t        | t              sJ y r   )r   r2   )r7  cb_counts    r&   
pr_norm_cbz0TestGMRES.test_callback_type.<locals>.pr_norm_cb  s!    QK1Ka'''r)   c                 X    dxx   dz  cc<   t        | t        j                        sJ y r   )r   r_   r   )ru   rQ  s    r&   x_cbz*TestGMRES.test_callback_type.<locals>.x_cb  s%    QK1Ka,,,r)   r   r   rF   2   )rz   r   rw   r{   r.  legacyrz   r   rw   r{   r.  callback_typepr_normru   )r_   r`   ra   rW   r   r   r   r   )	r6   r0   r3   rR  rT  r   ru   r}   rQ  s	           @r&   test_callback_typezTestGMRES.test_callback_type  s   
		qIINN2r"IINN23	(	-   	$CJJ)+JKsHAqdZQR$&(GAt199A;!###	$ 31$Q !2XG4qyy{a 31$Q !2YH4qyy{Q 31$Qq "#74qyy{a9	$ 	$s   7A D??Ec           
         t         j                  j                  d       t         j                  j                  dd      t        j                  d      z   t         j                  j                  d      t         j
                  gdgfd}t        dd|ddd      \  }}|dk(  sJ d   d	k(  sJ  ||       y )
NrH   r   r   c                     t         j                  j                  | z  z
        }|d   k  sJ |d<   dxx   dz  cc<   y r   )r_   r   r   )ru   r7  r0   r3   countprev_rs     r&   rT  z1TestGMRES.test_callback_x_monotonic.<locals>.x_cb  sC    		q1uqy)Aq	>!>F1I!HMHr)   r   rQ   ru   rW     )r_   r`   ra   rW   r
   r   r   )r6   rT  ru   r}   r0   r3   r]  r^  s       @@@@r&   test_callback_x_monotonicz#TestGMRES.test_callback_x_monotonic  s    
		qIINN2r"RVVBZ/IINN2&&	 1$QrSU&)+4rzzQx2~~Qr)   c                     t        j                  t        d      5  t        t	        j
                  dg      t	        j
                  dg      d       d d d        y # 1 sw Y   y xY w)Nz!'gmres' keyword argument 'restrt')matchrH   rQ   )restrt)r   warnsr   r   r_   r   r;   s    r&   test_restrt_depzTestGMRES.test_restrt_dep   sK    \\5
 	; "((A3-1#r:		; 	; 	;s   7AA%N)r=   r>   r?   r3  r<  rA  rF  rL  rN  rZ  r`  re  r@   r)   r&   r,  r,  [  s2    	3($TE8,&,, \*;r)   r,  )r   )C__doc__r   r   r   numpyr_   numpy.testingr   r   r   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   _SOLVERSfixturer'   r+   rB   r\   r/   rq   r~   r   r   r   r   r   r   r   r   r   r   r   r   markr   r   r   r  r  r  r,  r  s   0r&   <module>rp     sz     
 . .  @ ?  N N @= = = (BWeVC  xy1 2   *} }@ 	u5"9a166"9K L$$ >,("(J*) X,7&$'1T3D .)#) *#)LA., ,*- *-ZJ; J;} #:s   ?E	
