§
    fŠtj  ã                   óD   — d dl ZddlmZ ddlmZ dgZdddddddd	œd
„ZdS )é    Né   )Ú_get_atol_rtol)Úmake_systemÚtfqmrgñhãˆµøä>ç        F)ÚrtolÚatolÚmaxiterÚMÚcallbackÚshowc                ó`  — | j         }	t          j        |	t          j        ¦  «        rt          }	|                      |	¦  «        } t          j        |j         t          j        ¦  «        r|                     |	¦  «        }t          | |||¦  «        \  } }}
}t          j                             |¦  «        dk    r| 	                    ¦   «         }
|
dfS | j
        d         }|€t          d|dz  ¦  «        }|€| 	                    ¦   «         }n||                      |
¦  «        z
  }|}| 	                    ¦   «         }|}|                     |                      |¦  «        ¦  «        }|}dx}x}}t          j        |                     ¦   «         |¦  «        j        }|}t          j        |¦  «        }|}|dk    r|
dfS t#          d|||¦  «        \  }}t%          |¦  «        D �]º}|dz  dk    }|r@t          j        |                     ¦   «         |¦  «        }|dk    r|
dfc S ||z  }|||z  z
  }|||z  z  }||dz  |z  |z  |z  z   }t          j                             |¦  «        |z  }t          j        d	d
|dz  z   z  ¦  «        }|||z  z  }|dz  |z  }|                     |¦  «        } |
|| z  z  }
|� ||
¦  «         |t          j        |d
z   ¦  «        z  |k     r|rt'          d|d
z   › �¦  «         |
dfc S |sqt          j        |                     ¦   «         |¦  «        }||z  }!||!|z  z   }|!|z  |!dz  |z  z   }|                     |                      |¦  «        ¦  «        }||z  }�ŒŽ|                     |                      |¦  «        ¦  «        }|}|}�Œ¼|rt'          d|d
z   › �¦  «         |
|fS )aM  
    Solve ``Ax = b`` with the Transpose-Free Quasi-Minimal Residual method.

    Parameters
    ----------
    A : {sparse array, 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.
    rtol, atol : float, optional
        Parameters for the convergence test. For convergence,
        ``norm(b - A @ x) <= max(rtol*norm(b), atol)`` should be satisfied.
        The default is ``rtol=1e-5``, the default for ``atol`` is ``0.0``.
    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 array, 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_array
    >>> from scipy.sparse.linalg import tfqmr
    >>> A = csc_array([[3, 2, 0], [1, -1, 0], [0, 5, 1]], dtype=float)
    >>> b = np.array([2, 4, -1], dtype=float)
    >>> x, exitCode = tfqmr(A, b, atol=0.0)
    >>> print(exitCode)            # 0 indicates successful convergence
    0
    >>> np.allclose(A.dot(x), b)
    True
    r   r   Ni'  é
   r   é   éÿÿÿÿg      ð?r   z:TFQMR: Linear solve converged due to reach TOL iterations z@TFQMR: Linear solve not converged due to reach MAXIT iterations )ÚdtypeÚnpÚ
issubdtypeÚint64ÚfloatÚastyper   ÚlinalgÚnormÚcopyÚshapeÚminÚmatvecÚinnerÚ	conjugateÚrealÚsqrtr   ÚrangeÚprint)"ÚAÚbÚx0r   r	   r
   r   r   r   r   ÚxÚndofsÚrÚuÚwÚrstarÚvÚuhatÚdÚthetaÚetaÚrhoÚrhoLastÚr0normÚtauÚ_ÚiterÚevenÚvtrstarÚalphaÚuNextÚcÚzÚbetas"                                     ú_/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/scipy/sparse/linalg/_isolve/tfqmr.pyr   r   	   sä  € ðh ŒG€EÝ	„}�U�BœHÑ%Ô%ð ÝˆØ�HŠH�U‰OŒOˆÝ	„}�Q”W�bœhÑ'Ô'ð Ø�HŠH�U‰OŒOˆå˜Q  2 qÑ)Ô)�J€A€qˆ!ˆQõ 
„y‡~‚~�aÑÔ˜BÒÐØ�FŠF‰HŒHˆØ�1ˆvˆàŒG�AŒJ€EØ€Ý�e˜U R™ZÑ(Ô(ˆà	€zØ�FŠF‰HŒHˆˆà�—’˜‘”‰OˆØ	€AØ	�Š‰Œ€Aà€EØ	�Š�—’˜!‘”ÑÔ€AØ€DØÐ€AÐˆ�å
Œ(�5—?’?Ñ$Ô$ aÑ
(Ô
(Ô
-€CØ€GÝŒW�S‰\Œ\€FØ
€CØ�‚{€{Ø�1ˆvˆõ ˜W f¨d°DÑ9Ô9�G€Dˆ!å�g‘”ð )ñ )ˆØ�a‰x˜1Š}ˆØð 	"Ý”h˜uŸšÑ0Ô0°!Ñ4Ô4ˆGà˜"Š}ˆ}Ø˜2�w���Ø˜'‘MˆEØ˜ ™	‘MˆEØ	ˆU�T‰\ÑˆØ�˜‘˜EÑ! SÑ(¨1Ñ,Ñ,ˆå”	—’˜qÑ!Ô! CÑ'ˆÝŒG�B˜!˜e Q™h™,Ñ'Ñ(Ô(ˆØˆu�q‰yÑˆà�!‰t�u‰nˆØ�HŠH�Q‰KŒKˆØ	ˆS�1‰W‰ˆàÐØˆH�Q‰KŒKˆKð •”˜˜a™‘”Ñ  4Ò'Ð'Øð .Ýð -Ø$(¨¡Fð-ð -ñ .ô .ð .à�q�6ˆMˆMˆMàð 	å”(˜5Ÿ?š?Ñ,Ô,¨aÑ0Ô0ˆCØ˜‘=ˆDØ�D˜1‘H‘ˆAØ�t‘˜t Q™w¨!™mÑ+ˆAØ—8’8˜AŸHšH Q™KœKÑ(Ô(ˆDØ�‰IˆA‰Aà—8’8˜AŸHšH U™OœOÑ,Ô,ˆDØˆAØˆG‰Gàð &Ýð %Ø  ™Fð%ð %ñ 	&ô 	&ð 	&àˆwˆ<Ðó    )N)Únumpyr   Ú	iterativer   Úutilsr   Ú__all__r   © r@   r?   ú<module>rF      s{   ðØ Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ø Ð Ð Ð Ð Ð ð ˆ)€ðj ¨B¸ÀØ˜eðjð jð jð jð jð jð jr@   