U
    ¤»|eOI  ã                   @   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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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ÚasfarrayÚ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_scalarz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/website-v5/atlas_env/lib/python3.8/site-packages/scipy/optimize/_slsqp_py.pyr   "   s    
ÿr#   éd   g�íµ ÷Æ°>c                    sØ   |dk	r|}||||dk||dœ}d}|t ‡ fdd„|D ƒƒ7 }|t ‡ fdd„|D ƒƒ7 }|rr|d||ˆ d	œf7 }|rŠ|d
||	ˆ d	œf7 }t| |ˆ f|||dœ|—Ž}|rÌ|d |d |d |d |d fS |d S dS )a/  
    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   s   | ]}d |ˆ dœV  qdS )Úeq©ÚtypeÚfunr   Nr#   ©Ú.0Úc©r   r#   r$   Ú	<genexpr>Â   s     zfmin_slsqp.<locals>.<genexpr>c                 3   s   | ]}d |ˆ dœV  qdS )Úineqr-   Nr#   r0   r3   r#   r$   r4   Ã   s     r,   )r.   r/   r"   r   r5   )r"   ÚboundsÚconstraintsr   r/   ÚnitÚstatusÚmessage)ÚtupleÚ_minimize_slsqp)r    Úx0ZeqconsZf_eqconsZieqconsZ	f_ieqconsr6   ÚfprimeZfprime_eqconsZfprime_ieqconsr   ÚiterÚaccr(   r)   Úfull_outputr!   r+   ÚoptsÚconsÚresr#   r3   r$   r   D   s8    pûÿ
ÿ
ÿÿ"Fc           C   !      sà  t |ƒ |d }|}|
‰ |	s d}t|ƒ ¡ ‰|dks@t|ƒdkrPtj tjf‰nt|ƒ‰t ˆˆd ˆd ¡‰t|t	ƒr~|f}dddœ}t
|ƒD �]*\}}z|d  ¡ }W nˆ tk
rÚ } ztd| ƒ|‚W 5 d}~X Y nt tk
�r } ztdƒ|‚W 5 d}~X Y nH tk
�r2 } ztd	ƒ|‚W 5 d}~X Y nX |dk�rNtd
|d  ƒ‚d|k�rdtd| ƒ‚| d¡}|dk�r–‡ ‡‡‡fdd„}||d ƒ}||  |d || dd¡dœf7  < q�d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k�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�rXtd'ƒ‚tjd(d)��& |%dd…df |%dd…df k}&W 5 Q R X |& ¡ �r¶td*d+ d,d-„ |&D ƒ¡ ƒ‚|%dd…df |%dd…df  }#}$t|%ƒ }'tj|#|'dd…df < tj|$|'dd…df < t | ˆˆ||
ˆˆd.�}(t!|(j"ˆƒ})t!|(j#ˆƒ}*tdt$ƒ}+t|tƒ}t|t$ƒ},d}-tdtƒ}.tdtƒ}/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$ƒ}>|d$k�r(t%d/d0 ƒ |)ˆƒ}?t&|*ˆƒd1ƒ}@t'ˆ|ƒ}At(ˆ||||||ƒ}Bt)||ˆ|#|$|?|A|@|B||,|+|!|"|.|/|0|1|2|3|4|5|6|7|8|9|:|;|<||=|>ƒ  |+dk�r¾|)ˆƒ}?t'ˆ|ƒ}A|+d2k�rêt&|*ˆƒd1ƒ}@t(ˆ||||||ƒ}B|,|-k�r2|dk	�r|t *ˆ¡ƒ |d$k�r2t%d3|,|(j+|?t, -|@¡f ƒ t.|+ƒdk�rD�qPt$|,ƒ}-�q\|dk�r¦t%|t$|+ƒ d4 t/|+ƒ d5 ƒ t%d6|?ƒ t%d7|,ƒ t%d8|(j+ƒ t%d9|(j0ƒ t1ˆ|?|@dd2… t$|,ƒ|(j+|(j0t$|+ƒ|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   Nr#   )r,   r5   r.   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 '%s'.r/   z&Constraint %d has no function defined.r"   c                    s   ‡‡‡ ‡‡fdd„}|S )Nc                    s>   t | ˆƒ} ˆdkr&tˆ| ˆ|ˆˆd�S tˆ| dˆ |ˆd�S d S )N)r   z3-pointÚcs)r   r   Úrel_stepr6   r   )r   r   r   r6   )r   r   )r   r   )r!   Úfinite_diff_rel_stepr/   r"   Ú
new_boundsr#   r$   Úcjac%  s    

þ þz3_minimize_slsqp.<locals>.cjac_factory.<locals>.cjacr#   )r/   rI   )r!   rG   r"   rH   )r/   r$   Úcjac_factory$  s    z%_minimize_slsqp.<locals>.cjac_factoryr   )r/   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)éÿÿÿÿr   r   é   é   é   é   é   é   é   é	   c                    s&   g | ]}t |d  ˆ f|d žŽ ƒ‘qS ©r/   r   ©r   r0   ©r   r#   r$   Ú
<listcomp>G  s   ÿz#_minimize_slsqp.<locals>.<listcomp>r,   c                    s&   g | ]}t |d  ˆ f|d žŽ ƒ‘qS rT   rU   r0   rV   r#   r$   rW   I  s   ÿr5   rM   rL   )Údtypec                 S   s    g | ]\}}t |ƒt |ƒf‘qS r#   )r   )r1   ÚlÚur#   r#   r$   rW   b  s   ÿzDSLSQP Error: the length of bounds is not compatible with that of x0.Úignore)Úinvalidz"SLSQP Error: lb > ub in bounds %s.z, c                 s   s   | ]}t |ƒV  qd S )N)Ústr)r1   Úbr#   r#   r$   r4   m  s     z"_minimize_slsqp.<locals>.<genexpr>)r"   r   r!   rG   r6   z%5s %5s %16s %16s)ZNITZFCZOBJFUNZGNORMg        rK   z%5i %5i % 16.6E % 16.6Ez    (Exit mode ú)z#            Current function value:z            Iterations:z!            Function evaluations:z!            Gradient evaluations:)	r   r/   r"   r8   ÚnfevÚnjevr9   r:   Úsuccess)2r   r	   ÚflattenÚ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   r/   ÚgradÚintÚprintr   Ú_eval_constraintÚ_eval_con_normalsr   Úcopyr`   r   ÚnormÚabsr]   Úngevr   )Cr    r=   r   r"   r6   r7   r&   r'   r(   r)   r*   r+   rG   Úunknown_optionsr?   r@   rC   ÚicÚconÚctypeÚerI   rJ   Z
exit_modesÚmeqÚmieqÚmÚlaÚnÚn1ZmineqZlen_wZlen_jwÚwZjwÚxlZxuZbndsZbnderrZinfbndÚsfZwrapped_funZwrapped_gradÚmodeZmajiterZmajiter_prevÚalphaÚf0ZgsZh1Zh2Zh3Zh4ÚtÚt0ÚtolÚiexactZinconsZiresetZitermxÚlineÚn2Ún3ÚfxÚgr2   Úar#   )r!   rG   r"   rH   r   r$   r<   Ö   sp   

ÿ




þöÿ
ÿ
>ÿÿÿÿÿÿÿÿÿ*
ÿ"
þ






















               ý






 ÿ
 

  
 þr<   c                    sh   |d r$t ‡ fdd„|d D ƒƒ}ntdƒ}|d rPt ‡ fdd„|d D ƒƒ}ntdƒ}t ||fƒ}|S )Nr,   c                    s&   g | ]}t |d  ˆ f|d žŽ ƒ‘qS rT   rU   ©r1   r‡   rV   r#   r$   rW   Ó  s   ÿz$_eval_constraint.<locals>.<listcomp>r   r5   c                    s&   g | ]}t |d  ˆ f|d žŽ ƒ‘qS rT   rU   r    rV   r#   r$   rW   Ù  s   ÿ)r
   r   )r   rC   Úc_eqZc_ieqr2   r#   rV   r$   r   Ð  s    ÿ
ÿ
r   c           
         sœ   |d r$t ‡ fdd„|d D ƒƒ}nt||fƒ}|d rTt ‡ fdd„|d D ƒƒ}nt||fƒ}|dkrvt||fƒ}	nt ||fƒ}	t|	t|dgƒfdƒ}	|	S )Nr,   c                    s"   g | ]}|d  ˆ f|d žŽ ‘qS ©r"   r   r#   r    rV   r#   r$   rW   æ  s   ÿz%_eval_con_normals.<locals>.<listcomp>r5   c                    s"   g | ]}|d  ˆ f|d žŽ ‘qS r¢   r#   r    rV   r#   r$   rW   ì  s   ÿr   r   )r   r   r
   )
r   rC   r�   rŽ   rŒ   rŠ   r‹   Za_eqZa_ieqrŸ   r#   rV   r$   r€   ã  s    ÿ
ÿ
r€   )%Ú__doc__Ú__all__Únumpyr   Zscipy.optimize._slsqpr   r   r   r   r   r	   r
   r   r   r   r   r   Ú	_optimizer   r   r   r   r   Ú_numdiffr   Ú_constraintsr   r   Ú__docformat__rt   r*   Ú_epsilonr   r   r<   r   r€   r#   r#   r#   r$   Ú<module>   sL   4"        ü
      ý
 {