o
    ?Hh                     @   s   d dl Z d dlZd dlmZmZmZmZ ddlm	Z	 ddl
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mZmZmZmZmZ 					dd	d
Zdd Zdd Zdd Z dd Z!dd Z"dd Z#dd Z$dS )    N)BoundsLinearConstraintNonlinearConstraintOptimizeResult   )TrustRegion)ObjectiveFunctionBoundConstraintsLinearConstraintsNonlinearConstraintsProblem)MaxEvalErrorTargetSuccessCallbackSuccessFeasibleSuccessexact_1d_array)
ExitStatusOptions	ConstantsDEFAULT_OPTIONSDEFAULT_CONSTANTSPRINT_OPTIONS c           3      K   s
  |du ri }nt |}|tjttj }t|}|tjttj }	t|	}	|tjttj }
t|
}
|tj	ttj	 }t|}tj
|v rS|tj
 dkrStd|tj
ttj
 }t|}tj|v rq|tj dkrqtd|tjttj }t|}|tjttj }t|}t|ts|f}t| ||g|R  }t|ds|g}t|}tt||}t|\}}t|||}t|||}t|||||||	|
||||}t||j tdi |}|jjst|ddt j!d|S |jdkrt|ddt j"d|S |r3t#d	 t#d
|tj$  d t#d|tj%  d t#d|tj&  d t#d|tj'  d t#  zt(|||}W nb t)yO   t|ddt j*d| Y S  t+yb   t|ddt j,d| Y S  t-yu   t|ddt j.d| Y S  t/y   t|ddt j0d| Y S  t1j2j3y   t|ddt j4d| Y S w d}d}d}d}d}d}	 ||tj' krt j0}nJ|d7 }t1j25|j6|j7j8j9 |t:j; |j< kr|=| |j<}|>|\} }!| |! }"t1j25|"}#|#|t:j? |j@ krY| j<|t:jA 9  _<||j@kr
d}d}n|d7 }|d7 }|#d|j@ krd}|dkp$|dk}$|$r0d}d}d}%nz|B \}}&W n t1j2j3yH   t j4}Y nw |&tC|j<|t:jD |j@ k}%n|E|"}'|'r;ztF|||"|\}(})}*W n; t)y}   t j*}d}Y n t-y   t j.}d}Y nv t+y   t j,}d}Y ng t/y   t jG}Y nZw |H|j6|jI|jJ|jK}+|H|j6|" |(|)|*},|jLdkr7|,|+kr7t1j25| |t:jM d |j< kr7|N|"|}-t1j25|-dkr7|"|-7 }"ztF|||"|\}(})}*W n; t)y   t j*}d}Y n t-y   t j.}d}Y n t+y)   t j,}d}Y n t/y6   t jG}Y nw |O|"|(|)|*}.z|B|j6|" d }W n t1j2j3y[   t j4}Y nw z|j7P||j6|" |(|)|*}/W n t1j2j3y{   t j4}Y nw |Q  |R|"|. |j<|j@kr|.|t:jS krd}nX|d7 }|j7T|j6}0z	|j7U|j6}1W n t1j2j3y   t j4}Y nFw t1j25|0|t:jV t1j25|1 k rd}|dkrz|j7W  W n t1j2j3y   t j4}Y nw d}|X|j6|"  z|B \}}&W n t1j2j3y   t j4}Y nw |/p(|.|t:jY ko(|&tC|j<|t:jD |j@ k}%||j@ko9|.|t:jY ko9|% }$nd}$d}%|$r~|j@|tj% krQd}t jZ}n|[| |\  |r~|]|j6|jJ|jK}2t^d|j@ ||_|j6|jI|2|j`| t#  |%r z|a||}"W n t1j2j3y   t j4}Y njw ztF|||"|\}(})}*W n7 t)y   t j*}d}Y nN t-y   t j.}d}Y n@ t+y   t j,}d}Y n2 t/y   t jG}Y n&w z|j7P||j6|" |(|)|* W n t1j2j3y   t j4}Y nw |Q  qt||jb||||S )a?  
    Minimize a scalar function using the COBYQA method.

    The Constrained Optimization BY Quadratic Approximations (COBYQA) method is
    a derivative-free optimization method designed to solve general nonlinear
    optimization problems. A complete description of COBYQA is given in [3]_.

    Parameters
    ----------
    fun : {callable, None}
        Objective function to be minimized.

            ``fun(x, *args) -> float``

        where ``x`` is an array with shape (n,) and `args` is a tuple. If `fun`
        is ``None``, the objective function is assumed to be the zero function,
        resulting in a feasibility problem.
    x0 : array_like, shape (n,)
        Initial guess.
    args : tuple, optional
        Extra arguments passed to the objective function.
    bounds : {`scipy.optimize.Bounds`, array_like, shape (n, 2)}, optional
        Bound constraints of the problem. It can be one of the cases below.

        #. An instance of `scipy.optimize.Bounds`. For the time being, the
           argument ``keep_feasible`` is disregarded, and all the constraints
           are considered unrelaxable and will be enforced.
        #. An array with shape (n, 2). The bound constraints for ``x[i]`` are
           ``bounds[i][0] <= x[i] <= bounds[i][1]``. Set ``bounds[i][0]`` to
           :math:`-\infty` if there is no lower bound, and set ``bounds[i][1]``
           to :math:`\infty` if there is no upper bound.

        The COBYQA method always respect the bound constraints.
    constraints : {Constraint, list}, optional
        General constraints of the problem. It can be one of the cases below.

        #. An instance of `scipy.optimize.LinearConstraint`. The argument
           ``keep_feasible`` is disregarded.
        #. An instance of `scipy.optimize.NonlinearConstraint`. The arguments
           ``jac``, ``hess``, ``keep_feasible``, ``finite_diff_rel_step``, and
           ``finite_diff_jac_sparsity`` are disregarded.

        #. A list, each of whose elements are described in the cases above.

    callback : callable, optional
        A callback executed at each objective function evaluation. The method
        terminates if a ``StopIteration`` exception is raised by the callback
        function. Its signature can be one of the following:

            ``callback(intermediate_result)``

        where ``intermediate_result`` is a keyword parameter that contains an
        instance of `scipy.optimize.OptimizeResult`, with attributes ``x``
        and ``fun``, being the point at which the objective function is
        evaluated and the value of the objective function, respectively. The
        name of the parameter must be ``intermediate_result`` for the callback
        to be passed an instance of `scipy.optimize.OptimizeResult`.

        Alternatively, the callback function can have the signature:

            ``callback(xk)``

        where ``xk`` is the point at which the objective function is evaluated.
        Introspection is used to determine which of the signatures to invoke.
    options : dict, optional
        Options passed to the solver. Accepted keys are:

            disp : bool, optional
                Whether to print information about the optimization procedure.
                Default is ``False``.
            maxfev : int, optional
                Maximum number of function evaluations. Default is ``500 * n``.
            maxiter : int, optional
                Maximum number of iterations. Default is ``1000 * n``.
            target : float, optional
                Target on the objective function value. The optimization
                procedure is terminated when the objective function value of a
                feasible point is less than or equal to this target. Default is
                ``-numpy.inf``.
            feasibility_tol : float, optional
                Tolerance on the constraint violation. If the maximum
                constraint violation at a point is less than or equal to this
                tolerance, the point is considered feasible. Default is
                ``numpy.sqrt(numpy.finfo(float).eps)``.
            radius_init : float, optional
                Initial trust-region radius. Typically, this value should be in
                the order of one tenth of the greatest expected change to `x0`.
                Default is ``1.0``.
            radius_final : float, optional
                Final trust-region radius. It should indicate the accuracy
                required in the final values of the variables. Default is
                ``1e-6``.
            nb_points : int, optional
                Number of interpolation points used to build the quadratic
                models of the objective and constraint functions. Default is
                ``2 * n + 1``.
            scale : bool, optional
                Whether to scale the variables according to the bounds. Default
                is ``False``.
            filter_size : int, optional
                Maximum number of points in the filter. The filter is used to
                select the best point returned by the optimization procedure.
                Default is ``sys.maxsize``.
            store_history : bool, optional
                Whether to store the history of the function evaluations.
                Default is ``False``.
            history_size : int, optional
                Maximum number of function evaluations to store in the history.
                Default is ``sys.maxsize``.
            debug : bool, optional
                Whether to perform additional checks during the optimization
                procedure. This option should be used only for debugging
                purposes and is highly discouraged to general users. Default is
                ``False``.

        Other constants (from the keyword arguments) are described below. They
        are not intended to be changed by general users. They should only be
        changed by users with a deep understanding of the algorithm, who want
        to experiment with different settings.

    Returns
    -------
    `scipy.optimize.OptimizeResult`
        Result of the optimization procedure, with the following fields:

            message : str
                Description of the cause of the termination.
            success : bool
                Whether the optimization procedure terminated successfully.
            status : int
                Termination status of the optimization procedure.
            x : `numpy.ndarray`, shape (n,)
                Solution point.
            fun : float
                Objective function value at the solution point.
            maxcv : float
                Maximum constraint violation at the solution point.
            nfev : int
                Number of function evaluations.
            nit : int
                Number of iterations.

        If ``store_history`` is True, the result also has the following fields:

            fun_history : `numpy.ndarray`, shape (nfev,)
                History of the objective function values.
            maxcv_history : `numpy.ndarray`, shape (nfev,)
                History of the maximum constraint violations.

        A description of the termination statuses is given below.

        .. list-table::
            :widths: 25 75
            :header-rows: 1

            * - Exit status
              - Description
            * - 0
              - The lower bound for the trust-region radius has been reached.
            * - 1
              - The target objective function value has been reached.
            * - 2
              - All variables are fixed by the bound constraints.
            * - 3
              - The callback requested to stop the optimization procedure.
            * - 4
              - The feasibility problem received has been solved successfully.
            * - 5
              - The maximum number of function evaluations has been exceeded.
            * - 6
              - The maximum number of iterations has been exceeded.
            * - -1
              - The bound constraints are infeasible.
            * - -2
              - A linear algebra error occurred.

    Other Parameters
    ----------------
    decrease_radius_factor : float, optional
        Factor by which the trust-region radius is reduced when the reduction
        ratio is low or negative. Default is ``0.5``.
    increase_radius_factor : float, optional
        Factor by which the trust-region radius is increased when the reduction
        ratio is large. Default is ``numpy.sqrt(2.0)``.
    increase_radius_threshold : float, optional
        Threshold that controls the increase of the trust-region radius when
        the reduction ratio is large. Default is ``2.0``.
    decrease_radius_threshold : float, optional
        Threshold used to determine whether the trust-region radius should be
        reduced to the resolution. Default is ``1.4``.
    decrease_resolution_factor : float, optional
        Factor by which the resolution is reduced when the current value is far
        from its final value. Default is ``0.1``.
    large_resolution_threshold : float, optional
        Threshold used to determine whether the resolution is far from its
        final value. Default is ``250.0``.
    moderate_resolution_threshold : float, optional
        Threshold used to determine whether the resolution is close to its
        final value. Default is ``16.0``.
    low_ratio : float, optional
        Threshold used to determine whether the reduction ratio is low. Default
        is ``0.1``.
    high_ratio : float, optional
        Threshold used to determine whether the reduction ratio is high.
        Default is ``0.7``.
    very_low_ratio : float, optional
        Threshold used to determine whether the reduction ratio is very low.
        This is used to determine whether the models should be reset. Default
        is ``0.01``.
    penalty_increase_threshold : float, optional
        Threshold used to determine whether the penalty parameter should be
        increased. Default is ``1.5``.
    penalty_increase_factor : float, optional
        Factor by which the penalty parameter is increased. Default is ``2.0``.
    short_step_threshold : float, optional
        Factor used to determine whether the trial step is too short. Default
        is ``0.5``.
    low_radius_factor : float, optional
        Factor used to determine which interpolation point should be removed
        from the interpolation set at each iteration. Default is ``0.1``.
    byrd_omojokun_factor : float, optional
        Factor by which the trust-region radius is reduced for the computations
        of the normal step in the Byrd-Omojokun composite-step approach.
        Default is ``0.8``.
    threshold_ratio_constraints : float, optional
        Threshold used to determine which constraints should be taken into
        account when decreasing the penalty parameter. Default is ``2.0``.
    large_shift_factor : float, optional
        Factor used to determine whether the point around which the quadratic
        models are built should be updated. Default is ``10.0``.
    large_gradient_factor : float, optional
        Factor used to determine whether the models should be reset. Default is
        ``10.0``.
    resolution_factor : float, optional
        Factor by which the resolution is decreased. Default is ``2.0``.
    improve_tcg : bool, optional
        Whether to improve the steps computed by the truncated conjugate
        gradient method when the trust-region boundary is reached. Default is
        ``True``.

    References
    ----------
    .. [1] J. Nocedal and S. J. Wright. *Numerical Optimization*. Springer Ser.
       Oper. Res. Financ. Eng. Springer, New York, NY, USA, second edition,
       2006. `doi:10.1007/978-0-387-40065-5
       <https://doi.org/10.1007/978-0-387-40065-5>`_.
    .. [2] M. J. D. Powell. A direct search optimization method that models the
       objective and constraint functions by linear interpolation. In S. Gomez
       and J.-P. Hennart, editors, *Advances in Optimization and Numerical
       Analysis*, volume 275 of Math. Appl., pages 51--67. Springer, Dordrecht,
       Netherlands, 1994. `doi:10.1007/978-94-015-8330-5_4
       <https://doi.org/10.1007/978-94-015-8330-5_4>`_.
    .. [3] T. M. Ragonneau. *Model-Based Derivative-Free Optimization Methods
       and Software*. PhD thesis, Department of Applied Mathematics, The Hong
       Kong Polytechnic University, Hong Kong, China, 2022. URL:
       https://theses.lib.polyu.edu.hk/handle/200/12294.

    Examples
    --------
    To demonstrate how to use `minimize`, we first minimize the Rosenbrock
    function implemented in `scipy.optimize` in an unconstrained setting.

    .. testsetup::

        import numpy as np
        np.set_printoptions(precision=3, suppress=True)

    >>> from cobyqa import minimize
    >>> from scipy.optimize import rosen

    To solve the problem using COBYQA, run:

    >>> x0 = [1.3, 0.7, 0.8, 1.9, 1.2]
    >>> res = minimize(rosen, x0)
    >>> res.x
    array([1., 1., 1., 1., 1.])

    To see how bound and constraints are handled using `minimize`, we solve
    Example 16.4 of [1]_, defined as

    .. math::

        \begin{aligned}
            \min_{x \in \mathbb{R}^2}   & \quad (x_1 - 1)^2 + (x_2 - 2.5)^2\\
            \text{s.t.}                 & \quad -x_1 + 2x_2 \le 2,\\
                                        & \quad x_1 + 2x_2 \le 6,\\
                                        & \quad x_1 - 2x_2 \le 2,\\
                                        & \quad x_1 \ge 0,\\
                                        & \quad x_2 \ge 0.
        \end{aligned}

    >>> import numpy as np
    >>> from scipy.optimize import Bounds, LinearConstraint

    Its objective function can be implemented as:

    >>> def fun(x):
    ...     return (x[0] - 1.0)**2 + (x[1] - 2.5)**2

    This problem can be solved using `minimize` as:

    >>> x0 = [2.0, 0.0]
    >>> bounds = Bounds([0.0, 0.0], np.inf)
    >>> constraints = LinearConstraint([
    ...     [-1.0, 2.0],
    ...     [1.0, 2.0],
    ...     [1.0, -2.0],
    ... ], -np.inf, [2.0, 6.0, 2.0])
    >>> res = minimize(fun, x0, bounds=bounds, constraints=constraints)
    >>> res.x
    array([1.4, 1.7])

    To see how nonlinear constraints are handled, we solve Problem (F) of [2]_,
    defined as

    .. math::

        \begin{aligned}
            \min_{x \in \mathbb{R}^2}   & \quad -x_1 - x_2\\
            \text{s.t.}                 & \quad x_1^2 - x_2 \le 0,\\
                                        & \quad x_1^2 + x_2^2 \le 1.
        \end{aligned}

    >>> from scipy.optimize import NonlinearConstraint

    Its objective and constraint functions can be implemented as:

    >>> def fun(x):
    ...     return -x[0] - x[1]
    >>>
    >>> def cub(x):
    ...     return [x[0]**2 - x[1], x[0]**2 + x[1]**2]

    This problem can be solved using `minimize` as:

    >>> x0 = [1.0, 1.0]
    >>> constraints = NonlinearConstraint(cub, -np.inf, [0.0, 1.0])
    >>> res = minimize(fun, x0, constraints=constraints)
    >>> res.x
    array([0.707, 0.707])

    Finally, to see how to supply linear and nonlinear constraints
    simultaneously, we solve Problem (G) of [2]_, defined as

    .. math::

        \begin{aligned}
            \min_{x \in \mathbb{R}^3}   & \quad x_3\\
            \text{s.t.}                 & \quad 5x_1 - x_2 + x_3 \ge 0,\\
                                        & \quad -5x_1 - x_2 + x_3 \ge 0,\\
                                        & \quad x_1^2 + x_2^2 + 4x_2 \le x_3.
        \end{aligned}

    Its objective and nonlinear constraint functions can be implemented as:

    >>> def fun(x):
    ...     return x[2]
    >>>
    >>> def cub(x):
    ...     return x[0]**2 + x[1]**2 + 4.0*x[1] - x[2]

    This problem can be solved using `minimize` as:

    >>> x0 = [1.0, 1.0, 1.0]
    >>> constraints = [
    ...     LinearConstraint(
    ...         [[5.0, -1.0, 1.0], [-5.0, -1.0, 1.0]],
    ...         [0.0, 0.0],
    ...         np.inf,
    ...     ),
    ...     NonlinearConstraint(cub, -np.inf, 0.0),
    ... ]
    >>> res = minimize(fun, x0, constraints=constraints)
    >>> res.x
    array([ 0., -3., -3.])
    Nr   z)The size of the history must be positive.z(The size of the filter must be positive.__len__        FTz$Starting the optimization procedure.zInitial trust-region radius: .zFinal trust-region radius: z(Maximum number of function evaluations: zMaximum number of iterations: r   g?      znonlinearly constrained       @zNew trust-region radius: r   )cdictgetr   VERBOSEr   boolFEASIBILITY_TOLfloatSCALESTORE_HISTORYHISTORY_SIZE
ValueErrorintFILTER_SIZEDEBUG
isinstancetupler   hasattrlenr	   _get_bounds_get_constraintsr
   r   r   _set_default_optionsn_set_default_constantsboundsis_feasible_build_resultr   INFEASIBLE_ERRORFIXED_SUCCESSprintRHOBEGRHOENDMAX_EVALMAX_ITERr   r   TARGET_SUCCESSr   CALLBACK_SUCCESSr   FEASIBLE_SUCCESSr   MAX_ITER_WARNINGnplinalgLinAlgErrorLINALG_ERRORnormx_bestmodelsinterpolationx_baser   LARGE_SHIFT_FACTORradiusshift_x_baseget_trust_region_stepSHORT_STEP_THRESHOLD
resolutionDECREASE_RESOLUTION_FACTORget_index_to_removemaxRESOLUTION_FACTORincrease_penalty_evalMAX_EVAL_WARNINGmeritfun_bestcub_bestceq_besttypeBYRD_OMOJOKUN_FACTOR get_second_order_correction_stepget_reduction_ratioupdate_interpolationset_best_indexupdate_radiusVERY_LOW_RATIOfun_gradfun_alt_gradLARGE_GRADIENT_FACTORreset_modelsset_multipliers	LOW_RATIORADIUS_SUCCESSenhance_resolutiondecrease_penaltymaxcv_print_stepbuild_xn_evalget_geometry_steppenalty)3funx0argsr5   constraintscallbackoptionskwargsverbosefeasibility_tolscalestore_historyhistory_sizefilter_sizedebugobjn_origlinear_constraintsnonlinear_constraintslinear	nonlinearpb	constants	frameworksuccessn_iterk_newn_short_stepsn_very_short_stepsn_alt_modelsstatusradius_savenormal_steptangential_stepsteps_normrl   improve_geometrydist_newsame_best_pointfun_valcub_valceq_val	merit_old	merit_newsoc_stepratioill_conditionedgradgrad_alt	maxcv_valr   r   V/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/scipy/_lib/cobyqa/main.pyminimize$   s0     



	








	     r   c                 C   s   | du rt t|tj t|tjS t| t r6| jj|fks'| jj|fkr/td| dt | j| jS t	| dr\t
| } | j|dfkrKtdt | dddf | dddf S td	)
z 
    Uniformize the bounds.
    NzThe bounds must have z
 elements.r      zGThe shape of the bounds is not compatible with the number of variables.r   r   zPThe bounds must be an instance of scipy.optimize.Bounds or an array-like object.)r   rC   fullinfr,   lbshapeubr(   r.   asarray	TypeError)r5   r3   r   r   r   r0   q  s     


"r0   c              	   C   s(  t | ts
t| ds| f} g }g }| D ]|}t |tr7t|jd}t|jd}|t|jgt	
||R   qt |trYt|jd}t|jd}|t|jgt	
||R   qt |trd|vsh|d dvrltdd	|vsvt|d	 sztd
||d	 |d |ddd qtd||fS )z7
    Extract the linear and nonlinear constraints.
    r   z;The lower bound of the linear constraints must be a vector.z;The upper bound of the linear constraints must be a vector.z>The lower bound of the nonlinear constraints must be a vector.z>The upper bound of the nonlinear constraints must be a vector.r]   )eqineqz+The constraint type must be "eq" or "ineq".rt   z)The constraint function must be callable.rv   r   )rt   r]   rv   zrThe constraints must be instances of scipy.optimize.LinearConstraint, scipy.optimize.NonlinearConstraint, or dict.)r,   r   r.   r   r   r   r   appendArC   broadcast_arraysr   rt   r(   callabler    r   )rw   r   r   
constraintr   r   r   r   r   r1     sh   





r1   c                 C   s  t j| v r| t j dkrtdt j| v r | t j dk r tdt j| v r9t j| v r9| t j | t j k r8tdn@t j| v rPttt j | t j g| t jj< n)t j| v rgttt j | t j g| t jj< ntt j | t jj< tt j | t jj< t	| t j | t jj< t	| t j | t jj< t j
| v r| t j
 dkrtdt j
| v r| t j
 |d |d  d krtd	|d |d  d  d
| t j
jtt j
 | t| t j
 | t j
j< t j| v r| t j dkrtd| t jjttt j || t j
 d g t| t j | t jj< t j| v r| t j dkrtd| t jjtt j | t| t j | t jj< | t jjtt j  t	| t j | t jj< | t jjtt j  t	| t j | t jj< | t jjtt j  t| t j | t jj< | t jjtt j  t| t j | t jj< | t jjtt j  t| t j | t jj< | t jjtt j  t| t j | t jj< | t jjtt j  t| t j | t jj< | t jjtt j  t| t j | t jj< | D ]}|t j vrtd| d
td qdS )z"
    Set the default options.
    r   z1The initial trust-region radius must be positive.z2The final trust-region radius must be nonnegative.z_The initial trust-region radius must be greater than or equal to the final trust-region radius.r   z4The number of interpolation points must be positive.r   r   z3The number of interpolation points must be at most r   z<The maximum number of function evaluations must be positive.z2The maximum number of iterations must be positive.zUnknown option: r   N)r   r;   r(   r<   rC   minr   valuerT   r$   NPT
setdefaultr)   r=   r>   TARGETr#   r!   r"   r%   r*   r&   r'   r+   __members__valueswarningswarnRuntimeWarning)ry   r3   keyr   r   r   r2     s   


	r2   c                  K   s  t | }|tjjttj  t|tj |tjj< |tj dks(|tj dkr,td|tjjttj  t|tj |tjj< |tj dkrMtdtj	|v r]|tj	 dkr]tdtj
|v rm|tj
 dkrmtdtj	|v rtj
|v r|tj
 |tj	 krtdnFtj	|v rtttj
 dd|tj	   g|tj
j< n+tj
|v rtttj	 d	|tj
  g|tj	j< nttj	 |tj	j< ttj
 |tj
j< |tjjttj  t|tj |tjj< |tj dks|tj dkrtd
tj|v r|tj dkrtdtj|v r|tj dkrtdtj|v r4tj|v r4|tj |tj kr3tdnBtj|v rLtttj |tj g|tjj< n*tj|v rdtttj |tj g|tjj< nttj |tjj< ttj |tjj< tj|v r|tj dks|tj dkrtdtj|v r|tj dks|tj dkrtdtj|v rtj|v r|tj |tj krtdnBtj|v rtttj |tj g|tjj< n*tj|v rtttj |tj g|tjj< nttj |tjj< ttj |tjj< |tjjttj  t|tj |tjj< |tj dks.|tj dkr2tdtj|v rD|tj dk rDtdtj|v rV|tj dkrVtdtj|v rrtj|v rr|tj |tj k rqtdnBtj|v rtttj |tj g|tjj< n*tj|v rtttj |tj g|tjj< nttj |tjj< ttj |tjj< |tjjttj  t|tj |tjj< |tj dks|tj dkrtd|tjjttj  t|tj |tjj< |tj dks|tj dkrtd|tjjttj  t|tj |tjj< |tj dks.|tj dkr2td|tjjttj  t|tj |tjj< |tj dkrTtd|tjjttj  t|tj |tjj< |tj dk rvtd|tjjttj  t|tj |tjj< |tj dkrtd|tjjttj  t|tj |tjj< |tj dkrtd|tjjttj  t|tj |tjj< | D ]}|tj  vrt!"d| dt#d q|S )z$
    Set the default constants.
    r   g      ?zCThe constant decrease_radius_factor must be in the interval (0, 1).z>The constant increase_radius_threshold must be greater than 1.z;The constant increase_radius_factor must be greater than 1.z>The constant decrease_radius_threshold must be greater than 1.zPThe constant decrease_radius_threshold must be less than increase_radius_factor.g      ?r   zGThe constant decrease_resolution_factor must be in the interval (0, 1).z?The constant large_resolution_threshold must be greater than 1.zBThe constant moderate_resolution_threshold must be greater than 1.zVThe constant moderate_resolution_threshold must be at most large_resolution_threshold.z6The constant low_ratio must be in the interval (0, 1).z7The constant high_ratio must be in the interval (0, 1).z2The constant low_ratio must be at most high_ratio.z;The constant very_low_ratio must be in the interval (0, 1).zKThe constant penalty_increase_threshold must be greater than or equal to 1.z<The constant penalty_increase_factor must be greater than 1.zaThe constant penalty_increase_factor must be greater than or equal to penalty_increase_threshold.zAThe constant short_step_threshold must be in the interval (0, 1).z>The constant low_radius_factor must be in the interval (0, 1).zAThe constant byrd_omojokun_factor must be in the interval (0, 1).z@The constant threshold_ratio_constraints must be greater than 1.z4The constant large_shift_factor must be nonnegative.z:The constant large_gradient_factor must be greater than 1.z6The constant resolution_factor must be greater than 1.zUnknown constant: r   r   )$r   r   r   DECREASE_RADIUS_FACTORr   r   r$   r(   INCREASE_RADIUS_THRESHOLDINCREASE_RADIUS_FACTORDECREASE_RADIUS_THRESHOLDrC   r   rT   rR   LARGE_RESOLUTION_THRESHOLDMODERATE_RESOLUTION_THRESHOLDrj   
HIGH_RATIOrd   PENALTY_INCREASE_THRESHOLDPENALTY_INCREASE_FACTORrP   LOW_RADIUS_FACTORr^   THRESHOLD_RATIO_CONSTRAINTSrL   rg   rU   IMPROVE_TCGr"   r   r   r   r   r   )rz   r   r   r   r   r   r4   7  s2  









r4   c           	      C   s   | j |tj kr
t|j| }| ||j\}}}| |||}||tj kr/||tj kr/t	| j
r;||tj kr;t|||fS )z:
    Evaluate the objective and constraint functions.
    )rq   r   r=   r   rH   rs   rn   r   r#   r   is_feasibilityr   )	r   r   r   ry   x_evalr   r   r   r_valr   r   r   rW     s   

rW   c           
      C   s  |  |\}}}|ot|ot|}|tjtjfvr%|o$||tj k}t }	tj	dtjdtj
dtjdtjdtjdtjdtjdtjd	i	|d
|	_||	_|j|	_| ||	_||	_||	_| j|	_||	_|tj rq| j|	_| j|	_|tj rt |	j| |	j|	j|	j|	j|	j |	S )z7
    Build the result of the optimization process.
    z<The lower bound for the trust-region radius has been reachedz4The target objective function value has been reachedz0All variables are fixed by the bound constraintsz9The callback requested to stop the optimization procedurez=The feasibility problem received has been solved successfullyz<The maximum number of function evaluations has been exceededz2The maximum number of iterations has been exceededz$The bound constraints are infeasiblezA linear algebra error occurredzUnknown exit status)!	best_evalrC   isfiniter   r?   rA   r   r#   r   rk   r9   r@   rX   rB   r8   rF   r    messager   r   r   rp   xrt   rn   rq   nfevnitr&   fun_historymaxcv_historyr!   ro   )
r   rs   r   r   r   ry   r   rt   rn   resultr   r   r   r7     sL   

	r7   c                 C   s   t   t |  d t d| d t d| d |js)t d|j d| d t d| d tjd	i t t d| d W d   dS 1 sMw   Y  dS )
zP
    Print information about the current state of the optimization process.
    r   z Number of function evaluations: zNumber of iterations: zLeast value of z: zMaximum constraint violation: zCorresponding point: Nr   )r:   r   fun_namerC   printoptionsr   )r   r   r   r   r   rq   r   r   r   r   ro     s   "ro   )r   Nr   NN)%r   numpyrC   scipy.optimizer   r   r   r   r   r   problemr   r	   r
   r   r   utilsr   r   r   r   r   settingsr   r   r   r   r   r   r   r0   r1   r2   r4   rW   r7   ro   r   r   r   r   <module>   s8     
      SEh  Y5