
    xfa                     *    d dl ZddlmZ dgZ	 	 ddZy)    N   )make_systemtfqmrc	                 J   | j                   }	t        j                  |	t        j                        rt        }	| j                  |	      } t        j                  |j                   t        j                        r|j                  |	      }t        | |||      \  } }}
}}t        j                  j                  |      dk(  r|j                         }
 ||
      dfS | j                  d   }|t        d|dz        }||j                         }n|| j                  |
      z
  }|}|j                         }|}|j                  | j                  |            }|}dx}x}}t        j                  |j                         |      }|}t        j                  |      }|}|dk(  r
 ||
      dfS |||z  }nt!        |||z        }t#        |      D ]  }|dz  dk(  }|rBt        j                  |j                         |      }|dk(  r ||
      dfc S ||z  }|||z  z
  }||z  z  }||dz  |z  |z  |z  z   }t        j                  j                  |      |z  }t        j                  dd|dz  z   z        }|||z  z  }|dz  |z  }|j                  |      } |
|| z  z  }
| ||
       |t        j                  |dz         z  |k  r+|rt%        d	j'                  |dz                 ||
      dfc S |sft        j                  |j                         |      }||z  }!||!|z  z   }|!|z  |!dz  |z  z   }|j                  | j                  |            }||z  }|j                  | j                              }|}|} |rt%        d
j'                  dz                 ||
      |fS )a  
    Use Transpose-Free Quasi-Minimal Residual iteration to solve ``Ax = b``.

    Parameters
    ----------
    A : {sparse matrix, ndarray, LinearOperator}
        The real or complex 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 : {ndarray}
        Right hand side of the linear system. Has shape (N,) or (N,1).
    x0 : {ndarray}
        Starting guess for the solution.
    tol, atol : float, optional
        Tolerances for convergence, ``norm(residual) <= max(tol*norm(b-Ax0), atol)``.
        The default for `tol` is 1.0e-5.
        The default for `atol` is ``tol * norm(b-Ax0)``.

        .. warning::

           The default value for `atol` will be changed in a future release.
           For future compatibility, specify `atol` explicitly.
    maxiter : int, optional
        Maximum number of iterations.  Iteration will stop after maxiter
        steps even if the specified tolerance has not been achieved.
        Default is ``min(10000, ndofs * 10)``, where ``ndofs = A.shape[0]``.
    M : {sparse matrix, ndarray, LinearOperator}
        Inverse of the preconditioner of A.  M should approximate the
        inverse of A and be easy to solve for (see Notes).  Effective
        preconditioning dramatically improves the rate of convergence,
        which implies that fewer iterations are needed to reach a given
        error tolerance.  By default, no preconditioner is used.
    callback : function, optional
        User-supplied function to call after each iteration.  It is called
        as `callback(xk)`, where `xk` is the current solution vector.
    show : bool, optional
        Specify ``show = True`` to show the convergence, ``show = False`` is
        to close the output of the convergence.
        Default is `False`.

    Returns
    -------
    x : ndarray
        The converged solution.
    info : int
        Provides convergence information:

            - 0  : successful exit
            - >0 : convergence to tolerance not achieved, number of iterations
            - <0 : illegal input or breakdown

    Notes
    -----
    The Transpose-Free QMR algorithm is derived from the CGS algorithm.
    However, unlike CGS, the convergence curves for the TFQMR method is
    smoothed by computing a quasi minimization of the residual norm. The
    implementation supports left preconditioner, and the "residual norm"
    to compute in convergence criterion is actually an upper bound on the
    actual residual norm ``||b - Axk||``.

    References
    ----------
    .. [1] R. W. Freund, A Transpose-Free Quasi-Minimal Residual Algorithm for
           Non-Hermitian Linear Systems, SIAM J. Sci. Comput., 14(2), 470-482,
           1993.
    .. [2] Y. Saad, Iterative Methods for Sparse Linear Systems, 2nd edition,
           SIAM, Philadelphia, 2003.
    .. [3] C. T. Kelley, Iterative Methods for Linear and Nonlinear Equations,
           number 16 in Frontiers in Applied Mathematics, SIAM, Philadelphia,
           1995.

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.sparse import csc_matrix
    >>> from scipy.sparse.linalg import tfqmr
    >>> A = csc_matrix([[3, 2, 0], [1, -1, 0], [0, 5, 1]], dtype=float)
    >>> b = np.array([2, 4, -1], dtype=float)
    >>> x, exitCode = tfqmr(A, b)
    >>> print(exitCode)            # 0 indicates successful convergence
    0
    >>> np.allclose(A.dot(x), b)
    True
    g        r   i'  
      g      ?r   z<TFQMR: Linear solve converged due to reach TOL iterations {}zBTFQMR: Linear solve not converged due to reach MAXIT iterations {})dtypenp
issubdtypeint64floatastyper   linalgnormcopyshapeminmatvecinner	conjugatesqrtmaxrangeprintformat)"Abx0tolmaxiterMcallbackatolshowr
   xpostprocessndofsruwrstarvuhatdthetaetarhorhoLastr0normtauiterevenvtrstaralphauNextczbetas"                                     C/usr/lib/python3/dist-packages/scipy/sparse/linalg/_isolve/tfqmr.pyr   r      s   r GGE	}}UBHH%HHUO	}}QWWbhh'HHUO)!QA6Aq!Q 
yy~~aBFFHA""GGAJEeURZ(	zFFHO	A	AE	!ADA
((5??$a
(CGWWS\F
C{A""|V|4v&g )ax1}hhu0!4G"}#A++'ME	ME	UT\E!S(1,,		q!C'GGB!eQh,'(uqy!tunHHQK	S1WQK a 4' &&,fT!Vn6NA&&((5??,a0C=DD1HAttQw!m+A88AHHQK(DIA88AHHUO,DAGS)V 	 $fT!Vn	.NG$$    )Ngh㈵>NNNNF)numpyr   utilsr   __all__r    r?   r>   <module>rD      s"      ) 48).p%r?   