§
    fŠtjÀ  ã                   óˆ   — d Z ddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
  G d„ de¦  «        Z	 	 	 dd„Zdd„Zdd„Zd„ Zd„ ZdS )z,
Spectral Algorithm for Nonlinear Equations
é    N)ÚOptimizeResult)Ú_check_unknown_optionsé   )Ú_nonmonotone_line_search_cruzÚ_nonmonotone_line_search_chengc                   ó   — e Zd ZdS )Ú_NoConvergenceN)Ú__name__Ú
__module__Ú__qualname__© ó    úV/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/scipy/optimize/_spectral.pyr	   r	      s   € € € € € Ø€Dr   r	   r   ç:Œ0âŽyE>çYóøÂn¥éè  Fé
   ç»½×Ùß|Û=ç      ð?Úcruzc           	      ó@  ‡*‡+‡,— t          |¦  «         |dvrt          d|›d�¦  «        ‚dŠ,|
€ˆ*fd„}
|€ˆ+ˆ,fd„}ˆ,fd„}d	g}t          | |||||¦  «        \  }}}Š+}}d	}‰+Š*|} ||¦  «        }t          j        ‰+g|	¦  «        }d
}‰*}d}d}	  ||¦  «        }|rt          d|› d|d›d|d›�¦  «         |� |||¦  «         |||z  |z   k     rd}d}�nt          |¦  «        d|z  k    rd|z  t          j        |¦  «        z  }nt          |¦  «        |k     r|}| |z  } |
|||¦  «        } 	 |dk    rt          ||||| ¬¦  «        \  }!}"}#}$n#|dk    rt          |||‰+||| ¬¦  «        \  }!}"}#}$}}n# t          $ r Y naw xY w|"|z
  }%|$|z
  }&t          j        |%|%¦  «        t          j        |%|&¦  «        z  }|"}|$}|#Š+|dk    r|                     |#¦  «         |dz  }�ŒRt          |||¬¦  «        }'t          ||¦  «        }(t          |'|||(|d	         |d¬¦  «        })|)S )a›  
    Solve nonlinear equation with the DF-SANE method

    Options
    -------
    ftol : float, optional
        Relative norm tolerance.
    fatol : float, optional
        Absolute norm tolerance.
        Algorithm terminates when ``||func(x)|| < fatol + ftol ||func(x_0)||``.
    fnorm : callable, optional
        Norm to use in the convergence check. If None, 2-norm is used.
    maxfev : int, optional
        Maximum number of function evaluations.
    disp : bool, optional
        Whether to print convergence process to stdout.
    eta_strategy : callable, optional
        Choice of the ``eta_k`` parameter, which gives slack for growth
        of ``||F||**2``.  Called as ``eta_k = eta_strategy(k, x, F)`` with
        `k` the iteration number, `x` the current iterate and `F` the current
        residual. Should satisfy ``eta_k > 0`` and ``sum(eta, k=0..inf) < inf``.
        Default: ``||F||**2 / (1 + k)**2``.
    sigma_eps : float, optional
        The spectral coefficient is constrained to ``sigma_eps < sigma < 1/sigma_eps``.
        Default: 1e-10
    sigma_0 : float, optional
        Initial spectral coefficient.
        Default: 1.0
    M : int, optional
        Number of iterates to include in the nonmonotonic line search.
        Default: 10
    line_search : {'cruz', 'cheng'}
        Type of line search to employ. 'cruz' is the original one defined in
        [Martinez & Raydan. Math. Comp. 75, 1429 (2006)], 'cheng' is
        a modified search defined in [Cheng & Li. IMA J. Numer. Anal. 29, 814 (2009)].
        Default: 'cruz'

    References
    ----------
    .. [1] "Spectral residual method without gradient information for solving
           large-scale nonlinear systems of equations." W. La Cruz,
           J.M. Martinez, M. Raydan. Math. Comp. **75**, 1429 (2006).
    .. [2] W. La Cruz, Opt. Meth. Software, 29, 24 (2014).
    .. [3] W. Cheng, D.-H. Li. IMA J. Numer. Anal. **29**, 814 (2009).

    )Úchengr   zInvalid value z for 'line_search'é   Nc                 ó   •— ‰d| z   dz  z  S )Nr   r   r   )ÚkÚxÚFÚf_0s      €r   Úeta_strategyz#_root_df_sane.<locals>.eta_strategyJ   s   ø€ à˜!˜a™% !™Ñ#Ð#r   c                 ó   •— ‰d‰z  z  S )Nr   r   )r   Úf_kÚnexps    €€r   Úfnormz_root_df_sane.<locals>.fnormO   s   ø€ à˜˜T™‘?Ð"r   c                 óH   •— t           j                             | ¦  «        ‰z  S ©N)ÚnpÚlinalgÚnorm)r   r"   s    €r   Úfmeritz_root_df_sane.<locals>.fmeritS   s   ø€ ÝŒy�~Š~˜aÑ Ô  $Ñ&Ð&r   r   r   Fz&too many function evaluations requiredTziter z
: ||F|| = Úgz
, sigma = zsuccessful convergencer   r   )Úetar   )Úshapezdf-sane)r   ÚsuccessÚmessageÚfunÚnfevÚnitÚmethod)r   Ú
ValueErrorÚ
_wrap_funcÚcollectionsÚdequeÚprintÚabsr&   Úsignr   r   r	   ÚvdotÚappendÚ_wrap_resultr   )-ÚfuncÚx0ÚargsÚftolÚfatolÚmaxfevr#   ÚcallbackÚdispÚMr   Ú	sigma_epsÚsigma_0Úline_searchÚunknown_optionsr)   r0   ÚfÚx_kÚx_shapeÚF_kÚ
is_complexr   Úsigma_kÚF_0_normÚprev_fsÚQÚCÚ	convergedr.   ÚF_k_normÚdr+   ÚalphaÚxpÚfpÚFpÚs_kÚy_kr   r   Úresultr   r!   r"   s-                                             @@@r   Ú_root_df_saner^      sr  øøø€ õb ˜?Ñ+Ô+Ð+àÐ+Ð+Ð+ÝÐK¨+ÐKÐKÐKÑLÔLÐLà€DàÐð	$ð 	$ð 	$ð 	$ð 	$ð €}ð	#ð 	#ð 	#ð 	#ð 	#ð 	#ð'ð 'ð 'ð 'ð 'ð ˆ3€DÝ,6°t¸RÀØ7;¸VÀTñ-Kô -KÑ)€A€sˆG�S˜#˜zð 	
€AØ
€CØ€Gàˆu�S‰zŒz€Hõ Ô   qÑ)Ô)€Gð 	€AØ€Aà€IØ6€Gð2Ø�5˜‘:”:ˆàð 	JÝÐH˜!ÐHÐH xÐHÐHÐH¸WÐHÐHÐHÑIÔIÐIàÐØˆH�S˜#ÑÔÐà�d˜X‘o¨Ñ-Ò-Ð-à.ˆGØˆIÙõ ˆw‰<Œ<˜!˜I™+Ò%Ð%Ø˜	‘k¥B¤G¨GÑ$4Ô$4Ñ4ˆGˆGÝ�‰\Œ\˜IÒ%Ð%ØˆGð ˆH�s‰Nˆð ˆl˜1˜c 3Ñ'Ô'ˆð	Ø˜fÒ$Ð$Ý$AÀ!ÀSÈ!ÈWØFIð%Kñ %Kô %KÑ!��r˜2˜r˜rà Ò'Ð'Ý*HÈÈCÐQRÐTWØIJÈAÐSVð+Xñ +Xô +XÑ'��r˜2˜r 1 aøøåð 	ð 	ð 	ØˆEð	øøøð �3‰hˆØ�3‰hˆÝ”'˜#˜sÑ#Ô#¥b¤g¨c°3Ñ&7Ô&7Ñ7ˆð ˆØˆØˆð ˜&Ò Ð Ø�NŠN˜2ÑÔÐà	ˆQ‰ˆñe2õh 	�S˜*¨GÐ4Ñ4Ô4€AÝ�S˜*Ñ%Ô%€Aå˜a¨Ø$+Ø !¨¨Q¬°Q¸yðJñ Jô J€Fð €Ms   Ä/AE3 Å3
F Å?F c                 ó¬  ‡ ‡‡‡‡‡	— t          j        |¦  «        }|j        Š	t          j         ‰ |g‰¢R Ž ¦  «                             ¦   «         }t          j        |¦  «        pt          j        |¦  «        }|                     ¦   «         }d‰d<   |r)ˆˆˆ ˆˆˆ	fd„}t          |¦  «        }t          |¦  «        }n
ˆˆˆ ˆˆˆ	fd„}||‰	 ‰|¦  «        ||fS )a¬  
    Wrap a function and an initial value so that (i) complex values
    are wrapped to reals, and (ii) value for a merit function
    fmerit(x, f) is computed at the same time, (iii) iteration count
    is maintained and an exception is raised if it is exceeded.

    Parameters
    ----------
    func : callable
        Function to wrap
    x0 : ndarray
        Initial value
    fmerit : callable
        Merit function fmerit(f) for computing merit value from residual.
    nfev_list : list
        List to store number of evaluations in. Should be [0] in the beginning.
    maxfev : int
        Maximum number of evaluations before _NoConvergence is raised.
    args : tuple
        Extra arguments to func

    Returns
    -------
    wrap_func : callable
        Wrapped function, to be called as
        ``F, fp = wrap_func(x0)``
    x0_wrap : ndarray of float
        Wrapped initial value; raveled to 1-D and complex
        values mapped to reals.
    x0_shape : tuple
        Shape of the initial value array
    f : float
        Merit function at F
    F : ndarray of float
        Residual at x0_wrap
    is_complex : bool
        Whether complex values were mapped to reals

    r   r   c                 ó2  •— ‰	d         ‰k    rt          ¦   «         ‚‰	dxx         dz  cc<   t          | ¦  «                             ‰
¦  «        }t          j         ‰|g‰¢R Ž ¦  «                             ¦   «         }t          |¦  «        } ‰|¦  «        }||fS ©Nr   r   )r	   Ú_real2complexÚreshaper&   ÚasarrayÚravelÚ_complex2real)r   ÚzÚvr   rJ   r?   r)   r=   rB   Ú	nfev_listÚx0_shapes        €€€€€€r   Ú	wrap_funcz_wrap_func.<locals>.wrap_funcÙ   s›   ø€ Ø˜Œ|˜vÒ%Ð%Ý$Ñ&Ô&Ð&Ø�aˆLˆLŒL˜AÑˆLˆL‰LÝ˜aÑ Ô ×(Ò(¨Ñ2Ô2ˆAÝ”
˜4˜4 ˜> D˜>˜>˜>Ñ*Ô*×0Ò0Ñ2Ô2ˆAÝ˜aÑ Ô ˆAØ��q‘	”	ˆAØ�a�4ˆKr   c                 óú   •— ‰d         ‰k    rt          ¦   «         ‚‰dxx         dz  cc<   |                      ‰¦  «        } t          j         ‰| g‰¢R Ž ¦  «                             ¦   «         } ‰|¦  «        }||fS ra   )r	   rc   r&   rd   re   )	r   r   rJ   r?   r)   r=   rB   ri   rj   s	      €€€€€€r   rk   z_wrap_func.<locals>.wrap_funcæ   s„   ø€ Ø˜Œ|˜vÒ%Ð%Ý$Ñ&Ô&Ð&Ø�aˆLˆLŒL˜AÑˆLˆL‰LØ—	’	˜(Ñ#Ô#ˆAÝ”
˜4˜4 ˜> D˜>˜>˜>Ñ*Ô*×0Ò0Ñ2Ô2ˆAØ��q‘	”	ˆAØ�a�4ˆKr   )r&   rd   r,   re   Úiscomplexobjrf   )
r=   r>   r)   ri   rB   r?   r   rN   rk   rj   s
   ` ````   @r   r4   r4   ¨   s#  øøøøøø€ õP 
Œ�B‰Œ€BØŒx€HÝ
Œ
�4�4˜�?˜T�?�?�?Ñ#Ô#×)Ò)Ñ+Ô+€AÝ” Ñ$Ô$Ð:­¬¸Ñ(:Ô(:€JØ	�Š‰Œ€Bà€Iˆa�Làð ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	õ ˜2ÑÔˆÝ˜!ÑÔˆˆð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð �b˜( F F¨1¡I¤I¨q°*Ð<Ð<r   c                 ó\   — |rt          | ¦  «        }n| }|�|                     |¦  «        }|S )zA
    Convert from real to complex and reshape result arrays.
    )rb   rc   )r]   rN   r,   rg   s       r   r<   r<   ò   s<   € ð ð Ý˜&Ñ!Ô!ˆˆàˆØÐØ�IŠI�eÑÔˆØ€Hr   c                 ór   — t          j        | t          ¬¦  «                             t           j        ¦  «        S ©N)Údtype)r&   ÚascontiguousarrayÚfloatÚviewÚ
complex128)r   s    r   rb   rb   ÿ   s(   € ÝÔ ­Ð/Ñ/Ô/×4Ò4µR´]ÑCÔCÐCr   c                 ór   — t          j        | t          ¬¦  «                             t           j        ¦  «        S rp   )r&   rr   Úcomplexrt   Úfloat64)rg   s    r   rf   rf     s(   € ÝÔ ­Ð1Ñ1Ô1×6Ò6µr´zÑBÔBÐBr   )r   r   r   r   NNFr   Nr   r   r   )r   r%   )Ú__doc__r5   Únumpyr&   Úscipy.optimizer   Úscipy.optimize._optimizer   Ú_linesearchr   r   Ú	Exceptionr	   r^   r4   r<   rb   rf   r   r   r   ú<module>r      s  ððð ð Ð Ð Ð à Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø VÐ VÐ VÐ VÐ VÐ VÐ VÐ Vð	ð 	ð 	ð 	ð 	�Yñ 	ô 	ð 	ð FJØLPØ<BðVð Vð Vð VðrG=ð G=ð G=ð G=ðT
ð 
ð 
ð 
ðDð Dð DðCð Cð Cð Cð Cr   