o
    Ö­jÄ  ã                   @   s2  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m	Z	m
Z
mZmZmZmZ d dlZd dlZd dlmZ d dlmZ d dlmZ ddlmZmZ g d	¢ZG d
d„ deƒZdd„ Zdd„ Zdd„ Zdd„ Z e!d "¡ d "¡ d�Z#dd„ Z$				dHdd„Z%e$e%ƒ 		 dId!d"„Z&G d#d$„ d$ƒZ'G d%d&„ d&ƒZ(G d'd(„ d(ƒZ)d)d*„ Z*G d+d,„ d,e(ƒZ+G d-d.„ d.ƒZ,d/ "¡ e#d0< G d1d2„ d2e+ƒZ-G d3d4„ d4e-ƒZ.G d5d6„ d6e+ƒZ/G d7d8„ d8e+ƒZ0G d9d:„ d:e+ƒZ1G d;d<„ d<e+ƒZ2G d=d>„ d>e(ƒZ3d?d@„ Z4e4dAe-ƒZ5e4dBe.ƒZ6e4dCe/ƒZ7e4dDe1ƒZ8e4dEe0ƒZ9e4dFe2ƒZ:e4dGe3ƒZ;dS )Jé    N)ÚasarrayÚdotÚvdot)ÚnormÚsolveÚinvÚqrÚsvdÚLinAlgError)Úget_blas_funcs)Úcopy_if_needed)Úgetfullargspec_no_selfé   )Úscalar_search_wolfe1Úscalar_search_armijo)Úbroyden1Úbroyden2ÚandersonÚlinearmixingÚdiagbroydenÚexcitingmixingÚnewton_krylovÚBroydenFirstÚKrylovJacobianÚInverseJacobianÚNoConvergencec                   @   s   e Zd ZdZdS )r   z\Exception raised when nonlinear solver fails to converge within the specified
    `maxiter`.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r    r    úS/var/www/html/CropPilot/venv/lib/python3.10/site-packages/scipy/optimize/_nonlin.pyr      s    r   c                 C   s   t  | ¡ ¡ S ©N)ÚnpÚabsoluteÚmax©Úxr    r    r!   Úmaxnorm$   ó   r(   c                 C   s*   t | ƒ} t | jtj¡st | tjd�S | S )z:Return `x` as an array, of either floats or complex floats©Údtype)r   r#   Ú
issubdtyper+   ÚinexactÚfloat64r&   r    r    r!   Ú_as_inexact(   s   r/   c                 C   s(   t  | t  |¡¡} t|d| jƒ}|| ƒS )z;Return ndarray `x` as same array subclass and shape as `x0`Ú__array_wrap__)r#   ÚreshapeÚshapeÚgetattrr0   )r'   Úx0Úwrapr    r    r!   Ú_array_like0   s   r6   c                 C   s"   t  | ¡ ¡ st  t j¡S t| ƒS r"   )r#   ÚisfiniteÚallÚarrayÚinfr   ©Úvr    r    r!   Ú
_safe_norm7   s   r=   z´
    F : function(x) -> f
        Function whose root to find; should take and return an array-like
        object.
    xin : array_like
        Initial guess for the solution
    a€  
    iter : int, optional
        Number of iterations to make. If omitted (default), make as many
        as required to meet tolerances.
    verbose : bool, optional
        Print status to stdout on every iteration.
    maxiter : int, optional
        Maximum number of iterations to make. If more are needed to
        meet convergence, `NoConvergence` is raised.
    f_tol : float, optional
        Absolute tolerance (in max-norm) for the residual.
        If omitted, default is 6e-6.
    f_rtol : float, optional
        Relative tolerance for the residual. If omitted, not used.
    x_tol : float, optional
        Absolute minimum step size, as determined from the Jacobian
        approximation. If the step size is smaller than this, optimization
        is terminated as successful. If omitted, not used.
    x_rtol : float, optional
        Relative minimum step size. If omitted, not used.
    tol_norm : function(vector) -> scalar, optional
        Norm to use in convergence check. Default is the maximum norm.
    line_search : {None, 'armijo' (default), 'wolfe'}, optional
        Which type of a line search to use to determine the step size in the
        direction given by the Jacobian approximation. Defaults to 'armijo'.
    callback : function, optional
        Optional callback function. It is called on every iteration as
        ``callback(x, f)`` where `x` is the current solution and `f`
        the corresponding residual.

    Returns
    -------
    sol : ndarray
        An array (of similar array type as `x0`) containing the final solution.

    Raises
    ------
    NoConvergence
        When a solution was not found.

    )Úparams_basicÚparams_extrac                 C   s   | j r| j t | _ d S d S r"   )r   Ú
_doc_parts)Úobjr    r    r!   Ú_set_docu   s   ÿrB   ÚkrylovFÚarmijoTc                     sT  |
du rt n|
}
t||||	||
d�}tˆƒ‰‡ ‡fdd„}ˆ ¡ }t |tj¡}||ƒ}t|ƒ}t|ƒ}| 	| 
¡ ||¡ |du rQ|durJ|d }nd|jd  }|du rXd}n|d	u r^d}|d
vrftdƒ‚d}d}d}d}t|ƒD ]Œ}| |||¡}|r nŒt||| ƒ}|j||d� }t|ƒdkr˜tdƒ‚|r§t|||||ƒ\}}}}nd}|| }||ƒ}t|ƒ}| | 
¡ |¡ |rÄ|||ƒ ||d  |d  }||d  |k rÜt||ƒ}nt|t|||d  ƒƒ}|}|rþtj d||
|ƒ|f ¡ tj ¡  qr|�r	tt|ˆƒƒ‚d}|�r%|j|||dkdddœ| dœ}t|ˆƒ|fS t|ˆƒS )aº  
    Find a root of a function, in a way suitable for large-scale problems.

    Parameters
    ----------
    %(params_basic)s
    jacobian : Jacobian
        A Jacobian approximation: `Jacobian` object or something that
        `asjacobian` can transform to one. Alternatively, a string specifying
        which of the builtin Jacobian approximations to use:

            krylov, broyden1, broyden2, anderson
            diagbroyden, linearmixing, excitingmixing

    %(params_extra)s
    full_output : bool
        If true, returns a dictionary `info` containing convergence
        information.
    raise_exception : bool
        If True, a `NoConvergence` exception is raise if no solution is found.

    See Also
    --------
    asjacobian, Jacobian

    Notes
    -----
    This algorithm implements the inexact Newton method, with
    backtracking or full line searches. Several Jacobian
    approximations are available, including Krylov and Quasi-Newton
    methods.

    References
    ----------
    .. [KIM] C. T. Kelley, "Iterative Methods for Linear and Nonlinear
       Equations". Society for Industrial and Applied Mathematics. (1995)
       https://archive.siam.org/books/kelley/fr16/

    N)Úf_tolÚf_rtolÚx_tolÚx_rtolÚiterr   c                    s   t ˆ t| ˆƒƒƒ ¡ S r"   )r/   r6   Úflatten)Úz©ÚFr4   r    r!   Úfunc­   s   znonlin_solve.<locals>.funcr   éd   TrD   F)NrD   ÚwolfezInvalid line searchgÍÌÌÌÌÌì?g§èH.ÿï?gš™™™™™¹?gü©ñÒMbP?)Útolr   z[Jacobian inversion yielded zero vector. This indicates a bug in the Jacobian approximation.ç      ð?é   z%d:  |F(x)| = %g; step %g
z0A solution was found at the specified tolerance.z:The maximum number of iterations allowed has been reached.)r   rS   )ÚnitÚfunÚstatusÚsuccessÚmessage)r(   ÚTerminationConditionr/   rJ   r#   Ú	full_liker:   r   Ú
asjacobianÚsetupÚcopyÚsizeÚ
ValueErrorÚrangeÚcheckÚminr   Ú_nonlin_line_searchÚupdater%   ÚsysÚstdoutÚwriteÚflushr   r6   Ú	iteration) rM   r4   ÚjacobianrI   ÚverboseÚmaxiterrE   rF   rG   rH   Útol_normÚline_searchÚcallbackÚfull_outputÚraise_exceptionÚ	conditionrN   r'   ÚdxÚFxÚFx_normÚgammaÚeta_maxÚeta_tresholdÚetaÚnrV   rQ   ÚsÚFx_norm_newÚeta_AÚinfor    rL   r!   Únonlin_solvez   s’   -þ

ÿ

ÿ
€þüü

r   ç:Œ0âŽyE>ç{®Gáz„?c                    sè   dg‰|g‰t |ƒd g‰t ˆƒt ˆ ƒ ‰d‡ ‡‡‡‡‡fdd„	‰‡‡‡fdd„}|dkr<tˆ|ˆd d	|d
�\}}	}
n|dkrOtˆˆd ˆd  |d�\}}	|d u rUd}ˆ|ˆ   ‰|ˆd krfˆd }nˆˆƒ}t |ƒ}|ˆ||fS )Nr   rS   Tc                    sT   | ˆd kr
ˆd S ˆ| ˆ   }ˆ|ƒ}t |ƒd }|r(| ˆd< |ˆd< |ˆd< |S )Nr   rS   )r=   )r{   ÚstoreÚxtr<   Úp)rs   rN   Útmp_FxÚtmp_phiÚtmp_sr'   r    r!   Úphi  s   z _nonlin_line_search.<locals>.phic                    s0   t | ƒˆ d ˆ }ˆ | | dd�ˆ | ƒ | S )Nr   F)r‚   )Úabs)r{   Úds)rˆ   ÚrdiffÚs_normr    r!   Úderphi#  s   z#_nonlin_line_search.<locals>.derphirP   r�   )ÚxtolÚaminrD   )r�   rR   )T)r   r   r   )rN   r'   rt   rs   Úsearch_typer‹   Úsminr�   r{   Úphi1Úphi0ru   r    )	rs   rN   rˆ   r‹   rŒ   r…   r†   r‡   r'   r!   rc     s,   ÿ
ÿ
rc   c                   @   s.   e Zd ZdZdddddefdd„Zdd„ ZdS )rY   z±
    Termination condition for an iteration. It is terminated if

    - |F| < f_rtol*|F_0|, AND
    - |F| < f_tol

    AND

    - |dx| < x_rtol*|x|, AND
    - |dx| < x_tol

    Nc                 C   sx   |d u rt  t j¡jd }|d u rt j}|d u rt j}|d u r"t j}|| _|| _|| _|| _|| _	|| _
d | _d| _d S )NgUUUUUUÕ?r   )r#   Úfinfor.   Úepsr:   rG   rH   rE   rF   r   rI   Úf0_normri   )ÚselfrE   rF   rG   rH   rI   r   r    r    r!   Ú__init__J  s    
zTerminationCondition.__init__c                 C   s˜   |  j d7  _ |  |¡}|  |¡}|  |¡}| jd u r|| _|dkr$dS | jd ur1d| j | jk S t|| jkoJ|| j | jkoJ|| jkoJ|| j |kƒS )Nr   r   rS   )	ri   r   r–   rI   ÚintrE   rF   rG   rH   )r—   Úfr'   rs   Úf_normÚx_normÚdx_normr    r    r!   ra   b  s    




ÿ
ýzTerminationCondition.check)r   r   r   r   r(   r˜   ra   r    r    r    r!   rY   =  s    
ÿrY   c                   @   s:   e Zd ZdZdd„ Zdd„ Zddd„Zd	d
„ Zdd„ ZdS )ÚJacobiana¦  
    Common interface for Jacobians or Jacobian approximations.

    The optional methods come useful when implementing trust region
    etc., algorithms that often require evaluating transposes of the
    Jacobian.

    Methods
    -------
    solve
        Returns J^-1 * v
    update
        Updates Jacobian to point `x` (where the function has residual `Fx`)

    matvec : optional
        Returns J * v
    rmatvec : optional
        Returns A^H * v
    rsolve : optional
        Returns A^-H * v
    matmat : optional
        Returns A * V, where V is a dense matrix with dimensions (N,K).
    todense : optional
        Form the dense Jacobian matrix. Necessary for dense trust region
        algorithms, and useful for testing.

    Attributes
    ----------
    shape
        Matrix dimensions (M, N)
    dtype
        Data type of the matrix.
    func : callable, optional
        Function the Jacobian corresponds to

    c                 K   sd   g d¢}|  ¡ D ]\}}||vrtd|› �ƒ‚|d ur#t| ||| ƒ qt| dƒr0ddd„}d S d S )N)	r   rd   ÚmatvecÚrmatvecÚrsolveÚmatmatÚtodenser2   r+   zUnknown keyword argument r£   c                 S   s   |d urt d|› �ƒ‚|  ¡ S )Nz`dtype` must be None, was )r_   r£   )r—   r+   r]   r    r    r!   Ú	__array__®  s   z$Jacobian.__init__.<locals>.__array__©NN)Úitemsr_   ÚsetattrÚhasattr)r—   ÚkwÚnamesÚnameÚvaluer¤   r    r    r!   r˜   £  s   €
ÿzJacobian.__init__c                 C   s   t | ƒS r"   )r   ©r—   r    r    r!   Úaspreconditioner³  s   zJacobian.aspreconditionerr   c                 C   ó   t ‚r"   ©ÚNotImplementedError©r—   r<   rQ   r    r    r!   r   ¶  ó   zJacobian.solvec                 C   ó   d S r"   r    ©r—   r'   rM   r    r    r!   rd   ¹  r³   zJacobian.updatec                 C   s>   || _ |j|jf| _|j| _| jjtju r|  ||¡ d S d S r"   )rN   r^   r2   r+   Ú	__class__r\   rž   rd   ©r—   r'   rM   rN   r    r    r!   r\   ¼  s   þzJacobian.setupN©r   )	r   r   r   r   r˜   r®   r   rd   r\   r    r    r    r!   rž   }  s    %
rž   c                   @   s0   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZdS )	r   aƒ  
    A simple wrapper that inverts the Jacobian using the `solve` method.

    .. legacy:: class

        See the newer, more consistent interfaces in :mod:`scipy.optimize`.

    Parameters
    ----------
    jacobian : Jacobian
        The Jacobian to invert.
    
    Attributes
    ----------
    shape
        Matrix dimensions (M, N)
    dtype
        Data type of the matrix.

    c                 C   sB   || _ |j| _|j| _t|dƒr|j| _t|dƒr|j| _d S d S )Nr\   r¡   )rj   r   rŸ   rd   r¨   r\   r¡   r    )r—   rj   r    r    r!   r˜   Ú  s   

ÿzInverseJacobian.__init__c                 C   ó   | j jS r"   )rj   r2   r­   r    r    r!   r2   ã  ó   zInverseJacobian.shapec                 C   r¹   r"   )rj   r+   r­   r    r    r!   r+   ç  rº   zInverseJacobian.dtypeN)r   r   r   r   r˜   Úpropertyr2   r+   r    r    r    r!   r   Å  s    	
r   c              
      sÌ  t jjj‰tˆ tƒrˆ S t ˆ ¡rtˆ tƒrˆ ƒ S tˆ t	j
ƒr\ˆ jdkr(tdƒ‚t	 t	 ˆ ¡¡‰ ˆ jd ˆ jd kr>tdƒ‚t‡ fdd„‡ fdd„d‡ fd	d„	d‡ fd
d„	ˆ jˆ jd�S t j ˆ ¡r�ˆ jd ˆ jd krptdƒ‚t‡ fdd„‡ fdd„d‡ ‡fdd„	d‡ ‡fdd„	ˆ jˆ jd�S tˆ dƒr½tˆ dƒr½tˆ dƒr½ttˆ dƒtˆ dƒˆ jtˆ dƒtˆ dƒtˆ dƒˆ jˆ jd�S tˆ ƒrÏG ‡ ‡fdd„dtƒ}|ƒ S tˆ tƒrâttttttttd�ˆ  ƒ S tdƒ‚) zE
    Convert given object to one suitable for use as a Jacobian.
    rS   zarray must have rank <= 2r   r   zarray must be squarec                    ó
   t ˆ | ƒS r"   )r   r;   ©ÚJr    r!   Ú<lambda>ü  ó   
 zasjacobian.<locals>.<lambda>c                    ó   t ˆ  ¡ j| ƒS r"   )r   ÚconjÚTr;   r½   r    r!   r¿   ý  ó    c                    r¼   r"   )r   ©r<   rQ   r½   r    r!   r¿   þ  rÀ   c                    rÁ   r"   )r   rÂ   rÃ   rÅ   r½   r    r!   r¿   ÿ  rÄ   )rŸ   r    r   r¡   r+   r2   zmatrix must be squarec                    s   ˆ |  S r"   r    r;   r½   r    r!   r¿     s    c                    s   ˆ   ¡ j|  S r"   ©rÂ   rÃ   r;   r½   r    r!   r¿     s    c                    s
   ˆˆ | ƒS r"   r    rÅ   ©r¾   Úspsolver    r!   r¿     rÀ   c                    s   ˆˆ   ¡ j| ƒS r"   rÆ   rÅ   rÇ   r    r!   r¿     rÄ   r2   r+   r   rŸ   r    r¡   rd   r\   )rŸ   r    r   r¡   rd   r\   r+   r2   c                       sL   e Zd Zdd„ Zd‡ ‡fdd„	Z‡ fdd„Zd‡ ‡fdd	„	Z‡ fd
d„ZdS )zasjacobian.<locals>.Jacc                 S   s
   || _ d S r"   r&   rµ   r    r    r!   rd     ó   
zasjacobian.<locals>.Jac.updater   c                    s>   ˆ | j ƒ}t|tjƒrt||ƒS tj |¡rˆ||ƒS tdƒ‚©NzUnknown matrix type)	r'   Ú
isinstancer#   Úndarrayr   ÚscipyÚsparseÚissparser_   ©r—   r<   rQ   ÚmrÇ   r    r!   r     s   


zasjacobian.<locals>.Jac.solvec                    s<   ˆ | j ƒ}t|tjƒrt||ƒS tj |¡r|| S tdƒ‚rÊ   )	r'   rË   r#   rÌ   r   rÍ   rÎ   rÏ   r_   ©r—   r<   rÑ   r½   r    r!   rŸ   !  s   

zasjacobian.<locals>.Jac.matvecc                    sJ   ˆ | j ƒ}t|tjƒrt| ¡ j|ƒS tj 	|¡r!ˆ| ¡ j|ƒS t
dƒ‚rÊ   )r'   rË   r#   rÌ   r   rÂ   rÃ   rÍ   rÎ   rÏ   r_   rÐ   rÇ   r    r!   r¡   *  s   
zasjacobian.<locals>.Jac.rsolvec                    sH   ˆ | j ƒ}t|tjƒrt| ¡ j|ƒS tj 	|¡r | ¡ j| S t
dƒ‚rÊ   )r'   rË   r#   rÌ   r   rÂ   rÃ   rÍ   rÎ   rÏ   r_   rÒ   r½   r    r!   r    3  s   
zasjacobian.<locals>.Jac.rmatvecNr¸   )r   r   r   rd   r   rŸ   r¡   r    r    rÇ   r    r!   ÚJac  s    			rÓ   )r   r   r   r   r   r   rC   z#Cannot convert object to a JacobianNr¸   ) rÍ   rÎ   ÚlinalgrÈ   rË   rž   ÚinspectÚisclassÚ
issubclassr#   rÌ   Úndimr_   Ú
atleast_2dr   r2   r+   rÏ   r¨   r3   r   ÚcallableÚstrÚdictr   ÚBroydenSecondÚAndersonÚDiagBroydenÚLinearMixingÚExcitingMixingr   Ú	TypeError)r¾   rÓ   r    rÇ   r!   r[   ì  sf   



ü
ü
ù'
úúr[   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚGenericBroydenc                 C   sj   t  | |||¡ || _|| _t| dƒr1| jd u r3t|ƒ}|r,dtt|ƒdƒ | | _d S d| _d S d S d S )NÚalphaç      à?r   rR   )rž   r\   Úlast_fÚlast_xr¨   rä   r   r%   )r—   r4   Úf0rN   Únormf0r    r    r!   r\   M  s   
ùzGenericBroyden.setupc                 C   r¯   r"   r°   ©r—   r'   rš   rs   Údfr�   Údf_normr    r    r!   Ú_update[  r³   zGenericBroyden._updatec              	   C   s@   || j  }|| j }|  ||||t|ƒt|ƒ¡ || _ || _d S r"   )ræ   rç   rí   r   )r—   r'   rš   rë   rs   r    r    r!   rd   ^  s
   


zGenericBroyden.updateN)r   r   r   r\   rí   rd   r    r    r    r!   rã   L  s    rã   c                   @   sˆ   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZdd	„ Zd
d„ Z	ddd„Z
ddd„Zdd„ Zddd„Zdd„ Zdd„ Zdd„ Zd dd„ZdS )!ÚLowRankMatrixzà
    A matrix represented as

    .. math:: \alpha I + \sum_{n=0}^{n=M} c_n d_n^\dagger

    However, if the rank of the matrix reaches the dimension of the vectors,
    full matrix representation will be used thereon.

    c                 C   s(   || _ g | _g | _|| _|| _d | _d S r"   )rä   ÚcsrŠ   rz   r+   Ú	collapsed)r—   rä   rz   r+   r    r    r!   r˜   q  s   
zLowRankMatrix.__init__c                 C   s\   t g d¢|d d… | g ƒ\}}}||  }t||ƒD ]\}}	||	| ƒ}
||||j|
ƒ}q|S )N)ÚaxpyÚscalÚdotcr   )r   Úzipr^   )r<   rä   rï   rŠ   rñ   rò   ró   ÚwÚcÚdÚar    r    r!   Ú_matvecy  s   
ÿ
zLowRankMatrix._matvecc                 C   s
  t |ƒdkr
| | S tddg|dd… | g ƒ\}}|d }|tjt |ƒ|jd� }t|ƒD ]\}}	t|ƒD ]\}
}|||
f  ||	|ƒ7  < q6q.tjt |ƒ|jd�}t|ƒD ]\}
}	||	| ƒ||
< qW|| }t||ƒ}| | }t||ƒD ]\}}||||j	| ƒ}qu|S )úEvaluate w = M^-1 vr   rñ   ró   Nr   r*   )
Úlenr   r#   Úidentityr+   Ú	enumerateÚzerosr   rô   r^   )r<   rä   rï   rŠ   rñ   ró   Úc0ÚAÚir÷   Újrö   Úqrõ   Úqcr    r    r!   Ú_solveƒ  s$    ÿ
zLowRankMatrix._solvec                 C   s.   | j durt | j |¡S t || j| j| j¡S )zEvaluate w = M vN)rð   r#   r   rî   rù   rä   rï   rŠ   ©r—   r<   r    r    r!   rŸ   Ÿ  s   
zLowRankMatrix.matvecc                 C   s:   | j durt | j j ¡ |¡S t |t | j¡| j| j	¡S )zEvaluate w = M^H vN)
rð   r#   r   rÃ   rÂ   rî   rù   rä   rŠ   rï   r  r    r    r!   r    ¥  s   
zLowRankMatrix.rmatvecr   c                 C   s,   | j durt| j |ƒS t || j| j| j¡S )rú   N)rð   r   rî   r  rä   rï   rŠ   r²   r    r    r!   r   «  s   
zLowRankMatrix.solvec                 C   s8   | j durt| j j ¡ |ƒS t |t | j¡| j| j	¡S )zEvaluate w = M^-H vN)
rð   r   rÃ   rÂ   rî   r  r#   rä   rŠ   rï   r²   r    r    r!   r¡   ±  s   
zLowRankMatrix.rsolvec                 C   st   | j d ur|  j |d d …d f |d d d …f  ¡  7  _ d S | j |¡ | j |¡ t| jƒ|jkr8|  ¡  d S d S r"   )rð   rÂ   rï   ÚappendrŠ   rû   r^   Úcollapse)r—   rö   r÷   r    r    r!   r  ·  s   
.ÿzLowRankMatrix.appendNc                 C   s¨   |d urt jd|› d�dd� |d urt jd|› d�dd� | jd ur&| jS | jtj| j| jd� }t| j	| j
ƒD ]\}}||d d …d f |d d d …f  ¡  7 }q9|S )NzJLowRankMatrix is scipy-internal code, `dtype` should only be None but was z (not handled)é   )Ú
stacklevelzILowRankMatrix is scipy-internal code, `copy` should only be None but was r*   )ÚwarningsÚwarnrð   rä   r#   rü   rz   r+   rô   rï   rŠ   rÂ   )r—   r+   r]   ÚGmrö   r÷   r    r    r!   r¤   Â  s$   ÿþÿþ
*zLowRankMatrix.__array__c                 C   s&   t j| td�| _d| _d| _d| _dS )z0Collapse the low-rank matrix to a full-rank one.)r]   N)r#   r9   r   rð   rï   rŠ   rä   r­   r    r    r!   r  Ó  s   
zLowRankMatrix.collapsec                 C   sH   | j durdS |dksJ ‚t| jƒ|kr"| jdd…= | jdd…= dS dS )zH
        Reduce the rank of the matrix by dropping all vectors.
        Nr   ©rð   rû   rï   rŠ   ©r—   Úrankr    r    r!   Úrestart_reduceÚ  s   
þzLowRankMatrix.restart_reducec                 C   sN   | j durdS |dksJ ‚t| jƒ|kr%| jd= | jd= t| jƒ|ksdS dS )zK
        Reduce the rank of the matrix by dropping oldest vectors.
        Nr   r  r  r    r    r!   Úsimple_reduceå  s   
þzLowRankMatrix.simple_reducec                 C   s6  | j durdS |}|dur|}n|d }| jr!t|t| jd ƒƒ}tdt||d ƒƒ}t| jƒ}||k r6dS t | j¡j}t | j¡j}t	|dd�\}}t
||j ¡ ƒ}t|dd�\}	}
}t
|t|ƒƒ}t
||j ¡ ƒ}t|ƒD ]}|dd…|f  ¡ | j|< |dd…|f  ¡ | j|< qp| j|d…= | j|d…= dS )	a  
        Reduce the rank of the matrix by retaining some SVD components.

        This corresponds to the "Broyden Rank Reduction Inverse"
        algorithm described in [1]_.

        Note that the SVD decomposition can be done by solving only a
        problem whose size is the effective rank of this matrix, which
        is viable even for large problems.

        Parameters
        ----------
        max_rank : int
            Maximum rank of this matrix after reduction.
        to_retain : int, optional
            Number of SVD components to retain when reduction is done
            (ie. rank > max_rank). Default is ``max_rank - 2``.

        References
        ----------
        .. [1] B.A. van der Rotten, PhD thesis,
           "A limited memory Broyden method to solve high-dimensional
           systems of nonlinear equations". Mathematisch Instituut,
           Universiteit Leiden, The Netherlands (2003).

           https://web.archive.org/web/20161022015821/http://www.math.leidenuniv.nl/scripties/Rotten.pdf

        NrS   r   r   Úeconomic)ÚmodeF)Úfull_matrices)rð   rï   rb   rû   r%   r#   r9   rÃ   rŠ   r   r   rÂ   r	   r   r`   r]   )r—   Úmax_rankÚ	to_retainr„   r  rÑ   ÚCÚDÚRÚUÚSÚWHÚkr    r    r!   Ú
svd_reduceð  s0   

zLowRankMatrix.svd_reducer¸   r¥   r"   )r   r   r   r   r˜   Ústaticmethodrù   r  rŸ   r    r   r¡   r  r¤   r  r  r  r  r    r    r    r!   rî   f  s"    

	



rî   aÔ  
    alpha : float, optional
        Initial guess for the Jacobian is ``(-1/alpha)``.
    reduction_method : str or tuple, optional
        Method used in ensuring that the rank of the Broyden matrix
        stays low. Can either be a string giving the name of the method,
        or a tuple of the form ``(method, param1, param2, ...)``
        that gives the name of the method and values for additional parameters.

        Methods available:

        - ``restart``: drop all matrix columns. Has no extra parameters.
        - ``simple``: drop oldest matrix column. Has no extra parameters.
        - ``svd``: keep only the most significant SVD components.
          Takes an extra parameter, ``to_retain``, which determines the
          number of SVD components to retain when rank reduction is done.
          Default is ``max_rank - 2``.

    max_rank : int, optional
        Maximum rank for the Broyden matrix.
        Default is infinity (i.e., no rank reduction).
    Úbroyden_paramsc                   @   sV   e Zd ZdZddd„Zdd„ Zdd	„ Zddd„Zdd„ Zddd„Z	dd„ Z
dd„ ZdS )r   al  
    Find a root of a function, using Broyden's first Jacobian approximation.

    This method is also known as "Broyden's good method".

    Parameters
    ----------
    %(params_basic)s
    %(broyden_params)s
    %(params_extra)s

    See Also
    --------
    root : Interface to root finding algorithms for multivariate
           functions. See ``method='broyden1'`` in particular.

    Notes
    -----
    This algorithm implements the inverse Jacobian Quasi-Newton update

    .. math:: H_+ = H + (dx - H df) dx^\dagger H / ( dx^\dagger H df)

    which corresponds to Broyden's first Jacobian update

    .. math:: J_+ = J + (df - J dx) dx^\dagger / dx^\dagger dx


    References
    ----------
    .. [1] B.A. van der Rotten, PhD thesis,
       "A limited memory Broyden method to solve high-dimensional
       systems of nonlinear equations". Mathematisch Instituut,
       Universiteit Leiden, The Netherlands (2003).
       https://math.leidenuniv.nl/scripties/Rotten.pdf

    Examples
    --------
    The following functions define a system of nonlinear equations

    >>> def fun(x):
    ...     return [x[0]  + 0.5 * (x[0] - x[1])**3 - 1.0,
    ...             0.5 * (x[1] - x[0])**3 + x[1]]

    A solution can be obtained as follows.

    >>> from scipy import optimize
    >>> sol = optimize.broyden1(fun, [0, 0])
    >>> sol
    array([0.84116396, 0.15883641])

    NÚrestartc                    sÀ   t  ˆ¡ |ˆ_d ˆ_|d u rtj}|ˆ_t|tƒrd‰ n
|dd … ‰ |d }|d fˆ  ‰ |dkr<‡ ‡fdd„ˆ_	d S |dkrJ‡ ‡fdd„ˆ_	d S |d	krX‡ ‡fd
d„ˆ_	d S t
d|› d�ƒ‚)Nr    r   r   r	   c                      ó   ˆj jˆ Ž S r"   )r  r  r    ©Úreduce_paramsr—   r    r!   r¿   �  ó    z'BroydenFirst.__init__.<locals>.<lambda>Úsimplec                      r#  r"   )r  r  r    r$  r    r!   r¿   ’  r&  r"  c                      r#  r"   )r  r  r    r$  r    r!   r¿   ”  r&  zUnknown rank reduction method 'ú')rã   r˜   rä   r  r#   r:   r  rË   rÛ   Ú_reducer_   )r—   rä   Úreduction_methodr  r    r$  r!   r˜     s$   

zBroydenFirst.__init__c                 C   s.   t  | |||¡ t| j | jd | jƒ| _d S )Nr   )rã   r\   rî   rä   r2   r+   r  r·   r    r    r!   r\   ˜  s   zBroydenFirst.setupc                 C   s
   t | jƒS r"   )r   r  r­   r    r    r!   r£   œ  rÉ   zBroydenFirst.todenser   c                 C   s>   | j  |¡}t |¡ ¡ s|  | j| j| j¡ | j  |¡S |S r"   )	r  rŸ   r#   r7   r8   r\   rç   ræ   rN   )r—   rš   rQ   Úrr    r    r!   r   Ÿ  s
   zBroydenFirst.solvec                 C   ó   | j  |¡S r"   )r  r   ©r—   rš   r    r    r!   rŸ   §  ó   zBroydenFirst.matvecc                 C   r,  r"   )r  r    ©r—   rš   rQ   r    r    r!   r¡   ª  r.  zBroydenFirst.rsolvec                 C   r,  r"   )r  r¡   r-  r    r    r!   r    ­  r.  zBroydenFirst.rmatvecc           
      C   sD   |   ¡  | j |¡}|| j |¡ }|t||ƒ }	| j ||	¡ d S r"   )r)  r  r    rŸ   r   r  ©
r—   r'   rš   rs   rë   r�   rì   r<   rö   r÷   r    r    r!   rí   °  s
   zBroydenFirst._update)Nr"  Nr¸   )r   r   r   r   r˜   r\   r£   r   rŸ   r¡   r    rí   r    r    r    r!   r   J  s    
4

r   c                   @   s   e Zd ZdZdd„ ZdS )rÝ   aK  
    Find a root of a function, using Broyden's second Jacobian approximation.

    This method is also known as "Broyden's bad method".

    Parameters
    ----------
    %(params_basic)s
    %(broyden_params)s
    %(params_extra)s

    See Also
    --------
    root : Interface to root finding algorithms for multivariate
           functions. See ``method='broyden2'`` in particular.

    Notes
    -----
    This algorithm implements the inverse Jacobian Quasi-Newton update

    .. math:: H_+ = H + (dx - H df) df^\dagger / ( df^\dagger df)

    corresponding to Broyden's second method.

    References
    ----------
    .. [1] B.A. van der Rotten, PhD thesis,
       "A limited memory Broyden method to solve high-dimensional
       systems of nonlinear equations". Mathematisch Instituut,
       Universiteit Leiden, The Netherlands (2003).

       https://web.archive.org/web/20161022015821/http://www.math.leidenuniv.nl/scripties/Rotten.pdf

    Examples
    --------
    The following functions define a system of nonlinear equations

    >>> def fun(x):
    ...     return [x[0]  + 0.5 * (x[0] - x[1])**3 - 1.0,
    ...             0.5 * (x[1] - x[0])**3 + x[1]]

    A solution can be obtained as follows.

    >>> from scipy import optimize
    >>> sol = optimize.broyden2(fun, [0, 0])
    >>> sol
    array([0.84116365, 0.15883529])

    c           
      C   s:   |   ¡  |}|| j |¡ }||d  }	| j ||	¡ d S ©NrS   )r)  r  rŸ   r  r0  r    r    r!   rí   í  s
   zBroydenSecond._updateN)r   r   r   r   rí   r    r    r    r!   rÝ   º  s    2rÝ   c                   @   s4   e Zd ZdZddd„Zddd	„Zd
d„ Zdd„ ZdS )rÞ   a  
    Find a root of a function, using (extended) Anderson mixing.

    The Jacobian is formed by for a 'best' solution in the space
    spanned by last `M` vectors. As a result, only a MxM matrix
    inversions and MxN multiplications are required. [Ey]_

    Parameters
    ----------
    %(params_basic)s
    alpha : float, optional
        Initial guess for the Jacobian is (-1/alpha).
    M : float, optional
        Number of previous vectors to retain. Defaults to 5.
    w0 : float, optional
        Regularization parameter for numerical stability.
        Compared to unity, good values of the order of 0.01.
    %(params_extra)s

    See Also
    --------
    root : Interface to root finding algorithms for multivariate
           functions. See ``method='anderson'`` in particular.

    References
    ----------
    .. [Ey] V. Eyert, J. Comp. Phys., 124, 271 (1996).

    Examples
    --------
    The following functions define a system of nonlinear equations

    >>> def fun(x):
    ...     return [x[0]  + 0.5 * (x[0] - x[1])**3 - 1.0,
    ...             0.5 * (x[1] - x[0])**3 + x[1]]

    A solution can be obtained as follows.

    >>> from scipy import optimize
    >>> sol = optimize.anderson(fun, [0, 0])
    >>> sol
    array([0.84116588, 0.15883789])

    Nr�   é   c                 C   s2   t  | ¡ || _|| _g | _g | _d | _|| _d S r"   )rã   r˜   rä   ÚMrs   rë   rv   Úw0)r—   rä   r4  r3  r    r    r!   r˜   A  s   

zAnderson.__init__r   c           	      C   sÌ   | j  | }t| jƒ}|dkr|S tj||jd�}t|ƒD ]}t| j| |ƒ||< qzt	| j
|ƒ}W n tyI   | jd d …= | jd d …= | Y S w t|ƒD ]}||| | j| | j | j|    7 }qN|S ©Nr   r*   )rä   rû   rs   r#   Úemptyr+   r`   r   rë   r   rø   r
   )	r—   rš   rQ   rs   rz   Údf_fr  rv   rÑ   r    r    r!   r   J  s"   
ü(zAnderson.solvec              	   C   s,  | | j  }t| jƒ}|dkr|S tj||jd�}t|ƒD ]}t| j| |ƒ||< qtj||f|jd�}t|ƒD ]<}t|ƒD ]5}t| j| | j| ƒ|||f< ||krs| j	dkrs|||f  t| j| | j| ƒ| j	d  | j  8  < q>q8t
||ƒ}	t|ƒD ]}
||	|
 | j|
 | j|
 | j    7 }q~|S )Nr   r*   rS   )rä   rû   rs   r#   r6  r+   r`   r   rë   r4  r   )r—   rš   rs   rz   r7  r  Úbr  r  rv   rÑ   r    r    r!   rŸ   a  s&   
6€ý
(zAnderson.matvecc                 C   sø   | j dkrd S | j |¡ | j |¡ t| jƒ| j kr/| j d¡ | j d¡ t| jƒ| j kst| jƒ}tj||f|jd�}t	|ƒD ])}	t	|	|ƒD ]!}
|	|
krU| j
d }nd}d| t| j|	 | j|
 ƒ ||	|
f< qIqB|t |d¡j ¡ 7 }|| _d S )Nr   r*   rS   r   )r3  rs   r  rë   rû   Úpopr#   rþ   r+   r`   r4  r   ÚtriurÃ   rÂ   rø   )r—   r'   rš   rs   rë   r�   rì   rz   rø   r  r  Úwdr    r    r!   rí   x  s&   
þ
(û
zAnderson._update)Nr�   r2  r¸   )r   r   r   r   r˜   r   rŸ   rí   r    r    r    r!   rÞ   ú  s    
F
	rÞ   c                   @   sV   e Zd ZdZddd„Zdd„ Zddd	„Zd
d„ Zddd„Zdd„ Z	dd„ Z
dd„ ZdS )rß   a,  
    Find a root of a function, using diagonal Broyden Jacobian approximation.

    The Jacobian approximation is derived from previous iterations, by
    retaining only the diagonal of Broyden matrices.

    .. warning::

       This algorithm may be useful for specific problems, but whether
       it will work may depend strongly on the problem.

    Parameters
    ----------
    %(params_basic)s
    alpha : float, optional
        Initial guess for the Jacobian is (-1/alpha).
    %(params_extra)s

    See Also
    --------
    root : Interface to root finding algorithms for multivariate
           functions. See ``method='diagbroyden'`` in particular.

    Examples
    --------
    The following functions define a system of nonlinear equations

    >>> def fun(x):
    ...     return [x[0]  + 0.5 * (x[0] - x[1])**3 - 1.0,
    ...             0.5 * (x[1] - x[0])**3 + x[1]]

    A solution can be obtained as follows.

    >>> from scipy import optimize
    >>> sol = optimize.diagbroyden(fun, [0, 0])
    >>> sol
    array([0.84116403, 0.15883384])

    Nc                 C   ó   t  | ¡ || _d S r"   ©rã   r˜   rä   ©r—   rä   r    r    r!   r˜   ¿  ó   

zDiagBroyden.__init__c                 C   s6   t  | |||¡ tj| jd fd| j | jd�| _d S )Nr   r   r*   )rã   r\   r#   Úfullr2   rä   r+   r÷   r·   r    r    r!   r\   Ã  s   &zDiagBroyden.setupr   c                 C   ó   | | j  S r"   ©r÷   r/  r    r    r!   r   Ç  r.  zDiagBroyden.solvec                 C   ó   | | j  S r"   rB  r-  r    r    r!   rŸ   Ê  r.  zDiagBroyden.matvecc                 C   ó   | | j  ¡  S r"   ©r÷   rÂ   r/  r    r    r!   r¡   Í  ó   zDiagBroyden.rsolvec                 C   ó   | | j  ¡  S r"   rE  r-  r    r    r!   r    Ð  rF  zDiagBroyden.rmatvecc                 C   s   t  | j ¡S r"   )r#   Údiagr÷   r­   r    r    r!   r£   Ó  r)   zDiagBroyden.todensec                 C   s(   |  j || j |  | |d  8  _ d S r1  rB  rê   r    r    r!   rí   Ö  s   (zDiagBroyden._updater"   r¸   ©r   r   r   r   r˜   r\   r   rŸ   r¡   r    r£   rí   r    r    r    r!   rß   –  s    
(

rß   c                   @   sN   e Zd ZdZddd„Zddd„Zdd	„ Zdd
d„Zdd„ Zdd„ Z	dd„ Z
dS )rà   a  
    Find a root of a function, using a scalar Jacobian approximation.

    .. warning::

       This algorithm may be useful for specific problems, but whether
       it will work may depend strongly on the problem.

    Parameters
    ----------
    %(params_basic)s
    alpha : float, optional
        The Jacobian approximation is (-1/alpha).
    %(params_extra)s

    See Also
    --------
    root : Interface to root finding algorithms for multivariate
           functions. See ``method='linearmixing'`` in particular.

    Nc                 C   r<  r"   r=  r>  r    r    r!   r˜   ñ  r?  zLinearMixing.__init__r   c                 C   rC  r"   ©rä   r/  r    r    r!   r   õ  r.  zLinearMixing.solvec                 C   rA  r"   rJ  r-  r    r    r!   rŸ   ø  r.  zLinearMixing.matvecc                 C   s   | t  | j¡ S r"   ©r#   rÂ   rä   r/  r    r    r!   r¡   û  ó   zLinearMixing.rsolvec                 C   s   | t  | j¡ S r"   rK  r-  r    r    r!   r    þ  rL  zLinearMixing.rmatvecc                 C   s   t  t  | jd d| j ¡¡S )Nr   éÿÿÿÿ)r#   rH  r@  r2   rä   r­   r    r    r!   r£     s   zLinearMixing.todensec                 C   r´   r"   r    rê   r    r    r!   rí     r³   zLinearMixing._updater"   r¸   )r   r   r   r   r˜   r   rŸ   r¡   r    r£   rí   r    r    r    r!   rà   Ú  s    


rà   c                   @   sV   e Zd ZdZddd„Zdd„ Zdd	d
„Zdd„ Zddd„Zdd„ Z	dd„ Z
dd„ ZdS )rá   aç  
    Find a root of a function, using a tuned diagonal Jacobian approximation.

    The Jacobian matrix is diagonal and is tuned on each iteration.

    .. warning::

       This algorithm may be useful for specific problems, but whether
       it will work may depend strongly on the problem.

    See Also
    --------
    root : Interface to root finding algorithms for multivariate
           functions. See ``method='excitingmixing'`` in particular.

    Parameters
    ----------
    %(params_basic)s
    alpha : float, optional
        Initial Jacobian approximation is (-1/alpha).
    alphamax : float, optional
        The entries of the diagonal Jacobian are kept in the range
        ``[alpha, alphamax]``.
    %(params_extra)s
    NrR   c                 C   s    t  | ¡ || _|| _d | _d S r"   )rã   r˜   rä   ÚalphamaxÚbeta)r—   rä   rN  r    r    r!   r˜   #  s   

zExcitingMixing.__init__c                 C   s2   t  | |||¡ tj| jd f| j| jd�| _d S r5  )rã   r\   r#   r@  r2   rä   r+   rO  r·   r    r    r!   r\   )  s   "zExcitingMixing.setupr   c                 C   rC  r"   ©rO  r/  r    r    r!   r   -  r.  zExcitingMixing.solvec                 C   rA  r"   rP  r-  r    r    r!   rŸ   0  r.  zExcitingMixing.matvecc                 C   rG  r"   ©rO  rÂ   r/  r    r    r!   r¡   3  rF  zExcitingMixing.rsolvec                 C   rD  r"   rQ  r-  r    r    r!   r    6  rF  zExcitingMixing.rmatvecc                 C   s   t  d| j ¡S )NrM  )r#   rH  rO  r­   r    r    r!   r£   9  rF  zExcitingMixing.todensec                 C   sL   || j  dk}| j|  | j7  < | j| j| < tj| jd| j| jd� d S )Nr   )Úout)ræ   rO  rä   r#   ÚcliprN  )r—   r'   rš   rs   rë   r�   rì   Úincrr    r    r!   rí   <  s   zExcitingMixing._update)NrR   r¸   rI  r    r    r    r!   rá     s    


rá   c                   @   sH   e Zd ZdZ		ddd„Zdd	„ Zd
d„ Zddd„Zdd„ Zdd„ Z	dS )r   a¤  
    Find a root of a function, using Krylov approximation for inverse Jacobian.

    This method is suitable for solving large-scale problems.

    Parameters
    ----------
    %(params_basic)s
    rdiff : float, optional
        Relative step size to use in numerical differentiation.
    method : str or callable, optional
        Krylov method to use to approximate the Jacobian.  Can be a string,
        or a function implementing the same interface as the iterative
        solvers in `scipy.sparse.linalg`. If a string, needs to be one of:
        ``'lgmres'``, ``'gmres'``, ``'bicgstab'``, ``'cgs'``, ``'minres'``,
        ``'tfqmr'``.

        The default is `scipy.sparse.linalg.lgmres`.
    inner_maxiter : int, optional
        Parameter to pass to the "inner" Krylov solver: maximum number of
        iterations. Iteration will stop after maxiter steps even if the
        specified tolerance has not been achieved.
    inner_M : LinearOperator or InverseJacobian
        Preconditioner for the inner Krylov iteration.
        Note that you can use also inverse Jacobians as (adaptive)
        preconditioners. For example,

        >>> from scipy.optimize import BroydenFirst, KrylovJacobian
        >>> from scipy.optimize import InverseJacobian
        >>> jac = BroydenFirst()
        >>> kjac = KrylovJacobian(inner_M=InverseJacobian(jac))

        If the preconditioner has a method named 'update', it will be called
        as ``update(x, f)`` after each nonlinear step, with ``x`` giving
        the current point, and ``f`` the current function value.
    outer_k : int, optional
        Size of the subspace kept across LGMRES nonlinear iterations.
        See `scipy.sparse.linalg.lgmres` for details.
    inner_kwargs : kwargs
        Keyword parameters for the "inner" Krylov solver
        (defined with `method`). Parameter names must start with
        the `inner_` prefix which will be stripped before passing on
        the inner method. See, e.g., `scipy.sparse.linalg.gmres` for details.
    %(params_extra)s

    See Also
    --------
    root : Interface to root finding algorithms for multivariate
           functions. See ``method='krylov'`` in particular.
    scipy.sparse.linalg.gmres
    scipy.sparse.linalg.lgmres

    Notes
    -----
    This function implements a Newton-Krylov solver. The basic idea is
    to compute the inverse of the Jacobian with an iterative Krylov
    method. These methods require only evaluating the Jacobian-vector
    products, which are conveniently approximated by a finite difference:

    .. math:: J v \approx (f(x + \omega*v/|v|) - f(x)) / \omega

    Due to the use of iterative matrix inverses, these methods can
    deal with large nonlinear problems.

    SciPy's `scipy.sparse.linalg` module offers a selection of Krylov
    solvers to choose from. The default here is `lgmres`, which is a
    variant of restarted GMRES iteration that reuses some of the
    information obtained in the previous Newton steps to invert
    Jacobians in subsequent steps.

    For a review on Newton-Krylov methods, see for example [1]_,
    and for the LGMRES sparse inverse method, see [2]_.

    References
    ----------
    .. [1] C. T. Kelley, Solving Nonlinear Equations with Newton's Method,
           SIAM, pp.57-83, 2003.
           :doi:`10.1137/1.9780898718898.ch3`
    .. [2] D.A. Knoll and D.E. Keyes, J. Comp. Phys. 193, 357 (2004).
           :doi:`10.1016/j.jcp.2003.08.010`
    .. [3] A.H. Baker and E.R. Jessup and T. Manteuffel,
           SIAM J. Matrix Anal. Appl. 26, 962 (2005).
           :doi:`10.1137/S0895479803422014`

    Examples
    --------
    The following functions define a system of nonlinear equations

    >>> def fun(x):
    ...     return [x[0] + 0.5 * x[1] - 1.0,
    ...             0.5 * (x[1] - x[0]) ** 2]

    A solution can be obtained as follows.

    >>> from scipy import optimize
    >>> sol = optimize.newton_krylov(fun, [0, 0])
    >>> sol
    array([0.66731771, 0.66536458])

    NÚlgmresé   é
   c           	      K   s`  || _ || _ttjjjtjjjtjjjtjjj	tjjj
tjjjd� ||¡| _t|| j d�| _| jtjjju rI|| jd< d| jd< | j dd¡ nG| jtjjjtjjjtjjj	fv rb| j dd¡ n.| jtjjju r�|| jd< d| jd< | j d	g ¡ | j d
d¡ | j dd¡ | j dd¡ | ¡ D ]\}}| d¡s¤td|› �ƒ‚|| j|dd … < q”d S )N)ÚbicgstabÚgmresrU  ÚcgsÚminresÚtfqmr)rl   r3  r"  r   rl   Úatolr   Úouter_kÚouter_vÚprepend_outer_vTÚstore_outer_AvFÚinner_zUnknown parameter é   )Úpreconditionerr‹   rÜ   rÍ   rÎ   rÔ   rX  rY  rU  rZ  r[  r\  ÚgetÚmethodÚ	method_kwÚ
setdefaultÚgcrotmkr¦   Ú
startswithr_   )	r—   r‹   rf  Úinner_maxiterÚinner_Mr^  r©   Úkeyr¬   r    r    r!   r˜   ­  sD   úù	

þ


ýzKrylovJacobian.__init__c                 C   s<   t | jƒ ¡ }t | jƒ ¡ }| jtd|ƒ td|ƒ | _d S )Nr   )r‰   r4   r%   rè   r‹   Úomega)r—   ÚmxÚmfr    r    r!   Ú_update_diff_stepÜ  s    z KrylovJacobian._update_diff_stepc                 C   sl   t |ƒ}|dkrd| S | j| }|  | j||  ¡| j | }t t |¡¡s4t t |¡¡r4tdƒ‚|S )Nr   z$Function returned non-finite results)	r   rn  rN   r4   rè   r#   r8   r7   r_   )r—   r<   ÚnvÚscr+  r    r    r!   rŸ   á  s   
 zKrylovJacobian.matvecr   c                 C   sN   d| j v r| j| j|fi | j ¤Ž\}}|S | j| j|fd|i| j ¤Ž\}}|S )NÚrtol)rg  rf  Úop)r—   ÚrhsrQ   Úsolr~   r    r    r!   r   ë  s
   
 ÿzKrylovJacobian.solvec                 C   sD   || _ || _|  ¡  | jd urt| jdƒr | j ||¡ d S d S d S )Nrd   )r4   rè   rq  rd  r¨   rd   )r—   r'   rš   r    r    r!   rd   ò  s   
þzKrylovJacobian.updatec                 C   s„   t  | |||¡ || _|| _tjj | ¡| _| j	d u r%t
 |j¡jd | _	|  ¡  | jd ur>t| jdƒr@| j |||¡ d S d S d S )Nrå   r\   )rž   r\   r4   rè   rÍ   rÎ   rÔ   Úaslinearoperatorru  r‹   r#   r”   r+   r•   rq  rd  r¨   )r—   r'   rš   rN   r    r    r!   r\   ü  s   

þzKrylovJacobian.setup)NrU  rV  NrW  r¸   )
r   r   r   r   r˜   rq  rŸ   r   rd   r\   r    r    r    r!   r   G  s    e
ÿ/


r   c                 C   sÚ   t |jƒ}|\}}}}}}}	tt|t|ƒ d… |ƒƒ}
d dd„ |
D ƒ¡}|r,d| }d dd„ |
D ƒ¡}|r<|d }|rEtd|› �ƒ‚d}|t| ||j|d� }i }| 	t
ƒ ¡ t||ƒ ||  }|j|_t|ƒ |S )	a  
    Construct a solver wrapper with given name and Jacobian approx.

    It inspects the keyword arguments of ``jac.__init__``, and allows to
    use the same arguments in the wrapper function, in addition to the
    keyword arguments of `nonlin_solve`

    Nz, c                 S   s   g | ]\}}|› d |›�‘qS ©ú=r    ©Ú.0r  r<   r    r    r!   Ú
<listcomp>  ó    z#_nonlin_wrapper.<locals>.<listcomp>c                 S   s   g | ]\}}|› d |› �‘qS ry  r    r{  r    r    r!   r}     r~  zUnexpected signature a™  
def %(name)s(F, xin, iter=None %(kw)s, verbose=False, maxiter=None,
             f_tol=None, f_rtol=None, x_tol=None, x_rtol=None,
             tol_norm=None, line_search='armijo', callback=None, **kw):
    jac = %(jac)s(%(kwkw)s **kw)
    return nonlin_solve(F, xin, jac, iter, verbose, maxiter,
                        f_tol, f_rtol, x_tol, x_rtol, tol_norm, line_search,
                        callback)
)r«   r©   ÚjacÚkwkw)Ú_getfullargspecr˜   Úlistrô   rû   Újoinr_   rÜ   r   rd   ÚglobalsÚexecr   rB   )r«   r  Ú	signatureÚargsÚvarargsÚvarkwÚdefaultsÚ
kwonlyargsÚ
kwdefaultsÚ_ÚkwargsÚkw_strÚkwkw_strÚwrapperÚnsrN   r    r    r!   Ú_nonlin_wrapper  s,   
	
ÿ
r“  r   r   r   r   r   r   r   )rC   NFNNNNNNrD   NFT)rD   r€   r�   )<rÕ   re   r  Únumpyr#   r   r   r   Úscipy.linalgr   r   r   r   r	   r
   Úscipy.sparse.linalgrÍ   Úscipy.sparser   Úscipy._lib._utilr   r   r�  Ú_linesearchr   r   Ú__all__Ú	Exceptionr   r(   r/   r6   r=   rÜ   Ústripr@   rB   r   rc   rY   rž   r   r[   rã   rî   r   rÝ   rÞ   rß   rà   rá   r   r“  r   r   r   r   r   r   r   r    r    r    r!   Ú<module>   s|    

(Ð4
ý 
ÿ-@H'` Mëp@ D.? K
,




