o
    Ö­jzJ  ã                   @   s  d Z ddgZddlZddlmZ ddlmZmZmZm	Z	m
Z
mZmZmZmZmZ ddlmZmZmZmZmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZ dZ eee!ƒj"ƒZ#dd„ Z$dddddddddddddde#dfdd„Z%dddddddde#ddfdd„Z&dd„ Z'dd„ Z(dS )a  
This module implements the Sequential Least Squares Programming optimization
algorithm (SLSQP), originally developed by Dieter Kraft.
See http://www.netlib.org/toms/733

Functions
---------
.. autosummary::
   :toctree: generated/

    approx_jacobian
    fmin_slsqp

Úapprox_jacobianÚ
fmin_slsqpé    N)Úslsqp)
ÚzerosÚarrayÚlinalgÚappendÚconcatenateÚfinfoÚsqrtÚvstackÚisfiniteÚ
atleast_1dé   )ÚOptimizeResultÚ_check_unknown_optionsÚ_prepare_scalar_functionÚ_clip_x_for_funcÚ_check_clip_x)Úapprox_derivative)Úold_bound_to_newÚ_arr_to_scalar)Úarray_namespace)Úarray_api_extrazrestructuredtext enc                 G   s   t || d||d�}t |¡S )a“  
    Approximate the Jacobian matrix of a callable function.

    Parameters
    ----------
    x : array_like
        The state vector at which to compute the Jacobian matrix.
    func : callable f(x,*args)
        The vector-valued function.
    epsilon : float
        The perturbation used to determine the partial derivatives.
    args : sequence
        Additional arguments passed to func.

    Returns
    -------
    An array of dimensions ``(lenf, lenx)`` where ``lenf`` is the length
    of the outputs of `func`, and ``lenx`` is the number of elements in
    `x`.

    Notes
    -----
    The approximation is done using forward differences.

    ú2-point)ÚmethodÚabs_stepÚargs)r   ÚnpÚ
atleast_2d)ÚxÚfuncÚepsilonr   Újac© r$   úU/var/www/html/CropPilot/venv/lib/python3.10/site-packages/scipy/optimize/_slsqp_py.pyr   $   s   
ÿ
r$   éd   g�íµ ÷Æ°>c                    sÔ   |dur|}||||dk||dœ}d}|t ‡ fdd„|D ƒƒ7 }|t ‡ fdd„|D ƒƒ7 }|r9|d||ˆ d	œf7 }|rE|d
||	ˆ d	œf7 }t| |ˆ f|||dœ|¤Ž}|rf|d |d |d |d |d fS |d S )aC  
    Minimize a function using Sequential Least Squares Programming

    Python interface function for the SLSQP Optimization subroutine
    originally implemented by Dieter Kraft.

    Parameters
    ----------
    func : callable f(x,*args)
        Objective function.  Must return a scalar.
    x0 : 1-D ndarray of float
        Initial guess for the independent variable(s).
    eqcons : list, optional
        A list of functions of length n such that
        eqcons[j](x,*args) == 0.0 in a successfully optimized
        problem.
    f_eqcons : callable f(x,*args), optional
        Returns a 1-D array in which each element must equal 0.0 in a
        successfully optimized problem. If f_eqcons is specified,
        eqcons is ignored.
    ieqcons : list, optional
        A list of functions of length n such that
        ieqcons[j](x,*args) >= 0.0 in a successfully optimized
        problem.
    f_ieqcons : callable f(x,*args), optional
        Returns a 1-D ndarray in which each element must be greater or
        equal to 0.0 in a successfully optimized problem. If
        f_ieqcons is specified, ieqcons is ignored.
    bounds : list, optional
        A list of tuples specifying the lower and upper bound
        for each independent variable [(xl0, xu0),(xl1, xu1),...]
        Infinite values will be interpreted as large floating values.
    fprime : callable ``f(x,*args)``, optional
        A function that evaluates the partial derivatives of func.
    fprime_eqcons : callable ``f(x,*args)``, optional
        A function of the form ``f(x, *args)`` that returns the m by n
        array of equality constraint normals. If not provided,
        the normals will be approximated. The array returned by
        fprime_eqcons should be sized as ( len(eqcons), len(x0) ).
    fprime_ieqcons : callable ``f(x,*args)``, optional
        A function of the form ``f(x, *args)`` that returns the m by n
        array of inequality constraint normals. If not provided,
        the normals will be approximated. The array returned by
        fprime_ieqcons should be sized as ( len(ieqcons), len(x0) ).
    args : sequence, optional
        Additional arguments passed to func and fprime.
    iter : int, optional
        The maximum number of iterations.
    acc : float, optional
        Requested accuracy.
    iprint : int, optional
        The verbosity of fmin_slsqp :

        * iprint <= 0 : Silent operation
        * iprint == 1 : Print summary upon completion (default)
        * iprint >= 2 : Print status of each iterate and summary
    disp : int, optional
        Overrides the iprint interface (preferred).
    full_output : bool, optional
        If False, return only the minimizer of func (default).
        Otherwise, output final objective function and summary
        information.
    epsilon : float, optional
        The step size for finite-difference derivative estimates.
    callback : callable, optional
        Called after each iteration, as ``callback(x)``, where ``x`` is the
        current parameter vector.

    Returns
    -------
    out : ndarray of float
        The final minimizer of func.
    fx : ndarray of float, if full_output is true
        The final value of the objective function.
    its : int, if full_output is true
        The number of iterations.
    imode : int, if full_output is true
        The exit mode from the optimizer (see below).
    smode : string, if full_output is true
        Message describing the exit mode from the optimizer.

    See also
    --------
    minimize: Interface to minimization algorithms for multivariate
        functions. See the 'SLSQP' `method` in particular.

    Notes
    -----
    Exit modes are defined as follows:

    - ``-1`` : Gradient evaluation required (g & a)
    - ``0`` : Optimization terminated successfully
    - ``1`` : Function evaluation required (f & c)
    - ``2`` : More equality constraints than independent variables
    - ``3`` : More than 3*n iterations in LSQ subproblem
    - ``4`` : Inequality constraints incompatible
    - ``5`` : Singular matrix E in LSQ subproblem
    - ``6`` : Singular matrix C in LSQ subproblem
    - ``7`` : Rank-deficient equality constraint subproblem HFTI
    - ``8`` : Positive directional derivative for linesearch
    - ``9`` : Iteration limit reached

    Examples
    --------
    Examples are given :ref:`in the tutorial <tutorial-sqlsp>`.

    Nr   )ÚmaxiterÚftolÚiprintÚdispÚepsÚcallbackr$   c                 3   ó   � | ]	}d |ˆ dœV  qdS )Úeq©ÚtypeÚfunr   Nr$   ©Ú.0Úc©r   r$   r%   Ú	<genexpr>Ä   ó   € zfmin_slsqp.<locals>.<genexpr>c                 3   r-   )Úineqr/   Nr$   r2   r5   r$   r%   r6   Å   r7   r.   )r0   r1   r#   r   r8   )r#   ÚboundsÚconstraintsr    r1   ÚnitÚstatusÚmessage)ÚtupleÚ_minimize_slsqp)r!   Úx0ÚeqconsÚf_eqconsÚieqconsÚ	f_ieqconsr9   ÚfprimeÚfprime_eqconsÚfprime_ieqconsr   ÚiterÚaccr)   r*   Úfull_outputr"   r,   ÚoptsÚconsÚresr$   r5   r%   r   F   s8   pû
ÿ
ÿÿÿ"Fc           E         sX  t |ƒ |d }|}|
‰ |	sd}t|ƒ}tj| |¡d|d�}|j}| |jd¡r,|j}| | 	||¡d¡‰|du s@t
|ƒdkrHtj tjf‰nt|ƒ‰t ˆˆd ˆd ¡‰t|tƒr_|f}dddœ}t|ƒD ]ƒ\}}z|d	  ¡ }W n3 ty‡ } ztd
| ƒ|‚d}~w ty— } ztdƒ|‚d}~w ty§ } ztdƒ|‚d}~ww |dvr¶td|d	 › d�ƒ‚d|vrÀtd| ƒ‚| d¡}|du rØ‡ ‡‡‡fdd„}||d ƒ}||  |d || dd¡dœf7  < qhddddddddddd d!œ}ttt
‡fd"d#„|d$ D ƒƒƒ}ttt
‡fd%d#„|d& D ƒƒƒ}|| }td|gƒ ¡ }t
ˆƒ}|d }|| | | } d'| | |d  || d | d(   d(|   ||  ||   d(|  | |d | d(  d(|  d'|  d'|  d }!| }"t|!ƒ}#t|"ƒ}$|du �sˆt
|ƒdk�r£tj|td)�}%tj|td)�}&|% tj ¡ |& tj ¡ n~td*d#„ |D ƒtƒ}'|'j!d |k�r¹t"d+ƒ‚tj#d,d-�� |'dd…df |'dd…df k}(W d  ƒ n	1 �sÛw   Y  |( $¡ �rõtd.d/ %d0d1„ |(D ƒ¡› d2�ƒ‚|'dd…df |'dd…df }%}&t&|'ƒ })tj |%|)dd…df < tj |&|)dd…df < t'| ˆˆ||
ˆˆd3�}*t(|*j)ˆƒ}+t(|*j*ˆƒ},tdt+ƒ}-t|tƒ}t|t+ƒ}.d}/tdtƒ}0tdtƒ}1tdtƒ}2tdtƒ}3tdtƒ}4tdtƒ}5tdtƒ}6tdtƒ}7tdtƒ}8tdtƒ}9tdt+ƒ}:tdt+ƒ};tdt+ƒ}<tdt+ƒ}=tdt+ƒ}>tdt+ƒ}tdt+ƒ}?tdt+ƒ}@|d(k�r®t,d4d5 ƒ |+ˆƒ}At-|,ˆƒd6ƒ}Bt.ˆ|ƒ}Ct/ˆ||||||ƒ}D	 t0g |‘|‘ˆ‘|%‘|&‘|A‘|C‘|B‘|D‘|‘|.‘|-‘|#‘|$‘|0‘|1‘|2‘|3‘|4‘|5‘|6‘|7‘|8‘|9‘|:‘|;‘|<‘|=‘|>‘|‘|?‘|@‘R Ž  |-dk�r|+ˆƒ}At.ˆ|ƒ}C|-dk�r2t-|,ˆƒd6ƒ}Bt/ˆ||||||ƒ}D|.|/k�rV|du�rC|t 1ˆ¡ƒ |d(k�rVt,d7|.|*j2|At3 4|B¡f ƒ t5|-ƒdk�r^nt+|.ƒ}/�qÉ|dk�r�t,|t+|-ƒ d8 t6|-ƒ d9 ƒ t,d:|Aƒ t,d;|.ƒ t,d<|*j2ƒ t,d=|*j7ƒ t8ˆ|A|Bdd… t+|.ƒ|*j2|*j7t+|-ƒ|t+|-ƒ |-dkd>�	S )?aª  
    Minimize a scalar function of one or more variables using Sequential
    Least Squares Programming (SLSQP).

    Options
    -------
    ftol : float
        Precision goal for the value of f in the stopping criterion.
    eps : float
        Step size used for numerical approximation of the Jacobian.
    disp : bool
        Set to True to print convergence messages. If False,
        `verbosity` is ignored and set to 0.
    maxiter : int
        Maximum number of iterations.
    finite_diff_rel_step : None or array_like, optional
        If ``jac in ['2-point', '3-point', 'cs']`` the relative step size to
        use for numerical approximation of `jac`. The absolute step
        size is computed as ``h = rel_step * sign(x) * max(1, abs(x))``,
        possibly adjusted to fit into the bounds. For ``method='3-point'``
        the sign of `h` is ignored. If None (default) then step is selected
        automatically.
    r   r   )ÚndimÚxpzreal floatingéÿÿÿÿNr$   )r.   r8   r0   z"Constraint %d has no type defined.z/Constraints must be defined using a dictionary.z#Constraint's type must be a string.zUnknown constraint type 'z'.r1   z&Constraint %d has no function defined.r#   c                    s   ‡‡‡ ‡‡fdd„}|S )Nc                    s:   t | ˆƒ} ˆdv rtˆ| ˆ|ˆˆd�S tˆ| dˆ |ˆd�S )N)r   z3-pointÚcs)r   r   Úrel_stepr9   r   )r   r   r   r9   )r   r   )r    r   )r"   Úfinite_diff_rel_stepr1   r#   Ú
new_boundsr$   r%   Úcjac,  s   

þþz3_minimize_slsqp.<locals>.cjac_factory.<locals>.cjacr$   )r1   rU   )r"   rS   r#   rT   )r1   r%   Úcjac_factory+  s   z%_minimize_slsqp.<locals>.cjac_factoryr   )r1   r#   r   z$Gradient evaluation required (g & a)z$Optimization terminated successfullyz$Function evaluation required (f & c)z4More equality constraints than independent variablesz*More than 3*n iterations in LSQ subproblemz#Inequality constraints incompatiblez#Singular matrix E in LSQ subproblemz#Singular matrix C in LSQ subproblemz2Rank-deficient equality constraint subproblem HFTIz.Positive directional derivative for linesearchzIteration limit reached)rP   r   r   é   é   é   é   é   é   é   é	   c                    ó(   g | ]}t |d  ˆ g|d ¢R Ž ƒ‘qS ©r1   r   ©r   r2   ©r    r$   r%   Ú
<listcomp>N  ó     ÿz#_minimize_slsqp.<locals>.<listcomp>r.   c                    r_   r`   ra   r2   rb   r$   r%   rc   P  rd   r8   rX   rW   )Údtypec                 S   s    g | ]\}}t |ƒt |ƒf‘qS r$   )r   )r3   ÚlÚur$   r$   r%   rc   i  s    ÿzDSLSQP Error: the length of bounds is not compatible with that of x0.Úignore)ÚinvalidzSLSQP Error: lb > ub in bounds z, c                 s   s   � | ]}t |ƒV  qd S )N)Ústr)r3   Úbr$   r$   r%   r6   t  s   € z"_minimize_slsqp.<locals>.<genexpr>Ú.)r#   r   r"   rS   r9   z%5s %5s %16s %16s)ÚNITÚFCÚOBJFUNÚGNORMg        z%5i %5i % 16.6E % 16.6Ez    (Exit mode ú)z#            Current function value:z            Iterations:z!            Function evaluations:z!            Gradient evaluations:)	r    r1   r#   r;   ÚnfevÚnjevr<   r=   Úsuccess)9r   r   ÚxpxÚ
atleast_ndÚasarrayÚfloat64Úisdtypere   ÚreshapeÚastypeÚlenr   Úinfr   ÚclipÚ
isinstanceÚdictÚ	enumerateÚlowerÚKeyErrorÚ	TypeErrorÚAttributeErrorÚ
ValueErrorÚgetÚsumÚmapr   Úmaxr   ÚemptyÚfloatÚfillÚnanÚshapeÚ
IndexErrorÚerrstateÚanyÚjoinr   r   r   r1   ÚgradÚintÚprintr   Ú_eval_constraintÚ_eval_con_normalsr   Úcopyrr   r   ÚnormÚabsrj   Úngevr   )Er!   r@   r   r#   r9   r:   r'   r(   r)   r*   r+   r,   rS   Úunknown_optionsrH   rI   rO   re   rL   ÚicÚconÚctypeÚerU   rV   Ú
exit_modesÚmeqÚmieqÚmÚlaÚnÚn1ÚmineqÚlen_wÚlen_jwÚwÚjwÚxlÚxuÚbndsÚbnderrÚinfbndÚsfÚwrapped_funÚwrapped_gradÚmodeÚmajiterÚmajiter_prevÚalphaÚf0ÚgsÚh1Úh2Úh3Úh4ÚtÚt0ÚtolÚiexactÚinconsÚiresetÚitermxÚlineÚn2Ún3ÚfxÚgr4   Úar$   )r"   rS   r#   rT   r    r%   r?   Ø   s¢  

€ÿ€
€ÿ

þö
ÿ
ÿ>ÿÿÿÿÿÿÿÿÿ"ÿ

ÿ"
þ






















<ÿÿÿÿÿÿÿÿÿÿþþþþþýýý







ÿã
  

þr?   c                    sh   |d rt ‡ fdd„|d D ƒƒ}ntdƒ}|d r(t ‡ fdd„|d D ƒƒ}ntdƒ}t ||fƒ}|S )Nr.   c                    r_   r`   ra   ©r3   rŸ   rb   r$   r%   rc   Ú  rd   z$_eval_constraint.<locals>.<listcomp>r   r8   c                    r_   r`   ra   rÍ   rb   r$   r%   rc   à  rd   )r	   r   )r    rL   Úc_eqÚc_ieqr4   r$   rb   r%   r—   ×  s   
ÿ
ÿr—   c           
         sœ   |d rt ‡ fdd„|d D ƒƒ}nt||fƒ}|d r*t ‡ fdd„|d D ƒƒ}nt||fƒ}|dkr;t||fƒ}	nt ||fƒ}	t|	t|dgƒfdƒ}	|	S )Nr.   c                    ó$   g | ]}|d  ˆ g|d ¢R Ž ‘qS ©r#   r   r$   rÍ   rb   r$   r%   rc   í  ó    ÿz%_eval_con_normals.<locals>.<listcomp>r8   c                    rÐ   rÑ   r$   rÍ   rb   r$   r%   rc   ó  rÒ   r   r   )r   r   r	   )
r    rL   r¦   r§   r¥   r£   r¤   Úa_eqÚa_ieqrÌ   r$   rb   r%   r˜   ê  s   
ÿ
ÿr˜   ))Ú__doc__Ú__all__Únumpyr   Úscipy.optimize._slsqpr   r   r   r   r   r	   r
   r   r   r   r   Ú	_optimizer   r   r   r   r   Ú_numdiffr   Ú_constraintsr   r   Úscipy._lib._array_apir   Ú
scipy._libr   ru   Ú__docformat__rŒ   r+   Ú_epsilonr   r   r?   r—   r˜   r$   r$   r$   r%   Ú<module>   s:    0"
ü 
ý  