3
hO                 @   sn  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mZmZ ddl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 f df df dddf dddddedfddZ!f ddf ddddeddfddZ"dd Z#dd Z$e%dkrjdddddgfddZ&ee gd egd gj'Z(ddge(dddf< d6ddZ)d7d d!Z*d8d#d$Z+d9d%d&Z,d'e)e*d:d(d)e+e,d;d(fZ-e.d*j/d+d, e.d- e!e&ed<dge(dd.d/dd \Z0Z1e.d0 e"e&ed=dgfd1e(id2d.iZ2e.d3j/d+d, e.d- e!e&ed>dge)e*e+e,dd.d4dd \Z0Z1e.d0 e"e&ed?dgfd5e-id2d.iZ2d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expinfisfinite
atleast_1d   )OptimizeResult_check_unknown_options_prepare_scalar_function)approx_derivative)old_bound_to_new_arr_to_scalarzrestructuredtext enc             G   s   t || d||d}tj|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.

    z2-point)methodabs_stepargs)r   npZ
atleast_2d)xfuncepsilonr   jac r!   5/tmp/pip-build-riy7u7_k/scipy/scipy/optimize/slsqp.pyr   !   s    
d   gư>c                s   |dk	r|}||||dk||d}f }|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callbackc             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 )ineq)r+   r,   r   Nr!   )r-   r.   )r   r!   r"   r/      s    r*   )r+   r,   r    r   r0   )r    boundsconstraintsr   r,   nitstatusmessage)tuple_minimize_slsqp)r   x0Zeqconsf_eqconsZieqcons	f_ieqconsr1   Zfprimefprime_eqconsfprime_ieqconsr   iteraccr&   r'   full_outputr   r)   optsconsresr!   )r   r"   r   C   s,    p"Fc       A   0      s  t | |d }|}|
 |	s d}t|tr0|f}f f d} xt|D ]\}}y|d j }W nT tk
r~   td| Y nN tk
r   tdY n4 tk
r   tdY nX |dBkrtd
|d  d|krtd| |j	d}|dkr fdd}||d }||  |d ||j	df df7  < qFW dCdddddddddddddddd d!d"d#d$d%i}t
|j |dkst|dkrtj tjf}nt|}tj|d |d tttfd&d'|d D }tttfd(d'|d	 D }|| }td|gj }t}|d }|| | | }d| | |d  || d |d   d|  || ||   d|  | |d | d  d|  d|  d|  d }|} t|}!t| }"|dkst|dkrtj|td)}#tj|td)}$|#jtj |$jtj nt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Q R X |&j rtd.d/jd0d1 |&D  |%dddf |%dddf  }#}$t|% }'tj|#|'dddf < tj|$|'dddf < t | ||
|d2}(tdt!})t|t}t|t!}*d}+tdt},tdt}-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!}<|dkrt"d3dD  |(j#}=yttj$|=}=W n" ttfk
r0   td8Y nX t%|(j&d9}>t'|}?t(||||||}@xt)|||#|$|=|?|>|@||*|)|!|"|,|-|.|/|0|1|2|3|4|5|6|7|8|9|:||;|<  |)dkr|(j#}=t'|}?|)dEkrt%|(j&d9}>t(||||||}@|*|+kr<|dk	r|tj* |dkr<t"d:|*|(j+|=t,j-|>f  t.|)dkrLP t!|*}+qbW |dkrt"|t!|) d; t/|) d<  t"d=|= t"d>|* t"d?|(j+ t"d@|(j0 t1|=|>ddF t!|*|(j+|(j0t!|)|t!|) |)dkdA	S )Ga  
    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(x0) * max(1, abs(x0))``,
        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   )r*   r0   r+   z"Constraint %d has no type defined.z/Constraints must be defined using a dictionary.z#Constraint's type must be a string.r*   r0   zUnknown constraint type '%s'.r,   z&Constraint %d has no function defined.r    Nc                s    fdd}|S )Nc                s0   dkrt | |dS t | d |dS d S )N2-point3-pointcs)r   r   Zrel_step)r   r   r   )rC   rD   rE   )r   )r   r   )r   finite_diff_rel_stepr,   r    r!   r"   cjac  s
    
z3_minimize_slsqp.<locals>.cjac_factory.<locals>.cjacr!   )r,   rG   )r   rF   r    )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 variables   z*More than 3*n iterations in LSQ subproblem   z#Inequality constraints incompatible   z#Singular matrix E in LSQ subproblem   z#Singular matrix C in LSQ subproblem   z2Rank-deficient equality constraint subproblem HFTI   z.Positive directional derivative for linesearch	   zIteration limit reachedc                s&   g | ]}t |d   f|d  qS )r,   r   )r   )r-   r.   )r   r!   r"   
<listcomp>B  s   z#_minimize_slsqp.<locals>.<listcomp>c                s&   g | ]}t |d   f|d  qS )r,   r   )r   )r-   r.   )r   r!   r"   rQ   D  s   )Zdtypec             S   s    g | ]\}}t |t |fqS r!   )r   )r-   lur!   r!   r"   rQ   ]  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)r-   br!   r!   r"   r/   h  s    z"_minimize_slsqp.<locals>.<genexpr>)r    r   r   rF   r1   z%5s %5s %16s %16sNITFCOBJFUNGNORMz'Objective function must return a scalarg        z%5i %5i % 16.6E % 16.6Ez    (Exit mode )z#            Current function value:z            Iterations:z!            Function evaluations:z!            Gradient evaluations:)	r   r,   r    r3   nfevZnjevr4   r5   success)r*   r0   )rX   rY   rZ   r[   r_   r_   )2r   
isinstancedict	enumeratelowerKeyError	TypeErrorAttributeError
ValueErrorgetr	   flattenlenr   r   r   Zclipsummapr   maxr   emptyfloatfillnanshape
IndexErrorZerrstateanyjoinr   r   intprintr,   Zasarrayr   Zgrad_eval_constraint_eval_con_normalsr   copyr]   r   ZnormabsrV   Zngevr   )Ar   r8   r   r    r1   r2   r$   r%   r&   r'   r(   r)   rF   Zunknown_optionsr=   r>   rA   ZicconctyperG   rH   Z
exit_modesZ
new_boundsmeqmieqmlanZn1ZmineqZlen_wZlen_jwwZjwZxlZxubndsZbnderrZinfbndZsfmodeZmajiterZmajiter_prevalphaZf0Zgsh1h2h3h4tt0ZtolZiexactZinconsZiresetZitermxlineZn2Zn3Zfxgr.   ar!   )r   rF   r    r   r"   r7      s   




x*
"



































 

r7   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 )r,   r   )r   )r-   r|   )r   r!   r"   rQ     s   z$_eval_constraint.<locals>.<listcomp>r   r0   c                s&   g | ]}t |d   f|d  qS )r,   r   )r   )r-   r|   )r   r!   r"   rQ     s   )r
   r   )r   rA   Zc_eqZc_ieqr.   r!   )r   r"   rx     s    rx   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-   r|   )r   r!   r"   rQ     s   z%_eval_con_normals.<locals>.<listcomp>r0   c                s"   g | ]}|d   f|d  qS )r    r   r!   )r-   r|   )r   r!   r"   rQ     s   r   r   )r   r   r
   )
r   rA   r   r   r   r~   r   Za_eqZa_ieqr   r!   )r   r"   ry     s    ry   __main__rK   rI   c             C   sd   t | d |d | d d  |d | d d   |d | d  | d   |d | d   |d   S )z Objective function r   rI   r   rJ   rK   )r   )r   rr!   r!   r"   r,     s    
Nr,   g?g?c             C   s   t | d d | d  | gS )z Equality constraint r   rI   r   )r   )r   rW   r!   r!   r"   feqcon  s    r   c             C   s   t d| d  dggS )z! Jacobian of equality constraint rI   r   r   )r   )r   rW   r!   r!   r"   jeqcon  s    r   
   c             C   s   t | d | d  | gS )z Inequality constraint r   r   )r   )r   r.   r!   r!   r"   fieqcon  s    r   c             C   s   t ddggS )z# Jacobian of inequality constraint r   )r   )r   r.   r!   r!   r"   jieqcon  s    r   r*   )r+   r,   r    r   r0   z Bounds constraints H   -z * fmin_slsqpT)r1   r'   r?   z * _minimize_slsqpr1   r'   z% Equality and inequality constraints )r9   r;   r:   r<   r'   r?   r2   )r   )r   )r   )r   )r   )r   r_   r_   r_   r_   )3__doc____all__Znumpyr   Zscipy.optimize._slsqpr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   optimizer   r   r   Z_numdiffr   Z_constraintsr   r   Z__docformat__ro   r(   Z_epsilonr   r   r7   rx   ry   __name__r,   Tr   r   r   r   r   rA   rw   centerr   frB   r!   r!   r!   r"   <module>   sb   <"  t




