B
    `*                 @   s   d dl mZmZmZmZmZ d dlmZ ddlm	Z	 dgZ
dd
dZedkrd dl mZ d dlmZ dZg Zdd Zeeded edgd geeddZededed ed gd geeddZeje_eejd  ZeeeddedZdS )    )sqrtinnerzerosinffinfo)norm   )make_systemminresN        h㈵>Fc
       H      C   s  t | |||\} }}
}}| j}|j}d}d}| jd }|dkrFd| }dddd	d
ddddddg}|rt|d  t|d||f   t|d||f   t  d}d}d}d}d}d}|
j}t|j}|| |
  }||}t||}|dk rtdn|dkr||
dfS t	|}|	r||}||}t||}t||} t
||  }!|| |d  }"|!|"krltd||}t||}t||} t
||  }!|| |d  }"|!|"krtdd}#|}$d}%d}&|}'|}(|})d}*d}+d},t|j}-d}.d}/t||d}t||d}0|}|r&t  t  td x||k r|d7 }d|$ }|| }1||1}|||1  }|dkrz||$|# |  }t|1|}2||2|$ |  }|}|}||}|$}#t||}$|$dk rtdt	|$}$|+|2d |#d  |$d  7 }+|dkr|$| d| krd}|&}3|.|% |/|2  }4|/|% |.|2  }5|/|$ }&|. |$ }%t|5|%g}6|(|6 }7t|5|$g}8t|8|}8|5|8 }.|$|8 }/|.|( }9|/|( }(d|8 }:|0};|}0|1|3|;  |4|0  |: }|
|9|  }
t|,|8},t|-|8}-|)|8 }!|*|4|!  })|& |! }*t	|+}t|
}|| }"|| | }<|| | }=|5}>|>dkr0|"}>|(}'|'}|dksL|dkrRt}?n|||  }?|dkrnt}@n|6| }@|,|- }|dkrd|? }Ad|@ }B|Bdkrd}|Adkrd}||krd}|d | krd!}|<|krd"}|@|krd}|?|krd}d#}C|d$krd%}C|dkrd%}C||d kr0d%}C|d dkrBd%}C|'d|< krTd%}C|'d|= krfd%}C|d&| krxd%}C|dkrd%}C|r|Crd'||
d |?f }Dd(|@f }Ed)|||5| f }Ft|D|E |F  |d dkrt  |dk	r||
 |dkr*P q*W |rvt  t|d*||f   t|d+||f   t|d,||f   t|d-|7f   t|||d    |dkr|}Gnd}G||
|GfS ).ag
  
    Use MINimum RESidual iteration to solve Ax=b

    MINRES minimizes norm(A*x - b) for a real symmetric matrix A.  Unlike
    the Conjugate Gradient method, A can be indefinite or singular.

    If shift != 0 then the method solves (A - shift*I)x = b

    Parameters
    ----------
    A : {sparse matrix, dense matrix, LinearOperator}
        The real symmetric N-by-N matrix of the linear system
        Alternatively, ``A`` can be a linear operator which can
        produce ``Ax`` using, e.g.,
        ``scipy.sparse.linalg.LinearOperator``.
    b : {array, matrix}
        Right hand side of the linear system. Has shape (N,) or (N,1).

    Returns
    -------
    x : {array, matrix}
        The converged solution.
    info : integer
        Provides convergence information:
            0  : successful exit
            >0 : convergence to tolerance not achieved, number of iterations
            <0 : illegal input or breakdown

    Other Parameters
    ----------------
    x0  : {array, matrix}
        Starting guess for the solution.
    tol : float
        Tolerance to achieve. The algorithm terminates when the relative
        residual is below `tol`.
    maxiter : integer
        Maximum number of iterations.  Iteration will stop after maxiter
        steps even if the specified tolerance has not been achieved.
    M : {sparse matrix, dense matrix, LinearOperator}
        Preconditioner for A.  The preconditioner should approximate the
        inverse of A.  Effective preconditioning dramatically improves the
        rate of convergence, which implies that fewer iterations are needed
        to reach a given error tolerance.
    callback : function
        User-supplied function to call after each iteration.  It is called
        as callback(xk), where xk is the current solution vector.

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.sparse import csc_matrix
    >>> from scipy.sparse.linalg import minres
    >>> A = csc_matrix([[3, 2, 0], [1, -1, 0], [0, 5, 1]], dtype=float)
    >>> A = A + A.T
    >>> b = np.array([2, 4, -1], dtype=float)
    >>> x, exitCode = minres(A, b)
    >>> print(exitCode)            # 0 indicates successful convergence
    0
    >>> np.allclose(A.dot(x), b)
    True

    References
    ----------
    Solution of sparse indefinite systems of linear equations,
        C. C. Paige and M. A. Saunders (1975),
        SIAM J. Numer. Anal. 12(4), pp. 617-629.
        https://web.stanford.edu/group/SOL/software/minres/

    This file is a translation of the following MATLAB implementation:
        https://web.stanford.edu/group/SOL/software/minres/minres-matlab.zip

    zEnter minres.   zExit  minres.   r   N   z3 beta2 = 0.  If M = I, b and x are eigenvectors    z/ beta1 = 0.  The exact solution is x0          z3 A solution to Ax = b was found, given rtol        z3 A least-squares solution was found, given rtol    z3 Reasonable accuracy achieved, given eps           z3 x has converged to an eigenvector                 z3 acond has exceeded 0.1/eps                        z3 The iteration limit was reached                   z3 A  does not define a symmetric matrix             z3 M  does not define a symmetric matrix             z3 M  does not define a pos-def preconditioner       zSolution of symmetric Ax = bz#n      =  %3g     shift  =  %23.14ez"itnlim =  %3g     rtol   =  %11.2ezindefinite preconditionergUUUUUU?znon-symmetric matrixznon-symmetric preconditioner)dtypezD   Itn     x(1)     Compatible    LS       norm(A)  cond(A) gbar/|A|r   g      ?   
      g?      F(   Tg{Gz?z%6g %12.5e %10.3ez %10.3ez %8.1e %8.1e %8.1ez( istop   =  %3g               itn   =%5gz' Anorm   =  %12.4e      Acond =  %12.4ez' rnorm   =  %12.4e      ynorm =  %12.4ez Arnorm  =  %12.4e)r	   matvecshapeprintr   r   epsr   
ValueErrorr   absmaxr   r   minr   )HAbZx0shifttolmaxiterMcallbackshowcheckxpostprocessr   psolvefirstlastnmsgistopitnZAnormZAcondZrnormZynormZxtyper   Zr1yZbeta1wZr2stzZepsaZoldbbetaZdbarZepslnZqrnormZphibarZrhs1Zrhs2Ztnorm2ZgmaxZgmincsZsnZw2vZalfaZoldepsdeltaZgbarrootZArnormgammaphiZdenomZw1ZepsxZepsrZdiagZtest1Ztest2t1t2ZprntZstr1Zstr2Zstr3info r?   P/home/dcms/DCMS/lib/python3.7/site-packages/scipy/sparse/linalg/isolve/minres.pyr
   	   s   J





































__main__)arange)spdiagsr   c             C   s   t ttt|    d S )N)	residualsappendr   r   r   )r'   r?   r?   r@   cbn  s    rF   )r   Zcsr)formatg      ?g-q=)r!   r"   r$   )Nr   r   NNNFF)numpyr   r   r   r   r   Znumpy.linalgr   utilsr	   __all__r
   __name__rB   Zscipy.sparserC   r,   rD   rF   floatr   r#   r   r)   r   r   r'   r?   r?   r?   r@   <module>   s$    
  ^$(