U
    »mœd†¿  ã                   @   s"  d dl 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
mZmZ d dlZd dlZd dlmZ d dlZd dlmZ ddlmZmZ dd	d
dddddddg
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"dFd%d&„Z#e"e#ƒ dGd)d*„Z$G d+d,„ d,ƒZ%G d-d.„ d.ƒZ&G d/d„ dƒZ'd0d1„ Z(G d2d3„ d3e&ƒZ)G d4d5„ d5ƒZ*d6  ¡ e!d7< G d8d„ de)ƒZ+G d9d:„ d:e+ƒZ,G d;d<„ d<e)ƒZ-G d=d>„ d>e)ƒZ.G d?d@„ d@e)ƒZ/G dAdB„ dBe)ƒZ0G dCd„ de&ƒZ1dDdE„ Z2e2de+ƒZ3e2d	e,ƒZ4e2d
e-ƒZ5e2de/ƒZ6e2de.ƒZ7e2de0ƒZ8e2de1ƒZ9dS )Hé    N)ÚnormÚsolveÚinvÚqrÚsvdÚLinAlgError)ÚasarrayÚdotÚvdot)Úget_blas_funcs)Úgetfullargspec_no_selfé   )Úscalar_search_wolfe1Úscalar_search_armijoÚbroyden1Úbroyden2ÚandersonÚlinearmixingÚdiagbroydenÚexcitingmixingÚnewton_krylovÚBroydenFirstÚKrylovJacobianÚInverseJacobianc                   @   s   e Zd ZdS )ÚNoConvergenceN)Ú__name__Ú
__module__Ú__qualname__© r   r   úO/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scipy/optimize/_nonlin.pyr      s   r   c                 C   s   t  | ¡ ¡ S ©N)ÚnpÚabsoluteÚmax©Úxr   r   r   Úmaxnorm   s    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!   Z
issubdtyper(   ZinexactÚfloat_r$   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!   ZreshapeÚshapeÚgetattrr+   )r%   Úx0Úwrapr   r   r   Ú_array_like*   s    r0   c                 C   s"   t  | ¡ ¡ st  t j¡S t| ƒS r    )r!   ÚisfiniteÚallÚarrayÚinfr   ©Úvr   r   r   Ú
_safe_norm1   s    r7   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.

    )Zparams_basicZparams_extrac                 C   s   | j r| j t | _ d S r    )Ú__doc__Ú
_doc_parts)Úobjr   r   r   Ú_set_doco   s    r;   ÚkrylovFÚarmijoTc                     sh  |
dkrt n|
}
t||||	||
d�}tˆƒ‰‡ ‡fdd„}ˆ ¡ }t |tj¡}||ƒ}t|ƒ}t|ƒ}| 	| 
¡ ||¡ |dkr¢|dk	r”|d }nd|jd  }|dkr°d}n|d	kr¼d}|d
krÌtdƒ‚d}d}d}d}t|ƒD �]$}| |||¡}|�r �q&t||| ƒ}|j||d� }t|ƒdk�r8tdƒ‚|�rXt|||||ƒ\}}}}nd}|| }||ƒ}t|ƒ}| | 
¡ |¡ |�r”|||ƒ ||d  |d  }||d  |k �rÆt||ƒ}nt|t|||d  ƒƒ}|}|rätj d||
|ƒ|f ¡ tj ¡  qä|�r"tt|ˆƒƒ‚nd}|�rZ|j|||dkdddœ| dœ}t|ˆƒ|fS t|ˆƒS d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*   r0   Úflatten)Úz©ÚFr.   r   r   Ú<lambda>§   ó    znonlin_solve.<locals>.<lambda>r   éd   Tr=   F)Nr=   Ú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   rM   )ÚnitZfunÚstatusÚsuccessÚmessage)r&   ÚTerminationConditionr*   rC   r!   Z	full_liker4   r   Ú
asjacobianÚsetupÚcopyÚsizeÚ
ValueErrorÚrangeÚcheckÚminr   Ú_nonlin_line_searchÚupdater#   ÚsysÚstdoutÚwriteÚflushr   r0   Ú	iteration) rF   r.   ÚjacobianrB   ÚverboseÚmaxiterr>   r?   r@   rA   Ztol_normZline_searchÚcallbackZfull_outputZraise_exceptionÚ	conditionÚfuncr%   ÚdxÚFxÚFx_normÚgammaZeta_maxZeta_tresholdÚetaÚnrO   rK   ÚsZFx_norm_newZeta_AÚinfor   rE   r   Únonlin_solvet   s˜    -  þ

ÿ
  ÿþüü
rp   ç:Œ0âŽyE>ç{®Gáz„?c                    sè   dg‰|g‰t |ƒd g‰t ˆƒt ˆ ƒ ‰d‡ ‡‡‡‡‡fdd„	‰‡‡‡fdd„}|dkrxtˆ|ˆd d	|d
�\}}	}
n&|dkržtˆˆd ˆd  |d�\}}	|d krªd}ˆ|ˆ   ‰|ˆd krÌˆd }nˆˆƒ}t |ƒ}|ˆ||fS )Nr   rM   Tc                    sT   | ˆd krˆd S ˆ| ˆ   }ˆ|ƒ}t |ƒd }|rP| ˆd< |ˆd< |ˆd< |S )Nr   rM   )r7   )rn   ÚstoreZxtr6   Úp)rh   rg   Útmp_FxÚtmp_phiÚtmp_sr%   r   r   Úphi  s    z _nonlin_line_search.<locals>.phic                    s0   t | ƒˆ d ˆ }ˆ | | dd�ˆ | ƒ | S )Nr   F)rs   )Úabs)rn   Úds)rx   ÚrdiffÚs_normr   r   Úderphi  s    z#_nonlin_line_search.<locals>.derphirJ   rr   )ZxtolÚaminr=   )r~   rL   )T)r   r   r   )rg   r%   ri   rh   Zsearch_typer{   Zsminr}   rn   Zphi1Zphi0rj   r   )	rh   rg   rx   r{   r|   ru   rv   rw   r%   r   r[   	  s.     ÿÿ

r[   c                   @   s.   e Zd ZdZdddddefdd„Zdd„ ZdS )rR   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 krt  t j¡jd }|d kr(t j}|d kr6t j}|d krDt j}|| _|| _|| _|| _|| _	|| _
d | _d| _d S )NgUUUUUUÕ?r   )r!   Úfinfor)   Úepsr4   r@   rA   r>   r?   r   rB   Úf0_normra   )Úselfr>   r?   r@   rA   rB   r   r   r   r   Ú__init__C  s     zTerminationCondition.__init__c                 C   s˜   |  j d7  _ |  |¡}|  |¡}|  |¡}| jd kr<|| _|dkrHdS | jd k	rbd| j | jk S t|| jko”|| j | jko”|| jko”|| j |kƒS )Nr   r   rM   )	ra   r   r�   rB   Úintr>   r?   r@   rA   )r‚   Úfr%   rh   Zf_normZx_normÚdx_normr   r   r   rY   [  s     




ÿ
ýzTerminationCondition.check)r   r   r   r8   r&   rƒ   rY   r   r   r   r   rR   6  s    ÿ
rR   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              	      sp   ddddddddd	g	}|  ¡ D ]4\}}||kr:td
| ƒ‚|d k	rtˆ ||| ƒ qtˆ dƒrl‡ fdd„ˆ _d S )Nr   r\   ÚmatvecÚrmatvecÚrsolveZmatmatÚtodenser,   r(   zUnknown keyword argument %sc                      s   ˆ   ¡ S r    )r‹   r   ©r‚   r   r   rG   ¦  rH   z#Jacobian.__init__.<locals>.<lambda>)ÚitemsrW   ÚsetattrÚhasattrÚ	__array__)r‚   ÚkwÚnamesÚnameÚvaluer   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   s   t ‚d S r    ©ÚNotImplementedError©r‚   r6   rK   r   r   r   r   «  s    zJacobian.solvec                 C   s   d S r    r   ©r‚   r%   rF   r   r   r   r\   ®  s    zJacobian.updatec                 C   s:   || _ |j|jf| _|j| _| jjtjkr6|  ||¡ d S r    )rg   rV   r,   r(   Ú	__class__rT   r‡   r\   ©r‚   r%   rF   rg   r   r   r   rT   ±  s
    zJacobian.setupN)r   )	r   r   r   r8   rƒ   r•   r   r\   rT   r   r   r   r   r‡   v  s   %
r‡   c                   @   s,   e Zd Zdd„ Zedd„ ƒZedd„ ƒZdS )r   c                 C   s>   || _ |j| _|j| _t|dƒr(|j| _t|dƒr:|j| _d S )NrT   rŠ   )rb   r   rˆ   r\   r�   rT   rŠ   r‰   )r‚   rb   r   r   r   rƒ   »  s    

zInverseJacobian.__init__c                 C   s   | j jS r    )rb   r,   rŒ   r   r   r   r,   Ä  s    zInverseJacobian.shapec                 C   s   | j jS r    )rb   r(   rŒ   r   r   r   r(   È  s    zInverseJacobian.dtypeN)r   r   r   rƒ   Úpropertyr,   r(   r   r   r   r   r   º  s
   	
c              
      sÔ  t jjj‰tˆ tƒrˆ S t ˆ ¡r2tˆ tƒr2ˆ ƒ S tˆ t	j
ƒr´ˆ jdkrPtdƒ‚t	 t	 ˆ ¡¡‰ ˆ jd ˆ jd kr|tdƒ‚t‡ fdd„‡ fdd„‡ fd	d„‡ fd
d„ˆ jˆ jd�S t j ˆ ¡�rˆ jd ˆ jd krÞtdƒ‚t‡ fdd„‡ fdd„‡ ‡fdd„‡ ‡fdd„ˆ jˆ jd�S tˆ dƒ�rztˆ dƒ�rztˆ dƒ�rzt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ƒ‚dS )zE
    Convert given object to one suitable for use as a Jacobian.
    rM   zarray must have rank <= 2r   r   zarray must be squarec                    s
   t ˆ | ƒS r    )r	   r5   ©ÚJr   r   rG   Ý  rH   zasjacobian.<locals>.<lambda>c                    s   t ˆ  ¡ j| ƒS r    )r	   ÚconjÚTr5   r�   r   r   rG   Þ  rH   c                    s
   t ˆ | ƒS r    )r   r5   r�   r   r   rG   ß  rH   c                    s   t ˆ  ¡ j| ƒS r    )r   rŸ   r    r5   r�   r   r   rG   à  rH   )rˆ   r‰   r   rŠ   r(   r,   zmatrix must be squarec                    s   ˆ |  S r    r   r5   r�   r   r   rG   å  rH   c                    s   ˆ   ¡ j|  S r    ©rŸ   r    r5   r�   r   r   rG   æ  rH   c                    s
   ˆˆ | ƒS r    r   r5   ©rž   Úspsolver   r   rG   ç  rH   c                    s   ˆˆ   ¡ j| ƒS r    r¡   r5   r¢   r   r   rG   è  rH   r,   r(   r   rˆ   r‰   rŠ   r\   rT   )rˆ   r‰   r   rŠ   r\   rT   r(   r,   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   r\   ö  s    zasjacobian.<locals>.Jac.updater   c                    sB   ˆ | j ƒ}t|tjƒr t||ƒS tj |¡r6ˆ||ƒS tdƒ‚d S ©NzUnknown matrix type)	r%   Ú
isinstancer!   Úndarrayr   ÚscipyÚsparseÚ
isspmatrixrW   ©r‚   r6   rK   Úmr¢   r   r   r   ù  s    


zasjacobian.<locals>.Jac.solvec                    s@   ˆ | j ƒ}t|tjƒr t||ƒS tj |¡r4|| S tdƒ‚d S r¤   )	r%   r¥   r!   r¦   r	   r§   r¨   r©   rW   ©r‚   r6   r«   r�   r   r   rˆ     s    

zasjacobian.<locals>.Jac.matvecc                    sN   ˆ | j ƒ}t|tjƒr&t| ¡ j|ƒS tj 	|¡rBˆ| ¡ j|ƒS t
dƒ‚d S r¤   )r%   r¥   r!   r¦   r   rŸ   r    r§   r¨   r©   rW   rª   r¢   r   r   rŠ     s    
zasjacobian.<locals>.Jac.rsolvec                    sL   ˆ | j ƒ}t|tjƒr&t| ¡ j|ƒS tj 	|¡r@| ¡ j| S t
dƒ‚d S r¤   )r%   r¥   r!   r¦   r	   rŸ   r    r§   r¨   r©   rW   r¬   r�   r   r   r‰     s    
zasjacobian.<locals>.Jac.rmatvecN)r   )r   )r   r   r   r\   r   rˆ   rŠ   r‰   r   r¢   r   r   ÚJacõ  s
   			r­   )r   r   r   r   r   r   r<   z#Cannot convert object to a JacobianN) r§   r¨   Úlinalgr£   r¥   r‡   ÚinspectÚisclassÚ
issubclassr!   r¦   ÚndimrW   Z
atleast_2dr   r,   r(   r©   r�   r-   r   ÚcallableÚstrÚdictr   ÚBroydenSecondÚAndersonÚDiagBroydenÚLinearMixingÚExcitingMixingr   Ú	TypeError)rž   r­   r   r¢   r   rS   Í  sj    





 ü
 ü$
ù
'úúrS   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚGenericBroydenc                 C   s`   t  | |||¡ || _|| _t| dƒr\| jd kr\t|ƒ}|rVdtt|ƒdƒ | | _nd| _d S )NÚalphaç      à?r   rL   )r‡   rT   Úlast_fÚlast_xr�   r½   r   r#   )r‚   r.   Úf0rg   Znormf0r   r   r   rT   .  s    zGenericBroyden.setupc                 C   s   t ‚d S r    r–   ©r‚   r%   r…   rh   Údfr†   Údf_normr   r   r   Ú_update<  s    zGenericBroyden._updatec              	   C   s@   || j  }|| j }|  ||||t|ƒt|ƒ¡ || _ || _d S r    )r¿   rÀ   rÅ   r   )r‚   r%   r…   rÃ   rh   r   r   r   r\   ?  s
    

zGenericBroyden.updateN)r   r   r   rT   rÅ   r\   r   r   r   r   r¼   -  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„ 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½   Úcsrz   rm   r(   Ú	collapsed)r‚   r½   rm   r(   r   r   r   rƒ   R  s    zLowRankMatrix.__init__c                 C   s^   t dddg|d d… | g ƒ\}}}||  }t||ƒD ]"\}}	||	| ƒ}
||||j|
ƒ}q6|S )NÚaxpyÚscalÚdotcr   )r   ÚziprV   )r6   r½   rÇ   rz   rÉ   rÊ   rË   ÚwÚcÚdÚar   r   r   Ú_matvecZ  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 ]4\}}	t|ƒD ]"\}
}|||
f  ||	|ƒ7  < qlq\tjt |ƒ|jd�}t|ƒD ]\}
}	||	| ƒ||
< q®|| }t||ƒ}| | }t||ƒD ]\}}||||j	| ƒ}qê|S )úEvaluate w = M^-1 vr   rÉ   rË   Nr   r'   )
Úlenr   r!   Úidentityr(   Ú	enumerateÚzerosr   rÌ   rV   )r6   r½   rÇ   rz   rÉ   rË   Zc0ÚAÚirÏ   ÚjrÎ   ÚqrÍ   Zqcr   r   r   Ú_solved  s"     
zLowRankMatrix._solvec                 C   s.   | j dk	rt | j |¡S t || j| j| j¡S )zEvaluate w = M vN)rÈ   r!   r	   rÆ   rÑ   r½   rÇ   rz   ©r‚   r6   r   r   r   rˆ   €  s    
zLowRankMatrix.matvecc                 C   s:   | j dk	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½   rz   rÇ   rÜ   r   r   r   r‰   †  s    
zLowRankMatrix.rmatvecr   c                 C   s,   | j dk	rt| j |ƒS t || j| j| j¡S )rÒ   N)rÈ   r   rÆ   rÛ   r½   rÇ   rz   r˜   r   r   r   r   Œ  s    
zLowRankMatrix.solvec                 C   s8   | j dk	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½   rz   rÇ   r˜   r   r   r   rŠ   ’  s    
zLowRankMatrix.rsolvec                 C   sp   | j d k	r<|  j |d d …d f |d d d …f  ¡  7  _ d S | j |¡ | j |¡ t| jƒ|jkrl|  ¡  d S r    )rÈ   rŸ   rÇ   Úappendrz   rÓ   rV   Úcollapse)r‚   rÎ   rÏ   r   r   r   rÝ   ˜  s    
.zLowRankMatrix.appendc                 C   sl   | j d k	r| j S | jtj| j| jd� }t| j| jƒD ]0\}}||d d …d f |d d d …f  	¡  7 }q6|S )Nr'   )
rÈ   r½   r!   rÔ   rm   r(   rÌ   rÇ   rz   rŸ   )r‚   ÚGmrÎ   rÏ   r   r   r   r�   £  s    
*zLowRankMatrix.__array__c                 C   s"   t  | ¡| _d| _d| _d| _dS )z0Collapse the low-rank matrix to a full-rank one.N)r!   r3   rÈ   rÇ   rz   r½   rŒ   r   r   r   rÞ   ¬  s    zLowRankMatrix.collapsec                 C   sD   | j dk	rdS |dkst‚t| jƒ|kr@| jdd…= | jdd…= dS )zH
        Reduce the rank of the matrix by dropping all vectors.
        Nr   ©rÈ   ÚAssertionErrorrÓ   rÇ   rz   ©r‚   Zrankr   r   r   Úrestart_reduce³  s    
zLowRankMatrix.restart_reducec                 C   s>   | j dk	rdS |dkst‚t| jƒ|kr:| jd= | jd= q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_reduceNc                 C   s6  | j dk	rdS |}|dk	r |}n|d }| jrBt|t| jd ƒƒ}tdt||d ƒƒ}t| jƒ}||k rldS t | j¡j}t | j¡j}t	|dd�\}}t
||j ¡ ƒ}t|dd�\}	}
}t
|t|ƒƒ}t
||j ¡ ƒ}t|ƒD ]8}|dd…|f  ¡ | j|< |dd…|f  ¡ | j|< qà| 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

        NrM   r   r   Zeconomic)ÚmodeF)Zfull_matrices)rÈ   rÇ   rZ   rÓ   r#   r!   r3   r    rz   r   r	   rŸ   r   r   rX   rU   )r‚   Úmax_rankZ	to_retainrt   rÚ   r«   ÚCÚDÚRÚUÚSZWHÚkr   r   r   Ú
svd_reduceÉ  s0    

zLowRankMatrix.svd_reduce)r   )r   )N)r   r   r   r8   rƒ   ÚstaticmethodrÑ   rÛ   rˆ   r‰   r   rŠ   rÝ   r�   rÞ   rã   rä   rí   r   r   r   r   rÆ   G  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).
    Z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   aŸ  
    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://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.broyden1(fun, [0, 0])
    >>> sol
    array([0.84116396, 0.15883641])

    NÚrestartc                    sº   t  ˆ¡ |ˆ_d ˆ_|d kr$tj}|ˆ_t|tƒr:d‰ n|dd … ‰ |d }|d fˆ  ‰ |dkrv‡ ‡fdd„ˆ_	n@|dkr�‡ ‡fdd„ˆ_	n&|d	krª‡ ‡fd
d„ˆ_	nt
d| ƒ‚d S )Nr   r   r   r   c                      s   ˆj jˆ Ž S r    )rß   rí   r   ©Zreduce_paramsr‚   r   r   rG   j  rH   z'BroydenFirst.__init__.<locals>.<lambda>Úsimplec                      s   ˆj jˆ Ž S r    )rß   rä   r   rð   r   r   rG   l  rH   rï   c                      s   ˆj jˆ Ž S r    )rß   rã   r   rð   r   r   rG   n  rH   z"Unknown rank reduction method '%s')r¼   rƒ   r½   rß   r!   r4   ræ   r¥   r´   Ú_reducerW   )r‚   r½   Zreduction_methodræ   r   rð   r   rƒ   Y  s(    

ÿzBroydenFirst.__init__c                 C   s.   t  | |||¡ t| j | jd | jƒ| _d S )Nr   )r¼   rT   rÆ   r½   r,   r(   rß   r›   r   r   r   rT   s  s    zBroydenFirst.setupc                 C   s
   t | jƒS r    )r   rß   rŒ   r   r   r   r‹   w  s    zBroydenFirst.todenser   c                 C   s>   | j  |¡}t |¡ ¡ s:|  | j| j| j¡ | j  |¡S |S r    )	rß   rˆ   r!   r1   r2   rT   rÀ   r¿   rg   )r‚   r…   rK   Úrr   r   r   r   z  s
    zBroydenFirst.solvec                 C   s   | j  |¡S r    )rß   r   ©r‚   r…   r   r   r   rˆ   ‚  s    zBroydenFirst.matvecc                 C   s   | j  |¡S r    )rß   r‰   ©r‚   r…   rK   r   r   r   rŠ   …  s    zBroydenFirst.rsolvec                 C   s   | j  |¡S r    )rß   rŠ   rô   r   r   r   r‰   ˆ  s    zBroydenFirst.rmatvecc           
      C   sD   |   ¡  | j |¡}|| j |¡ }|t||ƒ }	| j ||	¡ d S r    )rò   rß   r‰   rˆ   r
   rÝ   ©
r‚   r%   r…   rh   rÃ   r†   rÄ   r6   rÎ   rÏ   r   r   r   rÅ   ‹  s
    zBroydenFirst._update)Nrï   N)r   )r   )r   r   r   r8   rƒ   rT   r‹   r   rˆ   rŠ   r‰   rÅ   r   r   r   r   r   #  s   5


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 ©NrM   )rò   rß   rˆ   rÝ   rö   r   r   r   rÅ   È  s
    zBroydenSecond._updateN)r   r   r   r8   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])

    Nrr   é   c                 C   s2   t  | ¡ || _|| _g | _g | _d | _|| _d S r    )r¼   rƒ   r½   ÚMrh   rÃ   rk   Úw0)r‚   r½   rú   rù   r   r   r   rƒ     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 n0 tk
r”   | jd d …= | jd d …= | Y S X t|ƒD ]*}||| | j| | j | j|    7 }qž|S ©Nr   r'   )r½   rÓ   rh   r!   Úemptyr(   rX   r
   rÃ   r   rÐ   r   )	r‚   r…   rK   rh   rm   Údf_frì   rk   r«   r   r   r   r   %  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 ]x}t|ƒD ]j}t| j| | j| ƒ|||f< ||kr|| j	dkr||||f  t| j| | j| ƒ| j	d  | j  8  < q|qpt
||ƒ}	t|ƒD ]*}
||	|
 | j|
 | j|
 | j    7 }qü|S )Nr   r'   rM   )r½   rÓ   rh   r!   rü   r(   rX   r
   rÃ   rú   r   )r‚   r…   rh   rm   rý   rì   ÚbrØ   rÙ   rk   r«   r   r   r   rˆ   <  s"    
:
(zAnderson.matvecc                 C   sê   | j dkrd S | j |¡ | j |¡ t| jƒ| j krP| j d¡ | j d¡ q&t| jƒ}tj||f|jd�}t	|ƒD ]R}	t	|	|ƒD ]B}
|	|
krœ| j
d }nd}d| t| j|	 | j|
 ƒ ||	|
f< q„qv|t |d¡j ¡ 7 }|| _d S )Nr   r'   rM   r   )rù   rh   rÝ   rÃ   rÓ   Úpopr!   rÖ   r(   rX   rú   r
   Ztriur    rŸ   rÐ   )r‚   r%   r…   rh   rÃ   r†   rÄ   rm   rÐ   rØ   rÙ   Úwdr   r   r   rÅ   S  s"    

*zAnderson._update)Nrr   rø   )r   )r   r   r   r8   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   s   t  | ¡ || _d S r    ©r¼   rƒ   r½   ©r‚   r½   r   r   r   rƒ   š  s    
zDiagBroyden.__init__c                 C   s6   t  | |||¡ tj| jd fd| j | jd�| _d S )Nr   r   r'   )r¼   rT   r!   Úfullr,   r½   r(   rÏ   r›   r   r   r   rT   ž  s    zDiagBroyden.setupr   c                 C   s   | | j  S r    ©rÏ   rõ   r   r   r   r   ¢  s    zDiagBroyden.solvec                 C   s   | | j  S r    r  rô   r   r   r   rˆ   ¥  s    zDiagBroyden.matvecc                 C   s   | | j  ¡  S r    ©rÏ   rŸ   rõ   r   r   r   rŠ   ¨  s    zDiagBroyden.rsolvec                 C   s   | | j  ¡  S r    r  rô   r   r   r   r‰   «  s    zDiagBroyden.rmatvecc                 C   s   t  | j ¡S r    )r!   ÚdiagrÏ   rŒ   r   r   r   r‹   ®  s    zDiagBroyden.todensec                 C   s(   |  j || j |  | |d  8  _ d S r÷   r  rÂ   r   r   r   rÅ   ±  s    zDiagBroyden._update)N)r   )r   ©r   r   r   r8   rƒ   rT   r   rˆ   rŠ   r‰   r‹   rÅ   r   r   r   r   r¸   q  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   s   t  | ¡ || _d S r    r  r  r   r   r   rƒ   Ì  s    
zLinearMixing.__init__r   c                 C   s   | | j  S r    ©r½   rõ   r   r   r   r   Ð  s    zLinearMixing.solvec                 C   s   | | j  S r    r  rô   r   r   r   rˆ   Ó  s    zLinearMixing.matvecc                 C   s   | t  | j¡ S r    ©r!   rŸ   r½   rõ   r   r   r   rŠ   Ö  s    zLinearMixing.rsolvec                 C   s   | t  | j¡ S r    r	  rô   r   r   r   r‰   Ù  s    zLinearMixing.rmatvecc                 C   s   t  t  | jd d| j ¡¡S )Nr   éÿÿÿÿ)r!   r  r  r,   r½   rŒ   r   r   r   r‹   Ü  s    zLinearMixing.todensec                 C   s   d S r    r   rÂ   r   r   r   rÅ   ß  s    zLinearMixing._update)N)r   )r   )r   r   r   r8   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
    NrL   c                 C   s    t  | ¡ || _|| _d | _d S r    )r¼   rƒ   r½   ÚalphamaxÚbeta)r‚   r½   r  r   r   r   rƒ   þ  s    
zExcitingMixing.__init__c                 C   s2   t  | |||¡ tj| jd f| j| jd�| _d S rû   )r¼   rT   r!   r  r,   r½   r(   r  r›   r   r   r   rT     s    zExcitingMixing.setupr   c                 C   s   | | j  S r    ©r  rõ   r   r   r   r     s    zExcitingMixing.solvec                 C   s   | | j  S r    r  rô   r   r   r   rˆ     s    zExcitingMixing.matvecc                 C   s   | | j  ¡  S r    ©r  rŸ   rõ   r   r   r   rŠ     s    zExcitingMixing.rsolvec                 C   s   | | j  ¡  S r    r  rô   r   r   r   r‰     s    zExcitingMixing.rmatvecc                 C   s   t  d| j ¡S )Nr
  )r!   r  r  rŒ   r   r   r   r‹     s    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¿   r  r½   r!   Zclipr  )r‚   r%   r…   rh   rÃ   r†   rÄ   Úincrr   r   r   rÅ     s    zExcitingMixing._update)NrL   )r   )r   r  r   r   r   r   rº   ã  s   


rº   c                   @   sD   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   sd  || _ || _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kr’|| jd< d| jd< | j dd¡ n�| jtjjjtjjjtjjj	fkrÄ| j dd¡ n^| jtjjjk�r"|| jd< d| jd< | j d	g ¡ | j d
d¡ | j dd¡ | j dd¡ | ¡ D ]4\}}| d¡�sJtd| ƒ‚|| j|dd … < �q*d S )N)ÚbicgstabÚgmresr  ÚcgsÚminresÚtfqmr)rd   rù   rï   r   rd   Zatolr   Úouter_kZouter_vZprepend_outer_vTZstore_outer_AvFZinner_zUnknown parameter %sé   )Úpreconditionerr{   rµ   r§   r¨   r®   r  r  r  r  r  r  ÚgetÚmethodÚ	method_kwÚ
setdefaultZgcrotmkr�   Ú
startswithrW   )	r‚   r{   r  Zinner_maxiterZ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   )ry   r.   r#   rÁ   r{   Úomega)r‚   Z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 |¡¡sht t |¡¡rhtdƒ‚|S )Nr   z$Function returned non-finite results)	r   r"  rg   r.   rÁ   r!   r2   r1   rW   )r‚   r6   ÚnvÚscró   r   r   r   rˆ   ¼  s    
 zKrylovJacobian.matvecr   c                 C   sH   d| j kr$| j| j|f| j Ž\}}n | j| j|fd|i| j —Ž\}}|S )NrK   )r  r  Úop)r‚   ÚrhsrK   Zsolro   r   r   r   r   Æ  s    
 zKrylovJacobian.solvec                 C   s<   || _ || _|  ¡  | jd k	r8t| jdƒr8| j ||¡ d S )Nr\   )r.   rÁ   r$  r  r�   r\   )r‚   r%   r…   r   r   r   r\   Í  s    
zKrylovJacobian.updatec                 C   s|   t  | |||¡ || _|| _tjj | ¡| _| j	d krJt
 |j¡jd | _	|  ¡  | jd k	rxt| jdƒrx| j |||¡ d S )Nr¾   rT   )r‡   rT   r.   rÁ   r§   r¨   r®   Zaslinearoperatorr'  r{   r!   r   r(   r€   r$  r  r�   )r‚   r%   r…   rg   r   r   r   rT   ×  s    

zKrylovJacobian.setup)Nr  r  Nr  )r   )
r   r   r   r8   rƒ   r$  rˆ   r   r\   rT   r   r   r   r   r   "  s   e    ÿ
/


c                 C   sØ   t |jƒ}|\}}}}}}}	tt|t|ƒ d… |ƒƒ}
d dd„ |
D ƒ¡}|rXd| }d dd„ |
D ƒ¡}|rx|d }|rˆt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 ||f ‘qS )z%s=%rr   ©Ú.0rì   r6   r   r   r   Ú
<listcomp>ø  s     z#_nonlin_wrapper.<locals>.<listcomp>c                 S   s   g | ]\}}d ||f ‘qS )z%s=%sr   r)  r   r   r   r+  û  s     zUnexpected signature %sa™  
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‘   ÚjacZkwkw)Ú_getfullargspecrƒ   ÚlistrÌ   rÓ   ÚjoinrW   rµ   r   r\   ÚglobalsÚexecr8   r;   )r“   r,  Ú	signatureÚargsÚvarargsÚvarkwÚdefaultsÚ
kwonlyargsÚ
kwdefaultsÚ_ÚkwargsZkw_strZkwkw_strÚwrapperÚnsrg   r   r   r   Ú_nonlin_wrapperì  s,    	

ÿ
r=  )r<   NFNNNNNNr=   NFT)r=   rq   rr   ):r]   Únumpyr!   Zscipy.linalgr   r   r   r   r   r   r   r	   r
   Zscipy.sparse.linalgr§   Zscipy.sparser   r¯   Zscipy._lib._utilr   r-  Z_linesearchr   r   Ú__all__Ú	Exceptionr   r&   r*   r0   r7   rµ   Ústripr9   r;   rp   r[   rR   r‡   r   rS   r¼   rÆ   r   r¶   r·   r¸   r¹   rº   r   r=  r   r   r   r   r   r   r   r   r   r   r   Ú<module>   s�           ý

ø4                  ý
   ÿ
-@D` Er@ D.? K,





