o
    izJ                     @   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   npZ
atleast_2d)xfuncepsilonr   jac r#   R/home/kim/smarthome/.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#   r1   r4   r#   r$   r5      r6   r-   )r/   r0   r"   r   r7   )r"   boundsconstraintsr   r0   nitstatusmessage)tuple_minimize_slsqp)r    x0ZeqconsZf_eqconsZieqconsZ	f_ieqconsr8   ZfprimeZfprime_eqconsZfprime_ieqconsr   iteraccr(   r)   Zfull_outputr!   r+   optsconsresr#   r4   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rtd|d	  dd|vrt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 st
|dkrtj|td)}%tj|td)}&|%tj  |&tj  n~td*d# |D t}'|'j!d |krt"d+tj#d,d- |'dddf |'dddf k}(W d   n	1 sw   Y  |($ rt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rt,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|At34|Bf  t5|-dkr^nt+|.}/q|dkrt,|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 floatingNr#   )r-   r7   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 'z'.r0   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   Zrel_stepr8   r   )r   r   r   r8   )r   r   )r   r   )r!   finite_diff_rel_stepr0   r"   
new_boundsr#   r$   cjac,  s   

z3_minimize_slsqp.<locals>.cjac_factory.<locals>.cjacr#   )r0   rK   )r!   rI   r"   rJ   )r0   r$   cjac_factory+  s   z%_minimize_slsqp.<locals>.cjac_factoryr   )r0   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)rG   r   r                        	   c                    (   g | ]}t |d   g|d R  qS r0   r   r   r1   r   r#   r$   
<listcomp>N       z#_minimize_slsqp.<locals>.<listcomp>r-   c                    rU   rV   rW   r1   rX   r#   r$   rY   P  rZ   r7   rN   rM   )dtypec                 S   s    g | ]\}}t |t |fqS r#   )r   )r2   lur#   r#   r$   rY   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)r2   br#   r#   r$   r5   t  s    z"_minimize_slsqp.<locals>.<genexpr>.)r"   r   r!   rI   r8   z%5s %5s %16s %16s)ZNITZFCZOBJFUNZGNORMg        z%5i %5i % 16.6E % 16.6Ez    (Exit mode )z#            Current function value:z            Iterations:z!            Function evaluations:z!            Gradient evaluations:)	r   r0   r"   r:   nfevZnjevr;   r<   success)9r   r   xpxZ
atleast_ndZasarrayZfloat64Zisdtyper[   ZreshapeZastypelenr   infr   Zclip
isinstancedict	enumeratelowerKeyError	TypeErrorAttributeError
ValueErrorgetsummapr   maxr   emptyfloatfillnanshape
IndexErrorZerrstateanyjoinr   r   r   r0   Zgradintprintr   _eval_constraint_eval_con_normalsr   copyrd   r   Znormabsr`   Zngevr   )Er    r?   r   r"   r8   r9   r&   r'   r(   r)   r*   r+   rI   Zunknown_optionsr@   rA   rF   r[   rC   ZicconctypeerK   rL   Z
exit_modesmeqmieqmlanZn1ZmineqZlen_wZlen_jwwZjwZxlZxuZbndsZbnderrZinfbndZsfZwrapped_funZwrapped_gradmodeZmajiterZmajiter_prevalphaZf0gsZh1Zh2Zh3Zh4tt0ZtolZiexactZinconsZiresetZitermxlineZn2Zn3Zfxgr3   ar#   )r!   rI   r"   rJ   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                    rU   rV   rW   r2   r   rX   r#   r$   rY     rZ   z$_eval_constraint.<locals>.<listcomp>r   r7   c                    rU   rV   rW   r   rX   r#   r$   rY     rZ   )r	   r   )r   rC   Zc_eqZc_ieqr3   r#   rX   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   rX   r#   r$   rY         z%_eval_con_normals.<locals>.<listcomp>r7   c                    r   r   r#   r   rX   r#   r$   rY     r   r   r   )r   r   r	   )
r   rC   r   r   r   r   r   Za_eqZa_ieqr   r#   rX   r$   r     s   

r   ))__doc____all__numpyr   Zscipy.optimize._slsqpr   r   r   r   r   r	   r
   r   r   r   r   	_optimizer   r   r   r   r   Z_numdiffr   _constraintsr   r   Zscipy._lib._array_apir   Z
scipy._libr   rf   __docformat__rv   r*   Z_epsilonr   r   r>   r   r   r#   r#   r#   r$   <module>   s:    0"
 
  